diff --git a/CHANGELOG.md b/CHANGELOG.md index f442e181c..21d385b32 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,391 @@ +2.6.5.3280 + +temporarily enable OpenSubtitles.com instead of OpenSubtitles.org. +You need to have an account there and an API consumer configured. Enter your API key in settings. + +This is barely tested but should work for basic usage. + +THIS PLUGIN IS DEPRECATED, PLEASE USE BAZARR! + +Changelog +- cheaply backport opensubtitlescom from bazarr + + +2.6.5.3268 +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- clarify README +- core: fix custom folder handling; #761 +- core: providers: screwzira: move to ktuvit and wizdom +- core: add option to not download subtitles for certain audio languages existing; and/or no audio stream; fix #756 +- core: delay item refreshes after refresh call (default: 5 seconds; exposed in advanced settings) +- menu: allow extraction of embedded subtitles for whole tv shows + + +2.6.5.3247 + +subscene, addic7ed + +either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +Changelog +core: fix for tv.plex.agents.movie not populating its media types +core: tasks: findBetterSubtitles: increase minimum score for better subtitles for movies with extracted embedded subs from 82 to 112 + + +2.6.5.3241 + +subscene, addic7ed + +either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +Changelog + +core: add support for new Plex Movie agent +core: remove py3 compat breaking unnecessary change +core: skip drawing tags for SRT +core: advanced_settings: refiners: drone: add custom pem_file support; fixes #735 +providers: core: set DownloadLimitPerDayExceeded timeout to 4 hours (was one day); +providers: addic7ed: limit downloads per day; add vip setting +providers: addic7ed: properly compare last_dl, add last_reset tracking info to log #723 +providers: addic7ed: properly implement limits +submod: HI: remove more music tags +submod: common CM_punctuation_space2: detect AND don't try changing domain/url/host when fixing punctuation + + +2.6.5.3223 + +subscene, addic7ed + +either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service (anti-captcha.com or deathbycaptcha.com), add funds, then supply your credentials/apikey in the configuration +Changelog + +core: scoring: reorder subtitles based on second non-hash-score if main hash score is the same; morpheus65535/bazarr#821 +providers: bsplayer: verify hash; clean up + + +2.6.5.3217 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: also extract (missing) embedded subtitles when SearchAllRecentlyAddedMissing is running +- core: core: clarify detecting streams (in logs) +- core: UnRAR: set binary to executable, even if not checked out from git; might fix #693 +- core: bazarr-backport: morpheus65535/bazarr#703: use proper language code detection instead of a wild guess; should fix bad existing subtitle detection +- core: bazarr-backport: morpheus65535/bazarr#660: fix BOM encoding stuff +- core: bazarr-backport: morpheus65535/bazarr#656 further generalize formats; skip release group match if format match failed +- core: fix stream detection when using mediainfo (#711) +- config/core: make periodic SZ-internal subtitle maintenance interval configurable +- providers: add BSPlayer Subtitles +- providers: add ScrewZira (Hebrew) + +2.6.5.3183 + + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: don't fall back to default providers if none enabled +- core: don't process any further if stream info is missing +- core: support using mediainfo for retrieving MP4 MOV_TEXT subtitle stream titles (PMS bug) +- core: fix embedded subtitle extraction in some cases (#681, #680) +- core: scanning: add additional INFO logging for undetected languages +- core: bazarr-backport: remove existing subtitle file, to support MergerFS +- core: bazarr-backport: generic 10 minute throttling if uncaught exception occurs +- providers: addic7ed: fix recaptcha solving; fix show ID retrieval (#681) +- providers: addic7ed: add timeout on authentication error +- providers: addic7ed: fix shows with dots in them (Mayans M.C.) +- providers: addic7ed: fix detection of completed subtitle for non-english users (#686) +- providers: addic7ed: add more timeouts in the login process +- providers: argenteam: bazarr-backport: use new url; fixes + + +2.6.5.3152 + +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: fix core issue possibly impacting results on OpenSubtitles in certain conditions +- core: fix default values of opensubtitles-skip-wrong-fps, use_https; fix #676 +- core: fix for determining whether to search under certain circumstances; fixes #666 +- core: #664 fix missing language processing of multiple videos refreshed at once +- core: #661 fix match strictness when determining preexisting external subtitles +- providers: titlovi: New implementation of Titlovi using API (thanks @viking1304) + + +2.6.5.3124 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: http: fallback to default DNS when normal resolving fails; fixes #657 +- core: extract embedded/menu: fix detection of unknown streams; don't use unknown streams if a known language was previously found +- core: language: use replacement map from bazarr +- providers: titlovi: fix matching +- providers: subscene: fix unknown language code error when "empty" result is returned +- providers: subscene: add support for pt-BR (based on Diaoul/subliminal@b22cf08) +- providers: subscene: explicitly set account filters for languages +- providers: subscene: limit alternative searches to 3; set throttle to 8 +- providers: subscene: move login/cookies to initialization sequence +- submod: generic: en: fix ";='s + + +2.6.5.3109 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- providers: add Napisy24 (polish) +- providers: subscene: reduce provider load by possibly half +- providers: subscene: support logging in (username/password are now required) +- providers: subscene: fallback to non year results if none found with year + + +2.6.5.3099 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- core: allow system DNS again by putting "system" as the DNS +- providers: subscene: fix again (subscene, contact us please, so we can end this) + + +2.6.5.3092 + +subscene, addic7ed and titlovi +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- providers: subscene: fix endpoint (hopefully for longer now) +- providers: subscene: don't search for season packs (broken for now; relieves 50% of server load on provider) +- providers: subscene: don't calculate video fn for now +- providers: argenteam: backport fixes from bazarr +- subtitle: try decoding with utf-16 by default as well (zho/farsi) +- submod: HI: remove music tags by default +- core: compat (bazarr): add env var SZ_KEEP_ENCODING to keep encoding of subtitles + + +2.6.5.3074 + +Changelog +- core: cf: bypass cf 95% of the time without captchas +- core: fix breaking line endings of certain languages (chinese, UTF-16); fixes #646 +- core: update pysubs2 to 0.2.3 + + +2.6.5.3062 + +Changelog +- core: cf: optimize +- core: http: don't query DNS with IPs. thanks @fgump (fixes sonarr/radarr) + + +2.6.5.3041 + +Changelog +- core: only reference guessed title if there actually is one +- core: cf: optimize +- core/config: add setting for one existing language to be enough, fixes #491 +- core/compat: dns: support nameservers via ENV[dns_resolvers]; don't fall back to default DNS when configured custom DNS failed +- providers: titlovi: prevent repeated captcha solving for CF + + +2.6.5.3017 + +Changelog +- core: SRT parsing: handle (bad) ASS color tag in SRT +- core: auto extract embedded: only use one unknown sub for first language +- core: better embedded streams language detection +- core: optimizations +- core: extract embedded: fix is_unknown check +- core: don't raise exception when subtitle not found inside archive +- core: search external subtitles: fix condition +- core: better plex transcoder path detection +- core: use Log.Warn instead of Log.Warning (#619, #629, #633) +- core: also check for "plex transcoder.exe" in case of windows (fixes #619) +- core: auto extract: use mbcs encoding for paths on windows +- core: Fix issue scandir not returning the name of the file inside Docker images on ARM systems. (thanks @giejay) +- core: also clean PYTHONHOME when calling external notification app +- core: update certifi to 2019.3.9 +- core: scan_video: add series/title as alternative by scanning filename itself without parent folders +- core: add generic solution for solving captchas using anti captcha services +- core: increase cache time to 180d (was: 30d) +- core: guess_matches: handle multiple title matches; fixes bazarr#403 +- windows: fix compatibility issues with plex transcoder +- compat: use lowercase paths on subtitle detection +- providers: addic7ed: re-enable (using paid anti captch service) +- providers: assrt: assume undefined Chinese flavor as Simplified (chs/zho-Hans) +- providers: subscene: make it work again by bypassing cf +- providers: subscene: don't fail on missing cover +- providers: titlovi: re-enable (might need paid anti captch service) +- providers: opensubtitles: fix only_foreign handling +- providers: opensubtitles: show subtitles with possibly mismatched series when manually listing subs +- menu: list subtitles: show subtitles with bad season/episode values as well +- refiners: omdb: fix imdb ids with spaces + + +2.6.4.2911 +- core: improve file cache (windows especially); use fixed-length cache filenames; fixes #600 +- core: don't log "Checking connections ..." when sonarr/radarr not activated +- core: make logging for scanning/parsing/preparing videos more clear +- core: extract embedded: continue searching for embbedded subs after undefined language is found (thanks @jippo015) +- compat: core: don't assume hints["title"] exists +- compat: providers: podnapisi: loosen lxml requirement +- providers: addic7ed: fix not using user credentials; fixes #605 +- providers: titlovi: fix provider (thanks @viking1304) +- providers: subscene: fix provider +- providers: opensubtitles: improve token logging +- providers: podnapisi: fix searching for Marvel series +- submod: HI: correctly remove uppercase at start of a sentence when lead by a crocodile (>>) +- submod: HI: correctly remove lowercase inside brackets when HI matched as well +- submod: HI: remove multiple HI_before_colon_caps before one colon +- submod: common: also match music symbols after a crocodile; move crocodile removal up the chain + + +2.6.4.2881 +- core: extract embedded: fix automatic extraction not actually writing the subtitles to disk under certain circumstances; fixes #598 +- core: sonarr/radarr: don't block the main thread while checking connectivity; fixes #597 +- providers: hosszupuska: fix inconsistent series naming (thanks @morpheus133) +- providers: opensubtitles: add advanced setting to optionally not skip subtitles with wrong FPS; fixes #578 + + +2.6.4.2864 +- core: scanning: don't fail on metadata subtitles with bad language code; fixes #596 +- providers: legendastv, napiprojekt, subscenter, tvsubtitles: fix "No language to search for" issue; fixes #596 +- menu: fix "ignore list list" +- menu: advanced: add skip next search all recently missing subtitles entry + + +2.6.4.2859 +- core: fix thread.lock error (only affected the history menu, not the actual functionality) +- core: fix audio-based conditional subtitle decision making; fixes #592 +- core: massively improve metadata subtitle storage +- providers: opensubtitles: skip non-forced results when searching for forced +- providers: podnapisi: skip non-forced results when searching for forced +- submod: common: correctly pad music symbols on either side + + + +2.6.4.2834 +- core: add option to use custom (Google, Cloudflare) DNS to resolve provider hosts in problematic countries; fixes #547 +- core: add support for downloading subtitles only when the audio streams don't match (any?) configured languages; fixes #519 +- core: add support for an include list instead of an ignore list; add the option to disable SZ by default, then enable it per item/series/section (inverse ignore list) +- core/menu/config: support forced/foreign subtitles independently +- core: fallback for OSError on scandir, should fix #532 +- core: add config versioning/migration system +- core: correctly force non-foreign-only-capable providers off; remove subscene from foreign-only capable providers +- core: scanning: collect information about audio streams +- core: use correct storage path when storing subtitle info, when only VTT is used +- core: fix disabled channel mode +- core/menu: extract embedded: add extracted embedded subtitles to history +- core: embedded subtitle streams: don't try parsing the language if inexistant +- core: subtitle: fix log call, fixes #569 +- core: download best subtitles: only use actually languages searched for +- core: refiners: tvdb: warn instead of error when no matching series was found +- core: scanning: re-add expected title to guessit for narrowing down the video title +- core: resolve #583 +- core: archives: explicitly skip forced subtitles if not searched for, when picking from an archive +- core: activities/auto-refresh: fix hybrid-plus for movies +- core: don't disable plugin if all providers throttled; fix #585 #574 +- core: skip cleanup for ignored paths +- core: update requests to 2.20.0 (fixes security issue) +- core: update certifi to 2018.10.15 +- core: auto extract: don't overwrite local sub even if unknown to SZ +- config: set autoclean leftover/unused to off by default +- providers: opensubtitles: respect rate limit (40 hits/10s); should fix long throttling behaviour +- providers: opensubtitles: handle bad/inexistant responses +- providers: opensubtitles: log bad response data +- providers: opensubtitles: treat empty response as ServiceUnavailable for now +- providers: opensubtitles: log reason for ServiceUnavailable +- providers: legendastv: match second title and imdb id +- providers: titlovi: fix language handling (thanks @viking1304) +- providers: titlovi: proper handling of archives with both cyrlic and latin subtitles (thanks @viking1304) +- providers: titlovi: allow direct subtitle downloads as fallback (when a subtitle, not an archive was returned) +- providers: hosszupuska: implement site change (thanks @morpheus133) +- providers: supersubtitles: add base properties to subtitle +- providers: opensubtitles, podnapisi: fix foreign/forced handling +- providers: subscene: use original/sceneName if possible +- menu: fix plugin not responding when ignoring an item in certain menus; fixes #535 +- menu: select active subtitle: return to item details afterwards; correctly set current +- menu: add item thumbnails to history and a couple of submenus +- menu: history: use series thumbnail instead of episode screenshot +- menu: add full soft include/exclude menu handling +- menu: add support for separate forced and not-forced subtitles +- menu: fix order of embedded subtitle streams in item detail +- menu: support S00E00 and equivalent +- submod: add option to fix only-uppercase subtitles and make them readable +- submod: keep track of actually applied mods +- submod: correctly merge mods of the same kind (offset) +- submod: OCR: add dictionaries for bosnian and norwegian bokmal; update dicts for dan, eng, hrv, spa, srp, swe +- submod: OCR/HI: skip certain processors for all-caps subs +- submod: HI: only remove caps before colon if the colon is followed by whitespace or EOL; fixes #542 +- submod: HI: remove MAN: +- submod: common: improve detection and normalization of quotes, apostrophes +- submod: common: fix double quotes that are meant to be single quotes inside words +- submod: common: normalize small hyphens to dash +- submod: common: remove line only consisting of colon; remove empty colon at start of line +- submod: common: add space after punctuation +- submod: common: fix lowercase i for english language +- submod: common: better fix for music symbols +- submod: reverse_RTL: also reverse ":,'-" chars in CM_RTL_reverse (thanks @doopler) +- submod: reverse_RTL: enable mod for arabic, farsi and persian besides hebrew +- i18n: fix not used translation for recently added missing subtitles menu +- i18n: fix spanish translation, fixes #543 +- i18n: Hungarian translation is incomplete + + + +2.5.7.2663 +- implement translations for the channel and the settings +- i18n: German (myself) +- i18n: Danish (thanks Uthman, Claus Møller, dane22) +- i18n: Dutch (thanks jippo015, Semi Doludizgin, Rafael) +- i18n: Hungarian (thanks Morpheus1333, sugarman402) +- i18n: Spanish LA&C (thanks Yamil.llanos, Notorius28) +- core: notify executable: support spaces in path, fixes #520 +- core: notify executable: fix usage with python scripts (drops inherited PYTHONPATH), fixes #355 +- core: fix plugin_pin_mode +- refiners: filebot: fix usage on OSX +- providers: add assrt.net (Chinese) - thanks @dimotsai! +- providers: add supersubtitles (feliratok.info, Hungarian) - thanks @morpheus133! +- providers: addic7ed: cache login data instead of re-login per search +- submod: HI: support "&" and "+" in hi_before_colon +- submod: HI: be less aggressive with HI_before_colon_noncaps; fixes #510 + + +2.5.4.2541 + +- core: try retrieving advanced_settings.json from the path given, which may be a file path or a directory +- menu: ignore options: fix plugin not responding, fix unicode strings; resolve #509 +- providers: addic7ed: fix usage/adapt to new show search method +- providers: opensubtitles: properly handle responses again, re-enable automatic throttling based on those (broken since XMLRPC handler rewrite) + + +2.5.4.2527 + +- core: bugfixes +- core: get_item: don't fail on socket timeout; fixes #498 +- core: fix scandir encoding errors; #453 #461 #441 +- core: clamp menu history to 25 items +- add UnRAR for aarch64 (untested), arm (armv5tel, untested), linux/i386, MacOSX/i386; fixes #311 +- add 3rd party licenses +- menu: new debounce/history mechanism; fixes the back button usage +- config: add custom path option for advanced_settings.json +- providers: opensubtitles: re-add support for throttling based on HTTP response codes, which got ditched due to new connection interface +- providers: legendastv: disable if unrar wasn't found +- providers: addic7ed: reduce show cache to 1 week +- advanced settings: sonarr/radarr: make ssl verification optional +- advanced settings: opensubtitles: add configurable connection timeout +- refiners: drone: use certifi for HTTPS connections +- tasks: SearchAllRecentlyAddedMissing: fix ZeroDivisionError in edgecases; fixes #496 + 2.5.3.2452 diff --git a/Contents/Code/__init__.py b/Contents/Code/__init__.py index 0ee193bc2..1ed0daf2f 100755 --- a/Contents/Code/__init__.py +++ b/Contents/Code/__init__.py @@ -21,12 +21,13 @@ import interface sys.modules["interface"] = interface -from subzero.constants import OS_PLEX_USERAGENT, PERSONAL_MEDIA_IDENTIFIER +from subzero.constants import OS_PLEX_USERAGENT from interface.menu import * from support.plex_media import media_to_videos, get_media_item_ids +from support.extract import agent_extract_embedded from support.scanning import scan_videos -from support.storage import save_subtitles, store_subtitle_info, get_subtitle_storage -from support.items import is_ignored +from support.storage import save_subtitles, store_subtitle_info +from support.items import is_wanted from support.config import config from support.lib import get_intent from support.helpers import track_usage, get_title_for_video_metadata, get_identifier, cast_bool @@ -34,6 +35,7 @@ from support.data import dispatch_migrate from support.activities import activity from support.download import download_best_subtitles +from support.localmedia import find_subtitles def Start(): @@ -46,6 +48,8 @@ def Start(): intent = get_intent() intent.cleanup() + #Locale.DefaultLocale = "de" + # clear expired menu history items now = datetime.datetime.now() if "menu_history" in Dict: @@ -91,66 +95,9 @@ def Start(): track_usage("General", "plugin", "start", config.version) -def update_local_media(metadata, media, media_type="movies"): - # Look for subtitles - if media_type == "movies": - for item in media.items: - for part in item.parts: - support.localmedia.find_subtitles(part) - return - - # Look for subtitles for each episode. - for s in media.seasons: - # If we've got a date based season, ignore it for now, otherwise it'll collide with S/E folders/XML and PMS - # prefers date-based (why?) - if int(s) < 1900 or metadata.guid.startswith(PERSONAL_MEDIA_IDENTIFIER): - for e in media.seasons[s].episodes: - for i in media.seasons[s].episodes[e].items: - - # Look for subtitles. - for part in i.parts: - support.localmedia.find_subtitles(part) - else: - pass - - -def agent_extract_embedded(video_part_map): - try: - subtitle_storage = get_subtitle_storage() - - to_extract = [] - item_count = 0 - - for scanned_video, part_info in video_part_map.iteritems(): - plexapi_item = scanned_video.plexapi_metadata["item"] - stored_subs = subtitle_storage.load_or_new(plexapi_item) - - for plexapi_part in get_all_parts(plexapi_item): - item_count = item_count + 1 - for requested_language in config.lang_list: - embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") - current = stored_subs.get_any(plexapi_part.id, requested_language) - if not embedded_subs: - stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, - get_forced=config.forced_only) - - if stream_data: - stream = stream_data[0]["stream"] - - to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), - str(requested_language), not current)) - - if not cast_bool(Prefs["subtitles.search_after_autoextract"]): - scanned_video.subtitle_languages.update({requested_language}) - else: - Log.Debug("Skipping embedded subtitle extraction for %s, already got %r from %s", - plexapi_item.rating_key, requested_language, embedded_subs[0].id) - if to_extract: - Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) - Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, - single_thread=not config.advanced.auto_extract_multithread) - except: - Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) +def update_local_media(videos, ignore_parts_cleanup=None): + for video in videos: + find_subtitles(video["plex_part"], ignore_parts_cleanup=ignore_parts_cleanup) class SubZeroAgent(object): @@ -179,29 +126,32 @@ def update(self, metadata, media, lang): return Log.Debug("Sub-Zero %s, %s update called" % (config.version, self.agent_type)) - intent = get_intent() if not media: Log.Error("Called with empty media, something is really wrong with your setup!") return + intent = get_intent() + item_ids = [] try: config.init_subliminal_patches() - videos = media_to_videos(media, kind=self.agent_type) - - # find local media - update_local_media(metadata, media, media_type=self.agent_type) + all_videos = media_to_videos(media, kind=self.agent_type) # media ignored? - use_any_parts = False - for video in videos: - if is_ignored(video["id"]): - Log.Debug(u"Ignoring %s" % video) + ignore_parts_cleanup = [] + videos = [] + for video in all_videos: + if not is_wanted(video["id"], item=video["item"]): + Log.Debug(u'Skipping "%s"' % video["filename"]) + ignore_parts_cleanup.append(video["path"]) continue - use_any_parts = True + videos.append(video) + + # find local media + update_local_media(all_videos, ignore_parts_cleanup=ignore_parts_cleanup) - if not use_any_parts: + if not videos: Log.Debug(u"Nothing to do.") return @@ -229,7 +179,7 @@ def update(self, metadata, media, lang): if config.plex_transcoder: agent_extract_embedded(scanned_video_part_map) else: - Log.Warning("Plex Transcoder not found, can't auto extract") + Log.Warn("Plex Transcoder not found, can't auto extract") # clear missing subtitles menu data if not scheduler.is_task_running("MissingSubtitles"): @@ -281,16 +231,17 @@ def update(self, metadata, media, lang): for video, video_subtitles in downloaded_subtitles.items(): # store item(s) in history for subtitle in video_subtitles: - item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) history = get_history() + item_title = get_title_for_video_metadata(video.plexapi_metadata, add_section_title=False) history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle) history.destroy() else: # store SZ meta info even if we've downloaded none self.store_blank_subtitle_metadata(scanned_video_part_map) - update_local_media(metadata, media, media_type=self.agent_type) + update_local_media(videos) finally: # update the menu state @@ -311,7 +262,8 @@ def update(self, metadata, media, lang): class SubZeroSubtitlesAgentMovies(SubZeroAgent, Agent.Movies): - contributes_to = ['com.plexapp.agents.imdb', 'com.plexapp.agents.xbmcnfo', 'com.plexapp.agents.themoviedb', 'com.plexapp.agents.hama'] + contributes_to = ['com.plexapp.agents.imdb', 'com.plexapp.agents.xbmcnfo', 'com.plexapp.agents.themoviedb', + 'com.plexapp.agents.hama', 'tv.plex.agents.movie'] score_prefs_key = "subtitles.search.minimumMovieScore2" agent_type_verbose = "Movies" diff --git a/Contents/Code/interface/advanced.py b/Contents/Code/interface/advanced.py index 50659bfaa..c9a25af63 100644 --- a/Contents/Code/interface/advanced.py +++ b/Contents/Code/interface/advanced.py @@ -20,90 +20,102 @@ from support.storage import reset_storage, log_storage, get_subtitle_storage from support.scheduler import scheduler from support.items import set_mods_for_part, get_item_kind_from_rating_key +from support.i18n import _ @route(PREFIX + '/advanced') def AdvancedMenu(randomize=None, header=None, message=None): - oc = SubFolderObjectContainer(header=header or "Internal stuff, pay attention!", message=message, no_cache=True, - no_history=True, - replace_parent=False, title2="Advanced") + oc = SubFolderObjectContainer( + header=header or _("Internal stuff, pay attention!"), + message=message, + no_cache=True, + no_history=True, + replace_parent=False, + title2=_("Advanced")) if config.lock_advanced_menu and not config.pin_correct: oc.add(DirectoryObject( - key=Callback(PinMenu, randomize=timestamp(), success_go_to="advanced"), - title=pad_title("Enter PIN"), - summary="The owner has restricted the access to this menu. Please enter the correct pin", + key=Callback( + PinMenu, + randomize=timestamp(), + success_go_to=_("advanced")), + title=pad_title(_("Enter PIN")), + summary=_("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc oc.add(DirectoryObject( key=Callback(TriggerRestart, randomize=timestamp()), - title=pad_title("Restart the plugin"), + title=pad_title(_("Restart the plugin")), )) oc.add(DirectoryObject( key=Callback(GetLogsLink), - title="Get my logs (copy the appearing link and open it in your browser, please)", - summary="Copy the appearing link and open it in your browser, please", + title=_("Get my logs (copy the appearing link and open it in your browser, please)"), + summary=_("Copy the appearing link and open it in your browser, please"), )) oc.add(DirectoryObject( key=Callback(TriggerBetterSubtitles, randomize=timestamp()), - title=pad_title("Trigger find better subtitles"), + title=pad_title(_("Trigger find better subtitles")), )) oc.add(DirectoryObject( key=Callback(SkipFindBetterSubtitles, randomize=timestamp()), - title=pad_title("Skip next find better subtitles (sets last run to now)"), + title=pad_title(_("Skip next find better subtitles (sets last run to now)")), + )) + oc.add(DirectoryObject( + key=Callback(SkipRecentlyAddedMissing, randomize=timestamp()), + title=pad_title(_("Skip next find recently added with missing subtitles (sets last run to now)")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMaintenance, randomize=timestamp()), - title=pad_title("Trigger subtitle storage maintenance"), + title=pad_title(_("Trigger subtitle storage maintenance")), )) oc.add(DirectoryObject( key=Callback(TriggerStorageMigration, randomize=timestamp()), - title=pad_title("Trigger subtitle storage migration (expensive)"), + title=pad_title(_("Trigger subtitle storage migration (expensive)")), )) oc.add(DirectoryObject( key=Callback(TriggerCacheMaintenance, randomize=timestamp()), - title=pad_title("Trigger cache maintenance (refiners, providers and packs/archives)"), + title=pad_title(_("Trigger cache maintenance (refiners, providers and packs/archives)")), )) oc.add(DirectoryObject( key=Callback(ApplyDefaultMods, randomize=timestamp()), - title=pad_title("Apply configured default subtitle mods to all (active) stored subtitles"), + title=pad_title(_("Apply configured default subtitle mods to all (active) stored subtitles")), )) oc.add(DirectoryObject( key=Callback(ReApplyMods, randomize=timestamp()), - title=pad_title("Re-Apply mods of all stored subtitles"), + title=pad_title(_("Re-Apply mods of all stored subtitles")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="tasks", randomize=timestamp()), - title=pad_title("Log the plugin's scheduled tasks state storage"), + title=pad_title(_("Log the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key="ignore", randomize=timestamp()), - title=pad_title("Log the plugin's internal ignorelist storage"), + title=pad_title(_("Log the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(LogStorage, key=None, randomize=timestamp()), - title=pad_title("Log the plugin's complete state storage"), + title=pad_title(_("Log the plugin's complete state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="tasks", randomize=timestamp()), - title=pad_title("Reset the plugin's scheduled tasks state storage"), + title=pad_title(_("Reset the plugin's scheduled tasks state storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="ignore", randomize=timestamp()), - title=pad_title("Reset the plugin's internal ignorelist storage"), + title=pad_title(_("Reset the plugin's internal ignorelist storage")), )) oc.add(DirectoryObject( key=Callback(ResetStorage, key="menu_history", randomize=timestamp()), - title=pad_title("Reset the plugin's menu history storage"), + title=pad_title(_("Reset the plugin's menu history storage")), )) oc.add(DirectoryObject( key=Callback(InvalidateCache, randomize=timestamp()), - title=pad_title("Invalidate Sub-Zero metadata caches (subliminal)"), + title=pad_title(_("Invalidate Sub-Zero metadata caches (subliminal)")), )) oc.add(DirectoryObject( key=Callback(ResetProviderThrottle, randomize=timestamp()), - title=pad_title("Reset provider throttle states"), + title=pad_title(_("Reset provider throttle states")), )) return oc @@ -115,11 +127,15 @@ def DispatchRestart(): @route(PREFIX + '/advanced/restart/trigger') @debounce def TriggerRestart(randomize=None): - set_refresh_menu_state("Restarting the plugin") + set_refresh_menu_state(_("Restarting the plugin")) DispatchRestart() - return fatality(header="Restart triggered, please wait about 5 seconds", force_title=" ", only_refresh=True, - replace_parent=True, - no_history=True, randomize=timestamp()) + return fatality( + header=_("Restart triggered, please wait about 5 seconds"), + force_title=" ", + only_refresh=True, + replace_parent=True, + no_history=True, + randomize=timestamp()) @route(PREFIX + '/advanced/restart/execute') @@ -132,10 +148,17 @@ def Restart(randomize=None): @debounce def ResetStorage(key, randomize=None, sure=False): if not sure: - oc = SubFolderObjectContainer(no_history=True, title1="Reset subtitle storage", title2="Are you sure?") + oc = SubFolderObjectContainer( + no_history=True, + title1=_("Reset subtitle storage"), + title2=_("Are you sure?")) oc.add(DirectoryObject( - key=Callback(ResetStorage, key=key, sure=True, randomize=timestamp()), - title=pad_title("Are you really sure?"), + key=Callback( + ResetStorage, + key=key, + sure=True, + randomize=timestamp()), + title=pad_title(_("Are you really sure?")), )) return oc @@ -149,8 +172,8 @@ def ResetStorage(key, randomize=None, sure=False): return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Information Storage (%s) reset' % key + header=_("Success"), + message=_("Information Storage (%s) reset", key) ) @@ -159,8 +182,8 @@ def LogStorage(key, randomize=None): log_storage(key) return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Information Storage (%s) logged' % key + header=_("Success"), + message=_("Information Storage (%s) logged", key) ) @@ -170,12 +193,11 @@ def TriggerBetterSubtitles(randomize=None): scheduler.dispatch_task("FindBetterSubtitles") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='FindBetterSubtitles triggered' + header=_("Success"), + message=_("FindBetterSubtitles triggered") ) - @route(PREFIX + '/skipbetter') @debounce def SkipFindBetterSubtitles(randomize=None): @@ -184,8 +206,21 @@ def SkipFindBetterSubtitles(randomize=None): return AdvancedMenu( randomize=timestamp(), - header='Success', - message='FindBetterSubtitles skipped' + header=_("Success"), + message=_("FindBetterSubtitles skipped") + ) + + +@route(PREFIX + '/skipram') +@debounce +def SkipRecentlyAddedMissing(randomize=None): + task = scheduler.task("SearchAllRecentlyAddedMissing") + task.last_run = datetime.datetime.now() + + return AdvancedMenu( + randomize=timestamp(), + header=_("Success"), + message=_("SearchAllRecentlyAddedMissing skipped") ) @@ -195,8 +230,8 @@ def TriggerStorageMaintenance(randomize=None): scheduler.dispatch_task("SubtitleStorageMaintenance") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='SubtitleStorageMaintenance triggered' + header=_("Success"), + message=_("SubtitleStorageMaintenance triggered") ) @@ -206,8 +241,8 @@ def TriggerStorageMigration(randomize=None): scheduler.dispatch_task("MigrateSubtitleStorage") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='MigrateSubtitleStorage triggered' + header=_("Success"), + message=_("MigrateSubtitleStorage triggered") ) @@ -217,49 +252,53 @@ def TriggerCacheMaintenance(randomize=None): scheduler.dispatch_task("CacheMaintenance") return AdvancedMenu( randomize=timestamp(), - header='Success', - message='TriggerCacheMaintenance triggered' + header=_("Success"), + message=_("TriggerCacheMaintenance triggered") ) -def apply_default_mods(reapply_current=False): +def apply_default_mods(reapply_current=False, scandir_generic=False): storage = get_subtitle_storage() subs_applied = 0 - for fn in storage.get_all_files(): - data = storage.load(None, filename=fn) - if data: - video_id = data.video_id - item_type = get_item_kind_from_rating_key(video_id) - if not item_type: - continue - - for part_id, part in data.parts.iteritems(): - for lang, subs in part.iteritems(): - current_sub = subs.get("current") - if not current_sub: - continue - sub = subs[current_sub] - - if not sub.content: - continue - - current_mods = sub.mods or [] - if not reapply_current: - add_mods = list(set(config.default_mods).difference(set(current_mods))) - if not add_mods: + + try: + for fn in storage.get_all_files(scandir_generic=scandir_generic): + data = storage.load(None, filename=fn) + if data: + video_id = data.video_id + item_type = get_item_kind_from_rating_key(video_id) + if not item_type: + continue + + for part_id, part in data.parts.iteritems(): + for lang, subs in part.iteritems(): + current_sub = subs.get("current") + if not current_sub: continue - else: - if not current_mods: + sub = subs[current_sub] + + if not sub.content: continue - add_mods = [] - try: - set_mods_for_part(video_id, part_id, Language.fromietf(lang), item_type, add_mods, mode="add") - except: - Log.Error("Couldn't set mods for %s:%s: %s", video_id, part_id, traceback.format_exc()) - continue + current_mods = sub.mods or [] + if not reapply_current: + add_mods = list(set(config.default_mods).difference(set(current_mods))) + if not add_mods: + continue + else: + if not current_mods: + continue + add_mods = [] + + try: + set_mods_for_part(video_id, part_id, Language.fromietf(lang), item_type, add_mods, mode="add") + except: + Log.Error("Couldn't set mods for %s:%s: %s", video_id, part_id, traceback.format_exc()) + continue - subs_applied += 1 + subs_applied += 1 + except OSError: + return apply_default_mods(reapply_current=reapply_current, scandir_generic=True) storage.destroy() Log.Debug("Applied mods to %i items" % subs_applied) @@ -270,8 +309,8 @@ def ApplyDefaultMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods) return AdvancedMenu( randomize=timestamp(), - header='Success', - message='This may take some time ...' + header=_("Success"), + message=_("This may take some time ...") ) @@ -281,17 +320,20 @@ def ReApplyMods(randomize=None): Thread.CreateTimer(1.0, apply_default_mods, reapply_current=True) return AdvancedMenu( randomize=timestamp(), - header='Success', - message='This may take some time ...' + header=_("Success"), + message=_("This may take some time ...") ) @route(PREFIX + '/get_logs_link') def GetLogsLink(): if not config.plex_token: - oc = ObjectContainer(title2="Download Logs", no_cache=True, no_history=True, - header="Sorry, feature unavailable", - message="Universal Plex token not available") + oc = ObjectContainer( + title2=_("Download Logs"), + no_cache=True, + no_history=True, + header=_("Sorry, feature unavailable"), + message=_("Universal Plex token not available")) return oc # try getting the link base via the request in context, first, otherwise use the public ip @@ -316,9 +358,12 @@ def GetLogsLink(): Log.Debug("Using ip-based fallback link_base") logs_link = "%s%s?X-Plex-Token=%s" % (link_base, PREFIX + '/logs', config.plex_token) - oc = ObjectContainer(title2=logs_link, no_cache=True, no_history=True, - header="Copy this link and open this in your browser, please", - message=logs_link) + oc = ObjectContainer( + title2=logs_link, + no_cache=True, + no_history=True, + header=_("Copy this link and open this in your browser, please"), + message=logs_link) return oc @@ -348,32 +393,45 @@ def InvalidateCache(randomize=None): region.invalidate() return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Cache invalidated' + header=_("Success"), + message=_("Cache invalidated") ) @route(PREFIX + '/pin') def PinMenu(pin="", randomize=None, success_go_to="channel"): - oc = ObjectContainer(title2="Enter PIN number %s" % (len(pin) + 1), no_cache=True, no_history=True, - skip_pin_lock=True) + oc = ObjectContainer( + title2=_("Enter PIN number ") + str(len(pin) + 1), + no_cache=True, + no_history=True, + skip_pin_lock=True) if pin == config.pin: Dict["pin_correct_time"] = datetime.datetime.now() config.locked = False if success_go_to == "channel": - return fatality(force_title="PIN correct", header="PIN correct", no_history=True) + return fatality( + force_title=_("PIN correct"), + header=_("PIN correct"), + no_history=True) elif success_go_to == "advanced": return AdvancedMenu(randomize=timestamp()) for i in range(10): oc.add(DirectoryObject( - key=Callback(PinMenu, randomize=timestamp(), pin=pin + str(i), success_go_to=success_go_to), + key=Callback( + PinMenu, + randomize=timestamp(), + pin=pin + str(i), + success_go_to=success_go_to), title=pad_title(str(i)), )) oc.add(DirectoryObject( - key=Callback(PinMenu, randomize=timestamp(), success_go_to=success_go_to), - title=pad_title("Reset"), + key=Callback( + PinMenu, + randomize=timestamp(), + success_go_to=success_go_to), + title=pad_title(_("Reset")), )) return oc @@ -382,7 +440,7 @@ def PinMenu(pin="", randomize=None, success_go_to="channel"): def ClearPin(randomize=None): Dict["pin_correct_time"] = None config.locked = True - return fatality(force_title="Menu locked", header=" ", no_history=True) + return fatality(force_title=_("Menu locked"), header=" ", no_history=True) @route(PREFIX + '/reset_throttle') @@ -391,6 +449,6 @@ def ResetProviderThrottle(randomize=None): Dict.Save() return AdvancedMenu( randomize=timestamp(), - header='Success', - message='Provider throttles reset' - ) \ No newline at end of file + header=_("Success"), + message=_("Provider throttles reset") + ) diff --git a/Contents/Code/interface/func.py b/Contents/Code/interface/func.py index 05ec08f93..d8e1e59bf 100644 --- a/Contents/Code/interface/func.py +++ b/Contents/Code/interface/func.py @@ -7,7 +7,7 @@ from support.helpers import timestamp -def enable_channel_wrapper(func): +def enable_channel_wrapper(func, enforce_route=False): """ returns the original wrapper :func: (route or handler) if applicable, else the plain to-be-wrapped function :param func: original wrapper @@ -20,12 +20,11 @@ def inner(*a, **k): :param k: kwargs :return: originally to-be-wrapped function """ - return a[0] + return a[0] if len(a) else a return inner def wrap(*args, **kwargs): - enforce_route = kwargs.pop("enforce_route", None) return (func if (config.enable_channel or enforce_route) else noop)(*args, **kwargs) return wrap @@ -176,10 +175,11 @@ def inner(*a, **kw): return ret_f(*ret_a, **ret_kw) # @route may be used multiple times + enforce_route = kwargs.pop("enforce_route", None) if not already_wrapped: inner.orig_f = f - return enable_channel_wrapper(route(*args, **kwargs))(inner) - return enable_channel_wrapper(route(*args, **kwargs))(f) + return enable_channel_wrapper(route(*args, **kwargs), enforce_route=enforce_route)(inner) + return enable_channel_wrapper(route(*args, **kwargs), enforce_route=enforce_route)(f) return wrap diff --git a/Contents/Code/interface/item_details.py b/Contents/Code/interface/item_details.py index a216d9d01..546ae9632 100644 --- a/Contents/Code/interface/item_details.py +++ b/Contents/Code/interface/item_details.py @@ -1,21 +1,26 @@ # coding=utf-8 import os +from collections import OrderedDict + from subzero.language import Language from sub_mod import SubtitleModificationsMenu -from menu_helpers import debounce, SubFolderObjectContainer, default_thumb, add_ignore_options, get_item_task_data, \ - set_refresh_menu_state, route, extract_embedded_sub +from menu_helpers import debounce, SubFolderObjectContainer, default_thumb, add_incl_excl_options, get_item_task_data, \ + set_refresh_menu_state, route +from support.extract import extract_embedded_sub from refresh_item import RefreshItem from subzero.constants import PREFIX from support.config import config, TEXT_SUBTITLE_EXTS from support.helpers import timestamp, df, get_language, display_language, get_language_from_stream from support.items import get_item_kind_from_rating_key, get_item, get_current_sub, get_item_title, save_stored_sub -from support.plex_media import get_plex_metadata, get_part, get_embedded_subtitle_streams +from support.plex_media import get_plex_metadata, get_part, get_embedded_subtitle_streams, is_stream_forced, \ + update_stream_info from support.scanning import scan_videos from support.scheduler import scheduler from support.storage import get_subtitle_storage +from support.i18n import _ # fixme: needs kwargs cleanup @@ -32,7 +37,7 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra :param randomize: :return: """ - from interface.main import IgnoreMenu + from interface.main import InclExclMenu title = unicode(base_title) + " > " + unicode(title) if base_title else unicode(title) item = plex_item = get_item(rating_key) @@ -40,14 +45,23 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra timeout = 30 - oc = SubFolderObjectContainer(title2=title, replace_parent=True, header=header, message=message) + oc = SubFolderObjectContainer( + title2=title, + replace_parent=True, + header=header, + message=message) if not item: oc.add(DirectoryObject( - key=Callback(ItemDetailsMenu, rating_key=rating_key, title=title, base_title=base_title, - item_title=item_title, randomize=timestamp()), - title=u"Item not found: %s!" % item_title, - summary="Plex didn't return any information about the item, please refresh it and come back later", + key=Callback( + ItemDetailsMenu, + rating_key=rating_key, + title=title, + base_title=base_title, + item_title=item_title, + randomize=timestamp()), + title=_(u"Item not found: %s!", item_title), + summary=_("Plex didn't return any information about the item, please refresh it and come back later"), thumb=default_thumb )) return oc @@ -59,26 +73,37 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra season = get_item(item.season.rating_key) oc.add(DirectoryObject( - key=Callback(MetadataMenu, rating_key=season.rating_key, title=season.title, base_title=show.title, - previous_item_type="show", previous_rating_key=show.rating_key, - display_items=True, randomize=timestamp()), - title=u"< Back to %s" % season.title, - summary="Back to %s > %s" % (show.title, season.title), + key=Callback( + MetadataMenu, + rating_key=season.rating_key, + title=season.title, + base_title=show.title, + previous_item_type="show", + previous_rating_key=show.rating_key, + display_items=True, + randomize=timestamp()), + title=_(u"< Back to %s", season.title), + summary=_("Back to %s > %s", show.title, season.title), thumb=season.thumb or default_thumb )) oc.add(DirectoryObject( - key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, randomize=timestamp(), - timeout=timeout * 1000), - title=u"Refresh: %s" % item_title, - summary="Refreshes the %s, possibly searching for missing and picking up new subtitles on disk" % current_kind, + key=Callback( + RefreshItem, + rating_key=rating_key, + item_title=item_title, + randomize=timestamp(), + timeout=timeout * 1000), + title=_(u"Refresh: %s", item_title), + summary=_("Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up " + "new subtitles on disk", the_movie_series_season_episode=_(u"the %s" % current_kind)), thumb=item.thumb or default_thumb )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=item_title, force=True, randomize=timestamp(), timeout=timeout * 1000), - title=u"Force-find subtitles: %s" % item_title, - summary="Issues a forced refresh, ignoring known subtitles and searching for new ones", + title=_(u"Force-find subtitles: %(item_title)s", item_title=item_title), + summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones"), thumb=item.thumb or default_thumb )) @@ -95,14 +120,16 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra if not os.path.exists(part.file): continue + update_stream_info(part) + part_id = str(part.id) part_index += 1 - part_index_addon = "" - part_summary_addon = "" + part_index_addon = u"" + part_summary_addon = u"" if has_multiple_parts: - part_index_addon = u"File %s: " % part_index - part_summary_addon = "%s " % filename + part_index_addon = _(u"File %(file_part_index)s: ", file_part_index=part_index) + part_summary_addon = u"%s " % filename # iterate through all configured languages for lang in config.lang_list: @@ -111,17 +138,22 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra current_sub_id = None current_sub_provider_name = None - summary = u"%sNo current subtitle in storage" % part_summary_addon + summary = _(u"%(part_summary)sNo current subtitle in storage", part_summary=part_summary_addon) current_score = None if current_sub: current_sub_id = current_sub.id current_sub_provider_name = current_sub.provider_name current_score = current_sub.score - summary = u"%sCurrent subtitle: %s (added: %s, %s), Language: %s, Score: %i, Storage: %s" % \ - (part_summary_addon, current_sub.provider_name, df(current_sub.date_added), - current_sub.mode_verbose, display_language(lang), current_sub.score, - current_sub.storage_type) + summary = _(u"%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, " + u"%(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + part_summary=part_summary_addon, + provider_name=_(current_sub.provider_name), + date_added=df(current_sub.date_added), + mode=_(current_sub.mode_verbose), + language=display_language(lang), + score=current_sub.score, + storage_type=current_sub.storage_type) oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, rating_key=rating_key, part_id=part_id, title=title, @@ -130,7 +162,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=u"%sManage %s subtitle" % (part_index_addon, display_language(lang)), + title=_(u"%(part_summary)sManage %(language)s subtitle", part_summary=part_index_addon, + language=display_language(lang)), summary=summary )) else: @@ -141,7 +174,8 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra item_type=plex_item.type, filename=filename, current_data=summary, randomize=timestamp(), current_provider=current_sub_provider_name, current_score=current_score), - title=u"%sList %s subtitles" % (part_index_addon, display_language(lang)), + title=_(u"%(part_summary)sList %(language)s subtitles", part_summary=part_index_addon, + language=display_language(lang)), summary=summary )) @@ -153,11 +187,13 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: lang = get_language_from_stream(stream.language_code) + is_forced = is_stream_forced(stream) if not lang and config.treat_und_as_first: lang = list(config.lang_list)[0] if lang: + lang = Language.rebuild(lang, forced=is_forced) embedded_langs.append(lang) embedded_count += 1 @@ -166,15 +202,17 @@ def ItemDetailsMenu(rating_key, title=None, base_title=None, item_title=None, ra key=Callback(ListEmbeddedSubsForItemMenu, rating_key=rating_key, part_id=part_id, title=title, item_type=plex_item.type, item_title=item_title, base_title=base_title, randomize=timestamp()), - title=u"%sEmbedded subtitles (%s)" % (part_index_addon, ", ".join(display_language(l) for l in - set(embedded_langs))), - summary=u"Extract and activate embedded subtitle streams" + title=_(u"%(part_summary)sEmbedded subtitles (%(languages)s)", + part_summary=part_index_addon, + languages=", ".join(display_language(l) + for l in list(OrderedDict.fromkeys(embedded_langs)))), + summary=_(u"Extract embedded subtitle streams") )) ignore_title = item_title if current_kind == "episode": ignore_title = get_item_title(item) - add_ignore_options(oc, "videos", title=ignore_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, "videos", title=ignore_title, rating_key=rating_key, callback_menu=InclExclMenu) subtitle_storage.destroy() return oc @@ -187,7 +225,7 @@ def SubtitleOptionsMenu(**kwargs): rating_key = kwargs["rating_key"] part_id = kwargs["part_id"] language = kwargs["language"] - current_data = kwargs["current_data"] + current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) subs_count = stored_subs.count(part_id, language) @@ -196,33 +234,35 @@ def SubtitleOptionsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=u"< Back to %s" % kwargs["title"], - summary=kwargs["current_data"], + title=_(u"< Back to %s", kwargs["title"]), + summary=current_data, thumb=default_thumb )) if subs_count: oc.add(DirectoryObject( key=Callback(ListStoredSubsForItemMenu, randomize=timestamp(), **kwargs), - title=u"Select active %s subtitle" % kwargs["language_name"], - summary=u"%d subtitles in storage" % subs_count + title=_(u"Select active %(language)s subtitle", language=kwargs["language_name"]), + summary=_(u"%(count)d subtitles in storage", count=subs_count) )) oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, randomize=timestamp(), **kwargs), - title=u"List available %s subtitles" % kwargs["language_name"], - summary=kwargs["current_data"] + title=_(u"List available %(language)s subtitles", language=kwargs["language_name"]), + summary=current_data )) if current_sub: oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title=u"Modify current %s subtitle" % kwargs["language_name"], - summary=u"Currently applied mods: %s" % (", ".join(current_sub.mods) if current_sub.mods else "none") + title=_(u"Modify current %(language)s subtitle", language=kwargs["language_name"]), + summary=_(u"Currently applied mods: %(mod_list)s", + mod_list=(", ".join(current_sub.mods) if current_sub.mods else "none")) )) if current_sub.provider_name != "embedded": oc.add(DirectoryObject( key=Callback(BlacklistSubtitleMenu, randomize=timestamp(), **kwargs), - title=u"Blacklist current %s subtitle and search for a new one" % kwargs["language_name"], + title=_(u"Blacklist current %(language)s subtitle and search for a new one", + language=kwargs["language_name"]), summary=current_data )) @@ -230,8 +270,8 @@ def SubtitleOptionsMenu(**kwargs): if current_bl: oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, randomize=timestamp(), **kwargs), - title=u"Manage blacklist (%s contained)" % len(current_bl), - summary=u"Inspect currently blacklisted subtitles" + title=_(u"Manage blacklist (%(amount)s contained)", amount=len(current_bl)), + summary=_(u"Inspect currently blacklisted subtitles") )) storage.destroy() @@ -253,10 +293,13 @@ def ListStoredSubsForItemMenu(**kwargs): key=lambda x: x[1].date_added, reverse=True): is_current = key == all_subs["current"] - summary = u"added: %s, %s, Language: %s, Score: %i, Storage: %s" % \ - (df(subtitle.date_added), - subtitle.mode_verbose, display_language(language), subtitle.score, - subtitle.storage_type) + summary = _(u"added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: " + u"%(storage_type)s", + date_added=df(subtitle.date_added), + mode=_(subtitle.mode_verbose), + language=display_language(language), + score=subtitle.score, + storage_type=subtitle.storage_type) sub_name = subtitle.provider_name if sub_name == "embedded": @@ -264,8 +307,10 @@ def ListStoredSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SelectStoredSubForItemMenu, randomize=timestamp(), sub_key="__".join(key), **kwargs), - title=u"%s%s, Score: %s" % ("Current: " if is_current else "Stored: ", sub_name, - subtitle.score), + title=_(u"%(current_state)s%(subtitle_name)s, Score: %(score)s", + current_state=_("Current: ") if is_current else _("Stored: "), + subtitle_name=sub_name, + score=subtitle.score), summary=summary )) @@ -288,20 +333,24 @@ def SelectStoredSubForItemMenu(**kwargs): subtitles = stored_subs.get_all(part_id, language) subtitle = subtitles[sub_key] - subtitles["current"] = sub_key - save_stored_sub(subtitle, rating_key, part_id, language, item_type, plex_item=plex_item, storage=storage, stored_subs=stored_subs) + stored_subs.set_current(part_id, language, sub_key) storage.save(stored_subs) storage.destroy() - kwargs.pop("randomize") + kwa = { + "header": _("Success"), + "message": _("Subtitle saved to disk"), + "title": kwargs["title"], + "item_title": kwargs["item_title"], + "base_title": kwargs.get("base_title") + } - kwargs["header"] = 'Success' - kwargs["message"] = 'Subtitle saved to disk' + # fixme: return to SubtitleOptionsMenu properly? (needs recomputation of current_data - return SubtitleOptionsMenu(randomize=timestamp(), **kwargs) + return ItemDetailsMenu(rating_key, randomize=timestamp(), **kwa) @route(PREFIX + '/item/blacklist_recent/{language}') @@ -388,6 +437,7 @@ def ManageBlacklistMenu(**kwargs): part_id = kwargs["part_id"] language = kwargs["language"] remove_sub_key = kwargs.pop("remove_sub_key", None) + current_data = unicode(kwargs["current_data"]) current_sub, stored_subs, storage = get_current_sub(rating_key, part_id, language) current_bl, subs = stored_subs.get_blacklist(part_id, language) @@ -403,8 +453,8 @@ def ManageBlacklistMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], title=kwargs["title"], randomize=timestamp()), - title=u"< Back to %s" % kwargs["title"], - summary=kwargs["current_data"], + title=_(u"< Back to %s", kwargs["title"]), + summary=current_data, thumb=default_thumb )) @@ -414,15 +464,19 @@ def sorter(pair): for sub_key, data in sorted(current_bl.iteritems(), key=sorter, reverse=True): provider_name, subtitle_id = sub_key - title = u"%s, %s (added: %s, %s), Language: " \ - u"%s, Score: %i, Storage: %s" % (provider_name, subtitle_id, df(data["date_added"]), - current_sub.get_mode_verbose(data["mode"]), - display_language(Language.fromietf(language)), data["score"], - data["storage_type"]) + title = _(u"%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, " + u"Score: %(score)i, Storage: %(storage_type)s", + provider_name=_(provider_name), + subtitle_id=subtitle_id, + date_added=df(data["date_added"]), + mode=_(current_sub.get_mode_verbose(data["mode"])), + language=display_language(Language.fromietf(language)), + score=data["score"], + storage_type=data["storage_type"]) oc.add(DirectoryObject( key=Callback(ManageBlacklistMenu, remove_sub_key="__".join(sub_key), randomize=timestamp(), **kwargs), title=title, - summary=u"Remove subtitle from blacklist" + summary=_(u"Remove subtitle from blacklist") )) storage.destroy() @@ -440,6 +494,8 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item running = scheduler.is_task_running("AvailableSubsForItem") search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) + current_data = unicode(current_data) if current_data else None + if (search_results is None or force) and not running: scheduler.dispatch_task("AvailableSubsForItem", rating_key=rating_key, item_type=item_type, part_id=part_id, language=language) @@ -448,7 +504,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item oc = SubFolderObjectContainer(title2=unicode(title), replace_parent=True) oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=rating_key, item_title=item_title, title=title, randomize=timestamp()), - title=u"< Back to %s" % title, + title=_(u"< Back to %s", title), summary=current_data, thumb=default_thumb )) @@ -466,20 +522,24 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item video_display_data = [video.format] if video.format else [] if video.release_group: - video_display_data.append(u"by %s" % video.release_group) + video_display_data.append(unicode(_(u"by %(release_group)s", release_group=video.release_group))) video_display_data = " ".join(video_display_data) else: video_display_data = metadata["filename"] - current_display = (u"Current: %s (%s) " % (current_provider, current_score) if current_provider else "") + current_display = (_(u"Current: %(provider_name)s (%(score)s) ", + provider_name=_(current_provider), + score=current_score if current_provider else "")) if not running: oc.add(DirectoryObject( key=Callback(ListAvailableSubsForItemMenu, rating_key=rating_key, item_title=item_title, language=language, filename=filename, part_id=part_id, title=title, current_id=current_id, force=True, current_provider=current_provider, current_score=current_score, current_data=current_data, item_type=item_type, randomize=timestamp()), - title=u"Search for %s subs (%s)" % (get_language(language).name, video_display_data), - summary=u"%sFilename: %s" % (current_display, filename), + title=_(u"Search for %(language)s subs (%(video_data)s)", + language=get_language(language).name, + video_data=video_display_data), + summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename), thumb=default_thumb )) @@ -490,8 +550,8 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=u"No subtitles found", - summary=u"%sFilename: %s" % (current_display, filename), + title=_(u"No subtitles found"), + summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename), thumb=default_thumb )) else: @@ -501,9 +561,10 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item part_id=part_id, title=title, current_id=current_id, item_type=item_type, current_provider=current_provider, current_score=current_score, randomize=timestamp()), - title=u"Searching for %s subs (%s), refresh here ..." % (display_language(get_language(language)), - video_display_data), - summary=u"%sFilename: %s" % (current_display, filename), + title=_(u"Searching for %(language)s subs (%(video_data)s), refresh here ...", + language=display_language(get_language(language)), + video_data=video_display_data), + summary=_(u"%(current_info)sFilename: %(filename)s", current_info=current_display, filename=filename), thumb=default_thumb )) @@ -523,18 +584,38 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item bl_addon = "Blacklisted " wrong_fps_addon = "" + wrong_series_addon = "" + wrong_season_ep_addon = "" if subtitle.wrong_fps: if plex_part: - wrong_fps_addon = " (wrong FPS, sub: %s, media: %s)" % (subtitle.fps, plex_part.fps) + wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + subtitle_fps=subtitle.fps, + media_fps=plex_part.fps) else: - wrong_fps_addon = " (wrong FPS, sub: %s, media: unknown, low impact mode)" % subtitle.fps + wrong_fps_addon = _(" (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + subtitle_fps=subtitle.fps) + + if subtitle.wrong_series: + wrong_series_addon = _(" (possibly wrong series)") + + if subtitle.wrong_season_ep: + wrong_season_ep_addon = _(" (possibly wrong season/episode)") oc.add(DirectoryObject( key=Callback(TriggerDownloadSubtitle, rating_key=rating_key, randomize=timestamp(), item_title=item_title, subtitle_id=str(subtitle.id), language=language), - title=u"%s%s: %s, score: %s%s" % (bl_addon, "Available" if current_id != subtitle.id else "Current", - subtitle.provider_name, subtitle.score, wrong_fps_addon), - summary=u"Release: %s, Matches: %s" % (subtitle.release_info, ", ".join(subtitle.matches)), + title=_(u"%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s" + u"%(wrong_series_state)s%(wrong_season_ep_state)s", + blacklisted_state=bl_addon, + current_state=_("Available") if current_id != subtitle.id else _("Current"), + provider_name=_(subtitle.provider_name), + score=subtitle.score, + wrong_fps_state=wrong_fps_addon, + wrong_series_state=wrong_series_addon, + wrong_season_ep_state=wrong_season_ep_addon), + summary=_(u"Release: %(release_info)s, Matches: %(matches)s", + release_info=subtitle.release_info, + matches=", ".join(subtitle.matches)), thumb=default_thumb )) @@ -548,7 +629,7 @@ def ListAvailableSubsForItemMenu(rating_key=None, part_id=None, title=None, item def TriggerDownloadSubtitle(rating_key=None, subtitle_id=None, item_title=None, language=None, randomize=None): from interface.main import fatality - set_refresh_menu_state("Downloading subtitle for %s" % item_title or rating_key) + set_refresh_menu_state(_("Downloading subtitle for %(title_or_id)s", title_or_id=item_title or rating_key)) search_results = get_item_task_data("AvailableSubsForItem", rating_key, language) download_subtitle = None @@ -579,7 +660,7 @@ def ListEmbeddedSubsForItemMenu(**kwargs): oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, rating_key=kwargs["rating_key"], item_title=kwargs["item_title"], base_title=kwargs["base_title"], title=kwargs["item_title"], randomize=timestamp()), - title=u"< Back to %s" % kwargs["title"], + title=_("< Back to %s", kwargs["title"]), thumb=default_thumb )) @@ -593,24 +674,28 @@ def ListEmbeddedSubsForItemMenu(**kwargs): stream = stream_data["stream"] is_forced = stream_data["is_forced"] - if language: - oc.add(DirectoryObject( - key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), - stream_index=str(stream.index), language=language, with_mods=True, **kwargs), - title=u"Extract stream %s, " - u"%s%s%s%s with default mods" % (stream.index, display_language(language), - " (unknown)" if is_unknown else "", - " (forced)" if is_forced else "", - " (\"%s\")" % stream.title if stream.title else ""), - )) - oc.add(DirectoryObject( - key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), - stream_index=str(stream.index), language=language, **kwargs), - title=u"Extract stream %s, %s%s%s%s" % (stream.index, display_language(language), - " (unknown)" if is_unknown else "", - " (forced)" if is_forced else "", - " (\"%s\")" % stream.title if stream.title else ""), - )) + oc.add(DirectoryObject( + key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), + stream_index=str(stream.index), language=language, with_mods=True, **kwargs), + title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" + u"%(stream_title)s with default mods", + stream_index=stream.index, + language=display_language(language), + unknown_state=_(" (unknown)") if is_unknown else "", + forced_state=_(" (forced)") if is_forced else "", + stream_title=" (\"%s\")" % stream.title if stream.title else ""), + )) + oc.add(DirectoryObject( + key=Callback(TriggerExtractEmbeddedSubForItemMenu, randomize=timestamp(), + stream_index=str(stream.index), language=language, **kwargs), + title=_(u"Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s" + u"%(stream_title)s", + stream_index=stream.index, + language=display_language(language), + unknown_state=_(" (unknown)") if is_unknown else "", + forced_state=_(" (forced)") if is_forced else "", + stream_title=" (\"%s\")" % stream.title if stream.title else ""), + )) return oc @@ -621,8 +706,9 @@ def TriggerExtractEmbeddedSubForItemMenu(**kwargs): part_id = kwargs.get("part_id") stream_index = kwargs.get("stream_index") - Thread.Create(extract_embedded_sub, **kwargs) - header = u"Extracting of embedded subtitle %s of part %s:%s triggered" % (stream_index, rating_key, part_id) + Thread.Create(extract_embedded_sub, extract_mode="m", **kwargs) + header = _(u"Extracting of embedded subtitle %s of part %s:%s triggered", + stream_index, rating_key, part_id) kwargs.pop("randomize") kwargs.pop("item_type") diff --git a/Contents/Code/interface/main.py b/Contents/Code/interface/main.py index fea01c688..88eb49bbf 100644 --- a/Contents/Code/interface/main.py +++ b/Contents/Code/interface/main.py @@ -4,10 +4,11 @@ from support.config import config from support.helpers import pad_title, timestamp, df, display_language from support.scheduler import scheduler -from support.ignore import ignore_list +from support.ignore import get_decision_list from support.items import get_item_thumb, get_on_deck_items, get_all_items, get_items_info, get_item, get_item_title -from menu_helpers import main_icon, debounce, SubFolderObjectContainer, default_thumb, dig_tree, add_ignore_options, \ +from menu_helpers import main_icon, debounce, SubFolderObjectContainer, default_thumb, dig_tree, add_incl_excl_options, \ ObjectContainer, route, handler +from support.i18n import _ from item_details import ItemDetailsMenu @@ -35,8 +36,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if config.lock_menu and not config.pin_correct: oc.add(DirectoryObject( key=Callback(PinMenu, randomize=timestamp()), - title=pad_title("Enter PIN"), - summary="The owner has restricted the access to this menu. Please enter the correct pin", + title=pad_title(_("Enter PIN")), + summary=_("The owner has restricted the access to this menu. Please enter the correct pin"), )) return oc @@ -44,23 +45,25 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if not isinstance(config.missing_permissions, list): oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title("Insufficient permissions"), + title=pad_title(_("Insufficient permissions")), summary=config.missing_permissions, )) else: for title, path in config.missing_permissions: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title("Insufficient permissions"), - summary="Insufficient permissions on library %s, folder: %s" % (title, path), + title=pad_title(_("Insufficient permissions")), + summary=_("Insufficient permissions on library %(title)s, folder: %(path)s", + title=title, + path=path), )) return oc if not config.enabled_sections: oc.add(DirectoryObject( key=Callback(fatality, randomize=timestamp()), - title=pad_title("I'm not enabled!"), - summary="Please enable me for some of your libraries in your server settings; currently I do nothing", + title=pad_title(_("I'm not enabled!")), + summary=_("Please enable me for some of your libraries in your server settings; currently I do nothing"), )) return oc @@ -68,46 +71,42 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if Dict["current_refresh_state"]: oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("Working ... refresh here"), - summary="Current state: %s; Last state: %s" % ( - (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", - (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" + title=pad_title(_("Working ... refresh here")), + summary=_("Current state: %s; Last state: %s", + (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), + (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ) )) oc.add(DirectoryObject( key=Callback(OnDeckMenu), - title="On-deck items", - summary="Shows the current on deck items and allows you to individually (force-) refresh their metadata/" - "subtitles.", + title=_("On-deck items"), + summary=_("Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles."), thumb=R("icon-ondeck.jpg") )) if "last_played_items" in Dict and Dict["last_played_items"]: oc.add(DirectoryObject( key=Callback(RecentlyPlayedMenu), - title=pad_title("Recently played items"), - summary="Shows the %i recently played items and allows you to individually (force-) refresh their " - "metadata/subtitles." % config.store_recently_played_amount, + title=pad_title(_("Recently played items")), + summary=_("Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", config.store_recently_played_amount), thumb=R("icon-played.jpg") )) oc.add(DirectoryObject( key=Callback(RecentlyAddedMenu), - title="Recently-added items", - summary="Shows the recently added items per section.", + title=_("Recently-added items"), + summary=_("Shows the recently added items per section."), thumb=R("icon-added.jpg") )) oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, randomize=timestamp()), - title="Show recently added items with missing subtitles", - summary="Lists items with missing subtitles. Click on \"Find recent items with missing subs\" " - "to update list", + title=_("Show recently added items with missing subtitles"), + summary=_("Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list"), thumb=R("icon-missing.jpg") )) oc.add(DirectoryObject( key=Callback(SectionsMenu), - title="Browse all items", - summary="Go through your whole library and manage your ignore list. You can also " - "(force-) refresh the metadata/subtitles of individual items.", + title=_("Browse all items"), + summary=_("Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items."), thumb=R("icon-browse.jpg") )) @@ -115,43 +114,51 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r task = scheduler.task(task_name) if task.ready_for_display: - task_state = "Running: %s/%s (%s%%)" % (task.items_done, task.items_searching, task.percentage) + task_state = _("Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + items_done=task.items_done, + items_searching=task.items_searching, + percentage=task.percentage) else: lr = scheduler.last_run(task_name) nr = scheduler.next_run(task_name) - task_state = "Last run: %s; Next scheduled run: %s; Last runtime: %s" % ( + task_state = _("Last run: %s; Next scheduled run: %s; Last runtime: %s", df(scheduler.last_run(task_name)) if lr else "never", df(scheduler.next_run(task_name)) if nr else "never", str(task.last_run_time).split(".")[0]) oc.add(DirectoryObject( key=Callback(RefreshMissing, randomize=timestamp()), - title="Search for missing subtitles (in recently-added items, max-age: %s)" % Prefs[ - "scheduler.item_is_recent_age"], - summary="Automatically run periodically by the scheduler, if configured. %s" % task_state, + title=_("Search for missing subtitles (in recently-added items, max-age: %s)", Prefs[ + "scheduler.item_is_recent_age"]), + summary=_("Automatically run periodically by the scheduler, if configured. %s", task_state), thumb=R("icon-search.jpg") )) + ref_list = get_decision_list() + incl_excl_ref = _("include list") if ref_list.store == "include" else _("ignore list") + oc.add(DirectoryObject( key=Callback(IgnoreListMenu), - title="Display ignore list (%d)" % len(ignore_list), - summary="Show the current ignore list (mainly used for the automatic tasks)", + title=_("Display %(incl_excl_list_name)s (%(count)d)", + incl_excl_list_name=incl_excl_ref, count=len(ref_list)), + summary=_("Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)", + incl_excl_list_name=incl_excl_ref), thumb=R("icon-ignore.jpg") )) oc.add(DirectoryObject( key=Callback(HistoryMenu), - title="History", - summary="Show the last %i downloaded subtitles" % int(Prefs["history_size"]), + title=_("History"), + summary=_("Show the last %i downloaded subtitles", int(Prefs["history_size"])), thumb=R("icon-history.jpg") )) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("Refresh"), - summary="Current state: %s; Last state: %s" % ( - (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", - (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" + title=pad_title(_("Refresh")), + summary=_("Current state: %s; Last state: %s", + (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), + (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ), thumb=R("icon-refresh.jpg") )) @@ -160,8 +167,8 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r if config.pin: oc.add(DirectoryObject( key=Callback(ClearPin, randomize=timestamp()), - title=pad_title("Re-lock menu(s)"), - summary="Enabled the PIN again for menu(s)" + title=pad_title(_("Re-lock menu(s)")), + summary=_("Enabled the PIN again for menu(s)") )) if not only_refresh: @@ -169,19 +176,22 @@ def fatality(randomize=None, force_title=None, header=None, message=None, only_r summary_data = [] for provider, data in Dict["provider_throttle"].iteritems(): reason, until, desc = data - summary_data.append("%s until %s (%s)" % (provider, until.strftime("%y/%m/%d %H:%M"), reason)) + summary_data.append(unicode(_("%(throttled_provider)s until %(until_date)s (%(reason)s)", + throttled_provider=provider, + until_date=until.strftime("%y/%m/%d %H:%M"), + reason=reason))) oc.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("Throttled providers: %s" % ", ".join(Dict["provider_throttle"].keys())), + title=pad_title(_("Throttled providers: %s", ", ".join(Dict["provider_throttle"].keys()))), summary=", ".join(summary_data), thumb=R("icon-throttled.jpg") )) oc.add(DirectoryObject( key=Callback(AdvancedMenu), - title=pad_title("Advanced functions"), - summary="Use at your own risk", + title=pad_title(_("Advanced functions")), + summary=_("Use at your own risk"), thumb=R("icon-advanced.jpg") )) @@ -195,12 +205,12 @@ def OnDeckMenu(message=None): :param message: :return: """ - return mergedItemsMenu(title="Items On Deck", base_title="Items On Deck", itemGetter=get_on_deck_items) + return mergedItemsMenu(title=_("Items On Deck"), base_title=_("Items On Deck"), itemGetter=get_on_deck_items) @route(PREFIX + '/recently_played') def RecentlyPlayedMenu(): - base_title = "Recently Played" + base_title = _("Recently Played") oc = SubFolderObjectContainer(title2=base_title, replace_parent=True) for item in [get_item(rating_key) for rating_key in Dict["last_played_items"]]: @@ -213,6 +223,7 @@ def RecentlyPlayedMenu(): item_title = get_item_title(item) oc.add(DirectoryObject( + thumb=get_item_thumb(item) or default_thumb, title=item_title, key=Callback(ItemDetailsMenu, title=base_title + " > " + item.title, item_title=item.title, rating_key=item.rating_key) @@ -228,13 +239,13 @@ def RecentlyAddedMenu(message=None): :param message: :return: """ - return SectionsMenu(base_title="Recently added", section_items_key="recently_added", ignore_options=False) + return SectionsMenu(base_title=_("Recently added"), section_items_key="recently_added", ignore_options=False) @route(PREFIX + '/recent', force=bool) @debounce def RecentMissingSubtitlesMenu(force=False, randomize=None): - title = "Items with missing subtitles" + title = _("Items with missing subtitles") oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) running = scheduler.is_task_running("MissingSubtitles") @@ -248,13 +259,13 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): if not running: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=True, randomize=timestamp()), - title=u"Find recent items with missing subtitles", + title=_(u"Find recent items with missing subtitles"), thumb=default_thumb )) else: oc.add(DirectoryObject( key=Callback(RecentMissingSubtitlesMenu, force=False, randomize=timestamp()), - title=u"Updating, refresh here ...", + title=_(u"Updating, refresh here ..."), thumb=default_thumb )) @@ -264,7 +275,7 @@ def RecentMissingSubtitlesMenu(force=False, randomize=None): key=Callback(ItemDetailsMenu, title=title + " > " + item_title, item_title=item_title, rating_key=item_id), title=item_title, - summary="Missing: %s" % ", ".join(display_language(l) for l in missing_languages), + summary=_("Missing: %s", ", ".join(display_language(l) for l in missing_languages)), thumb=get_item_thumb(item) or default_thumb )) @@ -309,8 +320,8 @@ def determine_section_display(kind, item, pass_kwargs=None): return SectionMenu -@route(PREFIX + '/ignore/set/{kind}/{rating_key}/{todo}/sure={sure}', kind=str, rating_key=str, todo=str, sure=bool) -def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): +@route(PREFIX + '/incl_excl/set/{kind}/{rating_key}/{todo}/sure={sure}', kind=str, rating_key=str, todo=str, sure=bool) +def InclExclMenu(kind, rating_key, title=None, sure=False, todo="not_set"): """ displays the ignore options for a menu :param kind: @@ -320,56 +331,79 @@ def IgnoreMenu(kind, rating_key, title=None, sure=False, todo="not_set"): :param todo: :return: """ - is_ignored = rating_key in ignore_list[kind] + ref_list = get_decision_list() + include = ref_list.store == "include" + list_str_ref = "include" if include else "ignore" + in_list = rating_key in ref_list[kind] + + if include: + # shortcut + sure = True + todo = "add" if not in_list else "remove" + if not sure: - oc = SubFolderObjectContainer(no_history=True, replace_parent=True, title1="%s %s %s %s the ignore list" % ( - "Add" if not is_ignored else "Remove", ignore_list.verbose(kind), title, - "to" if not is_ignored else "from"), title2="Are you sure?") + t = u"Add %(kind)s %(title)s to the ignore list" + if in_list: + t = u"Remove %(kind)s %(title)s from the ignore list" + oc = SubFolderObjectContainer(no_history=True, replace_parent=True, + title1=_(t, + kind=ref_list.verbose(kind), + title=title + ), + title2=_("Are you sure?")) oc.add(DirectoryObject( - key=Callback(IgnoreMenu, kind=kind, rating_key=rating_key, title=title, sure=True, - todo="add" if not is_ignored else "remove"), - title=pad_title("Are you sure?"), + key=Callback(InclExclMenu, kind=kind, rating_key=rating_key, title=title, sure=True, + todo="add" if not in_list else "remove"), + title=pad_title(_("Are you sure?")), )) return oc - rel = ignore_list[kind] + rel = ref_list[kind] dont_change = False + state = None if todo == "remove": - if not is_ignored: + if not in_list: dont_change = True else: rel.remove(rating_key) - Log.Info("Removed %s (%s) from the ignore list", title, rating_key) - ignore_list.remove_title(kind, rating_key) - ignore_list.save() - state = "removed from" + Log.Info("Removed %s (%s) from the %s list", title, rating_key, list_str_ref) + ref_list.remove_title(kind, rating_key) + ref_list.save() elif todo == "add": - if is_ignored: + if in_list: dont_change = True else: rel.append(rating_key) - Log.Info("Added %s (%s) to the ignore list", title, rating_key) - ignore_list.add_title(kind, rating_key, title) - ignore_list.save() - state = "added to" + Log.Info("Added %s (%s) to the %s list", title, rating_key, list_str_ref) + ref_list.add_title(kind, rating_key, title) + ref_list.save() else: dont_change = True if dont_change: - return fatality(force_title=" ", header="Didn't change the ignore list", no_history=True) + return fatality(force_title=" ", header=_("Didn't change the %(incl_excl_list_name)s", + incl_excl_list_name=_(list_str_ref)), no_history=True) - return fatality(force_title=" ", header="%s %s the ignore list" % (title, state), no_history=True) + if include: + t = "%(title)s added to the include list" + if todo == "remove": + t = "%(title)s removed from the include list" + else: + t = "%(title)s added to the ignore list" + if todo == "remove": + t = "%(title)s removed from the ignore list" + return fatality(force_title=" ", header=_(t, title=title,), no_history=True) @route(PREFIX + '/sections') -def SectionsMenu(base_title="Sections", section_items_key="all", ignore_options=True): +def SectionsMenu(base_title=_("Sections"), section_items_key="all", ignore_options=True): """ displays the menu for all sections :return: """ items = get_all_items("sections") - return dig_tree(SubFolderObjectContainer(title2="Sections", no_cache=True, no_history=True), items, None, + return dig_tree(SubFolderObjectContainer(title2=_("Sections"), no_cache=True, no_history=True), items, None, menu_determination_callback=determine_section_display, pass_kwargs={"base_title": base_title, "section_items_key": section_items_key, "ignore_options": ignore_options}, @@ -399,7 +433,7 @@ def SectionMenu(rating_key, title=None, base_title=None, section_title=None, ign title = base_title + " > " + title oc = SubFolderObjectContainer(title2=title, no_cache=True, no_history=True) if ignore_options: - add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=InclExclMenu) return dig_tree(oc, items, MetadataMenu, pass_kwargs={"base_title": title, "display_items": deeper, "previous_item_type": "section", @@ -427,10 +461,10 @@ def SectionFirstLetterMenu(rating_key, title=None, base_title=None, section_titl title = unicode(title) oc = SubFolderObjectContainer(title2=section_title, no_cache=True, no_history=True) title = base_title + " > " + title - add_ignore_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, "sections", title=section_title, rating_key=rating_key, callback_menu=InclExclMenu) oc.add(DirectoryObject( - key=Callback(SectionMenu, title="All", base_title=title, rating_key=rating_key, ignore_options=False), + key=Callback(SectionMenu, title=_("All"), base_title=title, rating_key=rating_key, ignore_options=False), title="All" ) ) diff --git a/Contents/Code/interface/menu.py b/Contents/Code/interface/menu.py index a8f10fc19..110bbbcc9 100644 --- a/Contents/Code/interface/menu.py +++ b/Contents/Code/interface/menu.py @@ -11,19 +11,18 @@ from requests import HTTPError from item_details import ItemDetailsMenu from refresh_item import RefreshItem -from menu_helpers import add_ignore_options, dig_tree, set_refresh_menu_state, \ - default_thumb, debounce, ObjectContainer, SubFolderObjectContainer, route, \ - extract_embedded_sub -from main import fatality, IgnoreMenu +from menu_helpers import add_incl_excl_options, dig_tree, set_refresh_menu_state, \ + default_thumb, debounce, ObjectContainer, SubFolderObjectContainer, route +from main import fatality, InclExclMenu from advanced import DispatchRestart from subzero.constants import ART, PREFIX, DEPENDENCY_MODULE_NAMES -from support.plex_media import get_all_parts, get_embedded_subtitle_streams +from support.extract import season_extract_embedded from support.scheduler import scheduler from support.config import config from support.helpers import timestamp, df, display_language -from support.ignore import ignore_list -from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, MI_KEY, get_item_title -from support.storage import get_subtitle_storage +from support.ignore import get_decision_list +from support.items import get_all_items, get_items_info, get_item_kind_from_rating_key, get_item, get_item_title +from support.i18n import _ # init GUI ObjectContainer.art = R(ART) @@ -89,7 +88,7 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p oc.add(DirectoryObject( key=Callback(MetadataMenu, rating_key=show.rating_key, title=show.title, base_title=show.section.title, previous_item_type="section", display_items=True, randomize=timestamp()), - title=u"< Back to %s" % show.title, + title=_(u"< Back to %s", show.title), thumb=show.thumb or default_thumb )) elif current_kind == "series": @@ -106,45 +105,69 @@ def MetadataMenu(rating_key, title=None, base_title=None, display_items=False, p if current_kind in ("series", "season"): item = get_item(rating_key) sub_title = get_item_title(item) - add_ignore_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=IgnoreMenu) + add_incl_excl_options(oc, current_kind, title=sub_title, rating_key=rating_key, callback_menu=InclExclMenu) # mass-extract embedded - if current_kind == "season" and config.plex_transcoder: - for lang in config.lang_list: - oc.add(DirectoryObject( - key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, - base_title=show.section.title, display_items=display_items, item_title=item_title, - title=title, - previous_item_type=previous_item_type, with_mods=True, - previous_rating_key=previous_rating_key, randomize=timestamp()), - title=u"Extract missing %s embedded subtitles" % display_language(lang), - summary="Extracts the not yet extracted embedded subtitles of all episodes for the current season " - "with all configured default modifications" - )) - oc.add(DirectoryObject( - key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, - base_title=show.section.title, display_items=display_items, item_title=item_title, - title=title, force=True, - previous_item_type=previous_item_type, with_mods=True, - previous_rating_key=previous_rating_key, randomize=timestamp()), - title=u"Extract and activate %s embedded subtitles" % display_language(lang), - summary="Extracts embedded subtitles of all episodes for the current season " - "with all configured default modifications" - )) + if config.plex_transcoder: + if current_kind == "season": + for lang in config.lang_list: + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=show.section.title, display_items=display_items, item_title=item_title, + title=title, + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current " + "season with all configured default modifications") + )) + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=show.section.title, display_items=display_items, item_title=item_title, + title=title, force=True, + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts embedded subtitles of all episodes for the current season " + "with all configured default modifications") + )) + elif current_kind == "series": + for lang in config.lang_list: + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=title, display_items=display_items, item_title=item_title, + title=title, mode="series", + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract missing %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts the not yet extracted embedded subtitles of all episodes for the current " + "series with all configured default modifications") + )) + oc.add(DirectoryObject( + key=Callback(SeasonExtractEmbedded, rating_key=rating_key, language=lang, + base_title=title, display_items=display_items, item_title=item_title, + title=title, force=True, mode="series", + previous_item_type=previous_item_type, with_mods=True, + previous_rating_key=previous_rating_key, randomize=timestamp()), + title=_(u"Extract and activate %(language)s embedded subtitles", language=display_language(lang)), + summary=_("Extracts embedded subtitles of all episodes for the current series " + "with all configured default modifications") + )) # add refresh oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=u"Refresh: %s" % item_title, - summary="Refreshes the %s, possibly searching for missing and picking up new subtitles on disk" % current_kind + title=_(u"Refresh: %s", item_title), + summary=_("Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up " + "new subtitles on disk", the_movie_series_season_episode=_(u"the %s" % current_kind)) )) oc.add(DirectoryObject( key=Callback(RefreshItem, rating_key=rating_key, item_title=title, force=True, refresh_kind=current_kind, previous_rating_key=previous_rating_key, timeout=timeout * 1000, randomize=timestamp()), - title=u"Auto-Find subtitles: %s" % item_title, - summary="Issues a forced refresh, ignoring known subtitles and searching for new ones" + title=_(u"Auto-Find subtitles: %s", item_title), + summary=_("Issues a forced refresh, ignoring known subtitles and searching for new ones") )) else: return ItemDetailsMenu(rating_key=rating_key, title=title, item_title=item_title) @@ -160,70 +183,29 @@ def SeasonExtractEmbedded(**kwargs): item_title = kwargs.pop("item_title") title = kwargs.pop("title") force = kwargs.pop("force", False) + mode = kwargs.pop("mode", "season") Thread.Create(season_extract_embedded, **{"rating_key": rating_key, "requested_language": requested_language, - "with_mods": with_mods, "force": force}) + "with_mods": with_mods, "force": force, "mode": mode}) - kwargs["header"] = 'Success' - kwargs["message"] = u"Extracting of embedded subtitles for %s triggered" % title + kwargs["header"] = _("Success") + kwargs["message"] = _(u"Extracting of embedded subtitles for %s triggered", title) kwargs.pop("randomize") return MetadataMenu(randomize=timestamp(), title=item_title, **kwargs) -def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True): - def execute(): - for video_part_map, plexapi_part, stream_index, language, set_current in stream_list: - plexapi_item = video_part_map.keys()[0].plexapi_metadata["item"] - - extract_embedded_sub(rating_key=plexapi_item.rating_key, part_id=plexapi_part.id, - plex_item=plexapi_item, part=plexapi_part, scanned_videos=video_part_map, - stream_index=stream_index, set_current=set_current, - language=language, with_mods=with_mods, refresh=refresh) - - if single_thread: - with Thread.Lock(key="extract_embedded"): - execute() - else: - execute() - - -def season_extract_embedded(rating_key, requested_language, with_mods=False, force=False): - # get stored subtitle info for item id - subtitle_storage = get_subtitle_storage() - - try: - for data in get_all_items(key="children", value=rating_key, base="library/metadata"): - item = get_item(data[MI_KEY]) - if item: - stored_subs = subtitle_storage.load_or_new(item) - for part in get_all_parts(item): - embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") - current = stored_subs.get_any(part.id, requested_language) - if not embedded_subs or force: - stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language, - get_forced=config.forced_only) - if stream_data: - stream = stream_data[0]["stream"] - - set_current = not current or force - refresh = not current - - extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, - stream_index=str(stream.index), set_current=set_current, - refresh=refresh, language=requested_language, with_mods=with_mods) - finally: - subtitle_storage.destroy() - - @route(PREFIX + '/ignore_list') def IgnoreListMenu(): - oc = SubFolderObjectContainer(title2="Ignore list", replace_parent=True) - for key in ignore_list.key_order: - values = ignore_list[key] + ref_list = get_decision_list() + include = ref_list.store == "include" + list_title = _("Include list" if include else "Ignore list") + oc = SubFolderObjectContainer(title2=list_title, replace_parent=True) + for key in ref_list.key_order: + values = ref_list[key] for value in values: - add_ignore_options(oc, key, title=ignore_list.get_title(key, value), rating_key=value, - callback_menu=IgnoreMenu) + add_incl_excl_options(oc, key, title=ref_list.get_title(key, value), rating_key=value, + callback_menu=InclExclMenu) return oc @@ -231,18 +213,19 @@ def IgnoreListMenu(): def HistoryMenu(): from support.history import get_history history = get_history() - oc = SubFolderObjectContainer(title2="History", replace_parent=True) + oc = SubFolderObjectContainer(title2=_("History"), replace_parent=True) - for item in history.items: + for item in history.items[:100]: possible_language = item.language language_display = item.lang_name if not possible_language else display_language(possible_language) oc.add(DirectoryObject( key=Callback(ItemDetailsMenu, title=item.title, item_title=item.item_title, rating_key=item.rating_key), - title=u"%s (%s)" % (item.item_title, item.mode_verbose), - summary=u"%s in %s (%s, score: %s), %s" % (language_display, item.section_title, - item.provider_name, item.score, df(item.time)) + title=u"%s (%s)" % (item.item_title, _(item.mode_verbose)), + summary=_(u"%s in %s (%s, score: %s), %s", language_display, item.section_title, + _(item.provider_name), item.score, df(item.time)), + thumb=item.thumb or default_thumb )) history.destroy() @@ -267,6 +250,40 @@ def replace_item(obj, key, replace_value): return obj +def check_connections(): + # debug drone + Log.Debug("Checking connections ...") + log_buffer = [] + try: + from subliminal_patch.refiners.drone import SonarrClient, RadarrClient + log_buffer.append(["----- Connections -----"]) + for key, cls in [("sonarr", SonarrClient), ("radarr", RadarrClient)]: + if key in config.refiner_settings: + cname = key.capitalize() + try: + status = cls(**config.refiner_settings[key]).status(timeout=5) + except HTTPError, e: + if e.response.status_code == 401: + log_buffer.append(("%s: NOT WORKING - BAD API KEY", cname)) + else: + log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) + except: + log_buffer.append(("%s: NOT WORKING - %s", cname, traceback.format_exc())) + else: + if status and status["version"]: + log_buffer.append(("%s: OK - %s", cname, status["version"])) + else: + log_buffer.append(("%s: NOT WORKING - %s", cname)) + except: + log_buffer.append(("Something went really wrong when evaluating Sonarr/Radarr: %s", traceback.format_exc())) + finally: + Core.log.setLevel(logging.DEBUG) + for entry in log_buffer: + Log.Debug(*entry) + + Core.log.setLevel(logging.getLevelName(Prefs["log_level"])) + + @route(PREFIX + '/ValidatePrefs', enforce_route=True) def ValidatePrefs(): Core.log.setLevel(logging.DEBUG) @@ -290,20 +307,20 @@ def ValidatePrefs(): update_dict = True elif Dict["channel_enabled"] != config.enable_channel: - Log.Debug("Channel features %s, restarting plugin", "enabled" if config.enable_channel else "disabled") + Log.Debug("Interface features %s, restarting plugin", "enabled" if config.enable_channel else "disabled") update_dict = True restart = True - if "plugin_pin_mode" not in Dict: + if "plugin_pin_mode2" not in Dict: update_dict = True - elif Dict["plugin_pin_mode"] != Prefs["plugin_pin_mode"]: + elif Dict["plugin_pin_mode2"] != Prefs["plugin_pin_mode2"]: update_dict = True restart = True if update_dict: Dict["channel_enabled"] = config.enable_channel - Dict["plugin_pin_mode"] = Prefs["plugin_pin_mode"] + Dict["plugin_pin_mode2"] = Prefs["plugin_pin_mode2"] Dict.Save() if restart: @@ -322,8 +339,10 @@ def ValidatePrefs(): for attr in [ "version", "app_support_path", "data_path", "data_items_path", "enable_agent", "enable_channel", "permissions_ok", "missing_permissions", "fs_encoding", - "subtitle_destination_folder", "new_style_cache", "dbm_supported", "lang_list", "providers", - "plex_transcoder", "refiner_settings", "unrar"]: + "subtitle_destination_folder", "include", "include_exclude_paths", "include_exclude_sz_files", + "new_style_cache", "dbm_supported", "lang_list", "providers", "normal_subs", "forced_only", "forced_also", + "plex_transcoder", "refiner_settings", "unrar", "adv_cfg_path", "use_custom_dns", + "has_anticaptcha", "anticaptcha_cls", "mediainfo_bin"]: value = getattr(config, attr) if isinstance(value, dict): @@ -331,6 +350,9 @@ def ValidatePrefs(): Log.Debug("config.%s: %s", attr, d) continue + if attr in ("api_key",): + value = "xxxxxxxxxxxxxxxxxxxxxxxxx" + Log.Debug("config.%s: %s", attr, value) for attr in ["plugin_log_path", "server_log_path"]: @@ -352,30 +374,8 @@ def ValidatePrefs(): "subtitles.save.filesystem", ]: Log.Debug("Pref.%s: %s", attr, Prefs[attr]) - # debug drone if "sonarr" in config.refiner_settings or "radarr" in config.refiner_settings: - Log.Debug("----- Connections -----") - try: - from subliminal_patch.refiners.drone import SonarrClient, RadarrClient - for key, cls in [("sonarr", SonarrClient), ("radarr", RadarrClient)]: - if key in config.refiner_settings: - cname = key.capitalize() - try: - status = cls(**config.refiner_settings[key]).status() - except HTTPError, e: - if e.response.status_code == 401: - Log.Debug("%s: NOT WORKING - BAD API KEY", cname) - else: - Log.Debug("%s: NOT WORKING - %s", cname, traceback.format_exc()) - except: - Log.Debug("%s: NOT WORKING - %s", cname, traceback.format_exc()) - else: - if status and status["version"]: - Log.Debug("%s: OK - %s", cname, status["version"]) - else: - Log.Debug("%s: NOT WORKING - %s", cname) - except: - Log.Debug("Something went really wrong when evaluating Sonarr/Radarr: %s", traceback.format_exc()) + Thread.Create(check_connections) # fixme: check existance of and os access of logs Log.Debug("----- Environment -----") diff --git a/Contents/Code/interface/menu_helpers.py b/Contents/Code/interface/menu_helpers.py index a4ee64036..d39dd87b5 100644 --- a/Contents/Code/interface/menu_helpers.py +++ b/Contents/Code/interface/menu_helpers.py @@ -1,25 +1,16 @@ # coding=utf-8 -import traceback import types import datetime -import subprocess -import os -import operator - -from func import enable_channel_wrapper, route_wrapper, register_route_function -from subzero.language import Language -from support.items import get_kind, get_item_thumb, get_item, get_item_kind_from_item, refresh_item -from support.helpers import get_video_display_title, pad_title, display_language, quote_args, is_stream_forced -from support.ignore import ignore_list + +from func import enable_channel_wrapper, route_wrapper +from support.i18n import is_localized_string, _ +from support.items import get_item_thumb +from support.helpers import get_video_display_title, pad_title +from support.ignore import get_decision_list from support.lib import get_intent from support.config import config from subzero.constants import ICON_SUB, ICON -from support.plex_media import get_part, get_plex_metadata from support.scheduler import scheduler -from support.scanning import scan_videos -from support.storage import save_subtitles - -from subliminal_patch.subtitle import ModifiedSubtitle default_thumb = R(ICON_SUB) main_icon = ICON if not config.is_development else "icon-dev.jpg" @@ -30,7 +21,7 @@ handler = enable_channel_wrapper(handler) -def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True): +def add_incl_excl_options(oc, kind, callback_menu=None, title=None, rating_key=None, add_kind=True): """ :param oc: oc to add our options to @@ -42,17 +33,29 @@ def add_ignore_options(oc, kind, callback_menu=None, title=None, rating_key=None """ # try to translate kind to the ignore key use_kind = kind - if kind not in ignore_list: - use_kind = ignore_list.translate_key(kind) - if not use_kind or use_kind not in ignore_list: + ref_list = get_decision_list() + if kind not in ref_list: + use_kind = ref_list.translate_key(kind) + if not use_kind or use_kind not in ref_list: return - in_list = rating_key in ignore_list[use_kind] + in_list = rating_key in ref_list[use_kind] + include = ref_list.store == "include" + + if include: + t = u"Enable Sub-Zero for %(kind)s \"%(title)s\"" + if in_list: + t = u"Disable Sub-Zero for %(kind)s \"%(title)s\"" + else: + t = u"Ignore %(kind)s \"%(title)s\"" + if in_list: + t = u"Un-ignore %(kind)s \"%(title)s\"" oc.add(DirectoryObject( - key=Callback(callback_menu, kind=use_kind, rating_key=rating_key, title=title), - title=u"%s %s \"%s\"" % ( - "Un-Ignore" if in_list else "Ignore", ignore_list.verbose(kind) if add_kind else "", unicode(title)) + key=Callback(callback_menu, kind=use_kind, sure=False, todo="not_set", rating_key=str(rating_key), title=title), + title=_(t, + kind=ref_list.verbose(kind) if add_kind else "", + title=unicode(title)) ) ) @@ -90,10 +93,12 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): # store it in last state and remove the current Dict["last_refresh_state"] = Dict["current_refresh_state"] Dict["current_refresh_state"] = None + Dict.Save() return - if isinstance(state_or_media, types.StringTypes): - Dict["current_refresh_state"] = state_or_media + if isinstance(state_or_media, types.StringTypes) or is_localized_string(state_or_media): + Dict["current_refresh_state"] = unicode(state_or_media) + Dict.Save() return media = state_or_media @@ -104,14 +109,20 @@ def set_refresh_menu_state(state_or_media, media_type="movies"): for episode in media.seasons[season].episodes: ep = media.seasons[season].episodes[episode] media_id = ep.id - title = get_video_display_title("show", ep.title, parent_title=media.title, season=int(season), episode=int(episode)) + title = get_video_display_title(_("show"), ep.title, parent_title=media.title, season=int(season), episode=int(episode)) else: - title = get_video_display_title("movie", media.title) + title = get_video_display_title(_("movie"), media.title) intent = get_intent() force_refresh = intent.get("force", media_id) - Dict["current_refresh_state"] = u"%sRefreshing %s" % ("Force-" if force_refresh else "", unicode(title)) + t = u"Refreshing %(title)s" + if force_refresh: + t = u"Force-refreshing %(title)s" + + Dict["current_refresh_state"] = unicode(_(t, + title=unicode(title))) + Dict.Save() def get_item_task_data(task_name, rating_key, language): @@ -132,68 +143,6 @@ def debounce(func): return func -def extract_embedded_sub(**kwargs): - rating_key = kwargs["rating_key"] - part_id = kwargs.pop("part_id") - stream_index = kwargs.pop("stream_index") - with_mods = kwargs.pop("with_mods", False) - language = Language.fromietf(kwargs.pop("language")) - refresh = kwargs.pop("refresh", True) - set_current = kwargs.pop("set_current", True) - - plex_item = kwargs.pop("plex_item", get_item(rating_key)) - item_type = get_item_kind_from_item(plex_item) - part = kwargs.pop("part", get_part(plex_item, part_id)) - scanned_videos = kwargs.pop("scanned_videos", None) - - any_successful = False - - if part: - if not scanned_videos: - metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) - scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) - - for stream in part.streams: - # subtitle stream - if str(stream.index) == stream_index: - is_forced = is_stream_forced(stream) - bn = os.path.basename(part.file) - - set_refresh_menu_state(u"Extracting subtitle %s of %s" % (stream_index, bn)) - Log.Info(u"Extracting stream %s (%s) of %s", stream_index, display_language(language), bn) - - out_codec = stream.codec if stream.codec != "mov_text" else "srt" - - args = [ - config.plex_transcoder, "-i", part.file, "-map", "0:%s" % stream_index, "-f", out_codec, "-" - ] - output = None - try: - output = subprocess.check_output(quote_args(args), stderr=subprocess.PIPE, shell=True) - except: - Log.Error("Extraction failed: %s", traceback.format_exc()) - - if output: - subtitle = ModifiedSubtitle(language, mods=config.default_mods if with_mods else None) - subtitle.content = output - subtitle.provider_name = "embedded" - subtitle.id = "stream_%s" % stream_index - subtitle.score = 0 - subtitle.set_encoding("utf-8") - - # fixme: speedup video; only video.name is needed - save_successful = save_subtitles(scanned_videos, {scanned_videos.keys()[0]: [subtitle]}, mode="m", - set_current=set_current, is_forced=is_forced) - set_refresh_menu_state(None) - - if save_successful and refresh: - refresh_item(rating_key) - - any_successful = True - - return any_successful - - class SZObjectContainer(ObjectContainer): def __init__(self, *args, **kwargs): skip_pin_lock = kwargs.pop("skip_pin_lock", False) @@ -225,10 +174,10 @@ def __init__(self, *args, **kwargs): from support.helpers import pad_title, timestamp self.add(DirectoryObject( key=Callback(fatality, force_title=" ", randomize=timestamp()), - title=pad_title("<< Back to home"), - summary="Current state: %s; Last state: %s" % ( - (Dict["current_refresh_state"] or "Idle") if "current_refresh_state" in Dict else "Idle", - (Dict["last_refresh_state"] or "None") if "last_refresh_state" in Dict else "None" + title=pad_title(_("<< Back to home")), + summary=_("Current state: %s; Last state: %s", + (Dict["current_refresh_state"] or _("Idle")) if "current_refresh_state" in Dict else _("Idle"), + (Dict["last_refresh_state"] or _("None")) if "last_refresh_state" in Dict else _("None") ) )) @@ -246,4 +195,4 @@ def Content(self): self.SetHeader("Content-Disposition", 'attachment; filename="' + datetime.datetime.now().strftime("Logs_%y%m%d_%H-%M-%S.zip") + '"') - return self.zipdata \ No newline at end of file + return self.zipdata diff --git a/Contents/Code/interface/refresh_item.py b/Contents/Code/interface/refresh_item.py index 042baddc9..d716f1afb 100644 --- a/Contents/Code/interface/refresh_item.py +++ b/Contents/Code/interface/refresh_item.py @@ -4,6 +4,7 @@ from menu_helpers import debounce, set_refresh_menu_state, route from support.items import refresh_item from support.helpers import timestamp +from support.i18n import _ @route(PREFIX + '/item/refresh/{rating_key}/force', force=True) @@ -15,9 +16,17 @@ def RefreshItem(rating_key=None, came_from="/recent", item_title=None, force=Fal from interface.main import fatality header = " " if trigger: - set_refresh_menu_state(u"Triggering %sRefresh for %s" % ("Force-" if force else "", item_title)) + t = u"Triggering refresh for %(title)s" + if force: + u"Triggering forced refresh for %(title)s" + set_refresh_menu_state(_(t, + title=item_title)) Thread.Create(refresh_item, rating_key=rating_key, force=force, refresh_kind=refresh_kind, parent_rating_key=previous_rating_key, timeout=int(timeout)) - header = u"%s of item %s triggered" % ("Refresh" if not force else "Forced-refresh", rating_key) + t = u"Refresh of item %(item_id)s triggered" + if force: + t = u"Forced refresh of item %(item_id)s triggered" + header = _(t, + item_id=rating_key) return fatality(randomize=timestamp(), header=header, replace_parent=True) diff --git a/Contents/Code/interface/sub_mod.py b/Contents/Code/interface/sub_mod.py index 41eae25a5..6b62f5c03 100644 --- a/Contents/Code/interface/sub_mod.py +++ b/Contents/Code/interface/sub_mod.py @@ -12,6 +12,7 @@ from support.scanning import scan_videos from support.helpers import timestamp, pad_title from support.items import get_current_sub, set_mods_for_part +from support.i18n import _ @route(PREFIX + '/item/sub_mods/{rating_key}/{part_id}', force=bool) @@ -30,8 +31,8 @@ def SubtitleModificationsMenu(**kwargs): from interface.item_details import SubtitleOptionsMenu oc.add(DirectoryObject( key=Callback(SubtitleOptionsMenu, randomize=timestamp(), **kwargs), - title=u"< Back to subtitle options for: %s" % kwargs["title"], - summary=kwargs["current_data"], + title=_(u"< Back to subtitle options for: %s", kwargs["title"]), + summary=unicode(kwargs["current_data"]), thumb=default_thumb )) @@ -47,48 +48,48 @@ def SubtitleModificationsMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="add", randomize=timestamp(), **kwargs), - title=pad_title(mod.description), summary=mod.long_description or "" + title=pad_title(_(mod.description)), summary=_(mod.long_description) or "" )) fps_mod = SubtitleModifications.get_mod_class("change_FPS") oc.add(DirectoryObject( key=Callback(SubtitleFPSModMenu, randomize=timestamp(), **kwargs), - title=pad_title(fps_mod.description), summary=fps_mod.long_description or "" + title=pad_title(_(fps_mod.description)), summary=_(fps_mod.long_description) or "" )) shift_mod = SubtitleModifications.get_mod_class("shift_offset") oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), - title=pad_title(shift_mod.description), summary=shift_mod.long_description or "" + title=pad_title(_(shift_mod.description)), summary=_(shift_mod.long_description) or "" )) color_mod = SubtitleModifications.get_mod_class("color") oc.add(DirectoryObject( key=Callback(SubtitleColorModMenu, randomize=timestamp(), **kwargs), - title=pad_title(color_mod.description), summary=color_mod.long_description or "" + title=pad_title(_(color_mod.description)), summary=_(color_mod.long_description) or "" )) if current_mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="remove_last", randomize=timestamp(), **kwargs), - title=pad_title("Remove last applied mod (%s)" % current_mods[-1]), - summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") + title=pad_title(_("Remove last applied mod (%s)", current_mods[-1])), + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleListMods, randomize=timestamp(), **kwargs), - title=pad_title("Manage applied mods"), - summary=u"Currently applied mods: %s" % (", ".join(current_mods)) + title=pad_title(_("Manage applied mods")), + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods)) )) oc.add(DirectoryObject( key=Callback(SubtitleReapplyMods, randomize=timestamp(), **kwargs), - title=pad_title("Reapply applied mods"), - summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") + title=pad_title(_("Reapply applied mods")), + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=None, mode="clear", randomize=timestamp(), **kwargs), - title=pad_title("Restore original version"), - summary=u"Currently applied mods: %s" % (", ".join(current_mods) if current_mods else "none") + title=pad_title(_("Restore original version")), + summary=_(u"Currently applied mods: %(mod_list)s", mod_list=", ".join(current_mods) if current_mods else _("none")) )) storage.destroy() @@ -108,7 +109,7 @@ def SubtitleFPSModMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modification menu" + title=_("< Back to subtitle modification menu") )) metadata = get_plex_metadata(rating_key, part_id, item_type) @@ -122,14 +123,17 @@ def SubtitleFPSModMenu(**kwargs): continue if float(fps) > float(target_fps): - indicator = "subs constantly getting faster" + indicator = _("subs constantly getting faster") else: - indicator = "subs constantly getting slower" + indicator = _("subs constantly getting slower") mod_ident = SubtitleModifications.get_mod_signature("change_FPS", **{"from": fps, "to": target_fps}) oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=mod_ident, mode="add", randomize=timestamp(), **kwargs), - title="%s fps -> %s fps (%s)" % (fps, target_fps, indicator) + title=_("%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + from_fps=fps, + to_fps=target_fps, + slower_or_faster_indicator=indicator) )) return oc @@ -147,13 +151,13 @@ def SubtitleShiftModUnitMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modifications" + title=_("< Back to subtitle modifications") )) for unit, title in POSSIBLE_UNITS: oc.add(DirectoryObject( key=Callback(SubtitleShiftModMenu, unit=unit, randomize=timestamp(), **kwargs), - title="Adjust by %s" % title + title=_("Adjust by %(time_and_unit)s", time_and_unit=title) )) return oc @@ -170,7 +174,7 @@ def SubtitleShiftModMenu(unit=None, **kwargs): oc.add(DirectoryObject( key=Callback(SubtitleShiftModUnitMenu, randomize=timestamp(), **kwargs), - title="< Back to unit selection" + title=_("< Back to unit selection") )) rng = [] @@ -204,7 +208,7 @@ def SubtitleColorModMenu(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modification menu" + title=_("< Back to subtitle modification menu") )) for color, code in color_mod.colors.iteritems(): @@ -266,13 +270,13 @@ def SubtitleListMods(**kwargs): oc.add(DirectoryObject( key=Callback(SubtitleModificationsMenu, randomize=timestamp(), **kwargs), - title="< Back to subtitle modifications" + title=_("< Back to subtitle modifications") )) for identifier in current_sub.mods: oc.add(DirectoryObject( key=Callback(SubtitleSetMods, mods=identifier, mode="remove", randomize=timestamp(), **kwargs), - title="Remove: %s" % identifier + title=_("Remove: %(mod_name)s", mod_name=identifier) )) storage.destroy() diff --git a/Contents/Code/support/__init__.py b/Contents/Code/support/__init__.py index 67a12c803..e3dc2a581 100644 --- a/Contents/Code/support/__init__.py +++ b/Contents/Code/support/__init__.py @@ -13,6 +13,16 @@ sys.modules["support.lib"] = lib +import i18n + +sys.modules["support.i18n"] = i18n + +helpers._ = i18n._ + +import history + +sys.modules["support.history"] = history + import plex_media sys.modules["support.plex_media"] = plex_media @@ -43,6 +53,10 @@ sys.modules["support.missing_subtitles"] = missing_subtitles +import extract + +sys.modules["support.extract"] = extract + import tasks sys.modules["support.tasks"] = tasks @@ -51,10 +65,6 @@ sys.modules["support.ignore"] = ignore -import history - -sys.modules["support.history"] = history - import data sys.modules["support.data"] = data diff --git a/Contents/Code/support/activities.py b/Contents/Code/support/activities.py index 18f0fb117..0e4cf42a6 100644 --- a/Contents/Code/support/activities.py +++ b/Contents/Code/support/activities.py @@ -85,7 +85,7 @@ def on_playing(self, info): (rating_key, next_ep.rating_key, int(next_ep.season.index), int(next_ep.index)) else: - if config.activity_mode == "hybrid": + if config.activity_mode in ("hybrid", "hybrid-plus"): keys_to_refresh.append(rating_key) elif config.activity_mode == "refresh": keys_to_refresh.append(rating_key) diff --git a/Contents/Code/support/config.py b/Contents/Code/support/config.py index 441518f71..7a4276852 100644 --- a/Contents/Code/support/config.py +++ b/Contents/Code/support/config.py @@ -1,5 +1,6 @@ # coding=utf-8 import copy +import json import os import re import inspect @@ -7,23 +8,29 @@ import rarfile import jstyleson import datetime +import stat +import traceback +import socket +import requests import subliminal import subliminal_patch import subzero.constants import lib -from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded - +from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError, \ + DownloadLimitPerDayExceeded from subliminal_patch.core import is_windows_special_path from whichdb import whichdb -from subliminal_patch.exceptions import TooManyRequests +from subliminal_patch.exceptions import TooManyRequests, APIThrottled from subzero.language import Language from subliminal.cli import MutexLock from subzero.lib.io import FileIO, get_viable_encoding from subzero.lib.dict import Dicked +from subzero.lib.which import find_executable from subzero.util import get_root_path from subzero.constants import PLUGIN_NAME, PLUGIN_IDENTIFIER, MOVIE, SHOW, MEDIA_TYPE_TO_STRING +from subzero.prefs import get_user_prefs, update_user_prefs from dogpile.cache.region import register_backend as register_cache_backend from lib import Plex from helpers import check_write_permissions, cast_bool, cast_int, mswindows @@ -43,7 +50,8 @@ 'wtv', 'xsp', 'xvid', 'webm'] -IGNORE_FN = ("subzero.ignore", ".subzero.ignore", ".nosz") +EXCLUDE_FN = ("subzero.ignore", ".subzero.ignore", "subzero.exclude", ".subzero.exclude", ".nosz") +INCLUDE_FN = ("subzero.include", ".subzero.include", ".sz") VERSION_RE = re.compile(ur'CFBundleVersion.+?([0-9\.]+)', re.DOTALL) DEV_RE = re.compile(ur'PlexPluginDevMode.+?([01]+)', re.DOTALL) @@ -56,25 +64,42 @@ def int_or_default(s, default): return default -VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable) +VALID_THROTTLE_EXCEPTIONS = (TooManyRequests, DownloadLimitExceeded, DownloadLimitPerDayExceeded, + ServiceUnavailable, APIThrottled, requests.Timeout, requests.ReadTimeout, socket.timeout) + +def_timeout = (datetime.timedelta(minutes=20), "20 minutes") PROVIDER_THROTTLE_MAP = { "default": { TooManyRequests: (datetime.timedelta(hours=1), "1 hour"), DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), + DownloadLimitPerDayExceeded: (datetime.timedelta(hours=4), "4 hours"), ServiceUnavailable: (datetime.timedelta(minutes=20), "20 minutes"), + APIThrottled: (datetime.timedelta(minutes=10), "10 minutes"), + AuthenticationError: (datetime.timedelta(hours=2), "2 hours"), + requests.Timeout: def_timeout, + socket.timeout: def_timeout, + requests.ReadTimeout: def_timeout, }, "opensubtitles": { TooManyRequests: (datetime.timedelta(hours=3), "3 hours"), DownloadLimitExceeded: (datetime.timedelta(hours=6), "6 hours"), + APIThrottled: (datetime.timedelta(seconds=15), "15 seconds"), }, - "addic7ed": { + "opensubtitlescom": { + TooManyRequests: (datetime.timedelta(minutes=1), "1 minute"), DownloadLimitExceeded: (datetime.timedelta(hours=24), "24 hours"), + }, + "addic7ed": { + DownloadLimitExceeded: (datetime.timedelta(hours=3), "3 hours"), + TooManyRequests: (datetime.timedelta(minutes=5), "5 minutes"), + AuthenticationError: (datetime.timedelta(hours=24), "24 hours"), } } class Config(object): + config_version = 3 libraries_root = None plugin_info = "" version = None @@ -93,7 +118,12 @@ class Config(object): new_style_cache = False pack_cache_dir = None advanced = None + debug_i18n = False + normal_subs = False + forced_also = False + forced_only = False + include = False enable_channel = True enable_agent = True pin = None @@ -106,8 +136,8 @@ class Config(object): max_recent_items_per_library = 200 permissions_ok = False missing_permissions = None - ignore_sz_files = False - ignore_paths = None + include_exclude_sz_files = False + include_exclude_paths = None fs_encoding = None notify_executable = None sections = None @@ -116,10 +146,10 @@ class Config(object): remove_tags = False fix_ocr = False fix_common = False + fix_upper = False reverse_rtl = False colors = "" chmod = None - forced_only = False exotic_ext = False treat_und_as_first = False subtitle_sub_dir = None, None @@ -133,9 +163,18 @@ class Config(object): refiner_settings = None exact_filenames = False only_one = False + any_language_is_enough = False + ignore_for_audio = False + ignore_subs_for_empty_audio = False embedded_auto_extract = False ietf_as_alpha3 = False unrar = None + adv_cfg_path = None + use_custom_dns = None + anticaptcha_token = None + anticaptcha_cls = None + has_anticaptcha = False + mediainfo_bin = None store_recently_played_amount = 40 @@ -160,14 +199,25 @@ def initialize(self): self.data_items_path = os.path.join(self.data_path, "DataItems") self.universal_plex_token = self.get_universal_plex_token() self.plex_token = os.environ.get("PLEXTOKEN", self.universal_plex_token) + self.new_style_cache = cast_bool(Prefs['new_style_cache']) + self.pack_cache_dir = self.get_pack_cache_dir() + try: + self.migrate_prefs() + except: + Log.Exception("Catastrophic failure when running prefs migration") + subzero.constants.DEFAULT_TIMEOUT = lib.DEFAULT_TIMEOUT = self.pms_request_timeout = \ min(cast_int(Prefs['pms_request_timeout'], 15), 45) self.low_impact_mode = cast_bool(Prefs['low_impact_mode']) - self.new_style_cache = cast_bool(Prefs['new_style_cache']) - self.pack_cache_dir = self.get_pack_cache_dir() self.advanced = self.get_advanced_config() + self.debug_i18n = self.advanced.debug_i18n os.environ["SZ_USER_AGENT"] = self.get_user_agent() + os.environ["ANTICAPTCHA_ACCOUNT_KEY"] = self.anticaptcha_token = str(Prefs["anticaptcha.api_key"]) or "" + acs = str(Prefs["anticaptcha.service"]) + if acs and acs != "none": + os.environ["ANTICAPTCHA_CLASS"] = self.anticaptcha_cls = acs + self.has_anticaptcha = self.anticaptcha_token and self.anticaptcha_cls self.setup_proxies() self.set_plugin_mode() @@ -175,14 +225,18 @@ def initialize(self): self.set_activity_modes() self.parse_rename_mode() + self.normal_subs = Prefs["subtitles.when"] != "Never" + self.forced_also = self.normal_subs and Prefs["subtitles.when_forced"] != "Never" + self.forced_only = not self.normal_subs and Prefs["subtitles.when_forced"] != "Never" + self.include = \ + Prefs["subtitles.include_exclude_mode"] == "disable SZ for all items by default, use include lists" self.subtitle_destination_folder = self.get_subtitle_destination_folder() self.subtitle_formats = self.get_subtitle_formats() - self.forced_only = cast_bool(Prefs["subtitles.only_foreign"]) self.max_recent_items_per_library = int_or_default(Prefs["scheduler.max_recent_items_per_library"], 2000) self.sections = list(Plex["library"].sections()) self.missing_permissions = [] - self.ignore_sz_files = cast_bool(Prefs["subtitles.ignore_fs"]) - self.ignore_paths = self.parse_ignore_paths() + self.include_exclude_sz_files = cast_bool(Prefs["subtitles.include_exclude_fs"]) + self.include_exclude_paths = self.parse_include_exclude_paths() self.enabled_sections = self.check_enabled_sections() self.permissions_ok = self.check_permissions() self.notify_executable = self.check_notify_executable() @@ -190,6 +244,7 @@ def initialize(self): self.remove_tags = cast_bool(Prefs['subtitles.remove_tags']) self.fix_ocr = cast_bool(Prefs['subtitles.fix_ocr']) self.fix_common = cast_bool(Prefs['subtitles.fix_common']) + self.fix_upper = cast_bool(Prefs['subtitles.fix_only_uppercase']) self.reverse_rtl = cast_bool(Prefs['subtitles.reverse_rtl']) self.colors = Prefs['subtitles.colors'] if Prefs['subtitles.colors'] != "don't change" else None self.chmod = self.check_chmod() @@ -202,10 +257,72 @@ def initialize(self): self.no_refresh = os.environ.get("SZ_NO_REFRESH", False) self.plex_transcoder = self.get_plex_transcoder() self.only_one = cast_bool(Prefs['subtitles.only_one']) + self.any_language_is_enough = Prefs['subtitles.any_language_is_enough'] + self.ignore_for_audio = self.ignore_subs_for_audio() self.embedded_auto_extract = cast_bool(Prefs["subtitles.embedded.autoextract"]) self.ietf_as_alpha3 = cast_bool(Prefs["subtitles.language.ietf_normalize"]) + self.use_custom_dns = self.parse_custom_dns() + if not self.advanced.dont_use_mediainfo_mp4: + self.mediainfo_bin = self.advanced.mediainfo_bin or find_executable("mediainfo") self.initialized = True + def migrate_prefs(self): + config_version = 0 if "config_version" not in Dict else Dict["config_version"] + if config_version < self.config_version: + user_prefs = get_user_prefs(Prefs, Log) + if user_prefs: + update_prefs = {} + for i in range(config_version, self.config_version): + version = i+1 + func = "migrate_prefs_to_%i" % version + if hasattr(self, func): + Log.Info("Migrating user prefs to version %i" % version) + try: + mig_result = getattr(self, func)(user_prefs, from_version=config_version, + to_version=version, + current_version=self.config_version, + migrated_prefs=update_prefs) + update_prefs.update(mig_result) + Dict["config_version"] = version + Dict.Save() + Log.Info("User prefs migrated to version %i" % version) + except: + Log.Exception("User prefs migration from %i to %i failed" % (self.config_version, version)) + break + + if update_prefs: + update_user_prefs(update_prefs, Prefs, Log) + else: + Dict["config_version"] = self.config_version + Dict.Save() + + def migrate_prefs_to_1(self, user_prefs, **kwargs): + update_prefs = {} + if "subtitles.only_foreign" in user_prefs and user_prefs["subtitles.only_foreign"] == "true": + update_prefs["subtitles.when_forced"] = "1" + update_prefs["subtitles.when"] = "0" + + return update_prefs + + def migrate_prefs_to_2(self, user_prefs, **kwargs): + update_prefs = {} + if "subtitles.ignore_fs" in user_prefs and user_prefs["subtitles.ignore_fs"] == "true": + update_prefs["subtitles.include_exclude_fs"] = "true" + + if "subtitles.ignore_paths" in user_prefs and user_prefs["subtitles.ignore_paths"]: + update_prefs["subtitles.include_exclude_paths"] = user_prefs["subtitles.ignore_paths"] + + return update_prefs + + def migrate_prefs_to_3(self, user_prefs, **kwargs): + if config.new_style_cache: + self.init_cache() + try: + subliminal.region.backend.clear() + except: + pass + return {} + def init_libraries(self): try_executables = [] custom_unrar = os.environ.get("SZ_UNRAR_TOOL") @@ -231,6 +348,19 @@ def init_libraries(self): for exe in try_executables: rarfile.UNRAR_TOOL = exe rarfile.ORIG_UNRAR_TOOL = exe + if os.path.isfile(exe) and not os.access(exe, os.X_OK): + st = os.stat(exe) + try: + Log.Debug("setting generic executable permissions for %s", exe) + # fixme: too broad? + os.chmod(exe, st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + except: + Log.Debug("failed setting generic executable permissions for %s: %s", exe, traceback.format_exc()) + try: + Log.Debug("setting executable permissions for %s", exe) + os.chmod(exe, st.st_mode | stat.S_IEXEC) + except: + Log.Debug("failed setting executable permissions for %s: %s", exe, traceback.format_exc()) try: rarfile.custom_check([rarfile.UNRAR_TOOL], True) except: @@ -248,9 +378,10 @@ def init_libraries(self): def init_cache(self): if self.new_style_cache: - subliminal.region.configure('subzero.cache.file', expiration_time=datetime.timedelta(days=30), + subliminal.region.configure('subzero.cache.file', expiration_time=datetime.timedelta(days=180), arguments={'appname': "sz_cache", - 'app_cache_dir': self.data_path}) + 'app_cache_dir': self.data_path}, + replace_existing_backend=True) Log.Info("Using new style file based cache!") return @@ -290,14 +421,15 @@ def init_cache(self): try: subliminal.region.configure('dogpile.cache.dbm', expiration_time=datetime.timedelta(days=30), arguments={'filename': dbfn, - 'lock_factory': MutexLock}) + 'lock_factory': MutexLock}, + replace_existing_backend=True) Log.Info("Using file based cache!") return except: self.dbm_supported = False Log.Warn("Not using file based cache!") - subliminal.region.configure('dogpile.cache.memory') + subliminal.region.configure('dogpile.cache.memory', replace_existing_backend=True) def sync_cache(self): if not self.new_style_cache: @@ -313,15 +445,23 @@ def get_pack_cache_dir(self): return pack_cache_dir def get_advanced_config(self): + paths = [] if Prefs['path_to_advanced_settings']: - path = Prefs['path_to_advanced_settings'] - else: - path = os.path.join(config.data_path, "advanced_settings.json") + paths = [ + Prefs['path_to_advanced_settings'], + os.path.join(Prefs['path_to_advanced_settings'], "advanced_settings.json") + ] - if os.path.isfile(path): - data = FileIO.read(path, "r") + paths.append(os.path.join(config.data_path, "advanced_settings.json")) - return Dicked(**jstyleson.loads(data)) + for path in paths: + if os.path.isfile(path): + data = FileIO.read(path, "r") + + d = Dicked(**jstyleson.loads(data)) + self.adv_cfg_path = path + Log.Info(u"Using advanced settings from: %s", path) + return d return Dicked() @@ -361,19 +501,19 @@ def set_plugin_mode(self): self.enable_channel = True # any provider enabled? - if not self.providers: + if not self.providers_enabled: self.enable_agent = False self.enable_channel = False - Log.Warn("No providers enabled, disabling agent and channel!") + Log.Warn("No providers enabled, disabling agent and interface!") return - if Prefs["plugin_mode"] == "only agent": + if Prefs["plugin_mode2"] == "only agent": self.enable_channel = False - elif Prefs["plugin_mode"] == "only channel": + elif Prefs["plugin_mode2"] == "only interface": self.enable_agent = False def set_plugin_lock(self): - if Prefs["plugin_pin_mode"] in ("channel menu", "advanced menu"): + if Prefs["plugin_pin_mode2"] in ("interface", "advanced menu"): # check pin pin = Prefs["plugin_pin"] if not pin or not len(pin): @@ -386,8 +526,8 @@ def set_plugin_lock(self): except ValueError: Log.Warn("PIN has to be an integer (0-9)") self.pin = pin - self.lock_advanced_menu = Prefs["plugin_pin_mode"] == "advanced menu" - self.lock_menu = Prefs["plugin_pin_mode"] == "channel menu" + self.lock_advanced_menu = Prefs["plugin_pin_mode2"] == "advanced menu" + self.lock_menu = Prefs["plugin_pin_mode2"] == "interface" try: self.pin_valid_minutes = int(Prefs["plugin_pin_valid_for"].strip()) @@ -409,7 +549,7 @@ def check_permissions(self): return True self.missing_permissions = [] - use_ignore_fs = Prefs["subtitles.ignore_fs"] + use_include_exclude_fs = self.include_exclude_sz_files all_permissions_ok = True for section in self.sections: if section.key not in self.enabled_sections: @@ -424,12 +564,12 @@ def check_permissions(self): if not os.path.exists(path_str): continue - if use_ignore_fs: + if use_include_exclude_fs: # check whether we've got an ignore file inside the section path - if self.is_physically_ignored(path_str): + if not self.is_physically_wanted(path_str): continue - if self.is_path_ignored(path_str): + if not self.is_path_wanted(path_str): # is the path in our ignored paths setting? continue @@ -464,41 +604,68 @@ def get_plugin_info(self): info_file_path = os.path.abspath(os.path.join(curDir, "..", "..", "Info.plist")) return FileIO.read(info_file_path) - def parse_ignore_paths(self): - paths = Prefs["subtitles.ignore_paths"] - if paths: + def parse_include_exclude_paths(self): + paths = Prefs["subtitles.include_exclude_paths"] + if paths and paths != "None": try: - return [path.strip() for path in paths.split(",")] + return [p for p in [path.strip() for path in paths.split(",")] + if p != "None" and os.path.exists(p)] except: - Log.Error("Couldn't parse your ignore paths settings: %s" % paths) + Log.Error("Couldn't parse your include/exclude paths settings: %s" % paths) return [] - def is_physically_ignored(self, folder): + def is_physically_wanted(self, folder, ref_fn=None): # check whether we've got an ignore file inside the path - for ifn in IGNORE_FN: + ret_val = self.include + ref_list = INCLUDE_FN if self.include else EXCLUDE_FN + for ifn in ref_list: if os.path.isfile(os.path.join(folder, ifn)): - Log.Info(u'Ignoring "%s" because "%s" exists', folder, ifn) - return True + if ref_fn: + Log.Info(u'%s "%s" because "%s" exists in "%s"', "Including" if self.include else "Ignoring", + ref_fn, ifn, folder) + else: + Log.Info(u'%s "%s" because "%s" exists', "Including" if self.include else "Ignoring", folder, ifn) + + return ret_val - return False + return not ret_val - def is_path_ignored(self, fn): - for path in self.ignore_paths: + def is_path_wanted(self, fn): + ret_val = self.include + for path in self.include_exclude_paths: if fn.startswith(path): - return True - return False + return ret_val + return not ret_val def check_notify_executable(self): fn = Prefs["notify_executable"] if not fn: return - splitted_fn = fn.split() - exe_fn = splitted_fn[0] - arguments = [arg.strip() for arg in splitted_fn[1:]] + got_args = "%(" in fn + if got_args: + first_arg_pos = fn.index("%(") + exe_fn = fn[:first_arg_pos].strip() + arguments = [arg.strip() for arg in fn[first_arg_pos:].split()] + else: + exe_fn = fn + arguments = [] if os.path.isfile(exe_fn) and os.access(exe_fn, os.X_OK): return exe_fn, arguments + + # try finding the executable itself, the path might contain spaces and there might have been other arguments + fn_split = exe_fn.split(u" ") + tmp_exe_fn = fn_split[0] + + for offset in range(1, len(fn_split)+1): + if os.path.isfile(tmp_exe_fn) and os.access(tmp_exe_fn, os.X_OK): + exe_fn = tmp_exe_fn.strip() + arguments = [arg.strip() for arg in fn_split[offset:]] + arguments + return exe_fn, arguments + + tmp_exe_fn = u" ".join(fn_split[:offset+1]) + Log.Error("Notify executable not existing or not executable: %s" % exe_fn) def refresh_enabled_sections(self): @@ -508,17 +675,34 @@ def check_enabled_sections(self): enabled_for_primary_agents = {"movie": [], "show": []} enabled_sections = {} + legacy_agents = { + "com.plexapp.agents.thetvdb": [SHOW], + "com.plexapp.agents.thetvdbdvdorder": [SHOW], + "com.plexapp.agents.hama": [SHOW, MOVIE], + "com.plexapp.agents.themoviedb": [SHOW, MOVIE], + "com.plexapp.agents.imdb": [SHOW, MOVIE], + } + # find which agents we're enabled for for agent in Plex.agents(): - if not agent.primary: + #if not agent.primary: + # continue + if agent.identifier not in legacy_agents: continue - for t in list(agent.media_types): - if t.media_type in (MOVIE, SHOW): - related_agents = Plex.primary_agent(agent.identifier, t.media_type) + #media_types = [t.media_type for t in list(agent.media_types)] + media_types = legacy_agents[agent.identifier] + [] + + # the new movie agent doesn't populate its media types, workaround + if not media_types and agent.identifier == "tv.plex.agents.movie": + media_types = [MOVIE] + + for media_type in media_types: + if media_type in (MOVIE, SHOW): + related_agents = Plex.primary_agent(agent.identifier, media_type) for a in related_agents: if a.identifier == PLUGIN_IDENTIFIER and a.enabled: - enabled_for_primary_agents[MEDIA_TYPE_TO_STRING[t.media_type]].append(agent.identifier) + enabled_for_primary_agents[MEDIA_TYPE_TO_STRING[media_type]].append(agent.identifier) # find the libraries that use them for library in self.sections: @@ -528,8 +712,24 @@ def check_enabled_sections(self): Log.Debug(u"I'm enabled for: %s" % [lib.title for key, lib in enabled_sections.iteritems()]) return enabled_sections + def lang_str_to_list(self, s, l): + if len(s) and s != "None": + for lang in s.split(u","): + lang = lang.strip() + if lang == "NULL": + l.append(lang) + continue + try: + real_lang = Language.fromietf(lang) + except: + try: + real_lang = Language.fromname(lang) + except: + continue + l.append(real_lang) + # Prepare a list of languages we want subs for - def get_lang_list(self, provider=None): + def get_lang_list(self, provider=None, ordered=False): # advanced settings if provider and self.advanced.providers and provider in self.advanced.providers: adv_languages = self.advanced.providers[provider].get("languages", None) @@ -550,46 +750,73 @@ def get_lang_list(self, provider=None): if adv_out: return adv_out - l = {Language.fromietf(Prefs["langPref1a"])} + l = [Language.fromietf(Prefs["langPref1a"])] lang_custom = Prefs["langPrefCustom"].strip() if Prefs['subtitles.only_one']: - return l + return set(l) if not ordered else l if Prefs["langPref2a"] != "None": try: - l.update({Language.fromietf(Prefs["langPref2a"])}) + l.append(Language.fromietf(Prefs["langPref2a"])) except: pass if Prefs["langPref3a"] != "None": try: - l.update({Language.fromietf(Prefs["langPref3a"])}) + l.append(Language.fromietf(Prefs["langPref3a"])) except: pass - if len(lang_custom) and lang_custom != "None": - for lang in lang_custom.split(u","): - lang = lang.strip() - try: - real_lang = Language.fromietf(lang) - except: - try: - real_lang = Language.fromname(lang) - except: - continue - l.update({real_lang}) + self.lang_str_to_list(lang_custom, l) + if "NULL" in l: + l.remove("NULL") - return l + if self.forced_also: + if Prefs["subtitles.when_forced"] == "Always": + for lang in list(l): + l.append(Language.rebuild(lang, forced=True)) + + else: + for (setting, index) in (("Only for Subtitle Language (1)", 0), + ("Only for Subtitle Language (2)", 1), + ("Only for Subtitle Language (3)", 2)): + if Prefs["subtitles.when_forced"] == setting: + try: + l.append(Language.rebuild(list(l)[index], forced=True)) + break + except: + pass + + elif self.forced_only: + for lang in l: + lang.forced = True + + if not self.normal_subs: + for lang in l[:]: + if not lang.forced: + l.remove(lang) + + return set(l) if not ordered else l lang_list = property(get_lang_list) + def ignore_subs_for_audio(self): + c = Prefs['subtitles.ignore_for_audio'].strip() + l = [] + + self.lang_str_to_list(c, l) + if "NULL" in l: + l.remove("NULL") + self.ignore_subs_for_empty_audio = True + return l + def get_subtitle_destination_folder(self): if not Prefs["subtitles.save.filesystem"]: return - fld_custom = Prefs["subtitles.save.subFolder.Custom"].strip() if cast_bool( - Prefs["subtitles.save.subFolder.Custom"]) else None + fld_custom = Prefs["subtitles.save.subFolder.Custom"].strip() if \ + Prefs["subtitles.save.subFolder.Custom"] else None return fld_custom or ( Prefs["subtitles.save.subFolder"] if Prefs["subtitles.save.subFolder"] != "current folder" else None) @@ -602,22 +829,35 @@ def get_subtitle_formats(self): out.append("vtt") return out - def get_providers(self, media_type="series"): - providers = {'opensubtitles': cast_bool(Prefs['provider.opensubtitles.enabled']), + @property + def providers_by_prefs(self): + return {'opensubtitlescom': cast_bool(Prefs['provider.opensubtitles.enabled']), # 'thesubdb': Prefs['provider.thesubdb.enabled'], 'podnapisi': cast_bool(Prefs['provider.podnapisi.enabled']), + 'napisy24': cast_bool(Prefs['provider.napisy24.enabled']), 'titlovi': cast_bool(Prefs['provider.titlovi.enabled']), - 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']), + 'addic7ed': cast_bool(Prefs['provider.addic7ed.enabled']) and self.has_anticaptcha, 'tvsubtitles': cast_bool(Prefs['provider.tvsubtitles.enabled']), 'legendastv': cast_bool(Prefs['provider.legendastv.enabled']), 'napiprojekt': cast_bool(Prefs['provider.napiprojekt.enabled']), 'hosszupuska': cast_bool(Prefs['provider.hosszupuska.enabled']), + 'supersubtitles': cast_bool(Prefs['provider.supersubtitles.enabled']), 'shooter': False, 'subscene': cast_bool(Prefs['provider.subscene.enabled']), 'argenteam': cast_bool(Prefs['provider.argenteam.enabled']), 'subscenter': False, - } + 'assrt': cast_bool(Prefs['provider.assrt.enabled']), + 'bsplayer': cast_bool(Prefs['provider.bsplayer.enabled']), + 'ktuvit': cast_bool(Prefs['provider.ktuvit.enabled']), + 'wizdom': cast_bool(Prefs['provider.wizdom.enabled']), + } + + @property + def providers_enabled(self): + return filter(lambda prov: self.providers_by_prefs[prov], self.providers_by_prefs) + def get_providers(self, media_type="series"): + providers = self.providers_by_prefs providers_by_prefs = copy.deepcopy(providers) # disable subscene for movies by default @@ -625,6 +865,7 @@ def get_providers(self, media_type="series"): providers["subscene"] = False # ditch non-forced-subtitles-reporting providers + providers_forced_off = {} if self.forced_only: providers["addic7ed"] = False providers["tvsubtitles"] = False @@ -632,8 +873,16 @@ def get_providers(self, media_type="series"): providers["napiprojekt"] = False providers["shooter"] = False providers["hosszupuska"] = False + providers["supersubtitles"] = False providers["titlovi"] = False providers["argenteam"] = False + providers["assrt"] = False + providers["subscene"] = False + providers["napisy24"] = False + providers["bsplayer"] = False + providers["ktuvit"] = False + providers["wizdom"] = False + providers_forced_off = dict(providers) if not self.unrar and providers["legendastv"]: providers["legendastv"] = False @@ -642,7 +891,7 @@ def get_providers(self, media_type="series"): # advanced settings if media_type and self.advanced.providers: for provider, data in self.advanced.providers.iteritems(): - if provider not in providers or not providers_by_prefs[provider]: + if provider not in providers or not providers_by_prefs[provider] or provider in providers_forced_off: continue if data["enabled_for"] is not None: @@ -673,26 +922,51 @@ def get_providers(self, media_type="series"): providers = property(get_providers) def get_provider_settings(self): - os_use_https = self.advanced.providers.opensubtitles.use_https \ - if self.advanced.providers.opensubtitles.use_https != None else True + os_use_https = self.advanced.providers.opensubtitles.get("use_https", True) + os_skip_wrong_fps = self.advanced.providers.opensubtitles.get("skip_wrong_fps", True) + provider_settings = {'addic7ed': {'username': Prefs['provider.addic7ed.username'], 'password': Prefs['provider.addic7ed.password'], - 'use_random_agents': cast_bool(Prefs['provider.addic7ed.use_random_agents1']), + 'is_vip': cast_bool(Prefs['provider.addic7ed.is_vip']), }, - 'opensubtitles': {'username': Prefs['provider.opensubtitles.username'], + 'opensubtitlescom': {'username': Prefs['provider.opensubtitles.username'], 'password': Prefs['provider.opensubtitles.password'], - 'use_tag_search': self.exact_filenames, - 'only_foreign': self.forced_only, - 'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), - 'use_ssl': os_use_https, - 'timeout': self.advanced.providers.opensubtitles.timeout or 15 + #'use_tag_search': self.exact_filenames, + #'only_foreign': self.forced_only, + #'also_foreign': self.forced_also, + #'is_vip': cast_bool(Prefs['provider.opensubtitles.is_vip']), + #'use_ssl': os_use_https, + #'timeout': self.advanced.providers.opensubtitles.timeout or 15, + #'skip_wrong_fps': os_skip_wrong_fps, + 'use_hash': cast_bool(Prefs['provider.opensubtitles.use_hash']), + 'include_ai_translated': True, + 'api_key': Prefs['provider.opensubtitles.api_key'], }, 'podnapisi': { 'only_foreign': self.forced_only, + 'also_foreign': self.forced_also, + }, + 'titlovi': { + 'username': Prefs['provider.titlovi.username'], + 'password': Prefs['provider.titlovi.password'], + }, + 'napisy24': { + 'username': Prefs['provider.napisy24.username'], + 'password': Prefs['provider.napisy24.password'], + }, + 'subscene': { + 'only_foreign': self.forced_only, + 'username': Prefs['provider.subscene.username'], + 'password': Prefs['provider.subscene.password'], }, 'legendastv': {'username': Prefs['provider.legendastv.username'], 'password': Prefs['provider.legendastv.password'], - } + }, + 'assrt': {'token': Prefs['provider.assrt.token'], }, + 'ktuvit': { + 'username': Prefs['provider.ktuvit.username'], + 'password': Prefs['provider.ktuvit.password'], + }, } return provider_settings @@ -716,10 +990,10 @@ def provider_throttle(self, name, exception): throttle_data = PROVIDER_THROTTLE_MAP.get(name, PROVIDER_THROTTLE_MAP["default"]).get(cls, None) or \ PROVIDER_THROTTLE_MAP["default"].get(cls, None) - if not throttle_data: - return - - throttle_delta, throttle_description = throttle_data + if throttle_data: + throttle_delta, throttle_description = throttle_data + else: + throttle_delta, throttle_description = datetime.timedelta(minutes=10), "10 minutes" if "provider_throttle" not in Dict: Dict["provider_throttle"] = {} @@ -727,8 +1001,8 @@ def provider_throttle(self, name, exception): throttle_until = datetime.datetime.now() + throttle_delta Dict["provider_throttle"][name] = (cls_name, throttle_until, throttle_description) - Log.Info("Throttling %s for %s, until %s, because of: %s", name, throttle_description, - throttle_until.strftime("%y/%m/%d %H:%M"), cls_name) + Log.Info("Throttling %s for %s, until %s, because of: %s. Exception info: %r", name, throttle_description, + throttle_until.strftime("%y/%m/%d %H:%M"), cls_name, exception.message) Dict.Save() @property @@ -788,6 +1062,8 @@ def get_default_mods(self): mods.append("OCR_fixes") if self.fix_common: mods.append("common") + if self.fix_upper: + mods.append("fix_uppercase") if self.colors: mods.append("color(name=%s)" % self.colors) if self.reverse_rtl: @@ -818,27 +1094,37 @@ def set_activity_modes(self): self.activity_mode = "next_episode" def get_plex_transcoder(self): + paths = [] base_path = os.environ.get("PLEX_MEDIA_SERVER_HOME", None) - if not base_path: - # fall back to bundled plugins path - bundle_path = os.environ.get("PLEXBUNDLEDPLUGINSPATH", None) - if bundle_path: - base_path = os.path.normpath(os.path.join(bundle_path, "..", "..")) + if base_path: + paths.append(base_path) + bundle_path = os.environ.get("PLEXBUNDLEDPLUGINSPATH", None) + if bundle_path: + paths.append(os.path.normpath(os.path.join(bundle_path, "..", ".."))) + + paths.append(self.app_support_path) + + bns = [] if sys.platform == "darwin": - fn = os.path.join(base_path, "MacOS", "Plex Transcoder") + bns.append(("MacOS", "Plex Transcoder")) elif mswindows: - fn = os.path.join(base_path, "plextranscoder.exe") + bns = [("plextranscoder.exe",), ("plex transcoder.exe",)] else: - fn = os.path.join(base_path, "Plex Transcoder") + bns.append(("Plex Transcoder",)) + + for path in paths: + for bn in bns: + fn = os.path.join(path, *bn) - if os.path.isfile(fn): - return fn + if os.path.isfile(fn): + return fn - # look inside Resources folder as fallback, as well - fn = os.path.join(base_path, "Resources", "Plex Transcoder") - if os.path.isfile(fn): - return fn + # look inside Resources folder as fallback, as well + for vbn in ("Plex Transcoder", "plextranscoder.exe", "plex transcoder.exe"): + fn = os.path.join(path, "Resources", vbn) + if os.path.isfile(fn): + return fn def parse_rename_mode(self): # fixme: exact_filenames should be determined via callback combined with info about the current video @@ -891,6 +1177,16 @@ def parse_rename_mode(self): def text_based_formats(self): return self.advanced.text_subtitle_formats or TEXT_SUBTITLE_EXTS + def parse_custom_dns(self): + custom_dns = Prefs['use_custom_dns2'].strip() + os.environ["dns_resolvers"] = "" + + if custom_dns and custom_dns != "system": + ips = filter(lambda x: x, [d.strip() for d in custom_dns.split(",")]) + if ips: + os.environ["dns_resolvers"] = json.dumps(ips) + return os.environ["dns_resolvers"] + def init_subliminal_patches(self): # configure custom subtitle destination folders for scanning pre-existing subs Log.Debug("Patching subliminal ...") diff --git a/Contents/Code/support/download.py b/Contents/Code/support/download.py index 740054102..ea68f705e 100644 --- a/Contents/Code/support/download.py +++ b/Contents/Code/support/download.py @@ -6,8 +6,7 @@ import subliminal_patch as subliminal from support.config import config -from support.helpers import cast_bool -from subtitlehelpers import get_subtitles_from_metadata +from support.helpers import audio_streams_match_languages from subliminal_patch import compute_score from support.plex_media import get_blacklist_from_part_map from subzero.video import refine_video @@ -15,32 +14,63 @@ def get_missing_languages(video, part): - languages = set([Language.fromietf(str(l)) for l in config.lang_list]) + languages_list = config.get_lang_list(ordered=True) + languages = set(languages_list) + ignore_langs = set(config.ignore_for_audio) + valid_langs_in_media = set() + + if Prefs["subtitles.when"] != "Always": + valid_langs_in_media = audio_streams_match_languages(video, languages_list) + languages = languages.difference(valid_langs_in_media) + if languages: + Log.Debug("Languages missing after taking the audio streams into account: %s" % languages) + + if valid_langs_in_media and not languages: + Log.Debug("Skipping subtitle search for %s, audio streams are in correct language(s)", + video) + return set() + + if config.ignore_subs_for_empty_audio and not video.audio_languages: + Log.Debug("Skipping subtitle search for %s, ignoring as no audio stream exists", video) + return set() + + inter = ignore_langs.intersection(video.audio_languages) + if ignore_langs and inter: + Log.Debug("Skipping subtitle search for %s, ignoring due to existing audio streams: %s", video, inter) + return set() # should we treat IETF as alpha3? (ditch the country part) alpha3_map = {} if config.ietf_as_alpha3: for language in languages: - if language.country: + if language and language.country: alpha3_map[language.alpha3] = language.country language.country = None - if not Prefs['subtitles.save.filesystem']: - # scan for existing metadata subtitles - meta_subs = get_subtitles_from_metadata(part) - for language, subList in meta_subs.iteritems(): - if subList: - video.subtitle_languages.add(language) - Log.Debug("Found metadata subtitle %s for %s", language, video) - have_languages = video.subtitle_languages.copy() if config.ietf_as_alpha3: for language in have_languages: - if language.country: + if language and language.country: alpha3_map[language.alpha3] = language.country language.country = None - missing_languages = (set(str(l) for l in languages) - set(str(l) for l in have_languages)) + missing_languages = (languages - have_languages) + + if config.any_language_is_enough != "Always search for all configured languages": + not_in_forced = "foreign" in config.any_language_is_enough + if "External or embedded subtitle" in config.any_language_is_enough: + langs = video.subtitle_languages if not not_in_forced else \ + filter(lambda l: not l.forced, video.subtitle_languages) + if langs: + Log.Debug("We have at least one subtitle for any configured language.") + return set() + + elif "External subtitle" in config.any_language_is_enough: + langs = video.external_subtitle_languages if not not_in_forced else \ + filter(lambda l: not l.forced, video.external_subtitle_languages) + if langs: + Log.Debug("We have at least one external subtitle for any configured language.") + return set() # all languages are found if we either really have subs for all languages or we only want to have exactly one language # and we've only found one (the case for a selected language, Prefs['subtitles.only_one'] (one found sub matches any language)) @@ -50,7 +80,7 @@ def get_missing_languages(video, part): Log.Debug('Only one language was requested, and we\'ve got a subtitle for %s', video) else: Log.Debug('All languages %r exist for %s', languages, video) - return False + return set() # re-add country codes to the missing languages, in case we've removed them above if config.ietf_as_alpha3: @@ -85,30 +115,32 @@ def language_hook(provider): def download_best_subtitles(video_part_map, min_score=0, throttle_time=None, providers=None): hearing_impaired = Prefs['subtitles.search.hearingImpaired'] - languages = set([Language.fromietf(str(l)) for l in config.lang_list]) + languages = set([Language.rebuild(l) for l in config.lang_list]) if not languages: return use_videos = [] + missing_languages = set() for video, part in video_part_map.iteritems(): if not video.ignore_all: - missing_languages = get_missing_languages(video, part) + p_missing_languages = get_missing_languages(video, part) else: - missing_languages = languages + p_missing_languages = languages - if missing_languages: - Log.Info(u"%s has missing languages: %s", os.path.basename(video.name), missing_languages) + if p_missing_languages: + Log.Info(u"%s has missing languages: %s", os.path.basename(video.name), p_missing_languages) refine_video(video, refiner_settings=config.refiner_settings) use_videos.append(video) + missing_languages.update(p_missing_languages) # prepare blacklist blacklist = get_blacklist_from_part_map(video_part_map, languages) - if use_videos: + if use_videos and missing_languages: Log.Debug("Download best subtitles using settings: min_score: %s, hearing_impaired: %s, languages: %s" % - (min_score, hearing_impaired, languages)) + (min_score, hearing_impaired, missing_languages)) - return subliminal.download_best_subtitles(set(use_videos), languages, min_score, hearing_impaired, + return subliminal.download_best_subtitles(set(use_videos), missing_languages, min_score, hearing_impaired, providers=providers or config.providers, provider_configs=config.provider_settings, pool_class=config.provider_pool, diff --git a/Contents/Code/support/extract.py b/Contents/Code/support/extract.py new file mode 100644 index 000000000..7e64b8643 --- /dev/null +++ b/Contents/Code/support/extract.py @@ -0,0 +1,214 @@ +# coding=utf-8 +import os +import subprocess +import traceback + +from support.helpers import quote_args, mswindows, get_title_for_video_metadata, cast_bool, \ + audio_streams_match_languages +from support.i18n import _ +from support.items import get_item_kind_from_item, refresh_item, get_all_items, get_item, MI_KEY +from support.storage import get_subtitle_storage, save_subtitles +from support.config import config +from support.history import get_history +from support.plex_media import get_all_parts, get_embedded_subtitle_streams, get_part, get_plex_metadata, \ + update_stream_info, is_stream_forced +from support.scanning import scan_videos +from subzero.language import Language +from subliminal_patch.subtitle import ModifiedSubtitle + + +def agent_extract_embedded(video_part_map, set_as_existing=False): + try: + subtitle_storage = get_subtitle_storage() + + to_extract = [] + item_count = 0 + + threads = [] + + for scanned_video, part_info in video_part_map.iteritems(): + plexapi_item = scanned_video.plexapi_metadata["item"] + stored_subs = subtitle_storage.load_or_new(plexapi_item) + valid_langs_in_media = \ + audio_streams_match_languages(scanned_video, config.get_lang_list(ordered=True)) + + if not config.lang_list.difference(valid_langs_in_media): + Log.Debug("Skipping embedded subtitle extraction for %s, audio streams are in correct language(s)", + plexapi_item.rating_key) + continue + + for plexapi_part in get_all_parts(plexapi_item): + item_count = item_count + 1 + used_one_unknown_stream = False + used_one_known_stream = False + for requested_language in config.lang_list: + skip_unknown = used_one_unknown_stream or used_one_known_stream + embedded_subs = stored_subs.get_by_provider(plexapi_part.id, requested_language, "embedded") + current = stored_subs.get_any(plexapi_part.id, requested_language) or \ + requested_language in scanned_video.external_subtitle_languages + + if not embedded_subs: + stream_data = get_embedded_subtitle_streams(plexapi_part, requested_language=requested_language, + skip_unknown=skip_unknown) + + if stream_data and stream_data[0]["language"]: + stream = stream_data[0]["stream"] + if stream_data[0]["is_unknown"]: + used_one_unknown_stream = True + else: + used_one_known_stream = True + + to_extract.append(({scanned_video: part_info}, plexapi_part, str(stream.index), + str(requested_language), not current)) + + if not cast_bool(Prefs["subtitles.search_after_autoextract"]) or set_as_existing: + scanned_video.subtitle_languages.update({requested_language}) + else: + Log.Debug("Skipping embedded subtitle extraction for %s, already got %r from %s", + plexapi_item.rating_key, requested_language, embedded_subs[0].id) + if to_extract: + Log.Info("Triggering extraction of %d embedded subtitles of %d items", len(to_extract), item_count) + threads.append(Thread.Create(multi_extract_embedded, stream_list=to_extract, refresh=True, with_mods=True, + single_thread=not config.advanced.auto_extract_multithread)) + return threads + except: + Log.Error("Something went wrong when auto-extracting subtitles, continuing: %s", traceback.format_exc()) + + +def multi_extract_embedded(stream_list, refresh=False, with_mods=False, single_thread=True, extract_mode="a", + history_storage=None): + def execute(): + for video_part_map, plexapi_part, stream_index, language, set_current in stream_list: + plexapi_item = video_part_map.keys()[0].plexapi_metadata["item"] + + extract_embedded_sub(rating_key=plexapi_item.rating_key, part_id=plexapi_part.id, + plex_item=plexapi_item, part=plexapi_part, scanned_videos=video_part_map, + stream_index=stream_index, set_current=set_current, + language=language, with_mods=with_mods, refresh=refresh, extract_mode=extract_mode, + history_storage=history_storage) + + if single_thread: + with Thread.Lock(key="extract_embedded"): + execute() + else: + execute() + + +def season_extract_embedded(rating_key, requested_language, with_mods=False, force=False, mode="season"): + # get stored subtitle info for item id + subtitle_storage = get_subtitle_storage() + + try: + rating_keys = [rating_key] + if mode == "series": + seasons = get_all_items(key="children", value=rating_key, base="library/metadata") + rating_keys = [season[MI_KEY] for season in seasons] + + for rating_key in rating_keys: + for data in get_all_items(key="children", value=rating_key, base="library/metadata"): + item = get_item(data[MI_KEY]) + if item: + stored_subs = subtitle_storage.load_or_new(item) + for part in get_all_parts(item): + embedded_subs = stored_subs.get_by_provider(part.id, requested_language, "embedded") + current = stored_subs.get_any(part.id, requested_language) + if not embedded_subs or force: + stream_data = get_embedded_subtitle_streams(part, requested_language=requested_language) + if stream_data: + stream = stream_data[0]["stream"] + + set_current = not current or force + refresh = not current + + extract_embedded_sub(rating_key=item.rating_key, part_id=part.id, + stream_index=str(stream.index), set_current=set_current, + refresh=refresh, language=requested_language, with_mods=with_mods, + extract_mode="m") + finally: + subtitle_storage.destroy() + + +def extract_embedded_sub(**kwargs): + rating_key = kwargs["rating_key"] + part_id = kwargs.pop("part_id") + stream_index = kwargs.pop("stream_index") + with_mods = kwargs.pop("with_mods", False) + language = Language.fromietf(kwargs.pop("language")) + refresh = kwargs.pop("refresh", True) + set_current = kwargs.pop("set_current", True) + + plex_item = kwargs.pop("plex_item", get_item(rating_key)) + item_type = get_item_kind_from_item(plex_item) + part = kwargs.pop("part", get_part(plex_item, part_id)) + scanned_videos = kwargs.pop("scanned_videos", None) + extract_mode = kwargs.pop("extract_mode", "a") + + any_successful = False + + from interface.menu_helpers import set_refresh_menu_state + + if part: + if not scanned_videos: + metadata = get_plex_metadata(rating_key, part_id, item_type, plex_item=plex_item) + scanned_videos = scan_videos([metadata], ignore_all=True, skip_hashing=True) + + update_stream_info(part) + for stream in part.streams: + # subtitle stream + if str(stream.index) == stream_index: + is_forced = is_stream_forced(stream) + bn = os.path.basename(part.file) + + set_refresh_menu_state(_(u"Extracting subtitle %(stream_index)s of %(filename)s", + stream_index=stream_index, + filename=bn)) + Log.Info(u"Extracting stream %s (%s) of %s", stream_index, str(language), bn) + + out_codec = stream.codec if stream.codec != "mov_text" else "srt" + + args = [ + config.plex_transcoder, "-i", part.file, "-map", "0:%s" % stream_index, "-f", out_codec, "-" + ] + + cmdline = quote_args(args) + Log.Debug(u"Calling: %s", cmdline) + if mswindows: + Log.Debug("MSWindows: Fixing encoding") + cmdline = cmdline.encode("mbcs") + + output = None + try: + output = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) + except: + Log.Error("Extraction failed: %s", traceback.format_exc()) + + if output: + subtitle = ModifiedSubtitle(language, mods=config.default_mods if with_mods else None) + subtitle.content = output + subtitle.provider_name = "embedded" + subtitle.id = "stream_%s" % stream_index + subtitle.score = 0 + subtitle.set_encoding("utf-8") + + # fixme: speedup video; only video.name is needed + video = scanned_videos.keys()[0] + save_successful = save_subtitles(scanned_videos, {video: [subtitle]}, mode="m", + set_current=set_current) + set_refresh_menu_state(None) + + if save_successful and refresh: + refresh_item(rating_key) + + # add item to history + item_title = get_title_for_video_metadata(video.plexapi_metadata, + add_section_title=False, add_episode_title=True) + + history = get_history() + history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["super_thumb"], + subtitle=subtitle, mode=extract_mode) + history.destroy() + + any_successful = True + + return any_successful \ No newline at end of file diff --git a/Contents/Code/support/helpers.py b/Contents/Code/support/helpers.py index 9e16237ab..64a6d8fe8 100755 --- a/Contents/Code/support/helpers.py +++ b/Contents/Code/support/helpers.py @@ -12,10 +12,12 @@ import sys from collections import OrderedDict +from babelfish.exceptions import LanguageError + import chardet from bs4 import UnicodeDammit -from subzero.language import Language +from subzero.language import Language, language_from_stream from subzero.analytics import track_event mswindows = (sys.platform == "win32") @@ -152,6 +154,13 @@ def get_plex_item_display_title(item, kind, parent=None, parent_title=None, sect add_section_title=add_section_title) +def series_num(v): + try: + return int(v) + except (TypeError, ValueError): + pass + + def get_video_display_title(kind, title, section_title=None, parent_title=None, season=None, episode=None, add_section_title=False): section_add = "" @@ -159,9 +168,12 @@ def get_video_display_title(kind, title, section_title=None, parent_title=None, section_add = ("%s: " % section_title) if section_title else "" if kind in ("season", "show") and parent_title: - if season and episode: + if series_num(season) is not None and series_num(episode) is not None: return '%s%s S%02dE%02d%s' % (section_add, parent_title, season or 0, episode or 0, (", %s" % title if title else "")) + elif series_num(season) is not None: + return '%s%s S%02d%s' % (section_add, parent_title, season or 0, + (", %s" % title if title else "")) return '%s%s%s' % (section_add, parent_title, (", %s" % title if title else "")) return "%s%s" % (section_add, title) @@ -264,6 +276,8 @@ def get_item_hints(data): "title": data["original_title"] or data["series"], } ) + if hints["title"]: + hints["title"] = hints["title"].replace(":", "") return hints @@ -272,6 +286,7 @@ def notify_executable(exe_info, videos, subtitles, storage): "subtitle_language", "subtitle_path", "subtitle_filename", "provider", "score", "storage", "series_id", "series", "title", "section", "filename", "path", "folder", "season_id", "type", "id", "season" ) + to_clean = ("PYTHONPATH", "PYTHONHOME") exe, arguments = exe_info for video, video_subtitles in subtitles.items(): for subtitle in video_subtitles: @@ -292,7 +307,6 @@ def notify_executable(exe_info, videos, subtitles, storage): prepared_arguments = [arg % prepared_data for arg in arguments] Log.Debug(u"Calling %s with arguments: %s" % (exe, prepared_arguments)) - env = dict(os.environ) if not mswindows: env_path = {"PATH": os.pathsep.join( [ @@ -303,16 +317,31 @@ def notify_executable(exe_info, videos, subtitles, storage): ) } env = dict(os.environ, **env_path) + env.pop("LD_LIBRARY_PATH", None) + else: + env = dict(os.environ) - env.pop("LD_LIBRARY_PATH", None) + # clean out any Plex-PYTHONPATH that may bleed through the spawned process + for v in to_clean: + if v in env and "plex" in env[v].lower(): + del env[v] try: - output = subprocess.check_output(quote_args([exe] + prepared_arguments), - stderr=subprocess.STDOUT, shell=True, env=env) - except subprocess.CalledProcessError: - Log.Error(u"Calling %s failed: %s" % (exe, traceback.format_exc())) + proc = subprocess.Popen(quote_args([exe] + prepared_arguments), stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True, env=env, cwd=os.path.dirname(exe)) + output, errors = proc.communicate() + + if proc.returncode == 1: + Log.Error(u"Calling %s with args %s failed: output:\n%s, error:\n%s", exe, prepared_arguments, + output, errors) + return + + output = output.decode() + + except: + Log.Error(u"Calling %s failed: %s", exe, traceback.format_exc()) else: - Log.Debug(u"Process output: %s" % output) + Log.Debug(u"Process output: %s", output) def track_usage(category=None, action=None, label=None, value=None): @@ -363,30 +392,55 @@ def get_language_from_stream(lang_code): if lang and lang != "xx": # Log.Debug("Found language: %r", lang) return Language.fromietf(lang) + elif lang: + try: + return language_from_stream(lang_code) + except LanguageError: + pass -def get_language(lang_short): - return Language.fromietf(lang_short) +def audio_streams_match_languages(video, languages): + without_forced = filter(lambda x: not x.forced, languages) + if video.audio_languages and without_forced: + if Prefs["subtitles.when"] == "Always": + return set() + elif Prefs["subtitles.when"] == "When main audio stream is not Subtitle Language (1)": + if video.audio_languages[0] == without_forced[0]: + return set(without_forced) -def display_language(l): - addons = [] - if l.country: - addons.append(l.country.alpha2) - if l.script: - addons.append(l.script.code) + elif Prefs["subtitles.when"] == "When any audio stream is not Subtitle Language (1)": + if without_forced[0] in video.audio_languages: + return set(without_forced) + + elif Prefs["subtitles.when"] == "When main audio stream is not any configured language": + if video.audio_languages[0] in without_forced: + return set(without_forced) + + elif Prefs["subtitles.when"] == "When any audio stream is not any configured language": + matching = set(video.audio_languages).intersection(set(without_forced)) + if matching: + return set(without_forced) - return l.name if not addons else "%s (%s)" % (l.name, ", ".join(addons)) + # if Prefs["subtitles.when_forced"] in [ + # "Always", + # "Only for Subtitle Language (1)", + # "Only for Subtitle Language (2)", + # "Only for Subtitle Language (3)" + # ]: + return set() -def is_stream_forced(stream): - stream_title = getattr(stream, "title", "") or "" - forced = getattr(stream, "forced", False) - if not forced and stream_title and "forced" in stream_title.strip().lower(): - forced = True - return forced +def get_language(lang_short): + return Language.fromietf(lang_short) + + +def display_language(l): + if not l: + return "Unknown" + return _(str(l.basename).lower()) + ((u" (%s)" % _("forced")) if l.forced else "") class PartUnknownException(Exception): - pass \ No newline at end of file + pass diff --git a/Contents/Code/support/i18n.py b/Contents/Code/support/i18n.py new file mode 100644 index 000000000..f904d62f7 --- /dev/null +++ b/Contents/Code/support/i18n.py @@ -0,0 +1,109 @@ +# coding=utf-8 + +import inspect + +from support.config import config + + +core = getattr(Data, "_core") + + +# get original localization module in order to access its base classes later on +def get_localization_module(): + cls = getattr(core.localization, "__class__") + return inspect.getmodule(cls) + + +plex_i18n_module = get_localization_module() + + +def old_style_placeholders_count(s): + # fixme: incomplete, use regex + return sum(s.count(c) for c in ["%s", "%d", "%r", "%f", "%i"]) + + +def check_old_style_placeholders(k, args): + # replace escaped %'s? + k = k.__str__().replace("%%", "") + + if "%(" in k: + Log.Error(u"%r defines named placeholders for formatting" % k) + return "NEEDS NAMED ARGUMENTS" + + placeholders_found = old_style_placeholders_count(k) + if placeholders_found and not args: + Log.Error(u"%r requires a arguments for formatting" % k) + return "NEEDS FORMAT ARGUMENTS" + + elif not placeholders_found and args: + Log.Error(u"%r doesn't define placeholders for formatting" % k) + return "HAS NO FORMAT ARGUMENTS" + + elif placeholders_found and placeholders_found != len(args): + Log.Error(u"%r wrong amount of arguments supplied for formatting" % k) + return "WRONG FORMAT ARGUMENT COUNT" + + +class SmartLocalStringFormatter(plex_i18n_module.LocalStringFormatter): + """ + this allows the use of dictionaries for string formatting, also does some sanity checking on the keys and values + """ + def __init__(self, string1, string2, locale=None): + if isinstance(string2, tuple): + # dictionary passed + if len(string2) == 1 and hasattr(string2[0], "iteritems"): + string2 = string2[0] + if config.debug_i18n: + if "%(" not in string1.__str__().replace("%%", ""): + Log.Error(u"%r: dictionary for non-named format string supplied" % string1.__str__()) + string1 = "%s" + string2 = "NO NAMED ARGUMENTS" + + # arguments + elif len(string2) >= 1 and config.debug_i18n: + msg = check_old_style_placeholders(string1, string2) + if msg: + string1 = "%s" + string2 = msg + + setattr(self, "_string1", string1) + setattr(self, "_string2", string2) + setattr(self, "_locale", locale) + + +def local_string_with_optional_format(key, *args, **kwargs): + if kwargs: + args = (kwargs,) + else: + args = tuple(args) + + if args: + # fixme: may not be the best idea as this evaluates the string early + try: + return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale), args)) + except (TypeError, ValueError): + Log.Exception("Broken translation!") + Log.Debug("EN string: %s", plex_i18n_module.LocalString(core, key, "en")) + Log.Debug("%s string: %r", Locale.CurrentLocale, + unicode(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale))) + return unicode(SmartLocalStringFormatter(plex_i18n_module.LocalString(core, key, "en"), args)) + + # check string instances for arguments + if config.debug_i18n: + msg = check_old_style_placeholders(key, args) + if msg: + return msg + + try: + return unicode(plex_i18n_module.LocalString(core, key, Locale.CurrentLocale)) + + except TypeError: + Log.Exception("Broken translation!") + return unicode(plex_i18n_module.LocalString(core, key, "en")) + + +_ = local_string_with_optional_format + + +def is_localized_string(s): + return hasattr(s, "localize") diff --git a/Contents/Code/support/ignore.py b/Contents/Code/support/ignore.py index dff1748de..6ddd94201 100644 --- a/Contents/Code/support/ignore.py +++ b/Contents/Code/support/ignore.py @@ -1,9 +1,10 @@ # coding=utf-8 from subzero.lib.dict import DictProxy +from config import config -class IgnoreDict(DictProxy): +class ExcludeDict(DictProxy): store = "ignore" # single item keys returned by helpers.items.getItems mapped to their parents @@ -62,4 +63,13 @@ def setup_defaults(self): return {"sections": [], "series": [], "videos": [], "titles": {}, "seasons": []} -ignore_list = IgnoreDict(Dict) +class IncludeDict(ExcludeDict): + store = "include" + + +exclude_list = ExcludeDict(Dict) +include_list = IncludeDict(Dict) + + +def get_decision_list(): + return include_list if config.include else exclude_list diff --git a/Contents/Code/support/items.py b/Contents/Code/support/items.py index b4fe2c4b8..c51df76b0 100644 --- a/Contents/Code/support/items.py +++ b/Contents/Code/support/items.py @@ -10,10 +10,10 @@ import datetime -from ignore import ignore_list +from ignore import get_decision_list from helpers import is_recent, get_plex_item_display_title, query_plex, PartUnknownException from lib import Plex, get_intent -from config import config, IGNORE_FN +from config import config from subliminal_patch.subtitle import ModifiedSubtitle from subzero.modification import registry as mod_registry, SubtitleModifications from socket import timeout @@ -209,10 +209,13 @@ def get_recent_items(): available_keys = ("key", "title", "parent_key", "parent_title", "season", "episode", "added", "filename") recent = [] + ref_list = get_decision_list() + for section in Plex["library"].sections(): if section.type not in ("movie", "show") \ or section.key not in config.enabled_sections \ - or section.key in ignore_list.sections: + or ((section.key not in ref_list.sections and config.include) + or (section.key in ref_list.sections and not config.include)): Log.Debug(u"Skipping section: %s" % section.title) continue @@ -229,14 +232,16 @@ def get_recent_items(): matches = [m.groupdict() for m in matcher.finditer(response.content)] for match in matches: data = dict((key, match[key] if key in match else None) for key in available_keys) - if section.type == "show" and data["parent_key"] in ignore_list.series: + if section.type == "show" and ((data["parent_key"] not in ref_list.series and config.include) or + (data["parent_key"] in ref_list.series and not config.include)): Log.Debug(u"Skipping series: %s" % data["parent_title"]) continue - if data["key"] in ignore_list.videos: + if (data["key"] not in ref_list.videos and config.include) or \ + (data["key"] in ref_list.videos and not config.include): Log.Debug(u"Skipping item: %s" % data["title"]) continue - if is_physically_ignored(data["filename"], plex_item_type): - Log.Debug(u"Skipping item: %s" % data["title"]) + if not is_physically_wanted(data["filename"], plex_item_type): + Log.Debug(u"Skipping item (physically not wanted): %s" % data["title"]) continue if is_recent(int(data["added"])): @@ -257,63 +262,73 @@ def get_all_items(key, base="library", value=None, flat=False): return get_items(key, base=base, value=value, flat=flat) -def is_ignored(rating_key, item=None): +def is_wanted(rating_key, item=None): """ check whether an item, its show/season/section is in the soft or the hard ignore list :param rating_key: :param item: :return: """ - # item in soft ignore list - if ignore_list["videos"] and rating_key in ignore_list["videos"]: - Log.Debug("Item %s is in the soft ignore list" % rating_key) - return True + + ref_list = get_decision_list() + ret_val = ref_list.store == "include" + inc_exc_verbose = "exclude" if not ret_val else "include" + + # item in soft include/exclude list + if ref_list["videos"] and rating_key in ref_list["videos"]: + Log.Debug("Item %s is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val item = item or get_item(rating_key) kind = get_item_kind(item) - # show in soft ignore list - if kind == "Episode" and ignore_list["series"] and item.show.rating_key in ignore_list["series"]: - Log.Debug("Item %s's show is in the soft ignore list" % rating_key) - return True + # show in soft include/exclude list + if kind == "Episode" and ref_list["series"] and item.show.rating_key in ref_list["series"]: + Log.Debug("Item %s's show is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val - # season in soft ignore list - if kind == "Episode" and ignore_list["seasons"] and item.season.rating_key in ignore_list["seasons"]: - Log.Debug("Item %s's season is in the soft ignore list" % rating_key) - return True + # season in soft include/exclude list + if kind == "Episode" and ref_list["seasons"] and item.season.rating_key in ref_list["seasons"]: + Log.Debug("Item %s's season is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val - # section in soft ignore list - if ignore_list["sections"] and item.section.key in ignore_list["sections"]: - Log.Debug("Item %s's section is in the soft ignore list" % rating_key) - return True + # section in soft include/exclude list + if ref_list["sections"] and item.section.key in ref_list["sections"]: + Log.Debug("Item %s's section is in the soft %s list" % (rating_key, inc_exc_verbose)) + return ret_val - # physical/path ignore - if config.ignore_sz_files or config.ignore_paths: + # physical/path include/exclude + if config.include_exclude_sz_files or config.include_exclude_paths: for media in item.media: for part in media.parts: - if is_physically_ignored(part.file, kind): - return True + return is_physically_wanted(part.file, kind) - return False + return not ret_val -def is_physically_ignored(fn, kind): - if config.ignore_sz_files or config.ignore_paths: +def is_physically_wanted(fn, kind): + if config.include_exclude_sz_files or config.include_exclude_paths: # normally check current item folder and the library - check_ignore_paths = [".", "../"] + check_paths = [".", "../"] if kind == "Episode": # series/episode, we've got a season folder here, also - check_ignore_paths.append("../../") + check_paths.append("../../") + + wanted_results = [] + if config.include_exclude_sz_files: + for sub_path in check_paths: + wanted_results.append(config.is_physically_wanted( + os.path.normpath(os.path.join(os.path.dirname(fn), sub_path)), fn)) + + if config.include_exclude_paths: + wanted_results.append(config.is_path_wanted(fn)) - if config.ignore_paths and config.is_path_ignored(fn): - Log.Debug("Item %s's path is manually ignored" % fn) + if config.include and any(wanted_results): return True + elif not config.include and not all(wanted_results): + return False - if config.ignore_sz_files: - for sub_path in check_ignore_paths: - if config.is_physically_ignored(os.path.normpath(os.path.join(os.path.dirname(fn), sub_path))): - Log.Debug("An ignore file exists in either the items or its parent folders") - return True + return not config.include def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, parent_rating_key=None): @@ -334,11 +349,13 @@ def refresh_item(rating_key, force=False, timeout=8000, refresh_kind=None, paren refresh = [item.rating_key for item in list(Plex["library/metadata"].children(int(rating_key)))] multiple = len(refresh) > 1 + wait = config.advanced.get("refresh_after_called", 5) + Thread.Sleep(wait) for key in refresh: Log.Info("%s item %s", "Refreshing" if not force else "Forced-refreshing", key) Plex["library/metadata"].refresh(key) if multiple: - Thread.Sleep(10.0) + Thread.Sleep(wait) def get_current_sub(rating_key, part_id, language, plex_item=None): @@ -408,8 +425,9 @@ def save_stored_sub(stored_subtitle, rating_key, part_id, language, item_type, p try: save_subtitles(scanned_parts, {video: [subtitle]}, mode="m", bare_save=True) + stored_subtitle.mods = subtitle.mods Log.Debug("Modified %s subtitle for: %s:%s with: %s", language.name, rating_key, part_id, - ", ".join(stored_subtitle.mods) if stored_subtitle.mods else "none") + ", ".join(subtitle.mods) if subtitle.mods else "none") except: Log.Error("Something went wrong when modifying subtitle: %s", traceback.format_exc()) diff --git a/Contents/Code/support/localmedia.py b/Contents/Code/support/localmedia.py index 5f16b8977..0c7d8b318 100755 --- a/Contents/Code/support/localmedia.py +++ b/Contents/Code/support/localmedia.py @@ -7,13 +7,15 @@ import subtitlehelpers from config import config as sz_config +from subzero.language import ENDSWITH_LANGUAGECODE_RE SECONDARY_TAGS = ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom', 'hi', 'cc', 'sdh'] -def find_subtitles(part): +def find_subtitles(part, ignore_parts_cleanup=None): lang_sub_map = {} + ignore_parts_cleanup = ignore_parts_cleanup or [] part_filename = helpers.unicodize(part.file) part_basename = os.path.splitext(os.path.basename(part_filename))[0] use_filesystem = helpers.cast_bool(Prefs["subtitles.save.filesystem"]) @@ -21,6 +23,7 @@ def find_subtitles(part): if Prefs["subtitles.save.subFolder.Custom"] else None use_sub_subfolder = Prefs["subtitles.save.subFolder"] != "current folder" and not sub_dir_custom + autoclean = helpers.cast_bool(Prefs["subtitles.autoclean"]) sub_subfolder = None paths = [os.path.dirname(part_filename)] if use_filesystem else [] @@ -88,7 +91,10 @@ def find_subtitles(part): media_files.append(root) # cleanup any leftover subtitle if no associated media file was found - if use_filesystem and helpers.cast_bool(Prefs["subtitles.autoclean"]): + if autoclean and ignore_parts_cleanup: + Log.Info("Skipping housekeeping of: %s", paths) + + if use_filesystem and autoclean and not ignore_parts_cleanup: for path in paths: # only housekeep in sub_subfolder if sub_subfolder is used if use_sub_subfolder and path != sub_subfolder and not sz_config.advanced.thorough_cleaning: @@ -120,7 +126,7 @@ def find_subtitles(part): root = split_tag[0] # get associated media file name without language - sub_fn = subtitlehelpers.ENDSWITH_LANGUAGECODE_RE.sub("", root) + sub_fn = ENDSWITH_LANGUAGECODE_RE.sub("", root) # subtitle basename and basename without possible language tag not found in collected # media files? kill. diff --git a/Contents/Code/support/missing_subtitles.py b/Contents/Code/support/missing_subtitles.py index e0d0f5874..1f3b41498 100755 --- a/Contents/Code/support/missing_subtitles.py +++ b/Contents/Code/support/missing_subtitles.py @@ -8,6 +8,7 @@ from support.config import config, TEXT_SUBTITLE_EXTS from support.helpers import get_plex_item_display_title, cast_bool, get_language_from_stream +from support.plex_media import is_stream_forced, update_stream_info from support.items import get_item from support.lib import Plex from support.storage import get_subtitle_storage @@ -31,11 +32,11 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t subtitle_target_dir, tdir_is_absolute = config.subtitle_sub_dir missing = set() - languages_set = set([Language.fromietf(str(l)) for l in languages]) + languages_set = set([Language.rebuild(l) for l in languages]) for media in item.media: existing_subs = {"internal": [], "external": [], "own_external": [], "count": 0} for part in media.parts: - + update_stream_info(part) # did we already download an external subtitle before? if subtitle_target_dir and stored_subs: for language in languages_set: @@ -79,6 +80,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t for stream in part.streams: if stream.stream_type == 3: + is_forced = is_stream_forced(stream) if stream.index: key = "internal" else: @@ -89,7 +91,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t # treat unknown language as lang1? if not stream.language_code and config.treat_und_as_first: - lang = Language.fromietf(str(list(config.lang_list)[0])) + lang = Language.rebuild(list(config.lang_list)[0]) # we can't parse empty language codes elif not stream.language_code or not stream.codec: @@ -101,7 +103,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t lang = get_language_from_stream(stream.language_code) if not lang: if config.treat_und_as_first: - lang = Language.fromietf(str(list(config.lang_list)[0])) + lang = Language.rebuild(list(config.lang_list)[0]) else: continue @@ -110,10 +112,11 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t if lang: # Log.Debug("Found babelfish language: %r", lang) + lang.forced = is_forced existing_subs[key].append(lang) existing_subs["count"] = existing_subs["count"] + 1 - missing_from_part = set([Language.fromietf(str(l)) for l in languages]) + missing_from_part = set([Language.rebuild(l) for l in languages]) if existing_subs["count"]: # fixme: this is actually somewhat broken with IETF, as Plex doesn't store the country portion @@ -123,7 +126,7 @@ def item_discover_missing_subs(rating_key, kind="show", added_at=None, section_t + (existing_subs["external"] if external else []) + existing_subs["own_external"]) - check_languages = set([Language.fromietf(str(l)) for l in languages]) + check_languages = set([Language.rebuild(l) for l in languages]) alpha3_map = {} if config.ietf_as_alpha3: for language in existing_flat: diff --git a/Contents/Code/support/plex_media.py b/Contents/Code/support/plex_media.py index 67e306f1f..b4e4dacb0 100644 --- a/Contents/Code/support/plex_media.py +++ b/Contents/Code/support/plex_media.py @@ -1,9 +1,11 @@ # coding=utf-8 import os +import subprocess import helpers from items import get_item +from subzero.language import Language from lib import Plex from support.config import TEXT_SUBTITLE_EXTS, config @@ -25,6 +27,9 @@ def get_metadata_dict(item, part, add): def get_plexapi_stream_info(plex_item, part_id=None): + if not plex_item: + return + d = {"stream": {}} data = d["stream"] @@ -99,6 +104,9 @@ def media_to_videos(media, kind="series"): plex_episode = get_item(ep.id) stream_info = get_plexapi_stream_info(plex_episode) + if not stream_info: + continue + for item in media.seasons[season].episodes[episode].items: for part in item.parts: videos.append( @@ -107,6 +115,7 @@ def media_to_videos(media, kind="series"): "title": ep.title, "series": media.title, "id": ep.id, "year": year, "series_id": media.id, + "super_thumb": plex_item.thumb, "season_id": season_object.id, "imdb_id": None, "series_tvdb_id": series_tvdb_id, "tvdb_id": tvdb_id, @@ -119,21 +128,24 @@ def media_to_videos(media, kind="series"): ) else: stream_info = get_plexapi_stream_info(plex_item) - imdb_id = None - if imdb_guid_identifier in media.guid: - imdb_id = media.guid[len(imdb_guid_identifier):].split("?")[0] - for item in media.items: - for part in item.parts: - videos.append( - get_metadata_dict(plex_item, part, dict(stream_info, **{"plex_part": part, "type": "movie", - "title": media.title, "id": media.id, - "series_id": None, "year": year, - "season_id": None, "imdb_id": imdb_id, - "original_title": original_title, - "series_tvdb_id": None, "tvdb_id": None, - "section": plex_item.section.title}) - ) - ) + + if stream_info: + imdb_id = None + if imdb_guid_identifier in media.guid: + imdb_id = media.guid[len(imdb_guid_identifier):].split("?")[0] + for item in media.items: + for part in item.parts: + videos.append( + get_metadata_dict(plex_item, part, dict(stream_info, **{"plex_part": part, "type": "movie", + "title": media.title, "id": media.id, + "super_thumb": plex_item.thumb, + "series_id": None, "year": year, + "season_id": None, "imdb_id": imdb_id, + "original_title": original_title, + "series_tvdb_id": None, "tvdb_id": None, + "section": plex_item.section.title}) + ) + ) return videos @@ -171,37 +183,100 @@ def get_all_parts(plex_item): return parts -def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True, get_forced=None): +def update_stream_info(part): + try: + return update_stream_info_(part) + except: + Log.Exception("Getting Mediainfo failed for: %s", part.file) + + +def update_stream_info_(part): + if config.mediainfo_bin and part.container == "mp4": + cmdline = '%s --Inform="Text;-%%ID%%_%%Title%%" %s' % (config.mediainfo_bin, helpers.quote(part.file)) + result = subprocess.check_output(cmdline, stderr=subprocess.PIPE, shell=True) + if result: + try: + stream_titles = {} + for pair in result[1:].split("-"): + sid, title = pair.split("_") + stream_titles[int(sid.strip())] = title.strip() + except: + pass + else: + filled = [] + for stream in part.streams: + if stream.index is None: + Log.Debug("Found stream with no index: %r", stream) + + index = stream.index+1 if stream.index is not None else 1 + if index in stream_titles: + stream.title = stream_titles[index] + filled.append(index-1) + if filled: + Log.Debug("Filled missing MP4 stream title info for streams: %s", filled) + + +def is_stream_forced(stream): + stream_title = getattr(stream, "title", "") or "" + forced = getattr(stream, "forced", False) + if not forced and stream_title and "forced" in stream_title.strip().lower(): + forced = True + + return forced + + +def get_embedded_subtitle_streams(part, requested_language=None, skip_duplicate_unknown=True, skip_unknown=False): streams = [] + streams_unknown = [] + all_streams = [] has_unknown = False + found_requested_language = False + update_stream_info(part) for stream in part.streams: # subtitle stream if stream.stream_type == 3 and not stream.stream_key and stream.codec in TEXT_SUBTITLE_EXTS: + is_forced = is_stream_forced(stream) language = helpers.get_language_from_stream(stream.language_code) + if language: + language = Language.rebuild(language, forced=is_forced) + is_unknown = False found_requested_language = requested_language and requested_language == language - is_forced = helpers.is_stream_forced(stream) - - if get_forced is not None: - if (get_forced and not is_forced) or (not get_forced and is_forced): - continue + stream_data = None - if not language and config.treat_und_as_first: + if not language: # only consider first unknown subtitle stream - if has_unknown and skip_duplicate_unknown: - continue - - language = list(config.lang_list)[0] + if config.treat_und_as_first: + if has_unknown and skip_duplicate_unknown: + Log.Debug("skipping duplicate unknown") + continue + + language = Language.rebuild(list(config.lang_list)[0], forced=is_forced) + else: + language = None is_unknown = True has_unknown = True + stream_data = {"stream": stream, "is_unknown": is_unknown, "language": language, + "is_forced": is_forced} + streams_unknown.append(stream_data) - if not requested_language or found_requested_language or has_unknown: - streams.append({"stream": stream, "is_unknown": is_unknown, "language": language, - "is_forced": is_forced}) + if not requested_language or found_requested_language: + stream_data = {"stream": stream, "is_unknown": is_unknown, "language": language, + "is_forced": is_forced} + streams.append(stream_data) if found_requested_language: break + if stream_data: + all_streams.append(stream_data) + + if requested_language: + if streams_unknown and not found_requested_language and not skip_unknown: + streams = streams_unknown + else: + streams = all_streams + return streams @@ -236,6 +311,9 @@ def get_plex_metadata(rating_key, part_id, item_type, plex_item=None): stream_info = get_plexapi_stream_info(plex_item, part_id) + if not stream_info: + return + # get normalized metadata # fixme: duplicated logic of media_to_videos if item_type == "episode": @@ -256,6 +334,7 @@ def get_plex_metadata(rating_key, part_id, item_type, plex_item=None): "imdb_id": None, "year": year, "tvdb_id": tvdb_id, + "super_thumb": plex_item.show.thumb, "series_tvdb_id": series_tvdb_id, "original_title": original_title, "season": plex_item.season.index, @@ -275,6 +354,7 @@ def get_plex_metadata(rating_key, part_id, item_type, plex_item=None): "imdb_id": imdb_id, "year": plex_item.year, "tvdb_id": None, + "super_thumb": plex_item.thumb, "series_tvdb_id": None, "original_title": original_title, "season": None, @@ -355,3 +435,4 @@ def get_all_parts(self): m = m.children[0] return parts + diff --git a/Contents/Code/support/scanning.py b/Contents/Code/support/scanning.py index a99d8850c..f93dce055 100644 --- a/Contents/Code/support/scanning.py +++ b/Contents/Code/support/scanning.py @@ -4,15 +4,15 @@ from babelfish.exceptions import LanguageError from support.lib import Plex, get_intent -from support.plex_media import get_stream_fps +from support.plex_media import get_stream_fps, is_stream_forced, update_stream_info from support.storage import get_subtitle_storage from support.config import config, TEXT_SUBTITLE_EXTS - +from support.subtitlehelpers import get_subtitles_from_metadata from subzero.video import parse_video, set_existing_languages -from subzero.language import language_from_stream +from subzero.language import language_from_stream, Language -def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, providers=None, skip_hashing=False): +def prepare_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, providers=None, skip_hashing=False): """ returnes a subliminal/guessit-refined parsed video :param pms_video_info: @@ -29,7 +29,7 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr if ignore_all: Log.Debug("Force refresh intended.") - Log.Debug("Scanning video: %s, external_subtitles=%s, embedded_subtitles=%s" % ( + Log.Debug("Detecting streams: %s, account_for_external_subtitles=%s, account_for_embedded_subtitles=%s" % ( plex_part.file, external_subtitles, embedded_subtitles)) known_embedded = [] @@ -44,36 +44,74 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr # embedded subtitles # fixme: skip the whole scanning process if known_embedded == wanted languages? + audio_languages = [] if plexpy_part: - if embedded_subtitles: - for stream in plexpy_part.streams: - # subtitle stream - if stream.stream_type == 3: - is_forced = helpers.is_stream_forced(stream) - - if (config.forced_only and is_forced) or \ - (not config.forced_only and not is_forced): - - # embedded subtitle - # fixme: tap into external subtitles here instead of scanning for ourselves later? - if stream.codec and getattr(stream, "index", None): - if config.exotic_ext or stream.codec.lower() in config.text_based_formats: - lang = None - try: - lang = language_from_stream(stream.language_code) - except LanguageError: - Log.Debug("Couldn't detect embedded subtitle stream language: %s", stream.language_code) - - # treat unknown language as lang1? - if not lang and config.treat_und_as_first: - lang = list(config.lang_list)[0] - - if lang: - known_embedded.append(lang.alpha3) + update_stream_info(plexpy_part) + for stream in plexpy_part.streams: + if stream.stream_type == 2: + lang = None + try: + lang = language_from_stream(stream.language_code) + except LanguageError: + Log.Info("Couldn't detect embedded audio stream language: %s", stream.language_code) + + # treat unknown language as lang1? + if not lang and config.treat_und_as_first: + lang = Language.rebuild(list(config.lang_list)[0]) + Log.Info("Assuming language %s for audio stream: %s", lang, getattr(stream, "index", None)) + + audio_languages.append(lang) + + # subtitle stream + elif stream.stream_type == 3 and embedded_subtitles: + is_forced = is_stream_forced(stream) + + if ((config.forced_only or config.forced_also) and is_forced) or not is_forced: + # embedded subtitle + # fixme: tap into external subtitles here instead of scanning for ourselves later? + if stream.codec and getattr(stream, "index", None): + if config.exotic_ext or stream.codec.lower() in config.text_based_formats: + lang = None + try: + lang = language_from_stream(stream.language_code) + except LanguageError: + Log.Info("Couldn't detect embedded subtitle stream language: %s", stream.language_code) + + # treat unknown language as lang1? + if not lang and config.treat_und_as_first: + lang = Language.rebuild(list(config.lang_list)[0]) + Log.Info("Assuming language %s for subtitle stream: %s", lang, + getattr(stream, "index", None)) + + if lang: + if is_forced: + lang.forced = True + known_embedded.append(lang) else: Log.Warn("Part %s missing of %s, not able to scan internal streams", plex_part.id, rating_key) - Log.Debug("Known embedded: %r", known_embedded) + # metadata subtitles + known_metadata_subs = set() + meta_subs = get_subtitles_from_metadata(plex_part) + for language, subList in meta_subs.iteritems(): + try: + lang = Language.fromietf(Locale.Language.Match(language)) + except LanguageError: + if config.treat_und_as_first: + lang = Language.rebuild(list(config.lang_list)[0]) + else: + continue + + if subList: + for key in subList: + if key.startswith("subzero_md_forced"): + lang = Language.rebuild(lang, forced=True) + + known_metadata_subs.add(lang) + Log.Debug("Found metadata subtitle %r:%s for %s", lang, key, plex_part.file) + + Log.Debug("Known metadata subtitles: %r", known_metadata_subs) + Log.Debug("Known embedded subtitles: %r", known_embedded) subtitle_storage = get_subtitle_storage() stored_subs = subtitle_storage.load(rating_key) @@ -84,11 +122,17 @@ def scan_video(pms_video_info, ignore_all=False, hints=None, rating_key=None, pr video = parse_video(plex_part.file, hints, skip_hashing=config.low_impact_mode or skip_hashing, providers=providers) + # set stream languages + if audio_languages: + video.audio_languages = audio_languages + Log.Info("Found audio streams: %s" % ", ".join([str(l) for l in audio_languages])) + if not ignore_all: set_existing_languages(video, pms_video_info, external_subtitles=external_subtitles, embedded_subtitles=embedded_subtitles, known_embedded=known_embedded, - forced_only=config.forced_only, stored_subs=stored_subs, languages=config.lang_list, - only_one=config.only_one) + stored_subs=stored_subs, languages=config.lang_list, + only_one=config.only_one, known_metadata_subs=known_metadata_subs, + match_strictness=config.ext_match_strictness) # add video fps info video.fps = plex_part.fps @@ -115,9 +159,9 @@ def scan_videos(videos, ignore_all=False, providers=None, skip_hashing=False): hints = helpers.get_item_hints(video) video["plex_part"].fps = get_stream_fps(video["plex_part"].streams) p = providers or config.get_providers(media_type="series" if video["type"] == "episode" else "movies") - scanned_video = scan_video(video, ignore_all=force_refresh or ignore_all, hints=hints, - rating_key=video["id"], providers=p, - skip_hashing=skip_hashing) + scanned_video = prepare_video(video, ignore_all=force_refresh or ignore_all, hints=hints, + rating_key=video["id"], providers=p, + skip_hashing=skip_hashing) if not scanned_video: continue diff --git a/Contents/Code/support/storage.py b/Contents/Code/support/storage.py index 0fc0ccc36..1adfa733c 100644 --- a/Contents/Code/support/storage.py +++ b/Contents/Code/support/storage.py @@ -33,7 +33,7 @@ def store_subtitle_info(scanned_video_part_map, downloaded_subtitles, storage_ty video_id = str(video.id) plex_item = get_item(video_id) if not plex_item: - Log.Warning("Plex item not found: %s", video_id) + Log.Warn("Plex item not found: %s", video_id) continue metadata = video.plexapi_metadata @@ -113,8 +113,7 @@ def get_target_folder(file_path): return fld -def save_subtitles_to_file(subtitles, tags=None, forced_tag=None): - forced_tag = forced_tag or config.forced_only +def save_subtitles_to_file(subtitles, tags=None): for video, video_subtitles in subtitles.items(): if not video_subtitles: continue @@ -126,12 +125,12 @@ def save_subtitles_to_file(subtitles, tags=None, forced_tag=None): fld = get_target_folder(file_path) subliminal_save_subtitles(file_path, video_subtitles, directory=fld, single=cast_bool(Prefs['subtitles.only_one']), - chmod=config.chmod, forced_tag=forced_tag, path_decoder=force_unicode, + chmod=config.chmod, path_decoder=force_unicode, debug_mods=config.debug_mods, formats=config.subtitle_formats, tags=tags) return True -def save_subtitles_to_metadata(videos, subtitles, is_forced=False): +def save_subtitles_to_metadata(videos, subtitles): for video, video_subtitles in subtitles.items(): mediaPart = videos[video] for subtitle in video_subtitles: @@ -143,15 +142,28 @@ def save_subtitles_to_metadata(videos, subtitles, is_forced=False): mp = PMSMediaProxy(video.id).get_part(mediaPart.id) else: mp = mediaPart - pm = Proxy.Media(content, ext="srt", forced="1" if is_forced else None) + pm = Proxy.Media(content, ext="srt", forced="1" if subtitle.language.forced else None) + new_key = "subzero_md" + ("_forced" if subtitle.language.forced else "") lang = Locale.Language.Match(subtitle.language.alpha2) - mp.subtitles[lang].validate_keys({}) - mp.subtitles[lang]["subzero"] = pm + + for key, proxy in getattr(mp.subtitles[lang], "_proxies").iteritems(): + if not proxy or not len(proxy) >= 5: + Log.Debug("Can't parse metadata: %s" % repr(proxy)) + continue + if proxy[0] == "Media": + if not key.startswith("subzero_"): + if key == "subzero": + Log.Debug("Removing legacy metadata subtitle for %s", lang) + del mp.subtitles[lang][key] + Log.Debug("Existing metadata subtitle for %s: %s", lang, key) + + Log.Debug("Adding metadata sub for %s: %s", lang, subtitle) + mp.subtitles[lang][new_key] = pm return True def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_save=False, mods=None, - set_current=True, is_forced=False): + set_current=True): """ :param set_current: save the subtitle as the current one @@ -186,7 +198,7 @@ def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_ if save_to_fs: try: Log.Debug("Using filesystem as subtitle storage") - save_subtitles_to_file(downloaded_subtitles, forced_tag=is_forced) + save_subtitles_to_file(downloaded_subtitles) except OSError: if cast_bool(Prefs["subtitles.save.metadata_fallback"]): meta_fallback = True @@ -201,13 +213,12 @@ def save_subtitles(scanned_video_part_map, downloaded_subtitles, mode="a", bare_ Log.Debug("Using metadata as subtitle storage, because filesystem storage failed") else: Log.Debug("Using metadata as subtitle storage") - save_successful = save_subtitles_to_metadata(scanned_video_part_map, downloaded_subtitles, - is_forced=is_forced) + save_successful = save_subtitles_to_metadata(scanned_video_part_map, downloaded_subtitles) if not bare_save and save_successful and config.notify_executable: notify_executable(config.notify_executable, scanned_video_part_map, downloaded_subtitles, storage) - if not bare_save and save_successful or not set_current: + if (not bare_save and save_successful) or not set_current: store_subtitle_info(scanned_video_part_map, downloaded_subtitles, storage, mode=mode, set_current=set_current) return save_successful diff --git a/Contents/Code/support/subtitlehelpers.py b/Contents/Code/support/subtitlehelpers.py index f0af945d6..d2b165fd7 100644 --- a/Contents/Code/support/subtitlehelpers.py +++ b/Contents/Code/support/subtitlehelpers.py @@ -5,6 +5,7 @@ from config import config, SUBTITLE_EXTS, TEXT_SUBTITLE_EXTS from bs4 import UnicodeDammit +from subzero.language import match_ietf_language class SubtitleHelper(object): @@ -85,19 +86,6 @@ def process_subtitles(self, part): ##################################################################################################################### -IETF_MATCH = ".+\.([^-.]+)(?:-[A-Za-z]+)?$" -ENDSWITH_LANGUAGECODE_RE = re.compile("\.([^-.]{2,3})(?:-[A-Za-z]{2,})?$") - - -def match_ietf_language(s): - language_match = re.match(".+\.([^\.]+)$" if not helpers.cast_bool(Prefs["subtitles.language.ietf_display"]) - else IETF_MATCH, s) - if language_match and len(language_match.groups()) == 1: - language = language_match.groups()[0] - return language - return s - - class DefaultSubtitleHelper(SubtitleHelper): @classmethod def is_helper_for(cls, filename): @@ -133,7 +121,7 @@ def process_subtitles(self, part): # Attempt to extract the language from the filename (e.g. Avatar (2009).eng) # IETF support thanks to # https://github.com/hpsbranco/LocalMedia.bundle/commit/4fad9aefedece78a1fa96401304351347f644369 - lang_part = match_ietf_language(file) + lang_part = match_ietf_language(file, ietf=helpers.cast_bool(Prefs["subtitles.language.ietf_display"])) if lang_part != file: language = Locale.Language.Match(lang_part) elif config.only_one: @@ -174,10 +162,11 @@ def process_subtitles(self, part): Log('Found subtitle file: ' + self.filename + ' language: ' + language + ' codec: ' + str( codec) + ' format: ' + str(format) + ' default: ' + default + ' forced: ' + forced) - part.subtitles[language][basename] = Proxy.LocalFile(self.filename, codec=codec, format=format, default=default, + key = ("subzero_ex" + "_forced" if forced else "") + basename + part.subtitles[language][key] = Proxy.LocalFile(self.filename, codec=codec, format=format, default=default, forced=forced) - lang_sub_map[language] = [basename] + lang_sub_map[language] = [key] return lang_sub_map @@ -194,9 +183,12 @@ def get_subtitles_from_metadata(part): p_type = proxy[0] if p_type == "Media": + if not key.startswith("subzero"): + continue + # metadata subtitle - Log.Debug(u"Found metadata subtitle: %s, %s" % (language, repr(proxy))) - subs[language] = [key] + #Log.Debug(u"Found metadata subtitle: %s, %s, %s" % (language, key, repr(proxy))) + subs[language].append(key) return subs diff --git a/Contents/Code/support/tasks.py b/Contents/Code/support/tasks.py index b473a3233..24239b9f3 100755 --- a/Contents/Code/support/tasks.py +++ b/Contents/Code/support/tasks.py @@ -16,10 +16,12 @@ from scheduler import scheduler from storage import save_subtitles, get_subtitle_storage from support.config import config -from support.items import get_recent_items, get_item, is_ignored, get_item_title +from support.items import get_recent_items, get_item, is_wanted, get_item_title from support.helpers import track_usage, get_title_for_video_metadata, cast_bool, PartUnknownException from support.plex_media import get_plex_metadata +from support.extract import agent_extract_embedded from support.scanning import scan_videos +from support.i18n import _ from download import download_best_subtitles, pre_download_hook, post_download_hook, language_hook @@ -126,8 +128,8 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp config.init_subliminal_patches() provider_settings = config.provider_settings - if not skip_wrong_fps: - provider_settings["opensubtitles"]["skip_wrong_fps"] = False + #if not skip_wrong_fps: + # provider_settings["opensubtitlescom"]["skip_wrong_fps"] = False if item_type == "episode": min_score = 240 @@ -164,17 +166,22 @@ def list_subtitles(self, rating_key, item_type, part_id, language, skip_wrong_fp can_verify_series = False if can_verify_series and not {"series", "season", "episode"}.issubset(matches): - Log.Debug(u"%s: Skipping %s, because it doesn't match our series/episode", self.name, s) - continue + if "series" not in matches: + s.wrong_series = True + else: + s.wrong_season_ep = True + + orig_matches = matches.copy() + score, score_without_hash = compute_score(matches, s, video, hearing_impaired=use_hearing_impaired) unsorted_subtitles.append( - (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches)) - scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) + (s, score, score_without_hash, matches, orig_matches)) + scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1, 2), reverse=True) subtitles = [] - for subtitle, score, matches in scored_subtitles: + for subtitle, score, score_without_hash, matches, orig_matches in scored_subtitles: # check score - if score < min_score: + if score < min_score and not subtitle.wrong_series: Log.Info(u'%s: Score %d is below min_score (%d)', self.name, score, min_score) continue subtitle.score = score @@ -234,6 +241,7 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): item_title = get_title_for_video_metadata(metadata, add_section_title=False) history = get_history() history.add(item_title, video.id, section_title=video.plexapi_metadata["section"], + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode=mode) history.destroy() @@ -242,7 +250,9 @@ def download_subtitle(self, subtitle, rating_key, mode="m"): if not scheduler.is_task_running("MissingSubtitles"): scheduler.clear_task_data("MissingSubtitles") else: - set_refresh_menu_state(u"%s: Subtitle download failed (%s)" % (self.name, rating_key)) + set_refresh_menu_state(_(u"%(class_name)s: Subtitle download failed (%(item_id)s)", + class_name=self.name, + item_id=rating_key)) return download_successful @@ -418,7 +428,7 @@ def skip_item(): skip_item() continue - if is_ignored(video_id, item=plex_item): + if not is_wanted(video_id, item=plex_item): skip_item() continue @@ -443,6 +453,17 @@ def skip_item(): Log.Debug(u"%s: Looking for missing subtitles: %s", self.name, get_item_title(plex_item)) scanned_parts = scan_videos([metadata], providers=providers) + # auto extract embedded + if config.embedded_auto_extract: + if config.plex_transcoder: + ts = agent_extract_embedded(scanned_parts, set_as_existing=True) + if ts: + Log.Debug("Waiting for %i extraction threads to finish" % len(ts)) + for t in ts: + t.join() + else: + Log.Warn("Plex Transcoder not found, can't auto extract") + downloaded_subtitles = download_best_subtitles(scanned_parts, min_score=min_score, providers=providers) hit_providers = downloaded_subtitles is not None @@ -475,6 +496,7 @@ def skip_item(): for subtitle in video_subtitles: downloads_per_video += 1 history.add(item_title, video.id, section_title=metadata["section"], + thumb=video.plexapi_metadata["super_thumb"], subtitle=subtitle, mode="a") @@ -555,7 +577,7 @@ def prepare(self, *args, **kwargs): self.items_done = [] recent_items = get_recent_items() missing = items_get_all_missing_subs(recent_items, sleep_after_request=0.2) - ids = set([id for added_at, id, title, item, missing_languages in missing if not is_ignored(id, item=item)]) + ids = set([id for added_at, id, title, item, missing_languages in missing if is_wanted(id, item=item)]) self.items_searching = missing self.items_searching_ids = ids self.items_failed = [] @@ -648,7 +670,7 @@ def run(self): min_score_series = int(Prefs["subtitles.search.minimumTVScore2"].strip()) min_score_movies = int(Prefs["subtitles.search.minimumMovieScore2"].strip()) min_score_extracted_series = config.advanced.find_better_as_extracted_tv_score or 352 - min_score_extracted_movies = config.advanced.find_better_as_extracted_movie_score or 82 + min_score_extracted_movies = config.advanced.find_better_as_extracted_movie_score or 112 overwrite_manually_modified = cast_bool( Prefs["scheduler.tasks.FindBetterSubtitles.overwrite_manually_modified"]) overwrite_manually_selected = cast_bool( @@ -820,7 +842,12 @@ def run(self): self.running = True Log.Info(u"%s: Running subtitle storage maintenance", self.name) storage = get_subtitle_storage() - deleted_items = storage.delete_missing(wanted_languages=set(str(l) for l in config.lang_list)) + try: + deleted_items = storage.delete_missing(wanted_languages=set(str(l) for l in config.lang_list)) + except OSError: + deleted_items = storage.delete_missing(wanted_languages=set(str(l) for l in config.lang_list), + scandir_generic=True) + if deleted_items: Log.Info(u"%s: Subtitle information for %d non-existant videos have been cleaned up", self.name, len(deleted_items)) @@ -858,11 +885,18 @@ def run(self): self.running = True Log.Info(u"%s: Running subtitle storage migration", self.name) storage = get_subtitle_storage() - for fn in storage.get_all_files(): - if fn.endswith(".json.gz"): - continue - Log.Debug(u"%s: Migrating %s", self.name, fn) - storage.load(None, fn) + + def migrate(scandir_generic=False): + for fn in storage.get_all_files(scandir_generic=scandir_generic): + if fn.endswith(".json.gz"): + continue + Log.Debug(u"%s: Migrating %s", self.name, fn) + storage.load(None, fn) + + try: + migrate() + except OSError: + migrate(scandir_generic=True) storage.destroy() diff --git a/Contents/DefaultPrefs.json b/Contents/DefaultPrefs.json index 42b4284b5..397b50445 100644 --- a/Contents/DefaultPrefs.json +++ b/Contents/DefaultPrefs.json @@ -50,7 +50,9 @@ "tr", "uk", "vi", - "hr" + "hr", + "zh-hans", + "zh-hant" ], "default": "en" }, @@ -106,7 +108,9 @@ "tr", "uk", "vi", - "hr" + "hr", + "zh-hans", + "zh-hant" ], "default": "None" }, @@ -162,7 +166,9 @@ "tr", "uk", "vi", - "hr" + "hr", + "zh-hans", + "zh-hant" ], "default": "None" }, @@ -173,10 +179,50 @@ "default": "None" }, { - "id": "subtitles.only_foreign", - "label": "Only download foreign/forced subtitles", - "type": "bool", - "default": "false" + "id": "subtitles.when", + "label": "Download subtitles", + "type": "enum", + "values": [ + "Never", + "Always", + "When main audio stream is not Subtitle Language (1)", + "When main audio stream is not any configured language", + "When any audio stream is not Subtitle Language (1)", + "When any audio stream is not any configured language" + ], + "default": "Always" + }, + { + "id": "subtitles.ignore_for_audio", + "label": "Don't download subtitles for Audio languages (use ISO-639-1 codes; comma-separated; NULL=no audio)", + "type": "text", + "default": "None" + }, + { + "id": "subtitles.when_forced", + "label": "Download foreign/forced subtitles", + "type": "enum", + "values": [ + "Never", + "Always", + "Only for Subtitle Language (1)", + "Only for Subtitle Language (2)", + "Only for Subtitle Language (3)" + ], + "default": "Never" + }, + { + "id": "subtitles.any_language_is_enough", + "label": "Don't search for subtitles if a subtitle in any configured language exists as", + "type": "enum", + "values": [ + "External or embedded subtitle", + "External or embedded subtitle (not foreign/forced)", + "External subtitle", + "External subtitle (not foreign/forced)", + "Always search for all configured languages" + ], + "default": "Always search for all configured languages" }, { "id": "subtitles.language.ietf_display", @@ -198,7 +244,7 @@ }, { "id": "subtitles.language.treat_und_as_first", - "label": "Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "label": "Embedded streams: Treat \"Undefined\" (und) as language 1", "type": "bool", "default": "true" }, @@ -246,9 +292,26 @@ "type": "text", "default": "" }, + { + "id": "anticaptcha.service", + "label": "AntiCaptcha-Service (needs paid account; enables Addic7ed)", + "type": "enum", + "values": [ + "none", + "anti-captcha.com", + "deathbycaptcha.com" + ], + "default": "none" + }, + { + "id": "anticaptcha.api_key", + "label": "AntiCaptcha-Service key (anti-captcha.com: account_key; deathbycaptcha.com: username:password)", + "type": "text", + "default": "" + }, { "id": "provider.opensubtitles.enabled", - "label": "Provider: Enable OpenSubtitles", + "label": "Provider: Enable OpenSubtitles.com", "type": "bool", "default": "true" }, @@ -267,10 +330,16 @@ "secure": "true" }, { - "id": "provider.opensubtitles.is_vip", - "label": "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "id": "provider.opensubtitles.use_hash", + "label": "OpenSubtitles hash?", "type": "bool", - "default": "false" + "default": "true" + }, + { + "id": "provider.opensubtitles.api_key", + "label": "OpenSubtitles APIKey", + "type": "text", + "default": "" }, { "id": "provider.podnapisi.enabled", @@ -279,14 +348,28 @@ "default": "true" }, { - "id": "provider.titlovi.enabled", - "label": "Provider: Enable Titlovi.com", + "id": "provider.napisy24.enabled", + "label": "Provider: Enable Napisy24 (pl)", "type": "bool", - "default": "true" + "default": "false" + }, + { + "id": "provider.napisy24.username", + "label": "Napisy24 Username", + "type": "text", + "default": "" + }, + { + "id": "provider.napisy24.password", + "label": "Napisy24 Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" }, { "id": "provider.addic7ed.enabled", - "label": "Provider: Enable Addic7ed", + "label": "Provider: Enable Addic7ed (needs AntiCaptcha)", "type": "bool", "default": "true" }, @@ -304,6 +387,12 @@ "default": "", "secure": "true" }, + { + "id": "provider.addic7ed.is_vip", + "label": "Addic7ed VIP? (80 vs 40 downloads per day)", + "type": "bool", + "default": "false" + }, { "id": "provider.addic7ed.boost_by2", "label": "Addic7ed: boost score (if requirements met)", @@ -337,11 +426,25 @@ "default": "19" }, { - "id": "provider.addic7ed.use_random_agents1", - "label": "Addic7ed: Use random user agents", + "id": "provider.titlovi.enabled", + "label": "Provider: Enable Titlovi.com (User and Password required)", "type": "bool", "default": "true" }, + { + "id": "provider.titlovi.username", + "label": "Titlovi Username", + "type": "text", + "default": "" + }, + { + "id": "provider.titlovi.password", + "label": "Titlovi Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" + }, { "id": "provider.legendastv.enabled", "label": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", @@ -380,6 +483,26 @@ "type": "bool", "default": "true" }, + { + "id": "provider.subscene.username", + "label": "SubScene Username", + "type": "text", + "default": "" + }, + { + "id": "provider.subscene.password", + "label": "SubScene Password", + "type": "text", + "option": "hidden", + "default": "", + "secure": "true" + }, + { + "id": "provider.supersubtitles.enabled", + "label": "Provider: Enable feliratok.info (Hungarian)", + "type": "bool", + "default": "false" + }, { "id": "provider.hosszupuska.enabled", "label": "Provider: Enable hosszupuskasub.com (Hungarian)", @@ -392,6 +515,50 @@ "type": "bool", "default": "false" }, + { + "id": "provider.assrt.enabled", + "label": "Provider: Enable assrt.net (Chinese)", + "type": "bool", + "default": "false" + }, + { + "id": "provider.assrt.token", + "label": "Assrt API Token", + "type": "text", + "default": "" + }, + { + "id": "provider.bsplayer.enabled", + "label": "Provider: Enable BSPlayer Subtitles", + "type": "bool", + "default": "true" + }, + { + "id": "provider.wizdom.enabled", + "label": "Provider: Enable WizdomSubs (Hebrew)", + "type": "bool", + "default": "true" + }, + { + "id": "provider.ktuvit.enabled", + "label": "Provider: Enable Ktuvit (Hebrew)", + "type": "bool", + "default": "true" + }, + { + "id": "provider.ktuvit.username", + "label": "Ktuvit Username", + "type": "text", + "default": "" + }, + { + "id": "provider.ktuvit.password", + "label": "Ktuvit Password", + "type": "text", + "option": "hidden", + "secure": "true", + "default": "" + }, { "id": "providers.multithreading", "label": "Search enabled providers simultaneously (multithreading)", @@ -487,9 +654,15 @@ "type": "bool", "default": "true" }, + { + "id": "subtitles.fix_only_uppercase", + "label": "Fix only uppercase downloaded subtitles", + "type": "bool", + "default": "true" + }, { "id": "subtitles.reverse_rtl", - "label": "Reverse punctuation in RTL languages (heb)", + "label": "Reverse punctuation in RTL languages (heb, ara, fas)", "type": "bool", "default": "false" }, @@ -570,7 +743,7 @@ "id": "subtitles.autoclean", "label": "Automatically delete leftover/unused (externally saved) subtitles", "type": "bool", - "default": "true" + "default": "false" }, { "id": "activity.on_playback", @@ -671,6 +844,29 @@ "type": "bool", "default": "false" }, + { + "id": "scheduler.tasks.SubtitleStorageMaintenance.frequency", + "label": "Scheduler: Periodically run subtitle storage maintenance (SZ internal)", + "type": "enum", + "values": [ + "never", + "every 6 hours", + "every 12 hours", + "every 24 hours", + "every 1 days", + "every 2 days", + "every 3 days", + "every 4 days", + "every 1 weeks", + "every 2 weeks", + "every 3 weeks", + "every 4 weeks", + "every 5 weeks", + "every 6 weeks", + "every 12 weeks" + ], + "default": "every 1 weeks" + }, { "id": "history_size", "label": "History: amount of items to store historical data for", @@ -697,27 +893,37 @@ "default": "2" }, { - "id": "subtitles.ignore_fs", - "label": "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", - "type": "bool", - "default": "false" + "id": "subtitles.include_exclude_mode", + "label": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", + "type": "enum", + "values": [ + "enable SZ for all items by default, use ignore mode", + "disable SZ for all items by default, use include mode" + ], + "default": "enable SZ for all items by default, use ignore mode" }, { - "id": "subtitles.ignore_paths", - "label": "Ignore anything in the following paths (comma-separated)", + "id": "subtitles.include_exclude_paths", + "label": "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", "type": "text", "default": "" }, { - "id": "plugin_mode", + "id": "subtitles.include_exclude_fs", + "label": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders", + "type": "bool", + "default": "false" + }, + { + "id": "plugin_mode2", "label": "Sub-Zero mode", "type": "enum", "values": [ - "agent + channel", + "agent + interface", "only agent", - "only channel" + "only interface" ], - "default": "agent + channel" + "default": "agent + interface" }, { "id": "plugin_pin", @@ -734,12 +940,12 @@ "default": "10" }, { - "id": "plugin_pin_mode", + "id": "plugin_pin_mode2", "label": "Use PIN to restrict access to (needs plugin or PMS restart)", "type": "enum", "values": [ "disabled", - "channel menu", + "interface", "advanced menu" ], "default": "disabled" @@ -774,6 +980,12 @@ "type": "text", "default": "15" }, + { + "id": "use_custom_dns2", + "label": "Use custom DNS (IPs, comma-separated, set to 'system' for system DNS. Default: Google/CF)", + "type": "text", + "default": "1.1.1.1, 8.8.8.8" + }, { "id": "proxy", "label": "HTTP proxy to use for providers (supports credentials)", diff --git a/Contents/Info.plist b/Contents/Info.plist index 867d63a98..76d8ca797 100755 --- a/Contents/Info.plist +++ b/Contents/Info.plist @@ -9,11 +9,11 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleShortVersionString - 2.5.4 + 2.6.5 CFBundleSignature ???? CFBundleVersion - 2.5.4.2527 + 2.6.5.3280 PlexFrameworkVersion 2 PlexPluginClass @@ -32,7 +32,7 @@ <h1>Sub-Zero for Plex</h1><i>Subtitles done right</i> -Version 2.5.4.2527 +Version 2.6.5.3280 Originally based on @bramwalet's awesome <a href="https://github.com/bramwalet/Subliminal.bundle">Subliminal.bundle</a> @@ -46,7 +46,7 @@ Github: <a href="https://github.com/pannal/Sub-Zero.bundle">http 3rd party licenses: <a href="https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses">https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses</a> -panni, 2018 +panni, 2019 </div> diff --git a/Contents/Libraries/Shared/backports/__init__.py b/Contents/Libraries/Shared/backports/__init__.py new file mode 100644 index 000000000..69e3be50d --- /dev/null +++ b/Contents/Libraries/Shared/backports/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/Contents/Libraries/Shared/backports/functools_lru_cache.py b/Contents/Libraries/Shared/backports/functools_lru_cache.py new file mode 100644 index 000000000..e0b19d951 --- /dev/null +++ b/Contents/Libraries/Shared/backports/functools_lru_cache.py @@ -0,0 +1,196 @@ +from __future__ import absolute_import + +import functools +from collections import namedtuple +from threading import RLock + +_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"]) + + +@functools.wraps(functools.update_wrapper) +def update_wrapper( + wrapper, + wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES, +): + """ + Patch two bugs in functools.update_wrapper. + """ + # workaround for http://bugs.python.org/issue3445 + assigned = tuple(attr for attr in assigned if hasattr(wrapped, attr)) + wrapper = functools.update_wrapper(wrapper, wrapped, assigned, updated) + # workaround for https://bugs.python.org/issue17482 + wrapper.__wrapped__ = wrapped + return wrapper + + +class _HashedSeq(list): + __slots__ = 'hashvalue' + + def __init__(self, tup, hash=hash): + self[:] = tup + self.hashvalue = hash(tup) + + def __hash__(self): + return self.hashvalue + + +def _make_key( + args, + kwds, + typed, + kwd_mark=(object(),), + fasttypes=set([int, str, frozenset, type(None)]), + sorted=sorted, + tuple=tuple, + type=type, + len=len, +): + 'Make a cache key from optionally typed positional and keyword arguments' + key = args + if kwds: + sorted_items = sorted(kwds.items()) + key += kwd_mark + for item in sorted_items: + key += item + if typed: + key += tuple(type(v) for v in args) + if kwds: + key += tuple(type(v) for k, v in sorted_items) + elif len(key) == 1 and type(key[0]) in fasttypes: + return key[0] + return _HashedSeq(key) + + +def lru_cache(maxsize=100, typed=False): + """Least-recently-used cache decorator. + + If *maxsize* is set to None, the LRU features are disabled and the cache + can grow without bound. + + If *typed* is True, arguments of different types will be cached separately. + For example, f(3.0) and f(3) will be treated as distinct calls with + distinct results. + + Arguments to the cached function must be hashable. + + View the cache statistics named tuple (hits, misses, maxsize, currsize) with + f.cache_info(). Clear the cache and statistics with f.cache_clear(). + Access the underlying function with f.__wrapped__. + + See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used + + """ + + # Users should only access the lru_cache through its public API: + # cache_info, cache_clear, and f.__wrapped__ + # The internals of the lru_cache are encapsulated for thread safety and + # to allow the implementation to change (including a possible C version). + + def decorating_function(user_function): + + cache = dict() + stats = [0, 0] # make statistics updateable non-locally + HITS, MISSES = 0, 1 # names for the stats fields + make_key = _make_key + cache_get = cache.get # bound method to lookup key or return None + _len = len # localize the global len() function + lock = RLock() # because linkedlist updates aren't threadsafe + root = [] # root of the circular doubly linked list + root[:] = [root, root, None, None] # initialize by pointing to self + nonlocal_root = [root] # make updateable non-locally + PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields + + if maxsize == 0: + + def wrapper(*args, **kwds): + # no caching, just do a statistics update after a successful call + result = user_function(*args, **kwds) + stats[MISSES] += 1 + return result + + elif maxsize is None: + + def wrapper(*args, **kwds): + # simple caching without ordering or size limit + key = make_key(args, kwds, typed) + result = cache_get( + key, root + ) # root used here as a unique not-found sentinel + if result is not root: + stats[HITS] += 1 + return result + result = user_function(*args, **kwds) + cache[key] = result + stats[MISSES] += 1 + return result + + else: + + def wrapper(*args, **kwds): + # size limited caching that tracks accesses by recency + key = make_key(args, kwds, typed) if kwds or typed else args + with lock: + link = cache_get(key) + if link is not None: + # record recent use of the key by moving it + # to the front of the list + root, = nonlocal_root + link_prev, link_next, key, result = link + link_prev[NEXT] = link_next + link_next[PREV] = link_prev + last = root[PREV] + last[NEXT] = root[PREV] = link + link[PREV] = last + link[NEXT] = root + stats[HITS] += 1 + return result + result = user_function(*args, **kwds) + with lock: + root, = nonlocal_root + if key in cache: + # getting here means that this same key was added to the + # cache while the lock was released. since the link + # update is already done, we need only return the + # computed result and update the count of misses. + pass + elif _len(cache) >= maxsize: + # use the old root to store the new key and result + oldroot = root + oldroot[KEY] = key + oldroot[RESULT] = result + # empty the oldest link and make it the new root + root = nonlocal_root[0] = oldroot[NEXT] + oldkey = root[KEY] + root[KEY] = root[RESULT] = None + # now update the cache dictionary for the new links + del cache[oldkey] + cache[key] = oldroot + else: + # put result in a new link at the front of the list + last = root[PREV] + link = [last, root, key, result] + last[NEXT] = root[PREV] = cache[key] = link + stats[MISSES] += 1 + return result + + def cache_info(): + """Report cache statistics""" + with lock: + return _CacheInfo(stats[HITS], stats[MISSES], maxsize, len(cache)) + + def cache_clear(): + """Clear the cache and cache statistics""" + with lock: + cache.clear() + root = nonlocal_root[0] + root[:] = [root, root, None, None] + stats[:] = [0, 0] + + wrapper.__wrapped__ = user_function + wrapper.cache_info = cache_info + wrapper.cache_clear = cache_clear + return update_wrapper(wrapper, user_function) + + return decorating_function diff --git a/Contents/Libraries/Shared/certifi/__init__.py b/Contents/Libraries/Shared/certifi/__init__.py index 556193cef..5d52a62e7 100644 --- a/Contents/Libraries/Shared/certifi/__init__.py +++ b/Contents/Libraries/Shared/certifi/__init__.py @@ -1,3 +1,3 @@ -from .core import where, old_where +from .core import contents, where -__version__ = "2018.01.18" +__version__ = "2020.06.20" diff --git a/Contents/Libraries/Shared/certifi/__main__.py b/Contents/Libraries/Shared/certifi/__main__.py index 5f1da0dd0..8945b5da8 100644 --- a/Contents/Libraries/Shared/certifi/__main__.py +++ b/Contents/Libraries/Shared/certifi/__main__.py @@ -1,2 +1,12 @@ -from certifi import where -print(where()) +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/Contents/Libraries/Shared/certifi/cacert.pem b/Contents/Libraries/Shared/certifi/cacert.pem index 101ac98fa..0fd855f46 100644 --- a/Contents/Libraries/Shared/certifi/cacert.pem +++ b/Contents/Libraries/Shared/certifi/cacert.pem @@ -58,38 +58,6 @@ AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" @@ -152,39 +120,6 @@ ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - # Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. # Label: "Entrust Root Certification Authority" @@ -326,36 +261,6 @@ OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - # Issuer: CN=AAA Certificate Services O=Comodo CA Limited # Subject: CN=AAA Certificate Services O=Comodo CA Limited # Label: "Comodo AAA Services root" @@ -801,36 +706,6 @@ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - # Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. # Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. # Label: "DST Root CA X3" @@ -1249,36 +1124,6 @@ t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc # Label: "Cybertrust Global Root" @@ -1589,47 +1434,6 @@ uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - # Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post # Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post # Label: "Hongkong Post Root CA 1" @@ -2230,6 +2034,45 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + # Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority # Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority # Label: "Hellenic Academic and Research Institutions RootCA 2011" @@ -3483,79 +3326,6 @@ AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ 5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - # Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed # Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed # Label: "OISTE WISeKey Global Root GB CA" @@ -3725,169 +3495,6 @@ lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - # Issuer: CN=ISRG Root X1 O=Internet Security Research Group # Subject: CN=ISRG Root X1 O=Internet Security Research Group # Label: "ISRG Root X1" @@ -4075,47 +3682,6 @@ CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW 1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL -BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV -BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw -MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B -LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F -ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem -hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 -EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn -Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 -zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ -96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m -j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g -DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ -8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j -X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH -hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB -KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 -Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT -+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL -BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 -BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO -jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 -loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c -qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ -2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ -JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre -zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf -LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ -x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 -oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr ------END CERTIFICATE----- - # Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM # Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM # Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" @@ -4431,3 +3997,624 @@ MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/certifi/core.py b/Contents/Libraries/Shared/certifi/core.py index eab9d1d17..5d2b8cd32 100644 --- a/Contents/Libraries/Shared/certifi/core.py +++ b/Contents/Libraries/Shared/certifi/core.py @@ -1,37 +1,60 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- """ certifi.py ~~~~~~~~~~ -This module returns the installation location of cacert.pem. +This module returns the installation location of cacert.pem or its contents. """ import os -import warnings - -class DeprecatedBundleWarning(DeprecationWarning): - """ - The weak security bundle is being deprecated. Please bother your service - provider to get them to stop using cross-signed roots. - """ - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') - - -def old_where(): - warnings.warn( - "The weak security bundle has been removed. certifi.old_where() is now an alias " - "of certifi.where(). Please update your code to use certifi.where() instead. " - "certifi.old_where() will be removed in 2018.", - DeprecatedBundleWarning - ) - return where() - -if __name__ == '__main__': - print(where()) +try: + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where(): + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + +except ImportError: + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text(_module, _path, encoding="ascii"): + with open(where(), "r", encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + +def contents(): + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/Contents/Libraries/Shared/certifi/old_root.pem b/Contents/Libraries/Shared/certifi/old_root.pem deleted file mode 100644 index af30ea711..000000000 --- a/Contents/Libraries/Shared/certifi/old_root.pem +++ /dev/null @@ -1,414 +0,0 @@ -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/certifi/weak.pem b/Contents/Libraries/Shared/certifi/weak.pem deleted file mode 100644 index 4426034f4..000000000 --- a/Contents/Libraries/Shared/certifi/weak.pem +++ /dev/null @@ -1,5019 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. -# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL -BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV -BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw -MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B -LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F -ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem -hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 -EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn -Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 -zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ -96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m -j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g -DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ -8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j -X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH -hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB -KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 -Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT -+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL -BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 -BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO -jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 -loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c -qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ -2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ -JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre -zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf -LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ -x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 -oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/chardet/LICENSE b/Contents/Libraries/Shared/chardet/LICENSE deleted file mode 100644 index 8add30ad5..000000000 --- a/Contents/Libraries/Shared/chardet/LICENSE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/Contents/Libraries/Shared/chardet/README.rst b/Contents/Libraries/Shared/chardet/README.rst deleted file mode 100644 index 7df8f56d5..000000000 --- a/Contents/Libraries/Shared/chardet/README.rst +++ /dev/null @@ -1,46 +0,0 @@ -Chardet: The Universal Character Encoding Detector --------------------------------------------------- - -Detects - - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) - - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) - - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) - - EUC-KR, ISO-2022-KR (Korean) - - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) - - ISO-8859-2, windows-1250 (Hungarian) - - ISO-8859-5, windows-1251 (Bulgarian) - - windows-1252 (English) - - ISO-8859-7, windows-1253 (Greek) - - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) - - TIS-620 (Thai) - -Requires Python 2.6 or later - -Installation ------------- - -Install from `PyPI `_:: - - pip install chardet - - -Command-line Tool ------------------ - -chardet comes with a command-line script which reports on the encodings of one -or more files:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -About ------ - -This is a continuation of Mark Pilgrim's excellent chardet. Previously, two -versions needed to be maintained: one that supported python 2.x and one that -supported python 3.x. We've recently merged with `Ian Cordasco `_'s -`charade `_ fork, so now we have one -coherent version that works for Python 2.6+. - -:maintainer: Dan Blanchard diff --git a/Contents/Libraries/Shared/chardet/__init__.py b/Contents/Libraries/Shared/chardet/__init__.py index 82c2a48d2..0f9f820ef 100644 --- a/Contents/Libraries/Shared/chardet/__init__.py +++ b/Contents/Libraries/Shared/chardet/__init__.py @@ -15,18 +15,25 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -__version__ = "2.3.0" -from sys import version_info +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION -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 +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/Contents/Libraries/Shared/chardet/big5freq.py b/Contents/Libraries/Shared/chardet/big5freq.py index 65bffc04b..38f32517a 100644 --- a/Contents/Libraries/Shared/chardet/big5freq.py +++ b/Contents/Libraries/Shared/chardet/big5freq.py @@ -45,7 +45,7 @@ #Char to FreqOrder table BIG5_TABLE_SIZE = 5376 -Big5CharToFreqOrder = ( +BIG5_CHAR_TO_FREQ_ORDER = ( 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 @@ -381,545 +381,6 @@ 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 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/big5prober.py b/Contents/Libraries/Shared/chardet/big5prober.py index becce81e5..98f997012 100644 --- a/Contents/Libraries/Shared/chardet/big5prober.py +++ b/Contents/Libraries/Shared/chardet/big5prober.py @@ -28,15 +28,20 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel +from .mbcssm import BIG5_SM_MODEL class Big5Prober(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/Contents/Libraries/Shared/chardet/chardistribution.py b/Contents/Libraries/Shared/chardet/chardistribution.py index 4e64a00be..c0395f4a4 100644 --- a/Contents/Libraries/Shared/chardet/chardistribution.py +++ b/Contents/Libraries/Shared/chardet/chardistribution.py @@ -25,82 +25,84 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, 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(object): + 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 + self._char_to_freq_order = None + self._table_size = 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.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = 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 + self._done = False + self._total_chars = 0 # Total characters encountered # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 + self._freq_chars = 0 - def feed(self, aBuf, aCharLen): + def feed(self, char, char_len): """feed a character with known length""" - if aCharLen == 2: + if char_len == 2: # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) + order = self.get_order(char) else: order = -1 if order >= 0: - self._mTotalChars += 1 + self._total_chars += 1 # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 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._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: return r # normalize confidence (we don't want to be 100% sure) - return SURE_YES + return self.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 + return self._total_chars > self.ENOUGH_DATA_THRESHOLD - def get_order(self, aBuf): + def get_order(self, byte_str): # 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 @@ -110,55 +112,55 @@ def get_order(self, aBuf): class EUCTWDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # 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]) + first_char = byte_str[0] if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 + return 94 * (first_char - 0xC4) + byte_str[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 + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # 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]) + first_char = byte_str[0] if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 + return 94 * (first_char - 0xB0) + byte_str[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 + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # 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]) + first_char, second_char = byte_str[0], byte_str[1] if (first_char >= 0xB0) and (second_char >= 0xA1): return 94 * (first_char - 0xB0) + second_char - 0xA1 else: @@ -167,17 +169,17 @@ def get_order(self, aBuf): class Big5DistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # 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]) + first_char, second_char = byte_str[0], byte_str[1] if first_char >= 0xA4: if second_char >= 0xA1: return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 @@ -189,17 +191,17 @@ def get_order(self, aBuf): class SJISDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # 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]) + first_char, second_char = byte_str[0], byte_str[1] if (first_char >= 0x81) and (first_char <= 0x9F): order = 188 * (first_char - 0x81) elif (first_char >= 0xE0) and (first_char <= 0xEF): @@ -214,18 +216,18 @@ def get_order(self, aBuf): class EUCJPDistributionAnalysis(CharDistributionAnalysis): def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - def get_order(self, aBuf): + def get_order(self, byte_str): # 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]) + char = byte_str[0] if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 else: return -1 diff --git a/Contents/Libraries/Shared/chardet/charsetgroupprober.py b/Contents/Libraries/Shared/chardet/charsetgroupprober.py index 85e7a1c67..8b3738efd 100644 --- a/Contents/Libraries/Shared/chardet/charsetgroupprober.py +++ b/Contents/Libraries/Shared/chardet/charsetgroupprober.py @@ -1,11 +1,11 @@ ######################## 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 # @@ -13,94 +13,94 @@ # 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 .enums import ProbingState from .charsetprober import CharSetProber class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: if prober: prober.reset() prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name - def get_charset_name(self): - if not self._mBestGuessProber: + @property + def language(self): + if not self._best_guess_prober: self.get_confidence() - if not self._mBestGuessProber: + if not self._best_guess_prober: return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() + return self._best_guess_prober.language - def feed(self, aBuf): - for prober in self._mProbers: + def feed(self, byte_str): + for prober in self.probers: if not prober: continue if not prober.active: continue - st = prober.feed(aBuf) - if not st: + state = prober.feed(byte_str) + if not state: continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: + state = self.state + if state == ProbingState.FOUND_IT: return 0.99 - elif st == constants.eNotMe: + elif state == ProbingState.NOT_ME: return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: if not prober: continue if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') + self.logger.debug('%s not active', prober.charset_name) 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: + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() + return best_conf diff --git a/Contents/Libraries/Shared/chardet/charsetprober.py b/Contents/Libraries/Shared/chardet/charsetprober.py index 97581712c..eac4e5986 100644 --- a/Contents/Libraries/Shared/chardet/charsetprober.py +++ b/Contents/Libraries/Shared/chardet/charsetprober.py @@ -26,37 +26,120 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from . import constants +import logging import re +from .enums import ProbingState -class CharSetProber: - def __init__(self): - pass + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) def reset(self): - self._mState = constants.eDetecting + self._state = ProbingState.DETECTING - def get_charset_name(self): + @property + def charset_name(self): return None - def feed(self, aBuf): + def feed(self, buf): pass - def get_state(self): - return self._mState + @property + def state(self): + return self._state def get_confidence(self): return 0.0 - def filter_high_bit_only(self, aBuf): - aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) - return aBuf + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 - def filter_without_english_letters(self, aBuf): - aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) - return aBuf + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) - def filter_with_english_letters(self, aBuf): - # TODO - return aBuf + return filtered diff --git a/Contents/Libraries/Shared/chardet/cli/__init__.py b/Contents/Libraries/Shared/chardet/cli/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/Contents/Libraries/Shared/chardet/chardetect.py b/Contents/Libraries/Shared/chardet/cli/chardetect.py similarity index 83% rename from Contents/Libraries/Shared/chardet/chardetect.py rename to Contents/Libraries/Shared/chardet/cli/chardetect.py index ffe892f25..f0a4cc5d7 100644 --- a/Contents/Libraries/Shared/chardet/chardetect.py +++ b/Contents/Libraries/Shared/chardet/cli/chardetect.py @@ -17,9 +17,9 @@ import argparse import sys -from io import open from chardet import __version__ +from chardet.compat import PY2 from chardet.universaldetector import UniversalDetector @@ -35,9 +35,15 @@ def description_of(lines, name='stdin'): """ u = UniversalDetector() for line in lines: + line = bytearray(line) u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break u.close() result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') if result['encoding']: return '{0}: {1} with confidence {2}'.format(name, result['encoding'], result['confidence']) @@ -46,23 +52,22 @@ def description_of(lines, name='stdin'): 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') + encodings") parser.add_argument('input', - help='File whose encoding we would like to determine.', + help='File whose encoding we would like to determine. \ + (default: stdin)', type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin]) + default=[sys.stdin if PY2 else sys.stdin.buffer]) parser.add_argument('--version', action='version', version='%(prog)s {0}'.format(__version__)) args = parser.parse_args(argv) diff --git a/Contents/Libraries/Shared/chardet/codingstatemachine.py b/Contents/Libraries/Shared/chardet/codingstatemachine.py index 8dd8c9179..68fba44f1 100644 --- a/Contents/Libraries/Shared/chardet/codingstatemachine.py +++ b/Contents/Libraries/Shared/chardet/codingstatemachine.py @@ -25,37 +25,64 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .constants import eStart -from .compat import wrap_ord +import logging +from .enums import MachineState -class CodingStateMachine: + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) self.reset() def reset(self): - self._mCurrentState = eStart + self._curr_state = MachineState.START 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 + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state def get_current_charlen(self): - return self._mCurrentCharLen + return self._curr_char_len def get_coding_state_machine(self): - return self._mModel['name'] + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/Contents/Libraries/Shared/chardet/compat.py b/Contents/Libraries/Shared/chardet/compat.py index d9e30addf..ddd74687c 100644 --- a/Contents/Libraries/Shared/chardet/compat.py +++ b/Contents/Libraries/Shared/chardet/compat.py @@ -1,6 +1,7 @@ ######################## BEGIN LICENSE BLOCK ######################## # Contributor(s): -# Ian Cordasco - port to Python +# Dan Blanchard +# Ian Cordasco # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -22,13 +23,12 @@ if sys.version_info < (3, 0): + PY2 = True + PY3 = False base_str = (str, unicode) + text_type = unicode else: + PY2 = False + PY3 = True 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 + text_type = str diff --git a/Contents/Libraries/Shared/chardet/constants.py b/Contents/Libraries/Shared/chardet/constants.py deleted file mode 100644 index e4d148b3c..000000000 --- a/Contents/Libraries/Shared/chardet/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## 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/Contents/Libraries/Shared/chardet/cp949prober.py b/Contents/Libraries/Shared/chardet/cp949prober.py index ff4272f82..efd793abc 100644 --- a/Contents/Libraries/Shared/chardet/cp949prober.py +++ b/Contents/Libraries/Shared/chardet/cp949prober.py @@ -25,20 +25,25 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import CP949SMModel +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL class CP949Prober(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(CP949SMModel) + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) # NOTE: CP949 is a superset of EUC-KR, so the distribution should be # not different. - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.distribution_analyzer = EUCKRDistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "CP949" + + @property + def language(self): + return "Korean" diff --git a/Contents/Libraries/Shared/chardet/enums.py b/Contents/Libraries/Shared/chardet/enums.py new file mode 100644 index 000000000..045120722 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/Contents/Libraries/Shared/chardet/escprober.py b/Contents/Libraries/Shared/chardet/escprober.py index 80a844ff3..c70493f2b 100644 --- a/Contents/Libraries/Shared/chardet/escprober.py +++ b/Contents/Libraries/Shared/chardet/escprober.py @@ -25,62 +25,77 @@ # 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 +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None self.reset() def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset - def get_charset_name(self): - return self._mDetectedCharset + @property + def language(self): + return self._detected_language def get_confidence(self): - if self._mDetectedCharset: + if self._detected_charset: 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: + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.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() + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state - return self.get_state() + return self.state diff --git a/Contents/Libraries/Shared/chardet/escsm.py b/Contents/Libraries/Shared/chardet/escsm.py index bd302b4c6..0069523a0 100644 --- a/Contents/Libraries/Shared/chardet/escsm.py +++ b/Contents/Libraries/Shared/chardet/escsm.py @@ -25,9 +25,9 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .constants import eStart, eError, eItsMe +from .enums import MachineState -HZ_cls = ( +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 @@ -62,24 +62,25 @@ 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 +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f ) -HZCharLenTable = (0, 0, 0, 0, 0, 0) +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} -ISO2022CN_cls = ( +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 @@ -114,26 +115,27 @@ 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 +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f ) -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} -ISO2022JP_cls = ( +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 @@ -168,27 +170,28 @@ 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 +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 ) -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) +ISO2022JP_CHAR_LEN_TABLE = (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"} +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} -ISO2022KR_cls = ( +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 @@ -223,20 +226,21 @@ 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 +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 ) -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/eucjpprober.py b/Contents/Libraries/Shared/chardet/eucjpprober.py index 8e64fdcc2..20ce8f7d1 100644 --- a/Contents/Libraries/Shared/chardet/eucjpprober.py +++ b/Contents/Libraries/Shared/chardet/eucjpprober.py @@ -25,66 +25,68 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys -from . import constants +from .enums import ProbingState, MachineState from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCJPDistributionAnalysis from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel +from .mbcssm import EUCJP_SM_MODEL class EUCJPProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() self.reset() def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() + super(EUCJPProber, self).reset() + self.context_analyzer.reset() - def get_charset_name(self): + @property + def 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 + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) - self._mLastChar[0] = aBuf[aLen - 1] + self._last_char[0] = byte_str[-1] - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Contents/Libraries/Shared/chardet/euckrfreq.py b/Contents/Libraries/Shared/chardet/euckrfreq.py index a179e4c21..b68078cb9 100644 --- a/Contents/Libraries/Shared/chardet/euckrfreq.py +++ b/Contents/Libraries/Shared/chardet/euckrfreq.py @@ -13,12 +13,12 @@ # 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 @@ -35,15 +35,15 @@ # # Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 # Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio +# +# Typical Distribution Ratio EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 EUCKR_TABLE_SIZE = 2352 -# Char to FreqOrder table , -EUCKRCharToFreqOrder = ( \ +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( 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, @@ -191,406 +191,5 @@ 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/Contents/Libraries/Shared/chardet/euckrprober.py b/Contents/Libraries/Shared/chardet/euckrprober.py index 5982a46b6..345a060d0 100644 --- a/Contents/Libraries/Shared/chardet/euckrprober.py +++ b/Contents/Libraries/Shared/chardet/euckrprober.py @@ -28,15 +28,20 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel +from .mbcssm import EUCKR_SM_MODEL class EUCKRProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/Contents/Libraries/Shared/chardet/euctwfreq.py b/Contents/Libraries/Shared/chardet/euctwfreq.py index 576e7504d..ed7a995a3 100644 --- a/Contents/Libraries/Shared/chardet/euctwfreq.py +++ b/Contents/Libraries/Shared/chardet/euctwfreq.py @@ -44,385 +44,344 @@ EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 # Char to FreqOrder table , -EUCTW_TABLE_SIZE = 8102 +EUCTW_TABLE_SIZE = 5376 -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 +EUCTW_CHAR_TO_FREQ_ORDER = ( + 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 +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/euctwprober.py b/Contents/Libraries/Shared/chardet/euctwprober.py index fe652fe37..35669cc4d 100644 --- a/Contents/Libraries/Shared/chardet/euctwprober.py +++ b/Contents/Libraries/Shared/chardet/euctwprober.py @@ -13,12 +13,12 @@ # 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 @@ -28,14 +28,19 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel +from .mbcssm import EUCTW_SM_MODEL class EUCTWProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/Contents/Libraries/Shared/chardet/gb2312freq.py b/Contents/Libraries/Shared/chardet/gb2312freq.py index 1238f510f..697837bd9 100644 --- a/Contents/Libraries/Shared/chardet/gb2312freq.py +++ b/Contents/Libraries/Shared/chardet/gb2312freq.py @@ -43,7 +43,7 @@ GB2312_TABLE_SIZE = 3760 -GB2312CharToFreqOrder = ( +GB2312_CHAR_TO_FREQ_ORDER = ( 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, @@ -278,195 +278,6 @@ 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) + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/gb2312prober.py b/Contents/Libraries/Shared/chardet/gb2312prober.py index 0325a2d86..8446d2dd9 100644 --- a/Contents/Libraries/Shared/chardet/gb2312prober.py +++ b/Contents/Libraries/Shared/chardet/gb2312prober.py @@ -13,12 +13,12 @@ # 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 @@ -28,14 +28,19 @@ from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel +from .mbcssm import GB2312_SM_MODEL class GB2312Prober(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() self.reset() - def get_charset_name(self): + @property + def charset_name(self): return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/Contents/Libraries/Shared/chardet/hebrewprober.py b/Contents/Libraries/Shared/chardet/hebrewprober.py index ba225c5ef..b0e1bf492 100644 --- a/Contents/Libraries/Shared/chardet/hebrewprober.py +++ b/Contents/Libraries/Shared/chardet/hebrewprober.py @@ -26,8 +26,7 @@ ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord +from .enums import ProbingState # This prober doesn't actually recognize a language or a charset. # It is a helper prober for the use of the Hebrew model probers @@ -126,56 +125,59 @@ # 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 +class HebrewProber(CharSetProber): + # 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 model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 + # 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 -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" + # 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 + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None self.reset() def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 + self._final_char_logical_score = 0 + self._final_char_visual_score = 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 = ' ' + self._prev = ' ' + self._before_prev = ' ' # These probers are owned by the group prober. def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber + self._logical_prober = logicalProber + self._visual_prober = visualProber def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] def is_non_final(self, c): # The normal Tsadi is not a good Non-Final letter due to words like @@ -188,9 +190,10 @@ def is_non_final(self, c): # 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] + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] - def feed(self, aBuf): + def feed(self, byte_str): # Final letter analysis for logical-visual decision. # Look for evidence that the received buffer is either logical Hebrew # or visual Hebrew. @@ -217,67 +220,73 @@ def feed(self, aBuf): # 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: + if self.state == ProbingState.NOT_ME: # Both model probers say it's not them. No reason to continue. - return eNotMe + return ProbingState.NOT_ME - aBuf = self.filter_high_bit_only(aBuf) + byte_str = self.filter_high_byte_only(byte_str) - for cur in aBuf: + for cur in byte_str: 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 + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a # 1 letter word - if self.is_final(self._mPrev): + if self.is_final(self._prev): # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): # case (2) [-2:not space][-1:Non-Final letter][ # cur:space] - self._mFinalCharVisualScore += 1 + self._final_char_visual_score += 1 else: # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING - def get_charset_name(self): + @property + def 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 + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.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 + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.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 + return self.VISUAL_HEBREW_NAME # (finalsub > 0 - Logical) or (don't know what to do) default to # Logical. - return LOGICAL_HEBREW_NAME + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' - def get_state(self): + @property + def 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 + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/Contents/Libraries/Shared/chardet/jisfreq.py b/Contents/Libraries/Shared/chardet/jisfreq.py index 064345b08..83fc082b5 100644 --- a/Contents/Libraries/Shared/chardet/jisfreq.py +++ b/Contents/Libraries/Shared/chardet/jisfreq.py @@ -46,7 +46,7 @@ # Char to FreqOrder table , JIS_TABLE_SIZE = 4368 -JISCharToFreqOrder = ( +JIS_CHAR_TO_FREQ_ORDER = ( 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 @@ -320,250 +320,6 @@ 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/Contents/Libraries/Shared/chardet/jpcntx.py b/Contents/Libraries/Shared/chardet/jpcntx.py index 59aeb6a87..20044e4bc 100644 --- a/Contents/Libraries/Shared/chardet/jpcntx.py +++ b/Contents/Libraries/Shared/chardet/jpcntx.py @@ -25,13 +25,6 @@ # 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 = ( @@ -120,24 +113,35 @@ (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: +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None 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 + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.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 + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char # If this flag is set to True, detection is done and conclusion has # been made - self._mDone = False + self._done = False - def feed(self, aBuf, aLen): - if self._mDone: + def feed(self, byte_str, num_bytes): + if self._done: return # The buffer we got is byte oriented, and a character may span in more than one @@ -147,81 +151,83 @@ def feed(self, aBuf, aLen): # 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 + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD + return self._total_rel > self.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 + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel else: - return DONT_KNOW + return self.DONT_KNOW - def get_order(self, aBuf): + def get_order(self, byte_str): return -1, 1 class SJISContextAnalysis(JapaneseContextAnalysis): def __init__(self): - self.charset_name = "SHIFT_JIS" + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" - def get_charset_name(self): - return self.charset_name + @property + def charset_name(self): + return self._charset_name - def get_order(self, aBuf): - if not aBuf: + def get_order(self, byte_str): + if not byte_str: 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 + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self.charset_name = "CP932" + self._charset_name = "CP932" else: - charLen = 1 + char_len = 1 # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) + if len(byte_str) > 1: + second_char = byte_str[1] if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen + return second_char - 0x9F, char_len - return -1, charLen + return -1, char_len class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: + def get_order(self, byte_str): + if not byte_str: return -1, 1 # find out current char's byte length - first_char = wrap_ord(aBuf[0]) + first_char = byte_str[0] if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 + char_len = 2 elif first_char == 0x8F: - charLen = 3 + char_len = 3 else: - charLen = 1 + char_len = 1 # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) + if len(byte_str) > 1: + second_char = byte_str[1] if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen + return second_char - 0xA1, char_len + + return -1, char_len - return -1, charLen -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langbulgarianmodel.py b/Contents/Libraries/Shared/chardet/langbulgarianmodel.py index e5788fc64..2aa4fb2e2 100644 --- a/Contents/Libraries/Shared/chardet/langbulgarianmodel.py +++ b/Contents/Libraries/Shared/chardet/langbulgarianmodel.py @@ -210,20 +210,19 @@ ) Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', } Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', } - - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langcyrillicmodel.py b/Contents/Libraries/Shared/chardet/langcyrillicmodel.py index a86f54bd5..e5f9a1fd1 100644 --- a/Contents/Libraries/Shared/chardet/langcyrillicmodel.py +++ b/Contents/Libraries/Shared/chardet/langcyrillicmodel.py @@ -27,7 +27,7 @@ # KOI8-R language model # Character Mapping Table: -KOI8R_CharToOrderMap = ( +KOI8R_char_to_order_map = ( 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 @@ -46,7 +46,7 @@ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 ) -win1251_CharToOrderMap = ( +win1251_char_to_order_map = ( 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 @@ -65,7 +65,7 @@ 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, ) -latin5_CharToOrderMap = ( +latin5_char_to_order_map = ( 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 @@ -84,7 +84,7 @@ 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, ) -macCyrillic_CharToOrderMap = ( +macCyrillic_char_to_order_map = ( 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 @@ -103,7 +103,7 @@ 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, ) -IBM855_CharToOrderMap = ( +IBM855_char_to_order_map = ( 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 @@ -122,7 +122,7 @@ 250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, ) -IBM866_CharToOrderMap = ( +IBM866_char_to_order_map = ( 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 @@ -279,51 +279,55 @@ ) Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', } Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', } Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', } MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', } Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langgreekmodel.py b/Contents/Libraries/Shared/chardet/langgreekmodel.py index ddb583765..533222166 100644 --- a/Contents/Libraries/Shared/chardet/langgreekmodel.py +++ b/Contents/Libraries/Shared/chardet/langgreekmodel.py @@ -31,7 +31,7 @@ # 252: 0 - 9 # Character Mapping Table: -Latin7_CharToOrderMap = ( +Latin7_char_to_order_map = ( 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 @@ -50,7 +50,7 @@ 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 ) -win1253_CharToOrderMap = ( +win1253_char_to_order_map = ( 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 @@ -207,19 +207,19 @@ ) Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', } Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langhebrewmodel.py b/Contents/Libraries/Shared/chardet/langhebrewmodel.py index 75f2bc7fe..58f4c875e 100644 --- a/Contents/Libraries/Shared/chardet/langhebrewmodel.py +++ b/Contents/Libraries/Shared/chardet/langhebrewmodel.py @@ -34,7 +34,7 @@ # Windows-1255 language model # Character Mapping Table: -win1255_CharToOrderMap = ( +WIN1255_CHAR_TO_ORDER_MAP = ( 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 @@ -59,7 +59,7 @@ # first 1024 sequences: 1.5981% # rest sequences: 0.087% # negative sequences: 0.0015% -HebrewLangModel = ( +HEBREW_LANG_MODEL = ( 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, @@ -191,11 +191,10 @@ ) Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langhungarianmodel.py b/Contents/Libraries/Shared/chardet/langhungarianmodel.py index 49d2f0fe7..bb7c095e1 100644 --- a/Contents/Libraries/Shared/chardet/langhungarianmodel.py +++ b/Contents/Libraries/Shared/chardet/langhungarianmodel.py @@ -207,19 +207,19 @@ ) Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', } Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langthaimodel.py b/Contents/Libraries/Shared/chardet/langthaimodel.py index 0508b1b1a..15f94c2df 100644 --- a/Contents/Libraries/Shared/chardet/langthaimodel.py +++ b/Contents/Libraries/Shared/chardet/langthaimodel.py @@ -190,11 +190,10 @@ ) TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', } - -# flake8: noqa diff --git a/Contents/Libraries/Shared/chardet/langturkishmodel.py b/Contents/Libraries/Shared/chardet/langturkishmodel.py new file mode 100644 index 000000000..a427a4573 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## 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 +# Özgür Baskın - Turkish Language Model +# +# 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: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,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,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,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,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,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,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,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,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,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, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,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, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,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, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,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, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,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,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,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,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,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, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,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,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,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,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,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,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,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,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,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,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,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,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,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, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,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,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,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,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,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,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/Contents/Libraries/Shared/chardet/latin1prober.py b/Contents/Libraries/Shared/chardet/latin1prober.py index eef357354..7d1e8c20f 100644 --- a/Contents/Libraries/Shared/chardet/latin1prober.py +++ b/Contents/Libraries/Shared/chardet/latin1prober.py @@ -27,8 +27,7 @@ ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord +from .enums import ProbingState FREQ_CAT_NUM = 4 @@ -82,7 +81,7 @@ # 2 : normal # 3 : very likely Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO +# 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 @@ -96,40 +95,47 @@ class Latin1Prober(CharSetProber): def __init__(self): - CharSetProber.__init__(self) + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None self.reset() def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM CharSetProber.reset(self) - def get_charset_name(self): - return "windows-1252" + @property + def charset_name(self): + return "ISO-8859-1" - 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] + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] if freq == 0: - self._mState = eNotMe + self._state = ProbingState.NOT_ME break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass + self._freq_counter[freq] += 1 + self._last_char_class = char_class - return self.get_state() + return self.state def get_confidence(self): - if self.get_state() == eNotMe: + if self.state == ProbingState.NOT_ME: return 0.01 - total = sum(self._mFreqCounter) + total = sum(self._freq_counter) if total < 0.01: confidence = 0.0 else: - confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0) + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) / total) if confidence < 0.0: confidence = 0.0 diff --git a/Contents/Libraries/Shared/chardet/mbcharsetprober.py b/Contents/Libraries/Shared/chardet/mbcharsetprober.py index bb42f2fb5..6256ecfd1 100644 --- a/Contents/Libraries/Shared/chardet/mbcharsetprober.py +++ b/Contents/Libraries/Shared/chardet/mbcharsetprober.py @@ -27,60 +27,65 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -import sys -from . import constants from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError - def get_charset_name(self): - pass + @property + def language(self): + raise NotImplementedError - 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 + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) - self._mLastChar[0] = aBuf[aLen - 1] + self._last_char[0] = byte_str[-1] - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() + return self.distribution_analyzer.get_confidence() diff --git a/Contents/Libraries/Shared/chardet/mbcsgroupprober.py b/Contents/Libraries/Shared/chardet/mbcsgroupprober.py index 03c9dcf3e..530abe75e 100644 --- a/Contents/Libraries/Shared/chardet/mbcsgroupprober.py +++ b/Contents/Libraries/Shared/chardet/mbcsgroupprober.py @@ -39,9 +39,9 @@ class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ UTF8Prober(), SJISProber(), EUCJPProber(), diff --git a/Contents/Libraries/Shared/chardet/mbcssm.py b/Contents/Libraries/Shared/chardet/mbcssm.py index efe678ca0..8360d0f28 100644 --- a/Contents/Libraries/Shared/chardet/mbcssm.py +++ b/Contents/Libraries/Shared/chardet/mbcssm.py @@ -25,11 +25,11 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from .constants import eStart, eError, eItsMe +from .enums import MachineState # BIG5 -BIG5_cls = ( +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 @@ -64,23 +64,23 @@ 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 +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 ) -Big5CharLenTable = (0, 1, 1, 2, 0) +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} # CP949 -CP949_cls = ( +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 @@ -99,28 +99,28 @@ 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff ) -CP949_st = ( +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 + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 ) -CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) -CP949SMModel = {'classTable': CP949_cls, - 'classFactor': 10, - 'stateTable': CP949_st, - 'charLenTable': CP949CharLenTable, - 'name': 'CP949'} +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} # EUC-JP -EUCJP_cls = ( +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 @@ -155,25 +155,25 @@ 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 +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 ) -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} # EUC-KR -EUCKR_cls = ( +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 @@ -208,22 +208,22 @@ 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 +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f ) -EUCKRCharLenTable = (0, 1, 2, 0) +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, 'name': 'EUC-KR'} # EUC-TW -EUCTW_cls = ( +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 @@ -258,26 +258,26 @@ 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 +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f ) -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, 'name': 'x-euc-tw'} # GB2312 -GB2312_cls = ( +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 @@ -312,31 +312,31 @@ 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 +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #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 +# it is used for frequency analysis only, and we are validating # 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) +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} # Shift_JIS -SJIS_cls = ( +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 @@ -373,23 +373,23 @@ 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 +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 ) -SJISCharLenTable = (0, 1, 1, 2, 0, 0) +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, 'name': 'Shift_JIS'} # UCS2-BE -UCS2BE_cls = ( +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 @@ -424,27 +424,27 @@ 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 +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 ) -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} # UCS2-LE -UCS2LE_cls = ( +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 @@ -479,27 +479,27 @@ 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 +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 ) -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, 'name': 'UTF-16LE'} # UTF-8 -UTF8_cls = ( +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 @@ -534,39 +534,39 @@ 12,13,13,13,14,15,0,0 # f8 - ff ) -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 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 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf ) -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) +UTF8_CHAR_LEN_TABLE = (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'} +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/Contents/Libraries/Shared/chardet/sbcharsetprober.py b/Contents/Libraries/Shared/chardet/sbcharsetprober.py index 37291bd27..0adb51de5 100644 --- a/Contents/Libraries/Shared/chardet/sbcharsetprober.py +++ b/Contents/Libraries/Shared/chardet/sbcharsetprober.py @@ -26,95 +26,107 @@ # 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 +from .enums import CharacterCategory, ProbingState, SequenceLikelihood class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed + self._reversed = reversed # Optional auxiliary prober for name decision - self._mNameProber = nameProber + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None self.reset() def reset(self): - CharSetProber.reset(self) + super(SingleByteCharSetProber, self).reset() # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 # characters that fall in our sampling range - self._mFreqChar = 0 + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() + @property + def language(self): + if self._name_prober: + return self._name_prober.language else: - return self._mModel['charsetName'] + return self._model.get('language') - 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] + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][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 + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = 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 + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME - return self.get_state() + return self.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 self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char if r >= 1.0: r = 0.99 return r diff --git a/Contents/Libraries/Shared/chardet/sbcsgroupprober.py b/Contents/Libraries/Shared/chardet/sbcsgroupprober.py index 1b6196cd1..98e95dc1a 100644 --- a/Contents/Libraries/Shared/chardet/sbcsgroupprober.py +++ b/Contents/Libraries/Shared/chardet/sbcsgroupprober.py @@ -33,16 +33,17 @@ Ibm866Model, Ibm855Model) from .langgreekmodel import Latin7GreekModel, Win1253GreekModel from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel from .langthaimodel import TIS620ThaiModel from .langhebrewmodel import Win1255HebrewModel from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel class SBCSGroupProber(CharSetGroupProber): def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ + super(SBCSGroupProber, self).__init__() + self.probers = [ SingleByteCharSetProber(Win1251CyrillicModel), SingleByteCharSetProber(Koi8rModel), SingleByteCharSetProber(Latin5CyrillicModel), @@ -53,17 +54,20 @@ def __init__(self): SingleByteCharSetProber(Win1253GreekModel), SingleByteCharSetProber(Latin5BulgarianModel), SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) self.reset() diff --git a/Contents/Libraries/Shared/chardet/sjisprober.py b/Contents/Libraries/Shared/chardet/sjisprober.py index cd0e9e707..9e29623bd 100644 --- a/Contents/Libraries/Shared/chardet/sjisprober.py +++ b/Contents/Libraries/Shared/chardet/sjisprober.py @@ -25,67 +25,68 @@ # 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 +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState class SJISProber(MultiByteCharSetProber): def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() self.reset() def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() + super(SJISProber, self).reset() + self.context_analyzer.reset() - def get_charset_name(self): - return self._mContextAnalyzer.get_charset_name() + @property + def charset_name(self): + return self.context_analyzer.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 + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() + elif coding_state == MachineState.START: + char_len = self.coding_sm.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) + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) - self._mLastChar[0] = aBuf[aLen - 1] + self._last_char[0] = byte_str[-1] - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/Contents/Libraries/Shared/chardet/universaldetector.py b/Contents/Libraries/Shared/chardet/universaldetector.py index 476522b99..7b4e92d61 100644 --- a/Contents/Libraries/Shared/chardet/universaldetector.py +++ b/Contents/Libraries/Shared/chardet/universaldetector.py @@ -25,146 +25,262 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + -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 logging import re -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None self.reset() def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} 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: + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: prober.reset() - def feed(self, aBuf): + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ if self.done: return - aLen = len(aBuf) - if not aLen: + if not len(byte_str): return - if not self._mGotData: + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM_UTF8: + if byte_str.startswith(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: + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): # 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': + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(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': + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(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: + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): # 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.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] - 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()} + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} 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()} + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} self.done = True break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return + return self.result self.done = True - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result + if not self._got_data: + self.logger.debug('no data received!') - 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: + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: if not prober: continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/Contents/Libraries/Shared/chardet/utf8prober.py b/Contents/Libraries/Shared/chardet/utf8prober.py index 1c0bb5d8f..6c3196cc2 100644 --- a/Contents/Libraries/Shared/chardet/utf8prober.py +++ b/Contents/Libraries/Shared/chardet/utf8prober.py @@ -25,52 +25,58 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -from . import constants from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel +from .mbcssm import UTF8_SM_MODEL -ONE_CHAR_PROB = 0.5 class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None self.reset() def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 - def get_charset_name(self): + @property + def 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 + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT - return self.get_state() + return self.state def get_confidence(self): unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars return 1.0 - unlike else: return unlike diff --git a/Contents/Libraries/Shared/chardet/version.py b/Contents/Libraries/Shared/chardet/version.py new file mode 100644 index 000000000..bb2a34a70 --- /dev/null +++ b/Contents/Libraries/Shared/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/Contents/Libraries/Shared/cloudscraper/__init__.py b/Contents/Libraries/Shared/cloudscraper/__init__.py new file mode 100644 index 000000000..04b6e714d --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/__init__.py @@ -0,0 +1,311 @@ +import logging +import re +import sys +import ssl + +from copy import deepcopy +from time import sleep +from collections import OrderedDict + +from requests.sessions import Session +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.ssl_ import create_urllib3_context + +from .interpreters import JavaScriptInterpreter +from .user_agent import User_Agent + +try: + from requests_toolbelt.utils import dump +except ImportError: + pass + +try: + import brotli +except ImportError: + pass + +try: + from urlparse import urlparse + from urlparse import urlunparse +except ImportError: + from urllib.parse import urlparse + from urllib.parse import urlunparse + +########################################################################################################################################################## + +__version__ = '1.1.9' + +BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' + +########################################################################################################################################################## + + +class CipherSuiteAdapter(HTTPAdapter): + + def __init__(self, cipherSuite=None, **kwargs): + self.cipherSuite = cipherSuite + + if hasattr(ssl, 'PROTOCOL_TLS'): + self.ssl_context = create_urllib3_context( + ssl_version=getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2), + ciphers=self.cipherSuite + ) + else: + self.ssl_context = create_urllib3_context(ssl_version=ssl.PROTOCOL_TLSv1) + + super(CipherSuiteAdapter, self).__init__(**kwargs) + + ########################################################################################################################################################## + + def init_poolmanager(self, *args, **kwargs): + kwargs['ssl_context'] = self.ssl_context + return super(CipherSuiteAdapter, self).init_poolmanager(*args, **kwargs) + + ########################################################################################################################################################## + + def proxy_manager_for(self, *args, **kwargs): + kwargs['ssl_context'] = self.ssl_context + return super(CipherSuiteAdapter, self).proxy_manager_for(*args, **kwargs) + +########################################################################################################################################################## + + +class CloudScraper(Session): + def __init__(self, *args, **kwargs): + self.debug = kwargs.pop('debug', False) + self.delay = kwargs.pop('delay', None) + self.interpreter = kwargs.pop('interpreter', 'js2py') + self.allow_brotli = kwargs.pop('allow_brotli', True if 'brotli' in sys.modules.keys() else False) + self.cipherSuite = None + + super(CloudScraper, self).__init__(*args, **kwargs) + + if 'requests' in self.headers['User-Agent']: + # Set a random User-Agent if no custom User-Agent has been set + self.headers = User_Agent(allow_brotli=self.allow_brotli).headers + + self.mount('https://', CipherSuiteAdapter(self.loadCipherSuite())) + + ########################################################################################################################################################## + + @staticmethod + def debugRequest(req): + try: + print(dump.dump_all(req).decode('utf-8')) + except: # noqa + pass + + ########################################################################################################################################################## + + def loadCipherSuite(self): + if self.cipherSuite: + return self.cipherSuite + + self.cipherSuite = '' + + if hasattr(ssl, 'PROTOCOL_TLS'): + ciphers = [ + 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-GCM-SHA384', + 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-CHACHA20-POLY1305-SHA256', 'ECDHE-RSA-CHACHA20-POLY1305-SHA256', + 'ECDHE-RSA-AES128-CBC-SHA', 'ECDHE-RSA-AES256-CBC-SHA', 'RSA-AES128-GCM-SHA256', 'RSA-AES256-GCM-SHA384', + 'ECDHE-RSA-AES128-GCM-SHA256', 'RSA-AES256-SHA', '3DES-EDE-CBC' + ] + + if hasattr(ssl, 'PROTOCOL_TLSv1_3'): + ciphers.insert(0, ['GREASE_3A', 'GREASE_6A', 'AES128-GCM-SHA256', 'AES256-GCM-SHA256', 'AES256-GCM-SHA384', 'CHACHA20-POLY1305-SHA256']) + + ctx = ssl.SSLContext(getattr(ssl, 'PROTOCOL_TLSv1_3', ssl.PROTOCOL_TLSv1_2)) + + for cipher in ciphers: + try: + ctx.set_ciphers(cipher) + self.cipherSuite = '{}:{}'.format(self.cipherSuite, cipher).rstrip(':') + except ssl.SSLError: + pass + + return self.cipherSuite + + ########################################################################################################################################################## + + def request(self, method, url, *args, **kwargs): + ourSuper = super(CloudScraper, self) + resp = ourSuper.request(method, url, *args, **kwargs) + + if resp.headers.get('Content-Encoding') == 'br': + if self.allow_brotli and resp._content: + resp._content = brotli.decompress(resp.content) + else: + logging.warning('Brotli content detected, But option is disabled, we will not continue.') + return resp + + # Debug request + if self.debug: + self.debugRequest(resp) + + # Check if Cloudflare anti-bot is on + if self.isChallengeRequest(resp): + if resp.request.method != 'GET': + # Work around if the initial request is not a GET, + # Supersede with a GET then re-request the original METHOD. + self.request('GET', resp.url) + resp = ourSuper.request(method, url, *args, **kwargs) + else: + # Solve Challenge + resp = self.sendChallengeResponse(resp, **kwargs) + + return resp + + ########################################################################################################################################################## + + @staticmethod + def isChallengeRequest(resp): + if resp.headers.get('Server', '').startswith('cloudflare'): + if b'why_captcha' in resp.content or b'/cdn-cgi/l/chk_captcha' in resp.content: + raise ValueError('Captcha') + + return ( + resp.status_code in [429, 503] + and all(s in resp.content for s in [b'jschl_vc', b'jschl_answer']) + ) + + return False + + ########################################################################################################################################################## + + def sendChallengeResponse(self, resp, **original_kwargs): + body = resp.text + + # Cloudflare requires a delay before solving the challenge + if not self.delay: + try: + delay = float(re.search(r'submit\(\);\r?\n\s*},\s*([0-9]+)', body).group(1)) / float(1000) + if isinstance(delay, (int, float)): + self.delay = delay + except: # noqa + pass + + sleep(self.delay) + + parsed_url = urlparse(resp.url) + domain = parsed_url.netloc + submit_url = '{}://{}/cdn-cgi/l/chk_jschl'.format(parsed_url.scheme, domain) + + cloudflare_kwargs = deepcopy(original_kwargs) + + try: + params = OrderedDict() + + s = re.search(r'name="s"\svalue="(?P[^"]+)', body) + if s: + params['s'] = s.group('s_value') + + params.update( + [ + ('jschl_vc', re.search(r'name="jschl_vc" value="(\w+)"', body).group(1)), + ('pass', re.search(r'name="pass" value="(.+?)"', body).group(1)) + ] + ) + + params = cloudflare_kwargs.setdefault('params', params) + + except Exception as e: + raise ValueError('Unable to parse Cloudflare anti-bots page: {} {}'.format(e.message, BUG_REPORT)) + + # Solve the Javascript challenge + params['jschl_answer'] = JavaScriptInterpreter.dynamicImport(self.interpreter).solveChallenge(body, domain) + + # Requests transforms any request into a GET after a redirect, + # so the redirect has to be handled manually here to allow for + # performing other types of requests even as the first request. + + cloudflare_kwargs['allow_redirects'] = False + + redirect = self.request(resp.request.method, submit_url, **cloudflare_kwargs) + redirect_location = urlparse(redirect.headers['Location']) + if not redirect_location.netloc: + redirect_url = urlunparse( + ( + parsed_url.scheme, + domain, + redirect_location.path, + redirect_location.params, + redirect_location.query, + redirect_location.fragment + ) + ) + return self.request(resp.request.method, redirect_url, **original_kwargs) + + return self.request(resp.request.method, redirect.headers['Location'], **original_kwargs) + + ########################################################################################################################################################## + + @classmethod + def create_scraper(cls, sess=None, **kwargs): + """ + Convenience function for creating a ready-to-go CloudScraper object. + """ + scraper = cls(**kwargs) + + if sess: + attrs = ['auth', 'cert', 'cookies', 'headers', 'hooks', 'params', 'proxies', 'data'] + for attr in attrs: + val = getattr(sess, attr, None) + if val: + setattr(scraper, attr, val) + + return scraper + + ########################################################################################################################################################## + + # Functions for integrating cloudscraper with other applications and scripts + @classmethod + def get_tokens(cls, url, **kwargs): + scraper = cls.create_scraper( + debug=kwargs.pop('debug', False), + delay=kwargs.pop('delay', None), + interpreter=kwargs.pop('interpreter', 'js2py'), + allow_brotli=kwargs.pop('allow_brotli', True), + ) + + try: + resp = scraper.get(url, **kwargs) + resp.raise_for_status() + except Exception: + logging.error('"{}" returned an error. Could not collect tokens.'.format(url)) + raise + + domain = urlparse(resp.url).netloc + # noinspection PyUnusedLocal + cookie_domain = None + + for d in scraper.cookies.list_domains(): + if d.startswith('.') and d in ('.{}'.format(domain)): + cookie_domain = d + break + else: + raise ValueError('Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM ("I\'m Under Attack Mode") enabled?') + + return ( + { + '__cfduid': scraper.cookies.get('__cfduid', '', domain=cookie_domain), + 'cf_clearance': scraper.cookies.get('cf_clearance', '', domain=cookie_domain) + }, + scraper.headers['User-Agent'] + ) + + ########################################################################################################################################################## + + @classmethod + def get_cookie_string(cls, url, **kwargs): + """ + Convenience function for building a Cookie HTTP header value. + """ + tokens, user_agent = cls.get_tokens(url, **kwargs) + return '; '.join('='.join(pair) for pair in tokens.items()), user_agent + + +########################################################################################################################################################## + +create_scraper = CloudScraper.create_scraper +get_tokens = CloudScraper.get_tokens +get_cookie_string = CloudScraper.get_cookie_string diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py b/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py new file mode 100644 index 000000000..b6ee8a8a1 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/__init__.py @@ -0,0 +1,89 @@ +import re +import sys +import logging +import abc + +if sys.version_info >= (3, 4): + ABC = abc.ABC # noqa +else: + ABC = abc.ABCMeta('ABC', (), {}) + +########################################################################################################################################################## + +BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' + +########################################################################################################################################################## + +interpreters = {} + + +class JavaScriptInterpreter(ABC): + @abc.abstractmethod + def __init__(self, name): + interpreters[name] = self + + @classmethod + def dynamicImport(cls, name): + if name not in interpreters: + try: + __import__('{}.{}'.format(cls.__module__, name)) + if not isinstance(interpreters.get(name), JavaScriptInterpreter): + raise ImportError('The interpreter was not initialized.') + except ImportError: + logging.error('Unable to load {} interpreter'.format(name)) + raise + + return interpreters[name] + + @abc.abstractmethod + def eval(self, jsEnv, js): + pass + + def solveChallenge(self, body, domain): + try: + js = re.search( + r'setTimeout\(function\(\){\s+(var s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n', + body + ).group(1) + except Exception: + raise ValueError('Unable to identify Cloudflare IUAM Javascript on website. {}'.format(BUG_REPORT)) + + js = re.sub(r'\s{2,}', ' ', js, flags=re.MULTILINE | re.DOTALL).replace('\'; 121\'', '') + js += '\na.value;' + + jsEnv = ''' + String.prototype.italics=function(str) {{return "" + this + "";}}; + var document = {{ + createElement: function () {{ + return {{ firstChild: {{ href: "https://{domain}/" }} }} + }}, + getElementById: function () {{ + return {{"innerHTML": "{innerHTML}"}}; + }} + }}; + ''' + + try: + innerHTML = re.search( + r']*)? id="([^<>]*?)">([^<>]*?)', + body, + re.MULTILINE | re.DOTALL + ) + innerHTML = innerHTML.group(2) if innerHTML else '' + + except: # noqa + logging.error('Error extracting Cloudflare IUAM Javascript. {}'.format(BUG_REPORT)) + raise + + try: + result = self.eval( + re.sub(r'\s{2,}', ' ', jsEnv.format(domain=domain, innerHTML=innerHTML), flags=re.MULTILINE | re.DOTALL), + js + ) + + float(result) + except Exception: + logging.error('Error executing Cloudflare IUAM Javascript. {}'.format(BUG_REPORT)) + raise + + return result diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py b/Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py new file mode 100644 index 000000000..d39104614 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/js2py.py @@ -0,0 +1,32 @@ +from __future__ import absolute_import + +import js2py +import logging +import base64 + +from . import JavaScriptInterpreter + +from .jsunfuck import jsunfuck + + +class ChallengeInterpreter(JavaScriptInterpreter): + + def __init__(self): + super(ChallengeInterpreter, self).__init__('js2py') + + def eval(self, jsEnv, js): + if js2py.eval_js('(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]') == '1': + logging.warning('WARNING - Please upgrade your js2py https://github.com/PiotrDabkowski/Js2Py, applying work around for the meantime.') + js = jsunfuck(js) + + def atob(s): + return base64.b64decode('{}'.format(s)).decode('utf-8') + + js2py.disable_pyimport() + context = js2py.EvalJs({'atob': atob}) + result = context.eval('{}{}'.format(jsEnv, js)) + + return result + + +ChallengeInterpreter() diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py b/Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py new file mode 100644 index 000000000..9b149cc2e --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/jsunfuck.py @@ -0,0 +1,97 @@ +MAPPING = { + 'a': '(false+"")[1]', + 'b': '([]["entries"]()+"")[2]', + 'c': '([]["fill"]+"")[3]', + 'd': '(undefined+"")[2]', + 'e': '(true+"")[3]', + 'f': '(false+"")[0]', + 'g': '(false+[0]+String)[20]', + 'h': '(+(101))["to"+String["name"]](21)[1]', + 'i': '([false]+undefined)[10]', + 'j': '([]["entries"]()+"")[3]', + 'k': '(+(20))["to"+String["name"]](21)', + 'l': '(false+"")[2]', + 'm': '(Number+"")[11]', + 'n': '(undefined+"")[1]', + 'o': '(true+[]["fill"])[10]', + 'p': '(+(211))["to"+String["name"]](31)[1]', + 'q': '(+(212))["to"+String["name"]](31)[1]', + 'r': '(true+"")[1]', + 's': '(false+"")[3]', + 't': '(true+"")[0]', + 'u': '(undefined+"")[0]', + 'v': '(+(31))["to"+String["name"]](32)', + 'w': '(+(32))["to"+String["name"]](33)', + 'x': '(+(101))["to"+String["name"]](34)[1]', + 'y': '(NaN+[Infinity])[10]', + 'z': '(+(35))["to"+String["name"]](36)', + 'A': '(+[]+Array)[10]', + 'B': '(+[]+Boolean)[10]', + 'C': 'Function("return escape")()(("")["italics"]())[2]', + 'D': 'Function("return escape")()([]["fill"])["slice"]("-1")', + 'E': '(RegExp+"")[12]', + 'F': '(+[]+Function)[10]', + 'G': '(false+Function("return Date")()())[30]', + 'I': '(Infinity+"")[0]', + 'M': '(true+Function("return Date")()())[30]', + 'N': '(NaN+"")[0]', + 'O': '(NaN+Function("return{}")())[11]', + 'R': '(+[]+RegExp)[10]', + 'S': '(+[]+String)[10]', + 'T': '(NaN+Function("return Date")()())[30]', + 'U': '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', + ' ': '(NaN+[]["fill"])[11]', + '"': '("")["fontcolor"]()[12]', + '%': 'Function("return escape")()([]["fill"])[21]', + '&': '("")["link"](0+")[10]', + '(': '(undefined+[]["fill"])[22]', + ')': '([0]+false+[]["fill"])[20]', + '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]', + ',': '([]["slice"]["call"](false+"")+"")[1]', + '-': '(+(.+[0000000001])+"")[2]', + '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]', + '/': '(false+[0])["italics"]()[10]', + ':': '(RegExp()+"")[3]', + ';': '("")["link"](")[14]', + '<': '("")["italics"]()[0]', + '=': '("")["fontcolor"]()[11]', + '>': '("")["italics"]()[2]', + '?': '(RegExp()+"")[2]', + '[': '([]["entries"]()+"")[0]', + ']': '([]["entries"]()+"")[22]', + '{': '(true+[]["fill"])[20]', + '}': '([]["fill"]+"")["slice"]("-1")' +} + +SIMPLE = { + 'false': '![]', + 'true': '!![]', + 'undefined': '[][[]]', + 'NaN': '+[![]]', + 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' # +"1e1000" +} + +CONSTRUCTORS = { + 'Array': '[]', + 'Number': '(+[])', + 'String': '([]+[])', + 'Boolean': '(![])', + 'Function': '[]["fill"]', + 'RegExp': 'Function("return/"+false+"/")()' +} + + +def jsunfuck(jsfuckString): + for key in sorted(MAPPING, key=lambda k: len(MAPPING[k]), reverse=True): + if MAPPING.get(key) in jsfuckString: + jsfuckString = jsfuckString.replace(MAPPING.get(key), '"{}"'.format(key)) + + for key in sorted(SIMPLE, key=lambda k: len(SIMPLE[k]), reverse=True): + if SIMPLE.get(key) in jsfuckString: + jsfuckString = jsfuckString.replace(SIMPLE.get(key), '{}'.format(key)) + + # for key in sorted(CONSTRUCTORS, key=lambda k: len(CONSTRUCTORS[k]), reverse=True): + # if CONSTRUCTORS.get(key) in jsfuckString: + # jsfuckString = jsfuckString.replace(CONSTRUCTORS.get(key), '{}'.format(key)) + + return jsfuckString diff --git a/Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py b/Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py new file mode 100644 index 000000000..28a375984 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/interpreters/nodejs.py @@ -0,0 +1,46 @@ +import base64 +import logging +import subprocess + +from . import JavaScriptInterpreter + +########################################################################################################################################################## + +BUG_REPORT = 'Cloudflare may have changed their technique, or there may be a bug in the script.' + +########################################################################################################################################################## + + +class ChallengeInterpreter(JavaScriptInterpreter): + + def __init__(self): + super(ChallengeInterpreter, self).__init__('nodejs') + + def eval(self, jsEnv, js): + try: + js = 'var atob = function(str) {return Buffer.from(str, "base64").toString("binary");};' \ + 'var challenge = atob("%s");' \ + 'var context = {atob: atob};' \ + 'var options = {filename: "iuam-challenge.js", timeout: 4000};' \ + 'var answer = require("vm").runInNewContext(challenge, context, options);' \ + 'process.stdout.write(String(answer));' \ + % base64.b64encode('{}{}'.format(jsEnv, js).encode('UTF-8')).decode('ascii') + + return subprocess.check_output(['node', '-e', js]) + + except OSError as e: + if e.errno == 2: + raise EnvironmentError( + 'Missing Node.js runtime. Node is required and must be in the PATH (check with `node -v`). Your Node binary may be called `nodejs` rather than `node`, ' + 'in which case you may need to run `apt-get install nodejs-legacy` on some Debian-based systems. (Please read the cloudscraper' + ' README\'s Dependencies section: https://github.com/VeNoMouS/cloudscraper#dependencies.' + ) + raise + except Exception: + logging.error('Error executing Cloudflare IUAM Javascript. %s' % BUG_REPORT) + raise + + pass + + +ChallengeInterpreter() diff --git a/Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py b/Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py new file mode 100644 index 000000000..45190fbe4 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/user_agent/__init__.py @@ -0,0 +1,40 @@ +import os +import json +import random +import logging + +from collections import OrderedDict + +########################################################################################################################################################## + + +class User_Agent(): + + ########################################################################################################################################################## + + def __init__(self, *args, **kwargs): + self.headers = None + self.loadUserAgent(*args, **kwargs) + + ########################################################################################################################################################## + + def loadUserAgent(self, *args, **kwargs): + browser = kwargs.pop('browser', 'chrome') + + user_agents = json.load( + open(os.path.join(os.path.dirname(__file__), 'browsers.json'), 'r'), + object_pairs_hook=OrderedDict + ) + + if not user_agents.get(browser): + logging.error('Sorry "{}" browser User-Agent was not found.'.format(browser)) + raise + + user_agent = random.choice(user_agents.get(browser)) + + self.headers = user_agent.get('headers') + self.headers['User-Agent'] = random.choice(user_agent.get('User-Agent')) + + if not kwargs.get('allow_brotli', False): + if 'br' in self.headers['Accept-Encoding']: + self.headers['Accept-Encoding'] = ','.join([encoding for encoding in self.headers['Accept-Encoding'].split(',') if encoding.strip() != 'br']).strip() diff --git a/Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json b/Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json new file mode 100644 index 000000000..c3eab3155 --- /dev/null +++ b/Contents/Libraries/Shared/cloudscraper/user_agent/browsers.json @@ -0,0 +1,336 @@ +{ + "chrome": [ + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.8", + "Accept-Encoding": "gzip, deflate, , br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.8", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "User-Agent": null, + "Upgrade-Insecure-Requests": "1", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", + "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.40 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.28 Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Linux; Android 8.1.0; SM-N960F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 Build/OPD1.170816.010) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; Pixel Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1.1; SM-A530F Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1; Pixel Build/NDE63H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-G955F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-G950F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.0; SM-T825 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0.1; SM-G930F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; Nexus 6 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; XT1092 Build/MPE24.49-18) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0.1; SM-N910C Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0.2; SM-G920F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0; Nexus 6 Build/LRX21O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 9; Pixel 2 Build/PPR1.180610.009) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/KRT16M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4.2; SM-T530 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 4.4.4; SM-N910C Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 9 Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 7.1.1; SM-N950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "en-US,en;q=0.9" + } + }, + { + "User-Agent": [ + "Mozilla/5.0 (Linux; Android 8.1.0; SM-T835 Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Safari/537.36", + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.0; XT1092 Build/LXE22.46-19) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.85 Mobile Safari/537.36" + ], + "headers": { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": null, + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8" + } + } + ] +} diff --git a/Contents/Libraries/Shared/deathbycaptcha.py b/Contents/Libraries/Shared/deathbycaptcha.py new file mode 100644 index 000000000..3c2fafb77 --- /dev/null +++ b/Contents/Libraries/Shared/deathbycaptcha.py @@ -0,0 +1,516 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +"""Death by Captcha HTTP and socket API clients. + +There are two types of Death by Captcha (DBC hereinafter) API: HTTP and +socket ones. Both offer the same functionalily, with the socket API +sporting faster responses and using way less connections. + +To access the socket API, use SocketClient class; for the HTTP API, use +HttpClient class. Both are thread-safe. SocketClient keeps a persistent +connection opened and serializes all API requests sent through it, thus +it is advised to keep a pool of them if you're script is heavily +multithreaded. + +Both SocketClient and HttpClient give you the following methods: + +get_user() + Returns your DBC account details as a dict with the following keys: + + "user": your account numeric ID; if login fails, it will be the only + item with the value of 0; + "rate": your CAPTCHA rate, i.e. how much you will be charged for one + solved CAPTCHA in US cents; + "balance": your DBC account balance in US cents; + "is_banned": flag indicating whether your account is suspended or not. + +get_balance() + Returns your DBC account balance in US cents. + +get_captcha(cid) + Returns an uploaded CAPTCHA details as a dict with the following keys: + + "captcha": the CAPTCHA numeric ID; if no such CAPTCHAs found, it will + be the only item with the value of 0; + "text": the CAPTCHA text, if solved, otherwise None; + "is_correct": flag indicating whether the CAPTCHA was solved correctly + (DBC can detect that in rare cases). + + The only argument `cid` is the CAPTCHA numeric ID. + +get_text(cid) + Returns an uploaded CAPTCHA text (None if not solved). The only argument + `cid` is the CAPTCHA numeric ID. + +report(cid) + Reports an incorrectly solved CAPTCHA. The only argument `cid` is the + CAPTCHA numeric ID. Returns True on success, False otherwise. + +upload(captcha) + Uploads a CAPTCHA. The only argument `captcha` can be either file-like + object (any object with `read` method defined, actually, so StringIO + will do), or CAPTCHA image file name. On successul upload you'll get + the CAPTCHA details dict (see get_captcha() method). + + NOTE: AT THIS POINT THE UPLOADED CAPTCHA IS NOT SOLVED YET! You have + to poll for its status periodically using get_captcha() or get_text() + method until the CAPTCHA is solved and you get the text. + +decode(captcha, timeout=DEFAULT_TIMEOUT) + A convenient method that uploads a CAPTCHA and polls for its status + periodically, but no longer than `timeout` (defaults to 60 seconds). + If solved, you'll get the CAPTCHA details dict (see get_captcha() + method for details). See upload() method for details on `captcha` + argument. + +Visit http://www.deathbycaptcha.com/user/api for updates. + +""" + +import base64 +import binascii +import errno +import imghdr +import random +import os +import select +import socket +import sys +import threading +import time +import urllib +import urllib2 +try: + from json import read as json_decode, write as json_encode +except ImportError: + try: + from json import loads as json_decode, dumps as json_encode + except ImportError: + from simplejson import loads as json_decode, dumps as json_encode + + +# API version and unique software ID +API_VERSION = 'DBC/Python v4.6' + +# Default CAPTCHA timeout and decode() polling interval +DEFAULT_TIMEOUT = 60 +DEFAULT_TOKEN_TIMEOUT = 120 +POLLS_INTERVAL = [1, 1, 2, 3, 2, 2, 3, 2, 2] +DFLT_POLL_INTERVAL = 3 + +# Base HTTP API url +HTTP_BASE_URL = 'http://api.dbcapi.me/api' + +# Preferred HTTP API server's response content type, do not change +HTTP_RESPONSE_TYPE = 'application/json' + +# Socket API server's host & ports range +SOCKET_HOST = 'api.dbcapi.me' +SOCKET_PORTS = range(8123, 8131) + + +def _load_image(captcha): + if hasattr(captcha, 'read'): + img = captcha.read() + elif type(captcha) == bytearray: + img = captcha + else: + img = '' + try: + captcha_file = open(captcha, 'rb') + except Exception: + raise + else: + img = captcha_file.read() + captcha_file.close() + if not len(img): + raise ValueError('CAPTCHA image is empty') + elif imghdr.what(None, img) is None: + raise TypeError('Unknown CAPTCHA image type') + else: + return img + + +class AccessDeniedException(Exception): + pass + + +class Client(object): + + """Death by Captcha API Client.""" + + def __init__(self, username, password): + self.is_verbose = False + self.userpwd = {'username': username, 'password': password} + + def _log(self, cmd, msg=''): + if self.is_verbose: + print '%d %s %s' % (time.time(), cmd, msg.rstrip()) + return self + + def close(self): + pass + + def connect(self): + pass + + def get_user(self): + """Fetch user details -- ID, balance, rate and banned status.""" + raise NotImplementedError() + + def get_balance(self): + """Fetch user balance (in US cents).""" + return self.get_user().get('balance') + + def get_captcha(self, cid): + """Fetch a CAPTCHA details -- ID, text and correctness flag.""" + raise NotImplementedError() + + def get_text(self, cid): + """Fetch a CAPTCHA text.""" + return self.get_captcha(cid).get('text') or None + + def report(self, cid): + """Report a CAPTCHA as incorrectly solved.""" + raise NotImplementedError() + + def upload(self, captcha): + """Upload a CAPTCHA. + + Accepts file names and file-like objects. Returns CAPTCHA details + dict on success. + + """ + raise NotImplementedError() + + def decode(self, captcha=None, timeout=None, **kwargs): + """ + Try to solve a CAPTCHA. + + See Client.upload() for arguments details. + + Uploads a CAPTCHA, polls for its status periodically with arbitrary + timeout (in seconds), returns CAPTCHA details if (correctly) solved. + """ + if not timeout: + if not captcha: + timeout = DEFAULT_TOKEN_TIMEOUT + else: + timeout = DEFAULT_TIMEOUT + + deadline = time.time() + (max(0, timeout) or DEFAULT_TIMEOUT) + uploaded_captcha = self.upload(captcha, **kwargs) + if uploaded_captcha: + intvl_idx = 0 # POLL_INTERVAL index + while deadline > time.time() and not uploaded_captcha.get('text'): + intvl, intvl_idx = self._get_poll_interval(intvl_idx) + time.sleep(intvl) + pulled = self.get_captcha(uploaded_captcha['captcha']) + if pulled['captcha'] == uploaded_captcha['captcha']: + uploaded_captcha = pulled + if uploaded_captcha.get('text') and \ + uploaded_captcha.get('is_correct'): + return uploaded_captcha + + def _get_poll_interval(self, idx): + """Returns poll interval and next index depending on index provided""" + + if len(POLLS_INTERVAL) > idx: + intvl = POLLS_INTERVAL[idx] + else: + intvl = DFLT_POLL_INTERVAL + idx += 1 + + return intvl, idx + + +class HttpClient(Client): + + """Death by Captcha HTTP API client.""" + + def __init__(self, *args): + Client.__init__(self, *args) + self.opener = urllib2.build_opener(urllib2.HTTPRedirectHandler()) + + def _call(self, cmd, payload=None, headers=None): + if headers is None: + headers = {} + headers['Accept'] = HTTP_RESPONSE_TYPE + headers['User-Agent'] = API_VERSION + if hasattr(payload, 'items'): + payload = urllib.urlencode(payload) + self._log('SEND', '%s %d %s' % (cmd, len(payload), payload)) + else: + self._log('SEND', '%s' % cmd) + if payload is not None: + headers['Content-Length'] = len(payload) + try: + response = self.opener.open(urllib2.Request( + HTTP_BASE_URL + '/' + cmd.strip('/'), + data=payload, + headers=headers + )).read() + except urllib2.HTTPError, err: + if 403 == err.code: + raise AccessDeniedException('Access denied, please check' + ' your credentials and/or balance') + elif 400 == err.code or 413 == err.code: + raise ValueError("CAPTCHA was rejected by the service, check" + " if it's a valid image") + elif 503 == err.code: + raise OverflowError("CAPTCHA was rejected due to service" + " overload, try again later") + else: + raise err + else: + self._log('RECV', '%d %s' % (len(response), response)) + try: + return json_decode(response) + except Exception: + raise RuntimeError('Invalid API response') + return {} + + def get_user(self): + return self._call('user', self.userpwd.copy()) or {'user': 0} + + def get_captcha(self, cid): + return self._call('captcha/%d' % cid) or {'captcha': 0} + + def report(self, cid): + return not self._call('captcha/%d/report' % cid, + self.userpwd.copy()).get('is_correct') + + def upload(self, captcha=None, **kwargs): + boundary = binascii.hexlify(os.urandom(16)) + banner = kwargs.get('banner', '') + if banner: + kwargs['banner'] = 'base64:' + base64.b64encode(_load_image(banner)) + body = '\r\n'.join(('\r\n'.join(( + '--%s' % boundary, + 'Content-Disposition: form-data; name="%s"' % k, + 'Content-Type: text/plain', + 'Content-Length: %d' % len(str(v)), + '', + str(v) + ))) for k, v in self.userpwd.items()) + + body += '\r\n'.join(('\r\n'.join(( + '--%s' % boundary, + 'Content-Disposition: form-data; name="%s"' % k, + 'Content-Type: text/plain', + 'Content-Length: %d' % len(str(v)), + '', + str(v) + ))) for k, v in kwargs.items()) + + if captcha: + img = _load_image(captcha) + body += '\r\n'.join(( + '', + '--%s' % boundary, + 'Content-Disposition: form-data; name="captchafile"; ' + 'filename="captcha"', + 'Content-Type: application/octet-stream', + 'Content-Length: %d' % len(img), + '', + img, + '--%s--' % boundary, + '' + )) + + response = self._call('captcha', body, { + 'Content-Type': 'multipart/form-data; boundary="%s"' % boundary + }) or {} + if response.get('captcha'): + return response + + +class SocketClient(Client): + + """Death by Captcha socket API client.""" + + TERMINATOR = '\r\n' + + def __init__(self, *args): + Client.__init__(self, *args) + self.socket_lock = threading.Lock() + self.socket = None + + def close(self): + if self.socket: + self._log('CLOSE') + try: + self.socket.shutdown(socket.SHUT_RDWR) + except socket.error: + pass + finally: + self.socket.close() + self.socket = None + + def connect(self): + if not self.socket: + self._log('CONN') + host = (socket.gethostbyname(SOCKET_HOST), + random.choice(SOCKET_PORTS)) + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.settimeout(0) + try: + self.socket.connect(host) + except socket.error, err: + if (err.args[0] not in + (errno.EAGAIN, errno.EWOULDBLOCK, errno.EINPROGRESS)): + self.close() + raise err + return self.socket + + def __del__(self): + self.close() + + def _sendrecv(self, sock, buf): + self._log('SEND', buf) + fds = [sock] + buf += self.TERMINATOR + response = '' + intvl_idx = 0 + while True: + intvl, intvl_idx = self._get_poll_interval(intvl_idx) + rds, wrs, exs = select.select((not buf and fds) or [], + (buf and fds) or [], + fds, + intvl) + if exs: + raise IOError('select() failed') + try: + if wrs: + while buf: + buf = buf[wrs[0].send(buf):] + elif rds: + while True: + s = rds[0].recv(256) + if not s: + raise IOError('recv(): connection lost') + else: + response += s + except socket.error, err: + if (err.args[0] not in + (errno.EAGAIN, errno.EWOULDBLOCK, errno.EINPROGRESS)): + raise err + if response.endswith(self.TERMINATOR): + self._log('RECV', response) + return response.rstrip(self.TERMINATOR) + raise IOError('send/recv timed out') + + def _call(self, cmd, data=None): + if data is None: + data = {} + data['cmd'] = cmd + data['version'] = API_VERSION + request = json_encode(data) + + response = None + for _ in range(2): + if not self.socket and cmd != 'login': + self._call('login', self.userpwd.copy()) + self.socket_lock.acquire() + try: + sock = self.connect() + response = self._sendrecv(sock, request) + except IOError, err: + sys.stderr.write(str(err) + "\n") + self.close() + except socket.error, err: + sys.stderr.write(str(err) + "\n") + self.close() + raise IOError('Connection refused') + else: + break + finally: + self.socket_lock.release() + + if response is None: + raise IOError('Connection lost or timed out during API request') + + try: + response = json_decode(response) + except Exception: + raise RuntimeError('Invalid API response') + + if not response.get('error'): + return response + + error = response['error'] + if error in ('not-logged-in', 'invalid-credentials'): + raise AccessDeniedException('Access denied, check your credentials') + elif 'banned' == error: + raise AccessDeniedException('Access denied, account is suspended') + elif 'insufficient-funds' == error: + raise AccessDeniedException( + 'CAPTCHA was rejected due to low balance') + elif 'invalid-captcha' == error: + raise ValueError('CAPTCHA is not a valid image') + elif 'service-overload' == error: + raise OverflowError( + 'CAPTCHA was rejected due to service overload, try again later') + else: + self.socket_lock.acquire() + self.close() + self.socket_lock.release() + raise RuntimeError('API server error occured: %s' % error) + + def get_user(self): + return self._call('user') or {'user': 0} + + def get_captcha(self, cid): + return self._call('captcha', {'captcha': cid}) or {'captcha': 0} + + def upload(self, captcha=None, **kwargs): + data = {} + if captcha: + data['captcha'] = base64.b64encode(_load_image(captcha)) + if kwargs: + banner = kwargs.get('banner', '') + if banner: + kwargs['banner'] = base64.b64encode(_load_image(banner)) + data.update(kwargs) + response = self._call('upload', data) + if response.get('captcha'): + uploaded_captcha = dict( + (k, response.get(k)) + for k in ('captcha', 'text', 'is_correct') + ) + if not uploaded_captcha['text']: + uploaded_captcha['text'] = None + return uploaded_captcha + + def report(self, cid): + return not self._call('report', {'captcha': cid}).get('is_correct') + + +if '__main__' == __name__: + # Put your DBC username & password here: + # client = HttpClient(sys.argv[1], sys.argv[2]) + client = SocketClient(sys.argv[1], sys.argv[2]) + client.is_verbose = True + + print 'Your balance is %s US cents' % client.get_balance() + + for fn in sys.argv[3:]: + try: + # Put your CAPTCHA image file name or file-like object, and optional + # solving timeout (in seconds) here: + captcha = client.decode(fn, DEFAULT_TIMEOUT) + except Exception, e: + sys.stderr.write('Failed uploading CAPTCHA: %s\n' % (e, )) + captcha = None + + if captcha: + print 'CAPTCHA %d solved: %s' % \ + (captcha['captcha'], captcha['text']) + + # Report as incorrectly solved if needed. Make sure the CAPTCHA was + # in fact incorrectly solved! + # try: + # client.report(captcha['captcha']) + # except Exception, e: + # sys.stderr.write('Failed reporting CAPTCHA: %s\n' % (e, )) diff --git a/Contents/Libraries/Shared/dns/__init__.py b/Contents/Libraries/Shared/dns/__init__.py new file mode 100644 index 000000000..c848e4858 --- /dev/null +++ b/Contents/Libraries/Shared/dns/__init__.py @@ -0,0 +1,54 @@ +# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""dnspython DNS toolkit""" + +__all__ = [ + 'dnssec', + 'e164', + 'edns', + 'entropy', + 'exception', + 'flags', + 'hash', + 'inet', + 'ipv4', + 'ipv6', + 'message', + 'name', + 'namedict', + 'node', + 'opcode', + 'query', + 'rcode', + 'rdata', + 'rdataclass', + 'rdataset', + 'rdatatype', + 'renderer', + 'resolver', + 'reversename', + 'rrset', + 'set', + 'tokenizer', + 'tsig', + 'tsigkeyring', + 'ttl', + 'rdtypes', + 'update', + 'version', + 'wiredata', + 'zone', +] diff --git a/Contents/Libraries/Shared/dns/_compat.py b/Contents/Libraries/Shared/dns/_compat.py new file mode 100644 index 000000000..956f9a133 --- /dev/null +++ b/Contents/Libraries/Shared/dns/_compat.py @@ -0,0 +1,47 @@ +import sys +import decimal +from decimal import Context + +if sys.version_info > (3,): + long = int + xrange = range +else: + long = long # pylint: disable=long-builtin + xrange = xrange # pylint: disable=xrange-builtin + +# unicode / binary types +if sys.version_info > (3,): + text_type = str + binary_type = bytes + string_types = (str,) + unichr = chr + def maybe_decode(x): + return x.decode() + def maybe_encode(x): + return x.encode() +else: + text_type = unicode # pylint: disable=unicode-builtin, undefined-variable + binary_type = str + string_types = ( + basestring, # pylint: disable=basestring-builtin, undefined-variable + ) + unichr = unichr # pylint: disable=unichr-builtin + def maybe_decode(x): + return x + def maybe_encode(x): + return x + + +def round_py2_compat(what): + """ + Python 2 and Python 3 use different rounding strategies in round(). This + function ensures that results are python2/3 compatible and backward + compatible with previous py2 releases + :param what: float + :return: rounded long + """ + d = Context( + prec=len(str(long(what))), # round to integer with max precision + rounding=decimal.ROUND_HALF_UP + ).create_decimal(str(what)) # str(): python 2.6 compat + return long(d) diff --git a/Contents/Libraries/Shared/dns/dnssec.py b/Contents/Libraries/Shared/dns/dnssec.py new file mode 100644 index 000000000..fec12082c --- /dev/null +++ b/Contents/Libraries/Shared/dns/dnssec.py @@ -0,0 +1,457 @@ +# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Common DNSSEC-related functions and constants.""" + +from io import BytesIO +import struct +import time + +import dns.exception +import dns.hash +import dns.name +import dns.node +import dns.rdataset +import dns.rdata +import dns.rdatatype +import dns.rdataclass +from ._compat import string_types + + +class UnsupportedAlgorithm(dns.exception.DNSException): + + """The DNSSEC algorithm is not supported.""" + + +class ValidationFailure(dns.exception.DNSException): + + """The DNSSEC signature is invalid.""" + +RSAMD5 = 1 +DH = 2 +DSA = 3 +ECC = 4 +RSASHA1 = 5 +DSANSEC3SHA1 = 6 +RSASHA1NSEC3SHA1 = 7 +RSASHA256 = 8 +RSASHA512 = 10 +ECDSAP256SHA256 = 13 +ECDSAP384SHA384 = 14 +INDIRECT = 252 +PRIVATEDNS = 253 +PRIVATEOID = 254 + +_algorithm_by_text = { + 'RSAMD5': RSAMD5, + 'DH': DH, + 'DSA': DSA, + 'ECC': ECC, + 'RSASHA1': RSASHA1, + 'DSANSEC3SHA1': DSANSEC3SHA1, + 'RSASHA1NSEC3SHA1': RSASHA1NSEC3SHA1, + 'RSASHA256': RSASHA256, + 'RSASHA512': RSASHA512, + 'INDIRECT': INDIRECT, + 'ECDSAP256SHA256': ECDSAP256SHA256, + 'ECDSAP384SHA384': ECDSAP384SHA384, + 'PRIVATEDNS': PRIVATEDNS, + 'PRIVATEOID': PRIVATEOID, +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_algorithm_by_value = dict((y, x) for x, y in _algorithm_by_text.items()) + + +def algorithm_from_text(text): + """Convert text into a DNSSEC algorithm value + @rtype: int""" + + value = _algorithm_by_text.get(text.upper()) + if value is None: + value = int(text) + return value + + +def algorithm_to_text(value): + """Convert a DNSSEC algorithm value to text + @rtype: string""" + + text = _algorithm_by_value.get(value) + if text is None: + text = str(value) + return text + + +def _to_rdata(record, origin): + s = BytesIO() + record.to_wire(s, origin=origin) + return s.getvalue() + + +def key_id(key, origin=None): + rdata = _to_rdata(key, origin) + rdata = bytearray(rdata) + if key.algorithm == RSAMD5: + return (rdata[-3] << 8) + rdata[-2] + else: + total = 0 + for i in range(len(rdata) // 2): + total += (rdata[2 * i] << 8) + \ + rdata[2 * i + 1] + if len(rdata) % 2 != 0: + total += rdata[len(rdata) - 1] << 8 + total += ((total >> 16) & 0xffff) + return total & 0xffff + + +def make_ds(name, key, algorithm, origin=None): + if algorithm.upper() == 'SHA1': + dsalg = 1 + hash = dns.hash.hashes['SHA1']() + elif algorithm.upper() == 'SHA256': + dsalg = 2 + hash = dns.hash.hashes['SHA256']() + else: + raise UnsupportedAlgorithm('unsupported algorithm "%s"' % algorithm) + + if isinstance(name, string_types): + name = dns.name.from_text(name, origin) + hash.update(name.canonicalize().to_wire()) + hash.update(_to_rdata(key, origin)) + digest = hash.digest() + + dsrdata = struct.pack("!HBB", key_id(key), key.algorithm, dsalg) + digest + return dns.rdata.from_wire(dns.rdataclass.IN, dns.rdatatype.DS, dsrdata, 0, + len(dsrdata)) + + +def _find_candidate_keys(keys, rrsig): + candidate_keys = [] + value = keys.get(rrsig.signer) + if value is None: + return None + if isinstance(value, dns.node.Node): + try: + rdataset = value.find_rdataset(dns.rdataclass.IN, + dns.rdatatype.DNSKEY) + except KeyError: + return None + else: + rdataset = value + for rdata in rdataset: + if rdata.algorithm == rrsig.algorithm and \ + key_id(rdata) == rrsig.key_tag: + candidate_keys.append(rdata) + return candidate_keys + + +def _is_rsa(algorithm): + return algorithm in (RSAMD5, RSASHA1, + RSASHA1NSEC3SHA1, RSASHA256, + RSASHA512) + + +def _is_dsa(algorithm): + return algorithm in (DSA, DSANSEC3SHA1) + + +def _is_ecdsa(algorithm): + return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384)) + + +def _is_md5(algorithm): + return algorithm == RSAMD5 + + +def _is_sha1(algorithm): + return algorithm in (DSA, RSASHA1, + DSANSEC3SHA1, RSASHA1NSEC3SHA1) + + +def _is_sha256(algorithm): + return algorithm in (RSASHA256, ECDSAP256SHA256) + + +def _is_sha384(algorithm): + return algorithm == ECDSAP384SHA384 + + +def _is_sha512(algorithm): + return algorithm == RSASHA512 + + +def _make_hash(algorithm): + if _is_md5(algorithm): + return dns.hash.hashes['MD5']() + if _is_sha1(algorithm): + return dns.hash.hashes['SHA1']() + if _is_sha256(algorithm): + return dns.hash.hashes['SHA256']() + if _is_sha384(algorithm): + return dns.hash.hashes['SHA384']() + if _is_sha512(algorithm): + return dns.hash.hashes['SHA512']() + raise ValidationFailure('unknown hash for algorithm %u' % algorithm) + + +def _make_algorithm_id(algorithm): + if _is_md5(algorithm): + oid = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05] + elif _is_sha1(algorithm): + oid = [0x2b, 0x0e, 0x03, 0x02, 0x1a] + elif _is_sha256(algorithm): + oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01] + elif _is_sha512(algorithm): + oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03] + else: + raise ValidationFailure('unknown algorithm %u' % algorithm) + olen = len(oid) + dlen = _make_hash(algorithm).digest_size + idbytes = [0x30] + [8 + olen + dlen] + \ + [0x30, olen + 4] + [0x06, olen] + oid + \ + [0x05, 0x00] + [0x04, dlen] + return struct.pack('!%dB' % len(idbytes), *idbytes) + + +def _validate_rrsig(rrset, rrsig, keys, origin=None, now=None): + """Validate an RRset against a single signature rdata + + The owner name of the rrsig is assumed to be the same as the owner name + of the rrset. + + @param rrset: The RRset to validate + @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset) + tuple + @param rrsig: The signature rdata + @type rrsig: dns.rrset.Rdata + @param keys: The key dictionary. + @type keys: a dictionary keyed by dns.name.Name with node or rdataset + values + @param origin: The origin to use for relative names + @type origin: dns.name.Name or None + @param now: The time to use when validating the signatures. The default + is the current time. + @type now: int + """ + + if isinstance(origin, string_types): + origin = dns.name.from_text(origin, dns.name.root) + + for candidate_key in _find_candidate_keys(keys, rrsig): + if not candidate_key: + raise ValidationFailure('unknown key') + + # For convenience, allow the rrset to be specified as a (name, + # rdataset) tuple as well as a proper rrset + if isinstance(rrset, tuple): + rrname = rrset[0] + rdataset = rrset[1] + else: + rrname = rrset.name + rdataset = rrset + + if now is None: + now = time.time() + if rrsig.expiration < now: + raise ValidationFailure('expired') + if rrsig.inception > now: + raise ValidationFailure('not yet valid') + + hash = _make_hash(rrsig.algorithm) + + if _is_rsa(rrsig.algorithm): + keyptr = candidate_key.key + (bytes_,) = struct.unpack('!B', keyptr[0:1]) + keyptr = keyptr[1:] + if bytes_ == 0: + (bytes_,) = struct.unpack('!H', keyptr[0:2]) + keyptr = keyptr[2:] + rsa_e = keyptr[0:bytes_] + rsa_n = keyptr[bytes_:] + keylen = len(rsa_n) * 8 + pubkey = Crypto.PublicKey.RSA.construct( + (Crypto.Util.number.bytes_to_long(rsa_n), + Crypto.Util.number.bytes_to_long(rsa_e))) + sig = (Crypto.Util.number.bytes_to_long(rrsig.signature),) + elif _is_dsa(rrsig.algorithm): + keyptr = candidate_key.key + (t,) = struct.unpack('!B', keyptr[0:1]) + keyptr = keyptr[1:] + octets = 64 + t * 8 + dsa_q = keyptr[0:20] + keyptr = keyptr[20:] + dsa_p = keyptr[0:octets] + keyptr = keyptr[octets:] + dsa_g = keyptr[0:octets] + keyptr = keyptr[octets:] + dsa_y = keyptr[0:octets] + pubkey = Crypto.PublicKey.DSA.construct( + (Crypto.Util.number.bytes_to_long(dsa_y), + Crypto.Util.number.bytes_to_long(dsa_g), + Crypto.Util.number.bytes_to_long(dsa_p), + Crypto.Util.number.bytes_to_long(dsa_q))) + (dsa_r, dsa_s) = struct.unpack('!20s20s', rrsig.signature[1:]) + sig = (Crypto.Util.number.bytes_to_long(dsa_r), + Crypto.Util.number.bytes_to_long(dsa_s)) + elif _is_ecdsa(rrsig.algorithm): + if rrsig.algorithm == ECDSAP256SHA256: + curve = ecdsa.curves.NIST256p + key_len = 32 + elif rrsig.algorithm == ECDSAP384SHA384: + curve = ecdsa.curves.NIST384p + key_len = 48 + else: + # shouldn't happen + raise ValidationFailure('unknown ECDSA curve') + keyptr = candidate_key.key + x = Crypto.Util.number.bytes_to_long(keyptr[0:key_len]) + y = Crypto.Util.number.bytes_to_long(keyptr[key_len:key_len * 2]) + assert ecdsa.ecdsa.point_is_valid(curve.generator, x, y) + point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order) + verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point, + curve) + pubkey = ECKeyWrapper(verifying_key, key_len) + r = rrsig.signature[:key_len] + s = rrsig.signature[key_len:] + sig = ecdsa.ecdsa.Signature(Crypto.Util.number.bytes_to_long(r), + Crypto.Util.number.bytes_to_long(s)) + else: + raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) + + hash.update(_to_rdata(rrsig, origin)[:18]) + hash.update(rrsig.signer.to_digestable(origin)) + + if rrsig.labels < len(rrname) - 1: + suffix = rrname.split(rrsig.labels + 1)[1] + rrname = dns.name.from_text('*', suffix) + rrnamebuf = rrname.to_digestable(origin) + rrfixed = struct.pack('!HHI', rdataset.rdtype, rdataset.rdclass, + rrsig.original_ttl) + rrlist = sorted(rdataset) + for rr in rrlist: + hash.update(rrnamebuf) + hash.update(rrfixed) + rrdata = rr.to_digestable(origin) + rrlen = struct.pack('!H', len(rrdata)) + hash.update(rrlen) + hash.update(rrdata) + + digest = hash.digest() + + if _is_rsa(rrsig.algorithm): + # PKCS1 algorithm identifier goop + digest = _make_algorithm_id(rrsig.algorithm) + digest + padlen = keylen // 8 - len(digest) - 3 + digest = struct.pack('!%dB' % (2 + padlen + 1), + *([0, 1] + [0xFF] * padlen + [0])) + digest + elif _is_dsa(rrsig.algorithm) or _is_ecdsa(rrsig.algorithm): + pass + else: + # Raise here for code clarity; this won't actually ever happen + # since if the algorithm is really unknown we'd already have + # raised an exception above + raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) + + if pubkey.verify(digest, sig): + return + raise ValidationFailure('verify failure') + + +def _validate(rrset, rrsigset, keys, origin=None, now=None): + """Validate an RRset + + @param rrset: The RRset to validate + @type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset) + tuple + @param rrsigset: The signature RRset + @type rrsigset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset) + tuple + @param keys: The key dictionary. + @type keys: a dictionary keyed by dns.name.Name with node or rdataset + values + @param origin: The origin to use for relative names + @type origin: dns.name.Name or None + @param now: The time to use when validating the signatures. The default + is the current time. + @type now: int + """ + + if isinstance(origin, string_types): + origin = dns.name.from_text(origin, dns.name.root) + + if isinstance(rrset, tuple): + rrname = rrset[0] + else: + rrname = rrset.name + + if isinstance(rrsigset, tuple): + rrsigname = rrsigset[0] + rrsigrdataset = rrsigset[1] + else: + rrsigname = rrsigset.name + rrsigrdataset = rrsigset + + rrname = rrname.choose_relativity(origin) + rrsigname = rrname.choose_relativity(origin) + if rrname != rrsigname: + raise ValidationFailure("owner names do not match") + + for rrsig in rrsigrdataset: + try: + _validate_rrsig(rrset, rrsig, keys, origin, now) + return + except ValidationFailure: + pass + raise ValidationFailure("no RRSIGs validated") + + +def _need_pycrypto(*args, **kwargs): + raise NotImplementedError("DNSSEC validation requires pycrypto") + +try: + import Crypto.PublicKey.RSA + import Crypto.PublicKey.DSA + import Crypto.Util.number + validate = _validate + validate_rrsig = _validate_rrsig + _have_pycrypto = True +except ImportError: + validate = _need_pycrypto + validate_rrsig = _need_pycrypto + _have_pycrypto = False + +try: + import ecdsa + import ecdsa.ecdsa + import ecdsa.ellipticcurve + import ecdsa.keys + _have_ecdsa = True + + class ECKeyWrapper(object): + + def __init__(self, key, key_len): + self.key = key + self.key_len = key_len + + def verify(self, digest, sig): + diglong = Crypto.Util.number.bytes_to_long(digest) + return self.key.pubkey.verifies(diglong, sig) + +except ImportError: + _have_ecdsa = False diff --git a/Contents/Libraries/Shared/dns/e164.py b/Contents/Libraries/Shared/dns/e164.py new file mode 100644 index 000000000..99300730b --- /dev/null +++ b/Contents/Libraries/Shared/dns/e164.py @@ -0,0 +1,85 @@ +# Copyright (C) 2006, 2007, 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS E.164 helpers + +@var public_enum_domain: The DNS public ENUM domain, e164.arpa. +@type public_enum_domain: dns.name.Name object +""" + + +import dns.exception +import dns.name +import dns.resolver +from ._compat import string_types + +public_enum_domain = dns.name.from_text('e164.arpa.') + + +def from_e164(text, origin=public_enum_domain): + """Convert an E.164 number in textual form into a Name object whose + value is the ENUM domain name for that number. + @param text: an E.164 number in textual form. + @type text: str + @param origin: The domain in which the number should be constructed. + The default is e164.arpa. + @type origin: dns.name.Name object or None + @rtype: dns.name.Name object + """ + parts = [d for d in text if d.isdigit()] + parts.reverse() + return dns.name.from_text('.'.join(parts), origin=origin) + + +def to_e164(name, origin=public_enum_domain, want_plus_prefix=True): + """Convert an ENUM domain name into an E.164 number. + @param name: the ENUM domain name. + @type name: dns.name.Name object. + @param origin: A domain containing the ENUM domain name. The + name is relativized to this domain before being converted to text. + @type origin: dns.name.Name object or None + @param want_plus_prefix: if True, add a '+' to the beginning of the + returned number. + @rtype: str + """ + if origin is not None: + name = name.relativize(origin) + dlabels = [d for d in name.labels if d.isdigit() and len(d) == 1] + if len(dlabels) != len(name.labels): + raise dns.exception.SyntaxError('non-digit labels in ENUM domain name') + dlabels.reverse() + text = b''.join(dlabels) + if want_plus_prefix: + text = b'+' + text + return text + + +def query(number, domains, resolver=None): + """Look for NAPTR RRs for the specified number in the specified domains. + + e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.']) + """ + if resolver is None: + resolver = dns.resolver.get_default_resolver() + e_nx = dns.resolver.NXDOMAIN() + for domain in domains: + if isinstance(domain, string_types): + domain = dns.name.from_text(domain) + qname = dns.e164.from_e164(number, domain) + try: + return resolver.query(qname, 'NAPTR') + except dns.resolver.NXDOMAIN as e: + e_nx += e + raise e_nx diff --git a/Contents/Libraries/Shared/dns/edns.py b/Contents/Libraries/Shared/dns/edns.py new file mode 100644 index 000000000..8ac676bc6 --- /dev/null +++ b/Contents/Libraries/Shared/dns/edns.py @@ -0,0 +1,150 @@ +# Copyright (C) 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""EDNS Options""" + +NSID = 3 + + +class Option(object): + + """Base class for all EDNS option types. + """ + + def __init__(self, otype): + """Initialize an option. + @param otype: The rdata type + @type otype: int + """ + self.otype = otype + + def to_wire(self, file): + """Convert an option to wire format. + """ + raise NotImplementedError + + @classmethod + def from_wire(cls, otype, wire, current, olen): + """Build an EDNS option object from wire format + + @param otype: The option type + @type otype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param olen: The length of the wire-format option data + @type olen: int + @rtype: dns.edns.Option instance""" + raise NotImplementedError + + def _cmp(self, other): + """Compare an EDNS option with another option of the same type. + Return < 0 if self < other, 0 if self == other, + and > 0 if self > other. + """ + raise NotImplementedError + + def __eq__(self, other): + if not isinstance(other, Option): + return False + if self.otype != other.otype: + return False + return self._cmp(other) == 0 + + def __ne__(self, other): + if not isinstance(other, Option): + return False + if self.otype != other.otype: + return False + return self._cmp(other) != 0 + + def __lt__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) < 0 + + def __le__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) <= 0 + + def __ge__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) >= 0 + + def __gt__(self, other): + if not isinstance(other, Option) or \ + self.otype != other.otype: + return NotImplemented + return self._cmp(other) > 0 + + +class GenericOption(Option): + + """Generate Rdata Class + + This class is used for EDNS option types for which we have no better + implementation. + """ + + def __init__(self, otype, data): + super(GenericOption, self).__init__(otype) + self.data = data + + def to_wire(self, file): + file.write(self.data) + + @classmethod + def from_wire(cls, otype, wire, current, olen): + return cls(otype, wire[current: current + olen]) + + def _cmp(self, other): + if self.data == other.data: + return 0 + if self.data > other.data: + return 1 + return -1 + +_type_to_class = { +} + + +def get_option_class(otype): + cls = _type_to_class.get(otype) + if cls is None: + cls = GenericOption + return cls + + +def option_from_wire(otype, wire, current, olen): + """Build an EDNS option object from wire format + + @param otype: The option type + @type otype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param olen: The length of the wire-format option data + @type olen: int + @rtype: dns.edns.Option instance""" + + cls = get_option_class(otype) + return cls.from_wire(otype, wire, current, olen) diff --git a/Contents/Libraries/Shared/dns/entropy.py b/Contents/Libraries/Shared/dns/entropy.py new file mode 100644 index 000000000..de7a70a51 --- /dev/null +++ b/Contents/Libraries/Shared/dns/entropy.py @@ -0,0 +1,141 @@ +# Copyright (C) 2009, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import os +import random +import time +from ._compat import long, binary_type +try: + import threading as _threading +except ImportError: + import dummy_threading as _threading + + +class EntropyPool(object): + + def __init__(self, seed=None): + self.pool_index = 0 + self.digest = None + self.next_byte = 0 + self.lock = _threading.Lock() + try: + import hashlib + self.hash = hashlib.sha1() + self.hash_len = 20 + except ImportError: + try: + import sha + self.hash = sha.new() + self.hash_len = 20 + except ImportError: + import md5 # pylint: disable=import-error + self.hash = md5.new() + self.hash_len = 16 + self.pool = bytearray(b'\0' * self.hash_len) + if seed is not None: + self.stir(bytearray(seed)) + self.seeded = True + self.seed_pid = os.getpid() + else: + self.seeded = False + self.seed_pid = 0 + + def stir(self, entropy, already_locked=False): + if not already_locked: + self.lock.acquire() + try: + for c in entropy: + if self.pool_index == self.hash_len: + self.pool_index = 0 + b = c & 0xff + self.pool[self.pool_index] ^= b + self.pool_index += 1 + finally: + if not already_locked: + self.lock.release() + + def _maybe_seed(self): + if not self.seeded or self.seed_pid != os.getpid(): + try: + seed = os.urandom(16) + except Exception: + try: + r = open('/dev/urandom', 'rb', 0) + try: + seed = r.read(16) + finally: + r.close() + except Exception: + seed = str(time.time()) + self.seeded = True + self.seed_pid = os.getpid() + self.digest = None + seed = bytearray(seed) + self.stir(seed, True) + + def random_8(self): + self.lock.acquire() + try: + self._maybe_seed() + if self.digest is None or self.next_byte == self.hash_len: + self.hash.update(binary_type(self.pool)) + self.digest = bytearray(self.hash.digest()) + self.stir(self.digest, True) + self.next_byte = 0 + value = self.digest[self.next_byte] + self.next_byte += 1 + finally: + self.lock.release() + return value + + def random_16(self): + return self.random_8() * 256 + self.random_8() + + def random_32(self): + return self.random_16() * 65536 + self.random_16() + + def random_between(self, first, last): + size = last - first + 1 + if size > long(4294967296): + raise ValueError('too big') + if size > 65536: + rand = self.random_32 + max = long(4294967295) + elif size > 256: + rand = self.random_16 + max = 65535 + else: + rand = self.random_8 + max = 255 + return first + size * rand() // (max + 1) + +pool = EntropyPool() + +try: + system_random = random.SystemRandom() +except Exception: + system_random = None + +def random_16(): + if system_random is not None: + return system_random.randrange(0, 65536) + else: + return pool.random_16() + +def between(first, last): + if system_random is not None: + return system_random.randrange(first, last + 1) + else: + return pool.random_between(first, last) diff --git a/Contents/Libraries/Shared/dns/exception.py b/Contents/Libraries/Shared/dns/exception.py new file mode 100644 index 000000000..6c0b1f4b2 --- /dev/null +++ b/Contents/Libraries/Shared/dns/exception.py @@ -0,0 +1,128 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Common DNS Exceptions.""" + + +class DNSException(Exception): + + """Abstract base class shared by all dnspython exceptions. + + It supports two basic modes of operation: + + a) Old/compatible mode is used if __init__ was called with + empty **kwargs. + In compatible mode all *args are passed to standard Python Exception class + as before and all *args are printed by standard __str__ implementation. + Class variable msg (or doc string if msg is None) is returned from str() + if *args is empty. + + b) New/parametrized mode is used if __init__ was called with + non-empty **kwargs. + In the new mode *args has to be empty and all kwargs has to exactly match + set in class variable self.supp_kwargs. All kwargs are stored inside + self.kwargs and used in new __str__ implementation to construct + formatted message based on self.fmt string. + + In the simplest case it is enough to override supp_kwargs and fmt + class variables to get nice parametrized messages. + """ + msg = None # non-parametrized message + supp_kwargs = set() # accepted parameters for _fmt_kwargs (sanity check) + fmt = None # message parametrized with results from _fmt_kwargs + + def __init__(self, *args, **kwargs): + self._check_params(*args, **kwargs) + if kwargs: + self.kwargs = self._check_kwargs(**kwargs) + self.msg = str(self) + else: + self.kwargs = dict() # defined but empty for old mode exceptions + if self.msg is None: + # doc string is better implicit message than empty string + self.msg = self.__doc__ + if args: + super(DNSException, self).__init__(*args) + else: + super(DNSException, self).__init__(self.msg) + + def _check_params(self, *args, **kwargs): + """Old exceptions supported only args and not kwargs. + + For sanity we do not allow to mix old and new behavior.""" + if args or kwargs: + assert bool(args) != bool(kwargs), \ + 'keyword arguments are mutually exclusive with positional args' + + def _check_kwargs(self, **kwargs): + if kwargs: + assert set(kwargs.keys()) == self.supp_kwargs, \ + 'following set of keyword args is required: %s' % ( + self.supp_kwargs) + return kwargs + + def _fmt_kwargs(self, **kwargs): + """Format kwargs before printing them. + + Resulting dictionary has to have keys necessary for str.format call + on fmt class variable. + """ + fmtargs = {} + for kw, data in kwargs.items(): + if isinstance(data, (list, set)): + # convert list of to list of str() + fmtargs[kw] = list(map(str, data)) + if len(fmtargs[kw]) == 1: + # remove list brackets [] from single-item lists + fmtargs[kw] = fmtargs[kw].pop() + else: + fmtargs[kw] = data + return fmtargs + + def __str__(self): + if self.kwargs and self.fmt: + # provide custom message constructed from keyword arguments + fmtargs = self._fmt_kwargs(**self.kwargs) + return self.fmt.format(**fmtargs) + else: + # print *args directly in the same way as old DNSException + return super(DNSException, self).__str__() + + +class FormError(DNSException): + + """DNS message is malformed.""" + + +class SyntaxError(DNSException): + + """Text input is malformed.""" + + +class UnexpectedEnd(SyntaxError): + + """Text input ended unexpectedly.""" + + +class TooBig(DNSException): + + """The DNS message is too big.""" + + +class Timeout(DNSException): + + """The DNS operation timed out.""" + supp_kwargs = set(['timeout']) + fmt = "The DNS operation timed out after {timeout} seconds" diff --git a/Contents/Libraries/Shared/dns/flags.py b/Contents/Libraries/Shared/dns/flags.py new file mode 100644 index 000000000..388d6aaa7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/flags.py @@ -0,0 +1,112 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Message Flags.""" + +# Standard DNS flags + +QR = 0x8000 +AA = 0x0400 +TC = 0x0200 +RD = 0x0100 +RA = 0x0080 +AD = 0x0020 +CD = 0x0010 + +# EDNS flags + +DO = 0x8000 + +_by_text = { + 'QR': QR, + 'AA': AA, + 'TC': TC, + 'RD': RD, + 'RA': RA, + 'AD': AD, + 'CD': CD +} + +_edns_by_text = { + 'DO': DO +} + + +# We construct the inverse mappings programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mappings not to be true inverses. + +_by_value = dict((y, x) for x, y in _by_text.items()) + +_edns_by_value = dict((y, x) for x, y in _edns_by_text.items()) + + +def _order_flags(table): + order = list(table.items()) + order.sort() + order.reverse() + return order + +_flags_order = _order_flags(_by_value) + +_edns_flags_order = _order_flags(_edns_by_value) + + +def _from_text(text, table): + flags = 0 + tokens = text.split() + for t in tokens: + flags = flags | table[t.upper()] + return flags + + +def _to_text(flags, table, order): + text_flags = [] + for k, v in order: + if flags & k != 0: + text_flags.append(v) + return ' '.join(text_flags) + + +def from_text(text): + """Convert a space-separated list of flag text values into a flags + value. + @rtype: int""" + + return _from_text(text, _by_text) + + +def to_text(flags): + """Convert a flags value into a space-separated list of flag text + values. + @rtype: string""" + + return _to_text(flags, _by_value, _flags_order) + + +def edns_from_text(text): + """Convert a space-separated list of EDNS flag text values into a EDNS + flags value. + @rtype: int""" + + return _from_text(text, _edns_by_text) + + +def edns_to_text(flags): + """Convert an EDNS flags value into a space-separated list of EDNS flag + text values. + @rtype: string""" + + return _to_text(flags, _edns_by_value, _edns_flags_order) diff --git a/Contents/Libraries/Shared/dns/grange.py b/Contents/Libraries/Shared/dns/grange.py new file mode 100644 index 000000000..9ce9f67a0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/grange.py @@ -0,0 +1,69 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS GENERATE range conversion.""" + +import dns + + +def from_text(text): + """Convert the text form of a range in a GENERATE statement to an + integer. + + @param text: the textual range + @type text: string + @return: The start, stop and step values. + @rtype: tuple + """ + # TODO, figure out the bounds on start, stop and step. + + step = 1 + cur = '' + state = 0 + # state 0 1 2 3 4 + # x - y / z + + if text and text[0] == '-': + raise dns.exception.SyntaxError("Start cannot be a negative number") + + for c in text: + if c == '-' and state == 0: + start = int(cur) + cur = '' + state = 2 + elif c == '/': + stop = int(cur) + cur = '' + state = 4 + elif c.isdigit(): + cur += c + else: + raise dns.exception.SyntaxError("Could not parse %s" % (c)) + + if state in (1, 3): + raise dns.exception.SyntaxError() + + if state == 2: + stop = int(cur) + + if state == 4: + step = int(cur) + + assert step >= 1 + assert start >= 0 + assert start <= stop + # TODO, can start == stop? + + return (start, stop, step) diff --git a/Contents/Libraries/Shared/dns/hash.py b/Contents/Libraries/Shared/dns/hash.py new file mode 100644 index 000000000..966838a17 --- /dev/null +++ b/Contents/Libraries/Shared/dns/hash.py @@ -0,0 +1,31 @@ +# Copyright (C) 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Hashing backwards compatibility wrapper""" + +import hashlib + + +hashes = {} +hashes['MD5'] = hashlib.md5 +hashes['SHA1'] = hashlib.sha1 +hashes['SHA224'] = hashlib.sha224 +hashes['SHA256'] = hashlib.sha256 +hashes['SHA384'] = hashlib.sha384 +hashes['SHA512'] = hashlib.sha512 + + +def get(algorithm): + return hashes[algorithm.upper()] diff --git a/Contents/Libraries/Shared/dns/inet.py b/Contents/Libraries/Shared/dns/inet.py new file mode 100644 index 000000000..73490a9d7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/inet.py @@ -0,0 +1,111 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Generic Internet address helper functions.""" + +import socket + +import dns.ipv4 +import dns.ipv6 + + +# We assume that AF_INET is always defined. + +AF_INET = socket.AF_INET + +# AF_INET6 might not be defined in the socket module, but we need it. +# We'll try to use the socket module's value, and if it doesn't work, +# we'll use our own value. + +try: + AF_INET6 = socket.AF_INET6 +except AttributeError: + AF_INET6 = 9999 + + +def inet_pton(family, text): + """Convert the textual form of a network address into its binary form. + + @param family: the address family + @type family: int + @param text: the textual address + @type text: string + @raises NotImplementedError: the address family specified is not + implemented. + @rtype: string + """ + + if family == AF_INET: + return dns.ipv4.inet_aton(text) + elif family == AF_INET6: + return dns.ipv6.inet_aton(text) + else: + raise NotImplementedError + + +def inet_ntop(family, address): + """Convert the binary form of a network address into its textual form. + + @param family: the address family + @type family: int + @param address: the binary address + @type address: string + @raises NotImplementedError: the address family specified is not + implemented. + @rtype: string + """ + if family == AF_INET: + return dns.ipv4.inet_ntoa(address) + elif family == AF_INET6: + return dns.ipv6.inet_ntoa(address) + else: + raise NotImplementedError + + +def af_for_address(text): + """Determine the address family of a textual-form network address. + + @param text: the textual address + @type text: string + @raises ValueError: the address family cannot be determined from the input. + @rtype: int + """ + try: + dns.ipv4.inet_aton(text) + return AF_INET + except Exception: + try: + dns.ipv6.inet_aton(text) + return AF_INET6 + except: + raise ValueError + + +def is_multicast(text): + """Is the textual-form network address a multicast address? + + @param text: the textual address + @raises ValueError: the address family cannot be determined from the input. + @rtype: bool + """ + try: + first = ord(dns.ipv4.inet_aton(text)[0]) + return first >= 224 and first <= 239 + except Exception: + try: + first = ord(dns.ipv6.inet_aton(text)[0]) + return first == 255 + except Exception: + raise ValueError diff --git a/Contents/Libraries/Shared/dns/ipv4.py b/Contents/Libraries/Shared/dns/ipv4.py new file mode 100644 index 000000000..3fef282b6 --- /dev/null +++ b/Contents/Libraries/Shared/dns/ipv4.py @@ -0,0 +1,59 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""IPv4 helper functions.""" + +import struct + +import dns.exception +from ._compat import binary_type + +def inet_ntoa(address): + """Convert an IPv4 address in network form to text form. + + @param address: The IPv4 address + @type address: string + @returns: string + """ + if len(address) != 4: + raise dns.exception.SyntaxError + if not isinstance(address, bytearray): + address = bytearray(address) + return (u'%u.%u.%u.%u' % (address[0], address[1], + address[2], address[3])).encode() + +def inet_aton(text): + """Convert an IPv4 address in text form to network form. + + @param text: The IPv4 address + @type text: string + @returns: string + """ + if not isinstance(text, binary_type): + text = text.encode() + parts = text.split(b'.') + if len(parts) != 4: + raise dns.exception.SyntaxError + for part in parts: + if not part.isdigit(): + raise dns.exception.SyntaxError + if len(part) > 1 and part[0] == '0': + # No leading zeros + raise dns.exception.SyntaxError + try: + bytes = [int(part) for part in parts] + return struct.pack('BBBB', *bytes) + except: + raise dns.exception.SyntaxError diff --git a/Contents/Libraries/Shared/dns/ipv6.py b/Contents/Libraries/Shared/dns/ipv6.py new file mode 100644 index 000000000..cbaee8edc --- /dev/null +++ b/Contents/Libraries/Shared/dns/ipv6.py @@ -0,0 +1,172 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""IPv6 helper functions.""" + +import re +import binascii + +import dns.exception +import dns.ipv4 +from ._compat import xrange, binary_type, maybe_decode + +_leading_zero = re.compile(b'0+([0-9a-f]+)') + +def inet_ntoa(address): + """Convert a network format IPv6 address into text. + + @param address: the binary address + @type address: string + @rtype: string + @raises ValueError: the address isn't 16 bytes long + """ + + if len(address) != 16: + raise ValueError("IPv6 addresses are 16 bytes long") + hex = binascii.hexlify(address) + chunks = [] + i = 0 + l = len(hex) + while i < l: + chunk = hex[i : i + 4] + # strip leading zeros. we do this with an re instead of + # with lstrip() because lstrip() didn't support chars until + # python 2.2.2 + m = _leading_zero.match(chunk) + if not m is None: + chunk = m.group(1) + chunks.append(chunk) + i += 4 + # + # Compress the longest subsequence of 0-value chunks to :: + # + best_start = 0 + best_len = 0 + start = -1 + last_was_zero = False + for i in xrange(8): + if chunks[i] != b'0': + if last_was_zero: + end = i + current_len = end - start + if current_len > best_len: + best_start = start + best_len = current_len + last_was_zero = False + elif not last_was_zero: + start = i + last_was_zero = True + if last_was_zero: + end = 8 + current_len = end - start + if current_len > best_len: + best_start = start + best_len = current_len + if best_len > 1: + if best_start == 0 and \ + (best_len == 6 or + best_len == 5 and chunks[5] == b'ffff'): + # We have an embedded IPv4 address + if best_len == 6: + prefix = b'::' + else: + prefix = b'::ffff:' + hex = prefix + dns.ipv4.inet_ntoa(address[12:]) + else: + hex = b':'.join(chunks[:best_start]) + b'::' + \ + b':'.join(chunks[best_start + best_len:]) + else: + hex = b':'.join(chunks) + return maybe_decode(hex) + +_v4_ending = re.compile(b'(.*):(\d+\.\d+\.\d+\.\d+)$') +_colon_colon_start = re.compile(b'::.*') +_colon_colon_end = re.compile(b'.*::$') + +def inet_aton(text): + """Convert a text format IPv6 address into network format. + + @param text: the textual address + @type text: string + @rtype: string + @raises dns.exception.SyntaxError: the text was not properly formatted + """ + + # + # Our aim here is not something fast; we just want something that works. + # + if not isinstance(text, binary_type): + text = text.encode() + + if text == b'::': + text = b'0::' + # + # Get rid of the icky dot-quad syntax if we have it. + # + m = _v4_ending.match(text) + if not m is None: + b = bytearray(dns.ipv4.inet_aton(m.group(2))) + text = (u"%s:%02x%02x:%02x%02x" % (m.group(1).decode(), b[0], b[1], + b[2], b[3])).encode() + # + # Try to turn '::' into ':'; if no match try to + # turn '::' into ':' + # + m = _colon_colon_start.match(text) + if not m is None: + text = text[1:] + else: + m = _colon_colon_end.match(text) + if not m is None: + text = text[:-1] + # + # Now canonicalize into 8 chunks of 4 hex digits each + # + chunks = text.split(b':') + l = len(chunks) + if l > 8: + raise dns.exception.SyntaxError + seen_empty = False + canonical = [] + for c in chunks: + if c == b'': + if seen_empty: + raise dns.exception.SyntaxError + seen_empty = True + for i in xrange(0, 8 - l + 1): + canonical.append(b'0000') + else: + lc = len(c) + if lc > 4: + raise dns.exception.SyntaxError + if lc != 4: + c = (b'0' * (4 - lc)) + c + canonical.append(c) + if l < 8 and not seen_empty: + raise dns.exception.SyntaxError + text = b''.join(canonical) + + # + # Finally we can go to binary. + # + try: + return binascii.unhexlify(text) + except (binascii.Error, TypeError): + raise dns.exception.SyntaxError + +_mapped_prefix = b'\x00' * 10 + b'\xff\xff' + +def is_mapped(address): + return address.startswith(_mapped_prefix) diff --git a/Contents/Libraries/Shared/dns/message.py b/Contents/Libraries/Shared/dns/message.py new file mode 100644 index 000000000..a0df18e67 --- /dev/null +++ b/Contents/Libraries/Shared/dns/message.py @@ -0,0 +1,1152 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Messages""" + +from __future__ import absolute_import + +from io import StringIO +import struct +import time + +import dns.edns +import dns.exception +import dns.flags +import dns.name +import dns.opcode +import dns.entropy +import dns.rcode +import dns.rdata +import dns.rdataclass +import dns.rdatatype +import dns.rrset +import dns.renderer +import dns.tsig +import dns.wiredata + +from ._compat import long, xrange, string_types + + +class ShortHeader(dns.exception.FormError): + + """The DNS packet passed to from_wire() is too short.""" + + +class TrailingJunk(dns.exception.FormError): + + """The DNS packet passed to from_wire() has extra junk at the end of it.""" + + +class UnknownHeaderField(dns.exception.DNSException): + + """The header field name was not recognized when converting from text + into a message.""" + + +class BadEDNS(dns.exception.FormError): + + """OPT record occurred somewhere other than the start of + the additional data section.""" + + +class BadTSIG(dns.exception.FormError): + + """A TSIG record occurred somewhere other than the end of + the additional data section.""" + + +class UnknownTSIGKey(dns.exception.DNSException): + + """A TSIG with an unknown key was received.""" + + +class Message(object): + + """A DNS message. + + @ivar id: The query id; the default is a randomly chosen id. + @type id: int + @ivar flags: The DNS flags of the message. @see: RFC 1035 for an + explanation of these flags. + @type flags: int + @ivar question: The question section. + @type question: list of dns.rrset.RRset objects + @ivar answer: The answer section. + @type answer: list of dns.rrset.RRset objects + @ivar authority: The authority section. + @type authority: list of dns.rrset.RRset objects + @ivar additional: The additional data section. + @type additional: list of dns.rrset.RRset objects + @ivar edns: The EDNS level to use. The default is -1, no Edns. + @type edns: int + @ivar ednsflags: The EDNS flags + @type ednsflags: long + @ivar payload: The EDNS payload size. The default is 0. + @type payload: int + @ivar options: The EDNS options + @type options: list of dns.edns.Option objects + @ivar request_payload: The associated request's EDNS payload size. + @type request_payload: int + @ivar keyring: The TSIG keyring to use. The default is None. + @type keyring: dict + @ivar keyname: The TSIG keyname to use. The default is None. + @type keyname: dns.name.Name object + @ivar keyalgorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm. Constants for TSIG algorithms are defined + in dns.tsig, and the currently implemented algorithms are + HMAC_MD5, HMAC_SHA1, HMAC_SHA224, HMAC_SHA256, HMAC_SHA384, and + HMAC_SHA512. + @type keyalgorithm: string + @ivar request_mac: The TSIG MAC of the request message associated with + this message; used when validating TSIG signatures. @see: RFC 2845 for + more information on TSIG fields. + @type request_mac: string + @ivar fudge: TSIG time fudge; default is 300 seconds. + @type fudge: int + @ivar original_id: TSIG original id; defaults to the message's id + @type original_id: int + @ivar tsig_error: TSIG error code; default is 0. + @type tsig_error: int + @ivar other_data: TSIG other data. + @type other_data: string + @ivar mac: The TSIG MAC for this message. + @type mac: string + @ivar xfr: Is the message being used to contain the results of a DNS + zone transfer? The default is False. + @type xfr: bool + @ivar origin: The origin of the zone in messages which are used for + zone transfers or for DNS dynamic updates. The default is None. + @type origin: dns.name.Name object + @ivar tsig_ctx: The TSIG signature context associated with this + message. The default is None. + @type tsig_ctx: hmac.HMAC object + @ivar had_tsig: Did the message decoded from wire format have a TSIG + signature? + @type had_tsig: bool + @ivar multi: Is this message part of a multi-message sequence? The + default is false. This variable is used when validating TSIG signatures + on messages which are part of a zone transfer. + @type multi: bool + @ivar first: Is this message standalone, or the first of a multi + message sequence? This variable is used when validating TSIG signatures + on messages which are part of a zone transfer. + @type first: bool + @ivar index: An index of rrsets in the message. The index key is + (section, name, rdclass, rdtype, covers, deleting). Indexing can be + disabled by setting the index to None. + @type index: dict + """ + + def __init__(self, id=None): + if id is None: + self.id = dns.entropy.random_16() + else: + self.id = id + self.flags = 0 + self.question = [] + self.answer = [] + self.authority = [] + self.additional = [] + self.edns = -1 + self.ednsflags = 0 + self.payload = 0 + self.options = [] + self.request_payload = 0 + self.keyring = None + self.keyname = None + self.keyalgorithm = dns.tsig.default_algorithm + self.request_mac = '' + self.other_data = '' + self.tsig_error = 0 + self.fudge = 300 + self.original_id = self.id + self.mac = '' + self.xfr = False + self.origin = None + self.tsig_ctx = None + self.had_tsig = False + self.multi = False + self.first = True + self.index = {} + + def __repr__(self): + return '' + + def __str__(self): + return self.to_text() + + def to_text(self, origin=None, relativize=True, **kw): + """Convert the message to text. + + The I{origin}, I{relativize}, and any other keyword + arguments are passed to the rrset to_wire() method. + + @rtype: string + """ + + s = StringIO() + s.write(u'id %d\n' % self.id) + s.write(u'opcode %s\n' % + dns.opcode.to_text(dns.opcode.from_flags(self.flags))) + rc = dns.rcode.from_flags(self.flags, self.ednsflags) + s.write(u'rcode %s\n' % dns.rcode.to_text(rc)) + s.write(u'flags %s\n' % dns.flags.to_text(self.flags)) + if self.edns >= 0: + s.write(u'edns %s\n' % self.edns) + if self.ednsflags != 0: + s.write(u'eflags %s\n' % + dns.flags.edns_to_text(self.ednsflags)) + s.write(u'payload %d\n' % self.payload) + is_update = dns.opcode.is_update(self.flags) + if is_update: + s.write(u';ZONE\n') + else: + s.write(u';QUESTION\n') + for rrset in self.question: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + if is_update: + s.write(u';PREREQ\n') + else: + s.write(u';ANSWER\n') + for rrset in self.answer: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + if is_update: + s.write(u';UPDATE\n') + else: + s.write(u';AUTHORITY\n') + for rrset in self.authority: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + s.write(u';ADDITIONAL\n') + for rrset in self.additional: + s.write(rrset.to_text(origin, relativize, **kw)) + s.write(u'\n') + # + # We strip off the final \n so the caller can print the result without + # doing weird things to get around eccentricities in Python print + # formatting + # + return s.getvalue()[:-1] + + def __eq__(self, other): + """Two messages are equal if they have the same content in the + header, question, answer, and authority sections. + @rtype: bool""" + if not isinstance(other, Message): + return False + if self.id != other.id: + return False + if self.flags != other.flags: + return False + for n in self.question: + if n not in other.question: + return False + for n in other.question: + if n not in self.question: + return False + for n in self.answer: + if n not in other.answer: + return False + for n in other.answer: + if n not in self.answer: + return False + for n in self.authority: + if n not in other.authority: + return False + for n in other.authority: + if n not in self.authority: + return False + return True + + def __ne__(self, other): + """Are two messages not equal? + @rtype: bool""" + return not self.__eq__(other) + + def is_response(self, other): + """Is other a response to self? + @rtype: bool""" + if other.flags & dns.flags.QR == 0 or \ + self.id != other.id or \ + dns.opcode.from_flags(self.flags) != \ + dns.opcode.from_flags(other.flags): + return False + if dns.rcode.from_flags(other.flags, other.ednsflags) != \ + dns.rcode.NOERROR: + return True + if dns.opcode.is_update(self.flags): + return True + for n in self.question: + if n not in other.question: + return False + for n in other.question: + if n not in self.question: + return False + return True + + def section_number(self, section): + if section is self.question: + return 0 + elif section is self.answer: + return 1 + elif section is self.authority: + return 2 + elif section is self.additional: + return 3 + else: + raise ValueError('unknown section') + + def find_rrset(self, section, name, rdclass, rdtype, + covers=dns.rdatatype.NONE, deleting=None, create=False, + force_unique=False): + """Find the RRset with the given attributes in the specified section. + + @param section: the section of the message to look in, e.g. + self.answer. + @type section: list of dns.rrset.RRset objects + @param name: the name of the RRset + @type name: dns.name.Name object + @param rdclass: the class of the RRset + @type rdclass: int + @param rdtype: the type of the RRset + @type rdtype: int + @param covers: the covers value of the RRset + @type covers: int + @param deleting: the deleting value of the RRset + @type deleting: int + @param create: If True, create the RRset if it is not found. + The created RRset is appended to I{section}. + @type create: bool + @param force_unique: If True and create is also True, create a + new RRset regardless of whether a matching RRset exists already. + @type force_unique: bool + @raises KeyError: the RRset was not found and create was False + @rtype: dns.rrset.RRset object""" + + key = (self.section_number(section), + name, rdclass, rdtype, covers, deleting) + if not force_unique: + if self.index is not None: + rrset = self.index.get(key) + if rrset is not None: + return rrset + else: + for rrset in section: + if rrset.match(name, rdclass, rdtype, covers, deleting): + return rrset + if not create: + raise KeyError + rrset = dns.rrset.RRset(name, rdclass, rdtype, covers, deleting) + section.append(rrset) + if self.index is not None: + self.index[key] = rrset + return rrset + + def get_rrset(self, section, name, rdclass, rdtype, + covers=dns.rdatatype.NONE, deleting=None, create=False, + force_unique=False): + """Get the RRset with the given attributes in the specified section. + + If the RRset is not found, None is returned. + + @param section: the section of the message to look in, e.g. + self.answer. + @type section: list of dns.rrset.RRset objects + @param name: the name of the RRset + @type name: dns.name.Name object + @param rdclass: the class of the RRset + @type rdclass: int + @param rdtype: the type of the RRset + @type rdtype: int + @param covers: the covers value of the RRset + @type covers: int + @param deleting: the deleting value of the RRset + @type deleting: int + @param create: If True, create the RRset if it is not found. + The created RRset is appended to I{section}. + @type create: bool + @param force_unique: If True and create is also True, create a + new RRset regardless of whether a matching RRset exists already. + @type force_unique: bool + @rtype: dns.rrset.RRset object or None""" + + try: + rrset = self.find_rrset(section, name, rdclass, rdtype, covers, + deleting, create, force_unique) + except KeyError: + rrset = None + return rrset + + def to_wire(self, origin=None, max_size=0, **kw): + """Return a string containing the message in DNS compressed wire + format. + + Additional keyword arguments are passed to the rrset to_wire() + method. + + @param origin: The origin to be appended to any relative names. + @type origin: dns.name.Name object + @param max_size: The maximum size of the wire format output; default + is 0, which means 'the message's request payload, if nonzero, or + 65536'. + @type max_size: int + @raises dns.exception.TooBig: max_size was exceeded + @rtype: string + """ + + if max_size == 0: + if self.request_payload != 0: + max_size = self.request_payload + else: + max_size = 65535 + if max_size < 512: + max_size = 512 + elif max_size > 65535: + max_size = 65535 + r = dns.renderer.Renderer(self.id, self.flags, max_size, origin) + for rrset in self.question: + r.add_question(rrset.name, rrset.rdtype, rrset.rdclass) + for rrset in self.answer: + r.add_rrset(dns.renderer.ANSWER, rrset, **kw) + for rrset in self.authority: + r.add_rrset(dns.renderer.AUTHORITY, rrset, **kw) + if self.edns >= 0: + r.add_edns(self.edns, self.ednsflags, self.payload, self.options) + for rrset in self.additional: + r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw) + r.write_header() + if self.keyname is not None: + r.add_tsig(self.keyname, self.keyring[self.keyname], + self.fudge, self.original_id, self.tsig_error, + self.other_data, self.request_mac, + self.keyalgorithm) + self.mac = r.mac + return r.get_wire() + + def use_tsig(self, keyring, keyname=None, fudge=300, + original_id=None, tsig_error=0, other_data='', + algorithm=dns.tsig.default_algorithm): + """When sending, a TSIG signature using the specified keyring + and keyname should be added. + + @param keyring: The TSIG keyring to use; defaults to None. + @type keyring: dict + @param keyname: The name of the TSIG key to use; defaults to None. + The key must be defined in the keyring. If a keyring is specified + but a keyname is not, then the key used will be the first key in the + keyring. Note that the order of keys in a dictionary is not defined, + so applications should supply a keyname when a keyring is used, unless + they know the keyring contains only one key. + @type keyname: dns.name.Name or string + @param fudge: TSIG time fudge; default is 300 seconds. + @type fudge: int + @param original_id: TSIG original id; defaults to the message's id + @type original_id: int + @param tsig_error: TSIG error code; default is 0. + @type tsig_error: int + @param other_data: TSIG other data. + @type other_data: string + @param algorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm + """ + + self.keyring = keyring + if keyname is None: + self.keyname = list(self.keyring.keys())[0] + else: + if isinstance(keyname, string_types): + keyname = dns.name.from_text(keyname) + self.keyname = keyname + self.keyalgorithm = algorithm + self.fudge = fudge + if original_id is None: + self.original_id = self.id + else: + self.original_id = original_id + self.tsig_error = tsig_error + self.other_data = other_data + + def use_edns(self, edns=0, ednsflags=0, payload=1280, request_payload=None, + options=None): + """Configure EDNS behavior. + @param edns: The EDNS level to use. Specifying None, False, or -1 + means 'do not use EDNS', and in this case the other parameters are + ignored. Specifying True is equivalent to specifying 0, i.e. 'use + EDNS0'. + @type edns: int or bool or None + @param ednsflags: EDNS flag values. + @type ednsflags: int + @param payload: The EDNS sender's payload field, which is the maximum + size of UDP datagram the sender can handle. + @type payload: int + @param request_payload: The EDNS payload size to use when sending + this message. If not specified, defaults to the value of payload. + @type request_payload: int or None + @param options: The EDNS options + @type options: None or list of dns.edns.Option objects + @see: RFC 2671 + """ + if edns is None or edns is False: + edns = -1 + if edns is True: + edns = 0 + if request_payload is None: + request_payload = payload + if edns < 0: + ednsflags = 0 + payload = 0 + request_payload = 0 + options = [] + else: + # make sure the EDNS version in ednsflags agrees with edns + ednsflags &= long(0xFF00FFFF) + ednsflags |= (edns << 16) + if options is None: + options = [] + self.edns = edns + self.ednsflags = ednsflags + self.payload = payload + self.options = options + self.request_payload = request_payload + + def want_dnssec(self, wanted=True): + """Enable or disable 'DNSSEC desired' flag in requests. + @param wanted: Is DNSSEC desired? If True, EDNS is enabled if + required, and then the DO bit is set. If False, the DO bit is + cleared if EDNS is enabled. + @type wanted: bool + """ + if wanted: + if self.edns < 0: + self.use_edns() + self.ednsflags |= dns.flags.DO + elif self.edns >= 0: + self.ednsflags &= ~dns.flags.DO + + def rcode(self): + """Return the rcode. + @rtype: int + """ + return dns.rcode.from_flags(self.flags, self.ednsflags) + + def set_rcode(self, rcode): + """Set the rcode. + @param rcode: the rcode + @type rcode: int + """ + (value, evalue) = dns.rcode.to_flags(rcode) + self.flags &= 0xFFF0 + self.flags |= value + self.ednsflags &= long(0x00FFFFFF) + self.ednsflags |= evalue + if self.ednsflags != 0 and self.edns < 0: + self.edns = 0 + + def opcode(self): + """Return the opcode. + @rtype: int + """ + return dns.opcode.from_flags(self.flags) + + def set_opcode(self, opcode): + """Set the opcode. + @param opcode: the opcode + @type opcode: int + """ + self.flags &= 0x87FF + self.flags |= dns.opcode.to_flags(opcode) + + +class _WireReader(object): + + """Wire format reader. + + @ivar wire: the wire-format message. + @type wire: string + @ivar message: The message object being built + @type message: dns.message.Message object + @ivar current: When building a message object from wire format, this + variable contains the offset from the beginning of wire of the next octet + to be read. + @type current: int + @ivar updating: Is the message a dynamic update? + @type updating: bool + @ivar one_rr_per_rrset: Put each RR into its own RRset? + @type one_rr_per_rrset: bool + @ivar ignore_trailing: Ignore trailing junk at end of request? + @type ignore_trailing: bool + @ivar zone_rdclass: The class of the zone in messages which are + DNS dynamic updates. + @type zone_rdclass: int + """ + + def __init__(self, wire, message, question_only=False, + one_rr_per_rrset=False, ignore_trailing=False): + self.wire = dns.wiredata.maybe_wrap(wire) + self.message = message + self.current = 0 + self.updating = False + self.zone_rdclass = dns.rdataclass.IN + self.question_only = question_only + self.one_rr_per_rrset = one_rr_per_rrset + self.ignore_trailing = ignore_trailing + + def _get_question(self, qcount): + """Read the next I{qcount} records from the wire data and add them to + the question section. + @param qcount: the number of questions in the message + @type qcount: int""" + + if self.updating and qcount > 1: + raise dns.exception.FormError + + for i in xrange(0, qcount): + (qname, used) = dns.name.from_wire(self.wire, self.current) + if self.message.origin is not None: + qname = qname.relativize(self.message.origin) + self.current = self.current + used + (rdtype, rdclass) = \ + struct.unpack('!HH', + self.wire[self.current:self.current + 4]) + self.current = self.current + 4 + self.message.find_rrset(self.message.question, qname, + rdclass, rdtype, create=True, + force_unique=True) + if self.updating: + self.zone_rdclass = rdclass + + def _get_section(self, section, count): + """Read the next I{count} records from the wire data and add them to + the specified section. + @param section: the section of the message to which to add records + @type section: list of dns.rrset.RRset objects + @param count: the number of records to read + @type count: int""" + + if self.updating or self.one_rr_per_rrset: + force_unique = True + else: + force_unique = False + seen_opt = False + for i in xrange(0, count): + rr_start = self.current + (name, used) = dns.name.from_wire(self.wire, self.current) + absolute_name = name + if self.message.origin is not None: + name = name.relativize(self.message.origin) + self.current = self.current + used + (rdtype, rdclass, ttl, rdlen) = \ + struct.unpack('!HHIH', + self.wire[self.current:self.current + 10]) + self.current = self.current + 10 + if rdtype == dns.rdatatype.OPT: + if section is not self.message.additional or seen_opt: + raise BadEDNS + self.message.payload = rdclass + self.message.ednsflags = ttl + self.message.edns = (ttl & 0xff0000) >> 16 + self.message.options = [] + current = self.current + optslen = rdlen + while optslen > 0: + (otype, olen) = \ + struct.unpack('!HH', + self.wire[current:current + 4]) + current = current + 4 + opt = dns.edns.option_from_wire( + otype, self.wire, current, olen) + self.message.options.append(opt) + current = current + olen + optslen = optslen - 4 - olen + seen_opt = True + elif rdtype == dns.rdatatype.TSIG: + if not (section is self.message.additional and + i == (count - 1)): + raise BadTSIG + if self.message.keyring is None: + raise UnknownTSIGKey('got signed message without keyring') + secret = self.message.keyring.get(absolute_name) + if secret is None: + raise UnknownTSIGKey("key '%s' unknown" % name) + self.message.keyname = absolute_name + (self.message.keyalgorithm, self.message.mac) = \ + dns.tsig.get_algorithm_and_mac(self.wire, self.current, + rdlen) + self.message.tsig_ctx = \ + dns.tsig.validate(self.wire, + absolute_name, + secret, + int(time.time()), + self.message.request_mac, + rr_start, + self.current, + rdlen, + self.message.tsig_ctx, + self.message.multi, + self.message.first) + self.message.had_tsig = True + else: + if ttl < 0: + ttl = 0 + if self.updating and \ + (rdclass == dns.rdataclass.ANY or + rdclass == dns.rdataclass.NONE): + deleting = rdclass + rdclass = self.zone_rdclass + else: + deleting = None + if deleting == dns.rdataclass.ANY or \ + (deleting == dns.rdataclass.NONE and + section is self.message.answer): + covers = dns.rdatatype.NONE + rd = None + else: + rd = dns.rdata.from_wire(rdclass, rdtype, self.wire, + self.current, rdlen, + self.message.origin) + covers = rd.covers() + if self.message.xfr and rdtype == dns.rdatatype.SOA: + force_unique = True + rrset = self.message.find_rrset(section, name, + rdclass, rdtype, covers, + deleting, True, force_unique) + if rd is not None: + rrset.add(rd, ttl) + self.current = self.current + rdlen + + def read(self): + """Read a wire format DNS message and build a dns.message.Message + object.""" + + l = len(self.wire) + if l < 12: + raise ShortHeader + (self.message.id, self.message.flags, qcount, ancount, + aucount, adcount) = struct.unpack('!HHHHHH', self.wire[:12]) + self.current = 12 + if dns.opcode.is_update(self.message.flags): + self.updating = True + self._get_question(qcount) + if self.question_only: + return + self._get_section(self.message.answer, ancount) + self._get_section(self.message.authority, aucount) + self._get_section(self.message.additional, adcount) + if not self.ignore_trailing and self.current != l: + raise TrailingJunk + if self.message.multi and self.message.tsig_ctx and \ + not self.message.had_tsig: + self.message.tsig_ctx.update(self.wire) + + +def from_wire(wire, keyring=None, request_mac='', xfr=False, origin=None, + tsig_ctx=None, multi=False, first=True, + question_only=False, one_rr_per_rrset=False, + ignore_trailing=False): + """Convert a DNS wire format message into a message + object. + + @param keyring: The keyring to use if the message is signed. + @type keyring: dict + @param request_mac: If the message is a response to a TSIG-signed request, + I{request_mac} should be set to the MAC of that request. + @type request_mac: string + @param xfr: Is this message part of a zone transfer? + @type xfr: bool + @param origin: If the message is part of a zone transfer, I{origin} + should be the origin name of the zone. + @type origin: dns.name.Name object + @param tsig_ctx: The ongoing TSIG context, used when validating zone + transfers. + @type tsig_ctx: hmac.HMAC object + @param multi: Is this message part of a multiple message sequence? + @type multi: bool + @param first: Is this message standalone, or the first of a multi + message sequence? + @type first: bool + @param question_only: Read only up to the end of the question section? + @type question_only: bool + @param one_rr_per_rrset: Put each RR into its own RRset + @type one_rr_per_rrset: bool + @param ignore_trailing: Ignore trailing junk at end of request? + @type ignore_trailing: bool + @raises ShortHeader: The message is less than 12 octets long. + @raises TrailingJunk: There were octets in the message past the end + of the proper DNS message. + @raises BadEDNS: An OPT record was in the wrong section, or occurred more + than once. + @raises BadTSIG: A TSIG record was not the last record of the additional + data section. + @rtype: dns.message.Message object""" + + m = Message(id=0) + m.keyring = keyring + m.request_mac = request_mac + m.xfr = xfr + m.origin = origin + m.tsig_ctx = tsig_ctx + m.multi = multi + m.first = first + + reader = _WireReader(wire, m, question_only, one_rr_per_rrset, + ignore_trailing) + reader.read() + + return m + + +class _TextReader(object): + + """Text format reader. + + @ivar tok: the tokenizer + @type tok: dns.tokenizer.Tokenizer object + @ivar message: The message object being built + @type message: dns.message.Message object + @ivar updating: Is the message a dynamic update? + @type updating: bool + @ivar zone_rdclass: The class of the zone in messages which are + DNS dynamic updates. + @type zone_rdclass: int + @ivar last_name: The most recently read name when building a message object + from text format. + @type last_name: dns.name.Name object + """ + + def __init__(self, text, message): + self.message = message + self.tok = dns.tokenizer.Tokenizer(text) + self.last_name = None + self.zone_rdclass = dns.rdataclass.IN + self.updating = False + + def _header_line(self, section): + """Process one line from the text format header section.""" + + token = self.tok.get() + what = token.value + if what == 'id': + self.message.id = self.tok.get_int() + elif what == 'flags': + while True: + token = self.tok.get() + if not token.is_identifier(): + self.tok.unget(token) + break + self.message.flags = self.message.flags | \ + dns.flags.from_text(token.value) + if dns.opcode.is_update(self.message.flags): + self.updating = True + elif what == 'edns': + self.message.edns = self.tok.get_int() + self.message.ednsflags = self.message.ednsflags | \ + (self.message.edns << 16) + elif what == 'eflags': + if self.message.edns < 0: + self.message.edns = 0 + while True: + token = self.tok.get() + if not token.is_identifier(): + self.tok.unget(token) + break + self.message.ednsflags = self.message.ednsflags | \ + dns.flags.edns_from_text(token.value) + elif what == 'payload': + self.message.payload = self.tok.get_int() + if self.message.edns < 0: + self.message.edns = 0 + elif what == 'opcode': + text = self.tok.get_string() + self.message.flags = self.message.flags | \ + dns.opcode.to_flags(dns.opcode.from_text(text)) + elif what == 'rcode': + text = self.tok.get_string() + self.message.set_rcode(dns.rcode.from_text(text)) + else: + raise UnknownHeaderField + self.tok.get_eol() + + def _question_line(self, section): + """Process one line from the text format question section.""" + + token = self.tok.get(want_leading=True) + if not token.is_whitespace(): + self.last_name = dns.name.from_text(token.value, None) + name = self.last_name + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = dns.rdataclass.IN + # Type + rdtype = dns.rdatatype.from_text(token.value) + self.message.find_rrset(self.message.question, name, + rdclass, rdtype, create=True, + force_unique=True) + if self.updating: + self.zone_rdclass = rdclass + self.tok.get_eol() + + def _rr_line(self, section): + """Process one line from the text format answer, authority, or + additional data sections. + """ + + deleting = None + # Name + token = self.tok.get(want_leading=True) + if not token.is_whitespace(): + self.last_name = dns.name.from_text(token.value, None) + name = self.last_name + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + # TTL + try: + ttl = int(token.value, 0) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + ttl = 0 + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE: + deleting = rdclass + rdclass = self.zone_rdclass + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = dns.rdataclass.IN + # Type + rdtype = dns.rdatatype.from_text(token.value) + token = self.tok.get() + if not token.is_eol_or_eof(): + self.tok.unget(token) + rd = dns.rdata.from_text(rdclass, rdtype, self.tok, None) + covers = rd.covers() + else: + rd = None + covers = dns.rdatatype.NONE + rrset = self.message.find_rrset(section, name, + rdclass, rdtype, covers, + deleting, True, self.updating) + if rd is not None: + rrset.add(rd, ttl) + + def read(self): + """Read a text format DNS message and build a dns.message.Message + object.""" + + line_method = self._header_line + section = None + while 1: + token = self.tok.get(True, True) + if token.is_eol_or_eof(): + break + if token.is_comment(): + u = token.value.upper() + if u == 'HEADER': + line_method = self._header_line + elif u == 'QUESTION' or u == 'ZONE': + line_method = self._question_line + section = self.message.question + elif u == 'ANSWER' or u == 'PREREQ': + line_method = self._rr_line + section = self.message.answer + elif u == 'AUTHORITY' or u == 'UPDATE': + line_method = self._rr_line + section = self.message.authority + elif u == 'ADDITIONAL': + line_method = self._rr_line + section = self.message.additional + self.tok.get_eol() + continue + self.tok.unget(token) + line_method(section) + + +def from_text(text): + """Convert the text format message into a message object. + + @param text: The text format message. + @type text: string + @raises UnknownHeaderField: + @raises dns.exception.SyntaxError: + @rtype: dns.message.Message object""" + + # 'text' can also be a file, but we don't publish that fact + # since it's an implementation detail. The official file + # interface is from_file(). + + m = Message() + + reader = _TextReader(text, m) + reader.read() + + return m + + +def from_file(f): + """Read the next text format message from the specified file. + + @param f: file or string. If I{f} is a string, it is treated + as the name of a file to open. + @raises UnknownHeaderField: + @raises dns.exception.SyntaxError: + @rtype: dns.message.Message object""" + + str_type = string_types + opts = 'rU' + + if isinstance(f, str_type): + f = open(f, opts) + want_close = True + else: + want_close = False + + try: + m = from_text(f) + finally: + if want_close: + f.close() + return m + + +def make_query(qname, rdtype, rdclass=dns.rdataclass.IN, use_edns=None, + want_dnssec=False, ednsflags=None, payload=None, + request_payload=None, options=None): + """Make a query message. + + The query name, type, and class may all be specified either + as objects of the appropriate type, or as strings. + + The query will have a randomly chosen query id, and its DNS flags + will be set to dns.flags.RD. + + @param qname: The query name. + @type qname: dns.name.Name object or string + @param rdtype: The desired rdata type. + @type rdtype: int + @param rdclass: The desired rdata class; the default is class IN. + @type rdclass: int + @param use_edns: The EDNS level to use; the default is None (no EDNS). + See the description of dns.message.Message.use_edns() for the possible + values for use_edns and their meanings. + @type use_edns: int or bool or None + @param want_dnssec: Should the query indicate that DNSSEC is desired? + @type want_dnssec: bool + @param ednsflags: EDNS flag values. + @type ednsflags: int + @param payload: The EDNS sender's payload field, which is the maximum + size of UDP datagram the sender can handle. + @type payload: int + @param request_payload: The EDNS payload size to use when sending + this message. If not specified, defaults to the value of payload. + @type request_payload: int or None + @param options: The EDNS options + @type options: None or list of dns.edns.Option objects + @see: RFC 2671 + @rtype: dns.message.Message object""" + + if isinstance(qname, string_types): + qname = dns.name.from_text(qname) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + m = Message() + m.flags |= dns.flags.RD + m.find_rrset(m.question, qname, rdclass, rdtype, create=True, + force_unique=True) + # only pass keywords on to use_edns if they have been set to a + # non-None value. Setting a field will turn EDNS on if it hasn't + # been configured. + kwargs = {} + if ednsflags is not None: + kwargs['ednsflags'] = ednsflags + if use_edns is None: + use_edns = 0 + if payload is not None: + kwargs['payload'] = payload + if use_edns is None: + use_edns = 0 + if request_payload is not None: + kwargs['request_payload'] = request_payload + if use_edns is None: + use_edns = 0 + if options is not None: + kwargs['options'] = options + if use_edns is None: + use_edns = 0 + kwargs['edns'] = use_edns + m.use_edns(**kwargs) + m.want_dnssec(want_dnssec) + return m + + +def make_response(query, recursion_available=False, our_payload=8192, + fudge=300): + """Make a message which is a response for the specified query. + The message returned is really a response skeleton; it has all + of the infrastructure required of a response, but none of the + content. + + The response's question section is a shallow copy of the query's + question section, so the query's question RRsets should not be + changed. + + @param query: the query to respond to + @type query: dns.message.Message object + @param recursion_available: should RA be set in the response? + @type recursion_available: bool + @param our_payload: payload size to advertise in EDNS responses; default + is 8192. + @type our_payload: int + @param fudge: TSIG time fudge; default is 300 seconds. + @type fudge: int + @rtype: dns.message.Message object""" + + if query.flags & dns.flags.QR: + raise dns.exception.FormError('specified query message is not a query') + response = dns.message.Message(query.id) + response.flags = dns.flags.QR | (query.flags & dns.flags.RD) + if recursion_available: + response.flags |= dns.flags.RA + response.set_opcode(query.opcode()) + response.question = list(query.question) + if query.edns >= 0: + response.use_edns(0, 0, our_payload, query.payload) + if query.had_tsig: + response.use_tsig(query.keyring, query.keyname, fudge, None, 0, '', + query.keyalgorithm) + response.request_mac = query.mac + return response diff --git a/Contents/Libraries/Shared/dns/name.py b/Contents/Libraries/Shared/dns/name.py new file mode 100644 index 000000000..97e216c8f --- /dev/null +++ b/Contents/Libraries/Shared/dns/name.py @@ -0,0 +1,924 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Names. + +@var root: The DNS root name. +@type root: dns.name.Name object +@var empty: The empty DNS name. +@type empty: dns.name.Name object +""" + +from io import BytesIO +import struct +import sys +import copy +import encodings.idna +try: + import idna + have_idna_2008 = True +except ImportError: + have_idna_2008 = False + +import dns.exception +import dns.wiredata + +from ._compat import long, binary_type, text_type, unichr, maybe_decode + +try: + maxint = sys.maxint +except AttributeError: + maxint = (1 << (8 * struct.calcsize("P"))) // 2 - 1 + +NAMERELN_NONE = 0 +NAMERELN_SUPERDOMAIN = 1 +NAMERELN_SUBDOMAIN = 2 +NAMERELN_EQUAL = 3 +NAMERELN_COMMONANCESTOR = 4 + + +class EmptyLabel(dns.exception.SyntaxError): + + """A DNS label is empty.""" + + +class BadEscape(dns.exception.SyntaxError): + + """An escaped code in a text format of DNS name is invalid.""" + + +class BadPointer(dns.exception.FormError): + + """A DNS compression pointer points forward instead of backward.""" + + +class BadLabelType(dns.exception.FormError): + + """The label type in DNS name wire format is unknown.""" + + +class NeedAbsoluteNameOrOrigin(dns.exception.DNSException): + + """An attempt was made to convert a non-absolute name to + wire when there was also a non-absolute (or missing) origin.""" + + +class NameTooLong(dns.exception.FormError): + + """A DNS name is > 255 octets long.""" + + +class LabelTooLong(dns.exception.SyntaxError): + + """A DNS label is > 63 octets long.""" + + +class AbsoluteConcatenation(dns.exception.DNSException): + + """An attempt was made to append anything other than the + empty name to an absolute DNS name.""" + + +class NoParent(dns.exception.DNSException): + + """An attempt was made to get the parent of the root name + or the empty name.""" + +class NoIDNA2008(dns.exception.DNSException): + + """IDNA 2008 processing was requested but the idna module is not + available.""" + + +class IDNAException(dns.exception.DNSException): + + """IDNA processing raised an exception.""" + + supp_kwargs = set(['idna_exception']) + fmt = "IDNA processing exception: {idna_exception}" + +class IDNACodec(object): + + """Abstract base class for IDNA encoder/decoders.""" + + def __init__(self): + pass + + def encode(self, label): + raise NotImplementedError + + def decode(self, label): + # We do not apply any IDNA policy on decode; we just + downcased = label.lower() + if downcased.startswith(b'xn--'): + try: + label = downcased[4:].decode('punycode') + except Exception as e: + raise IDNAException(idna_exception=e) + else: + label = maybe_decode(label) + return _escapify(label, True) + +class IDNA2003Codec(IDNACodec): + + """IDNA 2003 encoder/decoder.""" + + def __init__(self, strict_decode=False): + """Initialize the IDNA 2003 encoder/decoder. + @param strict_decode: If True, then IDNA2003 checking is done when + decoding. This can cause failures if the name was encoded with + IDNA2008. The default is False. + @type strict_decode: bool + """ + super(IDNA2003Codec, self).__init__() + self.strict_decode = strict_decode + + def encode(self, label): + if label == '': + return b'' + try: + return encodings.idna.ToASCII(label) + except UnicodeError: + raise LabelTooLong + + def decode(self, label): + if not self.strict_decode: + return super(IDNA2003Codec, self).decode(label) + if label == b'': + return u'' + try: + return _escapify(encodings.idna.ToUnicode(label), True) + except Exception as e: + raise IDNAException(idna_exception=e) + +class IDNA2008Codec(IDNACodec): + + """IDNA 2008 encoder/decoder.""" + + def __init__(self, uts_46=False, transitional=False, + allow_pure_ascii=False, strict_decode=False): + """Initialize the IDNA 2008 encoder/decoder. + @param uts_46: If True, apply Unicode IDNA compatibility processing + as described in Unicode Technical Standard #46 + (U{http://unicode.org/reports/tr46/}). This parameter is only + meaningful if IDNA 2008 is in use. If False, do not apply + the mapping. The default is False + @type uts_46: bool + @param transitional: If True, use the "transitional" mode described + in Unicode Technical Standard #46. This parameter is only + meaningful if IDNA 2008 is in use. The default is False. + @type transitional: bool + @param allow_pure_ascii: If True, then a label which + consists of only ASCII characters is allowed. This is less strict + than regular IDNA 2008, but is also necessary for mixed names, + e.g. a name with starting with "_sip._tcp." and ending in an IDN + suffixm which would otherwise be disallowed. The default is False + @type allow_pure_ascii: bool + @param strict_decode: If True, then IDNA2008 checking is done when + decoding. This can cause failures if the name was encoded with + IDNA2003. The default is False. + @type strict_decode: bool + """ + super(IDNA2008Codec, self).__init__() + self.uts_46 = uts_46 + self.transitional = transitional + self.allow_pure_ascii = allow_pure_ascii + self.strict_decode = strict_decode + + def is_all_ascii(self, label): + for c in label: + if ord(c) > 0x7f: + return False + return True + + def encode(self, label): + if label == '': + return b'' + if self.allow_pure_ascii and self.is_all_ascii(label): + return label.encode('ascii') + if not have_idna_2008: + raise NoIDNA2008 + try: + if self.uts_46: + label = idna.uts46_remap(label, False, self.transitional) + return idna.alabel(label) + except idna.IDNAError as e: + raise IDNAException(idna_exception=e) + + def decode(self, label): + if not self.strict_decode: + return super(IDNA2008Codec, self).decode(label) + if label == b'': + return u'' + if not have_idna_2008: + raise NoIDNA2008 + try: + if self.uts_46: + label = idna.uts46_remap(label, False, False) + return _escapify(idna.ulabel(label), True) + except idna.IDNAError as e: + raise IDNAException(idna_exception=e) + +_escaped = bytearray(b'"().;\\@$') + +IDNA_2003_Practical = IDNA2003Codec(False) +IDNA_2003_Strict = IDNA2003Codec(True) +IDNA_2003 = IDNA_2003_Practical +IDNA_2008_Practical = IDNA2008Codec(True, False, True, False) +IDNA_2008_UTS_46 = IDNA2008Codec(True, False, False, False) +IDNA_2008_Strict = IDNA2008Codec(False, False, False, True) +IDNA_2008_Transitional = IDNA2008Codec(True, True, False, False) +IDNA_2008 = IDNA_2008_Practical + +def _escapify(label, unicode_mode=False): + """Escape the characters in label which need it. + @param unicode_mode: escapify only special and whitespace (<= 0x20) + characters + @returns: the escaped string + @rtype: string""" + if not unicode_mode: + text = '' + if isinstance(label, text_type): + label = label.encode() + for c in bytearray(label): + if c in _escaped: + text += '\\' + chr(c) + elif c > 0x20 and c < 0x7F: + text += chr(c) + else: + text += '\\%03d' % c + return text.encode() + + text = u'' + if isinstance(label, binary_type): + label = label.decode() + for c in label: + if c > u'\x20' and c < u'\x7f': + text += c + else: + if c >= u'\x7f': + text += c + else: + text += u'\\%03d' % ord(c) + return text + +def _validate_labels(labels): + """Check for empty labels in the middle of a label sequence, + labels that are too long, and for too many labels. + @raises NameTooLong: the name as a whole is too long + @raises EmptyLabel: a label is empty (i.e. the root label) and appears + in a position other than the end of the label sequence""" + + l = len(labels) + total = 0 + i = -1 + j = 0 + for label in labels: + ll = len(label) + total += ll + 1 + if ll > 63: + raise LabelTooLong + if i < 0 and label == b'': + i = j + j += 1 + if total > 255: + raise NameTooLong + if i >= 0 and i != l - 1: + raise EmptyLabel + + +def _ensure_bytes(label): + if isinstance(label, binary_type): + return label + if isinstance(label, text_type): + return label.encode() + raise ValueError + + +class Name(object): + + """A DNS name. + + The dns.name.Name class represents a DNS name as a tuple of labels. + Instances of the class are immutable. + + @ivar labels: The tuple of labels in the name. Each label is a string of + up to 63 octets.""" + + __slots__ = ['labels'] + + def __init__(self, labels): + """Initialize a domain name from a list of labels. + @param labels: the labels + @type labels: any iterable whose values are strings + """ + labels = [_ensure_bytes(x) for x in labels] + super(Name, self).__setattr__('labels', tuple(labels)) + _validate_labels(self.labels) + + def __setattr__(self, name, value): + raise TypeError("object doesn't support attribute assignment") + + def __copy__(self): + return Name(self.labels) + + def __deepcopy__(self, memo): + return Name(copy.deepcopy(self.labels, memo)) + + def __getstate__(self): + return {'labels': self.labels} + + def __setstate__(self, state): + super(Name, self).__setattr__('labels', state['labels']) + _validate_labels(self.labels) + + def is_absolute(self): + """Is the most significant label of this name the root label? + @rtype: bool + """ + + return len(self.labels) > 0 and self.labels[-1] == b'' + + def is_wild(self): + """Is this name wild? (I.e. Is the least significant label '*'?) + @rtype: bool + """ + + return len(self.labels) > 0 and self.labels[0] == b'*' + + def __hash__(self): + """Return a case-insensitive hash of the name. + @rtype: int + """ + + h = long(0) + for label in self.labels: + for c in bytearray(label.lower()): + h += (h << 3) + c + return int(h % maxint) + + def fullcompare(self, other): + """Compare two names, returning a 3-tuple (relation, order, nlabels). + + I{relation} describes the relation ship between the names, + and is one of: dns.name.NAMERELN_NONE, + dns.name.NAMERELN_SUPERDOMAIN, dns.name.NAMERELN_SUBDOMAIN, + dns.name.NAMERELN_EQUAL, or dns.name.NAMERELN_COMMONANCESTOR + + I{order} is < 0 if self < other, > 0 if self > other, and == + 0 if self == other. A relative name is always less than an + absolute name. If both names have the same relativity, then + the DNSSEC order relation is used to order them. + + I{nlabels} is the number of significant labels that the two names + have in common. + """ + + sabs = self.is_absolute() + oabs = other.is_absolute() + if sabs != oabs: + if sabs: + return (NAMERELN_NONE, 1, 0) + else: + return (NAMERELN_NONE, -1, 0) + l1 = len(self.labels) + l2 = len(other.labels) + ldiff = l1 - l2 + if ldiff < 0: + l = l1 + else: + l = l2 + + order = 0 + nlabels = 0 + namereln = NAMERELN_NONE + while l > 0: + l -= 1 + l1 -= 1 + l2 -= 1 + label1 = self.labels[l1].lower() + label2 = other.labels[l2].lower() + if label1 < label2: + order = -1 + if nlabels > 0: + namereln = NAMERELN_COMMONANCESTOR + return (namereln, order, nlabels) + elif label1 > label2: + order = 1 + if nlabels > 0: + namereln = NAMERELN_COMMONANCESTOR + return (namereln, order, nlabels) + nlabels += 1 + order = ldiff + if ldiff < 0: + namereln = NAMERELN_SUPERDOMAIN + elif ldiff > 0: + namereln = NAMERELN_SUBDOMAIN + else: + namereln = NAMERELN_EQUAL + return (namereln, order, nlabels) + + def is_subdomain(self, other): + """Is self a subdomain of other? + + The notion of subdomain includes equality. + @rtype: bool + """ + + (nr, o, nl) = self.fullcompare(other) + if nr == NAMERELN_SUBDOMAIN or nr == NAMERELN_EQUAL: + return True + return False + + def is_superdomain(self, other): + """Is self a superdomain of other? + + The notion of subdomain includes equality. + @rtype: bool + """ + + (nr, o, nl) = self.fullcompare(other) + if nr == NAMERELN_SUPERDOMAIN or nr == NAMERELN_EQUAL: + return True + return False + + def canonicalize(self): + """Return a name which is equal to the current name, but is in + DNSSEC canonical form. + @rtype: dns.name.Name object + """ + + return Name([x.lower() for x in self.labels]) + + def __eq__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] == 0 + else: + return False + + def __ne__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] != 0 + else: + return True + + def __lt__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] < 0 + else: + return NotImplemented + + def __le__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] <= 0 + else: + return NotImplemented + + def __ge__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] >= 0 + else: + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Name): + return self.fullcompare(other)[1] > 0 + else: + return NotImplemented + + def __repr__(self): + return '' + + def __str__(self): + return self.to_text(False) + + def to_text(self, omit_final_dot=False): + """Convert name to text format. + @param omit_final_dot: If True, don't emit the final dot (denoting the + root label) for absolute names. The default is False. + @rtype: string + """ + + if len(self.labels) == 0: + return maybe_decode(b'@') + if len(self.labels) == 1 and self.labels[0] == b'': + return maybe_decode(b'.') + if omit_final_dot and self.is_absolute(): + l = self.labels[:-1] + else: + l = self.labels + s = b'.'.join(map(_escapify, l)) + return maybe_decode(s) + + def to_unicode(self, omit_final_dot=False, idna_codec=None): + """Convert name to Unicode text format. + + IDN ACE labels are converted to Unicode. + + @param omit_final_dot: If True, don't emit the final dot (denoting the + root label) for absolute names. The default is False. + @type omit_final_dot: bool + @param idna_codec: IDNA encoder/decoder. If None, the + IDNA_2003_Practical encoder/decoder is used. The IDNA_2003_Practical + decoder does not impose any policy, it just decodes punycode, so if + you don't want checking for compliance, you can use this decoder for + IDNA2008 as well. + @type idna_codec: dns.name.IDNA + @rtype: string + """ + + if len(self.labels) == 0: + return u'@' + if len(self.labels) == 1 and self.labels[0] == b'': + return u'.' + if omit_final_dot and self.is_absolute(): + l = self.labels[:-1] + else: + l = self.labels + if idna_codec is None: + idna_codec = IDNA_2003_Practical + return u'.'.join([idna_codec.decode(x) for x in l]) + + def to_digestable(self, origin=None): + """Convert name to a format suitable for digesting in hashes. + + The name is canonicalized and converted to uncompressed wire format. + + @param origin: If the name is relative and origin is not None, then + origin will be appended to it. + @type origin: dns.name.Name object + @raises NeedAbsoluteNameOrOrigin: All names in wire format are + absolute. If self is a relative name, then an origin must be supplied; + if it is missing, then this exception is raised + @rtype: string + """ + + if not self.is_absolute(): + if origin is None or not origin.is_absolute(): + raise NeedAbsoluteNameOrOrigin + labels = list(self.labels) + labels.extend(list(origin.labels)) + else: + labels = self.labels + dlabels = [struct.pack('!B%ds' % len(x), len(x), x.lower()) + for x in labels] + return b''.join(dlabels) + + def to_wire(self, file=None, compress=None, origin=None): + """Convert name to wire format, possibly compressing it. + + @param file: the file where the name is emitted (typically + a BytesIO file). If None, a string containing the wire name + will be returned. + @type file: file or None + @param compress: The compression table. If None (the default) names + will not be compressed. + @type compress: dict + @param origin: If the name is relative and origin is not None, then + origin will be appended to it. + @type origin: dns.name.Name object + @raises NeedAbsoluteNameOrOrigin: All names in wire format are + absolute. If self is a relative name, then an origin must be supplied; + if it is missing, then this exception is raised + """ + + if file is None: + file = BytesIO() + want_return = True + else: + want_return = False + + if not self.is_absolute(): + if origin is None or not origin.is_absolute(): + raise NeedAbsoluteNameOrOrigin + labels = list(self.labels) + labels.extend(list(origin.labels)) + else: + labels = self.labels + i = 0 + for label in labels: + n = Name(labels[i:]) + i += 1 + if compress is not None: + pos = compress.get(n) + else: + pos = None + if pos is not None: + value = 0xc000 + pos + s = struct.pack('!H', value) + file.write(s) + break + else: + if compress is not None and len(n) > 1: + pos = file.tell() + if pos <= 0x3fff: + compress[n] = pos + l = len(label) + file.write(struct.pack('!B', l)) + if l > 0: + file.write(label) + if want_return: + return file.getvalue() + + def __len__(self): + """The length of the name (in labels). + @rtype: int + """ + + return len(self.labels) + + def __getitem__(self, index): + return self.labels[index] + + def __add__(self, other): + return self.concatenate(other) + + def __sub__(self, other): + return self.relativize(other) + + def split(self, depth): + """Split a name into a prefix and suffix at depth. + + @param depth: the number of labels in the suffix + @type depth: int + @raises ValueError: the depth was not >= 0 and <= the length of the + name. + @returns: the tuple (prefix, suffix) + @rtype: tuple + """ + + l = len(self.labels) + if depth == 0: + return (self, dns.name.empty) + elif depth == l: + return (dns.name.empty, self) + elif depth < 0 or depth > l: + raise ValueError( + 'depth must be >= 0 and <= the length of the name') + return (Name(self[: -depth]), Name(self[-depth:])) + + def concatenate(self, other): + """Return a new name which is the concatenation of self and other. + @rtype: dns.name.Name object + @raises AbsoluteConcatenation: self is absolute and other is + not the empty name + """ + + if self.is_absolute() and len(other) > 0: + raise AbsoluteConcatenation + labels = list(self.labels) + labels.extend(list(other.labels)) + return Name(labels) + + def relativize(self, origin): + """If self is a subdomain of origin, return a new name which is self + relative to origin. Otherwise return self. + @rtype: dns.name.Name object + """ + + if origin is not None and self.is_subdomain(origin): + return Name(self[: -len(origin)]) + else: + return self + + def derelativize(self, origin): + """If self is a relative name, return a new name which is the + concatenation of self and origin. Otherwise return self. + @rtype: dns.name.Name object + """ + + if not self.is_absolute(): + return self.concatenate(origin) + else: + return self + + def choose_relativity(self, origin=None, relativize=True): + """Return a name with the relativity desired by the caller. If + origin is None, then self is returned. Otherwise, if + relativize is true the name is relativized, and if relativize is + false the name is derelativized. + @rtype: dns.name.Name object + """ + + if origin: + if relativize: + return self.relativize(origin) + else: + return self.derelativize(origin) + else: + return self + + def parent(self): + """Return the parent of the name. + @rtype: dns.name.Name object + @raises NoParent: the name is either the root name or the empty name, + and thus has no parent. + """ + if self == root or self == empty: + raise NoParent + return Name(self.labels[1:]) + +root = Name([b'']) +empty = Name([]) + + +def from_unicode(text, origin=root, idna_codec=None): + """Convert unicode text into a Name object. + + Labels are encoded in IDN ACE form. + + @param text: The text to convert into a name. + @type text: Unicode string + @param origin: The origin to append to non-absolute names. + @type origin: dns.name.Name + @param idna_codec: IDNA encoder/decoder. If None, the default IDNA 2003 + encoder/decoder is used. + @type idna_codec: dns.name.IDNA + @rtype: dns.name.Name object + """ + + if not isinstance(text, text_type): + raise ValueError("input to from_unicode() must be a unicode string") + if not (origin is None or isinstance(origin, Name)): + raise ValueError("origin must be a Name or None") + labels = [] + label = u'' + escaping = False + edigits = 0 + total = 0 + if idna_codec is None: + idna_codec = IDNA_2003 + if text == u'@': + text = u'' + if text: + if text == u'.': + return Name([b'']) # no Unicode "u" on this constant! + for c in text: + if escaping: + if edigits == 0: + if c.isdigit(): + total = int(c) + edigits += 1 + else: + label += c + escaping = False + else: + if not c.isdigit(): + raise BadEscape + total *= 10 + total += int(c) + edigits += 1 + if edigits == 3: + escaping = False + label += unichr(total) + elif c in [u'.', u'\u3002', u'\uff0e', u'\uff61']: + if len(label) == 0: + raise EmptyLabel + labels.append(idna_codec.encode(label)) + label = u'' + elif c == u'\\': + escaping = True + edigits = 0 + total = 0 + else: + label += c + if escaping: + raise BadEscape + if len(label) > 0: + labels.append(idna_codec.encode(label)) + else: + labels.append(b'') + + if (len(labels) == 0 or labels[-1] != b'') and origin is not None: + labels.extend(list(origin.labels)) + return Name(labels) + + +def from_text(text, origin=root, idna_codec=None): + """Convert text into a Name object. + + @param text: The text to convert into a name. + @type text: string + @param origin: The origin to append to non-absolute names. + @type origin: dns.name.Name + @param idna_codec: IDNA encoder/decoder. If None, the default IDNA 2003 + encoder/decoder is used. + @type idna_codec: dns.name.IDNA + @rtype: dns.name.Name object + """ + + if isinstance(text, text_type): + return from_unicode(text, origin, idna_codec) + if not isinstance(text, binary_type): + raise ValueError("input to from_text() must be a string") + if not (origin is None or isinstance(origin, Name)): + raise ValueError("origin must be a Name or None") + labels = [] + label = b'' + escaping = False + edigits = 0 + total = 0 + if text == b'@': + text = b'' + if text: + if text == b'.': + return Name([b'']) + for c in bytearray(text): + byte_ = struct.pack('!B', c) + if escaping: + if edigits == 0: + if byte_.isdigit(): + total = int(byte_) + edigits += 1 + else: + label += byte_ + escaping = False + else: + if not byte_.isdigit(): + raise BadEscape + total *= 10 + total += int(byte_) + edigits += 1 + if edigits == 3: + escaping = False + label += struct.pack('!B', total) + elif byte_ == b'.': + if len(label) == 0: + raise EmptyLabel + labels.append(label) + label = b'' + elif byte_ == b'\\': + escaping = True + edigits = 0 + total = 0 + else: + label += byte_ + if escaping: + raise BadEscape + if len(label) > 0: + labels.append(label) + else: + labels.append(b'') + if (len(labels) == 0 or labels[-1] != b'') and origin is not None: + labels.extend(list(origin.labels)) + return Name(labels) + + +def from_wire(message, current): + """Convert possibly compressed wire format into a Name. + @param message: the entire DNS message + @type message: string + @param current: the offset of the beginning of the name from the start + of the message + @type current: int + @raises dns.name.BadPointer: a compression pointer did not point backwards + in the message + @raises dns.name.BadLabelType: an invalid label type was encountered. + @returns: a tuple consisting of the name that was read and the number + of bytes of the wire format message which were consumed reading it + @rtype: (dns.name.Name object, int) tuple + """ + + if not isinstance(message, binary_type): + raise ValueError("input to from_wire() must be a byte string") + message = dns.wiredata.maybe_wrap(message) + labels = [] + biggest_pointer = current + hops = 0 + count = message[current] + current += 1 + cused = 1 + while count != 0: + if count < 64: + labels.append(message[current: current + count].unwrap()) + current += count + if hops == 0: + cused += count + elif count >= 192: + current = (count & 0x3f) * 256 + message[current] + if hops == 0: + cused += 1 + if current >= biggest_pointer: + raise BadPointer + biggest_pointer = current + hops += 1 + else: + raise BadLabelType + count = message[current] + current += 1 + if hops == 0: + cused += 1 + labels.append('') + return (Name(labels), cused) diff --git a/Contents/Libraries/Shared/dns/namedict.py b/Contents/Libraries/Shared/dns/namedict.py new file mode 100644 index 000000000..58e403440 --- /dev/null +++ b/Contents/Libraries/Shared/dns/namedict.py @@ -0,0 +1,104 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# Copyright (C) 2016 Coresec Systems AB +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND CORESEC SYSTEMS AB DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CORESEC +# SYSTEMS AB BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS name dictionary""" + +import collections +import dns.name +from ._compat import xrange + + +class NameDict(collections.MutableMapping): + + """A dictionary whose keys are dns.name.Name objects. + @ivar max_depth: the maximum depth of the keys that have ever been + added to the dictionary. + @type max_depth: int + @ivar max_depth_items: the number of items of maximum depth + @type max_depth_items: int + """ + + __slots__ = ["max_depth", "max_depth_items", "__store"] + + def __init__(self, *args, **kwargs): + self.__store = dict() + self.max_depth = 0 + self.max_depth_items = 0 + self.update(dict(*args, **kwargs)) + + def __update_max_depth(self, key): + if len(key) == self.max_depth: + self.max_depth_items = self.max_depth_items + 1 + elif len(key) > self.max_depth: + self.max_depth = len(key) + self.max_depth_items = 1 + + def __getitem__(self, key): + return self.__store[key] + + def __setitem__(self, key, value): + if not isinstance(key, dns.name.Name): + raise ValueError('NameDict key must be a name') + self.__store[key] = value + self.__update_max_depth(key) + + def __delitem__(self, key): + value = self.__store.pop(key) + if len(value) == self.max_depth: + self.max_depth_items = self.max_depth_items - 1 + if self.max_depth_items == 0: + self.max_depth = 0 + for k in self.__store: + self.__update_max_depth(k) + + def __iter__(self): + return iter(self.__store) + + def __len__(self): + return len(self.__store) + + def has_key(self, key): + return key in self.__store + + def get_deepest_match(self, name): + """Find the deepest match to I{name} in the dictionary. + + The deepest match is the longest name in the dictionary which is + a superdomain of I{name}. + + @param name: the name + @type name: dns.name.Name object + @rtype: (key, value) tuple + """ + + depth = len(name) + if depth > self.max_depth: + depth = self.max_depth + for i in xrange(-depth, 0): + n = dns.name.Name(name[i:]) + if n in self: + return (n, self[n]) + v = self[dns.name.empty] + return (dns.name.empty, v) diff --git a/Contents/Libraries/Shared/dns/node.py b/Contents/Libraries/Shared/dns/node.py new file mode 100644 index 000000000..7c25060e9 --- /dev/null +++ b/Contents/Libraries/Shared/dns/node.py @@ -0,0 +1,178 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS nodes. A node is a set of rdatasets.""" + +from io import StringIO + +import dns.rdataset +import dns.rdatatype +import dns.renderer + + +class Node(object): + + """A DNS node. + + A node is a set of rdatasets + + @ivar rdatasets: the node's rdatasets + @type rdatasets: list of dns.rdataset.Rdataset objects""" + + __slots__ = ['rdatasets'] + + def __init__(self): + """Initialize a DNS node. + """ + + self.rdatasets = [] + + def to_text(self, name, **kw): + """Convert a node to text format. + + Each rdataset at the node is printed. Any keyword arguments + to this method are passed on to the rdataset's to_text() method. + @param name: the owner name of the rdatasets + @type name: dns.name.Name object + @rtype: string + """ + + s = StringIO() + for rds in self.rdatasets: + if len(rds) > 0: + s.write(rds.to_text(name, **kw)) + s.write(u'\n') + return s.getvalue()[:-1] + + def __repr__(self): + return '' + + def __eq__(self, other): + """Two nodes are equal if they have the same rdatasets. + + @rtype: bool + """ + # + # This is inefficient. Good thing we don't need to do it much. + # + for rd in self.rdatasets: + if rd not in other.rdatasets: + return False + for rd in other.rdatasets: + if rd not in self.rdatasets: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __len__(self): + return len(self.rdatasets) + + def __iter__(self): + return iter(self.rdatasets) + + def find_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Find an rdataset matching the specified properties in the + current node. + + @param rdclass: The class of the rdataset + @type rdclass: int + @param rdtype: The type of the rdataset + @type rdtype: int + @param covers: The covered type. Usually this value is + dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or + dns.rdatatype.RRSIG, then the covers value will be the rdata + type the SIG/RRSIG covers. The library treats the SIG and RRSIG + types as if they were a family of + types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much + easier to work with than if RRSIGs covering different rdata + types were aggregated into a single RRSIG rdataset. + @type covers: int + @param create: If True, create the rdataset if it is not found. + @type create: bool + @raises KeyError: An rdataset of the desired type and class does + not exist and I{create} is not True. + @rtype: dns.rdataset.Rdataset object + """ + + for rds in self.rdatasets: + if rds.match(rdclass, rdtype, covers): + return rds + if not create: + raise KeyError + rds = dns.rdataset.Rdataset(rdclass, rdtype) + self.rdatasets.append(rds) + return rds + + def get_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Get an rdataset matching the specified properties in the + current node. + + None is returned if an rdataset of the specified type and + class does not exist and I{create} is not True. + + @param rdclass: The class of the rdataset + @type rdclass: int + @param rdtype: The type of the rdataset + @type rdtype: int + @param covers: The covered type. + @type covers: int + @param create: If True, create the rdataset if it is not found. + @type create: bool + @rtype: dns.rdataset.Rdataset object or None + """ + + try: + rds = self.find_rdataset(rdclass, rdtype, covers, create) + except KeyError: + rds = None + return rds + + def delete_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE): + """Delete the rdataset matching the specified properties in the + current node. + + If a matching rdataset does not exist, it is not an error. + + @param rdclass: The class of the rdataset + @type rdclass: int + @param rdtype: The type of the rdataset + @type rdtype: int + @param covers: The covered type. + @type covers: int + """ + + rds = self.get_rdataset(rdclass, rdtype, covers) + if rds is not None: + self.rdatasets.remove(rds) + + def replace_rdataset(self, replacement): + """Replace an rdataset. + + It is not an error if there is no rdataset matching I{replacement}. + + Ownership of the I{replacement} object is transferred to the node; + in other words, this method does not store a copy of I{replacement} + at the node, it stores I{replacement} itself. + """ + + if not isinstance(replacement, dns.rdataset.Rdataset): + raise ValueError('replacement is not an rdataset') + self.delete_rdataset(replacement.rdclass, replacement.rdtype, + replacement.covers) + self.rdatasets.append(replacement) diff --git a/Contents/Libraries/Shared/dns/opcode.py b/Contents/Libraries/Shared/dns/opcode.py new file mode 100644 index 000000000..70d704fb3 --- /dev/null +++ b/Contents/Libraries/Shared/dns/opcode.py @@ -0,0 +1,107 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Opcodes.""" + +import dns.exception + +QUERY = 0 +IQUERY = 1 +STATUS = 2 +NOTIFY = 4 +UPDATE = 5 + +_by_text = { + 'QUERY': QUERY, + 'IQUERY': IQUERY, + 'STATUS': STATUS, + 'NOTIFY': NOTIFY, + 'UPDATE': UPDATE +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + + +class UnknownOpcode(dns.exception.DNSException): + + """An DNS opcode is unknown.""" + + +def from_text(text): + """Convert text into an opcode. + + @param text: the textual opcode + @type text: string + @raises UnknownOpcode: the opcode is unknown + @rtype: int + """ + + if text.isdigit(): + value = int(text) + if value >= 0 and value <= 15: + return value + value = _by_text.get(text.upper()) + if value is None: + raise UnknownOpcode + return value + + +def from_flags(flags): + """Extract an opcode from DNS message flags. + + @param flags: int + @rtype: int + """ + + return (flags & 0x7800) >> 11 + + +def to_flags(value): + """Convert an opcode to a value suitable for ORing into DNS message + flags. + @rtype: int + """ + + return (value << 11) & 0x7800 + + +def to_text(value): + """Convert an opcode to text. + + @param value: the opcdoe + @type value: int + @raises UnknownOpcode: the opcode is unknown + @rtype: string + """ + + text = _by_value.get(value) + if text is None: + text = str(value) + return text + + +def is_update(flags): + """True if the opcode in flags is UPDATE. + + @param flags: DNS flags + @type flags: int + @rtype: bool + """ + + return from_flags(flags) == UPDATE diff --git a/Contents/Libraries/Shared/dns/query.py b/Contents/Libraries/Shared/dns/query.py new file mode 100644 index 000000000..bfecd43e5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/query.py @@ -0,0 +1,539 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Talk to a DNS server.""" + +from __future__ import generators + +import errno +import select +import socket +import struct +import sys +import time + +import dns.exception +import dns.inet +import dns.name +import dns.message +import dns.rdataclass +import dns.rdatatype +from ._compat import long, string_types + +if sys.version_info > (3,): + select_error = OSError +else: + select_error = select.error + +# Function used to create a socket. Can be overridden if needed in special +# situations. +socket_factory = socket.socket + +class UnexpectedSource(dns.exception.DNSException): + + """A DNS query response came from an unexpected address or port.""" + + +class BadResponse(dns.exception.FormError): + + """A DNS query response does not respond to the question asked.""" + + +def _compute_expiration(timeout): + if timeout is None: + return None + else: + return time.time() + timeout + + +def _poll_for(fd, readable, writable, error, timeout): + """Poll polling backend. + @param fd: File descriptor + @type fd: int + @param readable: Whether to wait for readability + @type readable: bool + @param writable: Whether to wait for writability + @type writable: bool + @param timeout: Deadline timeout (expiration time, in seconds) + @type timeout: float + @return True on success, False on timeout + """ + event_mask = 0 + if readable: + event_mask |= select.POLLIN + if writable: + event_mask |= select.POLLOUT + if error: + event_mask |= select.POLLERR + + pollable = select.poll() + pollable.register(fd, event_mask) + + if timeout: + event_list = pollable.poll(long(timeout * 1000)) + else: + event_list = pollable.poll() + + return bool(event_list) + + +def _select_for(fd, readable, writable, error, timeout): + """Select polling backend. + @param fd: File descriptor + @type fd: int + @param readable: Whether to wait for readability + @type readable: bool + @param writable: Whether to wait for writability + @type writable: bool + @param timeout: Deadline timeout (expiration time, in seconds) + @type timeout: float + @return True on success, False on timeout + """ + rset, wset, xset = [], [], [] + + if readable: + rset = [fd] + if writable: + wset = [fd] + if error: + xset = [fd] + + if timeout is None: + (rcount, wcount, xcount) = select.select(rset, wset, xset) + else: + (rcount, wcount, xcount) = select.select(rset, wset, xset, timeout) + + return bool((rcount or wcount or xcount)) + + +def _wait_for(fd, readable, writable, error, expiration): + done = False + while not done: + if expiration is None: + timeout = None + else: + timeout = expiration - time.time() + if timeout <= 0.0: + raise dns.exception.Timeout + try: + if not _polling_backend(fd, readable, writable, error, timeout): + raise dns.exception.Timeout + except select_error as e: + if e.args[0] != errno.EINTR: + raise e + done = True + + +def _set_polling_backend(fn): + """ + Internal API. Do not use. + """ + global _polling_backend + + _polling_backend = fn + +if hasattr(select, 'poll'): + # Prefer poll() on platforms that support it because it has no + # limits on the maximum value of a file descriptor (plus it will + # be more efficient for high values). + _polling_backend = _poll_for +else: + _polling_backend = _select_for + + +def _wait_for_readable(s, expiration): + _wait_for(s, True, False, True, expiration) + + +def _wait_for_writable(s, expiration): + _wait_for(s, False, True, True, expiration) + + +def _addresses_equal(af, a1, a2): + # Convert the first value of the tuple, which is a textual format + # address into binary form, so that we are not confused by different + # textual representations of the same address + n1 = dns.inet.inet_pton(af, a1[0]) + n2 = dns.inet.inet_pton(af, a2[0]) + return n1 == n2 and a1[1:] == a2[1:] + + +def _destination_and_source(af, where, port, source, source_port): + # Apply defaults and compute destination and source tuples + # suitable for use in connect(), sendto(), or bind(). + if af is None: + try: + af = dns.inet.af_for_address(where) + except Exception: + af = dns.inet.AF_INET + if af == dns.inet.AF_INET: + destination = (where, port) + if source is not None or source_port != 0: + if source is None: + source = '0.0.0.0' + source = (source, source_port) + elif af == dns.inet.AF_INET6: + destination = (where, port, 0, 0) + if source is not None or source_port != 0: + if source is None: + source = '::' + source = (source, source_port, 0, 0) + return (af, destination, source) + + +def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, + ignore_unexpected=False, one_rr_per_rrset=False): + """Return the response obtained after sending a query via UDP. + + @param q: the query + @type q: dns.message.Message + @param where: where to send the message + @type where: string containing an IPv4 or IPv6 address + @param timeout: The number of seconds to wait before the query times out. + If None, the default, wait forever. + @type timeout: float + @param port: The port to which to send the message. The default is 53. + @type port: int + @param af: the address family to use. The default is None, which + causes the address family to use to be inferred from the form of where. + If the inference attempt fails, AF_INET is used. + @type af: int + @rtype: dns.message.Message object + @param source: source address. The default is the wildcard address. + @type source: string + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @param ignore_unexpected: If True, ignore responses from unexpected + sources. The default is False. + @type ignore_unexpected: bool + @param one_rr_per_rrset: Put each RR into its own RRset + @type one_rr_per_rrset: bool + """ + + wire = q.to_wire() + (af, destination, source) = _destination_and_source(af, where, port, + source, source_port) + s = socket_factory(af, socket.SOCK_DGRAM, 0) + begin_time = None + try: + expiration = _compute_expiration(timeout) + s.setblocking(0) + if source is not None: + s.bind(source) + _wait_for_writable(s, expiration) + begin_time = time.time() + s.sendto(wire, destination) + while 1: + _wait_for_readable(s, expiration) + (wire, from_address) = s.recvfrom(65535) + if _addresses_equal(af, from_address, destination) or \ + (dns.inet.is_multicast(where) and + from_address[1:] == destination[1:]): + break + if not ignore_unexpected: + raise UnexpectedSource('got a response from ' + '%s instead of %s' % (from_address, + destination)) + finally: + if begin_time is None: + response_time = 0 + else: + response_time = time.time() - begin_time + s.close() + r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, + one_rr_per_rrset=one_rr_per_rrset) + r.time = response_time + if not q.is_response(r): + raise BadResponse + return r + + +def _net_read(sock, count, expiration): + """Read the specified number of bytes from sock. Keep trying until we + either get the desired amount, or we hit EOF. + A Timeout exception will be raised if the operation is not completed + by the expiration time. + """ + s = b'' + while count > 0: + _wait_for_readable(sock, expiration) + n = sock.recv(count) + if n == b'': + raise EOFError + count = count - len(n) + s = s + n + return s + + +def _net_write(sock, data, expiration): + """Write the specified data to the socket. + A Timeout exception will be raised if the operation is not completed + by the expiration time. + """ + current = 0 + l = len(data) + while current < l: + _wait_for_writable(sock, expiration) + current += sock.send(data[current:]) + + +def _connect(s, address): + try: + s.connect(address) + except socket.error: + (ty, v) = sys.exc_info()[:2] + + if hasattr(v, 'errno'): + v_err = v.errno + else: + v_err = v[0] + if v_err not in [errno.EINPROGRESS, errno.EWOULDBLOCK, errno.EALREADY]: + raise v + + +def tcp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, + one_rr_per_rrset=False): + """Return the response obtained after sending a query via TCP. + + @param q: the query + @type q: dns.message.Message object + @param where: where to send the message + @type where: string containing an IPv4 or IPv6 address + @param timeout: The number of seconds to wait before the query times out. + If None, the default, wait forever. + @type timeout: float + @param port: The port to which to send the message. The default is 53. + @type port: int + @param af: the address family to use. The default is None, which + causes the address family to use to be inferred from the form of where. + If the inference attempt fails, AF_INET is used. + @type af: int + @rtype: dns.message.Message object + @param source: source address. The default is the wildcard address. + @type source: string + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @param one_rr_per_rrset: Put each RR into its own RRset + @type one_rr_per_rrset: bool + """ + + wire = q.to_wire() + (af, destination, source) = _destination_and_source(af, where, port, + source, source_port) + s = socket_factory(af, socket.SOCK_STREAM, 0) + begin_time = None + try: + expiration = _compute_expiration(timeout) + s.setblocking(0) + begin_time = time.time() + if source is not None: + s.bind(source) + _connect(s, destination) + + l = len(wire) + + # copying the wire into tcpmsg is inefficient, but lets us + # avoid writev() or doing a short write that would get pushed + # onto the net + tcpmsg = struct.pack("!H", l) + wire + _net_write(s, tcpmsg, expiration) + ldata = _net_read(s, 2, expiration) + (l,) = struct.unpack("!H", ldata) + wire = _net_read(s, l, expiration) + finally: + if begin_time is None: + response_time = 0 + else: + response_time = time.time() - begin_time + s.close() + r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, + one_rr_per_rrset=one_rr_per_rrset) + r.time = response_time + if not q.is_response(r): + raise BadResponse + return r + + +def xfr(where, zone, rdtype=dns.rdatatype.AXFR, rdclass=dns.rdataclass.IN, + timeout=None, port=53, keyring=None, keyname=None, relativize=True, + af=None, lifetime=None, source=None, source_port=0, serial=0, + use_udp=False, keyalgorithm=dns.tsig.default_algorithm): + """Return a generator for the responses to a zone transfer. + + @param where: where to send the message + @type where: string containing an IPv4 or IPv6 address + @param zone: The name of the zone to transfer + @type zone: dns.name.Name object or string + @param rdtype: The type of zone transfer. The default is + dns.rdatatype.AXFR. + @type rdtype: int or string + @param rdclass: The class of the zone transfer. The default is + dns.rdataclass.IN. + @type rdclass: int or string + @param timeout: The number of seconds to wait for each response message. + If None, the default, wait forever. + @type timeout: float + @param port: The port to which to send the message. The default is 53. + @type port: int + @param keyring: The TSIG keyring to use + @type keyring: dict + @param keyname: The name of the TSIG key to use + @type keyname: dns.name.Name object or string + @param relativize: If True, all names in the zone will be relativized to + the zone origin. It is essential that the relativize setting matches + the one specified to dns.zone.from_xfr(). + @type relativize: bool + @param af: the address family to use. The default is None, which + causes the address family to use to be inferred from the form of where. + If the inference attempt fails, AF_INET is used. + @type af: int + @param lifetime: The total number of seconds to spend doing the transfer. + If None, the default, then there is no limit on the time the transfer may + take. + @type lifetime: float + @rtype: generator of dns.message.Message objects. + @param source: source address. The default is the wildcard address. + @type source: string + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @param serial: The SOA serial number to use as the base for an IXFR diff + sequence (only meaningful if rdtype == dns.rdatatype.IXFR). + @type serial: int + @param use_udp: Use UDP (only meaningful for IXFR) + @type use_udp: bool + @param keyalgorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm + @type keyalgorithm: string + """ + + if isinstance(zone, string_types): + zone = dns.name.from_text(zone) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + q = dns.message.make_query(zone, rdtype, rdclass) + if rdtype == dns.rdatatype.IXFR: + rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', + '. . %u 0 0 0 0' % serial) + q.authority.append(rrset) + if keyring is not None: + q.use_tsig(keyring, keyname, algorithm=keyalgorithm) + wire = q.to_wire() + (af, destination, source) = _destination_and_source(af, where, port, + source, source_port) + if use_udp: + if rdtype != dns.rdatatype.IXFR: + raise ValueError('cannot do a UDP AXFR') + s = socket_factory(af, socket.SOCK_DGRAM, 0) + else: + s = socket_factory(af, socket.SOCK_STREAM, 0) + s.setblocking(0) + if source is not None: + s.bind(source) + expiration = _compute_expiration(lifetime) + _connect(s, destination) + l = len(wire) + if use_udp: + _wait_for_writable(s, expiration) + s.send(wire) + else: + tcpmsg = struct.pack("!H", l) + wire + _net_write(s, tcpmsg, expiration) + done = False + delete_mode = True + expecting_SOA = False + soa_rrset = None + if relativize: + origin = zone + oname = dns.name.empty + else: + origin = None + oname = zone + tsig_ctx = None + first = True + while not done: + mexpiration = _compute_expiration(timeout) + if mexpiration is None or mexpiration > expiration: + mexpiration = expiration + if use_udp: + _wait_for_readable(s, expiration) + (wire, from_address) = s.recvfrom(65535) + else: + ldata = _net_read(s, 2, mexpiration) + (l,) = struct.unpack("!H", ldata) + wire = _net_read(s, l, mexpiration) + is_ixfr = (rdtype == dns.rdatatype.IXFR) + r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, + xfr=True, origin=origin, tsig_ctx=tsig_ctx, + multi=True, first=first, + one_rr_per_rrset=is_ixfr) + tsig_ctx = r.tsig_ctx + first = False + answer_index = 0 + if soa_rrset is None: + if not r.answer or r.answer[0].name != oname: + raise dns.exception.FormError( + "No answer or RRset not for qname") + rrset = r.answer[0] + if rrset.rdtype != dns.rdatatype.SOA: + raise dns.exception.FormError("first RRset is not an SOA") + answer_index = 1 + soa_rrset = rrset.copy() + if rdtype == dns.rdatatype.IXFR: + if soa_rrset[0].serial <= serial: + # + # We're already up-to-date. + # + done = True + else: + expecting_SOA = True + # + # Process SOAs in the answer section (other than the initial + # SOA in the first message). + # + for rrset in r.answer[answer_index:]: + if done: + raise dns.exception.FormError("answers after final SOA") + if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname: + if expecting_SOA: + if rrset[0].serial != serial: + raise dns.exception.FormError( + "IXFR base serial mismatch") + expecting_SOA = False + elif rdtype == dns.rdatatype.IXFR: + delete_mode = not delete_mode + # + # If this SOA RRset is equal to the first we saw then we're + # finished. If this is an IXFR we also check that we're seeing + # the record in the expected part of the response. + # + if rrset == soa_rrset and \ + (rdtype == dns.rdatatype.AXFR or + (rdtype == dns.rdatatype.IXFR and delete_mode)): + done = True + elif expecting_SOA: + # + # We made an IXFR request and are expecting another + # SOA RR, but saw something else, so this must be an + # AXFR response. + # + rdtype = dns.rdatatype.AXFR + expecting_SOA = False + if done and q.keyring and not r.had_tsig: + raise dns.exception.FormError("missing TSIG") + yield r + s.close() diff --git a/Contents/Libraries/Shared/dns/rcode.py b/Contents/Libraries/Shared/dns/rcode.py new file mode 100644 index 000000000..314815f7c --- /dev/null +++ b/Contents/Libraries/Shared/dns/rcode.py @@ -0,0 +1,125 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Result Codes.""" + +import dns.exception +from ._compat import long + + +NOERROR = 0 +FORMERR = 1 +SERVFAIL = 2 +NXDOMAIN = 3 +NOTIMP = 4 +REFUSED = 5 +YXDOMAIN = 6 +YXRRSET = 7 +NXRRSET = 8 +NOTAUTH = 9 +NOTZONE = 10 +BADVERS = 16 + +_by_text = { + 'NOERROR': NOERROR, + 'FORMERR': FORMERR, + 'SERVFAIL': SERVFAIL, + 'NXDOMAIN': NXDOMAIN, + 'NOTIMP': NOTIMP, + 'REFUSED': REFUSED, + 'YXDOMAIN': YXDOMAIN, + 'YXRRSET': YXRRSET, + 'NXRRSET': NXRRSET, + 'NOTAUTH': NOTAUTH, + 'NOTZONE': NOTZONE, + 'BADVERS': BADVERS +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be a true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + + +class UnknownRcode(dns.exception.DNSException): + + """A DNS rcode is unknown.""" + + +def from_text(text): + """Convert text into an rcode. + + @param text: the textual rcode + @type text: string + @raises UnknownRcode: the rcode is unknown + @rtype: int + """ + + if text.isdigit(): + v = int(text) + if v >= 0 and v <= 4095: + return v + v = _by_text.get(text.upper()) + if v is None: + raise UnknownRcode + return v + + +def from_flags(flags, ednsflags): + """Return the rcode value encoded by flags and ednsflags. + + @param flags: the DNS flags + @type flags: int + @param ednsflags: the EDNS flags + @type ednsflags: int + @raises ValueError: rcode is < 0 or > 4095 + @rtype: int + """ + + value = (flags & 0x000f) | ((ednsflags >> 20) & 0xff0) + if value < 0 or value > 4095: + raise ValueError('rcode must be >= 0 and <= 4095') + return value + + +def to_flags(value): + """Return a (flags, ednsflags) tuple which encodes the rcode. + + @param value: the rcode + @type value: int + @raises ValueError: rcode is < 0 or > 4095 + @rtype: (int, int) tuple + """ + + if value < 0 or value > 4095: + raise ValueError('rcode must be >= 0 and <= 4095') + v = value & 0xf + ev = long(value & 0xff0) << 20 + return (v, ev) + + +def to_text(value): + """Convert rcode into text. + + @param value: the rcode + @type value: int + @rtype: string + """ + + text = _by_value.get(value) + if text is None: + text = str(value) + return text diff --git a/Contents/Libraries/Shared/dns/rdata.py b/Contents/Libraries/Shared/dns/rdata.py new file mode 100644 index 000000000..9e9344d5c --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdata.py @@ -0,0 +1,458 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS rdata. + +@var _rdata_modules: A dictionary mapping a (rdclass, rdtype) tuple to +the module which implements that type. +@type _rdata_modules: dict +@var _module_prefix: The prefix to use when forming modules names. The +default is 'dns.rdtypes'. Changing this value will break the library. +@type _module_prefix: string +@var _hex_chunk: At most this many octets that will be represented in each +chunk of hexstring that _hexify() produces before whitespace occurs. +@type _hex_chunk: int""" + +from io import BytesIO +import base64 +import binascii + +import dns.exception +import dns.name +import dns.rdataclass +import dns.rdatatype +import dns.tokenizer +import dns.wiredata +from ._compat import xrange, string_types, text_type + +_hex_chunksize = 32 + + +def _hexify(data, chunksize=_hex_chunksize): + """Convert a binary string into its hex encoding, broken up into chunks + of I{chunksize} characters separated by a space. + + @param data: the binary string + @type data: string + @param chunksize: the chunk size. Default is L{dns.rdata._hex_chunksize} + @rtype: string + """ + + line = binascii.hexlify(data) + return b' '.join([line[i:i + chunksize] + for i + in range(0, len(line), chunksize)]).decode() + +_base64_chunksize = 32 + + +def _base64ify(data, chunksize=_base64_chunksize): + """Convert a binary string into its base64 encoding, broken up into chunks + of I{chunksize} characters separated by a space. + + @param data: the binary string + @type data: string + @param chunksize: the chunk size. Default is + L{dns.rdata._base64_chunksize} + @rtype: string + """ + + line = base64.b64encode(data) + return b' '.join([line[i:i + chunksize] + for i + in range(0, len(line), chunksize)]).decode() + +__escaped = bytearray(b'"\\') + +def _escapify(qstring): + """Escape the characters in a quoted string which need it. + + @param qstring: the string + @type qstring: string + @returns: the escaped string + @rtype: string + """ + + if isinstance(qstring, text_type): + qstring = qstring.encode() + if not isinstance(qstring, bytearray): + qstring = bytearray(qstring) + + text = '' + for c in qstring: + if c in __escaped: + text += '\\' + chr(c) + elif c >= 0x20 and c < 0x7F: + text += chr(c) + else: + text += '\\%03d' % c + return text + + +def _truncate_bitmap(what): + """Determine the index of greatest byte that isn't all zeros, and + return the bitmap that contains all the bytes less than that index. + + @param what: a string of octets representing a bitmap. + @type what: string + @rtype: string + """ + + for i in xrange(len(what) - 1, -1, -1): + if what[i] != 0: + return what[0: i + 1] + return what[0:1] + + +class Rdata(object): + + """Base class for all DNS rdata types. + """ + + __slots__ = ['rdclass', 'rdtype'] + + def __init__(self, rdclass, rdtype): + """Initialize an rdata. + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + """ + + self.rdclass = rdclass + self.rdtype = rdtype + + def covers(self): + """DNS SIG/RRSIG rdatas apply to a specific type; this type is + returned by the covers() function. If the rdata type is not + SIG or RRSIG, dns.rdatatype.NONE is returned. This is useful when + creating rdatasets, allowing the rdataset to contain only RRSIGs + of a particular type, e.g. RRSIG(NS). + @rtype: int + """ + + return dns.rdatatype.NONE + + def extended_rdatatype(self): + """Return a 32-bit type value, the least significant 16 bits of + which are the ordinary DNS type, and the upper 16 bits of which are + the "covered" type, if any. + @rtype: int + """ + + return self.covers() << 16 | self.rdtype + + def to_text(self, origin=None, relativize=True, **kw): + """Convert an rdata to text format. + @rtype: string + """ + raise NotImplementedError + + def to_wire(self, file, compress=None, origin=None): + """Convert an rdata to wire format. + @rtype: string + """ + + raise NotImplementedError + + def to_digestable(self, origin=None): + """Convert rdata to a format suitable for digesting in hashes. This + is also the DNSSEC canonical form.""" + f = BytesIO() + self.to_wire(f, None, origin) + return f.getvalue() + + def validate(self): + """Check that the current contents of the rdata's fields are + valid. If you change an rdata by assigning to its fields, + it is a good idea to call validate() when you are done making + changes. + """ + dns.rdata.from_text(self.rdclass, self.rdtype, self.to_text()) + + def __repr__(self): + covers = self.covers() + if covers == dns.rdatatype.NONE: + ctext = '' + else: + ctext = '(' + dns.rdatatype.to_text(covers) + ')' + return '' + + def __str__(self): + return self.to_text() + + def _cmp(self, other): + """Compare an rdata with another rdata of the same rdtype and + rdclass. Return < 0 if self < other in the DNSSEC ordering, + 0 if self == other, and > 0 if self > other. + """ + our = self.to_digestable(dns.name.root) + their = other.to_digestable(dns.name.root) + if our == their: + return 0 + if our > their: + return 1 + + return -1 + + def __eq__(self, other): + if not isinstance(other, Rdata): + return False + if self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return False + return self._cmp(other) == 0 + + def __ne__(self, other): + if not isinstance(other, Rdata): + return True + if self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return True + return self._cmp(other) != 0 + + def __lt__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + + return NotImplemented + return self._cmp(other) < 0 + + def __le__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return NotImplemented + return self._cmp(other) <= 0 + + def __ge__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return NotImplemented + return self._cmp(other) >= 0 + + def __gt__(self, other): + if not isinstance(other, Rdata) or \ + self.rdclass != other.rdclass or self.rdtype != other.rdtype: + return NotImplemented + return self._cmp(other) > 0 + + def __hash__(self): + return hash(self.to_digestable(dns.name.root)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + """Build an rdata object from text format. + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param tok: The tokenizer + @type tok: dns.tokenizer.Tokenizer + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @param relativize: should names be relativized? + @type relativize: bool + @rtype: dns.rdata.Rdata instance + """ + + raise NotImplementedError + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + """Build an rdata object from wire format + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param rdlen: The length of the wire-format rdata + @type rdlen: int + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @rtype: dns.rdata.Rdata instance + """ + + raise NotImplementedError + + def choose_relativity(self, origin=None, relativize=True): + """Convert any domain names in the rdata to the specified + relativization. + """ + + pass + + +class GenericRdata(Rdata): + + """Generate Rdata Class + + This class is used for rdata types for which we have no better + implementation. It implements the DNS "unknown RRs" scheme. + """ + + __slots__ = ['data'] + + def __init__(self, rdclass, rdtype, data): + super(GenericRdata, self).__init__(rdclass, rdtype) + self.data = data + + def to_text(self, origin=None, relativize=True, **kw): + return r'\# %d ' % len(self.data) + _hexify(self.data) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + token = tok.get() + if not token.is_identifier() or token.value != '\#': + raise dns.exception.SyntaxError( + r'generic rdata does not start with \#') + length = tok.get_int() + chunks = [] + while 1: + token = tok.get() + if token.is_eol_or_eof(): + break + chunks.append(token.value.encode()) + hex = b''.join(chunks) + data = binascii.unhexlify(hex) + if len(data) != length: + raise dns.exception.SyntaxError( + 'generic rdata hex data has wrong length') + return cls(rdclass, rdtype, data) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.data) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + return cls(rdclass, rdtype, wire[current: current + rdlen]) + +_rdata_modules = {} +_module_prefix = 'dns.rdtypes' + + +def get_rdata_class(rdclass, rdtype): + + def import_module(name): + mod = __import__(name) + components = name.split('.') + for comp in components[1:]: + mod = getattr(mod, comp) + return mod + + mod = _rdata_modules.get((rdclass, rdtype)) + rdclass_text = dns.rdataclass.to_text(rdclass) + rdtype_text = dns.rdatatype.to_text(rdtype) + rdtype_text = rdtype_text.replace('-', '_') + if not mod: + mod = _rdata_modules.get((dns.rdatatype.ANY, rdtype)) + if not mod: + try: + mod = import_module('.'.join([_module_prefix, + rdclass_text, rdtype_text])) + _rdata_modules[(rdclass, rdtype)] = mod + except ImportError: + try: + mod = import_module('.'.join([_module_prefix, + 'ANY', rdtype_text])) + _rdata_modules[(dns.rdataclass.ANY, rdtype)] = mod + except ImportError: + mod = None + if mod: + cls = getattr(mod, rdtype_text) + else: + cls = GenericRdata + return cls + + +def from_text(rdclass, rdtype, tok, origin=None, relativize=True): + """Build an rdata object from text format. + + This function attempts to dynamically load a class which + implements the specified rdata class and type. If there is no + class-and-type-specific implementation, the GenericRdata class + is used. + + Once a class is chosen, its from_text() class method is called + with the parameters to this function. + + If I{tok} is a string, then a tokenizer is created and the string + is used as its input. + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param tok: The tokenizer or input text + @type tok: dns.tokenizer.Tokenizer or string + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @param relativize: Should names be relativized? + @type relativize: bool + @rtype: dns.rdata.Rdata instance""" + + if isinstance(tok, string_types): + tok = dns.tokenizer.Tokenizer(tok) + cls = get_rdata_class(rdclass, rdtype) + if cls != GenericRdata: + # peek at first token + token = tok.get() + tok.unget(token) + if token.is_identifier() and \ + token.value == r'\#': + # + # Known type using the generic syntax. Extract the + # wire form from the generic syntax, and then run + # from_wire on it. + # + rdata = GenericRdata.from_text(rdclass, rdtype, tok, origin, + relativize) + return from_wire(rdclass, rdtype, rdata.data, 0, len(rdata.data), + origin) + return cls.from_text(rdclass, rdtype, tok, origin, relativize) + + +def from_wire(rdclass, rdtype, wire, current, rdlen, origin=None): + """Build an rdata object from wire format + + This function attempts to dynamically load a class which + implements the specified rdata class and type. If there is no + class-and-type-specific implementation, the GenericRdata class + is used. + + Once a class is chosen, its from_wire() class method is called + with the parameters to this function. + + @param rdclass: The rdata class + @type rdclass: int + @param rdtype: The rdata type + @type rdtype: int + @param wire: The wire-format message + @type wire: string + @param current: The offset in wire of the beginning of the rdata. + @type current: int + @param rdlen: The length of the wire-format rdata + @type rdlen: int + @param origin: The origin to use for relative names + @type origin: dns.name.Name + @rtype: dns.rdata.Rdata instance""" + + wire = dns.wiredata.maybe_wrap(wire) + cls = get_rdata_class(rdclass, rdtype) + return cls.from_wire(rdclass, rdtype, wire, current, rdlen, origin) diff --git a/Contents/Libraries/Shared/dns/rdataclass.py b/Contents/Libraries/Shared/dns/rdataclass.py new file mode 100644 index 000000000..17a4810d5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdataclass.py @@ -0,0 +1,118 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Rdata Classes. + +@var _by_text: The rdata class textual name to value mapping +@type _by_text: dict +@var _by_value: The rdata class value to textual name mapping +@type _by_value: dict +@var _metaclasses: If an rdataclass is a metaclass, there will be a mapping +whose key is the rdatatype value and whose value is True in this dictionary. +@type _metaclasses: dict""" + +import re + +import dns.exception + +RESERVED0 = 0 +IN = 1 +CH = 3 +HS = 4 +NONE = 254 +ANY = 255 + +_by_text = { + 'RESERVED0': RESERVED0, + 'IN': IN, + 'CH': CH, + 'HS': HS, + 'NONE': NONE, + 'ANY': ANY +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + +# Now that we've built the inverse map, we can add class aliases to +# the _by_text mapping. + +_by_text.update({ + 'INTERNET': IN, + 'CHAOS': CH, + 'HESIOD': HS +}) + +_metaclasses = { + NONE: True, + ANY: True +} + +_unknown_class_pattern = re.compile('CLASS([0-9]+)$', re.I) + + +class UnknownRdataclass(dns.exception.DNSException): + + """A DNS class is unknown.""" + + +def from_text(text): + """Convert text into a DNS rdata class value. + @param text: the text + @type text: string + @rtype: int + @raises dns.rdataclass.UnknownRdataclass: the class is unknown + @raises ValueError: the rdata class value is not >= 0 and <= 65535 + """ + + value = _by_text.get(text.upper()) + if value is None: + match = _unknown_class_pattern.match(text) + if match is None: + raise UnknownRdataclass + value = int(match.group(1)) + if value < 0 or value > 65535: + raise ValueError("class must be between >= 0 and <= 65535") + return value + + +def to_text(value): + """Convert a DNS rdata class to text. + @param value: the rdata class value + @type value: int + @rtype: string + @raises ValueError: the rdata class value is not >= 0 and <= 65535 + """ + + if value < 0 or value > 65535: + raise ValueError("class must be between >= 0 and <= 65535") + text = _by_value.get(value) + if text is None: + text = 'CLASS' + repr(value) + return text + + +def is_metaclass(rdclass): + """True if the class is a metaclass. + @param rdclass: the rdata class + @type rdclass: int + @rtype: bool""" + + if rdclass in _metaclasses: + return True + return False diff --git a/Contents/Libraries/Shared/dns/rdataset.py b/Contents/Libraries/Shared/dns/rdataset.py new file mode 100644 index 000000000..db266f2f0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdataset.py @@ -0,0 +1,338 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS rdatasets (an rdataset is a set of rdatas of a given type and class)""" + +import random +from io import StringIO +import struct + +import dns.exception +import dns.rdatatype +import dns.rdataclass +import dns.rdata +import dns.set +from ._compat import string_types + +# define SimpleSet here for backwards compatibility +SimpleSet = dns.set.Set + + +class DifferingCovers(dns.exception.DNSException): + + """An attempt was made to add a DNS SIG/RRSIG whose covered type + is not the same as that of the other rdatas in the rdataset.""" + + +class IncompatibleTypes(dns.exception.DNSException): + + """An attempt was made to add DNS RR data of an incompatible type.""" + + +class Rdataset(dns.set.Set): + + """A DNS rdataset. + + @ivar rdclass: The class of the rdataset + @type rdclass: int + @ivar rdtype: The type of the rdataset + @type rdtype: int + @ivar covers: The covered type. Usually this value is + dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or + dns.rdatatype.RRSIG, then the covers value will be the rdata + type the SIG/RRSIG covers. The library treats the SIG and RRSIG + types as if they were a family of + types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much + easier to work with than if RRSIGs covering different rdata + types were aggregated into a single RRSIG rdataset. + @type covers: int + @ivar ttl: The DNS TTL (Time To Live) value + @type ttl: int + """ + + __slots__ = ['rdclass', 'rdtype', 'covers', 'ttl'] + + def __init__(self, rdclass, rdtype, covers=dns.rdatatype.NONE): + """Create a new rdataset of the specified class and type. + + @see: the description of the class instance variables for the + meaning of I{rdclass} and I{rdtype}""" + + super(Rdataset, self).__init__() + self.rdclass = rdclass + self.rdtype = rdtype + self.covers = covers + self.ttl = 0 + + def _clone(self): + obj = super(Rdataset, self)._clone() + obj.rdclass = self.rdclass + obj.rdtype = self.rdtype + obj.covers = self.covers + obj.ttl = self.ttl + return obj + + def update_ttl(self, ttl): + """Set the TTL of the rdataset to be the lesser of the set's current + TTL or the specified TTL. If the set contains no rdatas, set the TTL + to the specified TTL. + @param ttl: The TTL + @type ttl: int""" + + if len(self) == 0: + self.ttl = ttl + elif ttl < self.ttl: + self.ttl = ttl + + def add(self, rd, ttl=None): + """Add the specified rdata to the rdataset. + + If the optional I{ttl} parameter is supplied, then + self.update_ttl(ttl) will be called prior to adding the rdata. + + @param rd: The rdata + @type rd: dns.rdata.Rdata object + @param ttl: The TTL + @type ttl: int""" + + # + # If we're adding a signature, do some special handling to + # check that the signature covers the same type as the + # other rdatas in this rdataset. If this is the first rdata + # in the set, initialize the covers field. + # + if self.rdclass != rd.rdclass or self.rdtype != rd.rdtype: + raise IncompatibleTypes + if ttl is not None: + self.update_ttl(ttl) + if self.rdtype == dns.rdatatype.RRSIG or \ + self.rdtype == dns.rdatatype.SIG: + covers = rd.covers() + if len(self) == 0 and self.covers == dns.rdatatype.NONE: + self.covers = covers + elif self.covers != covers: + raise DifferingCovers + if dns.rdatatype.is_singleton(rd.rdtype) and len(self) > 0: + self.clear() + super(Rdataset, self).add(rd) + + def union_update(self, other): + self.update_ttl(other.ttl) + super(Rdataset, self).union_update(other) + + def intersection_update(self, other): + self.update_ttl(other.ttl) + super(Rdataset, self).intersection_update(other) + + def update(self, other): + """Add all rdatas in other to self. + + @param other: The rdataset from which to update + @type other: dns.rdataset.Rdataset object""" + + self.update_ttl(other.ttl) + super(Rdataset, self).update(other) + + def __repr__(self): + if self.covers == 0: + ctext = '' + else: + ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' + return '' + + def __str__(self): + return self.to_text() + + def __eq__(self, other): + """Two rdatasets are equal if they have the same class, type, and + covers, and contain the same rdata. + @rtype: bool""" + + if not isinstance(other, Rdataset): + return False + if self.rdclass != other.rdclass or \ + self.rdtype != other.rdtype or \ + self.covers != other.covers: + return False + return super(Rdataset, self).__eq__(other) + + def __ne__(self, other): + return not self.__eq__(other) + + def to_text(self, name=None, origin=None, relativize=True, + override_rdclass=None, **kw): + """Convert the rdataset into DNS master file format. + + @see: L{dns.name.Name.choose_relativity} for more information + on how I{origin} and I{relativize} determine the way names + are emitted. + + Any additional keyword arguments are passed on to the rdata + to_text() method. + + @param name: If name is not None, emit a RRs with I{name} as + the owner name. + @type name: dns.name.Name object + @param origin: The origin for relative names, or None. + @type origin: dns.name.Name object + @param relativize: True if names should names be relativized + @type relativize: bool""" + if name is not None: + name = name.choose_relativity(origin, relativize) + ntext = str(name) + pad = ' ' + else: + ntext = '' + pad = '' + s = StringIO() + if override_rdclass is not None: + rdclass = override_rdclass + else: + rdclass = self.rdclass + if len(self) == 0: + # + # Empty rdatasets are used for the question section, and in + # some dynamic updates, so we don't need to print out the TTL + # (which is meaningless anyway). + # + s.write(u'%s%s%s %s\n' % (ntext, pad, + dns.rdataclass.to_text(rdclass), + dns.rdatatype.to_text(self.rdtype))) + else: + for rd in self: + s.write(u'%s%s%d %s %s %s\n' % + (ntext, pad, self.ttl, dns.rdataclass.to_text(rdclass), + dns.rdatatype.to_text(self.rdtype), + rd.to_text(origin=origin, relativize=relativize, + **kw))) + # + # We strip off the final \n for the caller's convenience in printing + # + return s.getvalue()[:-1] + + def to_wire(self, name, file, compress=None, origin=None, + override_rdclass=None, want_shuffle=True): + """Convert the rdataset to wire format. + + @param name: The owner name of the RRset that will be emitted + @type name: dns.name.Name object + @param file: The file to which the wire format data will be appended + @type file: file + @param compress: The compression table to use; the default is None. + @type compress: dict + @param origin: The origin to be appended to any relative names when + they are emitted. The default is None. + @returns: the number of records emitted + @rtype: int + """ + + if override_rdclass is not None: + rdclass = override_rdclass + want_shuffle = False + else: + rdclass = self.rdclass + file.seek(0, 2) + if len(self) == 0: + name.to_wire(file, compress, origin) + stuff = struct.pack("!HHIH", self.rdtype, rdclass, 0, 0) + file.write(stuff) + return 1 + else: + if want_shuffle: + l = list(self) + random.shuffle(l) + else: + l = self + for rd in l: + name.to_wire(file, compress, origin) + stuff = struct.pack("!HHIH", self.rdtype, rdclass, + self.ttl, 0) + file.write(stuff) + start = file.tell() + rd.to_wire(file, compress, origin) + end = file.tell() + assert end - start < 65536 + file.seek(start - 2) + stuff = struct.pack("!H", end - start) + file.write(stuff) + file.seek(0, 2) + return len(self) + + def match(self, rdclass, rdtype, covers): + """Returns True if this rdataset matches the specified class, type, + and covers""" + if self.rdclass == rdclass and \ + self.rdtype == rdtype and \ + self.covers == covers: + return True + return False + + +def from_text_list(rdclass, rdtype, ttl, text_rdatas): + """Create an rdataset with the specified class, type, and TTL, and with + the specified list of rdatas in text format. + + @rtype: dns.rdataset.Rdataset object + """ + + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + r = Rdataset(rdclass, rdtype) + r.update_ttl(ttl) + for t in text_rdatas: + rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) + r.add(rd) + return r + + +def from_text(rdclass, rdtype, ttl, *text_rdatas): + """Create an rdataset with the specified class, type, and TTL, and with + the specified rdatas in text format. + + @rtype: dns.rdataset.Rdataset object + """ + + return from_text_list(rdclass, rdtype, ttl, text_rdatas) + + +def from_rdata_list(ttl, rdatas): + """Create an rdataset with the specified TTL, and with + the specified list of rdata objects. + + @rtype: dns.rdataset.Rdataset object + """ + + if len(rdatas) == 0: + raise ValueError("rdata list must not be empty") + r = None + for rd in rdatas: + if r is None: + r = Rdataset(rd.rdclass, rd.rdtype) + r.update_ttl(ttl) + r.add(rd) + return r + + +def from_rdata(ttl, *rdatas): + """Create an rdataset with the specified TTL, and with + the specified rdata objects. + + @rtype: dns.rdataset.Rdataset object + """ + + return from_rdata_list(ttl, rdatas) diff --git a/Contents/Libraries/Shared/dns/rdatatype.py b/Contents/Libraries/Shared/dns/rdatatype.py new file mode 100644 index 000000000..15284f64d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdatatype.py @@ -0,0 +1,255 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Rdata Types. + +@var _by_text: The rdata type textual name to value mapping +@type _by_text: dict +@var _by_value: The rdata type value to textual name mapping +@type _by_value: dict +@var _metatypes: If an rdatatype is a metatype, there will be a mapping +whose key is the rdatatype value and whose value is True in this dictionary. +@type _metatypes: dict +@var _singletons: If an rdatatype is a singleton, there will be a mapping +whose key is the rdatatype value and whose value is True in this dictionary. +@type _singletons: dict""" + +import re + +import dns.exception + +NONE = 0 +A = 1 +NS = 2 +MD = 3 +MF = 4 +CNAME = 5 +SOA = 6 +MB = 7 +MG = 8 +MR = 9 +NULL = 10 +WKS = 11 +PTR = 12 +HINFO = 13 +MINFO = 14 +MX = 15 +TXT = 16 +RP = 17 +AFSDB = 18 +X25 = 19 +ISDN = 20 +RT = 21 +NSAP = 22 +NSAP_PTR = 23 +SIG = 24 +KEY = 25 +PX = 26 +GPOS = 27 +AAAA = 28 +LOC = 29 +NXT = 30 +SRV = 33 +NAPTR = 35 +KX = 36 +CERT = 37 +A6 = 38 +DNAME = 39 +OPT = 41 +APL = 42 +DS = 43 +SSHFP = 44 +IPSECKEY = 45 +RRSIG = 46 +NSEC = 47 +DNSKEY = 48 +DHCID = 49 +NSEC3 = 50 +NSEC3PARAM = 51 +TLSA = 52 +HIP = 55 +CDS = 59 +CDNSKEY = 60 +CSYNC = 62 +SPF = 99 +UNSPEC = 103 +EUI48 = 108 +EUI64 = 109 +TKEY = 249 +TSIG = 250 +IXFR = 251 +AXFR = 252 +MAILB = 253 +MAILA = 254 +ANY = 255 +URI = 256 +CAA = 257 +AVC = 258 +TA = 32768 +DLV = 32769 + +_by_text = { + 'NONE': NONE, + 'A': A, + 'NS': NS, + 'MD': MD, + 'MF': MF, + 'CNAME': CNAME, + 'SOA': SOA, + 'MB': MB, + 'MG': MG, + 'MR': MR, + 'NULL': NULL, + 'WKS': WKS, + 'PTR': PTR, + 'HINFO': HINFO, + 'MINFO': MINFO, + 'MX': MX, + 'TXT': TXT, + 'RP': RP, + 'AFSDB': AFSDB, + 'X25': X25, + 'ISDN': ISDN, + 'RT': RT, + 'NSAP': NSAP, + 'NSAP-PTR': NSAP_PTR, + 'SIG': SIG, + 'KEY': KEY, + 'PX': PX, + 'GPOS': GPOS, + 'AAAA': AAAA, + 'LOC': LOC, + 'NXT': NXT, + 'SRV': SRV, + 'NAPTR': NAPTR, + 'KX': KX, + 'CERT': CERT, + 'A6': A6, + 'DNAME': DNAME, + 'OPT': OPT, + 'APL': APL, + 'DS': DS, + 'SSHFP': SSHFP, + 'IPSECKEY': IPSECKEY, + 'RRSIG': RRSIG, + 'NSEC': NSEC, + 'DNSKEY': DNSKEY, + 'DHCID': DHCID, + 'NSEC3': NSEC3, + 'NSEC3PARAM': NSEC3PARAM, + 'TLSA': TLSA, + 'HIP': HIP, + 'CDS': CDS, + 'CDNSKEY': CDNSKEY, + 'CSYNC': CSYNC, + 'SPF': SPF, + 'UNSPEC': UNSPEC, + 'EUI48': EUI48, + 'EUI64': EUI64, + 'TKEY': TKEY, + 'TSIG': TSIG, + 'IXFR': IXFR, + 'AXFR': AXFR, + 'MAILB': MAILB, + 'MAILA': MAILA, + 'ANY': ANY, + 'URI': URI, + 'CAA': CAA, + 'AVC': AVC, + 'TA': TA, + 'DLV': DLV, +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. + +_by_value = dict((y, x) for x, y in _by_text.items()) + + +_metatypes = { + OPT: True +} + +_singletons = { + SOA: True, + NXT: True, + DNAME: True, + NSEC: True, + # CNAME is technically a singleton, but we allow multiple CNAMEs. +} + +_unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I) + + +class UnknownRdatatype(dns.exception.DNSException): + + """DNS resource record type is unknown.""" + + +def from_text(text): + """Convert text into a DNS rdata type value. + @param text: the text + @type text: string + @raises dns.rdatatype.UnknownRdatatype: the type is unknown + @raises ValueError: the rdata type value is not >= 0 and <= 65535 + @rtype: int""" + + value = _by_text.get(text.upper()) + if value is None: + match = _unknown_type_pattern.match(text) + if match is None: + raise UnknownRdatatype + value = int(match.group(1)) + if value < 0 or value > 65535: + raise ValueError("type must be between >= 0 and <= 65535") + return value + + +def to_text(value): + """Convert a DNS rdata type to text. + @param value: the rdata type value + @type value: int + @raises ValueError: the rdata type value is not >= 0 and <= 65535 + @rtype: string""" + + if value < 0 or value > 65535: + raise ValueError("type must be between >= 0 and <= 65535") + text = _by_value.get(value) + if text is None: + text = 'TYPE' + repr(value) + return text + + +def is_metatype(rdtype): + """True if the type is a metatype. + @param rdtype: the type + @type rdtype: int + @rtype: bool""" + + if rdtype >= TKEY and rdtype <= ANY or rdtype in _metatypes: + return True + return False + + +def is_singleton(rdtype): + """True if the type is a singleton. + @param rdtype: the type + @type rdtype: int + @rtype: bool""" + + if rdtype in _singletons: + return True + return False diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py new file mode 100644 index 000000000..f3d515403 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/AFSDB.py @@ -0,0 +1,53 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class AFSDB(dns.rdtypes.mxbase.UncompressedDowncasingMX): + + """AFSDB record + + @ivar subtype: the subtype value + @type subtype: int + @ivar hostname: the hostname name + @type hostname: dns.name.Name object""" + + # Use the property mechanism to make "subtype" an alias for the + # "preference" attribute, and "hostname" an alias for the "exchange" + # attribute. + # + # This lets us inherit the UncompressedMX implementation but lets + # the caller use appropriate attribute names for the rdata type. + # + # We probably lose some performance vs. a cut-and-paste + # implementation, but this way we don't copy code, and that's + # good. + + def get_subtype(self): + return self.preference + + def set_subtype(self, subtype): + self.preference = subtype + + subtype = property(get_subtype, set_subtype) + + def get_hostname(self): + return self.exchange + + def set_hostname(self, hostname): + self.exchange = hostname + + hostname = property(get_hostname, set_hostname) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py new file mode 100644 index 000000000..137c9de92 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/AVC.py @@ -0,0 +1,23 @@ +# Copyright (C) 2016 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.txtbase + + +class AVC(dns.rdtypes.txtbase.TXTBase): + + """AVC record + + @see: U{http://www.iana.org/assignments/dns-parameters/AVC/avc-completed-template}""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py new file mode 100644 index 000000000..f2e41ad0b --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CAA.py @@ -0,0 +1,73 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer + + +class CAA(dns.rdata.Rdata): + + """CAA (Certification Authority Authorization) record + + @ivar flags: the flags + @type flags: int + @ivar tag: the tag + @type tag: string + @ivar value: the value + @type value: string + @see: RFC 6844""" + + __slots__ = ['flags', 'tag', 'value'] + + def __init__(self, rdclass, rdtype, flags, tag, value): + super(CAA, self).__init__(rdclass, rdtype) + self.flags = flags + self.tag = tag + self.value = value + + def to_text(self, origin=None, relativize=True, **kw): + return '%u %s "%s"' % (self.flags, + dns.rdata._escapify(self.tag), + dns.rdata._escapify(self.value)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + flags = tok.get_uint8() + tag = tok.get_string().encode() + if len(tag) > 255: + raise dns.exception.SyntaxError("tag too long") + if not tag.isalnum(): + raise dns.exception.SyntaxError("tag is not alphanumeric") + value = tok.get_string().encode() + return cls(rdclass, rdtype, flags, tag, value) + + def to_wire(self, file, compress=None, origin=None): + file.write(struct.pack('!B', self.flags)) + l = len(self.tag) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.tag) + file.write(self.value) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (flags, l) = struct.unpack('!BB', wire[current: current + 2]) + current += 2 + tag = wire[current: current + l] + value = wire[current + l:current + rdlen - 2] + return cls(rdclass, rdtype, flags, tag, value) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py new file mode 100644 index 000000000..83f3d51fc --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDNSKEY.py @@ -0,0 +1,25 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dnskeybase +from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set + + +__all__ = ['flags_to_text_set', 'flags_from_text_set'] + + +class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): + + """CDNSKEY record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py new file mode 100644 index 000000000..e1abfc368 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CDS.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dsbase + + +class CDS(dns.rdtypes.dsbase.DSBase): + + """CDS record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py new file mode 100644 index 000000000..1c35c23d2 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CERT.py @@ -0,0 +1,121 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import base64 + +import dns.exception +import dns.dnssec +import dns.rdata +import dns.tokenizer + +_ctype_by_value = { + 1: 'PKIX', + 2: 'SPKI', + 3: 'PGP', + 253: 'URI', + 254: 'OID', +} + +_ctype_by_name = { + 'PKIX': 1, + 'SPKI': 2, + 'PGP': 3, + 'URI': 253, + 'OID': 254, +} + + +def _ctype_from_text(what): + v = _ctype_by_name.get(what) + if v is not None: + return v + return int(what) + + +def _ctype_to_text(what): + v = _ctype_by_value.get(what) + if v is not None: + return v + return str(what) + + +class CERT(dns.rdata.Rdata): + + """CERT record + + @ivar certificate_type: certificate type + @type certificate_type: int + @ivar key_tag: key tag + @type key_tag: int + @ivar algorithm: algorithm + @type algorithm: int + @ivar certificate: the certificate or CRL + @type certificate: string + @see: RFC 2538""" + + __slots__ = ['certificate_type', 'key_tag', 'algorithm', 'certificate'] + + def __init__(self, rdclass, rdtype, certificate_type, key_tag, algorithm, + certificate): + super(CERT, self).__init__(rdclass, rdtype) + self.certificate_type = certificate_type + self.key_tag = key_tag + self.algorithm = algorithm + self.certificate = certificate + + def to_text(self, origin=None, relativize=True, **kw): + certificate_type = _ctype_to_text(self.certificate_type) + return "%s %d %s %s" % (certificate_type, self.key_tag, + dns.dnssec.algorithm_to_text(self.algorithm), + dns.rdata._base64ify(self.certificate)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + certificate_type = _ctype_from_text(tok.get_string()) + key_tag = tok.get_uint16() + algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) + if algorithm < 0 or algorithm > 255: + raise dns.exception.SyntaxError("bad algorithm type") + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + certificate = base64.b64decode(b64) + return cls(rdclass, rdtype, certificate_type, key_tag, + algorithm, certificate) + + def to_wire(self, file, compress=None, origin=None): + prefix = struct.pack("!HHB", self.certificate_type, self.key_tag, + self.algorithm) + file.write(prefix) + file.write(self.certificate) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + prefix = wire[current: current + 5].unwrap() + current += 5 + rdlen -= 5 + if rdlen < 0: + raise dns.exception.FormError + (certificate_type, key_tag, algorithm) = struct.unpack("!HHB", prefix) + certificate = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, certificate_type, key_tag, algorithm, + certificate) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py new file mode 100644 index 000000000..65cf570c7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CNAME.py @@ -0,0 +1,25 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class CNAME(dns.rdtypes.nsbase.NSBase): + + """CNAME record + + Note: although CNAME is officially a singleton type, dnspython allows + non-singleton CNAME rdatasets because such sets have been commonly + used by BIND and other nameservers for load balancing.""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py new file mode 100644 index 000000000..bf95cb273 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/CSYNC.py @@ -0,0 +1,124 @@ +# Copyright (C) 2004-2007, 2009-2011, 2016 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.rdatatype +import dns.name +from dns._compat import xrange + +class CSYNC(dns.rdata.Rdata): + + """CSYNC record + + @ivar serial: the SOA serial number + @type serial: int + @ivar flags: the CSYNC flags + @type flags: int + @ivar windows: the windowed bitmap list + @type windows: list of (window number, string) tuples""" + + __slots__ = ['serial', 'flags', 'windows'] + + def __init__(self, rdclass, rdtype, serial, flags, windows): + super(CSYNC, self).__init__(rdclass, rdtype) + self.serial = serial + self.flags = flags + self.windows = windows + + def to_text(self, origin=None, relativize=True, **kw): + text = '' + for (window, bitmap) in self.windows: + bits = [] + for i in xrange(0, len(bitmap)): + byte = bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(dns.rdatatype.to_text(window * 256 + + i * 8 + j)) + text += (' ' + ' '.join(bits)) + return '%d %d%s' % (self.serial, self.flags, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + serial = tok.get_uint32() + flags = tok.get_uint16() + rdtypes = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + nrdtype = dns.rdatatype.from_text(token.value) + if nrdtype == 0: + raise dns.exception.SyntaxError("CSYNC with bit 0") + if nrdtype > 65535: + raise dns.exception.SyntaxError("CSYNC with bit > 65535") + rdtypes.append(nrdtype) + rdtypes.sort() + window = 0 + octets = 0 + prior_rdtype = 0 + bitmap = bytearray(b'\0' * 32) + windows = [] + for nrdtype in rdtypes: + if nrdtype == prior_rdtype: + continue + prior_rdtype = nrdtype + new_window = nrdtype // 256 + if new_window != window: + windows.append((window, bitmap[0:octets])) + bitmap = bytearray(b'\0' * 32) + window = new_window + offset = nrdtype % 256 + byte = offset // 8 + bit = offset % 8 + octets = byte + 1 + bitmap[byte] = bitmap[byte] | (0x80 >> bit) + + windows.append((window, bitmap[0:octets])) + return cls(rdclass, rdtype, serial, flags, windows) + + def to_wire(self, file, compress=None, origin=None): + file.write(struct.pack('!IH', self.serial, self.flags)) + for (window, bitmap) in self.windows: + file.write(struct.pack('!BB', window, len(bitmap))) + file.write(bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 6: + raise dns.exception.FormError("CSYNC too short") + (serial, flags) = struct.unpack("!IH", wire[current: current + 6]) + current += 6 + rdlen -= 6 + windows = [] + while rdlen > 0: + if rdlen < 3: + raise dns.exception.FormError("CSYNC too short") + window = wire[current] + octets = wire[current + 1] + if octets == 0 or octets > 32: + raise dns.exception.FormError("bad CSYNC octets") + current += 2 + rdlen -= 2 + if rdlen < octets: + raise dns.exception.FormError("bad CSYNC bitmap length") + bitmap = bytearray(wire[current: current + octets].unwrap()) + current += octets + rdlen -= octets + windows.append((window, bitmap)) + return cls(rdclass, rdtype, serial, flags, windows) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py new file mode 100644 index 000000000..cd1244c19 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DLV.py @@ -0,0 +1,21 @@ +# Copyright (C) 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dsbase + + +class DLV(dns.rdtypes.dsbase.DSBase): + + """DLV record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py new file mode 100644 index 000000000..dac97214a --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNAME.py @@ -0,0 +1,24 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class DNAME(dns.rdtypes.nsbase.UncompressedNS): + + """DNAME record""" + + def to_digestable(self, origin=None): + return self.target.to_digestable(origin) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py new file mode 100644 index 000000000..e915e98bb --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DNSKEY.py @@ -0,0 +1,25 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dnskeybase +from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set + + +__all__ = ['flags_to_text_set', 'flags_from_text_set'] + + +class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): + + """DNSKEY record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py new file mode 100644 index 000000000..577c8d841 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/DS.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.dsbase + + +class DS(dns.rdtypes.dsbase.DSBase): + + """DS record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py new file mode 100644 index 000000000..aa260e205 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI48.py @@ -0,0 +1,29 @@ +# Copyright (C) 2015 Red Hat, Inc. +# Author: Petr Spacek +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.euibase + + +class EUI48(dns.rdtypes.euibase.EUIBase): + + """EUI48 record + + @ivar fingerprint: 48-bit Extended Unique Identifier (EUI-48) + @type fingerprint: string + @see: rfc7043.txt""" + + byte_len = 6 # 0123456789ab (in hex) + text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py new file mode 100644 index 000000000..5eba350d8 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/EUI64.py @@ -0,0 +1,29 @@ +# Copyright (C) 2015 Red Hat, Inc. +# Author: Petr Spacek +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.euibase + + +class EUI64(dns.rdtypes.euibase.EUIBase): + + """EUI64 record + + @ivar fingerprint: 64-bit Extended Unique Identifier (EUI-64) + @type fingerprint: string + @see: rfc7043.txt""" + + byte_len = 8 # 0123456789abcdef (in hex) + text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab-cd-ef diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py new file mode 100644 index 000000000..a359a7712 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/GPOS.py @@ -0,0 +1,160 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import long, text_type + + +def _validate_float_string(what): + if what[0] == b'-'[0] or what[0] == b'+'[0]: + what = what[1:] + if what.isdigit(): + return + (left, right) = what.split(b'.') + if left == b'' and right == b'': + raise dns.exception.FormError + if not left == b'' and not left.decode().isdigit(): + raise dns.exception.FormError + if not right == b'' and not right.decode().isdigit(): + raise dns.exception.FormError + + +def _sanitize(value): + if isinstance(value, text_type): + return value.encode() + return value + + +class GPOS(dns.rdata.Rdata): + + """GPOS record + + @ivar latitude: latitude + @type latitude: string + @ivar longitude: longitude + @type longitude: string + @ivar altitude: altitude + @type altitude: string + @see: RFC 1712""" + + __slots__ = ['latitude', 'longitude', 'altitude'] + + def __init__(self, rdclass, rdtype, latitude, longitude, altitude): + super(GPOS, self).__init__(rdclass, rdtype) + if isinstance(latitude, float) or \ + isinstance(latitude, int) or \ + isinstance(latitude, long): + latitude = str(latitude) + if isinstance(longitude, float) or \ + isinstance(longitude, int) or \ + isinstance(longitude, long): + longitude = str(longitude) + if isinstance(altitude, float) or \ + isinstance(altitude, int) or \ + isinstance(altitude, long): + altitude = str(altitude) + latitude = _sanitize(latitude) + longitude = _sanitize(longitude) + altitude = _sanitize(altitude) + _validate_float_string(latitude) + _validate_float_string(longitude) + _validate_float_string(altitude) + self.latitude = latitude + self.longitude = longitude + self.altitude = altitude + + def to_text(self, origin=None, relativize=True, **kw): + return '%s %s %s' % (self.latitude.decode(), + self.longitude.decode(), + self.altitude.decode()) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + latitude = tok.get_string() + longitude = tok.get_string() + altitude = tok.get_string() + tok.get_eol() + return cls(rdclass, rdtype, latitude, longitude, altitude) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.latitude) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.latitude) + l = len(self.longitude) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.longitude) + l = len(self.altitude) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.altitude) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + latitude = wire[current: current + l].unwrap() + current += l + rdlen -= l + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + longitude = wire[current: current + l].unwrap() + current += l + rdlen -= l + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + altitude = wire[current: current + l].unwrap() + return cls(rdclass, rdtype, latitude, longitude, altitude) + + def _get_float_latitude(self): + return float(self.latitude) + + def _set_float_latitude(self, value): + self.latitude = str(value) + + float_latitude = property(_get_float_latitude, _set_float_latitude, + doc="latitude as a floating point value") + + def _get_float_longitude(self): + return float(self.longitude) + + def _set_float_longitude(self, value): + self.longitude = str(value) + + float_longitude = property(_get_float_longitude, _set_float_longitude, + doc="longitude as a floating point value") + + def _get_float_altitude(self): + return float(self.altitude) + + def _set_float_altitude(self, value): + self.altitude = str(value) + + float_altitude = property(_get_float_altitude, _set_float_altitude, + doc="altitude as a floating point value") diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py new file mode 100644 index 000000000..e5a1bea3d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/HINFO.py @@ -0,0 +1,84 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import text_type + + +class HINFO(dns.rdata.Rdata): + + """HINFO record + + @ivar cpu: the CPU type + @type cpu: string + @ivar os: the OS type + @type os: string + @see: RFC 1035""" + + __slots__ = ['cpu', 'os'] + + def __init__(self, rdclass, rdtype, cpu, os): + super(HINFO, self).__init__(rdclass, rdtype) + if isinstance(cpu, text_type): + self.cpu = cpu.encode() + else: + self.cpu = cpu + if isinstance(os, text_type): + self.os = os.encode() + else: + self.os = os + + def to_text(self, origin=None, relativize=True, **kw): + return '"%s" "%s"' % (dns.rdata._escapify(self.cpu), + dns.rdata._escapify(self.os)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + cpu = tok.get_string() + os = tok.get_string() + tok.get_eol() + return cls(rdclass, rdtype, cpu, os) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.cpu) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.cpu) + l = len(self.os) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.os) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + cpu = wire[current:current + l].unwrap() + current += l + rdlen -= l + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + os = wire[current: current + l].unwrap() + return cls(rdclass, rdtype, cpu, os) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py new file mode 100644 index 000000000..fbe955c35 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/HIP.py @@ -0,0 +1,113 @@ +# Copyright (C) 2010, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import base64 +import binascii + +import dns.exception +import dns.rdata +import dns.rdatatype + + +class HIP(dns.rdata.Rdata): + + """HIP record + + @ivar hit: the host identity tag + @type hit: string + @ivar algorithm: the public key cryptographic algorithm + @type algorithm: int + @ivar key: the public key + @type key: string + @ivar servers: the rendezvous servers + @type servers: list of dns.name.Name objects + @see: RFC 5205""" + + __slots__ = ['hit', 'algorithm', 'key', 'servers'] + + def __init__(self, rdclass, rdtype, hit, algorithm, key, servers): + super(HIP, self).__init__(rdclass, rdtype) + self.hit = hit + self.algorithm = algorithm + self.key = key + self.servers = servers + + def to_text(self, origin=None, relativize=True, **kw): + hit = binascii.hexlify(self.hit).decode() + key = base64.b64encode(self.key).replace(b'\n', b'').decode() + text = u'' + servers = [] + for server in self.servers: + servers.append(server.choose_relativity(origin, relativize)) + if len(servers) > 0: + text += (u' ' + u' '.join((x.to_unicode() for x in servers))) + return u'%u %s %s%s' % (self.algorithm, hit, key, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + hit = binascii.unhexlify(tok.get_string().encode()) + if len(hit) > 255: + raise dns.exception.SyntaxError("HIT too long") + key = base64.b64decode(tok.get_string().encode()) + servers = [] + while 1: + token = tok.get() + if token.is_eol_or_eof(): + break + server = dns.name.from_text(token.value, origin) + server.choose_relativity(origin, relativize) + servers.append(server) + return cls(rdclass, rdtype, hit, algorithm, key, servers) + + def to_wire(self, file, compress=None, origin=None): + lh = len(self.hit) + lk = len(self.key) + file.write(struct.pack("!BBH", lh, self.algorithm, lk)) + file.write(self.hit) + file.write(self.key) + for server in self.servers: + server.to_wire(file, None, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (lh, algorithm, lk) = struct.unpack('!BBH', + wire[current: current + 4]) + current += 4 + rdlen -= 4 + hit = wire[current: current + lh].unwrap() + current += lh + rdlen -= lh + key = wire[current: current + lk].unwrap() + current += lk + rdlen -= lk + servers = [] + while rdlen > 0: + (server, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + current += cused + rdlen -= cused + if origin is not None: + server = server.relativize(origin) + servers.append(server) + return cls(rdclass, rdtype, hit, algorithm, key, servers) + + def choose_relativity(self, origin=None, relativize=True): + servers = [] + for server in self.servers: + server = server.choose_relativity(origin, relativize) + servers.append(server) + self.servers = servers diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py new file mode 100644 index 000000000..da2ae3af3 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/ISDN.py @@ -0,0 +1,97 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import text_type + + +class ISDN(dns.rdata.Rdata): + + """ISDN record + + @ivar address: the ISDN address + @type address: string + @ivar subaddress: the ISDN subaddress (or '' if not present) + @type subaddress: string + @see: RFC 1183""" + + __slots__ = ['address', 'subaddress'] + + def __init__(self, rdclass, rdtype, address, subaddress): + super(ISDN, self).__init__(rdclass, rdtype) + if isinstance(address, text_type): + self.address = address.encode() + else: + self.address = address + if isinstance(address, text_type): + self.subaddress = subaddress.encode() + else: + self.subaddress = subaddress + + def to_text(self, origin=None, relativize=True, **kw): + if self.subaddress: + return '"%s" "%s"' % (dns.rdata._escapify(self.address), + dns.rdata._escapify(self.subaddress)) + else: + return '"%s"' % dns.rdata._escapify(self.address) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + t = tok.get() + if not t.is_eol_or_eof(): + tok.unget(t) + subaddress = tok.get_string() + else: + tok.unget(t) + subaddress = '' + tok.get_eol() + return cls(rdclass, rdtype, address, subaddress) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.address) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.address) + l = len(self.subaddress) + if l > 0: + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.subaddress) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + address = wire[current: current + l].unwrap() + current += l + rdlen -= l + if rdlen > 0: + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + subaddress = wire[current: current + l].unwrap() + else: + subaddress = '' + return cls(rdclass, rdtype, address, subaddress) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py new file mode 100644 index 000000000..b433da948 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/LOC.py @@ -0,0 +1,325 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division + +import struct + +import dns.exception +import dns.rdata +from dns._compat import long, xrange, round_py2_compat + + +_pows = tuple(long(10**i) for i in range(0, 11)) + +# default values are in centimeters +_default_size = 100.0 +_default_hprec = 1000000.0 +_default_vprec = 1000.0 + + +def _exponent_of(what, desc): + if what == 0: + return 0 + exp = None + for i in xrange(len(_pows)): + if what // _pows[i] == long(0): + exp = i - 1 + break + if exp is None or exp < 0: + raise dns.exception.SyntaxError("%s value out of bounds" % desc) + return exp + + +def _float_to_tuple(what): + if what < 0: + sign = -1 + what *= -1 + else: + sign = 1 + what = round_py2_compat(what * 3600000) + degrees = int(what // 3600000) + what -= degrees * 3600000 + minutes = int(what // 60000) + what -= minutes * 60000 + seconds = int(what // 1000) + what -= int(seconds * 1000) + what = int(what) + return (degrees, minutes, seconds, what, sign) + + +def _tuple_to_float(what): + value = float(what[0]) + value += float(what[1]) / 60.0 + value += float(what[2]) / 3600.0 + value += float(what[3]) / 3600000.0 + return float(what[4]) * value + + +def _encode_size(what, desc): + what = long(what) + exponent = _exponent_of(what, desc) & 0xF + base = what // pow(10, exponent) & 0xF + return base * 16 + exponent + + +def _decode_size(what, desc): + exponent = what & 0x0F + if exponent > 9: + raise dns.exception.SyntaxError("bad %s exponent" % desc) + base = (what & 0xF0) >> 4 + if base > 9: + raise dns.exception.SyntaxError("bad %s base" % desc) + return long(base) * pow(10, exponent) + + +class LOC(dns.rdata.Rdata): + + """LOC record + + @ivar latitude: latitude + @type latitude: (int, int, int, int, sign) tuple specifying the degrees, minutes, + seconds, milliseconds, and sign of the coordinate. + @ivar longitude: longitude + @type longitude: (int, int, int, int, sign) tuple specifying the degrees, + minutes, seconds, milliseconds, and sign of the coordinate. + @ivar altitude: altitude + @type altitude: float + @ivar size: size of the sphere + @type size: float + @ivar horizontal_precision: horizontal precision + @type horizontal_precision: float + @ivar vertical_precision: vertical precision + @type vertical_precision: float + @see: RFC 1876""" + + __slots__ = ['latitude', 'longitude', 'altitude', 'size', + 'horizontal_precision', 'vertical_precision'] + + def __init__(self, rdclass, rdtype, latitude, longitude, altitude, + size=_default_size, hprec=_default_hprec, + vprec=_default_vprec): + """Initialize a LOC record instance. + + The parameters I{latitude} and I{longitude} may be either a 4-tuple + of integers specifying (degrees, minutes, seconds, milliseconds), + or they may be floating point values specifying the number of + degrees. The other parameters are floats. Size, horizontal precision, + and vertical precision are specified in centimeters.""" + + super(LOC, self).__init__(rdclass, rdtype) + if isinstance(latitude, int) or isinstance(latitude, long): + latitude = float(latitude) + if isinstance(latitude, float): + latitude = _float_to_tuple(latitude) + self.latitude = latitude + if isinstance(longitude, int) or isinstance(longitude, long): + longitude = float(longitude) + if isinstance(longitude, float): + longitude = _float_to_tuple(longitude) + self.longitude = longitude + self.altitude = float(altitude) + self.size = float(size) + self.horizontal_precision = float(hprec) + self.vertical_precision = float(vprec) + + def to_text(self, origin=None, relativize=True, **kw): + if self.latitude[4] > 0: + lat_hemisphere = 'N' + else: + lat_hemisphere = 'S' + if self.longitude[4] > 0: + long_hemisphere = 'E' + else: + long_hemisphere = 'W' + text = "%d %d %d.%03d %s %d %d %d.%03d %s %0.2fm" % ( + self.latitude[0], self.latitude[1], + self.latitude[2], self.latitude[3], lat_hemisphere, + self.longitude[0], self.longitude[1], self.longitude[2], + self.longitude[3], long_hemisphere, + self.altitude / 100.0 + ) + + # do not print default values + if self.size != _default_size or \ + self.horizontal_precision != _default_hprec or \ + self.vertical_precision != _default_vprec: + text += " %0.2fm %0.2fm %0.2fm" % ( + self.size / 100.0, self.horizontal_precision / 100.0, + self.vertical_precision / 100.0 + ) + return text + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + latitude = [0, 0, 0, 0, 1] + longitude = [0, 0, 0, 0, 1] + size = _default_size + hprec = _default_hprec + vprec = _default_vprec + + latitude[0] = tok.get_int() + t = tok.get_string() + if t.isdigit(): + latitude[1] = int(t) + t = tok.get_string() + if '.' in t: + (seconds, milliseconds) = t.split('.') + if not seconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad latitude seconds value') + latitude[2] = int(seconds) + if latitude[2] >= 60: + raise dns.exception.SyntaxError('latitude seconds >= 60') + l = len(milliseconds) + if l == 0 or l > 3 or not milliseconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad latitude milliseconds value') + if l == 1: + m = 100 + elif l == 2: + m = 10 + else: + m = 1 + latitude[3] = m * int(milliseconds) + t = tok.get_string() + elif t.isdigit(): + latitude[2] = int(t) + t = tok.get_string() + if t == 'S': + latitude[4] = -1 + elif t != 'N': + raise dns.exception.SyntaxError('bad latitude hemisphere value') + + longitude[0] = tok.get_int() + t = tok.get_string() + if t.isdigit(): + longitude[1] = int(t) + t = tok.get_string() + if '.' in t: + (seconds, milliseconds) = t.split('.') + if not seconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad longitude seconds value') + longitude[2] = int(seconds) + if longitude[2] >= 60: + raise dns.exception.SyntaxError('longitude seconds >= 60') + l = len(milliseconds) + if l == 0 or l > 3 or not milliseconds.isdigit(): + raise dns.exception.SyntaxError( + 'bad longitude milliseconds value') + if l == 1: + m = 100 + elif l == 2: + m = 10 + else: + m = 1 + longitude[3] = m * int(milliseconds) + t = tok.get_string() + elif t.isdigit(): + longitude[2] = int(t) + t = tok.get_string() + if t == 'W': + longitude[4] = -1 + elif t != 'E': + raise dns.exception.SyntaxError('bad longitude hemisphere value') + + t = tok.get_string() + if t[-1] == 'm': + t = t[0: -1] + altitude = float(t) * 100.0 # m -> cm + + token = tok.get().unescape() + if not token.is_eol_or_eof(): + value = token.value + if value[-1] == 'm': + value = value[0: -1] + size = float(value) * 100.0 # m -> cm + token = tok.get().unescape() + if not token.is_eol_or_eof(): + value = token.value + if value[-1] == 'm': + value = value[0: -1] + hprec = float(value) * 100.0 # m -> cm + token = tok.get().unescape() + if not token.is_eol_or_eof(): + value = token.value + if value[-1] == 'm': + value = value[0: -1] + vprec = float(value) * 100.0 # m -> cm + tok.get_eol() + + return cls(rdclass, rdtype, latitude, longitude, altitude, + size, hprec, vprec) + + def to_wire(self, file, compress=None, origin=None): + milliseconds = (self.latitude[0] * 3600000 + + self.latitude[1] * 60000 + + self.latitude[2] * 1000 + + self.latitude[3]) * self.latitude[4] + latitude = long(0x80000000) + milliseconds + milliseconds = (self.longitude[0] * 3600000 + + self.longitude[1] * 60000 + + self.longitude[2] * 1000 + + self.longitude[3]) * self.longitude[4] + longitude = long(0x80000000) + milliseconds + altitude = long(self.altitude) + long(10000000) + size = _encode_size(self.size, "size") + hprec = _encode_size(self.horizontal_precision, "horizontal precision") + vprec = _encode_size(self.vertical_precision, "vertical precision") + wire = struct.pack("!BBBBIII", 0, size, hprec, vprec, latitude, + longitude, altitude) + file.write(wire) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (version, size, hprec, vprec, latitude, longitude, altitude) = \ + struct.unpack("!BBBBIII", wire[current: current + rdlen]) + if latitude > long(0x80000000): + latitude = float(latitude - long(0x80000000)) / 3600000 + else: + latitude = -1 * float(long(0x80000000) - latitude) / 3600000 + if latitude < -90.0 or latitude > 90.0: + raise dns.exception.FormError("bad latitude") + if longitude > long(0x80000000): + longitude = float(longitude - long(0x80000000)) / 3600000 + else: + longitude = -1 * float(long(0x80000000) - longitude) / 3600000 + if longitude < -180.0 or longitude > 180.0: + raise dns.exception.FormError("bad longitude") + altitude = float(altitude) - 10000000.0 + size = _decode_size(size, "size") + hprec = _decode_size(hprec, "horizontal precision") + vprec = _decode_size(vprec, "vertical precision") + return cls(rdclass, rdtype, latitude, longitude, altitude, + size, hprec, vprec) + + def _get_float_latitude(self): + return _tuple_to_float(self.latitude) + + def _set_float_latitude(self, value): + self.latitude = _float_to_tuple(value) + + float_latitude = property(_get_float_latitude, _set_float_latitude, + doc="latitude as a floating point value") + + def _get_float_longitude(self): + return _tuple_to_float(self.longitude) + + def _set_float_longitude(self, value): + self.longitude = _float_to_tuple(value) + + float_longitude = property(_get_float_longitude, _set_float_longitude, + doc="longitude as a floating point value") diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py new file mode 100644 index 000000000..3a6735dc5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/MX.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class MX(dns.rdtypes.mxbase.MXBase): + + """MX record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py new file mode 100644 index 000000000..ae56d819e --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NS.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class NS(dns.rdtypes.nsbase.NSBase): + + """NS record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py new file mode 100644 index 000000000..dfe96859f --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC.py @@ -0,0 +1,126 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.rdatatype +import dns.name +from dns._compat import xrange + + +class NSEC(dns.rdata.Rdata): + + """NSEC record + + @ivar next: the next name + @type next: dns.name.Name object + @ivar windows: the windowed bitmap list + @type windows: list of (window number, string) tuples""" + + __slots__ = ['next', 'windows'] + + def __init__(self, rdclass, rdtype, next, windows): + super(NSEC, self).__init__(rdclass, rdtype) + self.next = next + self.windows = windows + + def to_text(self, origin=None, relativize=True, **kw): + next = self.next.choose_relativity(origin, relativize) + text = '' + for (window, bitmap) in self.windows: + bits = [] + for i in xrange(0, len(bitmap)): + byte = bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(dns.rdatatype.to_text(window * 256 + + i * 8 + j)) + text += (' ' + ' '.join(bits)) + return '%s%s' % (next, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + next = tok.get_name() + next = next.choose_relativity(origin, relativize) + rdtypes = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + nrdtype = dns.rdatatype.from_text(token.value) + if nrdtype == 0: + raise dns.exception.SyntaxError("NSEC with bit 0") + if nrdtype > 65535: + raise dns.exception.SyntaxError("NSEC with bit > 65535") + rdtypes.append(nrdtype) + rdtypes.sort() + window = 0 + octets = 0 + prior_rdtype = 0 + bitmap = bytearray(b'\0' * 32) + windows = [] + for nrdtype in rdtypes: + if nrdtype == prior_rdtype: + continue + prior_rdtype = nrdtype + new_window = nrdtype // 256 + if new_window != window: + windows.append((window, bitmap[0:octets])) + bitmap = bytearray(b'\0' * 32) + window = new_window + offset = nrdtype % 256 + byte = offset // 8 + bit = offset % 8 + octets = byte + 1 + bitmap[byte] = bitmap[byte] | (0x80 >> bit) + + windows.append((window, bitmap[0:octets])) + return cls(rdclass, rdtype, next, windows) + + def to_wire(self, file, compress=None, origin=None): + self.next.to_wire(file, None, origin) + for (window, bitmap) in self.windows: + file.write(struct.pack('!BB', window, len(bitmap))) + file.write(bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (next, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + windows = [] + while rdlen > 0: + if rdlen < 3: + raise dns.exception.FormError("NSEC too short") + window = wire[current] + octets = wire[current + 1] + if octets == 0 or octets > 32: + raise dns.exception.FormError("bad NSEC octets") + current += 2 + rdlen -= 2 + if rdlen < octets: + raise dns.exception.FormError("bad NSEC bitmap length") + bitmap = bytearray(wire[current: current + octets].unwrap()) + current += octets + rdlen -= octets + windows.append((window, bitmap)) + if origin is not None: + next = next.relativize(origin) + return cls(rdclass, rdtype, next, windows) + + def choose_relativity(self, origin=None, relativize=True): + self.next = self.next.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py new file mode 100644 index 000000000..9a15687ba --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3.py @@ -0,0 +1,191 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 +import binascii +import string +import struct + +import dns.exception +import dns.rdata +import dns.rdatatype +from dns._compat import xrange, text_type + +try: + b32_hex_to_normal = string.maketrans('0123456789ABCDEFGHIJKLMNOPQRSTUV', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') + b32_normal_to_hex = string.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', + '0123456789ABCDEFGHIJKLMNOPQRSTUV') +except AttributeError: + b32_hex_to_normal = bytes.maketrans(b'0123456789ABCDEFGHIJKLMNOPQRSTUV', + b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') + b32_normal_to_hex = bytes.maketrans(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', + b'0123456789ABCDEFGHIJKLMNOPQRSTUV') + +# hash algorithm constants +SHA1 = 1 + +# flag constants +OPTOUT = 1 + + +class NSEC3(dns.rdata.Rdata): + + """NSEC3 record + + @ivar algorithm: the hash algorithm number + @type algorithm: int + @ivar flags: the flags + @type flags: int + @ivar iterations: the number of iterations + @type iterations: int + @ivar salt: the salt + @type salt: string + @ivar next: the next name hash + @type next: string + @ivar windows: the windowed bitmap list + @type windows: list of (window number, string) tuples""" + + __slots__ = ['algorithm', 'flags', 'iterations', 'salt', 'next', 'windows'] + + def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt, + next, windows): + super(NSEC3, self).__init__(rdclass, rdtype) + self.algorithm = algorithm + self.flags = flags + self.iterations = iterations + if isinstance(salt, text_type): + self.salt = salt.encode() + else: + self.salt = salt + self.next = next + self.windows = windows + + def to_text(self, origin=None, relativize=True, **kw): + next = base64.b32encode(self.next).translate( + b32_normal_to_hex).lower().decode() + if self.salt == b'': + salt = '-' + else: + salt = binascii.hexlify(self.salt).decode() + text = u'' + for (window, bitmap) in self.windows: + bits = [] + for i in xrange(0, len(bitmap)): + byte = bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(dns.rdatatype.to_text(window * 256 + + i * 8 + j)) + text += (u' ' + u' '.join(bits)) + return u'%u %u %u %s %s%s' % (self.algorithm, self.flags, + self.iterations, salt, next, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + flags = tok.get_uint8() + iterations = tok.get_uint16() + salt = tok.get_string() + if salt == u'-': + salt = b'' + else: + salt = binascii.unhexlify(salt.encode('ascii')) + next = tok.get_string().encode( + 'ascii').upper().translate(b32_hex_to_normal) + next = base64.b32decode(next) + rdtypes = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + nrdtype = dns.rdatatype.from_text(token.value) + if nrdtype == 0: + raise dns.exception.SyntaxError("NSEC3 with bit 0") + if nrdtype > 65535: + raise dns.exception.SyntaxError("NSEC3 with bit > 65535") + rdtypes.append(nrdtype) + rdtypes.sort() + window = 0 + octets = 0 + prior_rdtype = 0 + bitmap = bytearray(b'\0' * 32) + windows = [] + for nrdtype in rdtypes: + if nrdtype == prior_rdtype: + continue + prior_rdtype = nrdtype + new_window = nrdtype // 256 + if new_window != window: + if octets != 0: + windows.append((window, ''.join(bitmap[0:octets]))) + bitmap = bytearray(b'\0' * 32) + window = new_window + offset = nrdtype % 256 + byte = offset // 8 + bit = offset % 8 + octets = byte + 1 + bitmap[byte] = bitmap[byte] | (0x80 >> bit) + if octets != 0: + windows.append((window, bitmap[0:octets])) + return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, + windows) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.salt) + file.write(struct.pack("!BBHB", self.algorithm, self.flags, + self.iterations, l)) + file.write(self.salt) + l = len(self.next) + file.write(struct.pack("!B", l)) + file.write(self.next) + for (window, bitmap) in self.windows: + file.write(struct.pack("!BB", window, len(bitmap))) + file.write(bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (algorithm, flags, iterations, slen) = \ + struct.unpack('!BBHB', wire[current: current + 5]) + + current += 5 + rdlen -= 5 + salt = wire[current: current + slen].unwrap() + current += slen + rdlen -= slen + nlen = wire[current] + current += 1 + rdlen -= 1 + next = wire[current: current + nlen].unwrap() + current += nlen + rdlen -= nlen + windows = [] + while rdlen > 0: + if rdlen < 3: + raise dns.exception.FormError("NSEC3 too short") + window = wire[current] + octets = wire[current + 1] + if octets == 0 or octets > 32: + raise dns.exception.FormError("bad NSEC3 octets") + current += 2 + rdlen -= 2 + if rdlen < octets: + raise dns.exception.FormError("bad NSEC3 bitmap length") + bitmap = bytearray(wire[current: current + octets].unwrap()) + current += octets + rdlen -= octets + windows.append((window, bitmap)) + return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, + windows) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py new file mode 100644 index 000000000..36bf74094 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/NSEC3PARAM.py @@ -0,0 +1,88 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.exception +import dns.rdata +from dns._compat import text_type + + +class NSEC3PARAM(dns.rdata.Rdata): + + """NSEC3PARAM record + + @ivar algorithm: the hash algorithm number + @type algorithm: int + @ivar flags: the flags + @type flags: int + @ivar iterations: the number of iterations + @type iterations: int + @ivar salt: the salt + @type salt: string""" + + __slots__ = ['algorithm', 'flags', 'iterations', 'salt'] + + def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt): + super(NSEC3PARAM, self).__init__(rdclass, rdtype) + self.algorithm = algorithm + self.flags = flags + self.iterations = iterations + if isinstance(salt, text_type): + self.salt = salt.encode() + else: + self.salt = salt + + def to_text(self, origin=None, relativize=True, **kw): + if self.salt == b'': + salt = '-' + else: + salt = binascii.hexlify(self.salt).decode() + return '%u %u %u %s' % (self.algorithm, self.flags, self.iterations, + salt) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + flags = tok.get_uint8() + iterations = tok.get_uint16() + salt = tok.get_string() + if salt == '-': + salt = '' + else: + salt = binascii.unhexlify(salt.encode()) + tok.get_eol() + return cls(rdclass, rdtype, algorithm, flags, iterations, salt) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.salt) + file.write(struct.pack("!BBHB", self.algorithm, self.flags, + self.iterations, l)) + file.write(self.salt) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (algorithm, flags, iterations, slen) = \ + struct.unpack('!BBHB', + wire[current: current + 5]) + current += 5 + rdlen -= 5 + salt = wire[current: current + slen].unwrap() + current += slen + rdlen -= slen + if rdlen != 0: + raise dns.exception.FormError + return cls(rdclass, rdtype, algorithm, flags, iterations, salt) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py new file mode 100644 index 000000000..250187a61 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/PTR.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class PTR(dns.rdtypes.nsbase.NSBase): + + """PTR record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py new file mode 100644 index 000000000..e9071c763 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/RP.py @@ -0,0 +1,80 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.exception +import dns.rdata +import dns.name + + +class RP(dns.rdata.Rdata): + + """RP record + + @ivar mbox: The responsible person's mailbox + @type mbox: dns.name.Name object + @ivar txt: The owner name of a node with TXT records, or the root name + if no TXT records are associated with this RP. + @type txt: dns.name.Name object + @see: RFC 1183""" + + __slots__ = ['mbox', 'txt'] + + def __init__(self, rdclass, rdtype, mbox, txt): + super(RP, self).__init__(rdclass, rdtype) + self.mbox = mbox + self.txt = txt + + def to_text(self, origin=None, relativize=True, **kw): + mbox = self.mbox.choose_relativity(origin, relativize) + txt = self.txt.choose_relativity(origin, relativize) + return "%s %s" % (str(mbox), str(txt)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + mbox = tok.get_name() + txt = tok.get_name() + mbox = mbox.choose_relativity(origin, relativize) + txt = txt.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, mbox, txt) + + def to_wire(self, file, compress=None, origin=None): + self.mbox.to_wire(file, None, origin) + self.txt.to_wire(file, None, origin) + + def to_digestable(self, origin=None): + return self.mbox.to_digestable(origin) + \ + self.txt.to_digestable(origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (mbox, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + current += cused + rdlen -= cused + if rdlen <= 0: + raise dns.exception.FormError + (txt, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + mbox = mbox.relativize(origin) + txt = txt.relativize(origin) + return cls(rdclass, rdtype, mbox, txt) + + def choose_relativity(self, origin=None, relativize=True): + self.mbox = self.mbox.choose_relativity(origin, relativize) + self.txt = self.txt.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py new file mode 100644 index 000000000..953dfb9a5 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/RRSIG.py @@ -0,0 +1,156 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 +import calendar +import struct +import time + +import dns.dnssec +import dns.exception +import dns.rdata +import dns.rdatatype + + +class BadSigTime(dns.exception.DNSException): + + """Time in DNS SIG or RRSIG resource record cannot be parsed.""" + + +def sigtime_to_posixtime(what): + if len(what) != 14: + raise BadSigTime + year = int(what[0:4]) + month = int(what[4:6]) + day = int(what[6:8]) + hour = int(what[8:10]) + minute = int(what[10:12]) + second = int(what[12:14]) + return calendar.timegm((year, month, day, hour, minute, second, + 0, 0, 0)) + + +def posixtime_to_sigtime(what): + return time.strftime('%Y%m%d%H%M%S', time.gmtime(what)) + + +class RRSIG(dns.rdata.Rdata): + + """RRSIG record + + @ivar type_covered: the rdata type this signature covers + @type type_covered: int + @ivar algorithm: the algorithm used for the sig + @type algorithm: int + @ivar labels: number of labels + @type labels: int + @ivar original_ttl: the original TTL + @type original_ttl: long + @ivar expiration: signature expiration time + @type expiration: long + @ivar inception: signature inception time + @type inception: long + @ivar key_tag: the key tag + @type key_tag: int + @ivar signer: the signer + @type signer: dns.name.Name object + @ivar signature: the signature + @type signature: string""" + + __slots__ = ['type_covered', 'algorithm', 'labels', 'original_ttl', + 'expiration', 'inception', 'key_tag', 'signer', + 'signature'] + + def __init__(self, rdclass, rdtype, type_covered, algorithm, labels, + original_ttl, expiration, inception, key_tag, signer, + signature): + super(RRSIG, self).__init__(rdclass, rdtype) + self.type_covered = type_covered + self.algorithm = algorithm + self.labels = labels + self.original_ttl = original_ttl + self.expiration = expiration + self.inception = inception + self.key_tag = key_tag + self.signer = signer + self.signature = signature + + def covers(self): + return self.type_covered + + def to_text(self, origin=None, relativize=True, **kw): + return '%s %d %d %d %s %s %d %s %s' % ( + dns.rdatatype.to_text(self.type_covered), + self.algorithm, + self.labels, + self.original_ttl, + posixtime_to_sigtime(self.expiration), + posixtime_to_sigtime(self.inception), + self.key_tag, + self.signer.choose_relativity(origin, relativize), + dns.rdata._base64ify(self.signature) + ) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + type_covered = dns.rdatatype.from_text(tok.get_string()) + algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) + labels = tok.get_int() + original_ttl = tok.get_ttl() + expiration = sigtime_to_posixtime(tok.get_string()) + inception = sigtime_to_posixtime(tok.get_string()) + key_tag = tok.get_int() + signer = tok.get_name() + signer = signer.choose_relativity(origin, relativize) + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + signature = base64.b64decode(b64) + return cls(rdclass, rdtype, type_covered, algorithm, labels, + original_ttl, expiration, inception, key_tag, signer, + signature) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack('!HBBIIIH', self.type_covered, + self.algorithm, self.labels, + self.original_ttl, self.expiration, + self.inception, self.key_tag) + file.write(header) + self.signer.to_wire(file, None, origin) + file.write(self.signature) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack('!HBBIIIH', wire[current: current + 18]) + current += 18 + rdlen -= 18 + (signer, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + if origin is not None: + signer = signer.relativize(origin) + signature = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], + header[3], header[4], header[5], header[6], signer, + signature) + + def choose_relativity(self, origin=None, relativize=True): + self.signer = self.signer.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py new file mode 100644 index 000000000..88b754868 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/RT.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class RT(dns.rdtypes.mxbase.UncompressedDowncasingMX): + + """RT record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py new file mode 100644 index 000000000..cc0098e8b --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/SOA.py @@ -0,0 +1,114 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class SOA(dns.rdata.Rdata): + + """SOA record + + @ivar mname: the SOA MNAME (master name) field + @type mname: dns.name.Name object + @ivar rname: the SOA RNAME (responsible name) field + @type rname: dns.name.Name object + @ivar serial: The zone's serial number + @type serial: int + @ivar refresh: The zone's refresh value (in seconds) + @type refresh: int + @ivar retry: The zone's retry value (in seconds) + @type retry: int + @ivar expire: The zone's expiration value (in seconds) + @type expire: int + @ivar minimum: The zone's negative caching time (in seconds, called + "minimum" for historical reasons) + @type minimum: int + @see: RFC 1035""" + + __slots__ = ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire', + 'minimum'] + + def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry, + expire, minimum): + super(SOA, self).__init__(rdclass, rdtype) + self.mname = mname + self.rname = rname + self.serial = serial + self.refresh = refresh + self.retry = retry + self.expire = expire + self.minimum = minimum + + def to_text(self, origin=None, relativize=True, **kw): + mname = self.mname.choose_relativity(origin, relativize) + rname = self.rname.choose_relativity(origin, relativize) + return '%s %s %d %d %d %d %d' % ( + mname, rname, self.serial, self.refresh, self.retry, + self.expire, self.minimum) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + mname = tok.get_name() + rname = tok.get_name() + mname = mname.choose_relativity(origin, relativize) + rname = rname.choose_relativity(origin, relativize) + serial = tok.get_uint32() + refresh = tok.get_ttl() + retry = tok.get_ttl() + expire = tok.get_ttl() + minimum = tok.get_ttl() + tok.get_eol() + return cls(rdclass, rdtype, mname, rname, serial, refresh, retry, + expire, minimum) + + def to_wire(self, file, compress=None, origin=None): + self.mname.to_wire(file, compress, origin) + self.rname.to_wire(file, compress, origin) + five_ints = struct.pack('!IIIII', self.serial, self.refresh, + self.retry, self.expire, self.minimum) + file.write(five_ints) + + def to_digestable(self, origin=None): + return self.mname.to_digestable(origin) + \ + self.rname.to_digestable(origin) + \ + struct.pack('!IIIII', self.serial, self.refresh, + self.retry, self.expire, self.minimum) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (mname, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + (rname, cused) = dns.name.from_wire(wire[: current + rdlen], current) + current += cused + rdlen -= cused + if rdlen != 20: + raise dns.exception.FormError + five_ints = struct.unpack('!IIIII', + wire[current: current + rdlen]) + if origin is not None: + mname = mname.relativize(origin) + rname = rname.relativize(origin) + return cls(rdclass, rdtype, mname, rname, + five_ints[0], five_ints[1], five_ints[2], five_ints[3], + five_ints[4]) + + def choose_relativity(self, origin=None, relativize=True): + self.mname = self.mname.choose_relativity(origin, relativize) + self.rname = self.rname.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py new file mode 100644 index 000000000..f3e0904e6 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/SPF.py @@ -0,0 +1,23 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.txtbase + + +class SPF(dns.rdtypes.txtbase.TXTBase): + + """SPF record + + @see: RFC 4408""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py new file mode 100644 index 000000000..7e846b342 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/SSHFP.py @@ -0,0 +1,77 @@ +# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.rdata +import dns.rdatatype + + +class SSHFP(dns.rdata.Rdata): + + """SSHFP record + + @ivar algorithm: the algorithm + @type algorithm: int + @ivar fp_type: the digest type + @type fp_type: int + @ivar fingerprint: the fingerprint + @type fingerprint: string + @see: draft-ietf-secsh-dns-05.txt""" + + __slots__ = ['algorithm', 'fp_type', 'fingerprint'] + + def __init__(self, rdclass, rdtype, algorithm, fp_type, + fingerprint): + super(SSHFP, self).__init__(rdclass, rdtype) + self.algorithm = algorithm + self.fp_type = fp_type + self.fingerprint = fingerprint + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %s' % (self.algorithm, + self.fp_type, + dns.rdata._hexify(self.fingerprint, + chunksize=128)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + algorithm = tok.get_uint8() + fp_type = tok.get_uint8() + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + fingerprint = b''.join(chunks) + fingerprint = binascii.unhexlify(fingerprint) + return cls(rdclass, rdtype, algorithm, fp_type, fingerprint) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!BB", self.algorithm, self.fp_type) + file.write(header) + file.write(self.fingerprint) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack("!BB", wire[current: current + 2]) + current += 2 + rdlen -= 2 + fingerprint = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], fingerprint) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py new file mode 100644 index 000000000..790a93b9d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/TLSA.py @@ -0,0 +1,82 @@ +# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.rdata +import dns.rdatatype + + +class TLSA(dns.rdata.Rdata): + + """TLSA record + + @ivar usage: The certificate usage + @type usage: int + @ivar selector: The selector field + @type selector: int + @ivar mtype: The 'matching type' field + @type mtype: int + @ivar cert: The 'Certificate Association Data' field + @type cert: string + @see: RFC 6698""" + + __slots__ = ['usage', 'selector', 'mtype', 'cert'] + + def __init__(self, rdclass, rdtype, usage, selector, + mtype, cert): + super(TLSA, self).__init__(rdclass, rdtype) + self.usage = usage + self.selector = selector + self.mtype = mtype + self.cert = cert + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %d %s' % (self.usage, + self.selector, + self.mtype, + dns.rdata._hexify(self.cert, + chunksize=128)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + usage = tok.get_uint8() + selector = tok.get_uint8() + mtype = tok.get_uint8() + cert_chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + cert_chunks.append(t.value.encode()) + cert = b''.join(cert_chunks) + cert = binascii.unhexlify(cert) + return cls(rdclass, rdtype, usage, selector, mtype, cert) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!BBB", self.usage, self.selector, self.mtype) + file.write(header) + file.write(self.cert) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack("!BBB", wire[current: current + 3]) + current += 3 + rdlen -= 3 + cert = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], cert) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py new file mode 100644 index 000000000..6c7fa4502 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/TXT.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.txtbase + + +class TXT(dns.rdtypes.txtbase.TXTBase): + + """TXT record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py new file mode 100644 index 000000000..b5595b510 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/URI.py @@ -0,0 +1,80 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# Copyright (C) 2015 Red Hat, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name +from dns._compat import text_type + + +class URI(dns.rdata.Rdata): + + """URI record + + @ivar priority: the priority + @type priority: int + @ivar weight: the weight + @type weight: int + @ivar target: the target host + @type target: dns.name.Name object + @see: draft-faltstrom-uri-13""" + + __slots__ = ['priority', 'weight', 'target'] + + def __init__(self, rdclass, rdtype, priority, weight, target): + super(URI, self).__init__(rdclass, rdtype) + self.priority = priority + self.weight = weight + if len(target) < 1: + raise dns.exception.SyntaxError("URI target cannot be empty") + if isinstance(target, text_type): + self.target = target.encode() + else: + self.target = target + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d "%s"' % (self.priority, self.weight, + self.target.decode()) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + priority = tok.get_uint16() + weight = tok.get_uint16() + target = tok.get().unescape() + if not (target.is_quoted_string() or target.is_identifier()): + raise dns.exception.SyntaxError("URI target must be a string") + tok.get_eol() + return cls(rdclass, rdtype, priority, weight, target.value) + + def to_wire(self, file, compress=None, origin=None): + two_ints = struct.pack("!HH", self.priority, self.weight) + file.write(two_ints) + file.write(self.target) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 5: + raise dns.exception.FormError('URI RR is shorter than 5 octets') + + (priority, weight) = struct.unpack('!HH', wire[current: current + 4]) + current += 4 + rdlen -= 4 + target = wire[current: current + rdlen] + current += rdlen + + return cls(rdclass, rdtype, priority, weight, target) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py new file mode 100644 index 000000000..8732ccf0d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/X25.py @@ -0,0 +1,64 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import text_type + + +class X25(dns.rdata.Rdata): + + """X25 record + + @ivar address: the PSDN address + @type address: string + @see: RFC 1183""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(X25, self).__init__(rdclass, rdtype) + if isinstance(address, text_type): + self.address = address.encode() + else: + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return '"%s"' % dns.rdata._escapify(self.address) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + tok.get_eol() + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + l = len(self.address) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(self.address) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + l = wire[current] + current += 1 + rdlen -= 1 + if l != rdlen: + raise dns.exception.FormError + address = wire[current: current + l].unwrap() + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py b/Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py new file mode 100644 index 000000000..ea9c3e2e0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/ANY/__init__.py @@ -0,0 +1,50 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Class ANY (generic) rdata type classes.""" + +__all__ = [ + 'AFSDB', + 'CDNSKEY', + 'CDS', + 'CERT', + 'CNAME', + 'DLV', + 'DNAME', + 'DNSKEY', + 'DS', + 'EUI48', + 'EUI64', + 'GPOS', + 'HINFO', + 'HIP', + 'ISDN', + 'LOC', + 'MX', + 'NS', + 'NSEC', + 'NSEC3', + 'NSEC3PARAM', + 'TLSA', + 'PTR', + 'RP', + 'RRSIG', + 'RT', + 'SOA', + 'SPF', + 'SSHFP', + 'TXT', + 'X25', +] diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/A.py b/Contents/Libraries/Shared/dns/rdtypes/IN/A.py new file mode 100644 index 000000000..3775548f2 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/A.py @@ -0,0 +1,52 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.exception +import dns.ipv4 +import dns.rdata +import dns.tokenizer + + +class A(dns.rdata.Rdata): + + """A record. + + @ivar address: an IPv4 address + @type address: string (in the standard "dotted quad" format)""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(A, self).__init__(rdclass, rdtype) + # check that it's OK + dns.ipv4.inet_aton(address) + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return self.address + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_identifier() + tok.get_eol() + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + file.write(dns.ipv4.inet_aton(self.address)) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = dns.ipv4.inet_ntoa(wire[current: current + rdlen]).decode() + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py b/Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py new file mode 100644 index 000000000..4352404d7 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/AAAA.py @@ -0,0 +1,53 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.exception +import dns.inet +import dns.rdata +import dns.tokenizer + + +class AAAA(dns.rdata.Rdata): + + """AAAA record. + + @ivar address: an IPv6 address + @type address: string (in the standard IPv6 format)""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(AAAA, self).__init__(rdclass, rdtype) + # check that it's OK + dns.inet.inet_pton(dns.inet.AF_INET6, address) + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return self.address + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_identifier() + tok.get_eol() + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.address)) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = dns.inet.inet_ntop(dns.inet.AF_INET6, + wire[current: current + rdlen]) + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/APL.py b/Contents/Libraries/Shared/dns/rdtypes/IN/APL.py new file mode 100644 index 000000000..57ef6c0a9 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/APL.py @@ -0,0 +1,161 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.exception +import dns.inet +import dns.rdata +import dns.tokenizer +from dns._compat import xrange + + +class APLItem(object): + + """An APL list item. + + @ivar family: the address family (IANA address family registry) + @type family: int + @ivar negation: is this item negated? + @type negation: bool + @ivar address: the address + @type address: string + @ivar prefix: the prefix length + @type prefix: int + """ + + __slots__ = ['family', 'negation', 'address', 'prefix'] + + def __init__(self, family, negation, address, prefix): + self.family = family + self.negation = negation + self.address = address + self.prefix = prefix + + def __str__(self): + if self.negation: + return "!%d:%s/%s" % (self.family, self.address, self.prefix) + else: + return "%d:%s/%s" % (self.family, self.address, self.prefix) + + def to_wire(self, file): + if self.family == 1: + address = dns.inet.inet_pton(dns.inet.AF_INET, self.address) + elif self.family == 2: + address = dns.inet.inet_pton(dns.inet.AF_INET6, self.address) + else: + address = binascii.unhexlify(self.address) + # + # Truncate least significant zero bytes. + # + last = 0 + for i in xrange(len(address) - 1, -1, -1): + if address[i] != chr(0): + last = i + 1 + break + address = address[0: last] + l = len(address) + assert l < 128 + if self.negation: + l |= 0x80 + header = struct.pack('!HBB', self.family, self.prefix, l) + file.write(header) + file.write(address) + + +class APL(dns.rdata.Rdata): + + """APL record. + + @ivar items: a list of APL items + @type items: list of APL_Item + @see: RFC 3123""" + + __slots__ = ['items'] + + def __init__(self, rdclass, rdtype, items): + super(APL, self).__init__(rdclass, rdtype) + self.items = items + + def to_text(self, origin=None, relativize=True, **kw): + return ' '.join(map(str, self.items)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + items = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + item = token.value + if item[0] == '!': + negation = True + item = item[1:] + else: + negation = False + (family, rest) = item.split(':', 1) + family = int(family) + (address, prefix) = rest.split('/', 1) + prefix = int(prefix) + item = APLItem(family, negation, address, prefix) + items.append(item) + + return cls(rdclass, rdtype, items) + + def to_wire(self, file, compress=None, origin=None): + for item in self.items: + item.to_wire(file) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + items = [] + while 1: + if rdlen == 0: + break + if rdlen < 4: + raise dns.exception.FormError + header = struct.unpack('!HBB', wire[current: current + 4]) + afdlen = header[2] + if afdlen > 127: + negation = True + afdlen -= 128 + else: + negation = False + current += 4 + rdlen -= 4 + if rdlen < afdlen: + raise dns.exception.FormError + address = wire[current: current + afdlen].unwrap() + l = len(address) + if header[0] == 1: + if l < 4: + address += '\x00' * (4 - l) + address = dns.inet.inet_ntop(dns.inet.AF_INET, address) + elif header[0] == 2: + if l < 16: + address += '\x00' * (16 - l) + address = dns.inet.inet_ntop(dns.inet.AF_INET6, address) + else: + # + # This isn't really right according to the RFC, but it + # seems better than throwing an exception + # + address = address.encode('hex_codec') + current += afdlen + rdlen -= afdlen + item = APLItem(header[0], negation, address, header[1]) + items.append(item) + return cls(rdclass, rdtype, items) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py b/Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py new file mode 100644 index 000000000..5b8626a5a --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/DHCID.py @@ -0,0 +1,59 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 + +import dns.exception + + +class DHCID(dns.rdata.Rdata): + + """DHCID record + + @ivar data: the data (the content of the RR is opaque as far as the + DNS is concerned) + @type data: string + @see: RFC 4701""" + + __slots__ = ['data'] + + def __init__(self, rdclass, rdtype, data): + super(DHCID, self).__init__(rdclass, rdtype) + self.data = data + + def to_text(self, origin=None, relativize=True, **kw): + return dns.rdata._base64ify(self.data) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + data = base64.b64decode(b64) + return cls(rdclass, rdtype, data) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.data) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + data = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, data) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py b/Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py new file mode 100644 index 000000000..c673e839d --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/IPSECKEY.py @@ -0,0 +1,148 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import base64 + +import dns.exception +import dns.inet +import dns.name + + +class IPSECKEY(dns.rdata.Rdata): + + """IPSECKEY record + + @ivar precedence: the precedence for this key data + @type precedence: int + @ivar gateway_type: the gateway type + @type gateway_type: int + @ivar algorithm: the algorithm to use + @type algorithm: int + @ivar gateway: the public key + @type gateway: None, IPv4 address, IPV6 address, or domain name + @ivar key: the public key + @type key: string + @see: RFC 4025""" + + __slots__ = ['precedence', 'gateway_type', 'algorithm', 'gateway', 'key'] + + def __init__(self, rdclass, rdtype, precedence, gateway_type, algorithm, + gateway, key): + super(IPSECKEY, self).__init__(rdclass, rdtype) + if gateway_type == 0: + if gateway != '.' and gateway is not None: + raise SyntaxError('invalid gateway for gateway type 0') + gateway = None + elif gateway_type == 1: + # check that it's OK + dns.inet.inet_pton(dns.inet.AF_INET, gateway) + elif gateway_type == 2: + # check that it's OK + dns.inet.inet_pton(dns.inet.AF_INET6, gateway) + elif gateway_type == 3: + pass + else: + raise SyntaxError( + 'invalid IPSECKEY gateway type: %d' % gateway_type) + self.precedence = precedence + self.gateway_type = gateway_type + self.algorithm = algorithm + self.gateway = gateway + self.key = key + + def to_text(self, origin=None, relativize=True, **kw): + if self.gateway_type == 0: + gateway = '.' + elif self.gateway_type == 1: + gateway = self.gateway + elif self.gateway_type == 2: + gateway = self.gateway + elif self.gateway_type == 3: + gateway = str(self.gateway.choose_relativity(origin, relativize)) + else: + raise ValueError('invalid gateway type') + return '%d %d %d %s %s' % (self.precedence, self.gateway_type, + self.algorithm, gateway, + dns.rdata._base64ify(self.key)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + precedence = tok.get_uint8() + gateway_type = tok.get_uint8() + algorithm = tok.get_uint8() + if gateway_type == 3: + gateway = tok.get_name().choose_relativity(origin, relativize) + else: + gateway = tok.get_string() + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + key = base64.b64decode(b64) + return cls(rdclass, rdtype, precedence, gateway_type, algorithm, + gateway, key) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!BBB", self.precedence, self.gateway_type, + self.algorithm) + file.write(header) + if self.gateway_type == 0: + pass + elif self.gateway_type == 1: + file.write(dns.inet.inet_pton(dns.inet.AF_INET, self.gateway)) + elif self.gateway_type == 2: + file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.gateway)) + elif self.gateway_type == 3: + self.gateway.to_wire(file, None, origin) + else: + raise ValueError('invalid gateway type') + file.write(self.key) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 3: + raise dns.exception.FormError + header = struct.unpack('!BBB', wire[current: current + 3]) + gateway_type = header[1] + current += 3 + rdlen -= 3 + if gateway_type == 0: + gateway = None + elif gateway_type == 1: + gateway = dns.inet.inet_ntop(dns.inet.AF_INET, + wire[current: current + 4]) + current += 4 + rdlen -= 4 + elif gateway_type == 2: + gateway = dns.inet.inet_ntop(dns.inet.AF_INET6, + wire[current: current + 16]) + current += 16 + rdlen -= 16 + elif gateway_type == 3: + (gateway, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + current += cused + rdlen -= cused + else: + raise dns.exception.FormError('invalid IPSECKEY gateway type') + key = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], gateway_type, header[2], + gateway, key) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/KX.py b/Contents/Libraries/Shared/dns/rdtypes/IN/KX.py new file mode 100644 index 000000000..adbfe34b1 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/KX.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.mxbase + + +class KX(dns.rdtypes.mxbase.UncompressedMX): + + """KX record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py b/Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py new file mode 100644 index 000000000..5ae2feb15 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/NAPTR.py @@ -0,0 +1,125 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.name +import dns.rdata +from dns._compat import xrange, text_type + + +def _write_string(file, s): + l = len(s) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(s) + + +def _sanitize(value): + if isinstance(value, text_type): + return value.encode() + return value + + +class NAPTR(dns.rdata.Rdata): + + """NAPTR record + + @ivar order: order + @type order: int + @ivar preference: preference + @type preference: int + @ivar flags: flags + @type flags: string + @ivar service: service + @type service: string + @ivar regexp: regular expression + @type regexp: string + @ivar replacement: replacement name + @type replacement: dns.name.Name object + @see: RFC 3403""" + + __slots__ = ['order', 'preference', 'flags', 'service', 'regexp', + 'replacement'] + + def __init__(self, rdclass, rdtype, order, preference, flags, service, + regexp, replacement): + super(NAPTR, self).__init__(rdclass, rdtype) + self.flags = _sanitize(flags) + self.service = _sanitize(service) + self.regexp = _sanitize(regexp) + self.order = order + self.preference = preference + self.replacement = replacement + + def to_text(self, origin=None, relativize=True, **kw): + replacement = self.replacement.choose_relativity(origin, relativize) + return '%d %d "%s" "%s" "%s" %s' % \ + (self.order, self.preference, + dns.rdata._escapify(self.flags), + dns.rdata._escapify(self.service), + dns.rdata._escapify(self.regexp), + replacement) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + order = tok.get_uint16() + preference = tok.get_uint16() + flags = tok.get_string() + service = tok.get_string() + regexp = tok.get_string() + replacement = tok.get_name() + replacement = replacement.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, order, preference, flags, service, + regexp, replacement) + + def to_wire(self, file, compress=None, origin=None): + two_ints = struct.pack("!HH", self.order, self.preference) + file.write(two_ints) + _write_string(file, self.flags) + _write_string(file, self.service) + _write_string(file, self.regexp) + self.replacement.to_wire(file, compress, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (order, preference) = struct.unpack('!HH', wire[current: current + 4]) + current += 4 + rdlen -= 4 + strings = [] + for i in xrange(3): + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen or rdlen < 0: + raise dns.exception.FormError + s = wire[current: current + l].unwrap() + current += l + rdlen -= l + strings.append(s) + (replacement, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + replacement = replacement.relativize(origin) + return cls(rdclass, rdtype, order, preference, strings[0], strings[1], + strings[2], replacement) + + def choose_relativity(self, origin=None, relativize=True): + self.replacement = self.replacement.choose_relativity(origin, + relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py new file mode 100644 index 000000000..05d0745ef --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP.py @@ -0,0 +1,58 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import binascii + +import dns.exception +import dns.rdata +import dns.tokenizer + + +class NSAP(dns.rdata.Rdata): + + """NSAP record. + + @ivar address: a NASP + @type address: string + @see: RFC 1706""" + + __slots__ = ['address'] + + def __init__(self, rdclass, rdtype, address): + super(NSAP, self).__init__(rdclass, rdtype) + self.address = address + + def to_text(self, origin=None, relativize=True, **kw): + return "0x%s" % binascii.hexlify(self.address).decode() + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + tok.get_eol() + if address[0:2] != '0x': + raise dns.exception.SyntaxError('string does not start with 0x') + address = address[2:].replace('.', '') + if len(address) % 2 != 0: + raise dns.exception.SyntaxError('hexstring has odd length') + address = binascii.unhexlify(address.encode()) + return cls(rdclass, rdtype, address) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.address) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, address) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py new file mode 100644 index 000000000..56967df02 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/NSAP_PTR.py @@ -0,0 +1,21 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import dns.rdtypes.nsbase + + +class NSAP_PTR(dns.rdtypes.nsbase.UncompressedNS): + + """NSAP-PTR record""" diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/PX.py b/Contents/Libraries/Shared/dns/rdtypes/IN/PX.py new file mode 100644 index 000000000..e1ef102b1 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/PX.py @@ -0,0 +1,87 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class PX(dns.rdata.Rdata): + + """PX record. + + @ivar preference: the preference value + @type preference: int + @ivar map822: the map822 name + @type map822: dns.name.Name object + @ivar mapx400: the mapx400 name + @type mapx400: dns.name.Name object + @see: RFC 2163""" + + __slots__ = ['preference', 'map822', 'mapx400'] + + def __init__(self, rdclass, rdtype, preference, map822, mapx400): + super(PX, self).__init__(rdclass, rdtype) + self.preference = preference + self.map822 = map822 + self.mapx400 = mapx400 + + def to_text(self, origin=None, relativize=True, **kw): + map822 = self.map822.choose_relativity(origin, relativize) + mapx400 = self.mapx400.choose_relativity(origin, relativize) + return '%d %s %s' % (self.preference, map822, mapx400) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + preference = tok.get_uint16() + map822 = tok.get_name() + map822 = map822.choose_relativity(origin, relativize) + mapx400 = tok.get_name(None) + mapx400 = mapx400.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, preference, map822, mapx400) + + def to_wire(self, file, compress=None, origin=None): + pref = struct.pack("!H", self.preference) + file.write(pref) + self.map822.to_wire(file, None, origin) + self.mapx400.to_wire(file, None, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (preference, ) = struct.unpack('!H', wire[current: current + 2]) + current += 2 + rdlen -= 2 + (map822, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused > rdlen: + raise dns.exception.FormError + current += cused + rdlen -= cused + if origin is not None: + map822 = map822.relativize(origin) + (mapx400, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + mapx400 = mapx400.relativize(origin) + return cls(rdclass, rdtype, preference, map822, mapx400) + + def choose_relativity(self, origin=None, relativize=True): + self.map822 = self.map822.choose_relativity(origin, relativize) + self.mapx400 = self.mapx400.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py b/Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py new file mode 100644 index 000000000..f4396d614 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/SRV.py @@ -0,0 +1,81 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class SRV(dns.rdata.Rdata): + + """SRV record + + @ivar priority: the priority + @type priority: int + @ivar weight: the weight + @type weight: int + @ivar port: the port of the service + @type port: int + @ivar target: the target host + @type target: dns.name.Name object + @see: RFC 2782""" + + __slots__ = ['priority', 'weight', 'port', 'target'] + + def __init__(self, rdclass, rdtype, priority, weight, port, target): + super(SRV, self).__init__(rdclass, rdtype) + self.priority = priority + self.weight = weight + self.port = port + self.target = target + + def to_text(self, origin=None, relativize=True, **kw): + target = self.target.choose_relativity(origin, relativize) + return '%d %d %d %s' % (self.priority, self.weight, self.port, + target) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + priority = tok.get_uint16() + weight = tok.get_uint16() + port = tok.get_uint16() + target = tok.get_name(None) + target = target.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, priority, weight, port, target) + + def to_wire(self, file, compress=None, origin=None): + three_ints = struct.pack("!HHH", self.priority, self.weight, self.port) + file.write(three_ints) + self.target.to_wire(file, compress, origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (priority, weight, port) = struct.unpack('!HHH', + wire[current: current + 6]) + current += 6 + rdlen -= 6 + (target, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + target = target.relativize(origin) + return cls(rdclass, rdtype, priority, weight, port, target) + + def choose_relativity(self, origin=None, relativize=True): + self.target = self.target.choose_relativity(origin, relativize) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py b/Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py new file mode 100644 index 000000000..1d4012c30 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/WKS.py @@ -0,0 +1,105 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import socket +import struct + +import dns.ipv4 +import dns.rdata +from dns._compat import xrange + +_proto_tcp = socket.getprotobyname('tcp') +_proto_udp = socket.getprotobyname('udp') + + +class WKS(dns.rdata.Rdata): + + """WKS record + + @ivar address: the address + @type address: string + @ivar protocol: the protocol + @type protocol: int + @ivar bitmap: the bitmap + @type bitmap: string + @see: RFC 1035""" + + __slots__ = ['address', 'protocol', 'bitmap'] + + def __init__(self, rdclass, rdtype, address, protocol, bitmap): + super(WKS, self).__init__(rdclass, rdtype) + self.address = address + self.protocol = protocol + if not isinstance(bitmap, bytearray): + self.bitmap = bytearray(bitmap) + else: + self.bitmap = bitmap + + def to_text(self, origin=None, relativize=True, **kw): + bits = [] + for i in xrange(0, len(self.bitmap)): + byte = self.bitmap[i] + for j in xrange(0, 8): + if byte & (0x80 >> j): + bits.append(str(i * 8 + j)) + text = ' '.join(bits) + return '%s %d %s' % (self.address, self.protocol, text) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + address = tok.get_string() + protocol = tok.get_string() + if protocol.isdigit(): + protocol = int(protocol) + else: + protocol = socket.getprotobyname(protocol) + bitmap = bytearray() + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + if token.value.isdigit(): + serv = int(token.value) + else: + if protocol != _proto_udp and protocol != _proto_tcp: + raise NotImplementedError("protocol must be TCP or UDP") + if protocol == _proto_udp: + protocol_text = "udp" + else: + protocol_text = "tcp" + serv = socket.getservbyname(token.value, protocol_text) + i = serv // 8 + l = len(bitmap) + if l < i + 1: + for j in xrange(l, i + 1): + bitmap.append(0) + bitmap[i] = bitmap[i] | (0x80 >> (serv % 8)) + bitmap = dns.rdata._truncate_bitmap(bitmap) + return cls(rdclass, rdtype, address, protocol, bitmap) + + def to_wire(self, file, compress=None, origin=None): + file.write(dns.ipv4.inet_aton(self.address)) + protocol = struct.pack('!B', self.protocol) + file.write(protocol) + file.write(self.bitmap) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + address = dns.ipv4.inet_ntoa(wire[current: current + 4]) + protocol, = struct.unpack('!B', wire[current + 4: current + 5]) + current += 5 + rdlen -= 5 + bitmap = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, address, protocol, bitmap) diff --git a/Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py b/Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py new file mode 100644 index 000000000..24cf1ece4 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/IN/__init__.py @@ -0,0 +1,30 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Class IN rdata type classes.""" + +__all__ = [ + 'A', + 'AAAA', + 'APL', + 'DHCID', + 'KX', + 'NAPTR', + 'NSAP', + 'NSAP_PTR', + 'PX', + 'SRV', + 'WKS', +] diff --git a/Contents/Libraries/Shared/dns/rdtypes/__init__.py b/Contents/Libraries/Shared/dns/rdtypes/__init__.py new file mode 100644 index 000000000..826efbb6c --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/__init__.py @@ -0,0 +1,24 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS rdata type classes""" + +__all__ = [ + 'ANY', + 'IN', + 'euibase', + 'mxbase', + 'nsbase', +] diff --git a/Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py b/Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py new file mode 100644 index 000000000..85c4b23f0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/dnskeybase.py @@ -0,0 +1,136 @@ +# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import base64 +import struct + +import dns.exception +import dns.dnssec +import dns.rdata + +# wildcard import +__all__ = ["SEP", "REVOKE", "ZONE", + "flags_to_text_set", "flags_from_text_set"] + +# flag constants +SEP = 0x0001 +REVOKE = 0x0080 +ZONE = 0x0100 + +_flag_by_text = { + 'SEP': SEP, + 'REVOKE': REVOKE, + 'ZONE': ZONE +} + +# We construct the inverse mapping programmatically to ensure that we +# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that +# would cause the mapping not to be true inverse. +_flag_by_value = dict((y, x) for x, y in _flag_by_text.items()) + + +def flags_to_text_set(flags): + """Convert a DNSKEY flags value to set texts + @rtype: set([string])""" + + flags_set = set() + mask = 0x1 + while mask <= 0x8000: + if flags & mask: + text = _flag_by_value.get(mask) + if not text: + text = hex(mask) + flags_set.add(text) + mask <<= 1 + return flags_set + + +def flags_from_text_set(texts_set): + """Convert set of DNSKEY flag mnemonic texts to DNSKEY flag value + @rtype: int""" + + flags = 0 + for text in texts_set: + try: + flags += _flag_by_text[text] + except KeyError: + raise NotImplementedError( + "DNSKEY flag '%s' is not supported" % text) + return flags + + +class DNSKEYBase(dns.rdata.Rdata): + + """Base class for rdata that is like a DNSKEY record + + @ivar flags: the key flags + @type flags: int + @ivar protocol: the protocol for which this key may be used + @type protocol: int + @ivar algorithm: the algorithm used for the key + @type algorithm: int + @ivar key: the public key + @type key: string""" + + __slots__ = ['flags', 'protocol', 'algorithm', 'key'] + + def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key): + super(DNSKEYBase, self).__init__(rdclass, rdtype) + self.flags = flags + self.protocol = protocol + self.algorithm = algorithm + self.key = key + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm, + dns.rdata._base64ify(self.key)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + flags = tok.get_uint16() + protocol = tok.get_uint8() + algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + b64 = b''.join(chunks) + key = base64.b64decode(b64) + return cls(rdclass, rdtype, flags, protocol, algorithm, key) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!HBB", self.flags, self.protocol, self.algorithm) + file.write(header) + file.write(self.key) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + if rdlen < 4: + raise dns.exception.FormError + header = struct.unpack('!HBB', wire[current: current + 4]) + current += 4 + rdlen -= 4 + key = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], + key) + + def flags_to_text_set(self): + """Convert a DNSKEY flags value to set texts + @rtype: set([string])""" + return flags_to_text_set(self.flags) diff --git a/Contents/Libraries/Shared/dns/rdtypes/dsbase.py b/Contents/Libraries/Shared/dns/rdtypes/dsbase.py new file mode 100644 index 000000000..1ee28e4a3 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/dsbase.py @@ -0,0 +1,83 @@ +# Copyright (C) 2010, 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import struct +import binascii + +import dns.rdata +import dns.rdatatype + + +class DSBase(dns.rdata.Rdata): + + """Base class for rdata that is like a DS record + + @ivar key_tag: the key tag + @type key_tag: int + @ivar algorithm: the algorithm + @type algorithm: int + @ivar digest_type: the digest type + @type digest_type: int + @ivar digest: the digest + @type digest: int + @see: draft-ietf-dnsext-delegation-signer-14.txt""" + + __slots__ = ['key_tag', 'algorithm', 'digest_type', 'digest'] + + def __init__(self, rdclass, rdtype, key_tag, algorithm, digest_type, + digest): + super(DSBase, self).__init__(rdclass, rdtype) + self.key_tag = key_tag + self.algorithm = algorithm + self.digest_type = digest_type + self.digest = digest + + def to_text(self, origin=None, relativize=True, **kw): + return '%d %d %d %s' % (self.key_tag, self.algorithm, + self.digest_type, + dns.rdata._hexify(self.digest, + chunksize=128)) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + key_tag = tok.get_uint16() + algorithm = tok.get_uint8() + digest_type = tok.get_uint8() + chunks = [] + while 1: + t = tok.get().unescape() + if t.is_eol_or_eof(): + break + if not t.is_identifier(): + raise dns.exception.SyntaxError + chunks.append(t.value.encode()) + digest = b''.join(chunks) + digest = binascii.unhexlify(digest) + return cls(rdclass, rdtype, key_tag, algorithm, digest_type, + digest) + + def to_wire(self, file, compress=None, origin=None): + header = struct.pack("!HBB", self.key_tag, self.algorithm, + self.digest_type) + file.write(header) + file.write(self.digest) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + header = struct.unpack("!HBB", wire[current: current + 4]) + current += 4 + rdlen -= 4 + digest = wire[current: current + rdlen].unwrap() + return cls(rdclass, rdtype, header[0], header[1], header[2], digest) diff --git a/Contents/Libraries/Shared/dns/rdtypes/euibase.py b/Contents/Libraries/Shared/dns/rdtypes/euibase.py new file mode 100644 index 000000000..cc5fdaa63 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/euibase.py @@ -0,0 +1,71 @@ +# Copyright (C) 2015 Red Hat, Inc. +# Author: Petr Spacek +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import binascii + +import dns.rdata +from dns._compat import xrange + + +class EUIBase(dns.rdata.Rdata): + + """EUIxx record + + @ivar fingerprint: xx-bit Extended Unique Identifier (EUI-xx) + @type fingerprint: string + @see: rfc7043.txt""" + + __slots__ = ['eui'] + # define these in subclasses + # byte_len = 6 # 0123456789ab (in hex) + # text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab + + def __init__(self, rdclass, rdtype, eui): + super(EUIBase, self).__init__(rdclass, rdtype) + if len(eui) != self.byte_len: + raise dns.exception.FormError('EUI%s rdata has to have %s bytes' + % (self.byte_len * 8, self.byte_len)) + self.eui = eui + + def to_text(self, origin=None, relativize=True, **kw): + return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-') + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + text = tok.get_string() + tok.get_eol() + if len(text) != cls.text_len: + raise dns.exception.SyntaxError( + 'Input text must have %s characters' % cls.text_len) + expected_dash_idxs = xrange(2, cls.byte_len * 3 - 1, 3) + for i in expected_dash_idxs: + if text[i] != '-': + raise dns.exception.SyntaxError('Dash expected at position %s' + % i) + text = text.replace('-', '') + try: + data = binascii.unhexlify(text.encode()) + except (ValueError, TypeError) as ex: + raise dns.exception.SyntaxError('Hex decoding error: %s' % str(ex)) + return cls(rdclass, rdtype, data) + + def to_wire(self, file, compress=None, origin=None): + file.write(self.eui) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + eui = wire[current:current + rdlen].unwrap() + return cls(rdclass, rdtype, eui) diff --git a/Contents/Libraries/Shared/dns/rdtypes/mxbase.py b/Contents/Libraries/Shared/dns/rdtypes/mxbase.py new file mode 100644 index 000000000..5ac8cef9e --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/mxbase.py @@ -0,0 +1,101 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""MX-like base classes.""" + +from io import BytesIO +import struct + +import dns.exception +import dns.rdata +import dns.name + + +class MXBase(dns.rdata.Rdata): + + """Base class for rdata that is like an MX record. + + @ivar preference: the preference value + @type preference: int + @ivar exchange: the exchange name + @type exchange: dns.name.Name object""" + + __slots__ = ['preference', 'exchange'] + + def __init__(self, rdclass, rdtype, preference, exchange): + super(MXBase, self).__init__(rdclass, rdtype) + self.preference = preference + self.exchange = exchange + + def to_text(self, origin=None, relativize=True, **kw): + exchange = self.exchange.choose_relativity(origin, relativize) + return '%d %s' % (self.preference, exchange) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + preference = tok.get_uint16() + exchange = tok.get_name() + exchange = exchange.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, preference, exchange) + + def to_wire(self, file, compress=None, origin=None): + pref = struct.pack("!H", self.preference) + file.write(pref) + self.exchange.to_wire(file, compress, origin) + + def to_digestable(self, origin=None): + return struct.pack("!H", self.preference) + \ + self.exchange.to_digestable(origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (preference, ) = struct.unpack('!H', wire[current: current + 2]) + current += 2 + rdlen -= 2 + (exchange, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + exchange = exchange.relativize(origin) + return cls(rdclass, rdtype, preference, exchange) + + def choose_relativity(self, origin=None, relativize=True): + self.exchange = self.exchange.choose_relativity(origin, relativize) + + +class UncompressedMX(MXBase): + + """Base class for rdata that is like an MX record, but whose name + is not compressed when converted to DNS wire format, and whose + digestable form is not downcased.""" + + def to_wire(self, file, compress=None, origin=None): + super(UncompressedMX, self).to_wire(file, None, origin) + + def to_digestable(self, origin=None): + f = BytesIO() + self.to_wire(f, None, origin) + return f.getvalue() + + +class UncompressedDowncasingMX(MXBase): + + """Base class for rdata that is like an MX record, but whose name + is not compressed when convert to DNS wire format.""" + + def to_wire(self, file, compress=None, origin=None): + super(UncompressedDowncasingMX, self).to_wire(file, None, origin) diff --git a/Contents/Libraries/Shared/dns/rdtypes/nsbase.py b/Contents/Libraries/Shared/dns/rdtypes/nsbase.py new file mode 100644 index 000000000..79333a140 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/nsbase.py @@ -0,0 +1,81 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""NS-like base classes.""" + +from io import BytesIO + +import dns.exception +import dns.rdata +import dns.name + + +class NSBase(dns.rdata.Rdata): + + """Base class for rdata that is like an NS record. + + @ivar target: the target name of the rdata + @type target: dns.name.Name object""" + + __slots__ = ['target'] + + def __init__(self, rdclass, rdtype, target): + super(NSBase, self).__init__(rdclass, rdtype) + self.target = target + + def to_text(self, origin=None, relativize=True, **kw): + target = self.target.choose_relativity(origin, relativize) + return str(target) + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + target = tok.get_name() + target = target.choose_relativity(origin, relativize) + tok.get_eol() + return cls(rdclass, rdtype, target) + + def to_wire(self, file, compress=None, origin=None): + self.target.to_wire(file, compress, origin) + + def to_digestable(self, origin=None): + return self.target.to_digestable(origin) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + (target, cused) = dns.name.from_wire(wire[: current + rdlen], + current) + if cused != rdlen: + raise dns.exception.FormError + if origin is not None: + target = target.relativize(origin) + return cls(rdclass, rdtype, target) + + def choose_relativity(self, origin=None, relativize=True): + self.target = self.target.choose_relativity(origin, relativize) + + +class UncompressedNS(NSBase): + + """Base class for rdata that is like an NS record, but whose name + is not compressed when convert to DNS wire format, and whose + digestable form is not downcased.""" + + def to_wire(self, file, compress=None, origin=None): + super(UncompressedNS, self).to_wire(file, None, origin) + + def to_digestable(self, origin=None): + f = BytesIO() + self.to_wire(f, None, origin) + return f.getvalue() diff --git a/Contents/Libraries/Shared/dns/rdtypes/txtbase.py b/Contents/Libraries/Shared/dns/rdtypes/txtbase.py new file mode 100644 index 000000000..352b027bf --- /dev/null +++ b/Contents/Libraries/Shared/dns/rdtypes/txtbase.py @@ -0,0 +1,90 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""TXT-like base class.""" + +import struct + +import dns.exception +import dns.rdata +import dns.tokenizer +from dns._compat import binary_type + + +class TXTBase(dns.rdata.Rdata): + + """Base class for rdata that is like a TXT record + + @ivar strings: the text strings + @type strings: list of string + @see: RFC 1035""" + + __slots__ = ['strings'] + + def __init__(self, rdclass, rdtype, strings): + super(TXTBase, self).__init__(rdclass, rdtype) + if isinstance(strings, str): + strings = [strings] + self.strings = strings[:] + + def to_text(self, origin=None, relativize=True, **kw): + txt = '' + prefix = '' + for s in self.strings: + txt += '%s"%s"' % (prefix, dns.rdata._escapify(s)) + prefix = ' ' + return txt + + @classmethod + def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): + strings = [] + while 1: + token = tok.get().unescape() + if token.is_eol_or_eof(): + break + if not (token.is_quoted_string() or token.is_identifier()): + raise dns.exception.SyntaxError("expected a string") + if len(token.value) > 255: + raise dns.exception.SyntaxError("string too long") + value = token.value + if isinstance(value, binary_type): + strings.append(value) + else: + strings.append(value.encode()) + if len(strings) == 0: + raise dns.exception.UnexpectedEnd + return cls(rdclass, rdtype, strings) + + def to_wire(self, file, compress=None, origin=None): + for s in self.strings: + l = len(s) + assert l < 256 + file.write(struct.pack('!B', l)) + file.write(s) + + @classmethod + def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): + strings = [] + while rdlen > 0: + l = wire[current] + current += 1 + rdlen -= 1 + if l > rdlen: + raise dns.exception.FormError + s = wire[current: current + l].unwrap() + current += l + rdlen -= l + strings.append(s) + return cls(rdclass, rdtype, strings) diff --git a/Contents/Libraries/Shared/dns/renderer.py b/Contents/Libraries/Shared/dns/renderer.py new file mode 100644 index 000000000..670fb28fa --- /dev/null +++ b/Contents/Libraries/Shared/dns/renderer.py @@ -0,0 +1,329 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Help for building DNS wire format messages""" + +from io import BytesIO +import struct +import random +import time + +import dns.exception +import dns.tsig +from ._compat import long + + +QUESTION = 0 +ANSWER = 1 +AUTHORITY = 2 +ADDITIONAL = 3 + + +class Renderer(object): + + """Helper class for building DNS wire-format messages. + + Most applications can use the higher-level L{dns.message.Message} + class and its to_wire() method to generate wire-format messages. + This class is for those applications which need finer control + over the generation of messages. + + Typical use:: + + r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512) + r.add_question(qname, qtype, qclass) + r.add_rrset(dns.renderer.ANSWER, rrset_1) + r.add_rrset(dns.renderer.ANSWER, rrset_2) + r.add_rrset(dns.renderer.AUTHORITY, ns_rrset) + r.add_edns(0, 0, 4096) + r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1) + r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2) + r.write_header() + r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac) + wire = r.get_wire() + + @ivar output: where rendering is written + @type output: BytesIO object + @ivar id: the message id + @type id: int + @ivar flags: the message flags + @type flags: int + @ivar max_size: the maximum size of the message + @type max_size: int + @ivar origin: the origin to use when rendering relative names + @type origin: dns.name.Name object + @ivar compress: the compression table + @type compress: dict + @ivar section: the section currently being rendered + @type section: int (dns.renderer.QUESTION, dns.renderer.ANSWER, + dns.renderer.AUTHORITY, or dns.renderer.ADDITIONAL) + @ivar counts: list of the number of RRs in each section + @type counts: int list of length 4 + @ivar mac: the MAC of the rendered message (if TSIG was used) + @type mac: string + """ + + def __init__(self, id=None, flags=0, max_size=65535, origin=None): + """Initialize a new renderer. + + @param id: the message id + @type id: int + @param flags: the DNS message flags + @type flags: int + @param max_size: the maximum message size; the default is 65535. + If rendering results in a message greater than I{max_size}, + then L{dns.exception.TooBig} will be raised. + @type max_size: int + @param origin: the origin to use when rendering relative names + @type origin: dns.name.Name or None. + """ + + self.output = BytesIO() + if id is None: + self.id = random.randint(0, 65535) + else: + self.id = id + self.flags = flags + self.max_size = max_size + self.origin = origin + self.compress = {} + self.section = QUESTION + self.counts = [0, 0, 0, 0] + self.output.write(b'\x00' * 12) + self.mac = '' + + def _rollback(self, where): + """Truncate the output buffer at offset I{where}, and remove any + compression table entries that pointed beyond the truncation + point. + + @param where: the offset + @type where: int + """ + + self.output.seek(where) + self.output.truncate() + keys_to_delete = [] + for k, v in self.compress.items(): + if v >= where: + keys_to_delete.append(k) + for k in keys_to_delete: + del self.compress[k] + + def _set_section(self, section): + """Set the renderer's current section. + + Sections must be rendered order: QUESTION, ANSWER, AUTHORITY, + ADDITIONAL. Sections may be empty. + + @param section: the section + @type section: int + @raises dns.exception.FormError: an attempt was made to set + a section value less than the current section. + """ + + if self.section != section: + if self.section > section: + raise dns.exception.FormError + self.section = section + + def add_question(self, qname, rdtype, rdclass=dns.rdataclass.IN): + """Add a question to the message. + + @param qname: the question name + @type qname: dns.name.Name + @param rdtype: the question rdata type + @type rdtype: int + @param rdclass: the question rdata class + @type rdclass: int + """ + + self._set_section(QUESTION) + before = self.output.tell() + qname.to_wire(self.output, self.compress, self.origin) + self.output.write(struct.pack("!HH", rdtype, rdclass)) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[QUESTION] += 1 + + def add_rrset(self, section, rrset, **kw): + """Add the rrset to the specified section. + + Any keyword arguments are passed on to the rdataset's to_wire() + routine. + + @param section: the section + @type section: int + @param rrset: the rrset + @type rrset: dns.rrset.RRset object + """ + + self._set_section(section) + before = self.output.tell() + n = rrset.to_wire(self.output, self.compress, self.origin, **kw) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[section] += n + + def add_rdataset(self, section, name, rdataset, **kw): + """Add the rdataset to the specified section, using the specified + name as the owner name. + + Any keyword arguments are passed on to the rdataset's to_wire() + routine. + + @param section: the section + @type section: int + @param name: the owner name + @type name: dns.name.Name object + @param rdataset: the rdataset + @type rdataset: dns.rdataset.Rdataset object + """ + + self._set_section(section) + before = self.output.tell() + n = rdataset.to_wire(name, self.output, self.compress, self.origin, + **kw) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[section] += n + + def add_edns(self, edns, ednsflags, payload, options=None): + """Add an EDNS OPT record to the message. + + @param edns: The EDNS level to use. + @type edns: int + @param ednsflags: EDNS flag values. + @type ednsflags: int + @param payload: The EDNS sender's payload field, which is the maximum + size of UDP datagram the sender can handle. + @type payload: int + @param options: The EDNS options list + @type options: list of dns.edns.Option instances + @see: RFC 2671 + """ + + # make sure the EDNS version in ednsflags agrees with edns + ednsflags &= long(0xFF00FFFF) + ednsflags |= (edns << 16) + self._set_section(ADDITIONAL) + before = self.output.tell() + self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload, + ednsflags, 0)) + if options is not None: + lstart = self.output.tell() + for opt in options: + stuff = struct.pack("!HH", opt.otype, 0) + self.output.write(stuff) + start = self.output.tell() + opt.to_wire(self.output) + end = self.output.tell() + assert end - start < 65536 + self.output.seek(start - 2) + stuff = struct.pack("!H", end - start) + self.output.write(stuff) + self.output.seek(0, 2) + lend = self.output.tell() + assert lend - lstart < 65536 + self.output.seek(lstart - 2) + stuff = struct.pack("!H", lend - lstart) + self.output.write(stuff) + self.output.seek(0, 2) + after = self.output.tell() + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.counts[ADDITIONAL] += 1 + + def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data, + request_mac, algorithm=dns.tsig.default_algorithm): + """Add a TSIG signature to the message. + + @param keyname: the TSIG key name + @type keyname: dns.name.Name object + @param secret: the secret to use + @type secret: string + @param fudge: TSIG time fudge + @type fudge: int + @param id: the message id to encode in the tsig signature + @type id: int + @param tsig_error: TSIG error code; default is 0. + @type tsig_error: int + @param other_data: TSIG other data. + @type other_data: string + @param request_mac: This message is a response to the request which + had the specified MAC. + @type request_mac: string + @param algorithm: the TSIG algorithm to use + @type algorithm: dns.name.Name object + """ + + self._set_section(ADDITIONAL) + before = self.output.tell() + s = self.output.getvalue() + (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s, + keyname, + secret, + int(time.time()), + fudge, + id, + tsig_error, + other_data, + request_mac, + algorithm=algorithm) + keyname.to_wire(self.output, self.compress, self.origin) + self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG, + dns.rdataclass.ANY, 0, 0)) + rdata_start = self.output.tell() + self.output.write(tsig_rdata) + after = self.output.tell() + assert after - rdata_start < 65536 + if after >= self.max_size: + self._rollback(before) + raise dns.exception.TooBig + self.output.seek(rdata_start - 2) + self.output.write(struct.pack('!H', after - rdata_start)) + self.counts[ADDITIONAL] += 1 + self.output.seek(10) + self.output.write(struct.pack('!H', self.counts[ADDITIONAL])) + self.output.seek(0, 2) + + def write_header(self): + """Write the DNS message header. + + Writing the DNS message header is done after all sections + have been rendered, but before the optional TSIG signature + is added. + """ + + self.output.seek(0) + self.output.write(struct.pack('!HHHHHH', self.id, self.flags, + self.counts[0], self.counts[1], + self.counts[2], self.counts[3])) + self.output.seek(0, 2) + + def get_wire(self): + """Return the wire format message. + + @rtype: string + """ + + return self.output.getvalue() diff --git a/Contents/Libraries/Shared/dns/resolver.py b/Contents/Libraries/Shared/dns/resolver.py new file mode 100644 index 000000000..abc431d7f --- /dev/null +++ b/Contents/Libraries/Shared/dns/resolver.py @@ -0,0 +1,1407 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS stub resolver. + +@var default_resolver: The default resolver object +@type default_resolver: dns.resolver.Resolver object""" + +import socket +import sys +import time +import random + +try: + import threading as _threading +except ImportError: + import dummy_threading as _threading + +import dns.exception +import dns.flags +import dns.ipv4 +import dns.ipv6 +import dns.message +import dns.name +import dns.query +import dns.rcode +import dns.rdataclass +import dns.rdatatype +import dns.reversename +import dns.tsig +from ._compat import xrange, string_types + +if sys.platform == 'win32': + try: + import winreg as _winreg + except ImportError: + import _winreg # pylint: disable=import-error + +class NXDOMAIN(dns.exception.DNSException): + + """The DNS query name does not exist.""" + supp_kwargs = set(['qnames', 'responses']) + fmt = None # we have our own __str__ implementation + + def _check_kwargs(self, qnames, responses=None): + if not isinstance(qnames, (list, tuple, set)): + raise AttributeError("qnames must be a list, tuple or set") + if len(qnames) == 0: + raise AttributeError("qnames must contain at least one element") + if responses is None: + responses = {} + elif not isinstance(responses, dict): + raise AttributeError("responses must be a dict(qname=response)") + kwargs = dict(qnames=qnames, responses=responses) + return kwargs + + def __str__(self): + if 'qnames' not in self.kwargs: + return super(NXDOMAIN, self).__str__() + qnames = self.kwargs['qnames'] + if len(qnames) > 1: + msg = 'None of DNS query names exist' + else: + msg = self.__doc__[:-1] + qnames = ', '.join(map(str, qnames)) + return "%s: %s" % (msg, qnames) + + def canonical_name(self): + if not 'qnames' in self.kwargs: + raise TypeError("parametrized exception required") + IN = dns.rdataclass.IN + CNAME = dns.rdatatype.CNAME + cname = None + for qname in self.kwargs['qnames']: + response = self.kwargs['responses'][qname] + for answer in response.answer: + if answer.rdtype != CNAME or answer.rdclass != IN: + continue + cname = answer.items[0].target.to_text() + if cname is not None: + return dns.name.from_text(cname) + return self.kwargs['qnames'][0] + canonical_name = property(canonical_name, doc=( + "Return the unresolved canonical name.")) + + def __add__(self, e_nx): + """Augment by results from another NXDOMAIN exception.""" + qnames0 = list(self.kwargs.get('qnames', [])) + responses0 = dict(self.kwargs.get('responses', {})) + responses1 = e_nx.kwargs.get('responses', {}) + for qname1 in e_nx.kwargs.get('qnames', []): + if qname1 not in qnames0: + qnames0.append(qname1) + if qname1 in responses1: + responses0[qname1] = responses1[qname1] + return NXDOMAIN(qnames=qnames0, responses=responses0) + + +class YXDOMAIN(dns.exception.DNSException): + + """The DNS query name is too long after DNAME substitution.""" + +# The definition of the Timeout exception has moved from here to the +# dns.exception module. We keep dns.resolver.Timeout defined for +# backwards compatibility. + +Timeout = dns.exception.Timeout + + +class NoAnswer(dns.exception.DNSException): + + """The DNS response does not contain an answer to the question.""" + fmt = 'The DNS response does not contain an answer ' + \ + 'to the question: {query}' + supp_kwargs = set(['response']) + + def _fmt_kwargs(self, **kwargs): + return super(NoAnswer, self)._fmt_kwargs( + query=kwargs['response'].question) + + +class NoNameservers(dns.exception.DNSException): + + """All nameservers failed to answer the query. + + errors: list of servers and respective errors + The type of errors is + [(server ip address, any object convertible to string)]. + Non-empty errors list will add explanatory message () + """ + + msg = "All nameservers failed to answer the query." + fmt = "%s {query}: {errors}" % msg[:-1] + supp_kwargs = set(['request', 'errors']) + + def _fmt_kwargs(self, **kwargs): + srv_msgs = [] + for err in kwargs['errors']: + srv_msgs.append('Server %s %s port %s answered %s' % (err[0], + 'TCP' if err[1] else 'UDP', err[2], err[3])) + return super(NoNameservers, self)._fmt_kwargs( + query=kwargs['request'].question, errors='; '.join(srv_msgs)) + + +class NotAbsolute(dns.exception.DNSException): + + """An absolute domain name is required but a relative name was provided.""" + + +class NoRootSOA(dns.exception.DNSException): + + """There is no SOA RR at the DNS root name. This should never happen!""" + + +class NoMetaqueries(dns.exception.DNSException): + + """DNS metaqueries are not allowed.""" + + +class Answer(object): + + """DNS stub resolver answer + + Instances of this class bundle up the result of a successful DNS + resolution. + + For convenience, the answer object implements much of the sequence + protocol, forwarding to its rrset. E.g. "for a in answer" is + equivalent to "for a in answer.rrset", "answer[i]" is equivalent + to "answer.rrset[i]", and "answer[i:j]" is equivalent to + "answer.rrset[i:j]". + + Note that CNAMEs or DNAMEs in the response may mean that answer + node's name might not be the query name. + + @ivar qname: The query name + @type qname: dns.name.Name object + @ivar rdtype: The query type + @type rdtype: int + @ivar rdclass: The query class + @type rdclass: int + @ivar response: The response message + @type response: dns.message.Message object + @ivar rrset: The answer + @type rrset: dns.rrset.RRset object + @ivar expiration: The time when the answer expires + @type expiration: float (seconds since the epoch) + @ivar canonical_name: The canonical name of the query name + @type canonical_name: dns.name.Name object + """ + + def __init__(self, qname, rdtype, rdclass, response, + raise_on_no_answer=True): + self.qname = qname + self.rdtype = rdtype + self.rdclass = rdclass + self.response = response + min_ttl = -1 + rrset = None + for count in xrange(0, 15): + try: + rrset = response.find_rrset(response.answer, qname, + rdclass, rdtype) + if min_ttl == -1 or rrset.ttl < min_ttl: + min_ttl = rrset.ttl + break + except KeyError: + if rdtype != dns.rdatatype.CNAME: + try: + crrset = response.find_rrset(response.answer, + qname, + rdclass, + dns.rdatatype.CNAME) + if min_ttl == -1 or crrset.ttl < min_ttl: + min_ttl = crrset.ttl + for rd in crrset: + qname = rd.target + break + continue + except KeyError: + if raise_on_no_answer: + raise NoAnswer(response=response) + if raise_on_no_answer: + raise NoAnswer(response=response) + if rrset is None and raise_on_no_answer: + raise NoAnswer(response=response) + self.canonical_name = qname + self.rrset = rrset + if rrset is None: + while 1: + # Look for a SOA RR whose owner name is a superdomain + # of qname. + try: + srrset = response.find_rrset(response.authority, qname, + rdclass, dns.rdatatype.SOA) + if min_ttl == -1 or srrset.ttl < min_ttl: + min_ttl = srrset.ttl + if srrset[0].minimum < min_ttl: + min_ttl = srrset[0].minimum + break + except KeyError: + try: + qname = qname.parent() + except dns.name.NoParent: + break + self.expiration = time.time() + min_ttl + + def __getattr__(self, attr): + if attr == 'name': + return self.rrset.name + elif attr == 'ttl': + return self.rrset.ttl + elif attr == 'covers': + return self.rrset.covers + elif attr == 'rdclass': + return self.rrset.rdclass + elif attr == 'rdtype': + return self.rrset.rdtype + else: + raise AttributeError(attr) + + def __len__(self): + return self.rrset and len(self.rrset) or 0 + + def __iter__(self): + return self.rrset and iter(self.rrset) or iter(tuple()) + + def __getitem__(self, i): + return self.rrset[i] + + def __delitem__(self, i): + del self.rrset[i] + + +class Cache(object): + + """Simple DNS answer cache. + + @ivar data: A dictionary of cached data + @type data: dict + @ivar cleaning_interval: The number of seconds between cleanings. The + default is 300 (5 minutes). + @type cleaning_interval: float + @ivar next_cleaning: The time the cache should next be cleaned (in seconds + since the epoch.) + @type next_cleaning: float + """ + + def __init__(self, cleaning_interval=300.0): + """Initialize a DNS cache. + + @param cleaning_interval: the number of seconds between periodic + cleanings. The default is 300.0 + @type cleaning_interval: float. + """ + + self.data = {} + self.cleaning_interval = cleaning_interval + self.next_cleaning = time.time() + self.cleaning_interval + self.lock = _threading.Lock() + + def _maybe_clean(self): + """Clean the cache if it's time to do so.""" + + now = time.time() + if self.next_cleaning <= now: + keys_to_delete = [] + for (k, v) in self.data.items(): + if v.expiration <= now: + keys_to_delete.append(k) + for k in keys_to_delete: + del self.data[k] + now = time.time() + self.next_cleaning = now + self.cleaning_interval + + def get(self, key): + """Get the answer associated with I{key}. Returns None if + no answer is cached for the key. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @rtype: dns.resolver.Answer object or None + """ + + try: + self.lock.acquire() + self._maybe_clean() + v = self.data.get(key) + if v is None or v.expiration <= time.time(): + return None + return v + finally: + self.lock.release() + + def put(self, key, value): + """Associate key and value in the cache. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @param value: The answer being cached + @type value: dns.resolver.Answer object + """ + + try: + self.lock.acquire() + self._maybe_clean() + self.data[key] = value + finally: + self.lock.release() + + def flush(self, key=None): + """Flush the cache. + + If I{key} is specified, only that item is flushed. Otherwise + the entire cache is flushed. + + @param key: the key to flush + @type key: (dns.name.Name, int, int) tuple or None + """ + + try: + self.lock.acquire() + if key is not None: + if key in self.data: + del self.data[key] + else: + self.data = {} + self.next_cleaning = time.time() + self.cleaning_interval + finally: + self.lock.release() + + +class LRUCacheNode(object): + + """LRUCache node. + """ + + def __init__(self, key, value): + self.key = key + self.value = value + self.prev = self + self.next = self + + def link_before(self, node): + self.prev = node.prev + self.next = node + node.prev.next = self + node.prev = self + + def link_after(self, node): + self.prev = node + self.next = node.next + node.next.prev = self + node.next = self + + def unlink(self): + self.next.prev = self.prev + self.prev.next = self.next + + +class LRUCache(object): + + """Bounded least-recently-used DNS answer cache. + + This cache is better than the simple cache (above) if you're + running a web crawler or other process that does a lot of + resolutions. The LRUCache has a maximum number of nodes, and when + it is full, the least-recently used node is removed to make space + for a new one. + + @ivar data: A dictionary of cached data + @type data: dict + @ivar sentinel: sentinel node for circular doubly linked list of nodes + @type sentinel: LRUCacheNode object + @ivar max_size: The maximum number of nodes + @type max_size: int + """ + + def __init__(self, max_size=100000): + """Initialize a DNS cache. + + @param max_size: The maximum number of nodes to cache; the default is + 100,000. Must be greater than 1. + @type max_size: int + """ + self.data = {} + self.set_max_size(max_size) + self.sentinel = LRUCacheNode(None, None) + self.lock = _threading.Lock() + + def set_max_size(self, max_size): + if max_size < 1: + max_size = 1 + self.max_size = max_size + + def get(self, key): + """Get the answer associated with I{key}. Returns None if + no answer is cached for the key. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @rtype: dns.resolver.Answer object or None + """ + try: + self.lock.acquire() + node = self.data.get(key) + if node is None: + return None + # Unlink because we're either going to move the node to the front + # of the LRU list or we're going to free it. + node.unlink() + if node.value.expiration <= time.time(): + del self.data[node.key] + return None + node.link_after(self.sentinel) + return node.value + finally: + self.lock.release() + + def put(self, key, value): + """Associate key and value in the cache. + @param key: the key + @type key: (dns.name.Name, int, int) tuple whose values are the + query name, rdtype, and rdclass. + @param value: The answer being cached + @type value: dns.resolver.Answer object + """ + try: + self.lock.acquire() + node = self.data.get(key) + if node is not None: + node.unlink() + del self.data[node.key] + while len(self.data) >= self.max_size: + node = self.sentinel.prev + node.unlink() + del self.data[node.key] + node = LRUCacheNode(key, value) + node.link_after(self.sentinel) + self.data[key] = node + finally: + self.lock.release() + + def flush(self, key=None): + """Flush the cache. + + If I{key} is specified, only that item is flushed. Otherwise + the entire cache is flushed. + + @param key: the key to flush + @type key: (dns.name.Name, int, int) tuple or None + """ + try: + self.lock.acquire() + if key is not None: + node = self.data.get(key) + if node is not None: + node.unlink() + del self.data[node.key] + else: + node = self.sentinel.next + while node != self.sentinel: + next = node.next + node.prev = None + node.next = None + node = next + self.data = {} + finally: + self.lock.release() + + +class Resolver(object): + + """DNS stub resolver + + @ivar domain: The domain of this host + @type domain: dns.name.Name object + @ivar nameservers: A list of nameservers to query. Each nameserver is + a string which contains the IP address of a nameserver. + @type nameservers: list of strings + @ivar search: The search list. If the query name is a relative name, + the resolver will construct an absolute query name by appending the search + names one by one to the query name. + @type search: list of dns.name.Name objects + @ivar port: The port to which to send queries. The default is 53. + @type port: int + @ivar timeout: The number of seconds to wait for a response from a + server, before timing out. + @type timeout: float + @ivar lifetime: The total number of seconds to spend trying to get an + answer to the question. If the lifetime expires, a Timeout exception + will occur. + @type lifetime: float + @ivar keyring: The TSIG keyring to use. The default is None. + @type keyring: dict + @ivar keyname: The TSIG keyname to use. The default is None. + @type keyname: dns.name.Name object + @ivar keyalgorithm: The TSIG key algorithm to use. The default is + dns.tsig.default_algorithm. + @type keyalgorithm: string + @ivar edns: The EDNS level to use. The default is -1, no Edns. + @type edns: int + @ivar ednsflags: The EDNS flags + @type ednsflags: int + @ivar payload: The EDNS payload size. The default is 0. + @type payload: int + @ivar flags: The message flags to use. The default is None (i.e. not + overwritten) + @type flags: int + @ivar cache: The cache to use. The default is None. + @type cache: dns.resolver.Cache object + @ivar retry_servfail: should we retry a nameserver if it says SERVFAIL? + The default is 'false'. + @type retry_servfail: bool + """ + + def __init__(self, filename='/etc/resolv.conf', configure=True): + """Initialize a resolver instance. + + @param filename: The filename of a configuration file in + standard /etc/resolv.conf format. This parameter is meaningful + only when I{configure} is true and the platform is POSIX. + @type filename: string or file object + @param configure: If True (the default), the resolver instance + is configured in the normal fashion for the operating system + the resolver is running on. (I.e. a /etc/resolv.conf file on + POSIX systems and from the registry on Windows systems.) + @type configure: bool""" + + self.domain = None + self.nameservers = None + self.nameserver_ports = None + self.port = None + self.search = None + self.timeout = None + self.lifetime = None + self.keyring = None + self.keyname = None + self.keyalgorithm = None + self.edns = None + self.ednsflags = None + self.payload = None + self.cache = None + self.flags = None + self.retry_servfail = False + self.rotate = False + + self.reset() + if configure: + if sys.platform == 'win32': + self.read_registry() + elif filename: + self.read_resolv_conf(filename) + + def reset(self): + """Reset all resolver configuration to the defaults.""" + self.domain = \ + dns.name.Name(dns.name.from_text(socket.gethostname())[1:]) + if len(self.domain) == 0: + self.domain = dns.name.root + self.nameservers = [] + self.nameserver_ports = {} + self.port = 53 + self.search = [] + self.timeout = 2.0 + self.lifetime = 30.0 + self.keyring = None + self.keyname = None + self.keyalgorithm = dns.tsig.default_algorithm + self.edns = -1 + self.ednsflags = 0 + self.payload = 0 + self.cache = None + self.flags = None + self.retry_servfail = False + self.rotate = False + + def read_resolv_conf(self, f): + """Process f as a file in the /etc/resolv.conf format. If f is + a string, it is used as the name of the file to open; otherwise it + is treated as the file itself.""" + if isinstance(f, string_types): + try: + f = open(f, 'r') + except IOError: + # /etc/resolv.conf doesn't exist, can't be read, etc. + # We'll just use the default resolver configuration. + self.nameservers = ['127.0.0.1'] + return + want_close = True + else: + want_close = False + try: + for l in f: + if len(l) == 0 or l[0] == '#' or l[0] == ';': + continue + tokens = l.split() + + # Any line containing less than 2 tokens is malformed + if len(tokens) < 2: + continue + + if tokens[0] == 'nameserver': + self.nameservers.append(tokens[1]) + elif tokens[0] == 'domain': + self.domain = dns.name.from_text(tokens[1]) + elif tokens[0] == 'search': + for suffix in tokens[1:]: + self.search.append(dns.name.from_text(suffix)) + elif tokens[0] == 'options': + if 'rotate' in tokens[1:]: + self.rotate = True + finally: + if want_close: + f.close() + if len(self.nameservers) == 0: + self.nameservers.append('127.0.0.1') + + def _determine_split_char(self, entry): + # + # The windows registry irritatingly changes the list element + # delimiter in between ' ' and ',' (and vice-versa) in various + # versions of windows. + # + if entry.find(' ') >= 0: + split_char = ' ' + elif entry.find(',') >= 0: + split_char = ',' + else: + # probably a singleton; treat as a space-separated list. + split_char = ' ' + return split_char + + def _config_win32_nameservers(self, nameservers): + """Configure a NameServer registry entry.""" + # we call str() on nameservers to convert it from unicode to ascii + nameservers = str(nameservers) + split_char = self._determine_split_char(nameservers) + ns_list = nameservers.split(split_char) + for ns in ns_list: + if ns not in self.nameservers: + self.nameservers.append(ns) + + def _config_win32_domain(self, domain): + """Configure a Domain registry entry.""" + # we call str() on domain to convert it from unicode to ascii + self.domain = dns.name.from_text(str(domain)) + + def _config_win32_search(self, search): + """Configure a Search registry entry.""" + # we call str() on search to convert it from unicode to ascii + search = str(search) + split_char = self._determine_split_char(search) + search_list = search.split(split_char) + for s in search_list: + if s not in self.search: + self.search.append(dns.name.from_text(s)) + + def _config_win32_fromkey(self, key): + """Extract DNS info from a registry key.""" + try: + servers, rtype = _winreg.QueryValueEx(key, 'NameServer') + except WindowsError: # pylint: disable=undefined-variable + servers = None + if servers: + self._config_win32_nameservers(servers) + try: + dom, rtype = _winreg.QueryValueEx(key, 'Domain') + if dom: + self._config_win32_domain(dom) + except WindowsError: # pylint: disable=undefined-variable + pass + else: + try: + servers, rtype = _winreg.QueryValueEx(key, 'DhcpNameServer') + except WindowsError: # pylint: disable=undefined-variable + servers = None + if servers: + self._config_win32_nameservers(servers) + try: + dom, rtype = _winreg.QueryValueEx(key, 'DhcpDomain') + if dom: + self._config_win32_domain(dom) + except WindowsError: # pylint: disable=undefined-variable + pass + try: + search, rtype = _winreg.QueryValueEx(key, 'SearchList') + except WindowsError: # pylint: disable=undefined-variable + search = None + if search: + self._config_win32_search(search) + + def read_registry(self): + """Extract resolver configuration from the Windows registry.""" + lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + want_scan = False + try: + try: + # XP, 2000 + tcp_params = _winreg.OpenKey(lm, + r'SYSTEM\CurrentControlSet' + r'\Services\Tcpip\Parameters') + want_scan = True + except EnvironmentError: + # ME + tcp_params = _winreg.OpenKey(lm, + r'SYSTEM\CurrentControlSet' + r'\Services\VxD\MSTCP') + try: + self._config_win32_fromkey(tcp_params) + finally: + tcp_params.Close() + if want_scan: + interfaces = _winreg.OpenKey(lm, + r'SYSTEM\CurrentControlSet' + r'\Services\Tcpip\Parameters' + r'\Interfaces') + try: + i = 0 + while True: + try: + guid = _winreg.EnumKey(interfaces, i) + i += 1 + key = _winreg.OpenKey(interfaces, guid) + if not self._win32_is_nic_enabled(lm, guid, key): + continue + try: + self._config_win32_fromkey(key) + finally: + key.Close() + except EnvironmentError: + break + finally: + interfaces.Close() + finally: + lm.Close() + + def _win32_is_nic_enabled(self, lm, guid, interface_key): + # Look in the Windows Registry to determine whether the network + # interface corresponding to the given guid is enabled. + # + # (Code contributed by Paul Marks, thanks!) + # + try: + # This hard-coded location seems to be consistent, at least + # from Windows 2000 through Vista. + connection_key = _winreg.OpenKey( + lm, + r'SYSTEM\CurrentControlSet\Control\Network' + r'\{4D36E972-E325-11CE-BFC1-08002BE10318}' + r'\%s\Connection' % guid) + + try: + # The PnpInstanceID points to a key inside Enum + (pnp_id, ttype) = _winreg.QueryValueEx( + connection_key, 'PnpInstanceID') + + if ttype != _winreg.REG_SZ: + raise ValueError + + device_key = _winreg.OpenKey( + lm, r'SYSTEM\CurrentControlSet\Enum\%s' % pnp_id) + + try: + # Get ConfigFlags for this device + (flags, ttype) = _winreg.QueryValueEx( + device_key, 'ConfigFlags') + + if ttype != _winreg.REG_DWORD: + raise ValueError + + # Based on experimentation, bit 0x1 indicates that the + # device is disabled. + return not flags & 0x1 + + finally: + device_key.Close() + finally: + connection_key.Close() + except (EnvironmentError, ValueError): + # Pre-vista, enabled interfaces seem to have a non-empty + # NTEContextList; this was how dnspython detected enabled + # nics before the code above was contributed. We've retained + # the old method since we don't know if the code above works + # on Windows 95/98/ME. + try: + (nte, ttype) = _winreg.QueryValueEx(interface_key, + 'NTEContextList') + return nte is not None + except WindowsError: # pylint: disable=undefined-variable + return False + + def _compute_timeout(self, start): + now = time.time() + duration = now - start + if duration < 0: + if duration < -1: + # Time going backwards is bad. Just give up. + raise Timeout(timeout=duration) + else: + # Time went backwards, but only a little. This can + # happen, e.g. under vmware with older linux kernels. + # Pretend it didn't happen. + now = start + if duration >= self.lifetime: + raise Timeout(timeout=duration) + return min(self.lifetime - duration, self.timeout) + + def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, + tcp=False, source=None, raise_on_no_answer=True, source_port=0): + """Query nameservers to find the answer to the question. + + The I{qname}, I{rdtype}, and I{rdclass} parameters may be objects + of the appropriate type, or strings that can be converted into objects + of the appropriate type. E.g. For I{rdtype} the integer 2 and the + the string 'NS' both mean to query for records with DNS rdata type NS. + + @param qname: the query name + @type qname: dns.name.Name object or string + @param rdtype: the query type + @type rdtype: int or string + @param rdclass: the query class + @type rdclass: int or string + @param tcp: use TCP to make the query (default is False). + @type tcp: bool + @param source: bind to this IP address (defaults to machine default + IP). + @type source: IP address in dotted quad notation + @param raise_on_no_answer: raise NoAnswer if there's no answer + (defaults is True). + @type raise_on_no_answer: bool + @param source_port: The port from which to send the message. + The default is 0. + @type source_port: int + @rtype: dns.resolver.Answer instance + @raises Timeout: no answers could be found in the specified lifetime + @raises NXDOMAIN: the query name does not exist + @raises YXDOMAIN: the query name is too long after DNAME substitution + @raises NoAnswer: the response did not contain an answer and + raise_on_no_answer is True. + @raises NoNameservers: no non-broken nameservers are available to + answer the question.""" + + if isinstance(qname, string_types): + qname = dns.name.from_text(qname, None) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if dns.rdatatype.is_metatype(rdtype): + raise NoMetaqueries + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + if dns.rdataclass.is_metaclass(rdclass): + raise NoMetaqueries + qnames_to_try = [] + if qname.is_absolute(): + qnames_to_try.append(qname) + else: + if len(qname) > 1: + qnames_to_try.append(qname.concatenate(dns.name.root)) + if self.search: + for suffix in self.search: + qnames_to_try.append(qname.concatenate(suffix)) + else: + qnames_to_try.append(qname.concatenate(self.domain)) + all_nxdomain = True + nxdomain_responses = {} + start = time.time() + _qname = None # make pylint happy + for _qname in qnames_to_try: + if self.cache: + answer = self.cache.get((_qname, rdtype, rdclass)) + if answer is not None: + if answer.rrset is None and raise_on_no_answer: + raise NoAnswer(response=answer.response) + else: + return answer + request = dns.message.make_query(_qname, rdtype, rdclass) + if self.keyname is not None: + request.use_tsig(self.keyring, self.keyname, + algorithm=self.keyalgorithm) + request.use_edns(self.edns, self.ednsflags, self.payload) + if self.flags is not None: + request.flags = self.flags + response = None + # + # make a copy of the servers list so we can alter it later. + # + nameservers = self.nameservers[:] + errors = [] + if self.rotate: + random.shuffle(nameservers) + backoff = 0.10 + while response is None: + if len(nameservers) == 0: + raise NoNameservers(request=request, errors=errors) + for nameserver in nameservers[:]: + timeout = self._compute_timeout(start) + port = self.nameserver_ports.get(nameserver, self.port) + try: + tcp_attempt = tcp + if tcp: + response = dns.query.tcp(request, nameserver, + timeout, port, + source=source, + source_port=source_port) + else: + response = dns.query.udp(request, nameserver, + timeout, port, + source=source, + source_port=source_port) + if response.flags & dns.flags.TC: + # Response truncated; retry with TCP. + tcp_attempt = True + timeout = self._compute_timeout(start) + response = \ + dns.query.tcp(request, nameserver, + timeout, port, + source=source, + source_port=source_port) + except (socket.error, dns.exception.Timeout) as ex: + # + # Communication failure or timeout. Go to the + # next server + # + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + except dns.query.UnexpectedSource as ex: + # + # Who knows? Keep going. + # + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + except dns.exception.FormError as ex: + # + # We don't understand what this server is + # saying. Take it out of the mix and + # continue. + # + nameservers.remove(nameserver) + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + except EOFError as ex: + # + # We're using TCP and they hung up on us. + # Probably they don't support TCP (though + # they're supposed to!). Take it out of the + # mix and continue. + # + nameservers.remove(nameserver) + errors.append((nameserver, tcp_attempt, port, ex, + response)) + response = None + continue + rcode = response.rcode() + if rcode == dns.rcode.YXDOMAIN: + ex = YXDOMAIN() + errors.append((nameserver, tcp_attempt, port, ex, + response)) + raise ex + if rcode == dns.rcode.NOERROR or \ + rcode == dns.rcode.NXDOMAIN: + break + # + # We got a response, but we're not happy with the + # rcode in it. Remove the server from the mix if + # the rcode isn't SERVFAIL. + # + if rcode != dns.rcode.SERVFAIL or not self.retry_servfail: + nameservers.remove(nameserver) + errors.append((nameserver, tcp_attempt, port, + dns.rcode.to_text(rcode), response)) + response = None + if response is not None: + break + # + # All nameservers failed! + # + if len(nameservers) > 0: + # + # But we still have servers to try. Sleep a bit + # so we don't pound them! + # + timeout = self._compute_timeout(start) + sleep_time = min(timeout, backoff) + backoff *= 2 + time.sleep(sleep_time) + if response.rcode() == dns.rcode.NXDOMAIN: + nxdomain_responses[_qname] = response + continue + all_nxdomain = False + break + if all_nxdomain: + raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses) + answer = Answer(_qname, rdtype, rdclass, response, + raise_on_no_answer) + if self.cache: + self.cache.put((_qname, rdtype, rdclass), answer) + return answer + + def use_tsig(self, keyring, keyname=None, + algorithm=dns.tsig.default_algorithm): + """Add a TSIG signature to the query. + + @param keyring: The TSIG keyring to use; defaults to None. + @type keyring: dict + @param keyname: The name of the TSIG key to use; defaults to None. + The key must be defined in the keyring. If a keyring is specified + but a keyname is not, then the key used will be the first key in the + keyring. Note that the order of keys in a dictionary is not defined, + so applications should supply a keyname when a keyring is used, unless + they know the keyring contains only one key. + @param algorithm: The TSIG key algorithm to use. The default + is dns.tsig.default_algorithm. + @type algorithm: string""" + self.keyring = keyring + if keyname is None: + self.keyname = list(self.keyring.keys())[0] + else: + self.keyname = keyname + self.keyalgorithm = algorithm + + def use_edns(self, edns, ednsflags, payload): + """Configure Edns. + + @param edns: The EDNS level to use. The default is -1, no Edns. + @type edns: int + @param ednsflags: The EDNS flags + @type ednsflags: int + @param payload: The EDNS payload size. The default is 0. + @type payload: int""" + + if edns is None: + edns = -1 + self.edns = edns + self.ednsflags = ednsflags + self.payload = payload + + def set_flags(self, flags): + """Overrides the default flags with your own + + @param flags: The flags to overwrite the default with + @type flags: int""" + self.flags = flags + +default_resolver = None + + +def get_default_resolver(): + """Get the default resolver, initializing it if necessary.""" + if default_resolver is None: + reset_default_resolver() + return default_resolver + + +def reset_default_resolver(): + """Re-initialize default resolver. + + resolv.conf will be re-read immediatelly. + """ + global default_resolver + default_resolver = Resolver() + + +def query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, + tcp=False, source=None, raise_on_no_answer=True, + source_port=0): + """Query nameservers to find the answer to the question. + + This is a convenience function that uses the default resolver + object to make the query. + @see: L{dns.resolver.Resolver.query} for more information on the + parameters.""" + return get_default_resolver().query(qname, rdtype, rdclass, tcp, source, + raise_on_no_answer, source_port) + + +def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): + """Find the name of the zone which contains the specified name. + + @param name: the query name + @type name: absolute dns.name.Name object or string + @param rdclass: The query class + @type rdclass: int + @param tcp: use TCP to make the query (default is False). + @type tcp: bool + @param resolver: the resolver to use + @type resolver: dns.resolver.Resolver object or None + @rtype: dns.name.Name""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, dns.name.root) + if resolver is None: + resolver = get_default_resolver() + if not name.is_absolute(): + raise NotAbsolute(name) + while 1: + try: + answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) + if answer.rrset.name == name: + return name + # otherwise we were CNAMEd or DNAMEd and need to look higher + except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): + pass + try: + name = name.parent() + except dns.name.NoParent: + raise NoRootSOA + +# +# Support for overriding the system resolver for all python code in the +# running process. +# + +_protocols_for_socktype = { + socket.SOCK_DGRAM: [socket.SOL_UDP], + socket.SOCK_STREAM: [socket.SOL_TCP], +} + +_resolver = None +_original_getaddrinfo = socket.getaddrinfo +_original_getnameinfo = socket.getnameinfo +_original_getfqdn = socket.getfqdn +_original_gethostbyname = socket.gethostbyname +_original_gethostbyname_ex = socket.gethostbyname_ex +_original_gethostbyaddr = socket.gethostbyaddr + + +def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0, + proto=0, flags=0): + if flags & (socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) != 0: + raise NotImplementedError + if host is None and service is None: + raise socket.gaierror(socket.EAI_NONAME) + v6addrs = [] + v4addrs = [] + canonical_name = None + try: + # Is host None or a V6 address literal? + if host is None: + canonical_name = 'localhost' + if flags & socket.AI_PASSIVE != 0: + v6addrs.append('::') + v4addrs.append('0.0.0.0') + else: + v6addrs.append('::1') + v4addrs.append('127.0.0.1') + else: + parts = host.split('%') + if len(parts) == 2: + ahost = parts[0] + else: + ahost = host + addr = dns.ipv6.inet_aton(ahost) + v6addrs.append(host) + canonical_name = host + except Exception: + try: + # Is it a V4 address literal? + addr = dns.ipv4.inet_aton(host) + v4addrs.append(host) + canonical_name = host + except Exception: + if flags & socket.AI_NUMERICHOST == 0: + try: + if family == socket.AF_INET6 or family == socket.AF_UNSPEC: + v6 = _resolver.query(host, dns.rdatatype.AAAA, + raise_on_no_answer=False) + # Note that setting host ensures we query the same name + # for A as we did for AAAA. + host = v6.qname + canonical_name = v6.canonical_name.to_text(True) + if v6.rrset is not None: + for rdata in v6.rrset: + v6addrs.append(rdata.address) + if family == socket.AF_INET or family == socket.AF_UNSPEC: + v4 = _resolver.query(host, dns.rdatatype.A, + raise_on_no_answer=False) + host = v4.qname + canonical_name = v4.canonical_name.to_text(True) + if v4.rrset is not None: + for rdata in v4.rrset: + v4addrs.append(rdata.address) + except dns.resolver.NXDOMAIN: + raise socket.gaierror(socket.EAI_NONAME) + except: + raise socket.gaierror(socket.EAI_SYSTEM) + port = None + try: + # Is it a port literal? + if service is None: + port = 0 + else: + port = int(service) + except Exception: + if flags & socket.AI_NUMERICSERV == 0: + try: + port = socket.getservbyname(service) + except Exception: + pass + if port is None: + raise socket.gaierror(socket.EAI_NONAME) + tuples = [] + if socktype == 0: + socktypes = [socket.SOCK_DGRAM, socket.SOCK_STREAM] + else: + socktypes = [socktype] + if flags & socket.AI_CANONNAME != 0: + cname = canonical_name + else: + cname = '' + if family == socket.AF_INET6 or family == socket.AF_UNSPEC: + for addr in v6addrs: + for socktype in socktypes: + for proto in _protocols_for_socktype[socktype]: + tuples.append((socket.AF_INET6, socktype, proto, + cname, (addr, port, 0, 0))) + if family == socket.AF_INET or family == socket.AF_UNSPEC: + for addr in v4addrs: + for socktype in socktypes: + for proto in _protocols_for_socktype[socktype]: + tuples.append((socket.AF_INET, socktype, proto, + cname, (addr, port))) + if len(tuples) == 0: + raise socket.gaierror(socket.EAI_NONAME) + return tuples + + +def _getnameinfo(sockaddr, flags=0): + host = sockaddr[0] + port = sockaddr[1] + if len(sockaddr) == 4: + scope = sockaddr[3] + family = socket.AF_INET6 + else: + scope = None + family = socket.AF_INET + tuples = _getaddrinfo(host, port, family, socket.SOCK_STREAM, + socket.SOL_TCP, 0) + if len(tuples) > 1: + raise socket.error('sockaddr resolved to multiple addresses') + addr = tuples[0][4][0] + if flags & socket.NI_DGRAM: + pname = 'udp' + else: + pname = 'tcp' + qname = dns.reversename.from_address(addr) + if flags & socket.NI_NUMERICHOST == 0: + try: + answer = _resolver.query(qname, 'PTR') + hostname = answer.rrset[0].target.to_text(True) + except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): + if flags & socket.NI_NAMEREQD: + raise socket.gaierror(socket.EAI_NONAME) + hostname = addr + if scope is not None: + hostname += '%' + str(scope) + else: + hostname = addr + if scope is not None: + hostname += '%' + str(scope) + if flags & socket.NI_NUMERICSERV: + service = str(port) + else: + service = socket.getservbyport(port, pname) + return (hostname, service) + + +def _getfqdn(name=None): + if name is None: + name = socket.gethostname() + try: + return _getnameinfo(_getaddrinfo(name, 80)[0][4])[0] + except Exception: + return name + + +def _gethostbyname(name): + return _gethostbyname_ex(name)[2][0] + + +def _gethostbyname_ex(name): + aliases = [] + addresses = [] + tuples = _getaddrinfo(name, 0, socket.AF_INET, socket.SOCK_STREAM, + socket.SOL_TCP, socket.AI_CANONNAME) + canonical = tuples[0][3] + for item in tuples: + addresses.append(item[4][0]) + # XXX we just ignore aliases + return (canonical, aliases, addresses) + + +def _gethostbyaddr(ip): + try: + dns.ipv6.inet_aton(ip) + sockaddr = (ip, 80, 0, 0) + family = socket.AF_INET6 + except Exception: + sockaddr = (ip, 80) + family = socket.AF_INET + (name, port) = _getnameinfo(sockaddr, socket.NI_NAMEREQD) + aliases = [] + addresses = [] + tuples = _getaddrinfo(name, 0, family, socket.SOCK_STREAM, socket.SOL_TCP, + socket.AI_CANONNAME) + canonical = tuples[0][3] + for item in tuples: + addresses.append(item[4][0]) + # XXX we just ignore aliases + return (canonical, aliases, addresses) + + +def override_system_resolver(resolver=None): + """Override the system resolver routines in the socket module with + versions which use dnspython's resolver. + + This can be useful in testing situations where you want to control + the resolution behavior of python code without having to change + the system's resolver settings (e.g. /etc/resolv.conf). + + The resolver to use may be specified; if it's not, the default + resolver will be used. + + @param resolver: the resolver to use + @type resolver: dns.resolver.Resolver object or None + """ + if resolver is None: + resolver = get_default_resolver() + global _resolver + _resolver = resolver + socket.getaddrinfo = _getaddrinfo + socket.getnameinfo = _getnameinfo + socket.getfqdn = _getfqdn + socket.gethostbyname = _gethostbyname + socket.gethostbyname_ex = _gethostbyname_ex + socket.gethostbyaddr = _gethostbyaddr + + +def restore_system_resolver(): + """Undo the effects of override_system_resolver(). + """ + global _resolver + _resolver = None + socket.getaddrinfo = _original_getaddrinfo + socket.getnameinfo = _original_getnameinfo + socket.getfqdn = _original_getfqdn + socket.gethostbyname = _original_gethostbyname + socket.gethostbyname_ex = _original_gethostbyname_ex + socket.gethostbyaddr = _original_gethostbyaddr diff --git a/Contents/Libraries/Shared/dns/reversename.py b/Contents/Libraries/Shared/dns/reversename.py new file mode 100644 index 000000000..9ea9395a8 --- /dev/null +++ b/Contents/Libraries/Shared/dns/reversename.py @@ -0,0 +1,89 @@ +# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Reverse Map Names. + +@var ipv4_reverse_domain: The DNS IPv4 reverse-map domain, in-addr.arpa. +@type ipv4_reverse_domain: dns.name.Name object +@var ipv6_reverse_domain: The DNS IPv6 reverse-map domain, ip6.arpa. +@type ipv6_reverse_domain: dns.name.Name object +""" + +import binascii +import sys + +import dns.name +import dns.ipv6 +import dns.ipv4 + +ipv4_reverse_domain = dns.name.from_text('in-addr.arpa.') +ipv6_reverse_domain = dns.name.from_text('ip6.arpa.') + + +def from_address(text): + """Convert an IPv4 or IPv6 address in textual form into a Name object whose + value is the reverse-map domain name of the address. + @param text: an IPv4 or IPv6 address in textual form (e.g. '127.0.0.1', + '::1') + @type text: str + @rtype: dns.name.Name object + """ + try: + v6 = dns.ipv6.inet_aton(text) + if dns.ipv6.is_mapped(v6): + if sys.version_info >= (3,): + parts = ['%d' % byte for byte in v6[12:]] + else: + parts = ['%d' % ord(byte) for byte in v6[12:]] + origin = ipv4_reverse_domain + else: + parts = [x for x in str(binascii.hexlify(v6).decode())] + origin = ipv6_reverse_domain + except Exception: + parts = ['%d' % + byte for byte in bytearray(dns.ipv4.inet_aton(text))] + origin = ipv4_reverse_domain + parts.reverse() + return dns.name.from_text('.'.join(parts), origin=origin) + + +def to_address(name): + """Convert a reverse map domain name into textual address form. + @param name: an IPv4 or IPv6 address in reverse-map form. + @type name: dns.name.Name object + @rtype: str + """ + if name.is_subdomain(ipv4_reverse_domain): + name = name.relativize(ipv4_reverse_domain) + labels = list(name.labels) + labels.reverse() + text = b'.'.join(labels) + # run through inet_aton() to check syntax and make pretty. + return dns.ipv4.inet_ntoa(dns.ipv4.inet_aton(text)) + elif name.is_subdomain(ipv6_reverse_domain): + name = name.relativize(ipv6_reverse_domain) + labels = list(name.labels) + labels.reverse() + parts = [] + i = 0 + l = len(labels) + while i < l: + parts.append(b''.join(labels[i:i + 4])) + i += 4 + text = b':'.join(parts) + # run through inet_aton() to check syntax and make pretty. + return dns.ipv6.inet_ntoa(dns.ipv6.inet_aton(text)) + else: + raise dns.exception.SyntaxError('unknown reverse-map address family') diff --git a/Contents/Libraries/Shared/dns/rrset.py b/Contents/Libraries/Shared/dns/rrset.py new file mode 100644 index 000000000..d0f8f9377 --- /dev/null +++ b/Contents/Libraries/Shared/dns/rrset.py @@ -0,0 +1,182 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS RRsets (an RRset is a named rdataset)""" + + +import dns.name +import dns.rdataset +import dns.rdataclass +import dns.renderer +from ._compat import string_types + + +class RRset(dns.rdataset.Rdataset): + + """A DNS RRset (named rdataset). + + RRset inherits from Rdataset, and RRsets can be treated as + Rdatasets in most cases. There are, however, a few notable + exceptions. RRsets have different to_wire() and to_text() method + arguments, reflecting the fact that RRsets always have an owner + name. + """ + + __slots__ = ['name', 'deleting'] + + def __init__(self, name, rdclass, rdtype, covers=dns.rdatatype.NONE, + deleting=None): + """Create a new RRset.""" + + super(RRset, self).__init__(rdclass, rdtype, covers) + self.name = name + self.deleting = deleting + + def _clone(self): + obj = super(RRset, self)._clone() + obj.name = self.name + obj.deleting = self.deleting + return obj + + def __repr__(self): + if self.covers == 0: + ctext = '' + else: + ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' + if self.deleting is not None: + dtext = ' delete=' + dns.rdataclass.to_text(self.deleting) + else: + dtext = '' + return '' + + def __str__(self): + return self.to_text() + + def __eq__(self, other): + """Two RRsets are equal if they have the same name and the same + rdataset + + @rtype: bool""" + if not isinstance(other, RRset): + return False + if self.name != other.name: + return False + return super(RRset, self).__eq__(other) + + def match(self, name, rdclass, rdtype, covers, deleting=None): + """Returns True if this rrset matches the specified class, type, + covers, and deletion state.""" + + if not super(RRset, self).match(rdclass, rdtype, covers): + return False + if self.name != name or self.deleting != deleting: + return False + return True + + def to_text(self, origin=None, relativize=True, **kw): + """Convert the RRset into DNS master file format. + + @see: L{dns.name.Name.choose_relativity} for more information + on how I{origin} and I{relativize} determine the way names + are emitted. + + Any additional keyword arguments are passed on to the rdata + to_text() method. + + @param origin: The origin for relative names, or None. + @type origin: dns.name.Name object + @param relativize: True if names should names be relativized + @type relativize: bool""" + + return super(RRset, self).to_text(self.name, origin, relativize, + self.deleting, **kw) + + def to_wire(self, file, compress=None, origin=None, **kw): + """Convert the RRset to wire format.""" + + return super(RRset, self).to_wire(self.name, file, compress, origin, + self.deleting, **kw) + + def to_rdataset(self): + """Convert an RRset into an Rdataset. + + @rtype: dns.rdataset.Rdataset object + """ + return dns.rdataset.from_rdata_list(self.ttl, list(self)) + + +def from_text_list(name, ttl, rdclass, rdtype, text_rdatas, + idna_codec=None): + """Create an RRset with the specified name, TTL, class, and type, and with + the specified list of rdatas in text format. + + @rtype: dns.rrset.RRset object + """ + + if isinstance(name, string_types): + name = dns.name.from_text(name, None, idna_codec=idna_codec) + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + r = RRset(name, rdclass, rdtype) + r.update_ttl(ttl) + for t in text_rdatas: + rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) + r.add(rd) + return r + + +def from_text(name, ttl, rdclass, rdtype, *text_rdatas): + """Create an RRset with the specified name, TTL, class, and type and with + the specified rdatas in text format. + + @rtype: dns.rrset.RRset object + """ + + return from_text_list(name, ttl, rdclass, rdtype, text_rdatas) + + +def from_rdata_list(name, ttl, rdatas, idna_codec=None): + """Create an RRset with the specified name and TTL, and with + the specified list of rdata objects. + + @rtype: dns.rrset.RRset object + """ + + if isinstance(name, string_types): + name = dns.name.from_text(name, None, idna_codec=idna_codec) + + if len(rdatas) == 0: + raise ValueError("rdata list must not be empty") + r = None + for rd in rdatas: + if r is None: + r = RRset(name, rd.rdclass, rd.rdtype) + r.update_ttl(ttl) + r.add(rd) + return r + + +def from_rdata(name, ttl, *rdatas): + """Create an RRset with the specified name and TTL, and with + the specified rdata objects. + + @rtype: dns.rrset.RRset object + """ + + return from_rdata_list(name, ttl, rdatas) diff --git a/Contents/Libraries/Shared/dns/set.py b/Contents/Libraries/Shared/dns/set.py new file mode 100644 index 000000000..ef7fd2955 --- /dev/null +++ b/Contents/Libraries/Shared/dns/set.py @@ -0,0 +1,259 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""A simple Set class.""" + + +class Set(object): + + """A simple set class. + + Sets are not in Python until 2.3, and rdata are not immutable so + we cannot use sets.Set anyway. This class implements subset of + the 2.3 Set interface using a list as the container. + + @ivar items: A list of the items which are in the set + @type items: list""" + + __slots__ = ['items'] + + def __init__(self, items=None): + """Initialize the set. + + @param items: the initial set of items + @type items: any iterable or None + """ + + self.items = [] + if items is not None: + for item in items: + self.add(item) + + def __repr__(self): + return "dns.simpleset.Set(%s)" % repr(self.items) + + def add(self, item): + """Add an item to the set.""" + if item not in self.items: + self.items.append(item) + + def remove(self, item): + """Remove an item from the set.""" + self.items.remove(item) + + def discard(self, item): + """Remove an item from the set if present.""" + try: + self.items.remove(item) + except ValueError: + pass + + def _clone(self): + """Make a (shallow) copy of the set. + + There is a 'clone protocol' that subclasses of this class + should use. To make a copy, first call your super's _clone() + method, and use the object returned as the new instance. Then + make shallow copies of the attributes defined in the subclass. + + This protocol allows us to write the set algorithms that + return new instances (e.g. union) once, and keep using them in + subclasses. + """ + + cls = self.__class__ + obj = cls.__new__(cls) + obj.items = list(self.items) + return obj + + def __copy__(self): + """Make a (shallow) copy of the set.""" + return self._clone() + + def copy(self): + """Make a (shallow) copy of the set.""" + return self._clone() + + def union_update(self, other): + """Update the set, adding any elements from other which are not + already in the set. + @param other: the collection of items with which to update the set + @type other: Set object + """ + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + if self is other: + return + for item in other.items: + self.add(item) + + def intersection_update(self, other): + """Update the set, removing any elements from other which are not + in both sets. + @param other: the collection of items with which to update the set + @type other: Set object + """ + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + if self is other: + return + # we make a copy of the list so that we can remove items from + # the list without breaking the iterator. + for item in list(self.items): + if item not in other.items: + self.items.remove(item) + + def difference_update(self, other): + """Update the set, removing any elements from other which are in + the set. + @param other: the collection of items with which to update the set + @type other: Set object + """ + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + if self is other: + self.items = [] + else: + for item in other.items: + self.discard(item) + + def union(self, other): + """Return a new set which is the union of I{self} and I{other}. + + @param other: the other set + @type other: Set object + @rtype: the same type as I{self} + """ + + obj = self._clone() + obj.union_update(other) + return obj + + def intersection(self, other): + """Return a new set which is the intersection of I{self} and I{other}. + + @param other: the other set + @type other: Set object + @rtype: the same type as I{self} + """ + + obj = self._clone() + obj.intersection_update(other) + return obj + + def difference(self, other): + """Return a new set which I{self} - I{other}, i.e. the items + in I{self} which are not also in I{other}. + + @param other: the other set + @type other: Set object + @rtype: the same type as I{self} + """ + + obj = self._clone() + obj.difference_update(other) + return obj + + def __or__(self, other): + return self.union(other) + + def __and__(self, other): + return self.intersection(other) + + def __add__(self, other): + return self.union(other) + + def __sub__(self, other): + return self.difference(other) + + def __ior__(self, other): + self.union_update(other) + return self + + def __iand__(self, other): + self.intersection_update(other) + return self + + def __iadd__(self, other): + self.union_update(other) + return self + + def __isub__(self, other): + self.difference_update(other) + return self + + def update(self, other): + """Update the set, adding any elements from other which are not + already in the set. + @param other: the collection of items with which to update the set + @type other: any iterable type""" + for item in other: + self.add(item) + + def clear(self): + """Make the set empty.""" + self.items = [] + + def __eq__(self, other): + # Yes, this is inefficient but the sets we're dealing with are + # usually quite small, so it shouldn't hurt too much. + for item in self.items: + if item not in other.items: + return False + for item in other.items: + if item not in self.items: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __len__(self): + return len(self.items) + + def __iter__(self): + return iter(self.items) + + def __getitem__(self, i): + return self.items[i] + + def __delitem__(self, i): + del self.items[i] + + def issubset(self, other): + """Is I{self} a subset of I{other}? + + @rtype: bool + """ + + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + for item in self.items: + if item not in other.items: + return False + return True + + def issuperset(self, other): + """Is I{self} a superset of I{other}? + + @rtype: bool + """ + + if not isinstance(other, Set): + raise ValueError('other must be a Set instance') + for item in other.items: + if item not in self.items: + return False + return True diff --git a/Contents/Libraries/Shared/dns/tokenizer.py b/Contents/Libraries/Shared/dns/tokenizer.py new file mode 100644 index 000000000..04b982549 --- /dev/null +++ b/Contents/Libraries/Shared/dns/tokenizer.py @@ -0,0 +1,564 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""Tokenize DNS master file format""" + +from io import StringIO +import sys + +import dns.exception +import dns.name +import dns.ttl +from ._compat import long, text_type, binary_type + +_DELIMITERS = { + ' ': True, + '\t': True, + '\n': True, + ';': True, + '(': True, + ')': True, + '"': True} + +_QUOTING_DELIMITERS = {'"': True} + +EOF = 0 +EOL = 1 +WHITESPACE = 2 +IDENTIFIER = 3 +QUOTED_STRING = 4 +COMMENT = 5 +DELIMITER = 6 + + +class UngetBufferFull(dns.exception.DNSException): + + """An attempt was made to unget a token when the unget buffer was full.""" + + +class Token(object): + + """A DNS master file format token. + + @ivar ttype: The token type + @type ttype: int + @ivar value: The token value + @type value: string + @ivar has_escape: Does the token value contain escapes? + @type has_escape: bool + """ + + def __init__(self, ttype, value='', has_escape=False): + """Initialize a token instance. + + @param ttype: The token type + @type ttype: int + @param value: The token value + @type value: string + @param has_escape: Does the token value contain escapes? + @type has_escape: bool + """ + self.ttype = ttype + self.value = value + self.has_escape = has_escape + + def is_eof(self): + return self.ttype == EOF + + def is_eol(self): + return self.ttype == EOL + + def is_whitespace(self): + return self.ttype == WHITESPACE + + def is_identifier(self): + return self.ttype == IDENTIFIER + + def is_quoted_string(self): + return self.ttype == QUOTED_STRING + + def is_comment(self): + return self.ttype == COMMENT + + def is_delimiter(self): + return self.ttype == DELIMITER + + def is_eol_or_eof(self): + return self.ttype == EOL or self.ttype == EOF + + def __eq__(self, other): + if not isinstance(other, Token): + return False + return (self.ttype == other.ttype and + self.value == other.value) + + def __ne__(self, other): + if not isinstance(other, Token): + return True + return (self.ttype != other.ttype or + self.value != other.value) + + def __str__(self): + return '%d "%s"' % (self.ttype, self.value) + + def unescape(self): + if not self.has_escape: + return self + unescaped = '' + l = len(self.value) + i = 0 + while i < l: + c = self.value[i] + i += 1 + if c == '\\': + if i >= l: + raise dns.exception.UnexpectedEnd + c = self.value[i] + i += 1 + if c.isdigit(): + if i >= l: + raise dns.exception.UnexpectedEnd + c2 = self.value[i] + i += 1 + if i >= l: + raise dns.exception.UnexpectedEnd + c3 = self.value[i] + i += 1 + if not (c2.isdigit() and c3.isdigit()): + raise dns.exception.SyntaxError + c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) + unescaped += c + return Token(self.ttype, unescaped) + + # compatibility for old-style tuple tokens + + def __len__(self): + return 2 + + def __iter__(self): + return iter((self.ttype, self.value)) + + def __getitem__(self, i): + if i == 0: + return self.ttype + elif i == 1: + return self.value + else: + raise IndexError + + +class Tokenizer(object): + + """A DNS master file format tokenizer. + + A token is a (type, value) tuple, where I{type} is an int, and + I{value} is a string. The valid types are EOF, EOL, WHITESPACE, + IDENTIFIER, QUOTED_STRING, COMMENT, and DELIMITER. + + @ivar file: The file to tokenize + @type file: file + @ivar ungotten_char: The most recently ungotten character, or None. + @type ungotten_char: string + @ivar ungotten_token: The most recently ungotten token, or None. + @type ungotten_token: (int, string) token tuple + @ivar multiline: The current multiline level. This value is increased + by one every time a '(' delimiter is read, and decreased by one every time + a ')' delimiter is read. + @type multiline: int + @ivar quoting: This variable is true if the tokenizer is currently + reading a quoted string. + @type quoting: bool + @ivar eof: This variable is true if the tokenizer has encountered EOF. + @type eof: bool + @ivar delimiters: The current delimiter dictionary. + @type delimiters: dict + @ivar line_number: The current line number + @type line_number: int + @ivar filename: A filename that will be returned by the L{where} method. + @type filename: string + """ + + def __init__(self, f=sys.stdin, filename=None): + """Initialize a tokenizer instance. + + @param f: The file to tokenize. The default is sys.stdin. + This parameter may also be a string, in which case the tokenizer + will take its input from the contents of the string. + @type f: file or string + @param filename: the name of the filename that the L{where} method + will return. + @type filename: string + """ + + if isinstance(f, text_type): + f = StringIO(f) + if filename is None: + filename = '' + elif isinstance(f, binary_type): + f = StringIO(f.decode()) + if filename is None: + filename = '' + else: + if filename is None: + if f is sys.stdin: + filename = '' + else: + filename = '' + self.file = f + self.ungotten_char = None + self.ungotten_token = None + self.multiline = 0 + self.quoting = False + self.eof = False + self.delimiters = _DELIMITERS + self.line_number = 1 + self.filename = filename + + def _get_char(self): + """Read a character from input. + @rtype: string + """ + + if self.ungotten_char is None: + if self.eof: + c = '' + else: + c = self.file.read(1) + if c == '': + self.eof = True + elif c == '\n': + self.line_number += 1 + else: + c = self.ungotten_char + self.ungotten_char = None + return c + + def where(self): + """Return the current location in the input. + + @rtype: (string, int) tuple. The first item is the filename of + the input, the second is the current line number. + """ + + return (self.filename, self.line_number) + + def _unget_char(self, c): + """Unget a character. + + The unget buffer for characters is only one character large; it is + an error to try to unget a character when the unget buffer is not + empty. + + @param c: the character to unget + @type c: string + @raises UngetBufferFull: there is already an ungotten char + """ + + if self.ungotten_char is not None: + raise UngetBufferFull + self.ungotten_char = c + + def skip_whitespace(self): + """Consume input until a non-whitespace character is encountered. + + The non-whitespace character is then ungotten, and the number of + whitespace characters consumed is returned. + + If the tokenizer is in multiline mode, then newlines are whitespace. + + @rtype: int + """ + + skipped = 0 + while True: + c = self._get_char() + if c != ' ' and c != '\t': + if (c != '\n') or not self.multiline: + self._unget_char(c) + return skipped + skipped += 1 + + def get(self, want_leading=False, want_comment=False): + """Get the next token. + + @param want_leading: If True, return a WHITESPACE token if the + first character read is whitespace. The default is False. + @type want_leading: bool + @param want_comment: If True, return a COMMENT token if the + first token read is a comment. The default is False. + @type want_comment: bool + @rtype: Token object + @raises dns.exception.UnexpectedEnd: input ended prematurely + @raises dns.exception.SyntaxError: input was badly formed + """ + + if self.ungotten_token is not None: + token = self.ungotten_token + self.ungotten_token = None + if token.is_whitespace(): + if want_leading: + return token + elif token.is_comment(): + if want_comment: + return token + else: + return token + skipped = self.skip_whitespace() + if want_leading and skipped > 0: + return Token(WHITESPACE, ' ') + token = '' + ttype = IDENTIFIER + has_escape = False + while True: + c = self._get_char() + if c == '' or c in self.delimiters: + if c == '' and self.quoting: + raise dns.exception.UnexpectedEnd + if token == '' and ttype != QUOTED_STRING: + if c == '(': + self.multiline += 1 + self.skip_whitespace() + continue + elif c == ')': + if self.multiline <= 0: + raise dns.exception.SyntaxError + self.multiline -= 1 + self.skip_whitespace() + continue + elif c == '"': + if not self.quoting: + self.quoting = True + self.delimiters = _QUOTING_DELIMITERS + ttype = QUOTED_STRING + continue + else: + self.quoting = False + self.delimiters = _DELIMITERS + self.skip_whitespace() + continue + elif c == '\n': + return Token(EOL, '\n') + elif c == ';': + while 1: + c = self._get_char() + if c == '\n' or c == '': + break + token += c + if want_comment: + self._unget_char(c) + return Token(COMMENT, token) + elif c == '': + if self.multiline: + raise dns.exception.SyntaxError( + 'unbalanced parentheses') + return Token(EOF) + elif self.multiline: + self.skip_whitespace() + token = '' + continue + else: + return Token(EOL, '\n') + else: + # This code exists in case we ever want a + # delimiter to be returned. It never produces + # a token currently. + token = c + ttype = DELIMITER + else: + self._unget_char(c) + break + elif self.quoting: + if c == '\\': + c = self._get_char() + if c == '': + raise dns.exception.UnexpectedEnd + if c.isdigit(): + c2 = self._get_char() + if c2 == '': + raise dns.exception.UnexpectedEnd + c3 = self._get_char() + if c == '': + raise dns.exception.UnexpectedEnd + if not (c2.isdigit() and c3.isdigit()): + raise dns.exception.SyntaxError + c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) + elif c == '\n': + raise dns.exception.SyntaxError('newline in quoted string') + elif c == '\\': + # + # It's an escape. Put it and the next character into + # the token; it will be checked later for goodness. + # + token += c + has_escape = True + c = self._get_char() + if c == '' or c == '\n': + raise dns.exception.UnexpectedEnd + token += c + if token == '' and ttype != QUOTED_STRING: + if self.multiline: + raise dns.exception.SyntaxError('unbalanced parentheses') + ttype = EOF + return Token(ttype, token, has_escape) + + def unget(self, token): + """Unget a token. + + The unget buffer for tokens is only one token large; it is + an error to try to unget a token when the unget buffer is not + empty. + + @param token: the token to unget + @type token: Token object + @raises UngetBufferFull: there is already an ungotten token + """ + + if self.ungotten_token is not None: + raise UngetBufferFull + self.ungotten_token = token + + def next(self): + """Return the next item in an iteration. + @rtype: (int, string) + """ + + token = self.get() + if token.is_eof(): + raise StopIteration + return token + + __next__ = next + + def __iter__(self): + return self + + # Helpers + + def get_int(self): + """Read the next token and interpret it as an integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + if not token.value.isdigit(): + raise dns.exception.SyntaxError('expecting an integer') + return int(token.value) + + def get_uint8(self): + """Read the next token and interpret it as an 8-bit unsigned + integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + value = self.get_int() + if value < 0 or value > 255: + raise dns.exception.SyntaxError( + '%d is not an unsigned 8-bit integer' % value) + return value + + def get_uint16(self): + """Read the next token and interpret it as a 16-bit unsigned + integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + value = self.get_int() + if value < 0 or value > 65535: + raise dns.exception.SyntaxError( + '%d is not an unsigned 16-bit integer' % value) + return value + + def get_uint32(self): + """Read the next token and interpret it as a 32-bit unsigned + integer. + + @raises dns.exception.SyntaxError: + @rtype: int + """ + + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + if not token.value.isdigit(): + raise dns.exception.SyntaxError('expecting an integer') + value = long(token.value) + if value < 0 or value > long(4294967296): + raise dns.exception.SyntaxError( + '%d is not an unsigned 32-bit integer' % value) + return value + + def get_string(self, origin=None): + """Read the next token and interpret it as a string. + + @raises dns.exception.SyntaxError: + @rtype: string + """ + + token = self.get().unescape() + if not (token.is_identifier() or token.is_quoted_string()): + raise dns.exception.SyntaxError('expecting a string') + return token.value + + def get_identifier(self, origin=None): + """Read the next token and raise an exception if it is not an identifier. + + @raises dns.exception.SyntaxError: + @rtype: string + """ + + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + return token.value + + def get_name(self, origin=None): + """Read the next token and interpret it as a DNS name. + + @raises dns.exception.SyntaxError: + @rtype: dns.name.Name object""" + + token = self.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + return dns.name.from_text(token.value, origin) + + def get_eol(self): + """Read the next token and raise an exception if it isn't EOL or + EOF. + + @raises dns.exception.SyntaxError: + @rtype: string + """ + + token = self.get() + if not token.is_eol_or_eof(): + raise dns.exception.SyntaxError( + 'expected EOL or EOF, got %d "%s"' % (token.ttype, + token.value)) + return token.value + + def get_ttl(self): + token = self.get().unescape() + if not token.is_identifier(): + raise dns.exception.SyntaxError('expecting an identifier') + return dns.ttl.from_text(token.value) diff --git a/Contents/Libraries/Shared/dns/tsig.py b/Contents/Libraries/Shared/dns/tsig.py new file mode 100644 index 000000000..c57d879fa --- /dev/null +++ b/Contents/Libraries/Shared/dns/tsig.py @@ -0,0 +1,234 @@ +# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS TSIG support.""" + +import hmac +import struct + +import dns.exception +import dns.hash +import dns.rdataclass +import dns.name +from ._compat import long, string_types, text_type + +class BadTime(dns.exception.DNSException): + + """The current time is not within the TSIG's validity time.""" + + +class BadSignature(dns.exception.DNSException): + + """The TSIG signature fails to verify.""" + + +class PeerError(dns.exception.DNSException): + + """Base class for all TSIG errors generated by the remote peer""" + + +class PeerBadKey(PeerError): + + """The peer didn't know the key we used""" + + +class PeerBadSignature(PeerError): + + """The peer didn't like the signature we sent""" + + +class PeerBadTime(PeerError): + + """The peer didn't like the time we sent""" + + +class PeerBadTruncation(PeerError): + + """The peer didn't like amount of truncation in the TSIG we sent""" + +# TSIG Algorithms + +HMAC_MD5 = dns.name.from_text("HMAC-MD5.SIG-ALG.REG.INT") +HMAC_SHA1 = dns.name.from_text("hmac-sha1") +HMAC_SHA224 = dns.name.from_text("hmac-sha224") +HMAC_SHA256 = dns.name.from_text("hmac-sha256") +HMAC_SHA384 = dns.name.from_text("hmac-sha384") +HMAC_SHA512 = dns.name.from_text("hmac-sha512") + +_hashes = { + HMAC_SHA224: 'SHA224', + HMAC_SHA256: 'SHA256', + HMAC_SHA384: 'SHA384', + HMAC_SHA512: 'SHA512', + HMAC_SHA1: 'SHA1', + HMAC_MD5: 'MD5', +} + +default_algorithm = HMAC_MD5 + +BADSIG = 16 +BADKEY = 17 +BADTIME = 18 +BADTRUNC = 22 + + +def sign(wire, keyname, secret, time, fudge, original_id, error, + other_data, request_mac, ctx=None, multi=False, first=True, + algorithm=default_algorithm): + """Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata + for the input parameters, the HMAC MAC calculated by applying the + TSIG signature algorithm, and the TSIG digest context. + @rtype: (string, string, hmac.HMAC object) + @raises ValueError: I{other_data} is too long + @raises NotImplementedError: I{algorithm} is not supported + """ + + if isinstance(other_data, text_type): + other_data = other_data.encode() + (algorithm_name, digestmod) = get_algorithm(algorithm) + if first: + ctx = hmac.new(secret, digestmod=digestmod) + ml = len(request_mac) + if ml > 0: + ctx.update(struct.pack('!H', ml)) + ctx.update(request_mac) + id = struct.pack('!H', original_id) + ctx.update(id) + ctx.update(wire[2:]) + if first: + ctx.update(keyname.to_digestable()) + ctx.update(struct.pack('!H', dns.rdataclass.ANY)) + ctx.update(struct.pack('!I', 0)) + long_time = time + long(0) + upper_time = (long_time >> 32) & long(0xffff) + lower_time = long_time & long(0xffffffff) + time_mac = struct.pack('!HIH', upper_time, lower_time, fudge) + pre_mac = algorithm_name + time_mac + ol = len(other_data) + if ol > 65535: + raise ValueError('TSIG Other Data is > 65535 bytes') + post_mac = struct.pack('!HH', error, ol) + other_data + if first: + ctx.update(pre_mac) + ctx.update(post_mac) + else: + ctx.update(time_mac) + mac = ctx.digest() + mpack = struct.pack('!H', len(mac)) + tsig_rdata = pre_mac + mpack + mac + id + post_mac + if multi: + ctx = hmac.new(secret, digestmod=digestmod) + ml = len(mac) + ctx.update(struct.pack('!H', ml)) + ctx.update(mac) + else: + ctx = None + return (tsig_rdata, mac, ctx) + + +def hmac_md5(wire, keyname, secret, time, fudge, original_id, error, + other_data, request_mac, ctx=None, multi=False, first=True, + algorithm=default_algorithm): + return sign(wire, keyname, secret, time, fudge, original_id, error, + other_data, request_mac, ctx, multi, first, algorithm) + + +def validate(wire, keyname, secret, now, request_mac, tsig_start, tsig_rdata, + tsig_rdlen, ctx=None, multi=False, first=True): + """Validate the specified TSIG rdata against the other input parameters. + + @raises FormError: The TSIG is badly formed. + @raises BadTime: There is too much time skew between the client and the + server. + @raises BadSignature: The TSIG signature did not validate + @rtype: hmac.HMAC object""" + + (adcount,) = struct.unpack("!H", wire[10:12]) + if adcount == 0: + raise dns.exception.FormError + adcount -= 1 + new_wire = wire[0:10] + struct.pack("!H", adcount) + wire[12:tsig_start] + current = tsig_rdata + (aname, used) = dns.name.from_wire(wire, current) + current = current + used + (upper_time, lower_time, fudge, mac_size) = \ + struct.unpack("!HIHH", wire[current:current + 10]) + time = ((upper_time + long(0)) << 32) + (lower_time + long(0)) + current += 10 + mac = wire[current:current + mac_size] + current += mac_size + (original_id, error, other_size) = \ + struct.unpack("!HHH", wire[current:current + 6]) + current += 6 + other_data = wire[current:current + other_size] + current += other_size + if current != tsig_rdata + tsig_rdlen: + raise dns.exception.FormError + if error != 0: + if error == BADSIG: + raise PeerBadSignature + elif error == BADKEY: + raise PeerBadKey + elif error == BADTIME: + raise PeerBadTime + elif error == BADTRUNC: + raise PeerBadTruncation + else: + raise PeerError('unknown TSIG error code %d' % error) + time_low = time - fudge + time_high = time + fudge + if now < time_low or now > time_high: + raise BadTime + (junk, our_mac, ctx) = sign(new_wire, keyname, secret, time, fudge, + original_id, error, other_data, + request_mac, ctx, multi, first, aname) + if our_mac != mac: + raise BadSignature + return ctx + + +def get_algorithm(algorithm): + """Returns the wire format string and the hash module to use for the + specified TSIG algorithm + + @rtype: (string, hash constructor) + @raises NotImplementedError: I{algorithm} is not supported + """ + + if isinstance(algorithm, string_types): + algorithm = dns.name.from_text(algorithm) + + try: + return (algorithm.to_digestable(), dns.hash.hashes[_hashes[algorithm]]) + except KeyError: + raise NotImplementedError("TSIG algorithm " + str(algorithm) + + " is not supported") + + +def get_algorithm_and_mac(wire, tsig_rdata, tsig_rdlen): + """Return the tsig algorithm for the specified tsig_rdata + @raises FormError: The TSIG is badly formed. + """ + current = tsig_rdata + (aname, used) = dns.name.from_wire(wire, current) + current = current + used + (upper_time, lower_time, fudge, mac_size) = \ + struct.unpack("!HIHH", wire[current:current + 10]) + current += 10 + mac = wire[current:current + mac_size] + current += mac_size + if current > tsig_rdata + tsig_rdlen: + raise dns.exception.FormError + return (aname, mac) diff --git a/Contents/Libraries/Shared/dns/tsigkeyring.py b/Contents/Libraries/Shared/dns/tsigkeyring.py new file mode 100644 index 000000000..01f87027c --- /dev/null +++ b/Contents/Libraries/Shared/dns/tsigkeyring.py @@ -0,0 +1,48 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""A place to store TSIG keys.""" + +from dns._compat import maybe_decode, maybe_encode + +import base64 + +import dns.name + + +def from_text(textring): + """Convert a dictionary containing (textual DNS name, base64 secret) pairs + into a binary keyring which has (dns.name.Name, binary secret) pairs. + @rtype: dict""" + + keyring = {} + for keytext in textring: + keyname = dns.name.from_text(keytext) + secret = base64.decodestring(maybe_encode(textring[keytext])) + keyring[keyname] = secret + return keyring + + +def to_text(keyring): + """Convert a dictionary containing (dns.name.Name, binary secret) pairs + into a text keyring which has (textual DNS name, base64 secret) pairs. + @rtype: dict""" + + textring = {} + for keyname in keyring: + keytext = maybe_decode(keyname.to_text()) + secret = maybe_decode(base64.encodestring(keyring[keyname])) + textring[keytext] = secret + return textring diff --git a/Contents/Libraries/Shared/dns/ttl.py b/Contents/Libraries/Shared/dns/ttl.py new file mode 100644 index 000000000..a27d82518 --- /dev/null +++ b/Contents/Libraries/Shared/dns/ttl.py @@ -0,0 +1,68 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS TTL conversion.""" + +import dns.exception +from ._compat import long + + +class BadTTL(dns.exception.SyntaxError): + + """DNS TTL value is not well-formed.""" + + +def from_text(text): + """Convert the text form of a TTL to an integer. + + The BIND 8 units syntax for TTLs (e.g. '1w6d4h3m10s') is supported. + + @param text: the textual TTL + @type text: string + @raises dns.ttl.BadTTL: the TTL is not well-formed + @rtype: int + """ + + if text.isdigit(): + total = long(text) + else: + if not text[0].isdigit(): + raise BadTTL + total = long(0) + current = long(0) + for c in text: + if c.isdigit(): + current *= 10 + current += long(c) + else: + c = c.lower() + if c == 'w': + total += current * long(604800) + elif c == 'd': + total += current * long(86400) + elif c == 'h': + total += current * long(3600) + elif c == 'm': + total += current * long(60) + elif c == 's': + total += current + else: + raise BadTTL("unknown unit '%s'" % c) + current = 0 + if not current == 0: + raise BadTTL("trailing integer") + if total < long(0) or total > long(2147483647): + raise BadTTL("TTL should be between 0 and 2^31 - 1 (inclusive)") + return total diff --git a/Contents/Libraries/Shared/dns/update.py b/Contents/Libraries/Shared/dns/update.py new file mode 100644 index 000000000..59728d982 --- /dev/null +++ b/Contents/Libraries/Shared/dns/update.py @@ -0,0 +1,249 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Dynamic Update Support""" + + +import dns.message +import dns.name +import dns.opcode +import dns.rdata +import dns.rdataclass +import dns.rdataset +import dns.tsig +from ._compat import string_types + + +class Update(dns.message.Message): + + def __init__(self, zone, rdclass=dns.rdataclass.IN, keyring=None, + keyname=None, keyalgorithm=dns.tsig.default_algorithm): + """Initialize a new DNS Update object. + + @param zone: The zone which is being updated. + @type zone: A dns.name.Name or string + @param rdclass: The class of the zone; defaults to dns.rdataclass.IN. + @type rdclass: An int designating the class, or a string whose value + is the name of a class. + @param keyring: The TSIG keyring to use; defaults to None. + @type keyring: dict + @param keyname: The name of the TSIG key to use; defaults to None. + The key must be defined in the keyring. If a keyring is specified + but a keyname is not, then the key used will be the first key in the + keyring. Note that the order of keys in a dictionary is not defined, + so applications should supply a keyname when a keyring is used, unless + they know the keyring contains only one key. + @type keyname: dns.name.Name or string + @param keyalgorithm: The TSIG algorithm to use; defaults to + dns.tsig.default_algorithm. Constants for TSIG algorithms are defined + in dns.tsig, and the currently implemented algorithms are + HMAC_MD5, HMAC_SHA1, HMAC_SHA224, HMAC_SHA256, HMAC_SHA384, and + HMAC_SHA512. + @type keyalgorithm: string + """ + super(Update, self).__init__() + self.flags |= dns.opcode.to_flags(dns.opcode.UPDATE) + if isinstance(zone, string_types): + zone = dns.name.from_text(zone) + self.origin = zone + if isinstance(rdclass, string_types): + rdclass = dns.rdataclass.from_text(rdclass) + self.zone_rdclass = rdclass + self.find_rrset(self.question, self.origin, rdclass, dns.rdatatype.SOA, + create=True, force_unique=True) + if keyring is not None: + self.use_tsig(keyring, keyname, algorithm=keyalgorithm) + + def _add_rr(self, name, ttl, rd, deleting=None, section=None): + """Add a single RR to the update section.""" + + if section is None: + section = self.authority + covers = rd.covers() + rrset = self.find_rrset(section, name, self.zone_rdclass, rd.rdtype, + covers, deleting, True, True) + rrset.add(rd, ttl) + + def _add(self, replace, section, name, *args): + """Add records. The first argument is the replace mode. If + false, RRs are added to an existing RRset; if true, the RRset + is replaced with the specified contents. The second + argument is the section to add to. The third argument + is always a name. The other arguments can be: + + - rdataset... + + - ttl, rdata... + + - ttl, rdtype, string...""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if isinstance(args[0], dns.rdataset.Rdataset): + for rds in args: + if replace: + self.delete(name, rds.rdtype) + for rd in rds: + self._add_rr(name, rds.ttl, rd, section=section) + else: + args = list(args) + ttl = int(args.pop(0)) + if isinstance(args[0], dns.rdata.Rdata): + if replace: + self.delete(name, args[0].rdtype) + for rd in args: + self._add_rr(name, ttl, rd, section=section) + else: + rdtype = args.pop(0) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if replace: + self.delete(name, rdtype) + for s in args: + rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, + self.origin) + self._add_rr(name, ttl, rd, section=section) + + def add(self, name, *args): + """Add records. The first argument is always a name. The other + arguments can be: + + - rdataset... + + - ttl, rdata... + + - ttl, rdtype, string...""" + self._add(False, self.authority, name, *args) + + def delete(self, name, *args): + """Delete records. The first argument is always a name. The other + arguments can be: + + - I{nothing} + + - rdataset... + + - rdata... + + - rdtype, [string...]""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if len(args) == 0: + self.find_rrset(self.authority, name, dns.rdataclass.ANY, + dns.rdatatype.ANY, dns.rdatatype.NONE, + dns.rdatatype.ANY, True, True) + elif isinstance(args[0], dns.rdataset.Rdataset): + for rds in args: + for rd in rds: + self._add_rr(name, 0, rd, dns.rdataclass.NONE) + else: + args = list(args) + if isinstance(args[0], dns.rdata.Rdata): + for rd in args: + self._add_rr(name, 0, rd, dns.rdataclass.NONE) + else: + rdtype = args.pop(0) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if len(args) == 0: + self.find_rrset(self.authority, name, + self.zone_rdclass, rdtype, + dns.rdatatype.NONE, + dns.rdataclass.ANY, + True, True) + else: + for s in args: + rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, + self.origin) + self._add_rr(name, 0, rd, dns.rdataclass.NONE) + + def replace(self, name, *args): + """Replace records. The first argument is always a name. The other + arguments can be: + + - rdataset... + + - ttl, rdata... + + - ttl, rdtype, string... + + Note that if you want to replace the entire node, you should do + a delete of the name followed by one or more calls to add.""" + + self._add(True, self.authority, name, *args) + + def present(self, name, *args): + """Require that an owner name (and optionally an rdata type, + or specific rdataset) exists as a prerequisite to the + execution of the update. The first argument is always a name. + The other arguments can be: + + - rdataset... + + - rdata... + + - rdtype, string...""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if len(args) == 0: + self.find_rrset(self.answer, name, + dns.rdataclass.ANY, dns.rdatatype.ANY, + dns.rdatatype.NONE, None, + True, True) + elif isinstance(args[0], dns.rdataset.Rdataset) or \ + isinstance(args[0], dns.rdata.Rdata) or \ + len(args) > 1: + if not isinstance(args[0], dns.rdataset.Rdataset): + # Add a 0 TTL + args = list(args) + args.insert(0, 0) + self._add(False, self.answer, name, *args) + else: + rdtype = args[0] + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + self.find_rrset(self.answer, name, + dns.rdataclass.ANY, rdtype, + dns.rdatatype.NONE, None, + True, True) + + def absent(self, name, rdtype=None): + """Require that an owner name (and optionally an rdata type) does + not exist as a prerequisite to the execution of the update.""" + + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + if rdtype is None: + self.find_rrset(self.answer, name, + dns.rdataclass.NONE, dns.rdatatype.ANY, + dns.rdatatype.NONE, None, + True, True) + else: + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + self.find_rrset(self.answer, name, + dns.rdataclass.NONE, rdtype, + dns.rdatatype.NONE, None, + True, True) + + def to_wire(self, origin=None, max_size=65535): + """Return a string containing the update in DNS compressed wire + format. + @rtype: string""" + if origin is None: + origin = self.origin + return super(Update, self).to_wire(origin, max_size) diff --git a/Contents/Libraries/Shared/dns/version.py b/Contents/Libraries/Shared/dns/version.py new file mode 100644 index 000000000..9e8dbb1b0 --- /dev/null +++ b/Contents/Libraries/Shared/dns/version.py @@ -0,0 +1,34 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""dnspython release version information.""" + +MAJOR = 1 +MINOR = 15 +MICRO = 0 +RELEASELEVEL = 0x0f +SERIAL = 0 + +if RELEASELEVEL == 0x0f: + version = '%d.%d.%d' % (MAJOR, MINOR, MICRO) +elif RELEASELEVEL == 0x00: + version = '%d.%d.%dx%d' % \ + (MAJOR, MINOR, MICRO, SERIAL) +else: + version = '%d.%d.%d%x%d' % \ + (MAJOR, MINOR, MICRO, RELEASELEVEL, SERIAL) + +hexversion = MAJOR << 24 | MINOR << 16 | MICRO << 8 | RELEASELEVEL << 4 | \ + SERIAL diff --git a/Contents/Libraries/Shared/dns/wiredata.py b/Contents/Libraries/Shared/dns/wiredata.py new file mode 100644 index 000000000..ccef59545 --- /dev/null +++ b/Contents/Libraries/Shared/dns/wiredata.py @@ -0,0 +1,103 @@ +# Copyright (C) 2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Wire Data Helper""" + +import sys + +import dns.exception +from ._compat import binary_type, string_types + +# Figure out what constant python passes for an unspecified slice bound. +# It's supposed to be sys.maxint, yet on 64-bit windows sys.maxint is 2^31 - 1 +# but Python uses 2^63 - 1 as the constant. Rather than making pointless +# extra comparisons, duplicating code, or weakening WireData, we just figure +# out what constant Python will use. + + +class _SliceUnspecifiedBound(binary_type): + + def __getitem__(self, key): + return key.stop + + if sys.version_info < (3,): + def __getslice__(self, i, j): # pylint: disable=getslice-method + return self.__getitem__(slice(i, j)) + +_unspecified_bound = _SliceUnspecifiedBound()[1:] + + +class WireData(binary_type): + # WireData is a string with stricter slicing + + def __getitem__(self, key): + try: + if isinstance(key, slice): + # make sure we are not going outside of valid ranges, + # do stricter control of boundaries than python does + # by default + start = key.start + stop = key.stop + + if sys.version_info < (3,): + if stop == _unspecified_bound: + # handle the case where the right bound is unspecified + stop = len(self) + + if start < 0 or stop < 0: + raise dns.exception.FormError + # If it's not an empty slice, access left and right bounds + # to make sure they're valid + if start != stop: + super(WireData, self).__getitem__(start) + super(WireData, self).__getitem__(stop - 1) + else: + for index in (start, stop): + if index is None: + continue + elif abs(index) > len(self): + raise dns.exception.FormError + + return WireData(super(WireData, self).__getitem__( + slice(start, stop))) + return bytearray(self.unwrap())[key] + except IndexError: + raise dns.exception.FormError + + if sys.version_info < (3,): + def __getslice__(self, i, j): # pylint: disable=getslice-method + return self.__getitem__(slice(i, j)) + + def __iter__(self): + i = 0 + while 1: + try: + yield self[i] + i += 1 + except dns.exception.FormError: + raise StopIteration + + def unwrap(self): + return binary_type(self) + + +def maybe_wrap(wire): + if isinstance(wire, WireData): + return wire + elif isinstance(wire, binary_type): + return WireData(wire) + elif isinstance(wire, string_types): + return WireData(wire.encode()) + raise ValueError("unhandled type %s" % type(wire)) diff --git a/Contents/Libraries/Shared/dns/zone.py b/Contents/Libraries/Shared/dns/zone.py new file mode 100644 index 000000000..468618f67 --- /dev/null +++ b/Contents/Libraries/Shared/dns/zone.py @@ -0,0 +1,1087 @@ +# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""DNS Zones.""" + +from __future__ import generators + +import sys +import re +import os +from io import BytesIO + +import dns.exception +import dns.name +import dns.node +import dns.rdataclass +import dns.rdatatype +import dns.rdata +import dns.rrset +import dns.tokenizer +import dns.ttl +import dns.grange +from ._compat import string_types, text_type + + +_py3 = sys.version_info > (3,) + + +class BadZone(dns.exception.DNSException): + + """The DNS zone is malformed.""" + + +class NoSOA(BadZone): + + """The DNS zone has no SOA RR at its origin.""" + + +class NoNS(BadZone): + + """The DNS zone has no NS RRset at its origin.""" + + +class UnknownOrigin(BadZone): + + """The DNS zone's origin is unknown.""" + + +class Zone(object): + + """A DNS zone. + + A Zone is a mapping from names to nodes. The zone object may be + treated like a Python dictionary, e.g. zone[name] will retrieve + the node associated with that name. The I{name} may be a + dns.name.Name object, or it may be a string. In the either case, + if the name is relative it is treated as relative to the origin of + the zone. + + @ivar rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int + @ivar origin: The origin of the zone. + @type origin: dns.name.Name object + @ivar nodes: A dictionary mapping the names of nodes in the zone to the + nodes themselves. + @type nodes: dict + @ivar relativize: should names in the zone be relativized? + @type relativize: bool + @cvar node_factory: the factory used to create a new node + @type node_factory: class or callable + """ + + node_factory = dns.node.Node + + __slots__ = ['rdclass', 'origin', 'nodes', 'relativize'] + + def __init__(self, origin, rdclass=dns.rdataclass.IN, relativize=True): + """Initialize a zone object. + + @param origin: The origin of the zone. + @type origin: dns.name.Name object + @param rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int""" + + if origin is not None: + if isinstance(origin, string_types): + origin = dns.name.from_text(origin) + elif not isinstance(origin, dns.name.Name): + raise ValueError("origin parameter must be convertible to a " + "DNS name") + if not origin.is_absolute(): + raise ValueError("origin parameter must be an absolute name") + self.origin = origin + self.rdclass = rdclass + self.nodes = {} + self.relativize = relativize + + def __eq__(self, other): + """Two zones are equal if they have the same origin, class, and + nodes. + @rtype: bool + """ + + if not isinstance(other, Zone): + return False + if self.rdclass != other.rdclass or \ + self.origin != other.origin or \ + self.nodes != other.nodes: + return False + return True + + def __ne__(self, other): + """Are two zones not equal? + @rtype: bool + """ + + return not self.__eq__(other) + + def _validate_name(self, name): + if isinstance(name, string_types): + name = dns.name.from_text(name, None) + elif not isinstance(name, dns.name.Name): + raise KeyError("name parameter must be convertible to a DNS name") + if name.is_absolute(): + if not name.is_subdomain(self.origin): + raise KeyError( + "name parameter must be a subdomain of the zone origin") + if self.relativize: + name = name.relativize(self.origin) + return name + + def __getitem__(self, key): + key = self._validate_name(key) + return self.nodes[key] + + def __setitem__(self, key, value): + key = self._validate_name(key) + self.nodes[key] = value + + def __delitem__(self, key): + key = self._validate_name(key) + del self.nodes[key] + + def __iter__(self): + return self.nodes.__iter__() + + def iterkeys(self): + if _py3: + return self.nodes.keys() + else: + return self.nodes.iterkeys() # pylint: disable=dict-iter-method + + def keys(self): + return self.nodes.keys() + + def itervalues(self): + if _py3: + return self.nodes.values() + else: + return self.nodes.itervalues() # pylint: disable=dict-iter-method + + def values(self): + return self.nodes.values() + + def items(self): + return self.nodes.items() + + iteritems = items + + def get(self, key): + key = self._validate_name(key) + return self.nodes.get(key) + + def __contains__(self, other): + return other in self.nodes + + def find_node(self, name, create=False): + """Find a node in the zone, possibly creating it. + + @param name: the name of the node to find + @type name: dns.name.Name object or string + @param create: should the node be created if it doesn't exist? + @type create: bool + @raises KeyError: the name is not known and create was not specified. + @rtype: dns.node.Node object + """ + + name = self._validate_name(name) + node = self.nodes.get(name) + if node is None: + if not create: + raise KeyError + node = self.node_factory() + self.nodes[name] = node + return node + + def get_node(self, name, create=False): + """Get a node in the zone, possibly creating it. + + This method is like L{find_node}, except it returns None instead + of raising an exception if the node does not exist and creation + has not been requested. + + @param name: the name of the node to find + @type name: dns.name.Name object or string + @param create: should the node be created if it doesn't exist? + @type create: bool + @rtype: dns.node.Node object or None + """ + + try: + node = self.find_node(name, create) + except KeyError: + node = None + return node + + def delete_node(self, name): + """Delete the specified node if it exists. + + It is not an error if the node does not exist. + """ + + name = self._validate_name(name) + if name in self.nodes: + del self.nodes[name] + + def find_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Look for rdata with the specified name and type in the zone, + and return an rdataset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + The rdataset returned is not a copy; changes to it will change + the zone. + + KeyError is raised if the name or type are not found. + Use L{get_rdataset} if you want to have None returned instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @param create: should the node and rdataset be created if they do not + exist? + @type create: bool + @raises KeyError: the node or rdata could not be found + @rtype: dns.rrset.RRset object + """ + + name = self._validate_name(name) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + node = self.find_node(name, create) + return node.find_rdataset(self.rdclass, rdtype, covers, create) + + def get_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, + create=False): + """Look for rdata with the specified name and type in the zone, + and return an rdataset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + The rdataset returned is not a copy; changes to it will change + the zone. + + None is returned if the name or type are not found. + Use L{find_rdataset} if you want to have KeyError raised instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @param create: should the node and rdataset be created if they do not + exist? + @type create: bool + @rtype: dns.rrset.RRset object + """ + + try: + rdataset = self.find_rdataset(name, rdtype, covers, create) + except KeyError: + rdataset = None + return rdataset + + def delete_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE): + """Delete the rdataset matching I{rdtype} and I{covers}, if it + exists at the node specified by I{name}. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + It is not an error if the node does not exist, or if there is no + matching rdataset at the node. + + If the node has no rdatasets after the deletion, it will itself + be deleted. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + """ + + name = self._validate_name(name) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + node = self.get_node(name) + if node is not None: + node.delete_rdataset(self.rdclass, rdtype, covers) + if len(node) == 0: + self.delete_node(name) + + def replace_rdataset(self, name, replacement): + """Replace an rdataset at name. + + It is not an error if there is no rdataset matching I{replacement}. + + Ownership of the I{replacement} object is transferred to the zone; + in other words, this method does not store a copy of I{replacement} + at the node, it stores I{replacement} itself. + + If the I{name} node does not exist, it is created. + + @param name: the owner name + @type name: DNS.name.Name object or string + @param replacement: the replacement rdataset + @type replacement: dns.rdataset.Rdataset + """ + + if replacement.rdclass != self.rdclass: + raise ValueError('replacement.rdclass != zone.rdclass') + node = self.find_node(name, True) + node.replace_rdataset(replacement) + + def find_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): + """Look for rdata with the specified name and type in the zone, + and return an RRset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + This method is less efficient than the similar + L{find_rdataset} because it creates an RRset instead of + returning the matching rdataset. It may be more convenient + for some uses since it returns an object which binds the owner + name to the rdata. + + This method may not be used to create new nodes or rdatasets; + use L{find_rdataset} instead. + + KeyError is raised if the name or type are not found. + Use L{get_rrset} if you want to have None returned instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @raises KeyError: the node or rdata could not be found + @rtype: dns.rrset.RRset object + """ + + name = self._validate_name(name) + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + rdataset = self.nodes[name].find_rdataset(self.rdclass, rdtype, covers) + rrset = dns.rrset.RRset(name, self.rdclass, rdtype, covers) + rrset.update(rdataset) + return rrset + + def get_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): + """Look for rdata with the specified name and type in the zone, + and return an RRset encapsulating it. + + The I{name}, I{rdtype}, and I{covers} parameters may be + strings, in which case they will be converted to their proper + type. + + This method is less efficient than the similar L{get_rdataset} + because it creates an RRset instead of returning the matching + rdataset. It may be more convenient for some uses since it + returns an object which binds the owner name to the rdata. + + This method may not be used to create new nodes or rdatasets; + use L{find_rdataset} instead. + + None is returned if the name or type are not found. + Use L{find_rrset} if you want to have KeyError raised instead. + + @param name: the owner name to look for + @type name: DNS.name.Name object or string + @param rdtype: the rdata type desired + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + @rtype: dns.rrset.RRset object + """ + + try: + rrset = self.find_rrset(name, rdtype, covers) + except KeyError: + rrset = None + return rrset + + def iterate_rdatasets(self, rdtype=dns.rdatatype.ANY, + covers=dns.rdatatype.NONE): + """Return a generator which yields (name, rdataset) tuples for + all rdatasets in the zone which have the specified I{rdtype} + and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, + then all rdatasets will be matched. + + @param rdtype: int or string + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + """ + + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + for (name, node) in self.iteritems(): + for rds in node: + if rdtype == dns.rdatatype.ANY or \ + (rds.rdtype == rdtype and rds.covers == covers): + yield (name, rds) + + def iterate_rdatas(self, rdtype=dns.rdatatype.ANY, + covers=dns.rdatatype.NONE): + """Return a generator which yields (name, ttl, rdata) tuples for + all rdatas in the zone which have the specified I{rdtype} + and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, + then all rdatas will be matched. + + @param rdtype: int or string + @type rdtype: int or string + @param covers: the covered type (defaults to None) + @type covers: int or string + """ + + if isinstance(rdtype, string_types): + rdtype = dns.rdatatype.from_text(rdtype) + if isinstance(covers, string_types): + covers = dns.rdatatype.from_text(covers) + for (name, node) in self.iteritems(): + for rds in node: + if rdtype == dns.rdatatype.ANY or \ + (rds.rdtype == rdtype and rds.covers == covers): + for rdata in rds: + yield (name, rds.ttl, rdata) + + def to_file(self, f, sorted=True, relativize=True, nl=None): + """Write a zone to a file. + + @param f: file or string. If I{f} is a string, it is treated + as the name of a file to open. + @param sorted: if True, the file will be written with the + names sorted in DNSSEC order from least to greatest. Otherwise + the names will be written in whatever order they happen to have + in the zone's dictionary. + @param relativize: if True, domain names in the output will be + relativized to the zone's origin (if possible). + @type relativize: bool + @param nl: The end of line string. If not specified, the + output will use the platform's native end-of-line marker (i.e. + LF on POSIX, CRLF on Windows, CR on Macintosh). + @type nl: string or None + """ + + if isinstance(f, string_types): + f = open(f, 'wb') + want_close = True + else: + want_close = False + + # must be in this way, f.encoding may contain None, or even attribute + # may not be there + file_enc = getattr(f, 'encoding', None) + if file_enc is None: + file_enc = 'utf-8' + + if nl is None: + nl_b = os.linesep.encode(file_enc) # binary mode, '\n' is not enough + nl = u'\n' + elif isinstance(nl, string_types): + nl_b = nl.encode(file_enc) + else: + nl_b = nl + nl = nl.decode() + + try: + if sorted: + names = list(self.keys()) + names.sort() + else: + names = self.iterkeys() + for n in names: + l = self[n].to_text(n, origin=self.origin, + relativize=relativize) + if isinstance(l, text_type): + l_b = l.encode(file_enc) + else: + l_b = l + l = l.decode() + + try: + f.write(l_b) + f.write(nl_b) + except TypeError: # textual mode + f.write(l) + f.write(nl) + finally: + if want_close: + f.close() + + def to_text(self, sorted=True, relativize=True, nl=None): + """Return a zone's text as though it were written to a file. + + @param sorted: if True, the file will be written with the + names sorted in DNSSEC order from least to greatest. Otherwise + the names will be written in whatever order they happen to have + in the zone's dictionary. + @param relativize: if True, domain names in the output will be + relativized to the zone's origin (if possible). + @type relativize: bool + @param nl: The end of line string. If not specified, the + output will use the platform's native end-of-line marker (i.e. + LF on POSIX, CRLF on Windows, CR on Macintosh). + @type nl: string or None + """ + temp_buffer = BytesIO() + self.to_file(temp_buffer, sorted, relativize, nl) + return_value = temp_buffer.getvalue() + temp_buffer.close() + return return_value + + def check_origin(self): + """Do some simple checking of the zone's origin. + + @raises dns.zone.NoSOA: there is no SOA RR + @raises dns.zone.NoNS: there is no NS RRset + @raises KeyError: there is no origin node + """ + if self.relativize: + name = dns.name.empty + else: + name = self.origin + if self.get_rdataset(name, dns.rdatatype.SOA) is None: + raise NoSOA + if self.get_rdataset(name, dns.rdatatype.NS) is None: + raise NoNS + + +class _MasterReader(object): + + """Read a DNS master file + + @ivar tok: The tokenizer + @type tok: dns.tokenizer.Tokenizer object + @ivar ttl: The default TTL + @type ttl: int + @ivar last_name: The last name read + @type last_name: dns.name.Name object + @ivar current_origin: The current origin + @type current_origin: dns.name.Name object + @ivar relativize: should names in the zone be relativized? + @type relativize: bool + @ivar zone: the zone + @type zone: dns.zone.Zone object + @ivar saved_state: saved reader state (used when processing $INCLUDE) + @type saved_state: list of (tokenizer, current_origin, last_name, file) + tuples. + @ivar current_file: the file object of the $INCLUDed file being parsed + (None if no $INCLUDE is active). + @ivar allow_include: is $INCLUDE allowed? + @type allow_include: bool + @ivar check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + """ + + def __init__(self, tok, origin, rdclass, relativize, zone_factory=Zone, + allow_include=False, check_origin=True): + if isinstance(origin, string_types): + origin = dns.name.from_text(origin) + self.tok = tok + self.current_origin = origin + self.relativize = relativize + self.ttl = 0 + self.last_name = self.current_origin + self.zone = zone_factory(origin, rdclass, relativize=relativize) + self.saved_state = [] + self.current_file = None + self.allow_include = allow_include + self.check_origin = check_origin + + def _eat_line(self): + while 1: + token = self.tok.get() + if token.is_eol_or_eof(): + break + + def _rr_line(self): + """Process one line from a DNS master file.""" + # Name + if self.current_origin is None: + raise UnknownOrigin + token = self.tok.get(want_leading=True) + if not token.is_whitespace(): + self.last_name = dns.name.from_text( + token.value, self.current_origin) + else: + token = self.tok.get() + if token.is_eol_or_eof(): + # treat leading WS followed by EOL/EOF as if they were EOL/EOF. + return + self.tok.unget(token) + name = self.last_name + if not name.is_subdomain(self.zone.origin): + self._eat_line() + return + if self.relativize: + name = name.relativize(self.zone.origin) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + # TTL + try: + ttl = dns.ttl.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.ttl.BadTTL: + ttl = self.ttl + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = self.zone.rdclass + if rdclass != self.zone.rdclass: + raise dns.exception.SyntaxError("RR class is not zone's class") + # Type + try: + rdtype = dns.rdatatype.from_text(token.value) + except: + raise dns.exception.SyntaxError( + "unknown rdatatype '%s'" % token.value) + n = self.zone.nodes.get(name) + if n is None: + n = self.zone.node_factory() + self.zone.nodes[name] = n + try: + rd = dns.rdata.from_text(rdclass, rdtype, self.tok, + self.current_origin, False) + except dns.exception.SyntaxError: + # Catch and reraise. + (ty, va) = sys.exc_info()[:2] + raise va + except: + # All exceptions that occur in the processing of rdata + # are treated as syntax errors. This is not strictly + # correct, but it is correct almost all of the time. + # We convert them to syntax errors so that we can emit + # helpful filename:line info. + (ty, va) = sys.exc_info()[:2] + raise dns.exception.SyntaxError( + "caught exception %s: %s" % (str(ty), str(va))) + + rd.choose_relativity(self.zone.origin, self.relativize) + covers = rd.covers() + rds = n.find_rdataset(rdclass, rdtype, covers, True) + rds.add(rd, ttl) + + def _parse_modify(self, side): + # Here we catch everything in '{' '}' in a group so we can replace it + # with ''. + is_generate1 = re.compile("^.*\$({(\+|-?)(\d+),(\d+),(.)}).*$") + is_generate2 = re.compile("^.*\$({(\+|-?)(\d+)}).*$") + is_generate3 = re.compile("^.*\$({(\+|-?)(\d+),(\d+)}).*$") + # Sometimes there are modifiers in the hostname. These come after + # the dollar sign. They are in the form: ${offset[,width[,base]]}. + # Make names + g1 = is_generate1.match(side) + if g1: + mod, sign, offset, width, base = g1.groups() + if sign == '': + sign = '+' + g2 = is_generate2.match(side) + if g2: + mod, sign, offset = g2.groups() + if sign == '': + sign = '+' + width = 0 + base = 'd' + g3 = is_generate3.match(side) + if g3: + mod, sign, offset, width = g1.groups() + if sign == '': + sign = '+' + width = g1.groups()[2] + base = 'd' + + if not (g1 or g2 or g3): + mod = '' + sign = '+' + offset = 0 + width = 0 + base = 'd' + + if base != 'd': + raise NotImplementedError() + + return mod, sign, offset, width, base + + def _generate_line(self): + # range lhs [ttl] [class] type rhs [ comment ] + """Process one line containing the GENERATE statement from a DNS + master file.""" + if self.current_origin is None: + raise UnknownOrigin + + token = self.tok.get() + # Range (required) + try: + start, stop, step = dns.grange.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except: + raise dns.exception.SyntaxError + + # lhs (required) + try: + lhs = token.value + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except: + raise dns.exception.SyntaxError + + # TTL + try: + ttl = dns.ttl.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.ttl.BadTTL: + ttl = self.ttl + # Class + try: + rdclass = dns.rdataclass.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except dns.exception.SyntaxError: + raise dns.exception.SyntaxError + except Exception: + rdclass = self.zone.rdclass + if rdclass != self.zone.rdclass: + raise dns.exception.SyntaxError("RR class is not zone's class") + # Type + try: + rdtype = dns.rdatatype.from_text(token.value) + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError + except Exception: + raise dns.exception.SyntaxError("unknown rdatatype '%s'" % + token.value) + + # lhs (required) + try: + rhs = token.value + except: + raise dns.exception.SyntaxError + + lmod, lsign, loffset, lwidth, lbase = self._parse_modify(lhs) + rmod, rsign, roffset, rwidth, rbase = self._parse_modify(rhs) + for i in range(start, stop + 1, step): + # +1 because bind is inclusive and python is exclusive + + if lsign == u'+': + lindex = i + int(loffset) + elif lsign == u'-': + lindex = i - int(loffset) + + if rsign == u'-': + rindex = i - int(roffset) + elif rsign == u'+': + rindex = i + int(roffset) + + lzfindex = str(lindex).zfill(int(lwidth)) + rzfindex = str(rindex).zfill(int(rwidth)) + + name = lhs.replace(u'$%s' % (lmod), lzfindex) + rdata = rhs.replace(u'$%s' % (rmod), rzfindex) + + self.last_name = dns.name.from_text(name, self.current_origin) + name = self.last_name + if not name.is_subdomain(self.zone.origin): + self._eat_line() + return + if self.relativize: + name = name.relativize(self.zone.origin) + + n = self.zone.nodes.get(name) + if n is None: + n = self.zone.node_factory() + self.zone.nodes[name] = n + try: + rd = dns.rdata.from_text(rdclass, rdtype, rdata, + self.current_origin, False) + except dns.exception.SyntaxError: + # Catch and reraise. + (ty, va) = sys.exc_info()[:2] + raise va + except: + # All exceptions that occur in the processing of rdata + # are treated as syntax errors. This is not strictly + # correct, but it is correct almost all of the time. + # We convert them to syntax errors so that we can emit + # helpful filename:line info. + (ty, va) = sys.exc_info()[:2] + raise dns.exception.SyntaxError("caught exception %s: %s" % + (str(ty), str(va))) + + rd.choose_relativity(self.zone.origin, self.relativize) + covers = rd.covers() + rds = n.find_rdataset(rdclass, rdtype, covers, True) + rds.add(rd, ttl) + + def read(self): + """Read a DNS master file and build a zone object. + + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + """ + + try: + while 1: + token = self.tok.get(True, True) + if token.is_eof(): + if self.current_file is not None: + self.current_file.close() + if len(self.saved_state) > 0: + (self.tok, + self.current_origin, + self.last_name, + self.current_file, + self.ttl) = self.saved_state.pop(-1) + continue + break + elif token.is_eol(): + continue + elif token.is_comment(): + self.tok.get_eol() + continue + elif token.value[0] == u'$': + c = token.value.upper() + if c == u'$TTL': + token = self.tok.get() + if not token.is_identifier(): + raise dns.exception.SyntaxError("bad $TTL") + self.ttl = dns.ttl.from_text(token.value) + self.tok.get_eol() + elif c == u'$ORIGIN': + self.current_origin = self.tok.get_name() + self.tok.get_eol() + if self.zone.origin is None: + self.zone.origin = self.current_origin + elif c == u'$INCLUDE' and self.allow_include: + token = self.tok.get() + filename = token.value + token = self.tok.get() + if token.is_identifier(): + new_origin =\ + dns.name.from_text(token.value, + self.current_origin) + self.tok.get_eol() + elif not token.is_eol_or_eof(): + raise dns.exception.SyntaxError( + "bad origin in $INCLUDE") + else: + new_origin = self.current_origin + self.saved_state.append((self.tok, + self.current_origin, + self.last_name, + self.current_file, + self.ttl)) + self.current_file = open(filename, 'r') + self.tok = dns.tokenizer.Tokenizer(self.current_file, + filename) + self.current_origin = new_origin + elif c == u'$GENERATE': + self._generate_line() + else: + raise dns.exception.SyntaxError( + "Unknown master file directive '" + c + "'") + continue + self.tok.unget(token) + self._rr_line() + except dns.exception.SyntaxError as detail: + (filename, line_number) = self.tok.where() + if detail is None: + detail = "syntax error" + raise dns.exception.SyntaxError( + "%s:%d: %s" % (filename, line_number, detail)) + + # Now that we're done reading, do some basic checking of the zone. + if self.check_origin: + self.zone.check_origin() + + +def from_text(text, origin=None, rdclass=dns.rdataclass.IN, + relativize=True, zone_factory=Zone, filename=None, + allow_include=False, check_origin=True): + """Build a zone object from a master file format string. + + @param text: the master file format input + @type text: string. + @param origin: The origin of the zone; if not specified, the first + $ORIGIN statement in the master file will determine the origin of the + zone. + @type origin: dns.name.Name object or string + @param rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int + @param relativize: should names be relativized? The default is True + @type relativize: bool + @param zone_factory: The zone factory to use + @type zone_factory: function returning a Zone + @param filename: The filename to emit when describing where an error + occurred; the default is ''. + @type filename: string + @param allow_include: is $INCLUDE allowed? + @type allow_include: bool + @param check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + @rtype: dns.zone.Zone object + """ + + # 'text' can also be a file, but we don't publish that fact + # since it's an implementation detail. The official file + # interface is from_file(). + + if filename is None: + filename = '' + tok = dns.tokenizer.Tokenizer(text, filename) + reader = _MasterReader(tok, origin, rdclass, relativize, zone_factory, + allow_include=allow_include, + check_origin=check_origin) + reader.read() + return reader.zone + + +def from_file(f, origin=None, rdclass=dns.rdataclass.IN, + relativize=True, zone_factory=Zone, filename=None, + allow_include=True, check_origin=True): + """Read a master file and build a zone object. + + @param f: file or string. If I{f} is a string, it is treated + as the name of a file to open. + @param origin: The origin of the zone; if not specified, the first + $ORIGIN statement in the master file will determine the origin of the + zone. + @type origin: dns.name.Name object or string + @param rdclass: The zone's rdata class; the default is class IN. + @type rdclass: int + @param relativize: should names be relativized? The default is True + @type relativize: bool + @param zone_factory: The zone factory to use + @type zone_factory: function returning a Zone + @param filename: The filename to emit when describing where an error + occurred; the default is '', or the value of I{f} if I{f} is a + string. + @type filename: string + @param allow_include: is $INCLUDE allowed? + @type allow_include: bool + @param check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + @rtype: dns.zone.Zone object + """ + + str_type = string_types + opts = 'rU' + + if isinstance(f, str_type): + if filename is None: + filename = f + f = open(f, opts) + want_close = True + else: + if filename is None: + filename = '' + want_close = False + + try: + z = from_text(f, origin, rdclass, relativize, zone_factory, + filename, allow_include, check_origin) + finally: + if want_close: + f.close() + return z + + +def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True): + """Convert the output of a zone transfer generator into a zone object. + + @param xfr: The xfr generator + @type xfr: generator of dns.message.Message objects + @param relativize: should names be relativized? The default is True. + It is essential that the relativize setting matches the one specified + to dns.query.xfr(). + @type relativize: bool + @param check_origin: should sanity checks of the origin node be done? + The default is True. + @type check_origin: bool + @raises dns.zone.NoSOA: No SOA RR was found at the zone origin + @raises dns.zone.NoNS: No NS RRset was found at the zone origin + @rtype: dns.zone.Zone object + """ + + z = None + for r in xfr: + if z is None: + if relativize: + origin = r.origin + else: + origin = r.answer[0].name + rdclass = r.answer[0].rdclass + z = zone_factory(origin, rdclass, relativize=relativize) + for rrset in r.answer: + znode = z.nodes.get(rrset.name) + if not znode: + znode = z.node_factory() + z.nodes[rrset.name] = znode + zrds = znode.find_rdataset(rrset.rdclass, rrset.rdtype, + rrset.covers, True) + zrds.update_ttl(rrset.ttl) + for rd in rrset: + rd.choose_relativity(z.origin, relativize) + zrds.add(rd) + if check_origin: + z.check_origin() + return z diff --git a/Contents/Libraries/Shared/fcache/cache.py b/Contents/Libraries/Shared/fcache/cache.py index 3dc99ec71..695f916c3 100644 --- a/Contents/Libraries/Shared/fcache/cache.py +++ b/Contents/Libraries/Shared/fcache/cache.py @@ -5,10 +5,11 @@ import shutil import tempfile import traceback +import hashlib import appdirs -from scandir import scandir +from scandir import scandir, scandir_generic as _scandir_generic try: from collections.abc import MutableMapping @@ -89,7 +90,7 @@ class FileCache(MutableMapping): """ def __init__(self, appname, flag='c', mode=0o666, keyencoding='utf-8', - serialize=True, app_cache_dir=None): + serialize=True, app_cache_dir=None, key_file_ext=".txt"): """Initialize a :class:`FileCache` object.""" if not isinstance(flag, str): raise TypeError("flag must be str not '{}'".format(type(flag))) @@ -130,6 +131,7 @@ def __init__(self, appname, flag='c', mode=0o666, keyencoding='utf-8', self._mode = mode self._keyencoding = keyencoding self._serialize = serialize + self.key_file_ext = key_file_ext def _parse_appname(self, appname): """Splits an appname into the appname and subcache components.""" @@ -188,6 +190,11 @@ def sync(self): except: logger.error("Couldn't write content from %r to cache file: %r: %s", ekey, filename, traceback.format_exc()) + try: + self.__write_to_file(filename + self.key_file_ext, ekey) + except: + logger.error("Couldn't write content from %r to cache file: %r: %s", ekey, filename, + traceback.format_exc()) self._buffer.clear() self._sync = False @@ -196,8 +203,7 @@ def _closed(self, *args, **kwargs): raise ValueError("invalid operation on closed cache") def _encode_key(self, key): - """Encode key using *hex_codec* for constructing a cache filename. - + """ Keys are implicitly converted to :class:`bytes` if passed as :class:`str`. @@ -206,16 +212,15 @@ def _encode_key(self, key): key = key.encode(self._keyencoding) elif not isinstance(key, bytes): raise TypeError("key must be bytes or str") - return codecs.encode(key, 'hex_codec').decode(self._keyencoding) + return key.decode(self._keyencoding) def _decode_key(self, key): - """Decode key using hex_codec to retrieve the original key. - + """ Keys are returned as :class:`str` if serialization is enabled. Keys are returned as :class:`bytes` if serialization is disabled. """ - bkey = codecs.decode(key.encode(self._keyencoding), 'hex_codec') + bkey = key.encode(self._keyencoding) return bkey.decode(self._keyencoding) if self._serialize else bkey def _dumps(self, value): @@ -226,17 +231,24 @@ def _loads(self, value): def _key_to_filename(self, key): """Convert an encoded key to an absolute cache filename.""" - return os.path.join(self.cache_dir, key) + if isinstance(key, unicode): + key = key.encode(self._keyencoding) + return os.path.join(self.cache_dir, hashlib.md5(key).hexdigest()) def _filename_to_key(self, absfilename): """Convert an absolute cache filename to a key name.""" - return os.path.split(absfilename)[1] + hkey_hdr_fn = absfilename + self.key_file_ext + if os.path.isfile(hkey_hdr_fn): + with open(hkey_hdr_fn, 'rb') as f: + key = f.read() + return key.decode(self._keyencoding) if self._serialize else key - def _all_filenames(self): + def _all_filenames(self, scandir_generic=True): """Return a list of absolute cache filenames""" + _scandir = _scandir_generic if scandir_generic else scandir try: - for entry in scandir(self.cache_dir): - if entry.is_file(follow_symlinks=False): + for entry in _scandir(self.cache_dir): + if entry.is_file(follow_symlinks=False) and not entry.name.endswith(self.key_file_ext): yield os.path.join(self.cache_dir, entry.name) except (FileNotFoundError, OSError): raise StopIteration @@ -249,14 +261,17 @@ def _all_keys(self): else: return set(file_keys + list(self._buffer)) - def _write_to_file(self, filename, bytesvalue): + def __write_to_file(self, filename, value): """Write bytesvalue to filename.""" fh, tmp = tempfile.mkstemp() with os.fdopen(fh, self._flag) as f: - f.write(self._dumps(bytesvalue)) + f.write(value) rename(tmp, filename) os.chmod(filename, self._mode) + def _write_to_file(self, filename, bytesvalue): + self.__write_to_file(filename, self._dumps(bytesvalue)) + def _read_from_file(self, filename): """Read data from filename.""" try: @@ -273,6 +288,7 @@ def __setitem__(self, key, value): else: filename = self._key_to_filename(ekey) self._write_to_file(filename, value) + self.__write_to_file(filename + self.key_file_ext, ekey) def __getitem__(self, key): ekey = self._encode_key(key) @@ -282,8 +298,9 @@ def __getitem__(self, key): except KeyError: pass filename = self._key_to_filename(ekey) - if filename not in self._all_filenames(): + if not os.path.isfile(filename): raise KeyError(key) + return self._read_from_file(filename) def __delitem__(self, key): @@ -300,6 +317,11 @@ def __delitem__(self, key): except (IOError, OSError): pass + try: + os.remove(filename + self.key_file_ext) + except (IOError, OSError): + pass + def __iter__(self): for key in self._all_keys(): yield self._decode_key(key) @@ -309,4 +331,10 @@ def __len__(self): def __contains__(self, key): ekey = self._encode_key(key) - return ekey in self._all_keys() + if not self._sync: + try: + return ekey in self._buffer + except KeyError: + pass + filename = self._key_to_filename(ekey) + return os.path.isfile(filename) diff --git a/Contents/Libraries/Shared/idna/__init__.py b/Contents/Libraries/Shared/idna/__init__.py new file mode 100644 index 000000000..847bf9354 --- /dev/null +++ b/Contents/Libraries/Shared/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/Contents/Libraries/Shared/requests/packages/idna/codec.py b/Contents/Libraries/Shared/idna/codec.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/idna/codec.py rename to Contents/Libraries/Shared/idna/codec.py diff --git a/Contents/Libraries/Shared/requests/packages/idna/compat.py b/Contents/Libraries/Shared/idna/compat.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/idna/compat.py rename to Contents/Libraries/Shared/idna/compat.py diff --git a/Contents/Libraries/Shared/requests/packages/idna/core.py b/Contents/Libraries/Shared/idna/core.py similarity index 87% rename from Contents/Libraries/Shared/requests/packages/idna/core.py rename to Contents/Libraries/Shared/idna/core.py index ff3b38d64..090c2c18d 100644 --- a/Contents/Libraries/Shared/requests/packages/idna/core.py +++ b/Contents/Libraries/Shared/idna/core.py @@ -34,7 +34,11 @@ class InvalidCodepointContext(IDNAError): def _combining_class(cp): - return unicodedata.combining(unichr(cp)) + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v def _is_script(cp, script): return intranges_contain(ord(cp), idnadata.scripts[script]) @@ -71,7 +75,6 @@ def check_bidi(label, check_ltr=False): raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) if direction in ['R', 'AL', 'AN']: bidi_label = True - break if not bidi_label and not check_ltr: return True @@ -156,9 +159,9 @@ def valid_contextj(label, pos): ok = False for i in range(pos-1, -1, -1): joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == 'T': + if joining_type == ord('T'): continue - if joining_type in ['L', 'D']: + if joining_type in [ord('L'), ord('D')]: ok = True break @@ -168,9 +171,9 @@ def valid_contextj(label, pos): ok = False for i in range(pos+1, len(label)): joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == 'T': + if joining_type == ord('T'): continue - if joining_type in ['R', 'D']: + if joining_type in [ord('R'), ord('D')]: ok = True break return ok @@ -211,9 +214,9 @@ def valid_contexto(label, pos, exception=False): for cp in label: if cp == u'\u30fb': continue - if not _is_script(cp, 'Hiragana') and not _is_script(cp, 'Katakana') and not _is_script(cp, 'Han'): - return False - return True + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False elif 0x660 <= cp_value <= 0x669: for cp in label: @@ -244,8 +247,13 @@ def check_label(label): if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): continue elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): if not valid_contexto(label, pos): raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) @@ -261,12 +269,12 @@ def alabel(label): label = label.encode('ascii') try: ulabel(label) - except: + except IDNAError: raise IDNAError('The label {0} is not a valid A-label'.format(label)) if not valid_label_length(label): raise IDNAError('Label too long') return label - except UnicodeError: + except UnicodeEncodeError: pass if not label: @@ -288,7 +296,7 @@ def ulabel(label): if not isinstance(label, (bytes, bytearray)): try: label = label.encode('ascii') - except UnicodeError: + except UnicodeEncodeError: check_label(label) return label @@ -317,10 +325,10 @@ def uts46_remap(domain, std3_rules=True, transitional=False): replacement = uts46row[2] if len(uts46row) == 3 else None if (status == "V" or (status == "D" and not transitional) or - (status == "3" and std3_rules and replacement is None)): + (status == "3" and not std3_rules and replacement is None)): output += char elif replacement is not None and (status == "M" or - (status == "3" and std3_rules) or + (status == "3" and not std3_rules) or (status == "D" and transitional)): output += replacement elif status != "I": @@ -344,15 +352,17 @@ def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): labels = s.split('.') else: labels = _unicode_dots_re.split(s) - while labels and not labels[0]: - del labels[0] - if not labels: + if not labels or labels == ['']: raise IDNAError('Empty domain') if labels[-1] == '': del labels[-1] trailing_dot = True for label in labels: - result.append(alabel(label)) + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') if trailing_dot: result.append(b'') s = b'.'.join(result) @@ -373,15 +383,17 @@ def decode(s, strict=False, uts46=False, std3_rules=False): labels = _unicode_dots_re.split(s) else: labels = s.split(u'.') - while labels and not labels[0]: - del labels[0] - if not labels: + if not labels or labels == ['']: raise IDNAError('Empty domain') if not labels[-1]: del labels[-1] trailing_dot = True for label in labels: - result.append(ulabel(label)) + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') if trailing_dot: result.append(u'') return u'.'.join(result) diff --git a/Contents/Libraries/Shared/idna/idnadata.py b/Contents/Libraries/Shared/idna/idnadata.py new file mode 100644 index 000000000..17974e233 --- /dev/null +++ b/Contents/Libraries/Shared/idna/idnadata.py @@ -0,0 +1,1893 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "10.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009feb, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d4000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c04, + 0xc0500000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001878, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x31050000312f, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009feb, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a8fe, + 0xa9000000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111ca000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133c00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171a, + 0x1171d0001172c, + 0x117300001173a, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187ed, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/Contents/Libraries/Shared/requests/packages/idna/intranges.py b/Contents/Libraries/Shared/idna/intranges.py similarity index 76% rename from Contents/Libraries/Shared/requests/packages/idna/intranges.py rename to Contents/Libraries/Shared/idna/intranges.py index ee8a175d6..fa8a73566 100644 --- a/Contents/Libraries/Shared/requests/packages/idna/intranges.py +++ b/Contents/Libraries/Shared/idna/intranges.py @@ -11,6 +11,8 @@ def intranges_from_list(list_): """Represent a list of integers as a sequence of ranges: ((start_0, end_0), (start_1, end_1), ...), such that the original integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. """ sorted_list = sorted(list_) @@ -21,26 +23,31 @@ def intranges_from_list(list_): if sorted_list[i] == sorted_list[i+1]-1: continue current_range = sorted_list[last_write+1:i+1] - range_tuple = (current_range[0], current_range[-1] + 1) - ranges.append(range_tuple) + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) last_write = i return tuple(ranges) +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + def intranges_contain(int_, ranges): """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = (int_, int_) + tuple_ = _encode_range(int_, 0) pos = bisect.bisect_left(ranges, tuple_) # we could be immediately ahead of a tuple (start, end) # with start < int_ <= end if pos > 0: - left, right = ranges[pos-1] + left, right = _decode_range(ranges[pos-1]) if left <= int_ < right: return True # or we could be immediately behind a tuple (int_, end) if pos < len(ranges): - left, _ = ranges[pos] + left, _ = _decode_range(ranges[pos]) if left == int_: return True return False diff --git a/Contents/Libraries/Shared/idna/package_data.py b/Contents/Libraries/Shared/idna/package_data.py new file mode 100644 index 000000000..39c192bae --- /dev/null +++ b/Contents/Libraries/Shared/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.7' + diff --git a/Contents/Libraries/Shared/requests/packages/idna/uts46data.py b/Contents/Libraries/Shared/idna/uts46data.py similarity index 92% rename from Contents/Libraries/Shared/requests/packages/idna/uts46data.py rename to Contents/Libraries/Shared/idna/uts46data.py index 48da8408f..79731cb9e 100644 --- a/Contents/Libraries/Shared/requests/packages/idna/uts46data.py +++ b/Contents/Libraries/Shared/idna/uts46data.py @@ -1,9 +1,10 @@ -# This file is automatically generated by tools/build-uts46data.py +# This file is automatically generated by tools/idna-data # vim: set fileencoding=utf-8 : """IDNA Mapping Table from UTS46.""" +__version__ = "10.0.0" def _seg_0(): return [ (0x0, '3'), @@ -634,7 +635,8 @@ def _seg_6(): (0x37A, '3', u' ι'), (0x37B, 'V'), (0x37E, '3', u';'), - (0x37F, 'X'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), (0x384, '3', u' ́'), (0x385, '3', u' ̈́'), (0x386, 'M', u'ά'), @@ -729,11 +731,11 @@ def _seg_6(): (0x400, 'M', u'ѐ'), (0x401, 'M', u'ё'), (0x402, 'M', u'ђ'), - (0x403, 'M', u'ѓ'), ] def _seg_7(): return [ + (0x403, 'M', u'ѓ'), (0x404, 'M', u'є'), (0x405, 'M', u'ѕ'), (0x406, 'M', u'і'), @@ -833,11 +835,11 @@ def _seg_7(): (0x49B, 'V'), (0x49C, 'M', u'ҝ'), (0x49D, 'V'), - (0x49E, 'M', u'ҟ'), ] def _seg_8(): return [ + (0x49E, 'M', u'ҟ'), (0x49F, 'V'), (0x4A0, 'M', u'ҡ'), (0x4A1, 'V'), @@ -937,11 +939,11 @@ def _seg_8(): (0x500, 'M', u'ԁ'), (0x501, 'V'), (0x502, 'M', u'ԃ'), - (0x503, 'V'), ] def _seg_9(): return [ + (0x503, 'V'), (0x504, 'M', u'ԅ'), (0x505, 'V'), (0x506, 'M', u'ԇ'), @@ -978,7 +980,15 @@ def _seg_9(): (0x525, 'V'), (0x526, 'M', u'ԧ'), (0x527, 'V'), - (0x528, 'X'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), (0x531, 'M', u'ա'), (0x532, 'M', u'բ'), (0x533, 'M', u'գ'), @@ -1025,7 +1035,7 @@ def _seg_9(): (0x588, 'X'), (0x589, 'V'), (0x58B, 'X'), - (0x58F, 'V'), + (0x58D, 'V'), (0x590, 'X'), (0x591, 'V'), (0x5C8, 'X'), @@ -1033,6 +1043,10 @@ def _seg_9(): (0x5EB, 'X'), (0x5F0, 'V'), (0x5F5, 'X'), + ] + +def _seg_10(): + return [ (0x606, 'V'), (0x61C, 'X'), (0x61E, 'V'), @@ -1042,10 +1056,6 @@ def _seg_9(): (0x678, 'M', u'يٴ'), (0x679, 'V'), (0x6DD, 'X'), - ] - -def _seg_10(): - return [ (0x6DE, 'V'), (0x70E, 'X'), (0x710, 'V'), @@ -1062,13 +1072,15 @@ def _seg_10(): (0x85C, 'X'), (0x85E, 'V'), (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), (0x8A0, 'V'), - (0x8A1, 'X'), - (0x8A2, 'V'), - (0x8AD, 'X'), - (0x8E4, 'V'), - (0x8FF, 'X'), - (0x900, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D4, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), (0x958, 'M', u'क़'), (0x959, 'M', u'ख़'), (0x95A, 'M', u'ग़'), @@ -1078,10 +1090,6 @@ def _seg_10(): (0x95E, 'M', u'फ़'), (0x95F, 'M', u'य़'), (0x960, 'V'), - (0x978, 'X'), - (0x979, 'V'), - (0x980, 'X'), - (0x981, 'V'), (0x984, 'X'), (0x985, 'V'), (0x98D, 'X'), @@ -1110,7 +1118,7 @@ def _seg_10(): (0x9E0, 'V'), (0x9E4, 'X'), (0x9E6, 'V'), - (0x9FC, 'X'), + (0x9FE, 'X'), (0xA01, 'V'), (0xA04, 'X'), (0xA05, 'V'), @@ -1139,6 +1147,10 @@ def _seg_10(): (0xA4E, 'X'), (0xA51, 'V'), (0xA52, 'X'), + ] + +def _seg_11(): + return [ (0xA59, 'M', u'ਖ਼'), (0xA5A, 'M', u'ਗ਼'), (0xA5B, 'M', u'ਜ਼'), @@ -1146,10 +1158,6 @@ def _seg_10(): (0xA5D, 'X'), (0xA5E, 'M', u'ਫ਼'), (0xA5F, 'X'), - ] - -def _seg_11(): - return [ (0xA66, 'V'), (0xA76, 'X'), (0xA81, 'V'), @@ -1178,6 +1186,8 @@ def _seg_11(): (0xAE4, 'X'), (0xAE6, 'V'), (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), (0xB01, 'V'), (0xB04, 'X'), (0xB05, 'V'), @@ -1239,8 +1249,12 @@ def _seg_11(): (0xBD8, 'X'), (0xBE6, 'V'), (0xBFB, 'X'), - (0xC01, 'V'), + (0xC00, 'V'), (0xC04, 'X'), + ] + +def _seg_12(): + return [ (0xC05, 'V'), (0xC0D, 'X'), (0xC0E, 'V'), @@ -1248,12 +1262,6 @@ def _seg_11(): (0xC12, 'V'), (0xC29, 'X'), (0xC2A, 'V'), - (0xC34, 'X'), - (0xC35, 'V'), - ] - -def _seg_12(): - return [ (0xC3A, 'X'), (0xC3D, 'V'), (0xC45, 'X'), @@ -1264,14 +1272,12 @@ def _seg_12(): (0xC55, 'V'), (0xC57, 'X'), (0xC58, 'V'), - (0xC5A, 'X'), + (0xC5B, 'X'), (0xC60, 'V'), (0xC64, 'X'), (0xC66, 'V'), (0xC70, 'X'), (0xC78, 'V'), - (0xC80, 'X'), - (0xC82, 'V'), (0xC84, 'X'), (0xC85, 'V'), (0xC8D, 'X'), @@ -1299,27 +1305,21 @@ def _seg_12(): (0xCF0, 'X'), (0xCF1, 'V'), (0xCF3, 'X'), - (0xD02, 'V'), + (0xD00, 'V'), (0xD04, 'X'), (0xD05, 'V'), (0xD0D, 'X'), (0xD0E, 'V'), (0xD11, 'X'), (0xD12, 'V'), - (0xD3B, 'X'), - (0xD3D, 'V'), (0xD45, 'X'), (0xD46, 'V'), (0xD49, 'X'), (0xD4A, 'V'), - (0xD4F, 'X'), - (0xD57, 'V'), - (0xD58, 'X'), - (0xD60, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), (0xD64, 'X'), (0xD66, 'V'), - (0xD76, 'X'), - (0xD79, 'V'), (0xD80, 'X'), (0xD82, 'V'), (0xD84, 'X'), @@ -1341,6 +1341,8 @@ def _seg_12(): (0xDD7, 'X'), (0xDD8, 'V'), (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), (0xDF2, 'V'), (0xDF5, 'X'), (0xE01, 'V'), @@ -1353,11 +1355,11 @@ def _seg_12(): (0xE83, 'X'), (0xE84, 'V'), (0xE85, 'X'), - (0xE87, 'V'), ] def _seg_13(): return [ + (0xE87, 'V'), (0xE89, 'X'), (0xE8A, 'V'), (0xE8B, 'X'), @@ -1457,11 +1459,11 @@ def _seg_13(): (0x124E, 'X'), (0x1250, 'V'), (0x1257, 'X'), - (0x1258, 'V'), ] def _seg_14(): return [ + (0x1258, 'V'), (0x1259, 'X'), (0x125A, 'V'), (0x125E, 'X'), @@ -1492,13 +1494,20 @@ def _seg_14(): (0x1380, 'V'), (0x139A, 'X'), (0x13A0, 'V'), - (0x13F5, 'X'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), (0x1400, 'V'), (0x1680, 'X'), (0x1681, 'V'), (0x169D, 'X'), (0x16A0, 'V'), - (0x16F1, 'X'), + (0x16F9, 'X'), (0x1700, 'V'), (0x170D, 'X'), (0x170E, 'V'), @@ -1535,7 +1544,7 @@ def _seg_14(): (0x18B0, 'V'), (0x18F6, 'X'), (0x1900, 'V'), - (0x191D, 'X'), + (0x191F, 'X'), (0x1920, 'V'), (0x192C, 'X'), (0x1930, 'V'), @@ -1554,6 +1563,10 @@ def _seg_14(): (0x19DB, 'X'), (0x19DE, 'V'), (0x1A1C, 'X'), + ] + +def _seg_15(): + return [ (0x1A1E, 'V'), (0x1A5F, 'X'), (0x1A60, 'V'), @@ -1562,12 +1575,10 @@ def _seg_14(): (0x1A8A, 'X'), (0x1A90, 'V'), (0x1A9A, 'X'), - ] - -def _seg_15(): - return [ (0x1AA0, 'V'), (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), (0x1B00, 'V'), (0x1B4C, 'X'), (0x1B50, 'V'), @@ -1579,11 +1590,19 @@ def _seg_15(): (0x1C3B, 'V'), (0x1C4A, 'X'), (0x1C4D, 'V'), - (0x1C80, 'X'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), (0x1CC0, 'V'), (0x1CC8, 'X'), (0x1CD0, 'V'), - (0x1CF7, 'X'), + (0x1CFA, 'X'), (0x1D00, 'V'), (0x1D2C, 'M', u'a'), (0x1D2D, 'M', u'æ'), @@ -1648,6 +1667,10 @@ def _seg_15(): (0x1D68, 'M', u'ρ'), (0x1D69, 'M', u'φ'), (0x1D6A, 'M', u'χ'), + ] + +def _seg_16(): + return [ (0x1D6B, 'V'), (0x1D78, 'M', u'н'), (0x1D79, 'V'), @@ -1666,10 +1689,6 @@ def _seg_15(): (0x1DA7, 'M', u'ᵻ'), (0x1DA8, 'M', u'ʝ'), (0x1DA9, 'M', u'ɭ'), - ] - -def _seg_16(): - return [ (0x1DAA, 'M', u'ᶅ'), (0x1DAB, 'M', u'ʟ'), (0x1DAC, 'M', u'ɱ'), @@ -1693,8 +1712,8 @@ def _seg_16(): (0x1DBE, 'M', u'ʒ'), (0x1DBF, 'M', u'θ'), (0x1DC0, 'V'), - (0x1DE7, 'X'), - (0x1DFC, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), (0x1E00, 'M', u'ḁ'), (0x1E01, 'V'), (0x1E02, 'M', u'ḃ'), @@ -1752,6 +1771,10 @@ def _seg_16(): (0x1E36, 'M', u'ḷ'), (0x1E37, 'V'), (0x1E38, 'M', u'ḹ'), + ] + +def _seg_17(): + return [ (0x1E39, 'V'), (0x1E3A, 'M', u'ḻ'), (0x1E3B, 'V'), @@ -1770,10 +1793,6 @@ def _seg_16(): (0x1E48, 'M', u'ṉ'), (0x1E49, 'V'), (0x1E4A, 'M', u'ṋ'), - ] - -def _seg_17(): - return [ (0x1E4B, 'V'), (0x1E4C, 'M', u'ṍ'), (0x1E4D, 'V'), @@ -1856,6 +1875,10 @@ def _seg_17(): (0x1E9F, 'V'), (0x1EA0, 'M', u'ạ'), (0x1EA1, 'V'), + ] + +def _seg_18(): + return [ (0x1EA2, 'M', u'ả'), (0x1EA3, 'V'), (0x1EA4, 'M', u'ấ'), @@ -1874,10 +1897,6 @@ def _seg_17(): (0x1EB1, 'V'), (0x1EB2, 'M', u'ẳ'), (0x1EB3, 'V'), - ] - -def _seg_18(): - return [ (0x1EB4, 'M', u'ẵ'), (0x1EB5, 'V'), (0x1EB6, 'M', u'ặ'), @@ -1960,6 +1979,10 @@ def _seg_18(): (0x1F0B, 'M', u'ἃ'), (0x1F0C, 'M', u'ἄ'), (0x1F0D, 'M', u'ἅ'), + ] + +def _seg_19(): + return [ (0x1F0E, 'M', u'ἆ'), (0x1F0F, 'M', u'ἇ'), (0x1F10, 'V'), @@ -1978,10 +2001,6 @@ def _seg_18(): (0x1F2B, 'M', u'ἣ'), (0x1F2C, 'M', u'ἤ'), (0x1F2D, 'M', u'ἥ'), - ] - -def _seg_19(): - return [ (0x1F2E, 'M', u'ἦ'), (0x1F2F, 'M', u'ἧ'), (0x1F30, 'V'), @@ -2064,6 +2083,10 @@ def _seg_19(): (0x1F9A, 'M', u'ἢι'), (0x1F9B, 'M', u'ἣι'), (0x1F9C, 'M', u'ἤι'), + ] + +def _seg_20(): + return [ (0x1F9D, 'M', u'ἥι'), (0x1F9E, 'M', u'ἦι'), (0x1F9F, 'M', u'ἧι'), @@ -2082,10 +2105,6 @@ def _seg_19(): (0x1FAC, 'M', u'ὤι'), (0x1FAD, 'M', u'ὥι'), (0x1FAE, 'M', u'ὦι'), - ] - -def _seg_20(): - return [ (0x1FAF, 'M', u'ὧι'), (0x1FB0, 'V'), (0x1FB2, 'M', u'ὰι'), @@ -2168,6 +2187,10 @@ def _seg_20(): (0x2024, 'X'), (0x2027, 'V'), (0x2028, 'X'), + ] + +def _seg_21(): + return [ (0x202F, '3', u' '), (0x2030, 'V'), (0x2033, 'M', u'′′'), @@ -2186,10 +2209,6 @@ def _seg_20(): (0x204A, 'V'), (0x2057, 'M', u'′′′′'), (0x2058, 'V'), - ] - -def _seg_21(): - return [ (0x205F, '3', u' '), (0x2060, 'I'), (0x2061, 'X'), @@ -2243,7 +2262,7 @@ def _seg_21(): (0x20A0, 'V'), (0x20A8, 'M', u'rs'), (0x20A9, 'V'), - (0x20BB, 'X'), + (0x20C0, 'X'), (0x20D0, 'V'), (0x20F1, 'X'), (0x2100, '3', u'a/c'), @@ -2272,6 +2291,10 @@ def _seg_21(): (0x2120, 'M', u'sm'), (0x2121, 'M', u'tel'), (0x2122, 'M', u'tm'), + ] + +def _seg_22(): + return [ (0x2123, 'V'), (0x2124, 'M', u'z'), (0x2125, 'V'), @@ -2290,10 +2313,6 @@ def _seg_21(): (0x2133, 'M', u'm'), (0x2134, 'M', u'o'), (0x2135, 'M', u'א'), - ] - -def _seg_22(): - return [ (0x2136, 'M', u'ב'), (0x2137, 'M', u'ג'), (0x2138, 'M', u'ד'), @@ -2362,7 +2381,8 @@ def _seg_22(): (0x2183, 'X'), (0x2184, 'V'), (0x2189, 'M', u'0⁄3'), - (0x218A, 'X'), + (0x218A, 'V'), + (0x218C, 'X'), (0x2190, 'V'), (0x222C, 'M', u'∫∫'), (0x222D, 'M', u'∫∫∫'), @@ -2375,10 +2395,12 @@ def _seg_22(): (0x226E, '3'), (0x2270, 'V'), (0x2329, 'M', u'〈'), + ] + +def _seg_23(): + return [ (0x232A, 'M', u'〉'), (0x232B, 'V'), - (0x23F4, 'X'), - (0x2400, 'V'), (0x2427, 'X'), (0x2440, 'V'), (0x244B, 'X'), @@ -2394,10 +2416,6 @@ def _seg_22(): (0x2469, 'M', u'10'), (0x246A, 'M', u'11'), (0x246B, 'M', u'12'), - ] - -def _seg_23(): - return [ (0x246C, 'M', u'13'), (0x246D, 'M', u'14'), (0x246E, 'M', u'15'), @@ -2481,6 +2499,10 @@ def _seg_23(): (0x24CF, 'M', u'z'), (0x24D0, 'M', u'a'), (0x24D1, 'M', u'b'), + ] + +def _seg_24(): + return [ (0x24D2, 'M', u'c'), (0x24D3, 'M', u'd'), (0x24D4, 'M', u'e'), @@ -2498,10 +2520,6 @@ def _seg_23(): (0x24E0, 'M', u'q'), (0x24E1, 'M', u'r'), (0x24E2, 'M', u's'), - ] - -def _seg_24(): - return [ (0x24E3, 'M', u't'), (0x24E4, 'M', u'u'), (0x24E5, 'M', u'v'), @@ -2511,8 +2529,6 @@ def _seg_24(): (0x24E9, 'M', u'z'), (0x24EA, 'M', u'0'), (0x24EB, 'V'), - (0x2700, 'X'), - (0x2701, 'V'), (0x2A0C, 'M', u'∫∫∫∫'), (0x2A0D, 'V'), (0x2A74, '3', u'::='), @@ -2521,9 +2537,17 @@ def _seg_24(): (0x2A77, 'V'), (0x2ADC, 'M', u'⫝̸'), (0x2ADD, 'V'), - (0x2B4D, 'X'), - (0x2B50, 'V'), - (0x2B5A, 'X'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BBA, 'X'), + (0x2BBD, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BD3, 'X'), + (0x2BEC, 'V'), + (0x2BF0, 'X'), (0x2C00, 'M', u'ⰰ'), (0x2C01, 'M', u'ⰱ'), (0x2C02, 'M', u'ⰲ'), @@ -2579,6 +2603,10 @@ def _seg_24(): (0x2C62, 'M', u'ɫ'), (0x2C63, 'M', u'ᵽ'), (0x2C64, 'M', u'ɽ'), + ] + +def _seg_25(): + return [ (0x2C65, 'V'), (0x2C67, 'M', u'ⱨ'), (0x2C68, 'V'), @@ -2602,10 +2630,6 @@ def _seg_24(): (0x2C80, 'M', u'ⲁ'), (0x2C81, 'V'), (0x2C82, 'M', u'ⲃ'), - ] - -def _seg_25(): - return [ (0x2C83, 'V'), (0x2C84, 'M', u'ⲅ'), (0x2C85, 'V'), @@ -2683,6 +2707,10 @@ def _seg_25(): (0x2CCD, 'V'), (0x2CCE, 'M', u'ⳏ'), (0x2CCF, 'V'), + ] + +def _seg_26(): + return [ (0x2CD0, 'M', u'ⳑ'), (0x2CD1, 'V'), (0x2CD2, 'M', u'ⳓ'), @@ -2706,10 +2734,6 @@ def _seg_25(): (0x2CEB, 'M', u'ⳬ'), (0x2CEC, 'V'), (0x2CED, 'M', u'ⳮ'), - ] - -def _seg_26(): - return [ (0x2CEE, 'V'), (0x2CF2, 'M', u'ⳳ'), (0x2CF3, 'V'), @@ -2744,7 +2768,7 @@ def _seg_26(): (0x2DD8, 'V'), (0x2DDF, 'X'), (0x2DE0, 'V'), - (0x2E3C, 'X'), + (0x2E4A, 'X'), (0x2E80, 'V'), (0x2E9A, 'X'), (0x2E9B, 'V'), @@ -2787,6 +2811,10 @@ def _seg_26(): (0x2F20, 'M', u'士'), (0x2F21, 'M', u'夂'), (0x2F22, 'M', u'夊'), + ] + +def _seg_27(): + return [ (0x2F23, 'M', u'夕'), (0x2F24, 'M', u'大'), (0x2F25, 'M', u'女'), @@ -2810,10 +2838,6 @@ def _seg_26(): (0x2F37, 'M', u'弋'), (0x2F38, 'M', u'弓'), (0x2F39, 'M', u'彐'), - ] - -def _seg_27(): - return [ (0x2F3A, 'M', u'彡'), (0x2F3B, 'M', u'彳'), (0x2F3C, 'M', u'心'), @@ -2891,6 +2915,10 @@ def _seg_27(): (0x2F84, 'M', u'至'), (0x2F85, 'M', u'臼'), (0x2F86, 'M', u'舌'), + ] + +def _seg_28(): + return [ (0x2F87, 'M', u'舛'), (0x2F88, 'M', u'舟'), (0x2F89, 'M', u'艮'), @@ -2914,10 +2942,6 @@ def _seg_27(): (0x2F9B, 'M', u'走'), (0x2F9C, 'M', u'足'), (0x2F9D, 'M', u'身'), - ] - -def _seg_28(): - return [ (0x2F9E, 'M', u'車'), (0x2F9F, 'M', u'辛'), (0x2FA0, 'M', u'辰'), @@ -2995,9 +3019,13 @@ def _seg_28(): (0x309F, 'M', u'より'), (0x30A0, 'V'), (0x30FF, 'M', u'コト'), + ] + +def _seg_29(): + return [ (0x3100, 'X'), (0x3105, 'V'), - (0x312E, 'X'), + (0x312F, 'X'), (0x3131, 'M', u'ᄀ'), (0x3132, 'M', u'ᄁ'), (0x3133, 'M', u'ᆪ'), @@ -3018,10 +3046,6 @@ def _seg_28(): (0x3142, 'M', u'ᄇ'), (0x3143, 'M', u'ᄈ'), (0x3144, 'M', u'ᄡ'), - ] - -def _seg_29(): - return [ (0x3145, 'M', u'ᄉ'), (0x3146, 'M', u'ᄊ'), (0x3147, 'M', u'ᄋ'), @@ -3099,6 +3123,10 @@ def _seg_29(): (0x318F, 'X'), (0x3190, 'V'), (0x3192, 'M', u'一'), + ] + +def _seg_30(): + return [ (0x3193, 'M', u'二'), (0x3194, 'M', u'三'), (0x3195, 'M', u'四'), @@ -3122,10 +3150,6 @@ def _seg_29(): (0x3202, '3', u'(ᄃ)'), (0x3203, '3', u'(ᄅ)'), (0x3204, '3', u'(ᄆ)'), - ] - -def _seg_30(): - return [ (0x3205, '3', u'(ᄇ)'), (0x3206, '3', u'(ᄉ)'), (0x3207, '3', u'(ᄋ)'), @@ -3203,6 +3227,10 @@ def _seg_30(): (0x3256, 'M', u'26'), (0x3257, 'M', u'27'), (0x3258, 'M', u'28'), + ] + +def _seg_31(): + return [ (0x3259, 'M', u'29'), (0x325A, 'M', u'30'), (0x325B, 'M', u'31'), @@ -3226,10 +3254,6 @@ def _seg_30(): (0x326D, 'M', u'ᄒ'), (0x326E, 'M', u'가'), (0x326F, 'M', u'나'), - ] - -def _seg_31(): - return [ (0x3270, 'M', u'다'), (0x3271, 'M', u'라'), (0x3272, 'M', u'마'), @@ -3307,6 +3331,10 @@ def _seg_31(): (0x32BA, 'M', u'45'), (0x32BB, 'M', u'46'), (0x32BC, 'M', u'47'), + ] + +def _seg_32(): + return [ (0x32BD, 'M', u'48'), (0x32BE, 'M', u'49'), (0x32BF, 'M', u'50'), @@ -3330,10 +3358,6 @@ def _seg_31(): (0x32D1, 'M', u'イ'), (0x32D2, 'M', u'ウ'), (0x32D3, 'M', u'エ'), - ] - -def _seg_32(): - return [ (0x32D4, 'M', u'オ'), (0x32D5, 'M', u'カ'), (0x32D6, 'M', u'キ'), @@ -3411,6 +3435,10 @@ def _seg_32(): (0x331E, 'M', u'コーポ'), (0x331F, 'M', u'サイクル'), (0x3320, 'M', u'サンチーム'), + ] + +def _seg_33(): + return [ (0x3321, 'M', u'シリング'), (0x3322, 'M', u'センチ'), (0x3323, 'M', u'セント'), @@ -3434,10 +3462,6 @@ def _seg_32(): (0x3335, 'M', u'フラン'), (0x3336, 'M', u'ヘクタール'), (0x3337, 'M', u'ペソ'), - ] - -def _seg_33(): - return [ (0x3338, 'M', u'ペニヒ'), (0x3339, 'M', u'ヘルツ'), (0x333A, 'M', u'ペンス'), @@ -3515,6 +3539,10 @@ def _seg_33(): (0x3382, 'M', u'μa'), (0x3383, 'M', u'ma'), (0x3384, 'M', u'ka'), + ] + +def _seg_34(): + return [ (0x3385, 'M', u'kb'), (0x3386, 'M', u'mb'), (0x3387, 'M', u'gb'), @@ -3538,10 +3566,6 @@ def _seg_33(): (0x3399, 'M', u'fm'), (0x339A, 'M', u'nm'), (0x339B, 'M', u'μm'), - ] - -def _seg_34(): - return [ (0x339C, 'M', u'mm'), (0x339D, 'M', u'cm'), (0x339E, 'M', u'km'), @@ -3619,6 +3643,10 @@ def _seg_34(): (0x33E6, 'M', u'7日'), (0x33E7, 'M', u'8日'), (0x33E8, 'M', u'9日'), + ] + +def _seg_35(): + return [ (0x33E9, 'M', u'10日'), (0x33EA, 'M', u'11日'), (0x33EB, 'M', u'12日'), @@ -3642,14 +3670,10 @@ def _seg_34(): (0x33FD, 'M', u'30日'), (0x33FE, 'M', u'31日'), (0x33FF, 'M', u'gal'), - ] - -def _seg_35(): - return [ (0x3400, 'V'), (0x4DB6, 'X'), (0x4DC0, 'V'), - (0x9FCD, 'X'), + (0x9FEB, 'X'), (0xA000, 'V'), (0xA48D, 'X'), (0xA490, 'V'), @@ -3723,11 +3747,20 @@ def _seg_35(): (0xA692, 'M', u'ꚓ'), (0xA693, 'V'), (0xA694, 'M', u'ꚕ'), + ] + +def _seg_36(): + return [ (0xA695, 'V'), (0xA696, 'M', u'ꚗ'), (0xA697, 'V'), - (0xA698, 'X'), - (0xA69F, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), (0xA6F8, 'X'), (0xA700, 'V'), (0xA722, 'M', u'ꜣ'), @@ -3746,10 +3779,6 @@ def _seg_35(): (0xA72F, 'V'), (0xA732, 'M', u'ꜳ'), (0xA733, 'V'), - ] - -def _seg_36(): - return [ (0xA734, 'M', u'ꜵ'), (0xA735, 'V'), (0xA736, 'M', u'ꜷ'), @@ -3822,6 +3851,10 @@ def _seg_36(): (0xA780, 'M', u'ꞁ'), (0xA781, 'V'), (0xA782, 'M', u'ꞃ'), + ] + +def _seg_37(): + return [ (0xA783, 'V'), (0xA784, 'M', u'ꞅ'), (0xA785, 'V'), @@ -3831,12 +3864,20 @@ def _seg_36(): (0xA78C, 'V'), (0xA78D, 'M', u'ɥ'), (0xA78E, 'V'), - (0xA78F, 'X'), (0xA790, 'M', u'ꞑ'), (0xA791, 'V'), (0xA792, 'M', u'ꞓ'), (0xA793, 'V'), - (0xA794, 'X'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), (0xA7A0, 'M', u'ꞡ'), (0xA7A1, 'V'), (0xA7A2, 'M', u'ꞣ'), @@ -3848,12 +3889,22 @@ def _seg_36(): (0xA7A8, 'M', u'ꞩ'), (0xA7A9, 'V'), (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'X'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'X'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7F7, 'V'), (0xA7F8, 'M', u'ħ'), - ] - -def _seg_37(): - return [ (0xA7F9, 'M', u'œ'), (0xA7FA, 'V'), (0xA82C, 'X'), @@ -3862,11 +3913,11 @@ def _seg_37(): (0xA840, 'V'), (0xA878, 'X'), (0xA880, 'V'), - (0xA8C5, 'X'), + (0xA8C6, 'X'), (0xA8CE, 'V'), (0xA8DA, 'X'), (0xA8E0, 'V'), - (0xA8FC, 'X'), + (0xA8FE, 'X'), (0xA900, 'V'), (0xA954, 'X'), (0xA95F, 'V'), @@ -3876,7 +3927,7 @@ def _seg_37(): (0xA9CF, 'V'), (0xA9DA, 'X'), (0xA9DE, 'V'), - (0xA9E0, 'X'), + (0xA9FF, 'X'), (0xAA00, 'V'), (0xAA37, 'X'), (0xAA40, 'V'), @@ -3884,8 +3935,6 @@ def _seg_37(): (0xAA50, 'V'), (0xAA5A, 'X'), (0xAA5C, 'V'), - (0xAA7C, 'X'), - (0xAA80, 'V'), (0xAAC3, 'X'), (0xAADB, 'V'), (0xAAF7, 'X'), @@ -3899,6 +3948,97 @@ def _seg_37(): (0xAB27, 'X'), (0xAB28, 'V'), (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + ] + +def _seg_38(): + return [ + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), (0xABC0, 'V'), (0xABEE, 'X'), (0xABF0, 'V'), @@ -3919,6 +4059,10 @@ def _seg_37(): (0xF907, 'M', u'龜'), (0xF909, 'M', u'契'), (0xF90A, 'M', u'金'), + ] + +def _seg_39(): + return [ (0xF90B, 'M', u'喇'), (0xF90C, 'M', u'奈'), (0xF90D, 'M', u'懶'), @@ -3954,10 +4098,6 @@ def _seg_37(): (0xF92B, 'M', u'狼'), (0xF92C, 'M', u'郎'), (0xF92D, 'M', u'來'), - ] - -def _seg_38(): - return [ (0xF92E, 'M', u'冷'), (0xF92F, 'M', u'勞'), (0xF930, 'M', u'擄'), @@ -4023,6 +4163,10 @@ def _seg_38(): (0xF96C, 'M', u'塞'), (0xF96D, 'M', u'省'), (0xF96E, 'M', u'葉'), + ] + +def _seg_40(): + return [ (0xF96F, 'M', u'說'), (0xF970, 'M', u'殺'), (0xF971, 'M', u'辰'), @@ -4058,10 +4202,6 @@ def _seg_38(): (0xF98F, 'M', u'憐'), (0xF990, 'M', u'戀'), (0xF991, 'M', u'撚'), - ] - -def _seg_39(): - return [ (0xF992, 'M', u'漣'), (0xF993, 'M', u'煉'), (0xF994, 'M', u'璉'), @@ -4127,6 +4267,10 @@ def _seg_39(): (0xF9D0, 'M', u'類'), (0xF9D1, 'M', u'六'), (0xF9D2, 'M', u'戮'), + ] + +def _seg_41(): + return [ (0xF9D3, 'M', u'陸'), (0xF9D4, 'M', u'倫'), (0xF9D5, 'M', u'崙'), @@ -4162,10 +4306,6 @@ def _seg_39(): (0xF9F3, 'M', u'麟'), (0xF9F4, 'M', u'林'), (0xF9F5, 'M', u'淋'), - ] - -def _seg_40(): - return [ (0xF9F6, 'M', u'臨'), (0xF9F7, 'M', u'立'), (0xF9F8, 'M', u'笠'), @@ -4231,6 +4371,10 @@ def _seg_40(): (0xFA39, 'M', u'塀'), (0xFA3A, 'M', u'墨'), (0xFA3B, 'M', u'層'), + ] + +def _seg_42(): + return [ (0xFA3C, 'M', u'屮'), (0xFA3D, 'M', u'悔'), (0xFA3E, 'M', u'慨'), @@ -4266,10 +4410,6 @@ def _seg_40(): (0xFA5C, 'M', u'臭'), (0xFA5D, 'M', u'艹'), (0xFA5F, 'M', u'著'), - ] - -def _seg_41(): - return [ (0xFA60, 'M', u'褐'), (0xFA61, 'M', u'視'), (0xFA62, 'M', u'謁'), @@ -4335,6 +4475,10 @@ def _seg_41(): (0xFA9F, 'M', u'犯'), (0xFAA0, 'M', u'猪'), (0xFAA1, 'M', u'瑱'), + ] + +def _seg_43(): + return [ (0xFAA2, 'M', u'甆'), (0xFAA3, 'M', u'画'), (0xFAA4, 'M', u'瘝'), @@ -4370,10 +4514,6 @@ def _seg_41(): (0xFAC2, 'M', u'輸'), (0xFAC3, 'M', u'遲'), (0xFAC4, 'M', u'醙'), - ] - -def _seg_42(): - return [ (0xFAC5, 'M', u'鉶'), (0xFAC6, 'M', u'陼'), (0xFAC7, 'M', u'難'), @@ -4439,6 +4579,10 @@ def _seg_42(): (0xFB38, 'M', u'טּ'), (0xFB39, 'M', u'יּ'), (0xFB3A, 'M', u'ךּ'), + ] + +def _seg_44(): + return [ (0xFB3B, 'M', u'כּ'), (0xFB3C, 'M', u'לּ'), (0xFB3D, 'X'), @@ -4474,10 +4618,6 @@ def _seg_42(): (0xFB7A, 'M', u'چ'), (0xFB7E, 'M', u'ڇ'), (0xFB82, 'M', u'ڍ'), - ] - -def _seg_43(): - return [ (0xFB84, 'M', u'ڌ'), (0xFB86, 'M', u'ڎ'), (0xFB88, 'M', u'ڈ'), @@ -4543,6 +4683,10 @@ def _seg_43(): (0xFC19, 'M', u'خج'), (0xFC1A, 'M', u'خح'), (0xFC1B, 'M', u'خم'), + ] + +def _seg_45(): + return [ (0xFC1C, 'M', u'سج'), (0xFC1D, 'M', u'سح'), (0xFC1E, 'M', u'سخ'), @@ -4578,10 +4722,6 @@ def _seg_43(): (0xFC3C, 'M', u'كم'), (0xFC3D, 'M', u'كى'), (0xFC3E, 'M', u'كي'), - ] - -def _seg_44(): - return [ (0xFC3F, 'M', u'لج'), (0xFC40, 'M', u'لح'), (0xFC41, 'M', u'لخ'), @@ -4647,6 +4787,10 @@ def _seg_44(): (0xFC7D, 'M', u'في'), (0xFC7E, 'M', u'قى'), (0xFC7F, 'M', u'قي'), + ] + +def _seg_46(): + return [ (0xFC80, 'M', u'كا'), (0xFC81, 'M', u'كل'), (0xFC82, 'M', u'كم'), @@ -4682,10 +4826,6 @@ def _seg_44(): (0xFCA0, 'M', u'به'), (0xFCA1, 'M', u'تج'), (0xFCA2, 'M', u'تح'), - ] - -def _seg_45(): - return [ (0xFCA3, 'M', u'تخ'), (0xFCA4, 'M', u'تم'), (0xFCA5, 'M', u'ته'), @@ -4751,6 +4891,10 @@ def _seg_45(): (0xFCE1, 'M', u'بم'), (0xFCE2, 'M', u'به'), (0xFCE3, 'M', u'تم'), + ] + +def _seg_47(): + return [ (0xFCE4, 'M', u'ته'), (0xFCE5, 'M', u'ثم'), (0xFCE6, 'M', u'ثه'), @@ -4786,10 +4930,6 @@ def _seg_45(): (0xFD04, 'M', u'خي'), (0xFD05, 'M', u'صى'), (0xFD06, 'M', u'صي'), - ] - -def _seg_46(): - return [ (0xFD07, 'M', u'ضى'), (0xFD08, 'M', u'ضي'), (0xFD09, 'M', u'شج'), @@ -4855,6 +4995,10 @@ def _seg_46(): (0xFD57, 'M', u'تمخ'), (0xFD58, 'M', u'جمح'), (0xFD5A, 'M', u'حمي'), + ] + +def _seg_48(): + return [ (0xFD5B, 'M', u'حمى'), (0xFD5C, 'M', u'سحج'), (0xFD5D, 'M', u'سجح'), @@ -4890,10 +5034,6 @@ def _seg_46(): (0xFD87, 'M', u'لمح'), (0xFD89, 'M', u'محج'), (0xFD8A, 'M', u'محم'), - ] - -def _seg_47(): - return [ (0xFD8B, 'M', u'محي'), (0xFD8C, 'M', u'مجح'), (0xFD8D, 'M', u'مجم'), @@ -4959,6 +5099,10 @@ def _seg_47(): (0xFDF3, 'M', u'اكبر'), (0xFDF4, 'M', u'محمد'), (0xFDF5, 'M', u'صلعم'), + ] + +def _seg_49(): + return [ (0xFDF6, 'M', u'رسول'), (0xFDF7, 'M', u'عليه'), (0xFDF8, 'M', u'وسلم'), @@ -4980,7 +5124,7 @@ def _seg_47(): (0xFE18, 'M', u'〗'), (0xFE19, 'X'), (0xFE20, 'V'), - (0xFE27, 'X'), + (0xFE30, 'X'), (0xFE31, 'M', u'—'), (0xFE32, 'M', u'–'), (0xFE33, '3', u'_'), @@ -4994,10 +5138,6 @@ def _seg_47(): (0xFE3C, 'M', u'】'), (0xFE3D, 'M', u'《'), (0xFE3E, 'M', u'》'), - ] - -def _seg_48(): - return [ (0xFE3F, 'M', u'〈'), (0xFE40, 'M', u'〉'), (0xFE41, 'M', u'「'), @@ -5063,6 +5203,10 @@ def _seg_48(): (0xFE8F, 'M', u'ب'), (0xFE93, 'M', u'ة'), (0xFE95, 'M', u'ت'), + ] + +def _seg_50(): + return [ (0xFE99, 'M', u'ث'), (0xFE9D, 'M', u'ج'), (0xFEA1, 'M', u'ح'), @@ -5098,10 +5242,6 @@ def _seg_48(): (0xFF00, 'X'), (0xFF01, '3', u'!'), (0xFF02, '3', u'"'), - ] - -def _seg_49(): - return [ (0xFF03, '3', u'#'), (0xFF04, '3', u'$'), (0xFF05, '3', u'%'), @@ -5167,6 +5307,10 @@ def _seg_49(): (0xFF41, 'M', u'a'), (0xFF42, 'M', u'b'), (0xFF43, 'M', u'c'), + ] + +def _seg_51(): + return [ (0xFF44, 'M', u'd'), (0xFF45, 'M', u'e'), (0xFF46, 'M', u'f'), @@ -5202,10 +5346,6 @@ def _seg_49(): (0xFF64, 'M', u'、'), (0xFF65, 'M', u'・'), (0xFF66, 'M', u'ヲ'), - ] - -def _seg_50(): - return [ (0xFF67, 'M', u'ァ'), (0xFF68, 'M', u'ィ'), (0xFF69, 'M', u'ゥ'), @@ -5271,6 +5411,10 @@ def _seg_50(): (0xFFA5, 'M', u'ᆬ'), (0xFFA6, 'M', u'ᆭ'), (0xFFA7, 'M', u'ᄃ'), + ] + +def _seg_52(): + return [ (0xFFA8, 'M', u'ᄄ'), (0xFFA9, 'M', u'ᄅ'), (0xFFAA, 'M', u'ᆰ'), @@ -5306,10 +5450,6 @@ def _seg_50(): (0xFFCB, 'M', u'ᅨ'), (0xFFCC, 'M', u'ᅩ'), (0xFFCD, 'M', u'ᅪ'), - ] - -def _seg_51(): - return [ (0xFFCE, 'M', u'ᅫ'), (0xFFCF, 'M', u'ᅬ'), (0xFFD0, 'X'), @@ -5359,21 +5499,29 @@ def _seg_51(): (0x10107, 'V'), (0x10134, 'X'), (0x10137, 'V'), - (0x1018B, 'X'), + (0x1018F, 'X'), (0x10190, 'V'), (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), (0x101D0, 'V'), (0x101FE, 'X'), (0x10280, 'V'), (0x1029D, 'X'), (0x102A0, 'V'), (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), (0x10300, 'V'), - (0x1031F, 'X'), - (0x10320, 'V'), (0x10324, 'X'), - (0x10330, 'V'), + (0x1032D, 'V'), + ] + +def _seg_53(): + return [ (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), (0x10380, 'V'), (0x1039E, 'X'), (0x1039F, 'V'), @@ -5410,10 +5558,6 @@ def _seg_51(): (0x1041B, 'M', u'𐑃'), (0x1041C, 'M', u'𐑄'), (0x1041D, 'M', u'𐑅'), - ] - -def _seg_52(): - return [ (0x1041E, 'M', u'𐑆'), (0x1041F, 'M', u'𐑇'), (0x10420, 'M', u'𐑈'), @@ -5428,6 +5572,61 @@ def _seg_52(): (0x1049E, 'X'), (0x104A0, 'V'), (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + ] + +def _seg_54(): + return [ + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), (0x10800, 'V'), (0x10806, 'X'), (0x10808, 'V'), @@ -5441,8 +5640,14 @@ def _seg_52(): (0x1083F, 'V'), (0x10856, 'X'), (0x10857, 'V'), - (0x10860, 'X'), - (0x10900, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), (0x1091C, 'X'), (0x1091F, 'V'), (0x1093A, 'X'), @@ -5450,9 +5655,9 @@ def _seg_52(): (0x10940, 'X'), (0x10980, 'V'), (0x109B8, 'X'), - (0x109BE, 'V'), - (0x109C0, 'X'), - (0x10A00, 'V'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), (0x10A04, 'X'), (0x10A05, 'V'), (0x10A07, 'X'), @@ -5469,7 +5674,11 @@ def _seg_52(): (0x10A50, 'V'), (0x10A59, 'X'), (0x10A60, 'V'), - (0x10A80, 'X'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), (0x10B00, 'V'), (0x10B36, 'X'), (0x10B39, 'V'), @@ -5477,16 +5686,80 @@ def _seg_52(): (0x10B58, 'V'), (0x10B73, 'X'), (0x10B78, 'V'), - (0x10B80, 'X'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), (0x10C00, 'V'), (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + ] + +def _seg_55(): + return [ + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D00, 'X'), (0x10E60, 'V'), (0x10E7F, 'X'), (0x11000, 'V'), (0x1104E, 'X'), (0x11052, 'V'), (0x11070, 'X'), - (0x11080, 'V'), + (0x1107F, 'V'), (0x110BD, 'X'), (0x110BE, 'V'), (0x110C2, 'X'), @@ -5498,36 +5771,235 @@ def _seg_52(): (0x11135, 'X'), (0x11136, 'V'), (0x11144, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), (0x11180, 'V'), - (0x111C9, 'X'), + (0x111CE, 'X'), (0x111D0, 'V'), - (0x111DA, 'X'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133C, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + ] + +def _seg_56(): + return [ + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + (0x1145E, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), (0x11680, 'V'), (0x116B8, 'X'), (0x116C0, 'V'), (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171A, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11A9D, 'X'), + (0x11A9E, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + ] + +def _seg_57(): + return [ + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), (0x12000, 'V'), - (0x1236F, 'X'), + (0x1239A, 'X'), (0x12400, 'V'), - (0x12463, 'X'), + (0x1246F, 'X'), (0x12470, 'V'), - (0x12474, 'X'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), (0x13000, 'V'), (0x1342F, 'X'), - ] - -def _seg_53(): - return [ + (0x14400, 'V'), + (0x14647, 'X'), (0x16800, 'V'), (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), (0x16F00, 'V'), (0x16F45, 'X'), (0x16F50, 'V'), (0x16F7F, 'X'), (0x16F8F, 'V'), (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187ED, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), (0x1B000, 'V'), - (0x1B002, 'X'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), (0x1D000, 'V'), (0x1D0F6, 'X'), (0x1D100, 'V'), @@ -5550,7 +6022,7 @@ def _seg_53(): (0x1D1BF, 'M', u'𝆹𝅥𝅯'), (0x1D1C0, 'M', u'𝆺𝅥𝅯'), (0x1D1C1, 'V'), - (0x1D1DE, 'X'), + (0x1D1E9, 'X'), (0x1D200, 'V'), (0x1D246, 'X'), (0x1D300, 'V'), @@ -5563,6 +6035,10 @@ def _seg_53(): (0x1D403, 'M', u'd'), (0x1D404, 'M', u'e'), (0x1D405, 'M', u'f'), + ] + +def _seg_58(): + return [ (0x1D406, 'M', u'g'), (0x1D407, 'M', u'h'), (0x1D408, 'M', u'i'), @@ -5618,10 +6094,6 @@ def _seg_53(): (0x1D43A, 'M', u'g'), (0x1D43B, 'M', u'h'), (0x1D43C, 'M', u'i'), - ] - -def _seg_54(): - return [ (0x1D43D, 'M', u'j'), (0x1D43E, 'M', u'k'), (0x1D43F, 'M', u'l'), @@ -5667,6 +6139,10 @@ def _seg_54(): (0x1D467, 'M', u'z'), (0x1D468, 'M', u'a'), (0x1D469, 'M', u'b'), + ] + +def _seg_59(): + return [ (0x1D46A, 'M', u'c'), (0x1D46B, 'M', u'd'), (0x1D46C, 'M', u'e'), @@ -5722,10 +6198,6 @@ def _seg_54(): (0x1D49E, 'M', u'c'), (0x1D49F, 'M', u'd'), (0x1D4A0, 'X'), - ] - -def _seg_55(): - return [ (0x1D4A2, 'M', u'g'), (0x1D4A3, 'X'), (0x1D4A5, 'M', u'j'), @@ -5771,6 +6243,10 @@ def _seg_55(): (0x1D4CE, 'M', u'y'), (0x1D4CF, 'M', u'z'), (0x1D4D0, 'M', u'a'), + ] + +def _seg_60(): + return [ (0x1D4D1, 'M', u'b'), (0x1D4D2, 'M', u'c'), (0x1D4D3, 'M', u'd'), @@ -5826,10 +6302,6 @@ def _seg_55(): (0x1D505, 'M', u'b'), (0x1D506, 'X'), (0x1D507, 'M', u'd'), - ] - -def _seg_56(): - return [ (0x1D508, 'M', u'e'), (0x1D509, 'M', u'f'), (0x1D50A, 'M', u'g'), @@ -5875,6 +6347,10 @@ def _seg_56(): (0x1D533, 'M', u'v'), (0x1D534, 'M', u'w'), (0x1D535, 'M', u'x'), + ] + +def _seg_61(): + return [ (0x1D536, 'M', u'y'), (0x1D537, 'M', u'z'), (0x1D538, 'M', u'a'), @@ -5930,10 +6406,6 @@ def _seg_56(): (0x1D56C, 'M', u'a'), (0x1D56D, 'M', u'b'), (0x1D56E, 'M', u'c'), - ] - -def _seg_57(): - return [ (0x1D56F, 'M', u'd'), (0x1D570, 'M', u'e'), (0x1D571, 'M', u'f'), @@ -5979,6 +6451,10 @@ def _seg_57(): (0x1D599, 'M', u't'), (0x1D59A, 'M', u'u'), (0x1D59B, 'M', u'v'), + ] + +def _seg_62(): + return [ (0x1D59C, 'M', u'w'), (0x1D59D, 'M', u'x'), (0x1D59E, 'M', u'y'), @@ -6034,10 +6510,6 @@ def _seg_57(): (0x1D5D0, 'M', u'w'), (0x1D5D1, 'M', u'x'), (0x1D5D2, 'M', u'y'), - ] - -def _seg_58(): - return [ (0x1D5D3, 'M', u'z'), (0x1D5D4, 'M', u'a'), (0x1D5D5, 'M', u'b'), @@ -6083,6 +6555,10 @@ def _seg_58(): (0x1D5FD, 'M', u'p'), (0x1D5FE, 'M', u'q'), (0x1D5FF, 'M', u'r'), + ] + +def _seg_63(): + return [ (0x1D600, 'M', u's'), (0x1D601, 'M', u't'), (0x1D602, 'M', u'u'), @@ -6138,10 +6614,6 @@ def _seg_58(): (0x1D634, 'M', u's'), (0x1D635, 'M', u't'), (0x1D636, 'M', u'u'), - ] - -def _seg_59(): - return [ (0x1D637, 'M', u'v'), (0x1D638, 'M', u'w'), (0x1D639, 'M', u'x'), @@ -6187,6 +6659,10 @@ def _seg_59(): (0x1D661, 'M', u'l'), (0x1D662, 'M', u'm'), (0x1D663, 'M', u'n'), + ] + +def _seg_64(): + return [ (0x1D664, 'M', u'o'), (0x1D665, 'M', u'p'), (0x1D666, 'M', u'q'), @@ -6242,10 +6718,6 @@ def _seg_59(): (0x1D698, 'M', u'o'), (0x1D699, 'M', u'p'), (0x1D69A, 'M', u'q'), - ] - -def _seg_60(): - return [ (0x1D69B, 'M', u'r'), (0x1D69C, 'M', u's'), (0x1D69D, 'M', u't'), @@ -6291,6 +6763,10 @@ def _seg_60(): (0x1D6C6, 'M', u'ε'), (0x1D6C7, 'M', u'ζ'), (0x1D6C8, 'M', u'η'), + ] + +def _seg_65(): + return [ (0x1D6C9, 'M', u'θ'), (0x1D6CA, 'M', u'ι'), (0x1D6CB, 'M', u'κ'), @@ -6346,10 +6822,6 @@ def _seg_60(): (0x1D6FE, 'M', u'γ'), (0x1D6FF, 'M', u'δ'), (0x1D700, 'M', u'ε'), - ] - -def _seg_61(): - return [ (0x1D701, 'M', u'ζ'), (0x1D702, 'M', u'η'), (0x1D703, 'M', u'θ'), @@ -6395,6 +6867,10 @@ def _seg_61(): (0x1D72C, 'M', u'ρ'), (0x1D72D, 'M', u'θ'), (0x1D72E, 'M', u'σ'), + ] + +def _seg_66(): + return [ (0x1D72F, 'M', u'τ'), (0x1D730, 'M', u'υ'), (0x1D731, 'M', u'φ'), @@ -6450,10 +6926,6 @@ def _seg_61(): (0x1D764, 'M', u'ο'), (0x1D765, 'M', u'π'), (0x1D766, 'M', u'ρ'), - ] - -def _seg_62(): - return [ (0x1D767, 'M', u'θ'), (0x1D768, 'M', u'σ'), (0x1D769, 'M', u'τ'), @@ -6499,6 +6971,10 @@ def _seg_62(): (0x1D792, 'M', u'γ'), (0x1D793, 'M', u'δ'), (0x1D794, 'M', u'ε'), + ] + +def _seg_67(): + return [ (0x1D795, 'M', u'ζ'), (0x1D796, 'M', u'η'), (0x1D797, 'M', u'θ'), @@ -6554,10 +7030,6 @@ def _seg_62(): (0x1D7CA, 'M', u'ϝ'), (0x1D7CC, 'X'), (0x1D7CE, 'M', u'0'), - ] - -def _seg_63(): - return [ (0x1D7CF, 'M', u'1'), (0x1D7D0, 'M', u'2'), (0x1D7D1, 'M', u'3'), @@ -6603,11 +7075,74 @@ def _seg_63(): (0x1D7F9, 'M', u'3'), (0x1D7FA, 'M', u'4'), (0x1D7FB, 'M', u'5'), + ] + +def _seg_68(): + return [ (0x1D7FC, 'M', u'6'), (0x1D7FD, 'M', u'7'), (0x1D7FE, 'M', u'8'), (0x1D7FF, 'M', u'9'), - (0x1D800, 'X'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), (0x1EE00, 'M', u'ا'), (0x1EE01, 'M', u'ب'), (0x1EE02, 'M', u'ج'), @@ -6644,6 +7179,10 @@ def _seg_63(): (0x1EE21, 'M', u'ب'), (0x1EE22, 'M', u'ج'), (0x1EE23, 'X'), + ] + +def _seg_69(): + return [ (0x1EE24, 'M', u'ه'), (0x1EE25, 'X'), (0x1EE27, 'M', u'ح'), @@ -6658,10 +7197,6 @@ def _seg_63(): (0x1EE30, 'M', u'ف'), (0x1EE31, 'M', u'ص'), (0x1EE32, 'M', u'ق'), - ] - -def _seg_64(): - return [ (0x1EE33, 'X'), (0x1EE34, 'M', u'ش'), (0x1EE35, 'M', u'ت'), @@ -6748,6 +7283,10 @@ def _seg_64(): (0x1EE90, 'M', u'ف'), (0x1EE91, 'M', u'ص'), (0x1EE92, 'M', u'ق'), + ] + +def _seg_70(): + return [ (0x1EE93, 'M', u'ر'), (0x1EE94, 'M', u'ش'), (0x1EE95, 'M', u'ت'), @@ -6762,10 +7301,6 @@ def _seg_64(): (0x1EEA2, 'M', u'ج'), (0x1EEA3, 'M', u'د'), (0x1EEA4, 'X'), - ] - -def _seg_65(): - return [ (0x1EEA5, 'M', u'و'), (0x1EEA6, 'M', u'ز'), (0x1EEA7, 'M', u'ح'), @@ -6799,11 +7334,11 @@ def _seg_65(): (0x1F0A0, 'V'), (0x1F0AF, 'X'), (0x1F0B1, 'V'), - (0x1F0BF, 'X'), + (0x1F0C0, 'X'), (0x1F0C1, 'V'), (0x1F0D0, 'X'), (0x1F0D1, 'V'), - (0x1F0E0, 'X'), + (0x1F0F6, 'X'), (0x1F101, '3', u'0,'), (0x1F102, '3', u'1,'), (0x1F103, '3', u'2,'), @@ -6814,7 +7349,8 @@ def _seg_65(): (0x1F108, '3', u'7,'), (0x1F109, '3', u'8,'), (0x1F10A, '3', u'9,'), - (0x1F10B, 'X'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), (0x1F110, '3', u'(a)'), (0x1F111, '3', u'(b)'), (0x1F112, '3', u'(c)'), @@ -6851,6 +7387,10 @@ def _seg_65(): (0x1F131, 'M', u'b'), (0x1F132, 'M', u'c'), (0x1F133, 'M', u'd'), + ] + +def _seg_71(): + return [ (0x1F134, 'M', u'e'), (0x1F135, 'M', u'f'), (0x1F136, 'M', u'g'), @@ -6866,10 +7406,6 @@ def _seg_65(): (0x1F140, 'M', u'q'), (0x1F141, 'M', u'r'), (0x1F142, 'M', u's'), - ] - -def _seg_66(): - return [ (0x1F143, 'M', u't'), (0x1F144, 'M', u'u'), (0x1F145, 'M', u'v'), @@ -6890,7 +7426,7 @@ def _seg_66(): (0x1F170, 'V'), (0x1F190, 'M', u'dj'), (0x1F191, 'V'), - (0x1F19B, 'X'), + (0x1F1AD, 'X'), (0x1F1E6, 'V'), (0x1F200, 'M', u'ほか'), (0x1F201, 'M', u'ココ'), @@ -6939,7 +7475,8 @@ def _seg_66(): (0x1F238, 'M', u'申'), (0x1F239, 'M', u'割'), (0x1F23A, 'M', u'営'), - (0x1F23B, 'X'), + (0x1F23B, 'M', u'配'), + (0x1F23C, 'X'), (0x1F240, 'M', u'〔本〕'), (0x1F241, 'M', u'〔三〕'), (0x1F242, 'M', u'〔二〕'), @@ -6953,52 +7490,56 @@ def _seg_66(): (0x1F250, 'M', u'得'), (0x1F251, 'M', u'可'), (0x1F252, 'X'), - (0x1F300, 'V'), - (0x1F321, 'X'), - (0x1F330, 'V'), - (0x1F336, 'X'), - (0x1F337, 'V'), - (0x1F37D, 'X'), - (0x1F380, 'V'), - (0x1F394, 'X'), - (0x1F3A0, 'V'), - (0x1F3C5, 'X'), - (0x1F3C6, 'V'), - (0x1F3CB, 'X'), - (0x1F3E0, 'V'), - (0x1F3F1, 'X'), - (0x1F400, 'V'), - (0x1F43F, 'X'), - (0x1F440, 'V'), + (0x1F260, 'V'), ] -def _seg_67(): +def _seg_72(): return [ - (0x1F441, 'X'), - (0x1F442, 'V'), - (0x1F4F8, 'X'), - (0x1F4F9, 'V'), - (0x1F4FD, 'X'), - (0x1F500, 'V'), - (0x1F53E, 'X'), - (0x1F540, 'V'), - (0x1F544, 'X'), - (0x1F550, 'V'), - (0x1F568, 'X'), - (0x1F5FB, 'V'), - (0x1F641, 'X'), - (0x1F645, 'V'), - (0x1F650, 'X'), - (0x1F680, 'V'), - (0x1F6C6, 'X'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6F9, 'X'), (0x1F700, 'V'), (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D5, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F94D, 'X'), + (0x1F950, 'V'), + (0x1F96C, 'X'), + (0x1F980, 'V'), + (0x1F998, 'X'), + (0x1F9C0, 'V'), + (0x1F9C1, 'X'), + (0x1F9D0, 'V'), + (0x1F9E7, 'X'), (0x20000, 'V'), (0x2A6D7, 'X'), (0x2A700, 'V'), (0x2B735, 'X'), (0x2B740, 'V'), (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), (0x2F800, 'M', u'丽'), (0x2F801, 'M', u'丸'), (0x2F802, 'M', u'乁'), @@ -7054,6 +7595,10 @@ def _seg_67(): (0x2F836, 'M', u'及'), (0x2F837, 'M', u'叟'), (0x2F838, 'M', u'𠭣'), + ] + +def _seg_73(): + return [ (0x2F839, 'M', u'叫'), (0x2F83A, 'M', u'叱'), (0x2F83B, 'M', u'吆'), @@ -7074,10 +7619,6 @@ def _seg_67(): (0x2F84B, 'M', u'圖'), (0x2F84C, 'M', u'嘆'), (0x2F84D, 'M', u'圗'), - ] - -def _seg_68(): - return [ (0x2F84E, 'M', u'噑'), (0x2F84F, 'M', u'噴'), (0x2F850, 'M', u'切'), @@ -7158,6 +7699,10 @@ def _seg_68(): (0x2F89E, 'M', u'志'), (0x2F89F, 'M', u'忹'), (0x2F8A0, 'M', u'悁'), + ] + +def _seg_74(): + return [ (0x2F8A1, 'M', u'㤺'), (0x2F8A2, 'M', u'㤜'), (0x2F8A3, 'M', u'悔'), @@ -7178,10 +7723,6 @@ def _seg_68(): (0x2F8B2, 'M', u'成'), (0x2F8B3, 'M', u'戛'), (0x2F8B4, 'M', u'扝'), - ] - -def _seg_69(): - return [ (0x2F8B5, 'M', u'抱'), (0x2F8B6, 'M', u'拔'), (0x2F8B7, 'M', u'捐'), @@ -7262,6 +7803,10 @@ def _seg_69(): (0x2F902, 'M', u'流'), (0x2F903, 'M', u'浩'), (0x2F904, 'M', u'浸'), + ] + +def _seg_75(): + return [ (0x2F905, 'M', u'涅'), (0x2F906, 'M', u'𣴞'), (0x2F907, 'M', u'洴'), @@ -7282,10 +7827,6 @@ def _seg_69(): (0x2F916, 'M', u'㶖'), (0x2F917, 'M', u'灊'), (0x2F918, 'M', u'災'), - ] - -def _seg_70(): - return [ (0x2F919, 'M', u'灷'), (0x2F91A, 'M', u'炭'), (0x2F91B, 'M', u'𠔥'), @@ -7366,6 +7907,10 @@ def _seg_70(): (0x2F969, 'M', u'糣'), (0x2F96A, 'M', u'紀'), (0x2F96B, 'M', u'𥾆'), + ] + +def _seg_76(): + return [ (0x2F96C, 'M', u'絣'), (0x2F96D, 'M', u'䌁'), (0x2F96E, 'M', u'緇'), @@ -7386,10 +7931,6 @@ def _seg_70(): (0x2F97D, 'M', u'聠'), (0x2F97E, 'M', u'𦖨'), (0x2F97F, 'M', u'聰'), - ] - -def _seg_71(): - return [ (0x2F980, 'M', u'𣍟'), (0x2F981, 'M', u'䏕'), (0x2F982, 'M', u'育'), @@ -7470,6 +8011,10 @@ def _seg_71(): (0x2F9CD, 'M', u'䚾'), (0x2F9CE, 'M', u'䛇'), (0x2F9CF, 'M', u'誠'), + ] + +def _seg_77(): + return [ (0x2F9D0, 'M', u'諭'), (0x2F9D1, 'M', u'變'), (0x2F9D2, 'M', u'豕'), @@ -7490,10 +8035,6 @@ def _seg_71(): (0x2F9E1, 'M', u'𨗭'), (0x2F9E2, 'M', u'邔'), (0x2F9E3, 'M', u'郱'), - ] - -def _seg_72(): - return [ (0x2F9E4, 'M', u'鄑'), (0x2F9E5, 'M', u'𨜮'), (0x2F9E6, 'M', u'鄛'), @@ -7630,4 +8171,9 @@ def _seg_72(): + _seg_70() + _seg_71() + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() ) diff --git a/Contents/Libraries/Shared/inflect.py b/Contents/Libraries/Shared/inflect.py new file mode 100644 index 000000000..be61aa341 --- /dev/null +++ b/Contents/Libraries/Shared/inflect.py @@ -0,0 +1,3801 @@ +""" + inflect.py: correctly generate plurals, ordinals, indefinite articles; + convert numbers to words + Copyright (C) 2010 Paul Dyson + + Based upon the Perl module Lingua::EN::Inflect by Damian Conway. + + The original Perl module Lingua::EN::Inflect by Damian Conway is + available from http://search.cpan.org/~dconway/ + + This module can be downloaded at http://pypi.org/project/inflect + +methods: + classical inflect + plural plural_noun plural_verb plural_adj singular_noun no num a an + compare compare_nouns compare_verbs compare_adjs + present_participle + ordinal + number_to_words + join + defnoun defverb defadj defa defan + + INFLECTIONS: classical inflect + plural plural_noun plural_verb plural_adj singular_noun compare + no num a an present_participle + + PLURALS: classical inflect + plural plural_noun plural_verb plural_adj singular_noun no num + compare compare_nouns compare_verbs compare_adjs + + COMPARISONS: classical + compare compare_nouns compare_verbs compare_adjs + + ARTICLES: classical inflect num a an + + NUMERICAL: ordinal number_to_words + + USER_DEFINED: defnoun defverb defadj defa defan + +Exceptions: + UnknownClassicalModeError + BadNumValueError + BadChunkingOptionError + NumOutOfRangeError + BadUserDefinedPatternError + BadRcFileError + BadGenderError + +""" + +from __future__ import unicode_literals + +import ast +import sys +import re + + +class UnknownClassicalModeError(Exception): + pass + + +class BadNumValueError(Exception): + pass + + +class BadChunkingOptionError(Exception): + pass + + +class NumOutOfRangeError(Exception): + pass + + +class BadUserDefinedPatternError(Exception): + pass + + +class BadRcFileError(Exception): + pass + + +class BadGenderError(Exception): + pass + + +__version__ = "2.1.0" + + +STDOUT_ON = False + + +def print3(txt): + if STDOUT_ON: + print(txt) + + +def enclose(s): + return "(?:%s)" % s + + +def joinstem(cutpoint=0, words=""): + """ + join stem of each word in words into a string for regex + each word is truncated at cutpoint + cutpoint is usually negative indicating the number of letters to remove + from the end of each word + + e.g. + joinstem(-2, ["ephemeris", "iris", ".*itis"]) returns + (?:ephemer|ir|.*it) + + """ + return enclose("|".join(w[:cutpoint] for w in words)) + + +def bysize(words): + """ + take a list of words and return a dict of sets sorted by word length + e.g. + ret[3]=set(['ant', 'cat', 'dog', 'pig']) + ret[4]=set(['frog', 'goat']) + ret[5]=set(['horse']) + ret[8]=set(['elephant']) + """ + ret = {} + for w in words: + if len(w) not in ret: + ret[len(w)] = set() + ret[len(w)].add(w) + return ret + + +def make_pl_si_lists(lst, plending, siendingsize, dojoinstem=True): + """ + given a list of singular words: lst + an ending to append to make the plural: plending + the number of characters to remove from the singular + before appending plending: siendingsize + a flag whether to create a joinstem: dojoinstem + + return: + a list of pluralised words: si_list (called si because this is what you need to + look for to make the singular) + the pluralised words as a dict of sets sorted by word length: si_bysize + the singular words as a dict of sets sorted by word length: pl_bysize + if dojoinstem is True: a regular expression that matches any of the stems: stem + """ + if siendingsize is not None: + siendingsize = -siendingsize + si_list = [w[:siendingsize] + plending for w in lst] + pl_bysize = bysize(lst) + si_bysize = bysize(si_list) + if dojoinstem: + stem = joinstem(siendingsize, lst) + return si_list, si_bysize, pl_bysize, stem + else: + return si_list, si_bysize, pl_bysize + + +# 1. PLURALS + +pl_sb_irregular_s = { + "corpus": "corpuses|corpora", + "opus": "opuses|opera", + "genus": "genera", + "mythos": "mythoi", + "penis": "penises|penes", + "testis": "testes", + "atlas": "atlases|atlantes", + "yes": "yeses", +} + +pl_sb_irregular = { + "child": "children", + "brother": "brothers|brethren", + "loaf": "loaves", + "hoof": "hoofs|hooves", + "beef": "beefs|beeves", + "thief": "thiefs|thieves", + "money": "monies", + "mongoose": "mongooses", + "ox": "oxen", + "cow": "cows|kine", + "graffito": "graffiti", + "octopus": "octopuses|octopodes", + "genie": "genies|genii", + "ganglion": "ganglions|ganglia", + "trilby": "trilbys", + "turf": "turfs|turves", + "numen": "numina", + "atman": "atmas", + "occiput": "occiputs|occipita", + "sabretooth": "sabretooths", + "sabertooth": "sabertooths", + "lowlife": "lowlifes", + "flatfoot": "flatfoots", + "tenderfoot": "tenderfoots", + "romany": "romanies", + "jerry": "jerries", + "mary": "maries", + "talouse": "talouses", + "blouse": "blouses", + "rom": "roma", + "carmen": "carmina", +} + +pl_sb_irregular.update(pl_sb_irregular_s) +# pl_sb_irregular_keys = enclose('|'.join(pl_sb_irregular.keys())) + +pl_sb_irregular_caps = { + "Romany": "Romanies", + "Jerry": "Jerrys", + "Mary": "Marys", + "Rom": "Roma", +} + +pl_sb_irregular_compound = {"prima donna": "prima donnas|prime donne"} + +si_sb_irregular = {v: k for (k, v) in pl_sb_irregular.items()} +keys = list(si_sb_irregular.keys()) +for k in keys: + if "|" in k: + k1, k2 = k.split("|") + si_sb_irregular[k1] = si_sb_irregular[k2] = si_sb_irregular[k] + del si_sb_irregular[k] +si_sb_irregular_caps = {v: k for (k, v) in pl_sb_irregular_caps.items()} +si_sb_irregular_compound = {v: k for (k, v) in pl_sb_irregular_compound.items()} +keys = list(si_sb_irregular_compound.keys()) +for k in keys: + if "|" in k: + k1, k2 = k.split("|") + si_sb_irregular_compound[k1] = si_sb_irregular_compound[ + k2 + ] = si_sb_irregular_compound[k] + del si_sb_irregular_compound[k] + +# si_sb_irregular_keys = enclose('|'.join(si_sb_irregular.keys())) + +# Z's that don't double + +pl_sb_z_zes_list = ("quartz", "topaz") +pl_sb_z_zes_bysize = bysize(pl_sb_z_zes_list) + +pl_sb_ze_zes_list = ("snooze",) +pl_sb_ze_zes_bysize = bysize(pl_sb_ze_zes_list) + + +# CLASSICAL "..is" -> "..ides" + +pl_sb_C_is_ides_complete = [ + # GENERAL WORDS... + "ephemeris", + "iris", + "clitoris", + "chrysalis", + "epididymis", +] + +pl_sb_C_is_ides_endings = [ + # INFLAMATIONS... + "itis" +] + +pl_sb_C_is_ides = joinstem( + -2, pl_sb_C_is_ides_complete + [".*%s" % w for w in pl_sb_C_is_ides_endings] +) + +pl_sb_C_is_ides_list = pl_sb_C_is_ides_complete + pl_sb_C_is_ides_endings + +( + si_sb_C_is_ides_list, + si_sb_C_is_ides_bysize, + pl_sb_C_is_ides_bysize, +) = make_pl_si_lists(pl_sb_C_is_ides_list, "ides", 2, dojoinstem=False) + + +# CLASSICAL "..a" -> "..ata" + +pl_sb_C_a_ata_list = ( + "anathema", + "bema", + "carcinoma", + "charisma", + "diploma", + "dogma", + "drama", + "edema", + "enema", + "enigma", + "lemma", + "lymphoma", + "magma", + "melisma", + "miasma", + "oedema", + "sarcoma", + "schema", + "soma", + "stigma", + "stoma", + "trauma", + "gumma", + "pragma", +) + +( + si_sb_C_a_ata_list, + si_sb_C_a_ata_bysize, + pl_sb_C_a_ata_bysize, + pl_sb_C_a_ata, +) = make_pl_si_lists(pl_sb_C_a_ata_list, "ata", 1) + +# UNCONDITIONAL "..a" -> "..ae" + +pl_sb_U_a_ae_list = ("alumna", "alga", "vertebra", "persona") +( + si_sb_U_a_ae_list, + si_sb_U_a_ae_bysize, + pl_sb_U_a_ae_bysize, + pl_sb_U_a_ae, +) = make_pl_si_lists(pl_sb_U_a_ae_list, "e", None) + +# CLASSICAL "..a" -> "..ae" + +pl_sb_C_a_ae_list = ( + "amoeba", + "antenna", + "formula", + "hyperbola", + "medusa", + "nebula", + "parabola", + "abscissa", + "hydra", + "nova", + "lacuna", + "aurora", + "umbra", + "flora", + "fauna", +) +( + si_sb_C_a_ae_list, + si_sb_C_a_ae_bysize, + pl_sb_C_a_ae_bysize, + pl_sb_C_a_ae, +) = make_pl_si_lists(pl_sb_C_a_ae_list, "e", None) + + +# CLASSICAL "..en" -> "..ina" + +pl_sb_C_en_ina_list = ("stamen", "foramen", "lumen") + +( + si_sb_C_en_ina_list, + si_sb_C_en_ina_bysize, + pl_sb_C_en_ina_bysize, + pl_sb_C_en_ina, +) = make_pl_si_lists(pl_sb_C_en_ina_list, "ina", 2) + + +# UNCONDITIONAL "..um" -> "..a" + +pl_sb_U_um_a_list = ( + "bacterium", + "agendum", + "desideratum", + "erratum", + "stratum", + "datum", + "ovum", + "extremum", + "candelabrum", +) +( + si_sb_U_um_a_list, + si_sb_U_um_a_bysize, + pl_sb_U_um_a_bysize, + pl_sb_U_um_a, +) = make_pl_si_lists(pl_sb_U_um_a_list, "a", 2) + +# CLASSICAL "..um" -> "..a" + +pl_sb_C_um_a_list = ( + "maximum", + "minimum", + "momentum", + "optimum", + "quantum", + "cranium", + "curriculum", + "dictum", + "phylum", + "aquarium", + "compendium", + "emporium", + "enconium", + "gymnasium", + "honorarium", + "interregnum", + "lustrum", + "memorandum", + "millennium", + "rostrum", + "spectrum", + "speculum", + "stadium", + "trapezium", + "ultimatum", + "medium", + "vacuum", + "velum", + "consortium", + "arboretum", +) + +( + si_sb_C_um_a_list, + si_sb_C_um_a_bysize, + pl_sb_C_um_a_bysize, + pl_sb_C_um_a, +) = make_pl_si_lists(pl_sb_C_um_a_list, "a", 2) + + +# UNCONDITIONAL "..us" -> "i" + +pl_sb_U_us_i_list = ( + "alumnus", + "alveolus", + "bacillus", + "bronchus", + "locus", + "nucleus", + "stimulus", + "meniscus", + "sarcophagus", +) +( + si_sb_U_us_i_list, + si_sb_U_us_i_bysize, + pl_sb_U_us_i_bysize, + pl_sb_U_us_i, +) = make_pl_si_lists(pl_sb_U_us_i_list, "i", 2) + +# CLASSICAL "..us" -> "..i" + +pl_sb_C_us_i_list = ( + "focus", + "radius", + "genius", + "incubus", + "succubus", + "nimbus", + "fungus", + "nucleolus", + "stylus", + "torus", + "umbilicus", + "uterus", + "hippopotamus", + "cactus", +) + +( + si_sb_C_us_i_list, + si_sb_C_us_i_bysize, + pl_sb_C_us_i_bysize, + pl_sb_C_us_i, +) = make_pl_si_lists(pl_sb_C_us_i_list, "i", 2) + + +# CLASSICAL "..us" -> "..us" (ASSIMILATED 4TH DECLENSION LATIN NOUNS) + +pl_sb_C_us_us = ( + "status", + "apparatus", + "prospectus", + "sinus", + "hiatus", + "impetus", + "plexus", +) +pl_sb_C_us_us_bysize = bysize(pl_sb_C_us_us) + +# UNCONDITIONAL "..on" -> "a" + +pl_sb_U_on_a_list = ( + "criterion", + "perihelion", + "aphelion", + "phenomenon", + "prolegomenon", + "noumenon", + "organon", + "asyndeton", + "hyperbaton", +) +( + si_sb_U_on_a_list, + si_sb_U_on_a_bysize, + pl_sb_U_on_a_bysize, + pl_sb_U_on_a, +) = make_pl_si_lists(pl_sb_U_on_a_list, "a", 2) + +# CLASSICAL "..on" -> "..a" + +pl_sb_C_on_a_list = ("oxymoron",) + +( + si_sb_C_on_a_list, + si_sb_C_on_a_bysize, + pl_sb_C_on_a_bysize, + pl_sb_C_on_a, +) = make_pl_si_lists(pl_sb_C_on_a_list, "a", 2) + + +# CLASSICAL "..o" -> "..i" (BUT NORMALLY -> "..os") + +pl_sb_C_o_i = [ + "solo", + "soprano", + "basso", + "alto", + "contralto", + "tempo", + "piano", + "virtuoso", +] # list not tuple so can concat for pl_sb_U_o_os + +pl_sb_C_o_i_bysize = bysize(pl_sb_C_o_i) +si_sb_C_o_i_bysize = bysize(["%si" % w[:-1] for w in pl_sb_C_o_i]) + +pl_sb_C_o_i_stems = joinstem(-1, pl_sb_C_o_i) + +# ALWAYS "..o" -> "..os" + +pl_sb_U_o_os_complete = {"ado", "ISO", "NATO", "NCO", "NGO", "oto"} +si_sb_U_o_os_complete = {"%ss" % w for w in pl_sb_U_o_os_complete} + + +pl_sb_U_o_os_endings = [ + "aficionado", + "aggro", + "albino", + "allegro", + "ammo", + "Antananarivo", + "archipelago", + "armadillo", + "auto", + "avocado", + "Bamako", + "Barquisimeto", + "bimbo", + "bingo", + "Biro", + "bolero", + "Bolzano", + "bongo", + "Boto", + "burro", + "Cairo", + "canto", + "cappuccino", + "casino", + "cello", + "Chicago", + "Chimango", + "cilantro", + "cochito", + "coco", + "Colombo", + "Colorado", + "commando", + "concertino", + "contango", + "credo", + "crescendo", + "cyano", + "demo", + "ditto", + "Draco", + "dynamo", + "embryo", + "Esperanto", + "espresso", + "euro", + "falsetto", + "Faro", + "fiasco", + "Filipino", + "flamenco", + "furioso", + "generalissimo", + "Gestapo", + "ghetto", + "gigolo", + "gizmo", + "Greensboro", + "gringo", + "Guaiabero", + "guano", + "gumbo", + "gyro", + "hairdo", + "hippo", + "Idaho", + "impetigo", + "inferno", + "info", + "intermezzo", + "intertrigo", + "Iquico", + "jumbo", + "junto", + "Kakapo", + "kilo", + "Kinkimavo", + "Kokako", + "Kosovo", + "Lesotho", + "libero", + "libido", + "libretto", + "lido", + "Lilo", + "limbo", + "limo", + "lineno", + "lingo", + "lino", + "livedo", + "loco", + "logo", + "lumbago", + "macho", + "macro", + "mafioso", + "magneto", + "magnifico", + "Majuro", + "Malabo", + "manifesto", + "Maputo", + "Maracaibo", + "medico", + "memo", + "metro", + "Mexico", + "micro", + "Milano", + "Monaco", + "mono", + "Montenegro", + "Morocco", + "Muqdisho", + "myo", + "neutrino", + "Ningbo", + "octavo", + "oregano", + "Orinoco", + "Orlando", + "Oslo", + "panto", + "Paramaribo", + "Pardusco", + "pedalo", + "photo", + "pimento", + "pinto", + "pleco", + "Pluto", + "pogo", + "polo", + "poncho", + "Porto-Novo", + "Porto", + "pro", + "psycho", + "pueblo", + "quarto", + "Quito", + "rhino", + "risotto", + "rococo", + "rondo", + "Sacramento", + "saddo", + "sago", + "salvo", + "Santiago", + "Sapporo", + "Sarajevo", + "scherzando", + "scherzo", + "silo", + "sirocco", + "sombrero", + "staccato", + "sterno", + "stucco", + "stylo", + "sumo", + "Taiko", + "techno", + "terrazzo", + "testudo", + "timpano", + "tiro", + "tobacco", + "Togo", + "Tokyo", + "torero", + "Torino", + "Toronto", + "torso", + "tremolo", + "typo", + "tyro", + "ufo", + "UNESCO", + "vaquero", + "vermicello", + "verso", + "vibrato", + "violoncello", + "Virgo", + "weirdo", + "WHO", + "WTO", + "Yamoussoukro", + "yo-yo", + "zero", + "Zibo", +] + pl_sb_C_o_i + +pl_sb_U_o_os_bysize = bysize(pl_sb_U_o_os_endings) +si_sb_U_o_os_bysize = bysize(["%ss" % w for w in pl_sb_U_o_os_endings]) + + +# UNCONDITIONAL "..ch" -> "..chs" + +pl_sb_U_ch_chs_list = ("czech", "eunuch", "stomach") + +( + si_sb_U_ch_chs_list, + si_sb_U_ch_chs_bysize, + pl_sb_U_ch_chs_bysize, + pl_sb_U_ch_chs, +) = make_pl_si_lists(pl_sb_U_ch_chs_list, "s", None) + + +# UNCONDITIONAL "..[ei]x" -> "..ices" + +pl_sb_U_ex_ices_list = ("codex", "murex", "silex") +( + si_sb_U_ex_ices_list, + si_sb_U_ex_ices_bysize, + pl_sb_U_ex_ices_bysize, + pl_sb_U_ex_ices, +) = make_pl_si_lists(pl_sb_U_ex_ices_list, "ices", 2) + +pl_sb_U_ix_ices_list = ("radix", "helix") +( + si_sb_U_ix_ices_list, + si_sb_U_ix_ices_bysize, + pl_sb_U_ix_ices_bysize, + pl_sb_U_ix_ices, +) = make_pl_si_lists(pl_sb_U_ix_ices_list, "ices", 2) + +# CLASSICAL "..[ei]x" -> "..ices" + +pl_sb_C_ex_ices_list = ( + "vortex", + "vertex", + "cortex", + "latex", + "pontifex", + "apex", + "index", + "simplex", +) + +( + si_sb_C_ex_ices_list, + si_sb_C_ex_ices_bysize, + pl_sb_C_ex_ices_bysize, + pl_sb_C_ex_ices, +) = make_pl_si_lists(pl_sb_C_ex_ices_list, "ices", 2) + + +pl_sb_C_ix_ices_list = ("appendix",) + +( + si_sb_C_ix_ices_list, + si_sb_C_ix_ices_bysize, + pl_sb_C_ix_ices_bysize, + pl_sb_C_ix_ices, +) = make_pl_si_lists(pl_sb_C_ix_ices_list, "ices", 2) + + +# ARABIC: ".." -> "..i" + +pl_sb_C_i_list = ("afrit", "afreet", "efreet") + +(si_sb_C_i_list, si_sb_C_i_bysize, pl_sb_C_i_bysize, pl_sb_C_i) = make_pl_si_lists( + pl_sb_C_i_list, "i", None +) + + +# HEBREW: ".." -> "..im" + +pl_sb_C_im_list = ("goy", "seraph", "cherub") + +(si_sb_C_im_list, si_sb_C_im_bysize, pl_sb_C_im_bysize, pl_sb_C_im) = make_pl_si_lists( + pl_sb_C_im_list, "im", None +) + + +# UNCONDITIONAL "..man" -> "..mans" + +pl_sb_U_man_mans_list = """ + ataman caiman cayman ceriman + desman dolman farman harman hetman + human leman ottoman shaman talisman +""".split() +pl_sb_U_man_mans_caps_list = """ + Alabaman Bahaman Burman German + Hiroshiman Liman Nakayaman Norman Oklahoman + Panaman Roman Selman Sonaman Tacoman Yakiman + Yokohaman Yuman +""".split() + +( + si_sb_U_man_mans_list, + si_sb_U_man_mans_bysize, + pl_sb_U_man_mans_bysize, +) = make_pl_si_lists(pl_sb_U_man_mans_list, "s", None, dojoinstem=False) +( + si_sb_U_man_mans_caps_list, + si_sb_U_man_mans_caps_bysize, + pl_sb_U_man_mans_caps_bysize, +) = make_pl_si_lists(pl_sb_U_man_mans_caps_list, "s", None, dojoinstem=False) + + +pl_sb_uninflected_s_complete = [ + # PAIRS OR GROUPS SUBSUMED TO A SINGULAR... + "breeches", + "britches", + "pajamas", + "pyjamas", + "clippers", + "gallows", + "hijinks", + "headquarters", + "pliers", + "scissors", + "testes", + "herpes", + "pincers", + "shears", + "proceedings", + "trousers", + # UNASSIMILATED LATIN 4th DECLENSION + "cantus", + "coitus", + "nexus", + # RECENT IMPORTS... + "contretemps", + "corps", + "debris", + "siemens", + # DISEASES + "mumps", + # MISCELLANEOUS OTHERS... + "diabetes", + "jackanapes", + "series", + "species", + "subspecies", + "rabies", + "chassis", + "innings", + "news", + "mews", + "haggis", +] + +pl_sb_uninflected_s_endings = [ + # RECENT IMPORTS... + "ois", + # DISEASES + "measles", +] + +pl_sb_uninflected_s = pl_sb_uninflected_s_complete + [ + ".*%s" % w for w in pl_sb_uninflected_s_endings +] + +pl_sb_uninflected_herd = ( + # DON'T INFLECT IN CLASSICAL MODE, OTHERWISE NORMAL INFLECTION + "wildebeest", + "swine", + "eland", + "bison", + "buffalo", + "elk", + "rhinoceros", + "zucchini", + "caribou", + "dace", + "grouse", + "guinea fowl", + "guinea-fowl", + "haddock", + "hake", + "halibut", + "herring", + "mackerel", + "pickerel", + "pike", + "roe", + "seed", + "shad", + "snipe", + "teal", + "turbot", + "water fowl", + "water-fowl", +) + +pl_sb_uninflected_complete = [ + # SOME FISH AND HERD ANIMALS + "tuna", + "salmon", + "mackerel", + "trout", + "bream", + "sea-bass", + "sea bass", + "carp", + "cod", + "flounder", + "whiting", + "moose", + # OTHER ODDITIES + "graffiti", + "djinn", + "samuri", + "offspring", + "pence", + "quid", + "hertz", +] + pl_sb_uninflected_s_complete +# SOME WORDS ENDING IN ...s (OFTEN PAIRS TAKEN AS A WHOLE) + +pl_sb_uninflected_caps = [ + # ALL NATIONALS ENDING IN -ese + "Portuguese", + "Amoyese", + "Borghese", + "Congoese", + "Faroese", + "Foochowese", + "Genevese", + "Genoese", + "Gilbertese", + "Hottentotese", + "Kiplingese", + "Kongoese", + "Lucchese", + "Maltese", + "Nankingese", + "Niasese", + "Pekingese", + "Piedmontese", + "Pistoiese", + "Sarawakese", + "Shavese", + "Vermontese", + "Wenchowese", + "Yengeese", +] + + +pl_sb_uninflected_endings = [ + # SOME FISH AND HERD ANIMALS + "fish", + "deer", + "sheep", + # ALL NATIONALS ENDING IN -ese + "nese", + "rese", + "lese", + "mese", + # DISEASES + "pox", + # OTHER ODDITIES + "craft", +] + pl_sb_uninflected_s_endings +# SOME WORDS ENDING IN ...s (OFTEN PAIRS TAKEN AS A WHOLE) + + +pl_sb_uninflected_bysize = bysize(pl_sb_uninflected_endings) + + +# SINGULAR WORDS ENDING IN ...s (ALL INFLECT WITH ...es) + +pl_sb_singular_s_complete = [ + "acropolis", + "aegis", + "alias", + "asbestos", + "bathos", + "bias", + "bronchitis", + "bursitis", + "caddis", + "cannabis", + "canvas", + "chaos", + "cosmos", + "dais", + "digitalis", + "epidermis", + "ethos", + "eyas", + "gas", + "glottis", + "hubris", + "ibis", + "lens", + "mantis", + "marquis", + "metropolis", + "pathos", + "pelvis", + "polis", + "rhinoceros", + "sassafras", + "trellis", +] + pl_sb_C_is_ides_complete + + +pl_sb_singular_s_endings = ["ss", "us"] + pl_sb_C_is_ides_endings + +pl_sb_singular_s_bysize = bysize(pl_sb_singular_s_endings) + +si_sb_singular_s_complete = ["%ses" % w for w in pl_sb_singular_s_complete] +si_sb_singular_s_endings = ["%ses" % w for w in pl_sb_singular_s_endings] +si_sb_singular_s_bysize = bysize(si_sb_singular_s_endings) + +pl_sb_singular_s_es = ["[A-Z].*es"] + +pl_sb_singular_s = enclose( + "|".join( + pl_sb_singular_s_complete + + [".*%s" % w for w in pl_sb_singular_s_endings] + + pl_sb_singular_s_es + ) +) + + +# PLURALS ENDING IN uses -> use + + +si_sb_ois_oi_case = ("Bolshois", "Hanois") + +si_sb_uses_use_case = ("Betelgeuses", "Duses", "Meuses", "Syracuses", "Toulouses") + +si_sb_uses_use = ( + "abuses", + "applauses", + "blouses", + "carouses", + "causes", + "chartreuses", + "clauses", + "contuses", + "douses", + "excuses", + "fuses", + "grouses", + "hypotenuses", + "masseuses", + "menopauses", + "misuses", + "muses", + "overuses", + "pauses", + "peruses", + "profuses", + "recluses", + "reuses", + "ruses", + "souses", + "spouses", + "suffuses", + "transfuses", + "uses", +) + +si_sb_ies_ie_case = ( + "Addies", + "Aggies", + "Allies", + "Amies", + "Angies", + "Annies", + "Annmaries", + "Archies", + "Arties", + "Aussies", + "Barbies", + "Barries", + "Basies", + "Bennies", + "Bernies", + "Berties", + "Bessies", + "Betties", + "Billies", + "Blondies", + "Bobbies", + "Bonnies", + "Bowies", + "Brandies", + "Bries", + "Brownies", + "Callies", + "Carnegies", + "Carries", + "Cassies", + "Charlies", + "Cheries", + "Christies", + "Connies", + "Curies", + "Dannies", + "Debbies", + "Dixies", + "Dollies", + "Donnies", + "Drambuies", + "Eddies", + "Effies", + "Ellies", + "Elsies", + "Eries", + "Ernies", + "Essies", + "Eugenies", + "Fannies", + "Flossies", + "Frankies", + "Freddies", + "Gillespies", + "Goldies", + "Gracies", + "Guthries", + "Hallies", + "Hatties", + "Hetties", + "Hollies", + "Jackies", + "Jamies", + "Janies", + "Jannies", + "Jeanies", + "Jeannies", + "Jennies", + "Jessies", + "Jimmies", + "Jodies", + "Johnies", + "Johnnies", + "Josies", + "Julies", + "Kalgoorlies", + "Kathies", + "Katies", + "Kellies", + "Kewpies", + "Kristies", + "Laramies", + "Lassies", + "Lauries", + "Leslies", + "Lessies", + "Lillies", + "Lizzies", + "Lonnies", + "Lories", + "Lorries", + "Lotties", + "Louies", + "Mackenzies", + "Maggies", + "Maisies", + "Mamies", + "Marcies", + "Margies", + "Maries", + "Marjories", + "Matties", + "McKenzies", + "Melanies", + "Mickies", + "Millies", + "Minnies", + "Mollies", + "Mounties", + "Nannies", + "Natalies", + "Nellies", + "Netties", + "Ollies", + "Ozzies", + "Pearlies", + "Pottawatomies", + "Reggies", + "Richies", + "Rickies", + "Robbies", + "Ronnies", + "Rosalies", + "Rosemaries", + "Rosies", + "Roxies", + "Rushdies", + "Ruthies", + "Sadies", + "Sallies", + "Sammies", + "Scotties", + "Selassies", + "Sherries", + "Sophies", + "Stacies", + "Stefanies", + "Stephanies", + "Stevies", + "Susies", + "Sylvies", + "Tammies", + "Terries", + "Tessies", + "Tommies", + "Tracies", + "Trekkies", + "Valaries", + "Valeries", + "Valkyries", + "Vickies", + "Virgies", + "Willies", + "Winnies", + "Wylies", + "Yorkies", +) + +si_sb_ies_ie = ( + "aeries", + "baggies", + "belies", + "biggies", + "birdies", + "bogies", + "bonnies", + "boogies", + "bookies", + "bourgeoisies", + "brownies", + "budgies", + "caddies", + "calories", + "camaraderies", + "cockamamies", + "collies", + "cookies", + "coolies", + "cooties", + "coteries", + "crappies", + "curies", + "cutesies", + "dogies", + "eyrie", + "floozies", + "footsies", + "freebies", + "genies", + "goalies", + "groupies", + "hies", + "jalousies", + "junkies", + "kiddies", + "laddies", + "lassies", + "lies", + "lingeries", + "magpies", + "menageries", + "mommies", + "movies", + "neckties", + "newbies", + "nighties", + "oldies", + "organdies", + "overlies", + "pies", + "pinkies", + "pixies", + "potpies", + "prairies", + "quickies", + "reveries", + "rookies", + "rotisseries", + "softies", + "sorties", + "species", + "stymies", + "sweeties", + "ties", + "underlies", + "unties", + "veggies", + "vies", + "yuppies", + "zombies", +) + + +si_sb_oes_oe_case = ( + "Chloes", + "Crusoes", + "Defoes", + "Faeroes", + "Ivanhoes", + "Joes", + "McEnroes", + "Moes", + "Monroes", + "Noes", + "Poes", + "Roscoes", + "Tahoes", + "Tippecanoes", + "Zoes", +) + +si_sb_oes_oe = ( + "aloes", + "backhoes", + "canoes", + "does", + "floes", + "foes", + "hoes", + "mistletoes", + "oboes", + "pekoes", + "roes", + "sloes", + "throes", + "tiptoes", + "toes", + "woes", +) + +si_sb_z_zes = ("quartzes", "topazes") + +si_sb_zzes_zz = ("buzzes", "fizzes", "frizzes", "razzes") + +si_sb_ches_che_case = ( + "Andromaches", + "Apaches", + "Blanches", + "Comanches", + "Nietzsches", + "Porsches", + "Roches", +) + +si_sb_ches_che = ( + "aches", + "avalanches", + "backaches", + "bellyaches", + "caches", + "cloches", + "creches", + "douches", + "earaches", + "fiches", + "headaches", + "heartaches", + "microfiches", + "niches", + "pastiches", + "psyches", + "quiches", + "stomachaches", + "toothaches", +) + +si_sb_xes_xe = ("annexes", "axes", "deluxes", "pickaxes") + +si_sb_sses_sse_case = ("Hesses", "Jesses", "Larousses", "Matisses") +si_sb_sses_sse = ( + "bouillabaisses", + "crevasses", + "demitasses", + "impasses", + "mousses", + "posses", +) + +si_sb_ves_ve_case = ( + # *[nwl]ives -> [nwl]live + "Clives", + "Palmolives", +) +si_sb_ves_ve = ( + # *[^d]eaves -> eave + "interweaves", + "weaves", + # *[nwl]ives -> [nwl]live + "olives", + # *[eoa]lves -> [eoa]lve + "bivalves", + "dissolves", + "resolves", + "salves", + "twelves", + "valves", +) + + +plverb_special_s = enclose( + "|".join( + [pl_sb_singular_s] + + pl_sb_uninflected_s + + list(pl_sb_irregular_s.keys()) + + ["(.*[csx])is", "(.*)ceps", "[A-Z].*s"] + ) +) + +pl_sb_postfix_adj = { + "general": [r"(?!major|lieutenant|brigadier|adjutant|.*star)\S+"], + "martial": ["court"], + "force": ["pound"], +} + +for k in list(pl_sb_postfix_adj.keys()): + pl_sb_postfix_adj[k] = enclose( + enclose("|".join(pl_sb_postfix_adj[k])) + "(?=(?:-|\\s+)%s)" % k + ) + +pl_sb_postfix_adj_stems = "(" + "|".join(list(pl_sb_postfix_adj.values())) + ")(.*)" + + +# PLURAL WORDS ENDING IS es GO TO SINGULAR is + +si_sb_es_is = ( + "amanuenses", + "amniocenteses", + "analyses", + "antitheses", + "apotheoses", + "arterioscleroses", + "atheroscleroses", + "axes", + # 'bases', # bases -> basis + "catalyses", + "catharses", + "chasses", + "cirrhoses", + "cocces", + "crises", + "diagnoses", + "dialyses", + "diereses", + "electrolyses", + "emphases", + "exegeses", + "geneses", + "halitoses", + "hydrolyses", + "hypnoses", + "hypotheses", + "hystereses", + "metamorphoses", + "metastases", + "misdiagnoses", + "mitoses", + "mononucleoses", + "narcoses", + "necroses", + "nemeses", + "neuroses", + "oases", + "osmoses", + "osteoporoses", + "paralyses", + "parentheses", + "parthenogeneses", + "periphrases", + "photosyntheses", + "probosces", + "prognoses", + "prophylaxes", + "prostheses", + "preces", + "psoriases", + "psychoanalyses", + "psychokineses", + "psychoses", + "scleroses", + "scolioses", + "sepses", + "silicoses", + "symbioses", + "synopses", + "syntheses", + "taxes", + "telekineses", + "theses", + "thromboses", + "tuberculoses", + "urinalyses", +) + +pl_prep_list = """ + about above across after among around at athwart before behind + below beneath beside besides between betwixt beyond but by + during except for from in into near of off on onto out over + since till to under until unto upon with""".split() + +pl_prep_list_da = pl_prep_list + ["de", "du", "da"] + +pl_prep_bysize = bysize(pl_prep_list_da) + +pl_prep = enclose("|".join(pl_prep_list_da)) + +pl_sb_prep_dual_compound = ( + r"(.*?)((?:-|\s+)(?:" + pl_prep + r")(?:-|\s+))a(?:-|\s+)(.*)" +) + + +singular_pronoun_genders = { + "neuter", + "feminine", + "masculine", + "gender-neutral", + "feminine or masculine", + "masculine or feminine", +} + +pl_pron_nom = { + # NOMINATIVE REFLEXIVE + "i": "we", + "myself": "ourselves", + "you": "you", + "yourself": "yourselves", + "she": "they", + "herself": "themselves", + "he": "they", + "himself": "themselves", + "it": "they", + "itself": "themselves", + "they": "they", + "themself": "themselves", + # POSSESSIVE + "mine": "ours", + "yours": "yours", + "hers": "theirs", + "his": "theirs", + "its": "theirs", + "theirs": "theirs", +} + +si_pron = {} +si_pron["nom"] = {v: k for (k, v) in pl_pron_nom.items()} +si_pron["nom"]["we"] = "I" + + +pl_pron_acc = { + # ACCUSATIVE REFLEXIVE + "me": "us", + "myself": "ourselves", + "you": "you", + "yourself": "yourselves", + "her": "them", + "herself": "themselves", + "him": "them", + "himself": "themselves", + "it": "them", + "itself": "themselves", + "them": "them", + "themself": "themselves", +} + +pl_pron_acc_keys = enclose("|".join(list(pl_pron_acc.keys()))) +pl_pron_acc_keys_bysize = bysize(list(pl_pron_acc.keys())) + +si_pron["acc"] = {v: k for (k, v) in pl_pron_acc.items()} + +for thecase, plur, gend, sing in ( + ("nom", "they", "neuter", "it"), + ("nom", "they", "feminine", "she"), + ("nom", "they", "masculine", "he"), + ("nom", "they", "gender-neutral", "they"), + ("nom", "they", "feminine or masculine", "she or he"), + ("nom", "they", "masculine or feminine", "he or she"), + ("nom", "themselves", "neuter", "itself"), + ("nom", "themselves", "feminine", "herself"), + ("nom", "themselves", "masculine", "himself"), + ("nom", "themselves", "gender-neutral", "themself"), + ("nom", "themselves", "feminine or masculine", "herself or himself"), + ("nom", "themselves", "masculine or feminine", "himself or herself"), + ("nom", "theirs", "neuter", "its"), + ("nom", "theirs", "feminine", "hers"), + ("nom", "theirs", "masculine", "his"), + ("nom", "theirs", "gender-neutral", "theirs"), + ("nom", "theirs", "feminine or masculine", "hers or his"), + ("nom", "theirs", "masculine or feminine", "his or hers"), + ("acc", "them", "neuter", "it"), + ("acc", "them", "feminine", "her"), + ("acc", "them", "masculine", "him"), + ("acc", "them", "gender-neutral", "them"), + ("acc", "them", "feminine or masculine", "her or him"), + ("acc", "them", "masculine or feminine", "him or her"), + ("acc", "themselves", "neuter", "itself"), + ("acc", "themselves", "feminine", "herself"), + ("acc", "themselves", "masculine", "himself"), + ("acc", "themselves", "gender-neutral", "themself"), + ("acc", "themselves", "feminine or masculine", "herself or himself"), + ("acc", "themselves", "masculine or feminine", "himself or herself"), +): + try: + si_pron[thecase][plur][gend] = sing + except TypeError: + si_pron[thecase][plur] = {} + si_pron[thecase][plur][gend] = sing + + +si_pron_acc_keys = enclose("|".join(list(si_pron["acc"].keys()))) +si_pron_acc_keys_bysize = bysize(list(si_pron["acc"].keys())) + + +def get_si_pron(thecase, word, gender): + try: + sing = si_pron[thecase][word] + except KeyError: + raise # not a pronoun + try: + return sing[gender] # has several types due to gender + except TypeError: + return sing # answer independent of gender + + +plverb_irregular_pres = { + # 1st PERS. SING. 2ND PERS. SING. 3RD PERS. SINGULAR + # 3RD PERS. (INDET.) + "am": "are", + "are": "are", + "is": "are", + "was": "were", + "were": "were", + "was": "were", + "have": "have", + "have": "have", + "has": "have", + "do": "do", + "do": "do", + "does": "do", +} + +plverb_ambiguous_pres = { + # 1st PERS. SING. 2ND PERS. SING. 3RD PERS. SINGULAR + # 3RD PERS. (INDET.) + "act": "act", + "act": "act", + "acts": "act", + "blame": "blame", + "blame": "blame", + "blames": "blame", + "can": "can", + "can": "can", + "can": "can", + "must": "must", + "must": "must", + "must": "must", + "fly": "fly", + "fly": "fly", + "flies": "fly", + "copy": "copy", + "copy": "copy", + "copies": "copy", + "drink": "drink", + "drink": "drink", + "drinks": "drink", + "fight": "fight", + "fight": "fight", + "fights": "fight", + "fire": "fire", + "fire": "fire", + "fires": "fire", + "like": "like", + "like": "like", + "likes": "like", + "look": "look", + "look": "look", + "looks": "look", + "make": "make", + "make": "make", + "makes": "make", + "reach": "reach", + "reach": "reach", + "reaches": "reach", + "run": "run", + "run": "run", + "runs": "run", + "sink": "sink", + "sink": "sink", + "sinks": "sink", + "sleep": "sleep", + "sleep": "sleep", + "sleeps": "sleep", + "view": "view", + "view": "view", + "views": "view", +} + +plverb_ambiguous_pres_keys = enclose("|".join(list(plverb_ambiguous_pres.keys()))) + + +plverb_irregular_non_pres = ( + "did", + "had", + "ate", + "made", + "put", + "spent", + "fought", + "sank", + "gave", + "sought", + "shall", + "could", + "ought", + "should", +) + +plverb_ambiguous_non_pres = enclose( + "|".join(("thought", "saw", "bent", "will", "might", "cut")) +) + +# "..oes" -> "..oe" (the rest are "..oes" -> "o") + +pl_v_oes_oe = ("canoes", "floes", "oboes", "roes", "throes", "woes") +pl_v_oes_oe_endings_size4 = ("hoes", "toes") +pl_v_oes_oe_endings_size5 = ("shoes",) + + +pl_count_zero = ("0", "no", "zero", "nil") + + +pl_count_one = ("1", "a", "an", "one", "each", "every", "this", "that") + +pl_adj_special = {"a": "some", "an": "some", "this": "these", "that": "those"} + +pl_adj_special_keys = enclose("|".join(list(pl_adj_special.keys()))) + +pl_adj_poss = { + "my": "our", + "your": "your", + "its": "their", + "her": "their", + "his": "their", + "their": "their", +} + +pl_adj_poss_keys = enclose("|".join(list(pl_adj_poss.keys()))) + + +# 2. INDEFINITE ARTICLES + +# THIS PATTERN MATCHES STRINGS OF CAPITALS STARTING WITH A "VOWEL-SOUND" +# CONSONANT FOLLOWED BY ANOTHER CONSONANT, AND WHICH ARE NOT LIKELY +# TO BE REAL WORDS (OH, ALL RIGHT THEN, IT'S JUST MAGIC!) + +A_abbrev = r""" +(?! FJO | [HLMNS]Y. | RY[EO] | SQU + | ( F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU]) +[FHLMNRSX][A-Z] +""" + +# THIS PATTERN CODES THE BEGINNINGS OF ALL ENGLISH WORDS BEGINING WITH A +# 'y' FOLLOWED BY A CONSONANT. ANY OTHER Y-CONSONANT PREFIX THEREFORE +# IMPLIES AN ABBREVIATION. + +A_y_cons = "y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt)" + +# EXCEPTIONS TO EXCEPTIONS + +A_explicit_a = enclose("|".join(("unabomber", "unanimous", "US"))) + +A_explicit_an = enclose( + "|".join(("euler", "hour(?!i)", "heir", "honest", "hono[ur]", "mpeg")) +) + +A_ordinal_an = enclose("|".join(("[aefhilmnorsx]-?th",))) + +A_ordinal_a = enclose("|".join(("[bcdgjkpqtuvwyz]-?th",))) + + +# NUMERICAL INFLECTIONS + +nth = { + 0: "th", + 1: "st", + 2: "nd", + 3: "rd", + 4: "th", + 5: "th", + 6: "th", + 7: "th", + 8: "th", + 9: "th", + 11: "th", + 12: "th", + 13: "th", +} + +ordinal = dict( + ty="tieth", + one="first", + two="second", + three="third", + five="fifth", + eight="eighth", + nine="ninth", + twelve="twelfth", +) + +ordinal_suff = "|".join(list(ordinal.keys())) + + +# NUMBERS + +unit = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] +teen = [ + "ten", + "eleven", + "twelve", + "thirteen", + "fourteen", + "fifteen", + "sixteen", + "seventeen", + "eighteen", + "nineteen", +] +ten = [ + "", + "", + "twenty", + "thirty", + "forty", + "fifty", + "sixty", + "seventy", + "eighty", + "ninety", +] +mill = [ + " ", + " thousand", + " million", + " billion", + " trillion", + " quadrillion", + " quintillion", + " sextillion", + " septillion", + " octillion", + " nonillion", + " decillion", +] + + +# SUPPORT CLASSICAL PLURALIZATIONS + +def_classical = dict( + all=False, zero=False, herd=False, names=True, persons=False, ancient=False +) + +all_classical = {k: True for k in list(def_classical.keys())} +no_classical = {k: False for k in list(def_classical.keys())} + + +# Maps strings to built-in constant types +string_to_constant = {"True": True, "False": False, "None": None} + + +class engine: + def __init__(self): + + self.classical_dict = def_classical.copy() + self.persistent_count = None + self.mill_count = 0 + self.pl_sb_user_defined = [] + self.pl_v_user_defined = [] + self.pl_adj_user_defined = [] + self.si_sb_user_defined = [] + self.A_a_user_defined = [] + self.thegender = "neuter" + + deprecated_methods = dict( + pl="plural", + plnoun="plural_noun", + plverb="plural_verb", + pladj="plural_adj", + sinoun="single_noun", + prespart="present_participle", + numwords="number_to_words", + plequal="compare", + plnounequal="compare_nouns", + plverbequal="compare_verbs", + pladjequal="compare_adjs", + wordlist="join", + ) + + def __getattr__(self, meth): + if meth in self.deprecated_methods: + print3( + "{}() deprecated, use {}()".format(meth, self.deprecated_methods[meth]) + ) + raise DeprecationWarning + raise AttributeError + + def defnoun(self, singular, plural): + """ + Set the noun plural of singular to plural. + + """ + self.checkpat(singular) + self.checkpatplural(plural) + self.pl_sb_user_defined.extend((singular, plural)) + self.si_sb_user_defined.extend((plural, singular)) + return 1 + + def defverb(self, s1, p1, s2, p2, s3, p3): + """ + Set the verb plurals for s1, s2 and s3 to p1, p2 and p3 respectively. + + Where 1, 2 and 3 represent the 1st, 2nd and 3rd person forms of the verb. + + """ + self.checkpat(s1) + self.checkpat(s2) + self.checkpat(s3) + self.checkpatplural(p1) + self.checkpatplural(p2) + self.checkpatplural(p3) + self.pl_v_user_defined.extend((s1, p1, s2, p2, s3, p3)) + return 1 + + def defadj(self, singular, plural): + """ + Set the adjective plural of singular to plural. + + """ + self.checkpat(singular) + self.checkpatplural(plural) + self.pl_adj_user_defined.extend((singular, plural)) + return 1 + + def defa(self, pattern): + """ + Define the indefinate article as 'a' for words matching pattern. + + """ + self.checkpat(pattern) + self.A_a_user_defined.extend((pattern, "a")) + return 1 + + def defan(self, pattern): + """ + Define the indefinate article as 'an' for words matching pattern. + + """ + self.checkpat(pattern) + self.A_a_user_defined.extend((pattern, "an")) + return 1 + + def checkpat(self, pattern): + """ + check for errors in a regex pattern + """ + if pattern is None: + return + try: + re.match(pattern, "") + except re.error: + print3("\nBad user-defined singular pattern:\n\t%s\n" % pattern) + raise BadUserDefinedPatternError + + def checkpatplural(self, pattern): + """ + check for errors in a regex replace pattern + """ + return + + def ud_match(self, word, wordlist): + for i in range(len(wordlist) - 2, -2, -2): # backwards through even elements + mo = re.search(r"^%s$" % wordlist[i], word, re.IGNORECASE) + if mo: + if wordlist[i + 1] is None: + return None + pl = re.sub( + r"\$(\d+)", r"\\1", wordlist[i + 1] + ) # change $n to \n for expand + return mo.expand(pl) + return None + + def classical(self, **kwargs): + """ + turn classical mode on and off for various categories + + turn on all classical modes: + classical() + classical(all=True) + + turn on or off specific claassical modes: + e.g. + classical(herd=True) + classical(names=False) + + By default all classical modes are off except names. + + unknown value in args or key in kwargs rasies + exception: UnknownClasicalModeError + + """ + classical_mode = list(def_classical.keys()) + if not kwargs: + self.classical_dict = all_classical.copy() + return + if "all" in kwargs: + if kwargs["all"]: + self.classical_dict = all_classical.copy() + else: + self.classical_dict = no_classical.copy() + + for k, v in list(kwargs.items()): + if k in classical_mode: + self.classical_dict[k] = v + else: + raise UnknownClassicalModeError + + def num(self, count=None, show=None): # (;$count,$show) + """ + Set the number to be used in other method calls. + + Returns count. + + Set show to False to return '' instead. + + """ + if count is not None: + try: + self.persistent_count = int(count) + except ValueError: + raise BadNumValueError + if (show is None) or show: + return str(count) + else: + self.persistent_count = None + return "" + + def gender(self, gender): + """ + set the gender for the singular of plural pronouns + + can be one of: + 'neuter' ('they' -> 'it') + 'feminine' ('they' -> 'she') + 'masculine' ('they' -> 'he') + 'gender-neutral' ('they' -> 'they') + 'feminine or masculine' ('they' -> 'she or he') + 'masculine or feminine' ('they' -> 'he or she') + """ + if gender in singular_pronoun_genders: + self.thegender = gender + else: + raise BadGenderError + + def _get_value_from_ast(self, obj): + """ + Return the value of the ast object. + """ + if isinstance(obj, ast.Num): + return obj.n + elif isinstance(obj, ast.Str): + return obj.s + elif isinstance(obj, ast.List): + return [self._get_value_from_ast(e) for e in obj.elts] + elif isinstance(obj, ast.Tuple): + return tuple([self._get_value_from_ast(e) for e in obj.elts]) + + # None, True and False are NameConstants in Py3.4 and above. + elif sys.version_info.major >= 3 and isinstance(obj, ast.NameConstant): + return obj.value + + # For python versions below 3.4 + elif isinstance(obj, ast.Name) and (obj.id in ["True", "False", "None"]): + return string_to_constant[obj.id] + + # Probably passed a variable name. + # Or passed a single word without wrapping it in quotes as an argument + # ex: p.inflect("I plural(see)") instead of p.inflect("I plural('see')") + raise NameError("name '%s' is not defined" % obj.id) + + def _string_to_substitute(self, mo, methods_dict): + """ + Return the string to be substituted for the match. + """ + matched_text, f_name = mo.groups() + # matched_text is the complete match string. e.g. plural_noun(cat) + # f_name is the function name. e.g. plural_noun + + # Return matched_text if function name is not in methods_dict + if f_name not in methods_dict: + return matched_text + + # Parse the matched text + a_tree = ast.parse(matched_text) + + # get the args and kwargs from ast objects + args_list = [self._get_value_from_ast(a) for a in a_tree.body[0].value.args] + kwargs_list = { + kw.arg: self._get_value_from_ast(kw.value) + for kw in a_tree.body[0].value.keywords + } + + # Call the corresponding function + return methods_dict[f_name](*args_list, **kwargs_list) + + # 0. PERFORM GENERAL INFLECTIONS IN A STRING + + def inflect(self, text): + """ + Perform inflections in a string. + + e.g. inflect('The plural of cat is plural(cat)') returns + 'The plural of cat is cats' + + can use plural, plural_noun, plural_verb, plural_adj, + singular_noun, a, an, no, ordinal, number_to_words, + and prespart + + """ + save_persistent_count = self.persistent_count + + # Dictionary of allowed methods + methods_dict = { + "plural": self.plural, + "plural_adj": self.plural_adj, + "plural_noun": self.plural_noun, + "plural_verb": self.plural_verb, + "singular_noun": self.singular_noun, + "a": self.a, + "an": self.a, + "no": self.no, + "ordinal": self.ordinal, + "number_to_words": self.number_to_words, + "present_participle": self.present_participle, + "num": self.num, + } + + # Regular expression to find Python's function call syntax + functions_re = re.compile(r"((\w+)\([^)]*\)*)", re.IGNORECASE) + output = functions_re.sub( + lambda mo: self._string_to_substitute(mo, methods_dict), text + ) + self.persistent_count = save_persistent_count + return output + + # ## PLURAL SUBROUTINES + + def postprocess(self, orig, inflected): + if "|" in inflected: + inflected = inflected.split("|")[self.classical_dict["all"]] + result = inflected.split(" ") + # Try to fix word wise capitalization + for index, word in enumerate(orig.split(" ")): + if word == "I": + # Is this the only word for exceptions like this + # Where the original is fully capitalized + # without 'meaning' capitalization? + # Also this fails to handle a capitalizaion in context + continue + if word.capitalize() == word: + result[index] = result[index].capitalize() + if word == word.upper(): + result[index] = result[index].upper() + return " ".join(result) + + def partition_word(self, text): + mo = re.search(r"\A(\s*)(.+?)(\s*)\Z", text) + try: + return mo.group(1), mo.group(2), mo.group(3) + except AttributeError: # empty string + return "", "", "" + + def plural(self, text, count=None): + """ + Return the plural of text. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess( + word, + self._pl_special_adjective(word, count) + or self._pl_special_verb(word, count) + or self._plnoun(word, count), + ) + return "{}{}{}".format(pre, plural, post) + + def plural_noun(self, text, count=None): + """ + Return the plural of text, where text is a noun. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess(word, self._plnoun(word, count)) + return "{}{}{}".format(pre, plural, post) + + def plural_verb(self, text, count=None): + """ + Return the plural of text, where text is a verb. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess( + word, + self._pl_special_verb(word, count) or self._pl_general_verb(word, count), + ) + return "{}{}{}".format(pre, plural, post) + + def plural_adj(self, text, count=None): + """ + Return the plural of text, where text is an adjective. + + If count supplied, then return text if count is one of: + 1, a, an, one, each, every, this, that + otherwise return the plural. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + plural = self.postprocess(word, self._pl_special_adjective(word, count) or word) + return "{}{}{}".format(pre, plural, post) + + def compare(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return ( + self._plequal(word1, word2, self.plural_noun) + or self._plequal(word1, word2, self.plural_verb) + or self._plequal(word1, word2, self.plural_adj) + ) + + def compare_nouns(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as nouns + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_noun) + + def compare_verbs(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as verbs + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_verb) + + def compare_adjs(self, word1, word2): + """ + compare word1 and word2 for equality regardless of plurality + word1 and word2 are to be treated as adjectives + + return values: + eq - the strings are equal + p:s - word1 is the plural of word2 + s:p - word2 is the plural of word1 + p:p - word1 and word2 are two different plural forms of the one word + False - otherwise + + """ + return self._plequal(word1, word2, self.plural_adj) + + def singular_noun(self, text, count=None, gender=None): + """ + Return the singular of text, where text is a plural noun. + + If count supplied, then return the singular if count is one of: + 1, a, an, one, each, every, this, that or if count is None + otherwise return text unchanged. + + Whitespace at the start and end is preserved. + + """ + pre, word, post = self.partition_word(text) + if not word: + return text + sing = self._sinoun(word, count=count, gender=gender) + if sing is not False: + plural = self.postprocess( + word, self._sinoun(word, count=count, gender=gender) + ) + return "{}{}{}".format(pre, plural, post) + return False + + def _plequal(self, word1, word2, pl): + classval = self.classical_dict.copy() + self.classical_dict = all_classical.copy() + if word1 == word2: + return "eq" + if word1 == pl(word2): + return "p:s" + if pl(word1) == word2: + return "s:p" + self.classical_dict = no_classical.copy() + if word1 == pl(word2): + return "p:s" + if pl(word1) == word2: + return "s:p" + self.classical_dict = classval.copy() + + if pl == self.plural or pl == self.plural_noun: + if self._pl_check_plurals_N(word1, word2): + return "p:p" + if self._pl_check_plurals_N(word2, word1): + return "p:p" + if pl == self.plural or pl == self.plural_adj: + if self._pl_check_plurals_adj(word1, word2): + return "p:p" + return False + + def _pl_reg_plurals(self, pair, stems, end1, end2): + pattern = r"({})({}\|\1{}|{}\|\1{})".format(stems, end1, end2, end2, end1) + return bool(re.search(pattern, pair)) + + def _pl_check_plurals_N(self, word1, word2): + stem_endings = ( + (pl_sb_C_a_ata, "as", "ata"), + (pl_sb_C_is_ides, "is", "ides"), + (pl_sb_C_a_ae, "s", "e"), + (pl_sb_C_en_ina, "ens", "ina"), + (pl_sb_C_um_a, "ums", "a"), + (pl_sb_C_us_i, "uses", "i"), + (pl_sb_C_on_a, "ons", "a"), + (pl_sb_C_o_i_stems, "os", "i"), + (pl_sb_C_ex_ices, "exes", "ices"), + (pl_sb_C_ix_ices, "ixes", "ices"), + (pl_sb_C_i, "s", "i"), + (pl_sb_C_im, "s", "im"), + (".*eau", "s", "x"), + (".*ieu", "s", "x"), + (".*tri", "xes", "ces"), + (".{2,}[yia]n", "xes", "ges"), + ) + pair = "{}|{}".format(word1, word2) + + return ( + pair in pl_sb_irregular_s.values() + or pair in pl_sb_irregular.values() + or pair in pl_sb_irregular_caps.values() + or any( + self._pl_reg_plurals(pair, stems, end1, end2) + for stems, end1, end2 in stem_endings + ) + ) + + def _pl_check_plurals_adj(self, word1, word2): + word1a = word1[: word1.rfind("'")] if word1.endswith(("'s", "'")) else "" + word2a = word2[: word2.rfind("'")] if word2.endswith(("'s", "'")) else "" + + return ( + word1a + and word2a + and ( + self._pl_check_plurals_N(word1a, word2a) + or self._pl_check_plurals_N(word2a, word1a) + ) + ) + + def get_count(self, count=None): + if count is None and self.persistent_count is not None: + count = self.persistent_count + + if count is not None: + count = ( + 1 + if ( + (str(count) in pl_count_one) + or ( + self.classical_dict["zero"] + and str(count).lower() in pl_count_zero + ) + ) + else 2 + ) + else: + count = "" + return count + + # @profile + def _plnoun(self, word, count=None): + count = self.get_count(count) + + # DEFAULT TO PLURAL + + if count == 1: + return word + + # HANDLE USER-DEFINED NOUNS + + value = self.ud_match(word, self.pl_sb_user_defined) + if value is not None: + return value + + # HANDLE EMPTY WORD, SINGULAR COUNT AND UNINFLECTED PLURALS + + if word == "": + return word + + lowerword = word.lower() + + if lowerword in pl_sb_uninflected_complete: + return word + + if word in pl_sb_uninflected_caps: + return word + + for k, v in pl_sb_uninflected_bysize.items(): + if lowerword[-k:] in v: + return word + + if self.classical_dict["herd"] and lowerword in pl_sb_uninflected_herd: + return word + + # HANDLE COMPOUNDS ("Governor General", "mother-in-law", "aide-de-camp", ETC.) + + mo = re.search(r"^(?:%s)$" % pl_sb_postfix_adj_stems, word, re.IGNORECASE) + if mo and mo.group(2) != "": + return "{}{}".format(self._plnoun(mo.group(1), 2), mo.group(2)) + + if " a " in lowerword or "-a-" in lowerword: + mo = re.search(r"^(?:%s)$" % pl_sb_prep_dual_compound, word, re.IGNORECASE) + if mo and mo.group(2) != "" and mo.group(3) != "": + return "{}{}{}".format( + self._plnoun(mo.group(1), 2), mo.group(2), self._plnoun(mo.group(3)) + ) + + lowersplit = lowerword.split(" ") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [self._plnoun(lowersplit[numword - 1], 2)] + + lowersplit[numword:] + ) + + # only pluralize denominators in units + mo = re.search( + r"(?P.+)( (%s) .+)" % "|".join(["per", "a"]), lowerword + ) + if mo: + index = len(mo.group("denominator")) + return "{}{}".format(self._plnoun(word[:index]), word[index:]) + + # handle units given in degrees (only accept if + # there is no more than one word following) + # degree Celsius => degrees Celsius but degree + # fahrenheit hour => degree fahrenheit hours + if len(lowersplit) >= 2 and lowersplit[-2] in ["degree"]: + return " ".join([self._plnoun(lowersplit[0])] + lowersplit[1:]) + + lowersplit = lowerword.split("-") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [ + self._plnoun(lowersplit[numword - 1], 2) + + "-" + + lowersplit[numword] + + "-" + ] + ) + " ".join(lowersplit[(numword + 1) :]) + + # HANDLE PRONOUNS + + for k, v in pl_pron_acc_keys_bysize.items(): + if lowerword[-k:] in v: # ends with accusivate pronoun + for pk, pv in pl_prep_bysize.items(): + if lowerword[:pk] in pv: # starts with a prep + if lowerword.split() == [lowerword[:pk], lowerword[-k:]]: + # only whitespace in between + return lowerword[:-k] + pl_pron_acc[lowerword[-k:]] + + try: + return pl_pron_nom[word.lower()] + except KeyError: + pass + + try: + return pl_pron_acc[word.lower()] + except KeyError: + pass + + # HANDLE ISOLATED IRREGULAR PLURALS + + wordsplit = word.split() + wordlast = wordsplit[-1] + lowerwordlast = wordlast.lower() + + if wordlast in list(pl_sb_irregular_caps.keys()): + llen = len(wordlast) + return "{}{}".format(word[:-llen], pl_sb_irregular_caps[wordlast]) + + if lowerwordlast in list(pl_sb_irregular.keys()): + llen = len(lowerwordlast) + return "{}{}".format(word[:-llen], pl_sb_irregular[lowerwordlast]) + + if (" ".join(wordsplit[-2:])).lower() in list(pl_sb_irregular_compound.keys()): + llen = len( + " ".join(wordsplit[-2:]) + ) # TODO: what if 2 spaces between these words? + return "{}{}".format( + word[:-llen], + pl_sb_irregular_compound[(" ".join(wordsplit[-2:])).lower()], + ) + + if lowerword[-3:] == "quy": + return word[:-1] + "ies" + + if lowerword[-6:] == "person": + if self.classical_dict["persons"]: + return word + "s" + else: + return word[:-4] + "ople" + + # HANDLE FAMILIES OF IRREGULAR PLURALS + + if lowerword[-3:] == "man": + for k, v in pl_sb_U_man_mans_bysize.items(): + if lowerword[-k:] in v: + return word + "s" + for k, v in pl_sb_U_man_mans_caps_bysize.items(): + if word[-k:] in v: + return word + "s" + return word[:-3] + "men" + if lowerword[-5:] == "mouse": + return word[:-5] + "mice" + if lowerword[-5:] == "louse": + return word[:-5] + "lice" + if lowerword[-5:] == "goose": + return word[:-5] + "geese" + if lowerword[-5:] == "tooth": + return word[:-5] + "teeth" + if lowerword[-4:] == "foot": + return word[:-4] + "feet" + if lowerword[-4:] == "taco": + return word[:-5] + "tacos" + + if lowerword == "die": + return "dice" + + # HANDLE UNASSIMILATED IMPORTS + + if lowerword[-4:] == "ceps": + return word + if lowerword[-4:] == "zoon": + return word[:-2] + "a" + if lowerword[-3:] in ("cis", "sis", "xis"): + return word[:-2] + "es" + + for lastlet, d, numend, post in ( + ("h", pl_sb_U_ch_chs_bysize, None, "s"), + ("x", pl_sb_U_ex_ices_bysize, -2, "ices"), + ("x", pl_sb_U_ix_ices_bysize, -2, "ices"), + ("m", pl_sb_U_um_a_bysize, -2, "a"), + ("s", pl_sb_U_us_i_bysize, -2, "i"), + ("n", pl_sb_U_on_a_bysize, -2, "a"), + ("a", pl_sb_U_a_ae_bysize, None, "e"), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE INCOMPLETELY ASSIMILATED IMPORTS + + if self.classical_dict["ancient"]: + if lowerword[-4:] == "trix": + return word[:-1] + "ces" + if lowerword[-3:] in ("eau", "ieu"): + return word + "x" + if lowerword[-3:] in ("ynx", "inx", "anx") and len(word) > 4: + return word[:-1] + "ges" + + for lastlet, d, numend, post in ( + ("n", pl_sb_C_en_ina_bysize, -2, "ina"), + ("x", pl_sb_C_ex_ices_bysize, -2, "ices"), + ("x", pl_sb_C_ix_ices_bysize, -2, "ices"), + ("m", pl_sb_C_um_a_bysize, -2, "a"), + ("s", pl_sb_C_us_i_bysize, -2, "i"), + ("s", pl_sb_C_us_us_bysize, None, ""), + ("a", pl_sb_C_a_ae_bysize, None, "e"), + ("a", pl_sb_C_a_ata_bysize, None, "ta"), + ("s", pl_sb_C_is_ides_bysize, -1, "des"), + ("o", pl_sb_C_o_i_bysize, -1, "i"), + ("n", pl_sb_C_on_a_bysize, -2, "a"), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + for d, numend, post in ( + (pl_sb_C_i_bysize, None, "i"), + (pl_sb_C_im_bysize, None, "im"), + ): + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE SINGULAR NOUNS ENDING IN ...s OR OTHER SILIBANTS + + if lowerword in pl_sb_singular_s_complete: + return word + "es" + + for k, v in pl_sb_singular_s_bysize.items(): + if lowerword[-k:] in v: + return word + "es" + + if lowerword[-2:] == "es" and word[0] == word[0].upper(): + return word + "es" + + if lowerword[-1] == "z": + for k, v in pl_sb_z_zes_bysize.items(): + if lowerword[-k:] in v: + return word + "es" + + if lowerword[-2:-1] != "z": + return word + "zes" + + if lowerword[-2:] == "ze": + for k, v in pl_sb_ze_zes_bysize.items(): + if lowerword[-k:] in v: + return word + "s" + + if lowerword[-2:] in ("ch", "sh", "zz", "ss") or lowerword[-1] == "x": + return word + "es" + + # HANDLE ...f -> ...ves + + if lowerword[-3:] in ("elf", "alf", "olf"): + return word[:-1] + "ves" + if lowerword[-3:] == "eaf" and lowerword[-4:-3] != "d": + return word[:-1] + "ves" + if lowerword[-4:] in ("nife", "life", "wife"): + return word[:-2] + "ves" + if lowerword[-3:] == "arf": + return word[:-1] + "ves" + + # HANDLE ...y + + if lowerword[-1] == "y": + if lowerword[-2:-1] in "aeiou" or len(word) == 1: + return word + "s" + + if self.classical_dict["names"]: + if lowerword[-1] == "y" and word[0] == word[0].upper(): + return word + "s" + + return word[:-1] + "ies" + + # HANDLE ...o + + if lowerword in pl_sb_U_o_os_complete: + return word + "s" + + for k, v in pl_sb_U_o_os_bysize.items(): + if lowerword[-k:] in v: + return word + "s" + + if lowerword[-2:] in ("ao", "eo", "io", "oo", "uo"): + return word + "s" + + if lowerword[-1] == "o": + return word + "es" + + # OTHERWISE JUST ADD ...s + + return "%ss" % word + + def _pl_special_verb(self, word, count=None): + if self.classical_dict["zero"] and str(count).lower() in pl_count_zero: + return False + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE USER-DEFINED VERBS + + value = self.ud_match(word, self.pl_v_user_defined) + if value is not None: + return value + + # HANDLE IRREGULAR PRESENT TENSE (SIMPLE AND COMPOUND) + + lowerword = word.lower() + try: + firstword = lowerword.split()[0] + except IndexError: + return False # word is '' + + if firstword in list(plverb_irregular_pres.keys()): + return "{}{}".format( + plverb_irregular_pres[firstword], word[len(firstword) :] + ) + + # HANDLE IRREGULAR FUTURE, PRETERITE AND PERFECT TENSES + + if firstword in plverb_irregular_non_pres: + return word + + # HANDLE PRESENT NEGATIONS (SIMPLE AND COMPOUND) + + if firstword.endswith("n't") and firstword[:-3] in list( + plverb_irregular_pres.keys() + ): + return "{}n't{}".format( + plverb_irregular_pres[firstword[:-3]], word[len(firstword) :] + ) + + if firstword.endswith("n't"): + return word + + # HANDLE SPECIAL CASES + + mo = re.search(r"^(%s)$" % plverb_special_s, word) + if mo: + return False + if re.search(r"\s", word): + return False + if lowerword == "quizzes": + return "quiz" + + # HANDLE STANDARD 3RD PERSON (CHOP THE ...(e)s OFF SINGLE WORDS) + + if ( + lowerword[-4:] in ("ches", "shes", "zzes", "sses") + or lowerword[-3:] == "xes" + ): + return word[:-2] + + if lowerword[-3:] == "ies" and len(word) > 3: + return lowerword[:-3] + "y" + + if ( + lowerword in pl_v_oes_oe + or lowerword[-4:] in pl_v_oes_oe_endings_size4 + or lowerword[-5:] in pl_v_oes_oe_endings_size5 + ): + return word[:-1] + + if lowerword.endswith("oes") and len(word) > 3: + return lowerword[:-2] + + mo = re.search(r"^(.*[^s])s$", word, re.IGNORECASE) + if mo: + return mo.group(1) + + # OTHERWISE, A REGULAR VERB (HANDLE ELSEWHERE) + + return False + + def _pl_general_verb(self, word, count=None): + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE AMBIGUOUS PRESENT TENSES (SIMPLE AND COMPOUND) + + mo = re.search( + r"^(%s)((\s.*)?)$" % plverb_ambiguous_pres_keys, word, re.IGNORECASE + ) + if mo: + return "{}{}".format( + plverb_ambiguous_pres[mo.group(1).lower()], mo.group(2) + ) + + # HANDLE AMBIGUOUS PRETERITE AND PERFECT TENSES + + mo = re.search( + r"^(%s)((\s.*)?)$" % plverb_ambiguous_non_pres, word, re.IGNORECASE + ) + if mo: + return word + + # OTHERWISE, 1st OR 2ND PERSON IS UNINFLECTED + + return word + + def _pl_special_adjective(self, word, count=None): + count = self.get_count(count) + + if count == 1: + return word + + # HANDLE USER-DEFINED ADJECTIVES + + value = self.ud_match(word, self.pl_adj_user_defined) + if value is not None: + return value + + # HANDLE KNOWN CASES + + mo = re.search(r"^(%s)$" % pl_adj_special_keys, word, re.IGNORECASE) + if mo: + return "%s" % (pl_adj_special[mo.group(1).lower()]) + + # HANDLE POSSESSIVES + + mo = re.search(r"^(%s)$" % pl_adj_poss_keys, word, re.IGNORECASE) + if mo: + return "%s" % (pl_adj_poss[mo.group(1).lower()]) + + mo = re.search(r"^(.*)'s?$", word) + if mo: + pl = self.plural_noun(mo.group(1)) + trailing_s = "" if pl[-1] == "s" else "s" + return "{}'{}".format(pl, trailing_s) + + # OTHERWISE, NO IDEA + + return False + + # @profile + def _sinoun(self, word, count=None, gender=None): + count = self.get_count(count) + + # DEFAULT TO PLURAL + + if count == 2: + return word + + # SET THE GENDER + + try: + if gender is None: + gender = self.thegender + elif gender not in singular_pronoun_genders: + raise BadGenderError + except (TypeError, IndexError): + raise BadGenderError + + # HANDLE USER-DEFINED NOUNS + + value = self.ud_match(word, self.si_sb_user_defined) + if value is not None: + return value + + # HANDLE EMPTY WORD, SINGULAR COUNT AND UNINFLECTED PLURALS + + if word == "": + return word + + lowerword = word.lower() + + if word in si_sb_ois_oi_case: + return word[:-1] + + if lowerword in pl_sb_uninflected_complete: + return word + + if word in pl_sb_uninflected_caps: + return word + + for k, v in pl_sb_uninflected_bysize.items(): + if lowerword[-k:] in v: + return word + + if self.classical_dict["herd"] and lowerword in pl_sb_uninflected_herd: + return word + + if lowerword in pl_sb_C_us_us: + return word + + # HANDLE COMPOUNDS ("Governor General", "mother-in-law", "aide-de-camp", ETC.) + + mo = re.search(r"^(?:%s)$" % pl_sb_postfix_adj_stems, word, re.IGNORECASE) + if mo and mo.group(2) != "": + return "{}{}".format( + self._sinoun(mo.group(1), 1, gender=gender), mo.group(2) + ) + + lowersplit = lowerword.split(" ") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [ + self._sinoun(lowersplit[numword - 1], 1, gender=gender) + or lowersplit[numword - 1] + ] + + lowersplit[numword:] + ) + + lowersplit = lowerword.split("-") + if len(lowersplit) >= 3: + for numword in range(1, len(lowersplit) - 1): + if lowersplit[numword] in pl_prep_list_da: + return " ".join( + lowersplit[: numword - 1] + + [ + ( + self._sinoun(lowersplit[numword - 1], 1, gender=gender) + or lowersplit[numword - 1] + ) + + "-" + + lowersplit[numword] + + "-" + ] + ) + " ".join(lowersplit[(numword + 1) :]) + + # HANDLE PRONOUNS + + for k, v in si_pron_acc_keys_bysize.items(): + if lowerword[-k:] in v: # ends with accusivate pronoun + for pk, pv in pl_prep_bysize.items(): + if lowerword[:pk] in pv: # starts with a prep + if lowerword.split() == [lowerword[:pk], lowerword[-k:]]: + # only whitespace in between + return lowerword[:-k] + get_si_pron( + "acc", lowerword[-k:], gender + ) + + try: + return get_si_pron("nom", word.lower(), gender) + except KeyError: + pass + + try: + return get_si_pron("acc", word.lower(), gender) + except KeyError: + pass + + # HANDLE ISOLATED IRREGULAR PLURALS + + wordsplit = word.split() + wordlast = wordsplit[-1] + lowerwordlast = wordlast.lower() + + if wordlast in list(si_sb_irregular_caps.keys()): + llen = len(wordlast) + return "{}{}".format(word[:-llen], si_sb_irregular_caps[wordlast]) + + if lowerwordlast in list(si_sb_irregular.keys()): + llen = len(lowerwordlast) + return "{}{}".format(word[:-llen], si_sb_irregular[lowerwordlast]) + + if (" ".join(wordsplit[-2:])).lower() in list(si_sb_irregular_compound.keys()): + llen = len( + " ".join(wordsplit[-2:]) + ) # TODO: what if 2 spaces between these words? + return "{}{}".format( + word[:-llen], + si_sb_irregular_compound[(" ".join(wordsplit[-2:])).lower()], + ) + + if lowerword[-5:] == "quies": + return word[:-3] + "y" + + if lowerword[-7:] == "persons": + return word[:-1] + if lowerword[-6:] == "people": + return word[:-4] + "rson" + + # HANDLE FAMILIES OF IRREGULAR PLURALS + + if lowerword[-4:] == "mans": + for k, v in si_sb_U_man_mans_bysize.items(): + if lowerword[-k:] in v: + return word[:-1] + for k, v in si_sb_U_man_mans_caps_bysize.items(): + if word[-k:] in v: + return word[:-1] + if lowerword[-3:] == "men": + return word[:-3] + "man" + if lowerword[-4:] == "mice": + return word[:-4] + "mouse" + if lowerword[-4:] == "lice": + return word[:-4] + "louse" + if lowerword[-5:] == "geese": + return word[:-5] + "goose" + if lowerword[-5:] == "teeth": + return word[:-5] + "tooth" + if lowerword[-4:] == "feet": + return word[:-4] + "foot" + + if lowerword == "dice": + return "die" + + # HANDLE UNASSIMILATED IMPORTS + + if lowerword[-4:] == "ceps": + return word + if lowerword[-3:] == "zoa": + return word[:-1] + "on" + + for lastlet, d, numend, post in ( + ("s", si_sb_U_ch_chs_bysize, -1, ""), + ("s", si_sb_U_ex_ices_bysize, -4, "ex"), + ("s", si_sb_U_ix_ices_bysize, -4, "ix"), + ("a", si_sb_U_um_a_bysize, -1, "um"), + ("i", si_sb_U_us_i_bysize, -1, "us"), + ("a", si_sb_U_on_a_bysize, -1, "on"), + ("e", si_sb_U_a_ae_bysize, -1, ""), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE INCOMPLETELY ASSIMILATED IMPORTS + + if self.classical_dict["ancient"]: + + if lowerword[-6:] == "trices": + return word[:-3] + "x" + if lowerword[-4:] in ("eaux", "ieux"): + return word[:-1] + if lowerword[-5:] in ("ynges", "inges", "anges") and len(word) > 6: + return word[:-3] + "x" + + for lastlet, d, numend, post in ( + ("a", si_sb_C_en_ina_bysize, -3, "en"), + ("s", si_sb_C_ex_ices_bysize, -4, "ex"), + ("s", si_sb_C_ix_ices_bysize, -4, "ix"), + ("a", si_sb_C_um_a_bysize, -1, "um"), + ("i", si_sb_C_us_i_bysize, -1, "us"), + ("s", pl_sb_C_us_us_bysize, None, ""), + ("e", si_sb_C_a_ae_bysize, -1, ""), + ("a", si_sb_C_a_ata_bysize, -2, ""), + ("s", si_sb_C_is_ides_bysize, -3, "s"), + ("i", si_sb_C_o_i_bysize, -1, "o"), + ("a", si_sb_C_on_a_bysize, -1, "on"), + ("m", si_sb_C_im_bysize, -2, ""), + ("i", si_sb_C_i_bysize, -1, ""), + ): + if lowerword[-1] == lastlet: # this test to add speed + for k, v in d.items(): + if lowerword[-k:] in v: + return word[:numend] + post + + # HANDLE PLURLS ENDING IN uses -> use + + if ( + lowerword[-6:] == "houses" + or word in si_sb_uses_use_case + or lowerword in si_sb_uses_use + ): + return word[:-1] + + # HANDLE PLURLS ENDING IN ies -> ie + + if word in si_sb_ies_ie_case or lowerword in si_sb_ies_ie: + return word[:-1] + + # HANDLE PLURLS ENDING IN oes -> oe + + if ( + lowerword[-5:] == "shoes" + or word in si_sb_oes_oe_case + or lowerword in si_sb_oes_oe + ): + return word[:-1] + + # HANDLE SINGULAR NOUNS ENDING IN ...s OR OTHER SILIBANTS + + if word in si_sb_sses_sse_case or lowerword in si_sb_sses_sse: + return word[:-1] + + if lowerword in si_sb_singular_s_complete: + return word[:-2] + + for k, v in si_sb_singular_s_bysize.items(): + if lowerword[-k:] in v: + return word[:-2] + + if lowerword[-4:] == "eses" and word[0] == word[0].upper(): + return word[:-2] + + if lowerword in si_sb_z_zes: + return word[:-2] + + if lowerword in si_sb_zzes_zz: + return word[:-2] + + if lowerword[-4:] == "zzes": + return word[:-3] + + if word in si_sb_ches_che_case or lowerword in si_sb_ches_che: + return word[:-1] + + if lowerword[-4:] in ("ches", "shes"): + return word[:-2] + + if lowerword in si_sb_xes_xe: + return word[:-1] + + if lowerword[-3:] == "xes": + return word[:-2] + + # HANDLE ...f -> ...ves + + if word in si_sb_ves_ve_case or lowerword in si_sb_ves_ve: + return word[:-1] + + if lowerword[-3:] == "ves": + if lowerword[-5:-3] in ("el", "al", "ol"): + return word[:-3] + "f" + if lowerword[-5:-3] == "ea" and word[-6:-5] != "d": + return word[:-3] + "f" + if lowerword[-5:-3] in ("ni", "li", "wi"): + return word[:-3] + "fe" + if lowerword[-5:-3] == "ar": + return word[:-3] + "f" + + # HANDLE ...y + + if lowerword[-2:] == "ys": + if len(lowerword) > 2 and lowerword[-3] in "aeiou": + return word[:-1] + + if self.classical_dict["names"]: + if lowerword[-2:] == "ys" and word[0] == word[0].upper(): + return word[:-1] + + if lowerword[-3:] == "ies": + return word[:-3] + "y" + + # HANDLE ...o + + if lowerword[-2:] == "os": + + if lowerword in si_sb_U_o_os_complete: + return word[:-1] + + for k, v in si_sb_U_o_os_bysize.items(): + if lowerword[-k:] in v: + return word[:-1] + + if lowerword[-3:] in ("aos", "eos", "ios", "oos", "uos"): + return word[:-1] + + if lowerword[-3:] == "oes": + return word[:-2] + + # UNASSIMILATED IMPORTS FINAL RULE + + if word in si_sb_es_is: + return word[:-2] + "is" + + # OTHERWISE JUST REMOVE ...s + + if lowerword[-1] == "s": + return word[:-1] + + # COULD NOT FIND SINGULAR + + return False + + # ADJECTIVES + + def a(self, text, count=1): + """ + Return the appropriate indefinite article followed by text. + + The indefinite article is either 'a' or 'an'. + + If count is not one, then return count followed by text + instead of 'a' or 'an'. + + Whitespace at the start and end is preserved. + + """ + mo = re.search(r"\A(\s*)(?:an?\s+)?(.+?)(\s*)\Z", text, re.IGNORECASE) + if mo: + word = mo.group(2) + if not word: + return text + pre = mo.group(1) + post = mo.group(3) + result = self._indef_article(word, count) + return "{}{}{}".format(pre, result, post) + return "" + + an = a + + def _indef_article(self, word, count): + mycount = self.get_count(count) + + if mycount != 1: + return "{} {}".format(count, word) + + # HANDLE USER-DEFINED VARIANTS + + value = self.ud_match(word, self.A_a_user_defined) + if value is not None: + return "{} {}".format(value, word) + + # HANDLE ORDINAL FORMS + + for a in ((r"^(%s)" % A_ordinal_a, "a"), (r"^(%s)" % A_ordinal_an, "an")): + mo = re.search(a[0], word, re.IGNORECASE) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE SPECIAL CASES + + for a in ( + (r"^(%s)" % A_explicit_an, "an"), + (r"^[aefhilmnorsx]$", "an"), + (r"^[bcdgjkpqtuvwyz]$", "a"), + ): + mo = re.search(a[0], word, re.IGNORECASE) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE ABBREVIATIONS + + for a in ( + (r"(%s)" % A_abbrev, "an", re.VERBOSE), + (r"^[aefhilmnorsx][.-]", "an", re.IGNORECASE), + (r"^[a-z][.-]", "a", re.IGNORECASE), + ): + mo = re.search(a[0], word, a[2]) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE CONSONANTS + + mo = re.search(r"^[^aeiouy]", word, re.IGNORECASE) + if mo: + return "a %s" % word + + # HANDLE SPECIAL VOWEL-FORMS + + for a in ( + (r"^e[uw]", "a"), + (r"^onc?e\b", "a"), + (r"^onetime\b", "a"), + (r"^uni([^nmd]|mo)", "a"), + (r"^u[bcfghjkqrst][aeiou]", "a"), + (r"^ukr", "a"), + (r"^(%s)" % A_explicit_a, "a"), + ): + mo = re.search(a[0], word, re.IGNORECASE) + if mo: + return "{} {}".format(a[1], word) + + # HANDLE SPECIAL CAPITALS + + mo = re.search(r"^U[NK][AIEO]?", word) + if mo: + return "a %s" % word + + # HANDLE VOWELS + + mo = re.search(r"^[aeiou]", word, re.IGNORECASE) + if mo: + return "an %s" % word + + # HANDLE y... (BEFORE CERTAIN CONSONANTS IMPLIES (UNNATURALIZED) "i.." SOUND) + + mo = re.search(r"^(%s)" % A_y_cons, word, re.IGNORECASE) + if mo: + return "an %s" % word + + # OTHERWISE, GUESS "a" + return "a %s" % word + + # 2. TRANSLATE ZERO-QUANTIFIED $word TO "no plural($word)" + + def no(self, text, count=None): + """ + If count is 0, no, zero or nil, return 'no' followed by the plural + of text. + + If count is one of: + 1, a, an, one, each, every, this, that + return count followed by text. + + Otherwise return count follow by the plural of text. + + In the return value count is always followed by a space. + + Whitespace at the start and end is preserved. + + """ + if count is None and self.persistent_count is not None: + count = self.persistent_count + + if count is None: + count = 0 + mo = re.search(r"\A(\s*)(.+?)(\s*)\Z", text) + pre = mo.group(1) + word = mo.group(2) + post = mo.group(3) + + if str(count).lower() in pl_count_zero: + return "{}no {}{}".format(pre, self.plural(word, 0), post) + else: + return "{}{} {}{}".format(pre, count, self.plural(word, count), post) + + # PARTICIPLES + + def present_participle(self, word): + """ + Return the present participle for word. + + word is the 3rd person singular verb. + + """ + plv = self.plural_verb(word, 2) + + for pat, repl in ( + (r"ie$", r"y"), + (r"ue$", r"u"), # TODO: isn't ue$ -> u encompassed in the following rule? + (r"([auy])e$", r"\g<1>"), + (r"ski$", r"ski"), + (r"[^b]i$", r""), + (r"^(are|were)$", r"be"), + (r"^(had)$", r"hav"), + (r"^(hoe)$", r"\g<1>"), + (r"([^e])e$", r"\g<1>"), + (r"er$", r"er"), + (r"([^aeiou][aeiouy]([bdgmnprst]))$", r"\g<1>\g<2>"), + ): + (ans, num) = re.subn(pat, repl, plv) + if num: + return "%sing" % ans + return "%sing" % ans + + # NUMERICAL INFLECTIONS + + def ordinal(self, num): + """ + Return the ordinal of num. + + num can be an integer or text + + e.g. ordinal(1) returns '1st' + ordinal('one') returns 'first' + + """ + if re.match(r"\d", str(num)): + try: + num % 2 + n = num + except TypeError: + if "." in str(num): + try: + # numbers after decimal, + # so only need last one for ordinal + n = int(num[-1]) + + except ValueError: # ends with '.', so need to use whole string + n = int(num[:-1]) + else: + n = int(num) + try: + post = nth[n % 100] + except KeyError: + post = nth[n % 10] + return "{}{}".format(num, post) + else: + mo = re.search(r"(%s)\Z" % ordinal_suff, num) + try: + post = ordinal[mo.group(1)] + return re.sub(r"(%s)\Z" % ordinal_suff, post, num) + except AttributeError: + return "%sth" % num + + def millfn(self, ind=0): + if ind > len(mill) - 1: + print3("number out of range") + raise NumOutOfRangeError + return mill[ind] + + def unitfn(self, units, mindex=0): + return "{}{}".format(unit[units], self.millfn(mindex)) + + def tenfn(self, tens, units, mindex=0): + if tens != 1: + return "{}{}{}{}".format( + ten[tens], + "-" if tens and units else "", + unit[units], + self.millfn(mindex), + ) + return "{}{}".format(teen[units], mill[mindex]) + + def hundfn(self, hundreds, tens, units, mindex): + if hundreds: + andword = " %s " % self.number_args["andword"] if tens or units else "" + return "{} hundred{}{}{}, ".format( + unit[hundreds], # use unit not unitfn as simpler + andword, + self.tenfn(tens, units), + self.millfn(mindex), + ) + if tens or units: + return "{}{}, ".format(self.tenfn(tens, units), self.millfn(mindex)) + return "" + + def group1sub(self, mo): + units = int(mo.group(1)) + if units == 1: + return " %s, " % self.number_args["one"] + elif units: + return "%s, " % unit[units] + else: + return " %s, " % self.number_args["zero"] + + def group1bsub(self, mo): + units = int(mo.group(1)) + if units: + return "%s, " % unit[units] + else: + return " %s, " % self.number_args["zero"] + + def group2sub(self, mo): + tens = int(mo.group(1)) + units = int(mo.group(2)) + if tens: + return "%s, " % self.tenfn(tens, units) + if units: + return " {} {}, ".format(self.number_args["zero"], unit[units]) + return " {} {}, ".format(self.number_args["zero"], self.number_args["zero"]) + + def group3sub(self, mo): + hundreds = int(mo.group(1)) + tens = int(mo.group(2)) + units = int(mo.group(3)) + if hundreds == 1: + hunword = " %s" % self.number_args["one"] + elif hundreds: + hunword = "%s" % unit[hundreds] + else: + hunword = " %s" % self.number_args["zero"] + if tens: + tenword = self.tenfn(tens, units) + elif units: + tenword = " {} {}".format(self.number_args["zero"], unit[units]) + else: + tenword = " {} {}".format( + self.number_args["zero"], self.number_args["zero"] + ) + return "{} {}, ".format(hunword, tenword) + + def hundsub(self, mo): + ret = self.hundfn( + int(mo.group(1)), int(mo.group(2)), int(mo.group(3)), self.mill_count + ) + self.mill_count += 1 + return ret + + def tensub(self, mo): + return "%s, " % self.tenfn(int(mo.group(1)), int(mo.group(2)), self.mill_count) + + def unitsub(self, mo): + return "%s, " % self.unitfn(int(mo.group(1)), self.mill_count) + + def enword(self, num, group): + # import pdb + # pdb.set_trace() + + if group == 1: + num = re.sub(r"(\d)", self.group1sub, num) + elif group == 2: + num = re.sub(r"(\d)(\d)", self.group2sub, num) + num = re.sub(r"(\d)", self.group1bsub, num, 1) + elif group == 3: + num = re.sub(r"(\d)(\d)(\d)", self.group3sub, num) + num = re.sub(r"(\d)(\d)", self.group2sub, num, 1) + num = re.sub(r"(\d)", self.group1sub, num, 1) + elif int(num) == 0: + num = self.number_args["zero"] + elif int(num) == 1: + num = self.number_args["one"] + else: + num = num.lstrip().lstrip("0") + self.mill_count = 0 + # surely there's a better way to do the next bit + mo = re.search(r"(\d)(\d)(\d)(?=\D*\Z)", num) + while mo: + num = re.sub(r"(\d)(\d)(\d)(?=\D*\Z)", self.hundsub, num, 1) + mo = re.search(r"(\d)(\d)(\d)(?=\D*\Z)", num) + num = re.sub(r"(\d)(\d)(?=\D*\Z)", self.tensub, num, 1) + num = re.sub(r"(\d)(?=\D*\Z)", self.unitsub, num, 1) + return num + + def blankfn(self, mo): + """ do a global blank replace + TODO: surely this can be done with an option to re.sub + rather than this fn + """ + return "" + + def commafn(self, mo): + """ do a global ',' replace + TODO: surely this can be done with an option to re.sub + rather than this fn + """ + return "," + + def spacefn(self, mo): + """ do a global ' ' replace + TODO: surely this can be done with an option to re.sub + rather than this fn + """ + return " " + + def number_to_words( + self, + num, + wantlist=False, + group=0, + comma=",", + andword="and", + zero="zero", + one="one", + decimal="point", + threshold=None, + ): + """ + Return a number in words. + + group = 1, 2 or 3 to group numbers before turning into words + comma: define comma + andword: word for 'and'. Can be set to ''. + e.g. "one hundred and one" vs "one hundred one" + zero: word for '0' + one: word for '1' + decimal: word for decimal point + threshold: numbers above threshold not turned into words + + parameters not remembered from last call. Departure from Perl version. + """ + self.number_args = dict(andword=andword, zero=zero, one=one) + num = "%s" % num + + # Handle "stylistic" conversions (up to a given threshold)... + if threshold is not None and float(num) > threshold: + spnum = num.split(".", 1) + while comma: + (spnum[0], n) = re.subn(r"(\d)(\d{3}(?:,|\Z))", r"\1,\2", spnum[0]) + if n == 0: + break + try: + return "{}.{}".format(spnum[0], spnum[1]) + except IndexError: + return "%s" % spnum[0] + + if group < 0 or group > 3: + raise BadChunkingOptionError + nowhite = num.lstrip() + if nowhite[0] == "+": + sign = "plus" + elif nowhite[0] == "-": + sign = "minus" + else: + sign = "" + + myord = num[-2:] in ("st", "nd", "rd", "th") + if myord: + num = num[:-2] + finalpoint = False + if decimal: + if group != 0: + chunks = num.split(".") + else: + chunks = num.split(".", 1) + if chunks[-1] == "": # remove blank string if nothing after decimal + chunks = chunks[:-1] + finalpoint = True # add 'point' to end of output + else: + chunks = [num] + + first = 1 + loopstart = 0 + + if chunks[0] == "": + first = 0 + if len(chunks) > 1: + loopstart = 1 + + for i in range(loopstart, len(chunks)): + chunk = chunks[i] + # remove all non numeric \D + chunk = re.sub(r"\D", self.blankfn, chunk) + if chunk == "": + chunk = "0" + + if group == 0 and (first == 0 or first == ""): + chunk = self.enword(chunk, 1) + else: + chunk = self.enword(chunk, group) + + if chunk[-2:] == ", ": + chunk = chunk[:-2] + chunk = re.sub(r"\s+,", self.commafn, chunk) + + if group == 0 and first: + chunk = re.sub(r", (\S+)\s+\Z", " %s \\1" % andword, chunk) + chunk = re.sub(r"\s+", self.spacefn, chunk) + # chunk = re.sub(r"(\A\s|\s\Z)", self.blankfn, chunk) + chunk = chunk.strip() + if first: + first = "" + chunks[i] = chunk + + numchunks = [] + if first != 0: + numchunks = chunks[0].split("%s " % comma) + + if myord and numchunks: + # TODO: can this be just one re as it is in perl? + mo = re.search(r"(%s)\Z" % ordinal_suff, numchunks[-1]) + if mo: + numchunks[-1] = re.sub( + r"(%s)\Z" % ordinal_suff, ordinal[mo.group(1)], numchunks[-1] + ) + else: + numchunks[-1] += "th" + + for chunk in chunks[1:]: + numchunks.append(decimal) + numchunks.extend(chunk.split("%s " % comma)) + + if finalpoint: + numchunks.append(decimal) + + # wantlist: Perl list context. can explictly specify in Python + if wantlist: + if sign: + numchunks = [sign] + numchunks + return numchunks + elif group: + signout = "%s " % sign if sign else "" + return "{}{}".format(signout, ", ".join(numchunks)) + else: + signout = "%s " % sign if sign else "" + num = "{}{}".format(signout, numchunks.pop(0)) + if decimal is None: + first = True + else: + first = not num.endswith(decimal) + for nc in numchunks: + if nc == decimal: + num += " %s" % nc + first = 0 + elif first: + num += "{} {}".format(comma, nc) + else: + num += " %s" % nc + return num + + # Join words with commas and a trailing 'and' (when appropriate)... + + def join( + self, + words, + sep=None, + sep_spaced=True, + final_sep=None, + conj="and", + conj_spaced=True, + ): + """ + Join words into a list. + + e.g. join(['ant', 'bee', 'fly']) returns 'ant, bee, and fly' + + options: + conj: replacement for 'and' + sep: separator. default ',', unless ',' is in the list then ';' + final_sep: final separator. default ',', unless ',' is in the list then ';' + conj_spaced: boolean. Should conj have spaces around it + + """ + if not words: + return "" + if len(words) == 1: + return words[0] + + if conj_spaced: + if conj == "": + conj = " " + else: + conj = " %s " % conj + + if len(words) == 2: + return "{}{}{}".format(words[0], conj, words[1]) + + if sep is None: + if "," in "".join(words): + sep = ";" + else: + sep = "," + if final_sep is None: + final_sep = sep + + final_sep = "{}{}".format(final_sep, conj) + + if sep_spaced: + sep += " " + + return "{}{}{}".format(sep.join(words[0:-1]), final_sep, words[-1]) diff --git a/Contents/Libraries/Shared/ipaddress.py b/Contents/Libraries/Shared/ipaddress.py new file mode 100644 index 000000000..f2d076684 --- /dev/null +++ b/Contents/Libraries/Shared/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.22' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + @staticmethod + def _is_subnet_of(a, b): + try: + # Always false if one is v4 and the other is v6. + if a._version != b._version: + raise TypeError("%s and %s are not of the same version" (a, b)) + return (b.network_address <= a.network_address and + b.broadcast_address >= a.broadcast_address) + except AttributeError: + raise TypeError("Unable to test subnet containment " + "between %s and %s" % (a, b)) + + def subnet_of(self, other): + """Return True if this network is a subnet of other.""" + return self._is_subnet_of(self, other) + + def supernet_of(self, other): + """Return True if this network is a supernet of other.""" + return self._is_subnet_of(other, self) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/Contents/Libraries/Shared/js2py/__init__.py b/Contents/Libraries/Shared/js2py/__init__.py new file mode 100644 index 000000000..a7fe5979c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/__init__.py @@ -0,0 +1,75 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# 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 +""" This module allows you to translate and execute Javascript in pure python. + Basically its implementation of ECMAScript 5.1 in pure python. + + Use eval_js method to execute javascript code and get resulting python object (builtin if possible). + + EXAMPLE: + >>> import js2py + >>> add = js2py.eval_js('function add(a, b) {return a + b}') + >>> add(1, 2) + 3 + 6 + >>> add('1', 2, 3) + u'12' + >>> add.constructor + function Function() { [python code] } + + + Or use EvalJs to execute many javascript code fragments under same context - you would be able to get any + variable from the context! + + >>> js = js2py.EvalJs() + >>> js.execute('var a = 10; function f(x) {return x*x};') + >>> js.f(9) + 81 + >>> js.a + 10 + + Also you can use its console method to play with interactive javascript console. + + + Use parse_js to parse (syntax tree is just like in esprima.js) and translate_js to trasnlate JavaScript. + + Finally, you can use pyimport statement from inside JS code to import and use python libraries. + + >>> js2py.eval_js('pyimport urllib; urllib.urlopen("https://www.google.com")') + + NOTE: This module is still not fully finished: + + Date and JSON builtin objects are not implemented + Array prototype is not fully finished (will be soon) + + Other than that everything should work fine. + +""" + +__author__ = 'Piotr Dabkowski' +__all__ = [ + 'EvalJs', 'translate_js', 'import_js', 'eval_js', 'parse_js', + 'translate_file', 'run_file', 'disable_pyimport', 'eval_js6', + 'translate_js6', 'PyJsException', 'get_file_contents', + 'write_file_contents', 'require' +] + +from .base import PyJsException +from .evaljs import * +from .translators import parse as parse_js +from .node_import import require diff --git a/Contents/Libraries/Shared/js2py/base.py b/Contents/Libraries/Shared/js2py/base.py new file mode 100644 index 000000000..cf1eca08d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/base.py @@ -0,0 +1,3273 @@ +'''Most important file in Js2Py implementation: PyJs class - father of all PyJs objects''' +from copy import copy +import re + +from .translators.friendly_nodes import REGEXP_CONVERTER +from .utils.injector import fix_js_args +from types import FunctionType, ModuleType, GeneratorType, BuiltinFunctionType, MethodType, BuiltinMethodType +from math import floor, log10 +import traceback +try: + import numpy + NUMPY_AVAILABLE = True +except: + NUMPY_AVAILABLE = False + +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def str_repr(s): + if six.PY2: + return repr(s.encode('utf-8')) + else: + return repr(s) + + +def MakeError(name, message): + """Returns PyJsException with PyJsError inside""" + return JsToPyException(ERRORS[name](Js(message))) + + +def to_python(val): + if not isinstance(val, PyJs): + return val + if isinstance(val, PyJsUndefined) or isinstance(val, PyJsNull): + return None + elif isinstance(val, PyJsNumber): + # this can be either float or long/int better to assume its int/long when a whole number... + v = val.value + try: + i = int(v) if v == v else v # nan... + return v if i != v else i + except: + return v + elif isinstance(val, (PyJsString, PyJsBoolean)): + return val.value + elif isinstance(val, PyObjectWrapper): + return val.__dict__['obj'] + elif isinstance(val, PyJsArray) and val.CONVERT_TO_PY_PRIMITIVES: + return to_list(val) + elif isinstance(val, PyJsObject) and val.CONVERT_TO_PY_PRIMITIVES: + return to_dict(val) + else: + return JsObjectWrapper(val) + + +def to_dict(js_obj, + known=None): # fixed recursion error in self referencing objects + res = {} + if known is None: + known = {} + if js_obj in known: + return known[js_obj] + known[js_obj] = res + for k in js_obj: + name = k.value + input = js_obj.get(name) + output = to_python(input) + if isinstance(output, JsObjectWrapper): + if output._obj.Class == 'Object': + output = to_dict(output._obj, known) + known[input] = output + elif output._obj.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + output = to_list(output._obj) + known[input] = output + res[name] = output + return res + + +def to_list(js_obj, known=None): + res = len(js_obj) * [None] + if known is None: + known = {} + if js_obj in known: + return known[js_obj] + known[js_obj] = res + for k in js_obj: + try: + name = int(k.value) + except: + continue + input = js_obj.get(str(name)) + output = to_python(input) + if isinstance(output, JsObjectWrapper): + if output._obj.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array', 'Arguments' + ]: + output = to_list(output._obj, known) + known[input] = output + elif output._obj.Class in ['Object']: + output = to_dict(output._obj) + known[input] = output + res[name] = output + return res + + +def HJs(val): + if hasattr(val, '__call__'): # + + @Js + def PyWrapper(this, arguments, var=None): + args = tuple(to_python(e) for e in arguments.to_list()) + try: + py_res = val.__call__(*args) + except Exception as e: + message = 'your Python function failed! ' + try: + message += e.message + except: + pass + raise MakeError('Error', message) + return py_wrap(py_res) + + try: + PyWrapper.func_name = val.__name__ + except: + pass + return PyWrapper + if isinstance(val, tuple): + val = list(val) + return Js(val) + + +def Js(val, Clamped=False): + '''Converts Py type to PyJs type''' + if isinstance(val, PyJs): + return val + elif val is None: + return undefined + elif isinstance(val, basestring): + return PyJsString(val, StringPrototype) + elif isinstance(val, bool): + return true if val else false + elif isinstance(val, float) or isinstance(val, int) or isinstance( + val, long) or (NUMPY_AVAILABLE and isinstance( + val, + (numpy.int8, numpy.uint8, numpy.int16, numpy.uint16, + numpy.int32, numpy.uint32, numpy.float32, numpy.float64))): + # This is supposed to speed things up. may not be the case + if val in NUM_BANK: + return NUM_BANK[val] + return PyJsNumber(float(val), NumberPrototype) + elif isinstance(val, FunctionType): + return PyJsFunction(val, FunctionPrototype) + #elif isinstance(val, ModuleType): + # mod = {} + # for name in dir(val): + # value = getattr(val, name) + # if isinstance(value, ModuleType): + # continue # prevent recursive module conversion + # try: + # jsval = HJs(value) + # except RuntimeError: + # print 'Could not convert %s to PyJs object!' % name + # continue + # mod[name] = jsval + # return Js(mod) + #elif isintance(val, ClassType): + + elif isinstance(val, dict): # convert to object + temp = PyJsObject({}, ObjectPrototype) + for k, v in six.iteritems(val): + temp.put(Js(k), Js(v)) + return temp + elif isinstance(val, (list, tuple)): #Convert to array + return PyJsArray(val, ArrayPrototype) + # convert to typedarray + elif isinstance(val, JsObjectWrapper): + return val.__dict__['_obj'] + elif NUMPY_AVAILABLE and isinstance(val, numpy.ndarray): + if val.dtype == numpy.int8: + return PyJsInt8Array(val, Int8ArrayPrototype) + elif val.dtype == numpy.uint8 and not Clamped: + return PyJsUint8Array(val, Uint8ArrayPrototype) + elif val.dtype == numpy.uint8 and Clamped: + return PyJsUint8ClampedArray(val, Uint8ClampedArrayPrototype) + elif val.dtype == numpy.int16: + return PyJsInt16Array(val, Int16ArrayPrototype) + elif val.dtype == numpy.uint16: + return PyJsUint16Array(val, Uint16ArrayPrototype) + + elif val.dtype == numpy.int32: + return PyJsInt32Array(val, Int32ArrayPrototype) + elif val.dtype == numpy.uint32: + return PyJsUint16Array(val, Uint32ArrayPrototype) + + elif val.dtype == numpy.float32: + return PyJsFloat32Array(val, Float32ArrayPrototype) + elif val.dtype == numpy.float64: + return PyJsFloat64Array(val, Float64ArrayPrototype) + else: # try to convert to js object + return py_wrap(val) + #raise RuntimeError('Cant convert python type to js (%s)' % repr(val)) + #try: + # obj = {} + # for name in dir(val): + # if name.startswith('_'): #dont wrap attrs that start with _ + # continue + # value = getattr(val, name) + # import types + # if not isinstance(value, (FunctionType, BuiltinFunctionType, MethodType, BuiltinMethodType, + # dict, int, basestring, bool, float, long, list, tuple)): + # continue + # obj[name] = HJs(value) + # return Js(obj) + #except: + # raise RuntimeError('Cant convert python type to js (%s)' % repr(val)) + + +def Type(val): + try: + return val.TYPE + except: + raise RuntimeError('Invalid type: ' + str(val)) + + +def is_data_descriptor(desc): + return desc and ('value' in desc or 'writable' in desc) + + +def is_accessor_descriptor(desc): + return desc and ('get' in desc or 'set' in desc) + + +def is_generic_descriptor(desc): + return desc and not (is_data_descriptor(desc) + or is_accessor_descriptor(desc)) + + +############################################################################## + + +class PyJs(object): + PRIMITIVES = frozenset( + ['String', 'Number', 'Boolean', 'Undefined', 'Null']) + TYPE = 'Object' + Class = None + extensible = True + prototype = None + own = {} + GlobalObject = None + IS_CHILD_SCOPE = False + CONVERT_TO_PY_PRIMITIVES = False + value = None + buff = None + + def __init__(self, value=None, prototype=None, extensible=False): + '''Constructor for Number String and Boolean''' + # I dont think this is needed anymore + # if self.Class=='String' and not isinstance(value, basestring): + # raise TypeError + # if self.Class=='Number': + # if not isinstance(value, float): + # if not (isinstance(value, int) or isinstance(value, long)): + # raise TypeError + # value = float(value) + # if self.Class=='Boolean' and not isinstance(value, bool): + # raise TypeError + self.value = value + self.extensible = extensible + self.prototype = prototype + self.own = {} + self.buff = None + + def is_undefined(self): + return self.Class == 'Undefined' + + def is_null(self): + return self.Class == 'Null' + + def is_primitive(self): + return self.TYPE in self.PRIMITIVES + + def is_object(self): + return not self.is_primitive() + + def _type(self): + return Type(self) + + def is_callable(self): + return hasattr(self, 'call') + + def get_own_property(self, prop): + return self.own.get(prop) + + def get_property(self, prop): + cand = self.get_own_property(prop) + if cand: + return cand + if self.prototype is not None: + return self.prototype.get_property(prop) + + def update_array(self): + for i in range(self.get('length').to_uint32()): + self.put(str(i), Js(self.buff[i])) + + def get(self, prop): #external use! + #prop = prop.value + if self.Class == 'Undefined' or self.Class == 'Null': + raise MakeError('TypeError', + 'Undefined and null dont have properties!') + if not isinstance(prop, basestring): + prop = prop.to_string().value + if not isinstance(prop, basestring): raise RuntimeError('Bug') + if NUMPY_AVAILABLE and prop.isdigit(): + if isinstance(self.buff, numpy.ndarray): + self.update_array() + cand = self.get_property(prop) + if cand is None: + return Js(None) + if is_data_descriptor(cand): + return cand['value'] + if cand['get'].is_undefined(): + return cand['get'] + return cand['get'].call(self) + + def can_put(self, prop): #to check + desc = self.get_own_property(prop) + if desc: #if we have this property + if is_accessor_descriptor(desc): + return desc['set'].is_callable( + ) # Check if setter method is defined + else: #data desc + return desc['writable'] + if self.prototype is not None: + return self.extensible + inherited = self.get_property(prop) + if inherited is None: + return self.extensible + if is_accessor_descriptor(inherited): + return not inherited['set'].is_undefined() + elif self.extensible: + return inherited['writable'] + return False + + def put(self, prop, val, op=None): #external use! + '''Just like in js: self.prop op= val + for example when op is '+' it will be self.prop+=val + op can be either None for simple assignment or one of: + * / % + - << >> & ^ |''' + if self.Class == 'Undefined' or self.Class == 'Null': + raise MakeError('TypeError', + 'Undefined and null dont have properties!') + if not isinstance(prop, basestring): + prop = prop.to_string().value + if NUMPY_AVAILABLE and prop.isdigit(): + if self.Class == 'Int8Array': + val = Js(numpy.int8(val.to_number().value)) + elif self.Class == 'Uint8Array': + val = Js(numpy.uint8(val.to_number().value)) + elif self.Class == 'Uint8ClampedArray': + if val < Js(numpy.uint8(0)): + val = Js(numpy.uint8(0)) + elif val > Js(numpy.uint8(255)): + val = Js(numpy.uint8(255)) + else: + val = Js(numpy.uint8(val.to_number().value)) + elif self.Class == 'Int16Array': + val = Js(numpy.int16(val.to_number().value)) + elif self.Class == 'Uint16Array': + val = Js(numpy.uint16(val.to_number().value)) + elif self.Class == 'Int32Array': + val = Js(numpy.int32(val.to_number().value)) + elif self.Class == 'Uint32Array': + val = Js(numpy.uint32(val.to_number().value)) + elif self.Class == 'Float32Array': + val = Js(numpy.float32(val.to_number().value)) + elif self.Class == 'Float64Array': + val = Js(numpy.float64(val.to_number().value)) + if isinstance(self.buff, numpy.ndarray): + self.buff[int(prop)] = int(val.to_number().value) + #we need to set the value to the incremented one + if op is not None: + val = getattr(self.get(prop), OP_METHODS[op])(val) + if not self.can_put(prop): + return val + own_desc = self.get_own_property(prop) + if is_data_descriptor(own_desc): + if self.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + self.define_own_property(prop, {'value': val}) + else: + self.own[prop]['value'] = val + return val + desc = self.get_property(prop) + if is_accessor_descriptor(desc): + desc['set'].call(self, (val, )) + else: + new = { + 'value': val, + 'writable': True, + 'configurable': True, + 'enumerable': True + } + if self.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + self.define_own_property(prop, new) + else: + self.own[prop] = new + return val + + def has_property(self, prop): + return self.get_property(prop) is not None + + def delete(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + desc = self.get_own_property(prop) + if desc is None: + return Js(True) + if desc['configurable']: + del self.own[prop] + return Js(True) + return Js(False) + + def default_value( + self, hint=None + ): # made a mistake at the very early stage and made it to prefer string... caused lots! of problems + order = ('valueOf', 'toString') + if hint == 'String' or (hint is None and self.Class == 'Date'): + order = ('toString', 'valueOf') + for meth_name in order: + method = self.get(meth_name) + if method is not None and method.is_callable(): + cand = method.call(self) + if cand.is_primitive(): + return cand + raise MakeError('TypeError', + 'Cannot convert object to primitive value') + + def define_own_property(self, prop, + desc): #Internal use only. External through Object + # prop must be a Py string. Desc is either a descriptor or accessor. + #Messy method - raw translation from Ecma spec to prevent any bugs. # todo check this + current = self.get_own_property(prop) + + extensible = self.extensible + if not current: #We are creating a new property + if not extensible: + return False + if is_data_descriptor(desc) or is_generic_descriptor(desc): + DEFAULT_DATA_DESC = { + 'value': undefined, #undefined + 'writable': False, + 'enumerable': False, + 'configurable': False + } + DEFAULT_DATA_DESC.update(desc) + self.own[prop] = DEFAULT_DATA_DESC + else: + DEFAULT_ACCESSOR_DESC = { + 'get': undefined, #undefined + 'set': undefined, #undefined + 'enumerable': False, + 'configurable': False + } + DEFAULT_ACCESSOR_DESC.update(desc) + self.own[prop] = DEFAULT_ACCESSOR_DESC + return True + if not desc or desc == current: #We dont need to change anything. + return True + configurable = current['configurable'] + if not configurable: #Prevent changing configurable or enumerable + if desc.get('configurable'): + return False + if 'enumerable' in desc and desc['enumerable'] != current[ + 'enumerable']: + return False + if is_generic_descriptor(desc): + pass + elif is_data_descriptor(current) != is_data_descriptor(desc): + if not configurable: + return False + if is_data_descriptor(current): + del current['value'] + del current['writable'] + current['set'] = undefined #undefined + current['get'] = undefined #undefined + else: + del current['set'] + del current['get'] + current['value'] = undefined #undefined + current['writable'] = False + elif is_data_descriptor(current) and is_data_descriptor(desc): + if not configurable: + if not current['writable'] and desc.get('writable'): + return False + if not current['writable'] and 'value' in desc and current[ + 'value'] != desc['value']: + return False + elif is_accessor_descriptor(current) and is_accessor_descriptor(desc): + if not configurable: + if 'set' in desc and desc['set'] is not current['set']: + return False + if 'get' in desc and desc['get'] is not current['get']: + return False + current.update(desc) + return True + + #these methods will work only for Number class + def is_infinity(self): + assert self.Class == 'Number' + return self.value == float('inf') or self.value == -float('inf') + + def is_nan(self): + assert self.Class == 'Number' + return self.value != self.value #nan!=nan evaluates to true + + def is_finite(self): + return not (self.is_nan() or self.is_infinity()) + + #Type Conversions. to_type. All must return pyjs subclass instance + + def to_primitive(self, hint=None): + if self.is_primitive(): + return self + if hint is None and ( + self.Class == 'Number' or self.Class == 'Boolean' + ): # favour number for Class== Number or Boolean default = String + hint = 'Number' + return self.default_value(hint) + + def to_boolean(self): + typ = Type(self) + if typ == 'Boolean': #no need to convert + return self + elif typ == 'Null' or typ == 'Undefined': #they are both always false + return false + elif typ == 'Number' or typ == 'String': #false only for 0, '' and NaN + return Js(bool( + self.value + and self.value == self.value)) # test for nan (nan -> flase) + else: #object - always true + return true + + def to_number(self): + typ = Type(self) + if typ == 'Null': #null is 0 + return Js(0) + elif typ == 'Undefined': # undefined is NaN + return NaN + elif typ == 'Boolean': # 1 for true 0 for false + return Js(int(self.value)) + elif typ == 'Number': # or self.Class=='Number': # no need to convert + return self + elif typ == 'String': + s = self.value.strip() #Strip white space + if not s: # '' is simply 0 + return Js(0) + if 'x' in s or 'X' in s[:3]: #hex (positive only) + try: # try to convert + num = int(s, 16) + except ValueError: # could not convert > NaN + return NaN + return Js(num) + sign = 1 #get sign + if s[0] in '+-': + if s[0] == '-': + sign = -1 + s = s[1:] + if s == 'Infinity': #Check for infinity keyword. 'NaN' will be NaN anyway. + return Js(sign * float('inf')) + try: #decimal try + num = sign * float(s) # Converted + except ValueError: + return NaN # could not convert to decimal > return NaN + return Js(num) + else: #object - most likely it will be NaN. + return self.to_primitive('Number').to_number() + + def to_string(self): + typ = Type(self) + if typ == 'Null': + return Js('null') + elif typ == 'Undefined': + return Js('undefined') + elif typ == 'Boolean': + return Js('true') if self.value else Js('false') + elif typ == 'Number': #or self.Class=='Number': + return Js(unicode(js_dtoa(self.value))) + elif typ == 'String': + return self + else: #object + return self.to_primitive('String').to_string() + + def to_object(self): + typ = self.TYPE + if typ == 'Null' or typ == 'Undefined': + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') + elif typ == 'Boolean': # Unsure here... todo repair here + return Boolean.create(self) + elif typ == 'Number': #? + return Number.create(self) + elif typ == 'String': #? + return String.create(self) + else: #object + return self + + def to_int32(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + int32 = int(num.value) % 2**32 + return int(int32 - 2**32 if int32 >= 2**31 else int32) + + def strict_equality_comparison(self, other): + return PyJsStrictEq(self, other) + + def cok(self): + """Check object coercible""" + if self.Class in ('Undefined', 'Null'): + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') + + def to_int(self): + num = self.to_number() + if num.is_nan(): + return 0 + elif num.is_infinity(): + return 10**20 if num.value > 0 else -10**20 + return int(num.value) + + def to_uint32(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + return int(num.value) % 2**32 + + def to_uint16(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + return int(num.value) % 2**16 + + def to_int16(self): + num = self.to_number() + if num.is_nan() or num.is_infinity(): + return 0 + int16 = int(num.value) % 2**16 + return int(int16 - 2**16 if int16 >= 2**15 else int16) + + def same_as(self, other): + typ = Type(self) + if typ != other.Class: + return False + if typ == 'Undefined' or typ == 'Null': + return True + if typ == 'Boolean' or typ == 'Number' or typ == 'String': + return self.value == other.value + else: #object + return self is other #Id compare. + + #Not to be used by translation (only internal use) + def __getitem__(self, item): + return self.get( + str(item) if not isinstance(item, PyJs) else item.to_string(). + value) + + def __setitem__(self, item, value): + self.put( + str(item) if not isinstance(item, PyJs) else + item.to_string().value, Js(value)) + + def __len__(self): + try: + return self.get('length').to_uint32() + except: + raise TypeError( + 'This object (%s) does not have length property' % self.Class) + + #Oprators------------- + #Unary, other will be implemented as functions. Increments and decrements + # will be methods of Number class + def __neg__(self): #-u + return Js(-self.to_number().value) + + def __pos__(self): #+u + return self.to_number() + + def __invert__(self): #~u + return Js(Js(~self.to_int32()).to_int32()) + + def neg(self): # !u cant do 'not u' :( + return Js(not self.to_boolean().value) + + def __nonzero__(self): + return self.to_boolean().value + + def __bool__(self): + return self.to_boolean().value + + def typeof(self): + if self.is_callable(): + return Js('function') + typ = Type(self).lower() + if typ == 'null': + typ = 'object' + return Js(typ) + + #Bitwise operators + # <<, >>, &, ^, | + + # << + def __lshift__(self, other): + lnum = self.to_int32() + rnum = other.to_uint32() + shiftCount = rnum & 0x1F + return Js(Js(lnum << shiftCount).to_int32()) + + # >> + def __rshift__(self, other): + lnum = self.to_int32() + rnum = other.to_uint32() + shiftCount = rnum & 0x1F + return Js(Js(lnum >> shiftCount).to_int32()) + + # >>> + def pyjs_bshift(self, other): + lnum = self.to_uint32() + rnum = other.to_uint32() + shiftCount = rnum & 0x1F + return Js(Js(lnum >> shiftCount).to_uint32()) + + # & + def __and__(self, other): + lnum = self.to_int32() + rnum = other.to_int32() + return Js(Js(lnum & rnum).to_int32()) + + # ^ + def __xor__(self, other): + lnum = self.to_int32() + rnum = other.to_int32() + return Js(Js(lnum ^ rnum).to_int32()) + + # | + def __or__(self, other): + lnum = self.to_int32() + rnum = other.to_int32() + return Js(Js(lnum | rnum).to_int32()) + + # Additive operators + # + and - are implemented here + + # + + def __add__(self, other): + a = self.to_primitive() + b = other.to_primitive() + if a.TYPE == 'String' or b.TYPE == 'String': + return Js(a.to_string().value + b.to_string().value) + a = a.to_number() + b = b.to_number() + return Js(a.value + b.value) + + # - + def __sub__(self, other): + return Js(self.to_number().value - other.to_number().value) + + #Multiplicative operators + # *, / and % are implemented here + + # * + def __mul__(self, other): + return Js(self.to_number().value * other.to_number().value) + + # / + def __div__(self, other): + a = self.to_number().value + b = other.to_number().value + if b: + return Js(a / b) + if not a or a != a: + return NaN + return Infinity if a > 0 else -Infinity + + # % + def __mod__(self, other): + a = self.to_number().value + b = other.to_number().value + if abs(a) == float('inf') or not b: + return NaN + if abs(b) == float('inf'): + return Js(a) + pyres = Js(a % b) #different signs in python and javascript + #python has the same sign as b and js has the same + #sign as a. + if a < 0 and pyres.value > 0: + pyres.value -= abs(b) + elif a > 0 and pyres.value < 0: + pyres.value += abs(b) + return Js(pyres) + + #Comparisons (I dont implement === and !== here, these + # will be implemented as external functions later) + # <, <=, !=, ==, >=, > are implemented here. + + def abstract_relational_comparison(self, other, self_first=True): + ''' self= + def __ge__(self, other): + res = self.abstract_relational_comparison(other, True) + if res.is_undefined(): + return false + return res.neg() + + #> + def __gt__(self, other): + res = self.abstract_relational_comparison(other, False) + if res.is_undefined(): + return false + return res + + def abstract_equality_comparison(self, other): + ''' returns the result of JS == compare. + result is PyJs type: bool''' + tx, ty = self.TYPE, other.TYPE + if tx == ty: + if tx == 'Undefined' or tx == 'Null': + return true + if tx == 'Number' or tx == 'String' or tx == 'Boolean': + return Js(self.value == other.value) + return Js(self is other) # Object + elif (tx == 'Undefined' and ty == 'Null') or (ty == 'Undefined' + and tx == 'Null'): + return true + elif tx == 'Number' and ty == 'String': + return self.abstract_equality_comparison(other.to_number()) + elif tx == 'String' and ty == 'Number': + return self.to_number().abstract_equality_comparison(other) + elif tx == 'Boolean': + return self.to_number().abstract_equality_comparison(other) + elif ty == 'Boolean': + return self.abstract_equality_comparison(other.to_number()) + elif (tx == 'String' or tx == 'Number') and other.is_object(): + return self.abstract_equality_comparison(other.to_primitive()) + elif (ty == 'String' or ty == 'Number') and self.is_object(): + return self.to_primitive().abstract_equality_comparison(other) + else: + return false + + #== + def __eq__(self, other): + return self.abstract_equality_comparison(other) + + #!= + def __ne__(self, other): + return self.abstract_equality_comparison(other).neg() + + #Other methods (instanceof) + + def instanceof(self, other): + '''checks if self is instance of other''' + if not hasattr(other, 'has_instance'): + return false + return other.has_instance(self) + + #iteration + def __iter__(self): + #Returns a generator of all own enumerable properties + # since the size od self.own can change we need to use different method of iteration. + # SLOW! New items will NOT show up. + returned = {} + if not self.IS_CHILD_SCOPE: + cands = sorted( + name for name in self.own if self.own[name]['enumerable']) + else: + cands = sorted(name for name in self.own) + for cand in cands: + check = self.own.get(cand) + if check and check['enumerable']: + yield Js(cand) + + def contains(self, other): + if not self.is_object(): + raise MakeError( + 'TypeError', + "You can\'t use 'in' operator to search in non-objects") + return Js(self.has_property(other.to_string().value)) + + #Other Special methods + def __call__(self, *args): + '''Call a property prop as a function (this will be global object). + + NOTE: dont pass this and arguments here, these will be added + automatically!''' + if not self.is_callable(): + raise MakeError('TypeError', + '%s is not a function' % self.typeof()) + return self.call(self.GlobalObject, args) + + def create(self, *args): + '''Generally not a constructor, raise an error''' + raise MakeError('TypeError', '%s is not a constructor' % self.Class) + + def __unicode__(self): + return self.to_string().value + + def __repr__(self): + if self.Class == 'Object': + res = [] + for e in self: + res.append(str_repr(e.value) + ': ' + str_repr(self.get(e))) + return '{%s}' % ', '.join(res) + elif self.Class == 'String': + return str_repr(self.value) + elif self.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + res = [] + for e in self: + res.append(repr(self.get(e))) + return '[%s]' % ', '.join(res) + else: + val = str_repr(self.to_string().value) + return val + + def _fuck_python3( + self + ): # hack to make object hashable in python 3 (__eq__ causes problems) + return object.__hash__(self) + + def callprop(self, prop, *args): + '''Call a property prop as a method (this will be self). + + NOTE: dont pass this and arguments here, these will be added + automatically!''' + if not isinstance(prop, basestring): + prop = prop.to_string().value + cand = self.get(prop) + if not cand.is_callable(): + raise MakeError('TypeError', + '%s is not a function' % cand.typeof()) + return cand.call(self, args) + + def to_python(self): + """returns equivalent python object. + for example if this object is javascript array then this method will return equivalent python array""" + return to_python(self) + + def to_py(self): + """returns equivalent python object. + for example if this object is javascript array then this method will return equivalent python array""" + return self.to_python() + + +if six.PY3: + PyJs.__hash__ = PyJs._fuck_python3 + PyJs.__truediv__ = PyJs.__div__ +#Define some more classes representing operators: + + +def PyJsStrictEq(a, b): + '''a===b''' + tx, ty = Type(a), Type(b) + if tx != ty: + return false + if tx == 'Undefined' or tx == 'Null': + return true + if a.is_primitive(): #string bool and number case + return Js(a.value == b.value) + if a.Class == b.Class == 'PyObjectWrapper': + return Js(a.obj == b.obj) + return Js(a is b) # object comparison + + +def PyJsStrictNeq(a, b): + ''' a!==b''' + return PyJsStrictEq(a, b).neg() + + +def PyJsBshift(a, b): + """a>>>b""" + return a.pyjs_bshift(b) + + +def PyJsComma(a, b): + return b + + +from .internals.simplex import JsException as PyJsException, js_dtoa +import pyjsparser +pyjsparser.parser.ENABLE_JS2PY_ERRORS = lambda msg: MakeError('SyntaxError', msg) + + +class PyJsSwitchException(Exception): + pass + + +PyJs.MakeError = staticmethod(MakeError) + + +def JsToPyException(js): + temp = PyJsException() + temp.mes = js + return temp + + +def PyExceptionToJs(py): + return py.mes + + +#Scope class it will hold all the variables accessible to user +class Scope(PyJs): + Class = 'global' + extensible = True + IS_CHILD_SCOPE = True + + # todo speed up + # in order to speed up this very important class the top scope should behave differently than + # child scopes, child scope should not have this property descriptor thing because they cant be changed anyway + # they are all confugurable= False + + def __init__(self, scope, closure=None): + """Doc""" + self.prototype = closure + if closure is None: + # global, top level scope + self.own = {} + for k, v in six.iteritems(scope): + # set all the global items + self.define_own_property( + k, { + 'value': v, + 'configurable': False, + 'writable': False, + 'enumerable': False + }) + else: + # not global, less powerful but faster closure. + self.own = scope # simple dictionary which maps name directly to js object. + + def register(self, lval): + # registered keeps only global registered variables + if self.prototype is None: + # define in global scope + if lval in self.own: + self.own[lval]['configurable'] = False + else: + self.define_own_property( + lval, { + 'value': undefined, + 'configurable': False, + 'writable': True, + 'enumerable': True + }) + elif lval not in self.own: + # define in local scope since it has not been defined yet + self.own[lval] = undefined # default value + + def registers(self, lvals): + """register multiple variables""" + for lval in lvals: + self.register(lval) + + def put(self, lval, val, op=None): + if self.prototype is None: + # global scope put, simple + return PyJs.put(self, lval, val, op) + else: + # trying to put in local scope + # we dont know yet in which scope we should place this var + if lval in self.own: + if op: # increment operation + val = getattr(self.own[lval], OP_METHODS[op])(val) + self.own[lval] = val + return val + else: + #try to put in the lower scope since we cant put in this one (var wasn't registered) + return self.prototype.put(lval, val, op) + + def force_own_put(self, prop, val, configurable=False): + if self.prototype is None: # global scope + self.own[prop] = { + 'value': val, + 'writable': True, + 'enumerable': True, + 'configurable': configurable + } + else: + self.own[prop] = val + + def get(self, prop, throw=True): + #note prop is always a Py String + if not isinstance(prop, basestring): + prop = prop.to_string().value + if self.prototype is not None: + # fast local scope + cand = self.own.get(prop) + if cand is None: + return self.prototype.get(prop, throw) + return cand + # slow, global scope + if prop not in self.own: + if throw: + raise MakeError('ReferenceError', '%s is not defined' % prop) + return undefined + return PyJs.get(self, prop) + + def delete(self, lval): + if self.prototype is not None: + if lval in self.own: + return false + return self.prototype.delete(lval) + # we are in global scope here. Must exist and be configurable to delete + if lval not in self.own: + # this lval does not exist, why do you want to delete it??? + return true + if self.own[lval]['configurable']: + del self.own[lval] + return true + # not configurable, cant delete + return false + + def pyimport(self, name, module): + self.register(name) + self.put(name, py_wrap(module)) + + def __repr__(self): + return u'[Object Global]' + + def to_python(self): + return to_python(self) + + +class This(Scope): + IS_CHILD_SCOPE = False + + def get(self, prop, throw=False): + return Scope.get(self, prop, throw) + + +class JsObjectWrapper(object): + def __init__(self, obj): + self.__dict__['_obj'] = obj + + def __call__(self, *args): + args = tuple(Js(e) for e in args) + if '_prop_of' in self.__dict__: + parent, meth = self.__dict__['_prop_of'] + return to_python(parent._obj.callprop(meth, *args)) + return to_python(self._obj(*args)) + + def __getattr__(self, item): + if item == 'new' and self._obj.is_callable(): + # return instance initializer + def PyJsInstanceInit(*args): + args = tuple(Js(e) for e in args) + return self._obj.create(*args).to_python() + + return PyJsInstanceInit + cand = to_python(self._obj.get(str(item))) + # handling method calling... obj.meth(). Value of this in meth should be self + if isinstance(cand, self.__class__): + cand.__dict__['_prop_of'] = self, str(item) + return cand + + def __setattr__(self, item, value): + self._obj.put(str(item), Js(value)) + + def __getitem__(self, item): + cand = to_python(self._obj.get(str(item))) + if isinstance(cand, self.__class__): + cand.__dict__['_prop_of'] = self, str(item) + return cand + + def __setitem__(self, item, value): + self._obj.put(str(item), Js(value)) + + def __iter__(self): + if self._obj.Class in [ + 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', + 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array' + ]: + return iter(self.to_list()) + elif self._obj.Class == 'Object': + return iter(self.to_dict()) + else: + raise MakeError('TypeError', + '%s is not iterable in Python' % self._obj.Class) + + def __repr__(self): + if self._obj.is_primitive() or self._obj.is_callable(): + return repr(self._obj) + elif self._obj.Class in ('Array', 'Int8Array', 'Uint8Array', + 'Uint8ClampedArray', 'Int16Array', + 'Uint16Array', 'Int32Array', 'Uint32Array', + 'Float32Array', 'Float64Array', 'Arguments'): + return repr(self.to_list()) + return repr(self.to_dict()) + + def __len__(self): + return len(self._obj) + + def __nonzero__(self): + return bool(self._obj) + + def __bool__(self): + return bool(self._obj) + + def to_dict(self): + return to_dict(self.__dict__['_obj']) + + def to_list(self): + return to_list(self.__dict__['_obj']) + + +class PyObjectWrapper(PyJs): + Class = 'PyObjectWrapper' + + def __init__(self, obj): + self.obj = obj + + def get(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + if prop.isdigit(): + return py_wrap(self.obj[int(prop)]) + return py_wrap(getattr(self.obj, prop)) + except: + return undefined + + def put(self, prop, val, op=None, throw=False): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + if isinstance(op, bool): + raise ValueError("Op must be a string") + elif op is not None: + if op: # increment operation + val = getattr(self.get(prop), OP_METHODS[op])(val) + setattr(self.obj, prop, to_python(val)) + except AttributeError: + raise MakeError('TypeError', 'Read only object probably...') + return val + + def __call__(self, *args): + py_args = tuple(to_python(e) for e in args) + try: + py_res = self.obj.__call__(*py_args) + except Exception as e: + message = 'your Python function failed! ' + try: + message += e.message + except: + pass + raise MakeError('Error', message) + return py_wrap(py_res) + + def callprop(self, prop, *args): + py_args = tuple(to_python(e) for e in args) + if not isinstance(prop, basestring): + prop = prop.to_string().value + return self.get(prop)(*py_args) + + def delete(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + if prop.isdigit(): + del self.obj[int(prop)] + else: + delattr(self.obj, prop) + return true + except: + return false + + def __repr__(self): + return 'PyObjectWrapper(%s)' % str(self.obj) + + def to_python(self): + return self.obj + + def to_py(self): + return self.obj + + +def py_wrap(py): + if isinstance(py, (FunctionType, BuiltinFunctionType, MethodType, + BuiltinMethodType, dict, int, str, bool, float, list, + tuple, long, basestring)) or py is None: + return HJs(py) + return PyObjectWrapper(py) + + +############################################################################## +#Define types + + +#Object +class PyJsObject(PyJs): + Class = 'Object' + + def __init__(self, prop_descs={}, prototype=None, extensible=True): + self.prototype = prototype + self.extensible = extensible + self.own = {} + for prop, desc in six.iteritems(prop_descs): + self.define_own_property(prop, desc) + + def __repr__(self): + return repr(self.to_python().to_dict()) + + +ObjectPrototype = PyJsObject() + + +#Function +class PyJsFunction(PyJs): + Class = 'Function' + + def __init__(self, func, prototype=None, extensible=True, source=None): + cand = fix_js_args(func) + has_scope = cand is func + func = cand + self.argcount = six.get_function_code(func).co_argcount - 2 - has_scope + self.code = func + self.source = source if source else '{ [python code] }' + self.func_name = func.__name__ if not func.__name__.startswith( + 'PyJs_anonymous') else '' + self.extensible = extensible + self.prototype = prototype + self.own = {} + #set own property length to the number of arguments + self.define_own_property( + 'length', { + 'value': Js(self.argcount), + 'writable': False, + 'enumerable': False, + 'configurable': False + }) + + if self.func_name: + self.define_own_property( + 'name', { + 'value': Js(self.func_name), + 'writable': False, + 'enumerable': False, + 'configurable': True + }) + + # set own prototype + proto = Js({}) + # constructor points to this function + proto.define_own_property( + 'constructor', { + 'value': self, + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + self.define_own_property( + 'prototype', { + 'value': proto, + 'writable': True, + 'enumerable': False, + 'configurable': False + }) + + def _set_name(self, name): + '''name is py type''' + if self.own.get('name'): + self.func_name = name + self.own['name']['value'] = Js(name) + + def construct(self, *args): + proto = self.get('prototype') + if not proto.is_object(): # set to standard prototype + proto = ObjectPrototype + obj = PyJsObject(prototype=proto) + cand = self.call(obj, *args) + return cand if cand.is_object() else obj + + def call(self, this, args=()): + '''Calls this function and returns a result + (converted to PyJs type so func can return python types) + + this must be a PyJs object and args must be a python tuple of PyJs objects. + + arguments object is passed automatically and will be equal to Js(args) + (tuple converted to arguments object).You dont need to worry about number + of arguments you provide if you supply less then missing ones will be set + to undefined (but not present in arguments object). + And if you supply too much then excess will not be passed + (but they will be present in arguments object). + ''' + if not hasattr(args, '__iter__'): #get rid of it later + args = (args, ) + args = tuple(Js(e) for e in args) # this wont be needed later + + arguments = PyJsArguments( + args, self) # tuple will be converted to arguments object. + arglen = self.argcount #function expects this number of args. + if len(args) > arglen: + args = args[0:arglen] + elif len(args) < arglen: + args += (undefined, ) * (arglen - len(args)) + args += this, arguments #append extra params to the arg list + try: + return Js(self.code(*args)) + except NotImplementedError: + raise + except RuntimeError as e: # maximum recursion + raise MakeError( + 'RangeError', e.message if + not isinstance(e, NotImplementedError) else 'Not implemented!') + + def has_instance(self, other): + # I am not sure here so instanceof may not work lol. + if not other.is_object(): + return false + proto = self.get('prototype') + if not proto.is_object(): + raise TypeError( + 'Function has non-object prototype in instanceof check') + while True: + other = other.prototype + if not other: # todo make sure that the condition is not None or null + return false + if other is proto: + return true + + def create(self, *args): + proto = self.get('prototype') + if not proto.is_object(): + proto = ObjectPrototype + new = PyJsObject(prototype=proto) + res = self.call(new, args) + if res.is_object(): + return res + return new + + +class PyJsBoundFunction(PyJsFunction): + def __init__(self, target, bound_this, bound_args): + self.target = target + self.bound_this = bound_this + self.bound_args = bound_args + self.argcount = target.argcount + self.code = target.code + self.source = target.source + self.func_name = target.func_name + self.extensible = True + self.prototype = FunctionPrototype + self.own = {} + # set own property length to the number of arguments + self.define_own_property( + 'length', { + 'value': target.get('length') - Js(len(self.bound_args)), + 'writable': False, + 'enumerable': False, + 'configurable': False + }) + + if self.func_name: + self.define_own_property( + 'name', { + 'value': Js(self.func_name), + 'writable': False, + 'enumerable': False, + 'configurable': True + }) + + # set own prototype + proto = Js({}) + # constructor points to this function + proto.define_own_property( + 'constructor', { + 'value': self, + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + self.define_own_property( + 'prototype', { + 'value': proto, + 'writable': True, + 'enumerable': False, + 'configurable': False + }) + + def call(self, this, args=()): + return self.target.call(self.bound_this, self.bound_args + args) + + def has_instance(self, other): + return self.target.has_instance(other) + + +PyJs.PyJsBoundFunction = PyJsBoundFunction + +OP_METHODS = { + '*': '__mul__', + '/': '__div__', + '%': '__mod__', + '+': '__add__', + '-': '__sub__', + '<<': '__lshift__', + '>>': '__rshift__', + '&': '__and__', + '^': '__xor__', + '|': '__or__', + '>>>': 'pyjs_bshift' +} + + +def Empty(): + return Js(None) + + +#Number +class PyJsNumber(PyJs): #Note i dont implement +0 and -0. Just 0. + TYPE = 'Number' + Class = 'Number' + + +NumberPrototype = PyJsObject({}, ObjectPrototype) +NumberPrototype.Class = 'Number' +NumberPrototype.value = 0 + +Infinity = PyJsNumber(float('inf'), NumberPrototype) +NaN = PyJsNumber(float('nan'), NumberPrototype) +PyJs.NaN = NaN +PyJs.Infinity = Infinity + +# This dict aims to increase speed of string creation by storing character instances +CHAR_BANK = {} +NUM_BANK = {} +PyJs.CHAR_BANK = CHAR_BANK + + +#String +# Different than implementation design in order to improve performance +#for example I dont create separate property for each character in string, it would take ages. +class PyJsString(PyJs): + TYPE = 'String' + Class = 'String' + extensible = False + + def __init__(self, value=None, prototype=None): + '''Constructor for Number String and Boolean''' + if not isinstance(value, basestring): + raise TypeError # this will be internal error + self.value = value + self.prototype = prototype + self.own = {} + # this should be optimized because its mych slower than python str creation (about 50 times!) + # Dont create separate properties for every index. Just + self.own['length'] = { + 'value': Js(len(value)), + 'writable': False, + 'enumerable': False, + 'configurable': False + } + if len(value) == 1: + CHAR_BANK[value] = self #, 'writable': False, + # 'enumerable': True, 'configurable': False} + + def get(self, prop): + if not isinstance(prop, basestring): + prop = prop.to_string().value + try: + index = int(prop) + if index < 0: + return undefined + char = self.value[index] + if char not in CHAR_BANK: + Js(char) # this will add char to CHAR BANK + return CHAR_BANK[char] + except Exception: + pass + return PyJs.get(self, prop) + + def can_put(self, prop): + return False + + def __iter__(self): + for i in xrange(len(self.value)): + yield Js(i) # maybe create an int bank? + + +StringPrototype = PyJsObject({}, ObjectPrototype) +StringPrototype.Class = 'String' +StringPrototype.value = '' + +CHAR_BANK[''] = Js('') + + +#Boolean +class PyJsBoolean(PyJs): + TYPE = 'Boolean' + Class = 'Boolean' + + +BooleanPrototype = PyJsObject({}, ObjectPrototype) +BooleanPrototype.Class = 'Boolean' +BooleanPrototype.value = False + +true = PyJsBoolean(True, BooleanPrototype) +false = PyJsBoolean(False, BooleanPrototype) + + +#Undefined +class PyJsUndefined(PyJs): + TYPE = 'Undefined' + Class = 'Undefined' + + def __init__(self): + pass + + +undefined = PyJsUndefined() + + +#Null +class PyJsNull(PyJs): + TYPE = 'Null' + Class = 'Null' + + def __init__(self): + pass + + +null = PyJsNull() +PyJs.null = null + + +class PyJsArray(PyJs): + Class = 'Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsArrayBuffer(PyJs): + Class = 'ArrayBuffer' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsInt8Array(PyJs): + Class = 'Int8Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint8Array(PyJs): + Class = 'Uint8Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint8ClampedArray(PyJs): + Class = 'Uint8ClampedArray' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsInt16Array(PyJs): + Class = 'Int16Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint16Array(PyJs): + Class = 'Uint16Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsInt32Array(PyJs): + Class = 'Int32Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsUint32Array(PyJs): + Class = 'Uint32Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsFloat32Array(PyJs): + Class = 'Float32Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +class PyJsFloat64Array(PyJs): + Class = 'Float64Array' + + def __init__(self, arr=[], prototype=None): + self.extensible = True + self.prototype = prototype + self.own = { + 'length': { + 'value': Js(0), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + for i, e in enumerate(arr): + self.define_own_property( + str(i), { + 'value': Js(e), + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + + def define_own_property(self, prop, desc): + old_len_desc = self.get_own_property('length') + old_len = old_len_desc[ + 'value'].value # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc) + new_len = desc['value'].to_uint32() + if new_len != desc['value'].to_number().value: + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = Js(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + str(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = Js(old_len + 1) + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + elif prop.isdigit(): + index = int(int(prop) % 2**32) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc): + return False + if index >= old_len: + old_len_desc['value'] = Js(index + 1) + return True + else: + return PyJs.define_own_property(self, prop, desc) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + def __repr__(self): + return repr(self.to_python().to_list()) + + +ArrayPrototype = PyJsArray([], ObjectPrototype) + +ArrayBufferPrototype = PyJsArrayBuffer([], ObjectPrototype) + +Int8ArrayPrototype = PyJsInt8Array([], ObjectPrototype) + +Uint8ArrayPrototype = PyJsUint8Array([], ObjectPrototype) + +Uint8ClampedArrayPrototype = PyJsUint8ClampedArray([], ObjectPrototype) + +Int16ArrayPrototype = PyJsInt16Array([], ObjectPrototype) + +Uint16ArrayPrototype = PyJsUint16Array([], ObjectPrototype) + +Int32ArrayPrototype = PyJsInt32Array([], ObjectPrototype) + +Uint32ArrayPrototype = PyJsUint32Array([], ObjectPrototype) + +Float32ArrayPrototype = PyJsFloat32Array([], ObjectPrototype) + +Float64ArrayPrototype = PyJsFloat64Array([], ObjectPrototype) + + +class PyJsArguments(PyJs): + Class = 'Arguments' + + def __init__(self, args, callee): + self.own = {} + self.extensible = True + self.prototype = ObjectPrototype + self.define_own_property( + 'length', { + 'value': Js(len(args)), + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + self.define_own_property( + 'callee', { + 'value': callee, + 'writable': True, + 'enumerable': False, + 'configurable': True + }) + for i, e in enumerate(args): + self.put(str(i), Js(e)) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + +#We can define function proto after number proto because func uses number in its init +FunctionPrototype = PyJsFunction(Empty, ObjectPrototype) +FunctionPrototype.own['name']['value'] = Js('') + +# I will not rewrite RegExp engine from scratch. I will use re because its much faster. +# I have to only make sure that I am handling all the differences correctly. +REGEXP_DB = {} + + +class PyJsRegExp(PyJs): + Class = 'RegExp' + extensible = True + + def __init__(self, regexp, prototype=None): + + self.prototype = prototype + self.glob = False + self.ignore_case = 0 + self.multiline = 0 + # self._cache = {'str':'NoStringEmpty23093', + # 'iterator': None, + # 'lastpos': -1, + # 'matches': {}} + flags = '' + if not regexp[-1] == '/': + #contains some flags (allowed are i, g, m + spl = regexp.rfind('/') + flags = set(regexp[spl + 1:]) + self.value = regexp[1:spl] + if 'g' in flags: + self.glob = True + if 'i' in flags: + self.ignore_case = re.IGNORECASE + if 'm' in flags: + self.multiline = re.MULTILINE + else: + self.value = regexp[1:-1] + + try: + if self.value in REGEXP_DB: + self.pat = REGEXP_DB[regexp] + else: + comp = 'None' + # we have to check whether pattern is valid. + # also this will speed up matching later + # todo critical fix patter conversion etc. ..!!!!! + # ugly hacks porting js reg exp to py reg exp works in 99% of cases ;) + possible_fixes = [(u'[]', u'[\0]'), (u'[^]', u'[^\0]'), + (u'nofix1791', u'nofix1791')] + reg = self.value + for fix, rep in possible_fixes: + comp = REGEXP_CONVERTER._interpret_regexp(reg, flags) + #print 'reg -> comp', reg, '->', comp + try: + self.pat = re.compile( + comp, self.ignore_case | self.multiline) + #print reg, '->', comp + break + except: + reg = reg.replace(fix, rep) + # print 'Fix', fix, '->', rep, '=', reg + else: + raise + REGEXP_DB[regexp] = self.pat + except: + #print 'Invalid pattern but fuck it', self.value, comp + raise MakeError( + 'SyntaxError', + 'Invalid RegExp pattern: %s -> %s' % (repr(self.value), + repr(comp))) + # now set own properties: + self.own = { + 'source': { + 'value': Js(self.value), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'global': { + 'value': Js(self.glob), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'ignoreCase': { + 'value': Js(bool(self.ignore_case)), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'multiline': { + 'value': Js(bool(self.multiline)), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'lastIndex': { + 'value': Js(0), + 'enumerable': False, + 'writable': True, + 'configurable': False + } + } + + def match(self, string, pos): + '''string is of course py string''' + return self.pat.match(string, pos) # way easier :) + # assert 0<=pos <= len(string) + # if not pos: + # return re.match(self.pat, string) + # else: + # if self._cache['str']==string: + # if pos>self._cache['lastpos']: + # for m in self._cache['iterator']: + # start = m.start() + # self._cache['lastpos'] = start + # self._cache['matches'][start] = m + # if start==pos: + # return m + # elif start>pos: + # return None + # self._cache['lastpos'] = len(string) + # return None + # else: + # return self._cache['matches'].get(pos) + # else: + # self._cache['str'] = string + # self._cache['matches'] = {} + # self._cache['lastpos'] = -1 + # self._cache['iterator'] = re.finditer(self.pat, string) + # return self.match(string, pos) + + +def JsRegExp(source): + # Takes regexp literal! + return PyJsRegExp(source, RegExpPrototype) + + +RegExpPrototype = PyJsRegExp('/(?:)/', ObjectPrototype) + +####Exceptions: +default_attrs = {'writable': True, 'enumerable': False, 'configurable': True} + + +def fill_in_props(obj, props, default_desc): + for prop, value in props.items(): + default_desc['value'] = Js(value) + obj.define_own_property(prop, default_desc) + + +class PyJsError(PyJs): + Class = 'Error' + extensible = True + + def __init__(self, message=None, prototype=None): + self.prototype = prototype + self.own = {} + if message is not None: + self.put('message', Js(message).to_string()) + self.own['message']['enumerable'] = False + + +ErrorPrototype = PyJsError(Js(''), ObjectPrototype) + + +@Js +def Error(message): + return PyJsError(None if message.is_undefined() else message, + ErrorPrototype) + + +Error.create = Error +err = {'name': 'Error', 'constructor': Error} +fill_in_props(ErrorPrototype, err, default_attrs) +Error.define_own_property( + 'prototype', { + 'value': ErrorPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + + +def define_error_type(name): + TypeErrorPrototype = PyJsError(None, ErrorPrototype) + + @Js + def TypeError(message): + return PyJsError(None if message.is_undefined() else message, + TypeErrorPrototype) + + err = {'name': name, 'constructor': TypeError} + fill_in_props(TypeErrorPrototype, err, default_attrs) + TypeError.define_own_property( + 'prototype', { + 'value': TypeErrorPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + ERRORS[name] = TypeError + + +ERRORS = {'Error': Error} +ERROR_NAMES = ['Eval', 'Type', 'Range', 'Reference', 'Syntax', 'URI'] + +for e in ERROR_NAMES: + define_error_type(e + 'Error') + +############################################################################## +# Import and fill prototypes here. + + +#this works only for data properties +def fill_prototype(prototype, Class, attrs, constructor=False): + for i in dir(Class): + e = getattr(Class, i) + if six.PY2: + if hasattr(e, '__func__'): + temp = PyJsFunction(e.__func__, FunctionPrototype) + attrs = dict((k, v) for k, v in attrs.iteritems()) + attrs['value'] = temp + prototype.define_own_property(i, attrs) + else: + if hasattr(e, '__call__') and not i.startswith('__'): + temp = PyJsFunction(e, FunctionPrototype) + attrs = dict((k, v) for k, v in attrs.items()) + attrs['value'] = temp + prototype.define_own_property(i, attrs) + if constructor: + attrs['value'] = constructor + prototype.define_own_property('constructor', attrs) + + +PyJs.undefined = undefined +PyJs.Js = staticmethod(Js) + +from .prototypes import jsfunction, jsobject, jsnumber, jsstring, jsboolean, jsarray, jsregexp, jserror, jsarraybuffer, jstypedarray + +#Object proto +fill_prototype(ObjectPrototype, jsobject.ObjectPrototype, default_attrs) + + +#Define __proto__ accessor (this cant be done by fill_prototype since) +@Js +def __proto__(): + return this.prototype if this.prototype is not None else null + + +getter = __proto__ + + +@Js +def __proto__(val): + if val.is_object(): + this.prototype = val + + +setter = __proto__ +ObjectPrototype.define_own_property('__proto__', { + 'set': setter, + 'get': getter, + 'enumerable': False, + 'configurable': True +}) + +#Function proto +fill_prototype(FunctionPrototype, jsfunction.FunctionPrototype, default_attrs) +#Number proto +fill_prototype(NumberPrototype, jsnumber.NumberPrototype, default_attrs) +#String proto +fill_prototype(StringPrototype, jsstring.StringPrototype, default_attrs) +#Boolean proto +fill_prototype(BooleanPrototype, jsboolean.BooleanPrototype, default_attrs) +#Array proto +fill_prototype(ArrayPrototype, jsarray.ArrayPrototype, default_attrs) +# ArrayBuffer proto +fill_prototype(ArrayBufferPrototype, jsarraybuffer.ArrayBufferPrototype, + default_attrs) +# Int8Array proto +fill_prototype(Int8ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint8Array proto +fill_prototype(Uint8ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint8ClampedArray proto +fill_prototype(Uint8ClampedArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Int16Array proto +fill_prototype(Int16ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint16Array proto +fill_prototype(Uint16ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Int32Array proto +fill_prototype(Int32ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Uint32Array proto +fill_prototype(Uint32ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Float32Array proto +fill_prototype(Float32ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +# Float64Array proto +fill_prototype(Float64ArrayPrototype, jstypedarray.TypedArrayPrototype, + default_attrs) +#Error proto +fill_prototype(ErrorPrototype, jserror.ErrorPrototype, default_attrs) +#RegExp proto +fill_prototype(RegExpPrototype, jsregexp.RegExpPrototype, default_attrs) +# add exec to regexpfunction (cant add it automatically because of its name :( +RegExpPrototype.own['exec'] = RegExpPrototype.own['exec2'] +del RegExpPrototype.own['exec2'] + +######################################################################### +# Constructors + + +# String +@Js +def String(st): + if not len(arguments): + return Js('') + return arguments[0].to_string() + + +@Js +def string_constructor(): + temp = PyJsObject(prototype=StringPrototype) + temp.Class = 'String' + #temp.TYPE = 'String' + if not len(arguments): + temp.value = '' + else: + temp.value = arguments[0].to_string().value + for i, ch in enumerate(temp.value): # this will make things long... + temp.own[str(i)] = { + 'value': Js(ch), + 'writable': False, + 'enumerable': True, + 'configurable': True + } + temp.own['length'] = { + 'value': Js(len(temp.value)), + 'writable': False, + 'enumerable': False, + 'configurable': False + } + return temp + + +String.create = string_constructor + +# RegExp +REG_EXP_FLAGS = ('g', 'i', 'm') + + +@Js +def RegExp(pattern, flags): + if pattern.Class == 'RegExp': + if not flags.is_undefined(): + raise MakeError( + 'TypeError', + 'Cannot supply flags when constructing one RegExp from another' + ) + # return unchanged + return pattern + #pattern is not a regexp + if pattern.is_undefined(): + pattern = '' + else: + pattern = pattern.to_string().value + # try: + # pattern = REGEXP_CONVERTER._unescape_string(pattern.to_string().value) + # except: + # raise MakeError('SyntaxError', 'Invalid regexp') + flags = flags.to_string().value if not flags.is_undefined() else '' + for flag in flags: + if flag not in REG_EXP_FLAGS: + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flag) + if len(set(flags)) != len(flags): + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flags) + pattern = '/%s/' % (pattern if pattern else '(?:)') + flags + return JsRegExp(pattern) + + +RegExp.create = RegExp +PyJs.RegExp = RegExp + +# Number + + +@Js +def Number(): + if len(arguments): + return arguments[0].to_number() + else: + return Js(0) + + +@Js +def number_constructor(): + temp = PyJsObject(prototype=NumberPrototype) + temp.Class = 'Number' + #temp.TYPE = 'Number' + if len(arguments): + temp.value = arguments[0].to_number().value + else: + temp.value = 0 + return temp + + +Number.create = number_constructor + +# Boolean + + +@Js +def Boolean(value): + return value.to_boolean() + + +@Js +def boolean_constructor(value): + temp = PyJsObject(prototype=BooleanPrototype) + temp.Class = 'Boolean' + #temp.TYPE = 'Boolean' + temp.value = value.to_boolean().value + return temp + + +Boolean.create = boolean_constructor + +############################################################################## + + +def appengine(code): + try: + return translator.translate_js(code.decode('utf-8')) + except: + return traceback.format_exc() + + +builtins = ('true', 'false', 'null', 'undefined', 'Infinity', 'NaN') + +scope = dict(zip(builtins, [eval(e) for e in builtins])) + +JS_BUILTINS = dict((k, v) for k, v in scope.items()) + +# Fill in NUM_BANK +for e in xrange(-2**10, 2**14): + NUM_BANK[e] = Js(e) + +if __name__ == '__main__': + print(ObjectPrototype.get('toString').callprop('call')) + print(FunctionPrototype.own) + a = null - Js(49404) + x = a.put('ser', Js('der')) + print(Js(0) or Js('p') and Js(4.0000000000050000001)) + FunctionPrototype.put('Chuj', Js(409)) + for e in FunctionPrototype: + print('Obk', e.get('__proto__').get('__proto__').get('__proto__'), e) + import code + s = Js(4) + b = Js(6) + + s2 = Js(4) + o = ObjectPrototype + o.put('x', Js(100)) + var = Scope(scope) + e = code.InteractiveConsole(globals()) + #e.raw_input = interactor + e.interact() diff --git a/Contents/Libraries/Shared/js2py/constructors/__init__.py b/Contents/Libraries/Shared/js2py/constructors/__init__.py new file mode 100644 index 000000000..4bf956237 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/constructors/jsarray.py b/Contents/Libraries/Shared/js2py/constructors/jsarray.py new file mode 100644 index 000000000..1550589d7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsarray.py @@ -0,0 +1,48 @@ +from ..base import * + + +@Js +def Array(): + if len(arguments) == 0 or len(arguments) > 1: + return arguments.to_list() + a = arguments[0] + if isinstance(a, PyJsNumber): + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js([]) + temp.put('length', a) + return temp + return [a] + + +Array.create = Array +Array.own['length']['value'] = Js(1) + + +@Js +def isArray(arg): + return arg.Class == 'Array' + + +Array.define_own_property('isArray', { + 'value': isArray, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Array.define_own_property( + 'prototype', { + 'value': ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +ArrayPrototype.define_own_property('constructor', { + 'value': Array, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py b/Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py new file mode 100644 index 000000000..6da71aab3 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsarraybuffer.py @@ -0,0 +1,41 @@ +# this is based on jsarray.py + +# todo check everything :) + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def ArrayBuffer(): + a = arguments[0] + if isinstance(a, PyJsNumber): + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(bytearray([0] * length)) + return temp + return Js(bytearray([0])) + + +ArrayBuffer.create = ArrayBuffer +ArrayBuffer.own['length']['value'] = Js(None) + +ArrayBuffer.define_own_property( + 'prototype', { + 'value': ArrayBufferPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +ArrayBufferPrototype.define_own_property( + 'constructor', { + 'value': ArrayBuffer, + 'enumerable': False, + 'writable': False, + 'configurable': True + }) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsboolean.py b/Contents/Libraries/Shared/js2py/constructors/jsboolean.py new file mode 100644 index 000000000..743b110d6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsboolean.py @@ -0,0 +1,16 @@ +from ..base import * + +BooleanPrototype.define_own_property('constructor', { + 'value': Boolean, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Boolean.define_own_property( + 'prototype', { + 'value': BooleanPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsdate.py b/Contents/Libraries/Shared/js2py/constructors/jsdate.py new file mode 100644 index 000000000..98de64319 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsdate.py @@ -0,0 +1,405 @@ +from ..base import * +from .time_helpers import * + +TZ_OFFSET = (time.altzone // 3600) +ABS_OFFSET = abs(TZ_OFFSET) +TZ_NAME = time.tzname[1] +ISO_FORMAT = '%s-%s-%sT%s:%s:%s.%sZ' + + +@Js +def Date(year, month, date, hours, minutes, seconds, ms): + return now().to_string() + + +Date.Class = 'Date' + + +def now(): + return PyJsDate(int(time.time() * 1000), prototype=DatePrototype) + + +@Js +def UTC(year, month, date, hours, minutes, seconds, ms): # todo complete this + args = arguments + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili))) + return PyJsDate(t, prototype=DatePrototype) + + +@Js +def parse(string): + return PyJsDate( + TimeClip(parse_date(string.to_string().value)), + prototype=DatePrototype) + + +Date.define_own_property('now', { + 'value': Js(now), + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('parse', { + 'value': parse, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('UTC', { + 'value': UTC, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + + +class PyJsDate(PyJs): + Class = 'Date' + extensible = True + + def __init__(self, value, prototype=None): + self.value = value + self.own = {} + self.prototype = prototype + + # todo fix this problematic datetime part + def to_local_dt(self): + return datetime.datetime.utcfromtimestamp( + UTCToLocal(self.value) // 1000) + + def to_utc_dt(self): + return datetime.datetime.utcfromtimestamp(self.value // 1000) + + def local_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_local_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + def utc_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_utc_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + +def parse_date(py_string): # todo support all date string formats + try: + try: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%S.%fZ") + except: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%SZ") + return MakeDate( + MakeDay(Js(dt.year), Js(dt.month - 1), Js(dt.day)), + MakeTime( + Js(dt.hour), Js(dt.minute), Js(dt.second), + Js(dt.microsecond // 1000))) + except: + raise MakeError( + 'TypeError', + 'Could not parse date %s - unsupported date format. Currently only supported format is RFC3339 utc. Sorry!' + % py_string) + + +def date_constructor(*args): + if len(args) >= 2: + return date_constructor2(*args) + elif len(args) == 1: + return date_constructor1(args[0]) + else: + return date_constructor0() + + +def date_constructor0(): + return now() + + +def date_constructor1(value): + v = value.to_primitive() + if v._type() == 'String': + v = parse_date(v.value) + else: + v = v.to_int() + return PyJsDate(TimeClip(v), prototype=DatePrototype) + + +def date_constructor2(*args): + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip( + LocalToUTC(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili)))) + return PyJsDate(t, prototype=DatePrototype) + + +Date.create = date_constructor + +DatePrototype = PyJsDate(float('nan'), prototype=ObjectPrototype) + + +def check_date(obj): + if obj.Class != 'Date': + raise MakeError('TypeError', 'this is not a Date object') + + +class DateProto: + def toString(): + check_date(this) + if this.value is NaN: + return 'Invalid Date' + offset = (UTCToLocal(this.value) - this.value) // msPerHour + return this.local_strftime( + '%a %b %d %Y %H:%M:%S GMT') + '%s00 (%s)' % (pad( + offset, 2, True), GetTimeZoneName(this.value)) + + def toDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def toLocaleString(): + check_date(this) + return this.local_strftime('%d %B %Y %H:%M:%S') + + def toLocaleDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toLocaleTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def valueOf(): + check_date(this) + return this.value + + def getTime(): + check_date(this) + return this.value + + def getFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(UTCToLocal(this.value)) + + def getUTCFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(this.value) + + def getMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(UTCToLocal(this.value)) + + def getDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(UTCToLocal(this.value)) + + def getUTCMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(this.value) + + def getUTCDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(this.value) + + def getDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(UTCToLocal(this.value)) + + def getUTCDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(this.value) + + def getHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(UTCToLocal(this.value)) + + def getUTCHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(this.value) + + def getMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(UTCToLocal(this.value)) + + def getUTCMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(this.value) + + def getSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(UTCToLocal(this.value)) + + def getUTCSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(this.value) + + def getMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(UTCToLocal(this.value)) + + def getUTCMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(this.value) + + def getTimezoneOffset(): + check_date(this) + if this.value is NaN: + return NaN + return (this.value - UTCToLocal(this.value)) // 60000 + + def setTime(time): + check_date(this) + this.value = TimeClip(time.to_number().to_int()) + return this.value + + def setMilliseconds(ms): + check_date(this) + t = UTCToLocal(this.value) + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(LocalToUTC(MakeDate(Day(t), tim))) + this.value = u + return u + + def setUTCMilliseconds(ms): + check_date(this) + t = this.value + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(MakeDate(Day(t), tim)) + this.value = u + return u + + # todo Complete all setters! + + def toUTCString(): + check_date(this) + return this.utc_strftime('%d %B %Y %H:%M:%S') + + def toISOString(): + check_date(this) + t = this.value + year = YearFromTime(t) + month, day, hour, minute, second, milli = pad( + MonthFromTime(t) + 1), pad(DateFromTime(t)), pad( + HourFromTime(t)), pad(MinFromTime(t)), pad( + SecFromTime(t)), pad(msFromTime(t)) + return ISO_FORMAT % (unicode(year) if 0 <= year <= 9999 else pad( + year, 6, True), month, day, hour, minute, second, milli) + + def toJSON(key): + o = this.to_object() + tv = o.to_primitive('Number') + if tv.Class == 'Number' and not tv.is_finite(): + return this.null + toISO = o.get('toISOString') + if not toISO.is_callable(): + raise this.MakeError('TypeError', 'toISOString is not callable') + return toISO.call(o, ()) + + +def pad(num, n=2, sign=False): + '''returns n digit string representation of the num''' + s = unicode(abs(num)) + if len(s) < n: + s = '0' * (n - len(s)) + s + if not sign: + return s + if num >= 0: + return '+' + s + else: + return '-' + s + + +fill_prototype(DatePrototype, DateProto, default_attrs) + +Date.define_own_property( + 'prototype', { + 'value': DatePrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +DatePrototype.define_own_property('constructor', { + 'value': Date, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py b/Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py new file mode 100644 index 000000000..3a1219167 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsfloat32array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Float32Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.float32)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.float32)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.float32)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 4 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Float32Array should be a multiple of 4') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 4 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Float32Array should be a multiple of 4') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 4) + array = numpy.frombuffer( + a.obj, dtype=numpy.float32, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.float32)) + temp.put('length', Js(0)) + return temp + + +Float32Array.create = Float32Array +Float32Array.own['length']['value'] = Js(3) + +Float32Array.define_own_property( + 'prototype', { + 'value': Float32ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Float32ArrayPrototype.define_own_property( + 'constructor', { + 'value': Float32Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Float32ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(4), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py b/Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py new file mode 100644 index 000000000..9ea5f052a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsfloat64array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Float64Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.float64)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.float64)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.float64)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 8 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Float64Array should be a multiple of 8') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 8 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Float64Array should be a multiple of 8') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 8) + array = numpy.frombuffer( + a.obj, dtype=numpy.float64, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.float64)) + temp.put('length', Js(0)) + return temp + + +Float64Array.create = Float64Array +Float64Array.own['length']['value'] = Js(3) + +Float64Array.define_own_property( + 'prototype', { + 'value': Float64ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Float64ArrayPrototype.define_own_property( + 'constructor', { + 'value': Float64Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Float64ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(8), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsfunction.py b/Contents/Libraries/Shared/js2py/constructors/jsfunction.py new file mode 100644 index 000000000..c4ace2c39 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsfunction.py @@ -0,0 +1,52 @@ +from ..base import * +try: + from ..translators.translator import translate_js +except: + pass + + +@Js +def Function(): + # convert arguments to python list of strings + a = [e.to_string().value for e in arguments.to_list()] + body = ';' + args = () + if len(a): + body = '%s;' % a[-1] + args = a[:-1] + # translate this function to js inline function + js_func = '(function (%s) {%s})' % (','.join(args), body) + # now translate js inline to python function + py_func = translate_js(js_func, '') + # add set func scope to global scope + # a but messy solution but works :) + globals()['var'] = PyJs.GlobalObject + # define py function and return it + temp = executor(py_func, globals()) + temp.source = '{%s}' % body + temp.func_name = 'anonymous' + return temp + + +def executor(f, glob): + exec (f, globals()) + return globals()['PyJs_anonymous_0_'] + + +#new statement simply calls Function +Function.create = Function + +#set constructor property inside FunctionPrototype + +fill_in_props(FunctionPrototype, {'constructor': Function}, default_attrs) + +#attach prototype to Function constructor +Function.define_own_property( + 'prototype', { + 'value': FunctionPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) +#Fix Function length (its 0 and should be 1) +Function.own['length']['value'] = Js(1) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsint16array.py b/Contents/Libraries/Shared/js2py/constructors/jsint16array.py new file mode 100644 index 000000000..c2864105d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsint16array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Int16Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.int16)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.int16)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.int16)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 2 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Int16Array should be a multiple of 2') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 2 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Int16Array should be a multiple of 2') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 2) + array = numpy.frombuffer( + a.obj, dtype=numpy.int16, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.int16)) + temp.put('length', Js(0)) + return temp + + +Int16Array.create = Int16Array +Int16Array.own['length']['value'] = Js(3) + +Int16Array.define_own_property( + 'prototype', { + 'value': Int16ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Int16ArrayPrototype.define_own_property( + 'constructor', { + 'value': Int16Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Int16ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(2), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsint32array.py b/Contents/Libraries/Shared/js2py/constructors/jsint32array.py new file mode 100644 index 000000000..2e8c4e846 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsint32array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Int32Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.int32)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.int32)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.int32)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 4 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Int32Array should be a multiple of 4') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 4 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Int32Array should be a multiple of 4') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 4) + array = numpy.frombuffer( + a.obj, dtype=numpy.int32, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.int32)) + temp.put('length', Js(0)) + return temp + + +Int32Array.create = Int32Array +Int32Array.own['length']['value'] = Js(3) + +Int32Array.define_own_property( + 'prototype', { + 'value': Int32ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Int32ArrayPrototype.define_own_property( + 'constructor', { + 'value': Int32Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Int32ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(4), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsint8array.py b/Contents/Libraries/Shared/js2py/constructors/jsint8array.py new file mode 100644 index 000000000..3396afea0 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsint8array.py @@ -0,0 +1,79 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Int8Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.int8)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.int8)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.int8)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int(len(a.obj) - offset) + array = numpy.frombuffer( + a.obj, dtype=numpy.int8, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.int8)) + temp.put('length', Js(0)) + return temp + + +Int8Array.create = Int8Array +Int8Array.own['length']['value'] = Js(3) + +Int8Array.define_own_property( + 'prototype', { + 'value': Int8ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Int8ArrayPrototype.define_own_property( + 'constructor', { + 'value': Int8Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Int8ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(1), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsmath.py b/Contents/Libraries/Shared/js2py/constructors/jsmath.py new file mode 100644 index 000000000..06751a3b2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsmath.py @@ -0,0 +1,157 @@ +from ..base import * +import math +import random + +Math = PyJsObject(prototype=ObjectPrototype) +Math.Class = 'Math' + +CONSTANTS = { + 'E': 2.7182818284590452354, + 'LN10': 2.302585092994046, + 'LN2': 0.6931471805599453, + 'LOG2E': 1.4426950408889634, + 'LOG10E': 0.4342944819032518, + 'PI': 3.1415926535897932, + 'SQRT1_2': 0.7071067811865476, + 'SQRT2': 1.4142135623730951 +} + +for constant, value in CONSTANTS.items(): + Math.define_own_property( + constant, { + 'value': Js(value), + 'writable': False, + 'enumerable': False, + 'configurable': False + }) + + +class MathFunctions: + def abs(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return abs(a) + + def acos(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return math.acos(a) + except: + return NaN + + def asin(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return math.asin(a) + except: + return NaN + + def atan(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.atan(a) + + def atan2(y, x): + a = x.to_number().value + b = y.to_number().value + if a != a or b != b: # it must be a nan + return NaN + return math.atan2(b, a) + + def ceil(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.ceil(a) + + def floor(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.floor(a) + + def round(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return round(a) + + def sin(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.sin(a) + + def cos(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.cos(a) + + def tan(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.tan(a) + + def log(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return math.log(a) + except: + return NaN + + def exp(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + return math.exp(a) + + def pow(x, y): + a = x.to_number().value + b = y.to_number().value + if a != a or b != b: # it must be a nan + return NaN + try: + return a**b + except: + return NaN + + def sqrt(x): + a = x.to_number().value + if a != a: # it must be a nan + return NaN + try: + return a**0.5 + except: + return NaN + + def min(): + if not len(arguments): + return Infinity + lis = tuple(e.to_number().value for e in arguments.to_list()) + if any(e != e for e in lis): # we dont want NaNs + return NaN + return min(*lis) + + def max(): + if not len(arguments): + return -Infinity + lis = tuple(e.to_number().value for e in arguments.to_list()) + if any(e != e for e in lis): # we dont want NaNs + return NaN + return max(*lis) + + def random(): + return random.random() + + +fill_prototype(Math, MathFunctions, default_attrs) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsnumber.py b/Contents/Libraries/Shared/js2py/constructors/jsnumber.py new file mode 100644 index 000000000..9ba7c7c79 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsnumber.py @@ -0,0 +1,23 @@ +from ..base import * + +CONSTS = { + 'prototype': NumberPrototype, + 'MAX_VALUE': 1.7976931348623157e308, + 'MIN_VALUE': 5.0e-324, + 'NaN': NaN, + 'NEGATIVE_INFINITY': float('-inf'), + 'POSITIVE_INFINITY': float('inf') +} + +fill_in_props(Number, CONSTS, { + 'enumerable': False, + 'writable': False, + 'configurable': False +}) + +NumberPrototype.define_own_property('constructor', { + 'value': Number, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsobject.py b/Contents/Libraries/Shared/js2py/constructors/jsobject.py new file mode 100644 index 000000000..c4e0ada39 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsobject.py @@ -0,0 +1,198 @@ +from ..base import * +import six + +#todo Double check everything is OK + + +@Js +def Object(): + val = arguments.get('0') + if val.is_null() or val.is_undefined(): + return PyJsObject(prototype=ObjectPrototype) + return val.to_object() + + +@Js +def object_constructor(): + if len(arguments): + val = arguments.get('0') + if val.TYPE == 'Object': + #Implementation dependent, but my will simply return :) + return val + elif val.TYPE in ('Number', 'String', 'Boolean'): + return val.to_object() + return PyJsObject(prototype=ObjectPrototype) + + +Object.create = object_constructor +Object.own['length']['value'] = Js(1) + + +class ObjectMethods: + def getPrototypeOf(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.getPrototypeOf called on non-object') + return null if obj.prototype is None else obj.prototype + + def getOwnPropertyDescriptor(obj, prop): + if not obj.is_object(): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + return obj.own.get( + prop.to_string(). + value) # will return undefined if we dont have this prop + + def getOwnPropertyNames(obj): + if not obj.is_object(): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + return obj.own.keys() + + def create(obj): + if not (obj.is_object() or obj.is_null()): + raise MakeError('TypeError', + 'Object prototype may only be an Object or null') + temp = PyJsObject(prototype=(None if obj.is_null() else obj)) + if len(arguments) > 1 and not arguments[1].is_undefined(): + if six.PY2: + ObjectMethods.defineProperties.__func__(temp, arguments[1]) + else: + ObjectMethods.defineProperties(temp, arguments[1]) + return temp + + def defineProperty(obj, prop, attrs): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.defineProperty called on non-object') + name = prop.to_string().value + if not obj.define_own_property(name, ToPropertyDescriptor(attrs)): + raise MakeError('TypeError', 'Cannot redefine property: %s' % name) + return obj + + def defineProperties(obj, properties): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.defineProperties called on non-object') + props = properties.to_object() + for name in props: + desc = ToPropertyDescriptor(props.get(name.value)) + if not obj.define_own_property(name.value, desc): + raise MakeError( + 'TypeError', + 'Failed to define own property: %s' % name.value) + return obj + + def seal(obj): + if not obj.is_object(): + raise MakeError('TypeError', 'Object.seal called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + obj.extensible = False + return obj + + def freeze(obj): + if not obj.is_object(): + raise MakeError('TypeError', 'Object.freeze called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + if is_data_descriptor(desc): + desc['writable'] = False + obj.extensible = False + return obj + + def preventExtensions(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.preventExtensions on non-object') + obj.extensible = False + return obj + + def isSealed(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.isSealed called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc['configurable']: + return False + return True + + def isFrozen(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.isFrozen called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc['configurable']: + return False + if is_data_descriptor(desc) and desc['writable']: + return False + return True + + def isExtensible(obj): + if not obj.is_object(): + raise MakeError('TypeError', + 'Object.isExtensible called on non-object') + return obj.extensible + + def keys(obj): + if not obj.is_object(): + raise MakeError('TypeError', 'Object.keys called on non-object') + return [e for e, d in six.iteritems(obj.own) if d.get('enumerable')] + + +# add methods attached to Object constructor +fill_prototype(Object, ObjectMethods, default_attrs) +# add constructor to prototype +fill_in_props(ObjectPrototype, {'constructor': Object}, default_attrs) +# add prototype property to the constructor. +Object.define_own_property( + 'prototype', { + 'value': ObjectPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +# some utility functions: + + +def ToPropertyDescriptor(obj): # page 38 (50 absolute) + if obj.TYPE != 'Object': + raise MakeError('TypeError', + 'Can\'t convert non-object to property descriptor') + desc = {} + if obj.has_property('enumerable'): + desc['enumerable'] = obj.get('enumerable').to_boolean().value + if obj.has_property('configurable'): + desc['configurable'] = obj.get('configurable').to_boolean().value + if obj.has_property('value'): + desc['value'] = obj.get('value') + if obj.has_property('writable'): + desc['writable'] = obj.get('writable').to_boolean().value + if obj.has_property('get'): + cand = obj.get('get') + if not (cand.is_undefined() or cand.is_callable()): + raise MakeError( + 'TypeError', + 'Invalid getter (it has to be a function or undefined)') + desc['get'] = cand + if obj.has_property('set'): + cand = obj.get('set') + if not (cand.is_undefined() or cand.is_callable()): + raise MakeError( + 'TypeError', + 'Invalid setter (it has to be a function or undefined)') + desc['set'] = cand + if ('get' in desc or 'set' in desc) and ('value' in desc + or 'writable' in desc): + raise MakeError( + 'TypeError', + 'Invalid property. A property cannot both have accessors and be writable or have a value.' + ) + return desc diff --git a/Contents/Libraries/Shared/js2py/constructors/jsregexp.py b/Contents/Libraries/Shared/js2py/constructors/jsregexp.py new file mode 100644 index 000000000..2dfc25cb9 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsregexp.py @@ -0,0 +1,16 @@ +from ..base import * + +RegExpPrototype.define_own_property('constructor', { + 'value': RegExp, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +RegExp.define_own_property( + 'prototype', { + 'value': RegExpPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsstring.py b/Contents/Libraries/Shared/js2py/constructors/jsstring.py new file mode 100644 index 000000000..0650d0f59 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsstring.py @@ -0,0 +1,40 @@ +from ..base import * +# python 3 support +import six +if six.PY3: + unichr = chr + + +@Js +def fromCharCode(): + args = arguments.to_list() + res = u'' + for e in args: + res += unichr(e.to_uint16()) + return this.Js(res) + + +fromCharCode.own['length']['value'] = Js(1) + +String.define_own_property( + 'fromCharCode', { + 'value': fromCharCode, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +String.define_own_property( + 'prototype', { + 'value': StringPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +StringPrototype.define_own_property('constructor', { + 'value': String, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint16array.py b/Contents/Libraries/Shared/js2py/constructors/jsuint16array.py new file mode 100644 index 000000000..a61be246d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint16array.py @@ -0,0 +1,87 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint16Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint16)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint16)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.uint16)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 2 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Uint16Array should be a multiple of 2') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 2 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Uint16Array should be a multiple of 2') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 2) + array = numpy.frombuffer( + a.obj, dtype=numpy.uint16, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint16)) + temp.put('length', Js(0)) + return temp + + +Uint16Array.create = Uint16Array +Uint16Array.own['length']['value'] = Js(3) + +Uint16Array.define_own_property( + 'prototype', { + 'value': Uint16ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint16ArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint16Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint16ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(2), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint32array.py b/Contents/Libraries/Shared/js2py/constructors/jsuint32array.py new file mode 100644 index 000000000..c6f57c94d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint32array.py @@ -0,0 +1,95 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint32Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint32)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint32)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = len(array) - offset + temp = Js( + numpy.array(array[offset:offset + length], dtype=numpy.uint32)) + temp.put('length', Js(length)) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(a.obj) % 4 != 0: + raise MakeError( + 'RangeError', + 'Byte length of Uint32Array should be a multiple of 4') + if len(arguments) > 1: + offset = int(arguments[1].value) + if offset % 4 != 0: + raise MakeError( + 'RangeError', + 'Start offset of Uint32Array should be a multiple of 4') + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int((len(a.obj) - offset) / 4) + temp = Js( + numpy.frombuffer( + a.obj, dtype=numpy.uint32, count=length, offset=offset)) + temp.put('length', Js(length)) + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint32)) + temp.put('length', Js(0)) + return temp + + +Uint32Array.create = Uint32Array +Uint32Array.own['length']['value'] = Js(3) + +Uint32Array.define_own_property( + 'prototype', { + 'value': Uint32ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint32ArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint32Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint32ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(4), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint8array.py b/Contents/Libraries/Shared/js2py/constructors/jsuint8array.py new file mode 100644 index 000000000..4b2199da2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint8array.py @@ -0,0 +1,79 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint8Array(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint8)) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint8)) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.uint8)) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int(len(a.obj) - offset) + array = numpy.frombuffer( + a.obj, dtype=numpy.uint8, count=length, offset=offset) + temp = Js(array) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint8)) + temp.put('length', Js(0)) + return temp + + +Uint8Array.create = Uint8Array +Uint8Array.own['length']['value'] = Js(3) + +Uint8Array.define_own_property( + 'prototype', { + 'value': Uint8ArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint8ArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint8Array, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint8ArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(1), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py b/Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py new file mode 100644 index 000000000..7b5e350b2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/jsuint8clampedarray.py @@ -0,0 +1,79 @@ +# this is based on jsarray.py + +from ..base import * +try: + import numpy +except: + pass + + +@Js +def Uint8ClampedArray(): + TypedArray = (PyJsInt8Array, PyJsUint8Array, PyJsUint8ClampedArray, + PyJsInt16Array, PyJsUint16Array, PyJsInt32Array, + PyJsUint32Array, PyJsFloat32Array, PyJsFloat64Array) + a = arguments[0] + if isinstance(a, PyJsNumber): # length + length = a.to_uint32() + if length != a.value: + raise MakeError('RangeError', 'Invalid array length') + temp = Js(numpy.full(length, 0, dtype=numpy.uint8), Clamped=True) + temp.put('length', a) + return temp + elif isinstance(a, PyJsString): # object (string) + temp = Js(numpy.array(list(a.value), dtype=numpy.uint8), Clamped=True) + temp.put('length', Js(len(list(a.value)))) + return temp + elif isinstance(a, PyJsArray) or isinstance(a, TypedArray) or isinstance( + a, PyJsArrayBuffer): # object (Array, TypedArray) + array = a.to_list() + array = [(int(item.value) if item.value != None else 0) + for item in array] + temp = Js(numpy.array(array, dtype=numpy.uint8), Clamped=True) + temp.put('length', Js(len(array))) + return temp + elif isinstance(a, PyObjectWrapper): # object (ArrayBuffer, etc) + if len(arguments) > 1: + offset = int(arguments[1].value) + else: + offset = 0 + if len(arguments) > 2: + length = int(arguments[2].value) + else: + length = int(len(a.obj) - offset) + array = numpy.frombuffer( + a.obj, dtype=numpy.uint8, count=length, offset=offset) + temp = Js(array, Clamped=True) + temp.put('length', Js(length)) + temp.buff = array + return temp + temp = Js(numpy.full(0, 0, dtype=numpy.uint8), Clamped=True) + temp.put('length', Js(0)) + return temp + + +Uint8ClampedArray.create = Uint8ClampedArray +Uint8ClampedArray.own['length']['value'] = Js(3) + +Uint8ClampedArray.define_own_property( + 'prototype', { + 'value': Uint8ClampedArrayPrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +Uint8ClampedArrayPrototype.define_own_property( + 'constructor', { + 'value': Uint8ClampedArray, + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +Uint8ClampedArrayPrototype.define_own_property('BYTES_PER_ELEMENT', { + 'value': Js(1), + 'enumerable': False, + 'writable': False, + 'configurable': False +}) diff --git a/Contents/Libraries/Shared/js2py/constructors/time_helpers.py b/Contents/Libraries/Shared/js2py/constructors/time_helpers.py new file mode 100644 index 000000000..a744d8cac --- /dev/null +++ b/Contents/Libraries/Shared/js2py/constructors/time_helpers.py @@ -0,0 +1,207 @@ +# NOTE: t must be INT!!! +import time +import datetime +import warnings + +try: + from tzlocal import get_localzone + LOCAL_ZONE = get_localzone() +except: # except all problems... + warnings.warn( + 'Please install or fix tzlocal library (pip install tzlocal) in order to make Date object work better. Otherwise I will assume DST is in effect all the time' + ) + + class LOCAL_ZONE: + @staticmethod + def dst(*args): + return 1 + + +from js2py.base import MakeError +CUM = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +msPerDay = 86400000 +msPerYear = int(86400000 * 365.242) +msPerSecond = 1000 +msPerMinute = 60000 +msPerHour = 3600000 +HoursPerDay = 24 +MinutesPerHour = 60 +SecondsPerMinute = 60 +NaN = float('nan') +LocalTZA = -time.timezone * msPerSecond + + +def DaylightSavingTA(t): + if t is NaN: + return t + try: + return int( + LOCAL_ZONE.dst(datetime.datetime.utcfromtimestamp( + t // 1000)).seconds) * 1000 + except: + warnings.warn( + 'Invalid datetime date, assumed DST time, may be inaccurate...', + Warning) + return 1 + #raise MakeError('TypeError', 'date not supported by python.datetime. I will solve it in future versions') + + +def GetTimeZoneName(t): + return time.tzname[DaylightSavingTA(t) > 0] + + +def LocalToUTC(t): + return t - LocalTZA - DaylightSavingTA(t - LocalTZA) + + +def UTCToLocal(t): + return t + LocalTZA + DaylightSavingTA(t) + + +def Day(t): + return t // 86400000 + + +def TimeWithinDay(t): + return t % 86400000 + + +def DaysInYear(y): + if y % 4: + return 365 + elif y % 100: + return 366 + elif y % 400: + return 365 + else: + return 366 + + +def DayFromYear(y): + return 365 * (y - 1970) + (y - 1969) // 4 - (y - 1901) // 100 + ( + y - 1601) // 400 + + +def TimeFromYear(y): + return 86400000 * DayFromYear(y) + + +def YearFromTime(t): + guess = 1970 - t // 31556908800 # msPerYear + gt = TimeFromYear(guess) + if gt <= t: + while gt <= t: + guess += 1 + gt = TimeFromYear(guess) + return guess - 1 + else: + while gt > t: + guess -= 1 + gt = TimeFromYear(guess) + return guess + + +def DayWithinYear(t): + return Day(t) - DayFromYear(YearFromTime(t)) + + +def InLeapYear(t): + y = YearFromTime(t) + if y % 4: + return 0 + elif y % 100: + return 1 + elif y % 400: + return 0 + else: + return 1 + + +def MonthFromTime(t): + day = DayWithinYear(t) + leap = InLeapYear(t) + if day < 31: + return 0 + day -= leap + if day < 59: + return 1 + elif day < 90: + return 2 + elif day < 120: + return 3 + elif day < 151: + return 4 + elif day < 181: + return 5 + elif day < 212: + return 6 + elif day < 243: + return 7 + elif day < 273: + return 8 + elif day < 304: + return 9 + elif day < 334: + return 10 + else: + return 11 + + +def DateFromTime(t): + mon = MonthFromTime(t) + day = DayWithinYear(t) + return day - CUM[mon] - (1 if InLeapYear(t) and mon >= 2 else 0) + 1 + + +def WeekDay(t): + # 0 == sunday + return (Day(t) + 4) % 7 + + +def msFromTime(t): + return t % 1000 + + +def SecFromTime(t): + return (t // 1000) % 60 + + +def MinFromTime(t): + return (t // 60000) % 60 + + +def HourFromTime(t): + return (t // 3600000) % 24 + + +def MakeTime(hour, Min, sec, ms): + # takes PyJs objects and returns t + if not (hour.is_finite() and Min.is_finite() and sec.is_finite() + and ms.is_finite()): + return NaN + h, m, s, milli = hour.to_int(), Min.to_int(), sec.to_int(), ms.to_int() + return h * 3600000 + m * 60000 + s * 1000 + milli + + +def MakeDay(year, month, date): + # takes PyJs objects and returns t + if not (year.is_finite() and month.is_finite() and date.is_finite()): + return NaN + y, m, dt = year.to_int(), month.to_int(), date.to_int() + y += m // 12 + mn = m % 12 + d = DayFromYear(y) + CUM[mn] + dt - 1 + (1 if DaysInYear(y) == 366 + and mn >= 2 else 0) + return d # ms per day + + +def MakeDate(day, time): + return 86400000 * day + time + + +def TimeClip(t): + if t != t or abs(t) == float('inf'): + return NaN + if abs(t) > 8.64 * 10**15: + return NaN + return int(t) diff --git a/Contents/Libraries/Shared/js2py/es6/__init__.py b/Contents/Libraries/Shared/js2py/es6/__init__.py new file mode 100644 index 000000000..4a58d3f0b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/__init__.py @@ -0,0 +1,41 @@ +INITIALISED = False +babel = None +babelPresetEs2015 = None + + +def js6_to_js5(code): + global INITIALISED, babel, babelPresetEs2015 + if not INITIALISED: + import signal, warnings, time + warnings.warn( + '\nImporting babel.py for the first time - this can take some time. \nPlease note that currently Javascript 6 in Js2Py is unstable and slow. Use only for tiny scripts!' + ) + + from .babel import babel as _babel + babel = _babel.Object.babel + babelPresetEs2015 = _babel.Object.babelPresetEs2015 + + # very weird hack. Somehow this helps babel to initialise properly! + try: + babel.transform('warmup', {'presets': {}}) + signal.alarm(2) + + def kill_it(a, b): + raise KeyboardInterrupt('Better work next time!') + + signal.signal(signal.SIGALRM, kill_it) + babel.transform('stuckInALoop', { + 'presets': babelPresetEs2015 + }).code + for n in range(3): + time.sleep(1) + except: + print("Initialised babel!") + INITIALISED = True + return babel.transform(code, {'presets': babelPresetEs2015}).code + + +if __name__ == '__main__': + print(js6_to_js5('obj={}; obj.x = function() {return () => this}')) + print() + print(js6_to_js5('const a = 1;')) diff --git a/Contents/Libraries/Shared/js2py/es6/babel.js b/Contents/Libraries/Shared/js2py/es6/babel.js new file mode 100644 index 000000000..e088e470c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/babel.js @@ -0,0 +1,6 @@ +// run buildBabel in this folder to convert this code to python! +var babel = require("babel-core"); +var babelPresetEs2015 = require("babel-preset-es2015"); + +Object.babelPresetEs2015 = babelPresetEs2015; +Object.babel = babel; diff --git a/Contents/Libraries/Shared/js2py/es6/babel.py b/Contents/Libraries/Shared/js2py/es6/babel.py new file mode 100644 index 000000000..24623e64c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/es6/babel.py @@ -0,0 +1,52077 @@ +__all__ = ['babel'] + +# Don't look below, you will not understand this Python code :) I don't. + +from js2py.pyjs import * +# setting scope +var = Scope( JS_BUILTINS ) +set_global_object(var) + +# Code follows: +var.registers([]) +@Js +def PyJs_anonymous_1_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'babel', u'require', u'babelPresetEs2015', u'exports', u'module']) + Js(u'use strict') + var.put(u'babel', var.get(u'require')(Js(u'babel-core'))) + var.put(u'babelPresetEs2015', var.get(u'require')(Js(u'babel-preset-es2015'))) + var.get(u'Object').put(u'babelPresetEs2015', var.get(u'babelPresetEs2015')) + var.get(u'Object').put(u'babel', var.get(u'babel')) +PyJs_anonymous_1_._set_name(u'anonymous') +PyJs_Object_2_ = Js({u'babel-core':Js(5.0),u'babel-preset-es2015':Js(95.0)}) +@Js +def PyJs_anonymous_3_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + @Js + def PyJs_anonymous_4_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return JsRegExp(u'/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g') + PyJs_anonymous_4_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4_) +PyJs_anonymous_3_._set_name(u'anonymous') +PyJs_Object_5_ = Js({}) +@Js +def PyJs_anonymous_6_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assembleStyles', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_assembleStyles_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'styles']) + PyJs_Object_8_ = Js({u'reset':Js([Js(0.0), Js(0.0)]),u'bold':Js([Js(1.0), Js(22.0)]),u'dim':Js([Js(2.0), Js(22.0)]),u'italic':Js([Js(3.0), Js(23.0)]),u'underline':Js([Js(4.0), Js(24.0)]),u'inverse':Js([Js(7.0), Js(27.0)]),u'hidden':Js([Js(8.0), Js(28.0)]),u'strikethrough':Js([Js(9.0), Js(29.0)])}) + PyJs_Object_9_ = Js({u'black':Js([Js(30.0), Js(39.0)]),u'red':Js([Js(31.0), Js(39.0)]),u'green':Js([Js(32.0), Js(39.0)]),u'yellow':Js([Js(33.0), Js(39.0)]),u'blue':Js([Js(34.0), Js(39.0)]),u'magenta':Js([Js(35.0), Js(39.0)]),u'cyan':Js([Js(36.0), Js(39.0)]),u'white':Js([Js(37.0), Js(39.0)]),u'gray':Js([Js(90.0), Js(39.0)])}) + PyJs_Object_10_ = Js({u'bgBlack':Js([Js(40.0), Js(49.0)]),u'bgRed':Js([Js(41.0), Js(49.0)]),u'bgGreen':Js([Js(42.0), Js(49.0)]),u'bgYellow':Js([Js(43.0), Js(49.0)]),u'bgBlue':Js([Js(44.0), Js(49.0)]),u'bgMagenta':Js([Js(45.0), Js(49.0)]),u'bgCyan':Js([Js(46.0), Js(49.0)]),u'bgWhite':Js([Js(47.0), Js(49.0)])}) + PyJs_Object_7_ = Js({u'modifiers':PyJs_Object_8_,u'colors':PyJs_Object_9_,u'bgColors':PyJs_Object_10_}) + var.put(u'styles', PyJs_Object_7_) + var.get(u'styles').get(u'colors').put(u'grey', var.get(u'styles').get(u'colors').get(u'gray')) + @Js + def PyJs_anonymous_11_(groupName, this, arguments, var=var): + var = Scope({u'this':this, u'groupName':groupName, u'arguments':arguments}, var) + var.registers([u'groupName', u'group']) + var.put(u'group', var.get(u'styles').get(var.get(u'groupName'))) + @Js + def PyJs_anonymous_12_(styleName, this, arguments, var=var): + var = Scope({u'this':this, u'styleName':styleName, u'arguments':arguments}, var) + var.registers([u'style', u'styleName']) + var.put(u'style', var.get(u'group').get(var.get(u'styleName'))) + PyJs_Object_13_ = Js({u'open':((Js(u'\x1b[')+var.get(u'style').get(u'0'))+Js(u'm')),u'close':((Js(u'\x1b[')+var.get(u'style').get(u'1'))+Js(u'm'))}) + var.get(u'styles').put(var.get(u'styleName'), var.get(u'group').put(var.get(u'styleName'), PyJs_Object_13_)) + PyJs_anonymous_12_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'group')).callprop(u'forEach', PyJs_anonymous_12_) + PyJs_Object_14_ = Js({u'value':var.get(u'group'),u'enumerable':Js(False)}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'styles'), var.get(u'groupName'), PyJs_Object_14_) + PyJs_anonymous_11_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'styles')).callprop(u'forEach', PyJs_anonymous_11_) + return var.get(u'styles') + PyJsHoisted_assembleStyles_.func_name = u'assembleStyles' + var.put(u'assembleStyles', PyJsHoisted_assembleStyles_) + Js(u'use strict') + pass + PyJs_Object_15_ = Js({u'enumerable':var.get(u'true'),u'get':var.get(u'assembleStyles')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'module'), Js(u'exports'), PyJs_Object_15_) +PyJs_anonymous_6_._set_name(u'anonymous') +PyJs_Object_16_ = Js({}) +@Js +def PyJs_anonymous_17_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defs', u'_esutils2', u'exports', u'_jsTokens2', u'_esutils', u'require', u'NEWLINE', u'module', u'BRACKET', u'JSX_TAG', u'_chalk', u'getTokenType', u'_interopRequireDefault', u'highlight', u'_jsTokens', u'_chalk2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_22_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_22_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_highlight_(text, this, arguments, var=var): + var = Scope({u'this':this, u'text':text, u'arguments':arguments}, var) + var.registers([u'text']) + @Js + def PyJs_anonymous_24_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_len', u'_key', u'args', u'type', u'colorize']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')')), var.get(u'maybeHighlight')(var.get(u'defs').get(u'gutter'), var.get(u'gutter')), var.get(u'line'), var.get(u'markerLine')]).callprop(u'join', Js(u'')) + else: + return ((Js(u' ')+var.get(u'maybeHighlight')(var.get(u'defs').get(u'gutter'), var.get(u'gutter')))+var.get(u'line')) + PyJs_anonymous_21_._set_name(u'anonymous') + var.put(u'frame', var.get(u'lines').callprop(u'slice', var.get(u'start'), var.get(u'end')).callprop(u'map', PyJs_anonymous_21_).callprop(u'join', Js(u'\n'))) + if var.get(u'highlighted'): + return var.get(u'_chalk2').get(u'default').callprop(u'reset', var.get(u'frame')) + else: + return var.get(u'frame') + PyJs_anonymous_18_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_18_) + var.put(u'_jsTokens', var.get(u'require')(Js(u'js-tokens'))) + var.put(u'_jsTokens2', var.get(u'_interopRequireDefault')(var.get(u'_jsTokens'))) + var.put(u'_esutils', var.get(u'require')(Js(u'esutils'))) + var.put(u'_esutils2', var.get(u'_interopRequireDefault')(var.get(u'_esutils'))) + var.put(u'_chalk', var.get(u'require')(Js(u'chalk'))) + var.put(u'_chalk2', var.get(u'_interopRequireDefault')(var.get(u'_chalk'))) + pass + PyJs_Object_23_ = Js({u'keyword':var.get(u'_chalk2').get(u'default').get(u'cyan'),u'capitalized':var.get(u'_chalk2').get(u'default').get(u'yellow'),u'jsx_tag':var.get(u'_chalk2').get(u'default').get(u'yellow'),u'punctuator':var.get(u'_chalk2').get(u'default').get(u'yellow'),u'number':var.get(u'_chalk2').get(u'default').get(u'magenta'),u'string':var.get(u'_chalk2').get(u'default').get(u'green'),u'regex':var.get(u'_chalk2').get(u'default').get(u'magenta'),u'comment':var.get(u'_chalk2').get(u'default').get(u'grey'),u'invalid':var.get(u'_chalk2').get(u'default').get(u'white').get(u'bgRed').get(u'bold'),u'gutter':var.get(u'_chalk2').get(u'default').get(u'grey'),u'marker':var.get(u'_chalk2').get(u'default').get(u'red').get(u'bold')}) + var.put(u'defs', PyJs_Object_23_) + var.put(u'NEWLINE', JsRegExp(u'/\\r\\n|[\\n\\r\\u2028\\u2029]/')) + var.put(u'JSX_TAG', JsRegExp(u'/^[a-z][\\w-]*$/i')) + var.put(u'BRACKET', JsRegExp(u'/^[()\\[\\]{}]$/')) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_17_._set_name(u'anonymous') +PyJs_Object_26_ = Js({u'chalk':Js(265.0),u'esutils':Js(276.0),u'js-tokens':Js(282.0)}) +@Js +def PyJs_anonymous_27_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./lib/api/node.js'))) +PyJs_anonymous_27_._set_name(u'anonymous') +PyJs_Object_28_ = Js({u'./lib/api/node.js':Js(6.0)}) +@Js +def PyJs_anonymous_29_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_isFunction', u'_fs', u'_pipeline2', u'_file', u'_babelTemplate', u'_buildExternalHelpers', u'transformFile', u'_interopRequireDefault', u'_babelTraverse', u'_pipeline', u'transform', u'_fs2', u'_babelMessages', u'exports', u'_babelTraverse2', u'_interopRequireWildcard', u'Plugin', u'_babelTypes', u'analyse', u'pipeline', u'_util', u'util', u'module', u'_optionManager2', u'_isFunction2', u'_config', u'transformFileSync', u'messages', u'_optionManager', u'transformFromAst', u't', u'_package', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_42_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_42_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_transformFileSync_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'opts', u'filename']) + PyJs_Object_45_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_45_)) + var.get(u'opts').put(u'filename', var.get(u'filename')) + return var.get(u'transform')(var.get(u'_fs2').get(u'default').callprop(u'readFileSync', var.get(u'filename'), Js(u'utf8')), var.get(u'opts')) + PyJsHoisted_transformFileSync_.func_name = u'transformFileSync' + var.put(u'transformFileSync', PyJsHoisted_transformFileSync_) + @Js + def PyJsHoisted_transformFile_(filename, opts, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments, u'opts':opts, u'filename':filename}, var) + var.registers([u'callback', u'opts', u'filename']) + if PyJsComma(Js(0.0),var.get(u'_isFunction2').get(u'default'))(var.get(u'opts')): + var.put(u'callback', var.get(u'opts')) + PyJs_Object_43_ = Js({}) + var.put(u'opts', PyJs_Object_43_) + var.get(u'opts').put(u'filename', var.get(u'filename')) + @Js + def PyJs_anonymous_44_(err, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'err':err}, var) + var.registers([u'code', u'result', u'err']) + var.put(u'result', PyJsComma(Js(0.0), Js(None))) + if var.get(u'err').neg(): + try: + var.put(u'result', var.get(u'transform')(var.get(u'code'), var.get(u'opts'))) + except PyJsException as PyJsTempException: + PyJsHolder_5f657272_67108312 = var.own.get(u'_err') + var.force_own_put(u'_err', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'err', var.get(u'_err')) + finally: + if PyJsHolder_5f657272_67108312 is not None: + var.own[u'_err'] = PyJsHolder_5f657272_67108312 + else: + del var.own[u'_err'] + del PyJsHolder_5f657272_67108312 + if var.get(u'err'): + var.get(u'callback')(var.get(u'err')) + else: + var.get(u'callback')(var.get(u"null"), var.get(u'result')) + PyJs_anonymous_44_._set_name(u'anonymous') + var.get(u'_fs2').get(u'default').callprop(u'readFile', var.get(u'filename'), PyJs_anonymous_44_) + PyJsHoisted_transformFile_.func_name = u'transformFile' + var.put(u'transformFile', PyJsHoisted_transformFile_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_41_ = Js({}) + var.put(u'newObj', PyJs_Object_41_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_Plugin_(alias, this, arguments, var=var): + var = Scope({u'this':this, u'alias':alias, u'arguments':arguments}, var) + var.registers([u'alias']) + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'The (')+var.get(u'alias'))+Js(u') Babel 5 plugin is being run with Babel 6.')))) + raise PyJsTempException + PyJsHoisted_Plugin_.func_name = u'Plugin' + var.put(u'Plugin', PyJsHoisted_Plugin_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_30_(var=var): + return var.get(u'exports').put(u'OptionManager', var.get(u'exports').put(u'traverse', var.get(u'exports').put(u'types', var.get(u'exports').put(u'messages', var.get(u'exports').put(u'util', var.get(u'exports').put(u'version', var.get(u'exports').put(u'template', var.get(u'exports').put(u'buildExternalHelpers', var.get(u'exports').put(u'options', var.get(u'exports').put(u'File', var.get(u'undefined'))))))))))) + var.get(u'exports').put(u'transformFromAst', var.get(u'exports').put(u'transform', var.get(u'exports').put(u'analyse', var.get(u'exports').put(u'Pipeline', PyJs_LONG_30_())))) + var.put(u'_file', var.get(u'require')(Js(u'../transformation/file'))) + @Js + def PyJs_get_32_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_32_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_file')).get(u'default') + PyJs_get_32_._set_name(u'get') + PyJs_Object_31_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_32_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'File'), PyJs_Object_31_) + var.put(u'_config', var.get(u'require')(Js(u'../transformation/file/options/config'))) + @Js + def PyJs_get_34_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_34_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_config')).get(u'default') + PyJs_get_34_._set_name(u'get') + PyJs_Object_33_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_34_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'options'), PyJs_Object_33_) + var.put(u'_buildExternalHelpers', var.get(u'require')(Js(u'../tools/build-external-helpers'))) + @Js + def PyJs_get_36_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_36_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_buildExternalHelpers')).get(u'default') + PyJs_get_36_._set_name(u'get') + PyJs_Object_35_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_36_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'buildExternalHelpers'), PyJs_Object_35_) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + @Js + def PyJs_get_38_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_38_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate')).get(u'default') + PyJs_get_38_._set_name(u'get') + PyJs_Object_37_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_38_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'template'), PyJs_Object_37_) + var.put(u'_package', var.get(u'require')(Js(u'../../package'))) + @Js + def PyJs_get_40_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_40_}, var) + var.registers([]) + return var.get(u'_package').get(u'version') + PyJs_get_40_._set_name(u'get') + PyJs_Object_39_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_40_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'version'), PyJs_Object_39_) + var.get(u'exports').put(u'Plugin', var.get(u'Plugin')) + var.get(u'exports').put(u'transformFile', var.get(u'transformFile')) + var.get(u'exports').put(u'transformFileSync', var.get(u'transformFileSync')) + var.put(u'_isFunction', var.get(u'require')(Js(u'lodash/isFunction'))) + var.put(u'_isFunction2', var.get(u'_interopRequireDefault')(var.get(u'_isFunction'))) + var.put(u'_fs', var.get(u'require')(Js(u'fs'))) + var.put(u'_fs2', var.get(u'_interopRequireDefault')(var.get(u'_fs'))) + var.put(u'_util', var.get(u'require')(Js(u'../util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_optionManager', var.get(u'require')(Js(u'../transformation/file/options/option-manager'))) + var.put(u'_optionManager2', var.get(u'_interopRequireDefault')(var.get(u'_optionManager'))) + var.put(u'_pipeline', var.get(u'require')(Js(u'../transformation/pipeline'))) + var.put(u'_pipeline2', var.get(u'_interopRequireDefault')(var.get(u'_pipeline'))) + pass + pass + var.get(u'exports').put(u'util', var.get(u'util')) + var.get(u'exports').put(u'messages', var.get(u'messages')) + var.get(u'exports').put(u'types', var.get(u't')) + var.get(u'exports').put(u'traverse', var.get(u'_babelTraverse2').get(u'default')) + var.get(u'exports').put(u'OptionManager', var.get(u'_optionManager2').get(u'default')) + pass + var.get(u'exports').put(u'Pipeline', var.get(u'_pipeline2').get(u'default')) + var.put(u'pipeline', var.get(u'_pipeline2').get(u'default').create()) + var.put(u'analyse', var.get(u'exports').put(u'analyse', var.get(u'pipeline').get(u'analyse').callprop(u'bind', var.get(u'pipeline')))) + var.put(u'transform', var.get(u'exports').put(u'transform', var.get(u'pipeline').get(u'transform').callprop(u'bind', var.get(u'pipeline')))) + var.put(u'transformFromAst', var.get(u'exports').put(u'transformFromAst', var.get(u'pipeline').get(u'transformFromAst').callprop(u'bind', var.get(u'pipeline')))) + pass + pass +PyJs_anonymous_29_._set_name(u'anonymous') +PyJs_Object_46_ = Js({u'../../package':Js(28.0),u'../tools/build-external-helpers':Js(11.0),u'../transformation/file':Js(12.0),u'../transformation/file/options/config':Js(16.0),u'../transformation/file/options/option-manager':Js(18.0),u'../transformation/pipeline':Js(23.0),u'../util':Js(26.0),u'babel-messages':Js(57.0),u'babel-template':Js(221.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0),u'fs':Js(523.0),u'lodash/isFunction':Js(463.0)}) +@Js +def PyJs_anonymous_47_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_mergeWith', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_mergeWith2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_50_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_50_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_48_(dest, src, this, arguments, var=var): + var = Scope({u'dest':dest, u'src':src, u'this':this, u'arguments':arguments}, var) + var.registers([u'dest', u'src']) + if (var.get(u'dest').neg() or var.get(u'src').neg()): + return var.get('undefined') + @Js + def PyJs_anonymous_49_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'_isArray', u'b', u'_iterator', u'item', u'newArray', u'_i', u'_ref']) + if (var.get(u'b') and var.get(u'Array').callprop(u'isArray', var.get(u'a'))): + var.put(u'newArray', var.get(u'b').callprop(u'slice', Js(0.0))) + #for JS loop + var.put(u'_iterator', var.get(u'a')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'item', var.get(u'_ref')) + if (var.get(u'newArray').callprop(u'indexOf', var.get(u'item'))Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'process').callprop(u'cwd'))) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_module2').get(u'default').typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_module2').get(u'default'))),Js(u'object')): + return var.get(u"null") + var.put(u'relativeMod', var.get(u'relativeModules').get(var.get(u'relative'))) + if var.get(u'relativeMod').neg(): + var.put(u'relativeMod', var.get(u'_module2').get(u'default').create()) + var.put(u'filename', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'relative'), Js(u'.babelrc'))) + var.get(u'relativeMod').put(u'id', var.get(u'filename')) + var.get(u'relativeMod').put(u'filename', var.get(u'filename')) + var.get(u'relativeMod').put(u'paths', var.get(u'_module2').get(u'default').callprop(u'_nodeModulePaths', var.get(u'relative'))) + var.get(u'relativeModules').put(var.get(u'relative'), var.get(u'relativeMod')) + try: + return var.get(u'_module2').get(u'default').callprop(u'_resolveFilename', var.get(u'loc'), var.get(u'relativeMod')) + except PyJsException as PyJsTempException: + PyJsHolder_657272_57087007 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u"null") + finally: + if PyJsHolder_657272_57087007 is not None: + var.own[u'err'] = PyJsHolder_657272_57087007 + else: + del var.own[u'err'] + del PyJsHolder_657272_57087007 + PyJs_anonymous_58_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_58_) + var.put(u'_module', var.get(u'require')(Js(u'module'))) + var.put(u'_module2', var.get(u'_interopRequireDefault')(var.get(u'_module'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + pass + PyJs_Object_60_ = Js({}) + var.put(u'relativeModules', PyJs_Object_60_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_57_._set_name(u'anonymous') + PyJs_anonymous_57_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_56_._set_name(u'anonymous') +PyJs_Object_61_ = Js({u'_process':Js(531.0),u'babel-runtime/helpers/typeof':Js(114.0),u'module':Js(523.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_62_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_map', u'_inherits3', u'_inherits2', u'require', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'module', u'Store', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2', u'_map2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_63_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_63_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_map', var.get(u'require')(Js(u'babel-runtime/core-js/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + pass + @Js + def PyJs_anonymous_64_(_Map, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_Map':_Map}, var) + var.registers([u'Store', u'_Map']) + @Js + def PyJsHoisted_Store_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_this']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Store')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Map').callprop(u'call', var.get(u"this")))) + PyJs_Object_65_ = Js({}) + var.get(u'_this').put(u'dynamicData', PyJs_Object_65_) + return var.get(u'_this') + PyJsHoisted_Store_.func_name = u'Store' + var.put(u'Store', PyJsHoisted_Store_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'Store'), var.get(u'_Map')) + pass + @Js + def PyJs_setDynamic_66_(key, fn, this, arguments, var=var): + var = Scope({u'this':this, u'setDynamic':PyJs_setDynamic_66_, u'fn':fn, u'key':key, u'arguments':arguments}, var) + var.registers([u'fn', u'key']) + var.get(u"this").get(u'dynamicData').put(var.get(u'key'), var.get(u'fn')) + PyJs_setDynamic_66_._set_name(u'setDynamic') + var.get(u'Store').get(u'prototype').put(u'setDynamic', PyJs_setDynamic_66_) + @Js + def PyJs_get_67_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'get':PyJs_get_67_}, var) + var.registers([u'key', u'val']) + if var.get(u"this").callprop(u'has', var.get(u'key')): + return var.get(u'_Map').get(u'prototype').get(u'get').callprop(u'call', var.get(u"this"), var.get(u'key')) + else: + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u"this").get(u'dynamicData'), var.get(u'key')): + var.put(u'val', var.get(u"this").get(u'dynamicData').callprop(var.get(u'key'))) + var.get(u"this").callprop(u'set', var.get(u'key'), var.get(u'val')) + return var.get(u'val') + PyJs_get_67_._set_name(u'get') + var.get(u'Store').get(u'prototype').put(u'get', PyJs_get_67_) + return var.get(u'Store') + PyJs_anonymous_64_._set_name(u'anonymous') + var.put(u'Store', PyJs_anonymous_64_(var.get(u'_map2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'Store')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_62_._set_name(u'anonymous') +PyJs_Object_68_ = Js({u'babel-runtime/core-js/map':Js(98.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0)}) +@Js +def PyJs_anonymous_69_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_each', u'_babelTemplate', u'module', u'_babelHelpers', u'buildGlobal', u'_interopRequireDefault', u'buildVar', u'_each2', u'_babelTemplate2', u'_babelMessages', u'exports', u'_interopRequireWildcard', u'buildUmd', u'_babelTypes', u'_babelGenerator', u'buildHelpers', u'_babelGenerator2', u'buildUmdWrapper', u'require', u'messages', u'helpers', u't']) + @Js + def PyJsHoisted_buildVar_(namespace, builder, this, arguments, var=var): + var = Scope({u'this':this, u'builder':builder, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'builder', u'namespace']) + var.put(u'body', Js([])) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'namespace'), var.get(u't').callprop(u'objectExpression', Js([])))]))) + var.get(u'builder')(var.get(u'body')) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'namespace'))) + return var.get(u't').callprop(u'program', var.get(u'body')) + PyJsHoisted_buildVar_.func_name = u'buildVar' + var.put(u'buildVar', PyJsHoisted_buildVar_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_74_ = Js({}) + var.put(u'newObj', PyJs_Object_74_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_buildUmd_(namespace, builder, this, arguments, var=var): + var = Scope({u'this':this, u'builder':builder, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'builder', u'namespace']) + var.put(u'body', Js([])) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'namespace'), var.get(u't').callprop(u'identifier', Js(u'global')))]))) + var.get(u'builder')(var.get(u'body')) + PyJs_Object_77_ = Js({u'FACTORY_PARAMETERS':var.get(u't').callprop(u'identifier', Js(u'global')),u'BROWSER_ARGUMENTS':var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'root')), var.get(u'namespace')), var.get(u't').callprop(u'objectExpression', Js([]))),u'COMMON_ARGUMENTS':var.get(u't').callprop(u'identifier', Js(u'exports')),u'AMD_ARGUMENTS':var.get(u't').callprop(u'arrayExpression', Js([var.get(u't').callprop(u'stringLiteral', Js(u'exports'))])),u'FACTORY_BODY':var.get(u'body'),u'UMD_ROOT':var.get(u't').callprop(u'identifier', Js(u'this'))}) + return var.get(u't').callprop(u'program', Js([var.get(u'buildUmdWrapper')(PyJs_Object_77_)])) + PyJsHoisted_buildUmd_.func_name = u'buildUmd' + var.put(u'buildUmd', PyJsHoisted_buildUmd_) + @Js + def PyJsHoisted_buildHelpers_(body, namespace, whitelist, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'whitelist':whitelist, u'namespace':namespace, u'arguments':arguments}, var) + var.registers([u'body', u'whitelist', u'namespace']) + @Js + def PyJs_anonymous_78_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name', u'key']) + if (var.get(u'whitelist') and (var.get(u'whitelist').callprop(u'indexOf', var.get(u'name'))Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'global'))) + var.put(u'namespace', var.get(u't').callprop(u'identifier', Js(u'babelHelpers'))) + @Js + def PyJs_builder_71_(body, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'builder':PyJs_builder_71_, u'arguments':arguments}, var) + var.registers([u'body']) + return var.get(u'buildHelpers')(var.get(u'body'), var.get(u'namespace'), var.get(u'whitelist')) + PyJs_builder_71_._set_name(u'builder') + var.put(u'builder', PyJs_builder_71_) + var.put(u'tree', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_72_ = Js({u'global':var.get(u'buildGlobal'),u'umd':var.get(u'buildUmd'),u'var':var.get(u'buildVar')}) + var.put(u'build', PyJs_Object_72_.get(var.get(u'outputType'))) + if var.get(u'build'): + var.put(u'tree', var.get(u'build')(var.get(u'namespace'), var.get(u'builder'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'unsupportedOutputType'), var.get(u'outputType')))) + raise PyJsTempException + return PyJsComma(Js(0.0),var.get(u'_babelGenerator2').get(u'default'))(var.get(u'tree')).get(u'code') + PyJs_anonymous_70_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_70_) + var.put(u'_babelHelpers', var.get(u'require')(Js(u'babel-helpers'))) + var.put(u'helpers', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelpers'))) + var.put(u'_babelGenerator', var.get(u'require')(Js(u'babel-generator'))) + var.put(u'_babelGenerator2', var.get(u'_interopRequireDefault')(var.get(u'_babelGenerator'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + def PyJs_LONG_75_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (root, factory) {\n if (typeof define === "function" && define.amd) {\n define(AMD_ARGUMENTS, factory);\n } else if (typeof exports === "object") {\n factory(COMMON_ARGUMENTS);\n } else {\n factory(BROWSER_ARGUMENTS);\n }\n })(UMD_ROOT, function (FACTORY_PARAMETERS) {\n FACTORY_BODY\n });\n')) + var.put(u'buildUmdWrapper', PyJs_LONG_75_()) + pass + pass + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_69_._set_name(u'anonymous') +PyJs_Object_79_ = Js({u'babel-generator':Js(40.0),u'babel-helpers':Js(56.0),u'babel-messages':Js(57.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0),u'lodash/each':Js(443.0)}) +@Js +def PyJs_anonymous_80_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_81_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_resolve', u'_store', u'_sourceMap', u'_shadowFunctions2', u'_babelHelpers', u'_logger2', u'_interopRequireDefault', u'_convertSourceMap', u'_getIterator3', u'_getIterator2', u'_shadowFunctions', u'_babelCodeFrame2', u'_typeof2', u'_typeof3', u'metadataVisitor', u'INTERNAL_PLUGINS', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'_babylon', u'_create2', u'errorVisitor', u'_metadata', u'_store2', u'_assign2', u'shebangRegex', u'_blockHoist', u'_classCallCheck3', u'_classCallCheck2', u'_pluginPass2', u'_sourceMap2', u'_create', u'_convertSourceMap2', u'process', u'_babelTypes', u'_babelTraverse2', u'_interopRequireWildcard', u'_inherits3', u'_inherits2', u'_pluginPass', u'_assign', u'_babelCodeFrame', u'_babelGenerator', u'_logger', u'_util', u'_defaults2', u'_path2', u'_optionManager2', u'_babelTraverse', u'util', u'_babelGenerator2', u'_blockHoist2', u'_babelHelpers2', u'_defaults', u'_optionManager', u't', u'File', u'_resolve2', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_83_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_83_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_82_ = Js({}) + var.put(u'newObj', PyJs_Object_82_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'File', var.get(u'undefined')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_babelHelpers', var.get(u'require')(Js(u'babel-helpers'))) + var.put(u'_babelHelpers2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelpers'))) + var.put(u'_metadata', var.get(u'require')(Js(u'./metadata'))) + var.put(u'metadataVisitor', var.get(u'_interopRequireWildcard')(var.get(u'_metadata'))) + var.put(u'_convertSourceMap', var.get(u'require')(Js(u'convert-source-map'))) + var.put(u'_convertSourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_convertSourceMap'))) + var.put(u'_optionManager', var.get(u'require')(Js(u'./options/option-manager'))) + var.put(u'_optionManager2', var.get(u'_interopRequireDefault')(var.get(u'_optionManager'))) + var.put(u'_pluginPass', var.get(u'require')(Js(u'../plugin-pass'))) + var.put(u'_pluginPass2', var.get(u'_interopRequireDefault')(var.get(u'_pluginPass'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_sourceMap', var.get(u'require')(Js(u'source-map'))) + var.put(u'_sourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_sourceMap'))) + var.put(u'_babelGenerator', var.get(u'require')(Js(u'babel-generator'))) + var.put(u'_babelGenerator2', var.get(u'_interopRequireDefault')(var.get(u'_babelGenerator'))) + var.put(u'_babelCodeFrame', var.get(u'require')(Js(u'babel-code-frame'))) + var.put(u'_babelCodeFrame2', var.get(u'_interopRequireDefault')(var.get(u'_babelCodeFrame'))) + var.put(u'_defaults', var.get(u'require')(Js(u'lodash/defaults'))) + var.put(u'_defaults2', var.get(u'_interopRequireDefault')(var.get(u'_defaults'))) + var.put(u'_logger', var.get(u'require')(Js(u'./logger'))) + var.put(u'_logger2', var.get(u'_interopRequireDefault')(var.get(u'_logger'))) + var.put(u'_store', var.get(u'require')(Js(u'../../store'))) + var.put(u'_store2', var.get(u'_interopRequireDefault')(var.get(u'_store'))) + var.put(u'_babylon', var.get(u'require')(Js(u'babylon'))) + var.put(u'_util', var.get(u'require')(Js(u'../../util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_resolve', var.get(u'require')(Js(u'../../helpers/resolve'))) + var.put(u'_resolve2', var.get(u'_interopRequireDefault')(var.get(u'_resolve'))) + var.put(u'_blockHoist', var.get(u'require')(Js(u'../internal-plugins/block-hoist'))) + var.put(u'_blockHoist2', var.get(u'_interopRequireDefault')(var.get(u'_blockHoist'))) + var.put(u'_shadowFunctions', var.get(u'require')(Js(u'../internal-plugins/shadow-functions'))) + var.put(u'_shadowFunctions2', var.get(u'_interopRequireDefault')(var.get(u'_shadowFunctions'))) + pass + pass + var.put(u'shebangRegex', JsRegExp(u'/^#!.*/')) + var.put(u'INTERNAL_PLUGINS', Js([Js([var.get(u'_blockHoist2').get(u'default')]), Js([var.get(u'_shadowFunctions2').get(u'default')])])) + @Js + def PyJs_enter_85_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_85_}, var) + var.registers([u'loc', u'state', u'path']) + var.put(u'loc', var.get(u'path').get(u'node').get(u'loc')) + if var.get(u'loc'): + var.get(u'state').put(u'loc', var.get(u'loc')) + var.get(u'path').callprop(u'stop') + PyJs_enter_85_._set_name(u'enter') + PyJs_Object_84_ = Js({u'enter':PyJs_enter_85_}) + var.put(u'errorVisitor', PyJs_Object_84_) + @Js + def PyJs_anonymous_86_(_Store, this, arguments, var=var): + var = Scope({u'this':this, u'_Store':_Store, u'arguments':arguments}, var) + var.registers([u'_Store', u'File']) + @Js + def PyJsHoisted_File_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'pipeline', u'_this', u'opts']) + PyJs_Object_87_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_87_)) + var.put(u'pipeline', var.get(u'arguments').get(u'1')) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'File')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Store').callprop(u'call', var.get(u"this")))) + var.get(u'_this').put(u'pipeline', var.get(u'pipeline')) + var.get(u'_this').put(u'log', var.get(u'_logger2').get(u'default').create(var.get(u'_this'), (var.get(u'opts').get(u'filename') or Js(u'unknown')))) + var.get(u'_this').put(u'opts', var.get(u'_this').callprop(u'initOptions', var.get(u'opts'))) + PyJs_Object_88_ = Js({u'sourceType':var.get(u'_this').get(u'opts').get(u'sourceType'),u'sourceFileName':var.get(u'_this').get(u'opts').get(u'filename'),u'plugins':Js([])}) + var.get(u'_this').put(u'parserOpts', PyJs_Object_88_) + var.get(u'_this').put(u'pluginVisitors', Js([])) + var.get(u'_this').put(u'pluginPasses', Js([])) + var.get(u'_this').callprop(u'buildPluginsForOptions', var.get(u'_this').get(u'opts')) + if var.get(u'_this').get(u'opts').get(u'passPerPreset'): + var.get(u'_this').put(u'perPresetOpts', Js([])) + @Js + def PyJs_anonymous_89_(presetOpts, this, arguments, var=var): + var = Scope({u'this':this, u'presetOpts':presetOpts, u'arguments':arguments}, var) + var.registers([u'presetOpts', u'perPresetOpts']) + var.put(u'perPresetOpts', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u'_this').get(u'opts')), var.get(u'presetOpts'))) + var.get(u'_this').get(u'perPresetOpts').callprop(u'push', var.get(u'perPresetOpts')) + var.get(u'_this').callprop(u'buildPluginsForOptions', var.get(u'perPresetOpts')) + PyJs_anonymous_89_._set_name(u'anonymous') + var.get(u'_this').get(u'opts').get(u'presets').callprop(u'forEach', PyJs_anonymous_89_) + PyJs_Object_92_ = Js({u'exported':Js([]),u'specifiers':Js([])}) + PyJs_Object_91_ = Js({u'imports':Js([]),u'exports':PyJs_Object_92_}) + PyJs_Object_90_ = Js({u'usedHelpers':Js([]),u'marked':Js([]),u'modules':PyJs_Object_91_}) + var.get(u'_this').put(u'metadata', PyJs_Object_90_) + PyJs_Object_93_ = Js({}) + var.get(u'_this').put(u'dynamicImportTypes', PyJs_Object_93_) + PyJs_Object_94_ = Js({}) + var.get(u'_this').put(u'dynamicImportIds', PyJs_Object_94_) + var.get(u'_this').put(u'dynamicImports', Js([])) + PyJs_Object_95_ = Js({}) + var.get(u'_this').put(u'declarations', PyJs_Object_95_) + PyJs_Object_96_ = Js({}) + var.get(u'_this').put(u'usedHelpers', PyJs_Object_96_) + var.get(u'_this').put(u'path', var.get(u"null")) + PyJs_Object_97_ = Js({}) + var.get(u'_this').put(u'ast', PyJs_Object_97_) + var.get(u'_this').put(u'code', Js(u'')) + var.get(u'_this').put(u'shebang', Js(u'')) + var.get(u'_this').put(u'hub', var.get(u'_babelTraverse').get(u'Hub').create(var.get(u'_this'))) + return var.get(u'_this') + PyJsHoisted_File_.func_name = u'File' + var.put(u'File', PyJsHoisted_File_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'File'), var.get(u'_Store')) + pass + @Js + def PyJs_getMetadata_98_(this, arguments, var=var): + var = Scope({u'this':this, u'getMetadata':PyJs_getMetadata_98_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_i', u'_ref', u'has']) + var.put(u'has', Js(False)) + #for JS loop + var.put(u'_iterator', var.get(u"this").get(u'ast').get(u'program').get(u'body')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'node', var.get(u'_ref')) + if var.get(u't').callprop(u'isModuleDeclaration', var.get(u'node')): + var.put(u'has', var.get(u'true')) + break + + if var.get(u'has'): + var.get(u"this").get(u'path').callprop(u'traverse', var.get(u'metadataVisitor'), var.get(u"this")) + PyJs_getMetadata_98_._set_name(u'getMetadata') + var.get(u'File').get(u'prototype').put(u'getMetadata', PyJs_getMetadata_98_) + @Js + def PyJs_initOptions_99_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts, u'initOptions':PyJs_initOptions_99_}, var) + var.registers([u'basenameRelative', u'opts']) + var.put(u'opts', var.get(u'_optionManager2').get(u'default').create(var.get(u"this").get(u'log'), var.get(u"this").get(u'pipeline')).callprop(u'init', var.get(u'opts'))) + if var.get(u'opts').get(u'inputSourceMap'): + var.get(u'opts').put(u'sourceMaps', var.get(u'true')) + if var.get(u'opts').get(u'moduleId'): + var.get(u'opts').put(u'moduleIds', var.get(u'true')) + var.get(u'opts').put(u'basename', var.get(u'_path2').get(u'default').callprop(u'basename', var.get(u'opts').get(u'filename'), var.get(u'_path2').get(u'default').callprop(u'extname', var.get(u'opts').get(u'filename')))) + var.get(u'opts').put(u'ignore', var.get(u'util').callprop(u'arrayify', var.get(u'opts').get(u'ignore'), var.get(u'util').get(u'regexify'))) + if var.get(u'opts').get(u'only'): + var.get(u'opts').put(u'only', var.get(u'util').callprop(u'arrayify', var.get(u'opts').get(u'only'), var.get(u'util').get(u'regexify'))) + PyJs_Object_100_ = Js({u'moduleRoot':var.get(u'opts').get(u'sourceRoot')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_100_) + PyJs_Object_101_ = Js({u'sourceRoot':var.get(u'opts').get(u'moduleRoot')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_101_) + PyJs_Object_102_ = Js({u'filenameRelative':var.get(u'opts').get(u'filename')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_102_) + var.put(u'basenameRelative', var.get(u'_path2').get(u'default').callprop(u'basename', var.get(u'opts').get(u'filenameRelative'))) + PyJs_Object_103_ = Js({u'sourceFileName':var.get(u'basenameRelative'),u'sourceMapTarget':var.get(u'basenameRelative')}) + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'opts'), PyJs_Object_103_) + return var.get(u'opts') + PyJs_initOptions_99_._set_name(u'initOptions') + var.get(u'File').get(u'prototype').put(u'initOptions', PyJs_initOptions_99_) + @Js + def PyJs_buildPluginsForOptions_104_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts, u'buildPluginsForOptions':PyJs_buildPluginsForOptions_104_}, var) + var.registers([u'pluginOpts', u'_isArray2', u'plugin', u'_i2', u'_ref2', u'opts', u'plugins', u'currentPluginPasses', u'ref', u'currentPluginVisitors', u'_iterator2']) + if var.get(u'Array').callprop(u'isArray', var.get(u'opts').get(u'plugins')).neg(): + return var.get('undefined') + var.put(u'plugins', var.get(u'opts').get(u'plugins').callprop(u'concat', var.get(u'INTERNAL_PLUGINS'))) + var.put(u'currentPluginVisitors', Js([])) + var.put(u'currentPluginPasses', Js([])) + #for JS loop + var.put(u'_iterator2', var.get(u'plugins')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'ref', var.get(u'_ref2')) + var.put(u'plugin', var.get(u'ref').get(u'0')) + var.put(u'pluginOpts', var.get(u'ref').get(u'1')) + var.get(u'currentPluginVisitors').callprop(u'push', var.get(u'plugin').get(u'visitor')) + var.get(u'currentPluginPasses').callprop(u'push', var.get(u'_pluginPass2').get(u'default').create(var.get(u"this"), var.get(u'plugin'), var.get(u'pluginOpts'))) + if var.get(u'plugin').get(u'manipulateOptions'): + var.get(u'plugin').callprop(u'manipulateOptions', var.get(u'opts'), var.get(u"this").get(u'parserOpts'), var.get(u"this")) + + var.get(u"this").get(u'pluginVisitors').callprop(u'push', var.get(u'currentPluginVisitors')) + var.get(u"this").get(u'pluginPasses').callprop(u'push', var.get(u'currentPluginPasses')) + PyJs_buildPluginsForOptions_104_._set_name(u'buildPluginsForOptions') + var.get(u'File').get(u'prototype').put(u'buildPluginsForOptions', PyJs_buildPluginsForOptions_104_) + @Js + def PyJs_getModuleName_105_(this, arguments, var=var): + var = Scope({u'this':this, u'getModuleName':PyJs_getModuleName_105_, u'arguments':arguments}, var) + var.registers([u'moduleName', u'sourceRootRegEx', u'opts', u'filenameRelative']) + var.put(u'opts', var.get(u"this").get(u'opts')) + if var.get(u'opts').get(u'moduleIds').neg(): + return var.get(u"null") + if ((var.get(u'opts').get(u'moduleId')!=var.get(u"null")) and var.get(u'opts').get(u'getModuleId').neg()): + return var.get(u'opts').get(u'moduleId') + var.put(u'filenameRelative', var.get(u'opts').get(u'filenameRelative')) + var.put(u'moduleName', Js(u'')) + if (var.get(u'opts').get(u'moduleRoot')!=var.get(u"null")): + var.put(u'moduleName', (var.get(u'opts').get(u'moduleRoot')+Js(u'/'))) + if var.get(u'opts').get(u'filenameRelative').neg(): + return (var.get(u'moduleName')+var.get(u'opts').get(u'filename').callprop(u'replace', JsRegExp(u'/^\\//'), Js(u''))) + if (var.get(u'opts').get(u'sourceRoot')!=var.get(u"null")): + var.put(u'sourceRootRegEx', var.get(u'RegExp').create(((Js(u'^')+var.get(u'opts').get(u'sourceRoot'))+Js(u'/?')))) + var.put(u'filenameRelative', var.get(u'filenameRelative').callprop(u'replace', var.get(u'sourceRootRegEx'), Js(u''))) + var.put(u'filenameRelative', var.get(u'filenameRelative').callprop(u'replace', JsRegExp(u'/\\.(\\w*?)$/'), Js(u''))) + var.put(u'moduleName', var.get(u'filenameRelative'), u'+') + var.put(u'moduleName', var.get(u'moduleName').callprop(u'replace', JsRegExp(u'/\\\\/g'), Js(u'/'))) + if var.get(u'opts').get(u'getModuleId'): + return (var.get(u'opts').callprop(u'getModuleId', var.get(u'moduleName')) or var.get(u'moduleName')) + else: + return var.get(u'moduleName') + PyJs_getModuleName_105_._set_name(u'getModuleName') + var.get(u'File').get(u'prototype').put(u'getModuleName', PyJs_getModuleName_105_) + @Js + def PyJs_resolveModuleSource_106_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'resolveModuleSource':PyJs_resolveModuleSource_106_, u'arguments':arguments}, var) + var.registers([u'resolveModuleSource', u'source']) + var.put(u'resolveModuleSource', var.get(u"this").get(u'opts').get(u'resolveModuleSource')) + if var.get(u'resolveModuleSource'): + var.put(u'source', var.get(u'resolveModuleSource')(var.get(u'source'), var.get(u"this").get(u'opts').get(u'filename'))) + return var.get(u'source') + PyJs_resolveModuleSource_106_._set_name(u'resolveModuleSource') + var.get(u'File').get(u'prototype').put(u'resolveModuleSource', PyJs_resolveModuleSource_106_) + @Js + def PyJs_addImport_107_(source, imported, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'imported':imported, u'arguments':arguments, u'addImport':PyJs_addImport_107_}, var) + var.registers([u'specifiers', u'imported', u'name', u'alias', u'source', u'declar', u'id']) + var.put(u'name', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'imported'))) + var.put(u'alias', ((var.get(u'source')+Js(u':'))+var.get(u'imported'))) + var.put(u'id', var.get(u"this").get(u'dynamicImportIds').get(var.get(u'alias'))) + if var.get(u'id').neg(): + var.put(u'source', var.get(u"this").callprop(u'resolveModuleSource', var.get(u'source'))) + var.put(u'id', var.get(u"this").get(u'dynamicImportIds').put(var.get(u'alias'), var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', var.get(u'name')))) + var.put(u'specifiers', Js([])) + if PyJsStrictEq(var.get(u'imported'),Js(u'*')): + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'importNamespaceSpecifier', var.get(u'id'))) + else: + if PyJsStrictEq(var.get(u'imported'),Js(u'default')): + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'importDefaultSpecifier', var.get(u'id'))) + else: + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'importSpecifier', var.get(u'id'), var.get(u't').callprop(u'identifier', var.get(u'imported')))) + var.put(u'declar', var.get(u't').callprop(u'importDeclaration', var.get(u'specifiers'), var.get(u't').callprop(u'stringLiteral', var.get(u'source')))) + var.get(u'declar').put(u'_blockHoist', Js(3.0)) + var.get(u"this").get(u'path').callprop(u'unshiftContainer', Js(u'body'), var.get(u'declar')) + return var.get(u'id') + PyJs_addImport_107_._set_name(u'addImport') + var.get(u'File').get(u'prototype').put(u'addImport', PyJs_addImport_107_) + @Js + def PyJs_addHelper_108_(name, this, arguments, var=var): + var = Scope({u'this':this, u'addHelper':PyJs_addHelper_108_, u'name':name, u'arguments':arguments}, var) + var.registers([u'uid', u'generator', u'res', u'declar', u'runtime', u'ref', u'name']) + var.put(u'declar', var.get(u"this").get(u'declarations').get(var.get(u'name'))) + if var.get(u'declar'): + return var.get(u'declar') + if var.get(u"this").get(u'usedHelpers').get(var.get(u'name')).neg(): + var.get(u"this").get(u'metadata').get(u'usedHelpers').callprop(u'push', var.get(u'name')) + var.get(u"this").get(u'usedHelpers').put(var.get(u'name'), var.get(u'true')) + var.put(u'generator', var.get(u"this").callprop(u'get', Js(u'helperGenerator'))) + var.put(u'runtime', var.get(u"this").callprop(u'get', Js(u'helpersNamespace'))) + if var.get(u'generator'): + var.put(u'res', var.get(u'generator')(var.get(u'name'))) + if var.get(u'res'): + return var.get(u'res') + else: + if var.get(u'runtime'): + return var.get(u't').callprop(u'memberExpression', var.get(u'runtime'), var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.put(u'ref', PyJsComma(Js(0.0),var.get(u'_babelHelpers2').get(u'default'))(var.get(u'name'))) + var.put(u'uid', var.get(u"this").get(u'declarations').put(var.get(u'name'), var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', var.get(u'name')))) + if (var.get(u't').callprop(u'isFunctionExpression', var.get(u'ref')) and var.get(u'ref').get(u'id').neg()): + var.get(u'ref').get(u'body').put(u'_compact', var.get(u'true')) + var.get(u'ref').put(u'_generated', var.get(u'true')) + var.get(u'ref').put(u'id', var.get(u'uid')) + var.get(u'ref').put(u'type', Js(u'FunctionDeclaration')) + var.get(u"this").get(u'path').callprop(u'unshiftContainer', Js(u'body'), var.get(u'ref')) + else: + var.get(u'ref').put(u'_compact', var.get(u'true')) + PyJs_Object_109_ = Js({u'id':var.get(u'uid'),u'init':var.get(u'ref'),u'unique':var.get(u'true')}) + var.get(u"this").get(u'scope').callprop(u'push', PyJs_Object_109_) + return var.get(u'uid') + PyJs_addHelper_108_._set_name(u'addHelper') + var.get(u'File').get(u'prototype').put(u'addHelper', PyJs_addHelper_108_) + @Js + def PyJs_addTemplateObject_110_(helperName, strings, raw, this, arguments, var=var): + var = Scope({u'this':this, u'helperName':helperName, u'raw':raw, u'arguments':arguments, u'addTemplateObject':PyJs_addTemplateObject_110_, u'strings':strings}, var) + var.registers([u'name', u'helperName', u'raw', u'init', u'declar', u'stringIds', u'helperId', u'strings', u'uid']) + @Js + def PyJs_anonymous_111_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'string']) + return var.get(u'string').get(u'value') + PyJs_anonymous_111_._set_name(u'anonymous') + var.put(u'stringIds', var.get(u'raw').get(u'elements').callprop(u'map', PyJs_anonymous_111_)) + var.put(u'name', ((((var.get(u'helperName')+Js(u'_'))+var.get(u'raw').get(u'elements').get(u'length'))+Js(u'_'))+var.get(u'stringIds').callprop(u'join', Js(u',')))) + var.put(u'declar', var.get(u"this").get(u'declarations').get(var.get(u'name'))) + if var.get(u'declar'): + return var.get(u'declar') + var.put(u'uid', var.get(u"this").get(u'declarations').put(var.get(u'name'), var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'templateObject')))) + var.put(u'helperId', var.get(u"this").callprop(u'addHelper', var.get(u'helperName'))) + var.put(u'init', var.get(u't').callprop(u'callExpression', var.get(u'helperId'), Js([var.get(u'strings'), var.get(u'raw')]))) + var.get(u'init').put(u'_compact', var.get(u'true')) + PyJs_Object_112_ = Js({u'id':var.get(u'uid'),u'init':var.get(u'init'),u'_blockHoist':Js(1.9)}) + var.get(u"this").get(u'scope').callprop(u'push', PyJs_Object_112_) + return var.get(u'uid') + PyJs_addTemplateObject_110_._set_name(u'addTemplateObject') + var.get(u'File').get(u'prototype').put(u'addTemplateObject', PyJs_addTemplateObject_110_) + @Js + def PyJs_buildCodeFrameError_113_(node, msg, this, arguments, var=var): + var = Scope({u'node':node, u'msg':msg, u'buildCodeFrameError':PyJs_buildCodeFrameError_113_, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'loc', u'msg', u'err', u'Error']) + var.put(u'Error', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'SyntaxError'))) + var.put(u'loc', (var.get(u'node') and (var.get(u'node').get(u'loc') or var.get(u'node').get(u'_loc')))) + var.put(u'err', var.get(u'Error').create(var.get(u'msg'))) + if var.get(u'loc'): + var.get(u'err').put(u'loc', var.get(u'loc').get(u'start')) + else: + PyJsComma(Js(0.0),var.get(u'_babelTraverse2').get(u'default'))(var.get(u'node'), var.get(u'errorVisitor'), var.get(u"this").get(u'scope'), var.get(u'err')) + var.get(u'err').put(u'message', Js(u' (This is an error on an internal node. Probably an internal error'), u'+') + if var.get(u'err').get(u'loc'): + var.get(u'err').put(u'message', Js(u'. Location has been estimated.'), u'+') + var.get(u'err').put(u'message', Js(u')'), u'+') + return var.get(u'err') + PyJs_buildCodeFrameError_113_._set_name(u'buildCodeFrameError') + var.get(u'File').get(u'prototype').put(u'buildCodeFrameError', PyJs_buildCodeFrameError_113_) + @Js + def PyJs_mergeSourceMap_114_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments, u'mergeSourceMap':PyJs_mergeSourceMap_114_}, var) + var.registers([u'_ret', u'map', u'inputMap']) + var.put(u'inputMap', var.get(u"this").get(u'opts').get(u'inputSourceMap')) + if var.get(u'inputMap'): + @Js + def PyJs_anonymous_115_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'mergedGenerator', u'source', u'mergedMap', u'outputMapConsumer', u'inputMapConsumer']) + var.put(u'inputMapConsumer', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapConsumer').create(var.get(u'inputMap'))) + var.put(u'outputMapConsumer', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapConsumer').create(var.get(u'map'))) + PyJs_Object_116_ = Js({u'file':var.get(u'inputMapConsumer').get(u'file'),u'sourceRoot':var.get(u'inputMapConsumer').get(u'sourceRoot')}) + var.put(u'mergedGenerator', var.get(u'_sourceMap2').get(u'default').get(u'SourceMapGenerator').create(PyJs_Object_116_)) + var.put(u'source', var.get(u'outputMapConsumer').get(u'sources').get(u'0')) + @Js + def PyJs_anonymous_117_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'generatedPosition', u'mapping']) + PyJs_Object_118_ = Js({u'line':var.get(u'mapping').get(u'generatedLine'),u'column':var.get(u'mapping').get(u'generatedColumn'),u'source':var.get(u'source')}) + var.put(u'generatedPosition', var.get(u'outputMapConsumer').callprop(u'generatedPositionFor', PyJs_Object_118_)) + if (var.get(u'generatedPosition').get(u'column')!=var.get(u"null")): + PyJs_Object_120_ = Js({u'line':var.get(u'mapping').get(u'originalLine'),u'column':var.get(u'mapping').get(u'originalColumn')}) + PyJs_Object_119_ = Js({u'source':var.get(u'mapping').get(u'source'),u'original':(var.get(u"null") if (var.get(u'mapping').get(u'source')==var.get(u"null")) else PyJs_Object_120_),u'generated':var.get(u'generatedPosition')}) + var.get(u'mergedGenerator').callprop(u'addMapping', PyJs_Object_119_) + PyJs_anonymous_117_._set_name(u'anonymous') + var.get(u'inputMapConsumer').callprop(u'eachMapping', PyJs_anonymous_117_) + var.put(u'mergedMap', var.get(u'mergedGenerator').callprop(u'toJSON')) + var.get(u'inputMap').put(u'mappings', var.get(u'mergedMap').get(u'mappings')) + PyJs_Object_121_ = Js({u'v':var.get(u'inputMap')}) + return PyJs_Object_121_ + PyJs_anonymous_115_._set_name(u'anonymous') + var.put(u'_ret', PyJs_anonymous_115_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret'))),Js(u'object')): + return var.get(u'_ret').get(u'v') + else: + return var.get(u'map') + PyJs_mergeSourceMap_114_._set_name(u'mergeSourceMap') + var.get(u'File').get(u'prototype').put(u'mergeSourceMap', PyJs_mergeSourceMap_114_) + @Js + def PyJs_parse_122_(code, this, arguments, var=var): + var = Scope({u'this':this, u'parse':PyJs_parse_122_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'ast', u'parser', u'parseCode', u'dirname', u'parserOpts']) + var.put(u'parseCode', var.get(u'_babylon').get(u'parse')) + var.put(u'parserOpts', var.get(u"this").get(u'opts').get(u'parserOpts')) + if var.get(u'parserOpts'): + PyJs_Object_123_ = Js({}) + var.put(u'parserOpts', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_123_, var.get(u"this").get(u'parserOpts'), var.get(u'parserOpts'))) + if var.get(u'parserOpts').get(u'parser'): + if PyJsStrictEq(var.get(u'parserOpts').get(u'parser').typeof(),Js(u'string')): + var.put(u'dirname', (var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u"this").get(u'opts').get(u'filename')) or var.get(u'process').callprop(u'cwd'))) + var.put(u'parser', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'parserOpts').get(u'parser'), var.get(u'dirname'))) + if var.get(u'parser'): + var.put(u'parseCode', var.get(u'require')(var.get(u'parser')).get(u'parse')) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u"Couldn't find parser ")+var.get(u'parserOpts').get(u'parser'))+Js(u' with "parse" method relative to directory '))+var.get(u'dirname')))) + raise PyJsTempException + else: + var.put(u'parseCode', var.get(u'parserOpts').get(u'parser')) + @Js + def PyJs_parse_125_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'parse':PyJs_parse_125_, u'arguments':arguments}, var) + var.registers([u'source']) + return PyJsComma(Js(0.0),var.get(u'_babylon').get(u'parse'))(var.get(u'source'), var.get(u'parserOpts')) + PyJs_parse_125_._set_name(u'parse') + PyJs_Object_124_ = Js({u'parse':PyJs_parse_125_}) + var.get(u'parserOpts').put(u'parser', PyJs_Object_124_) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Parse start')) + var.put(u'ast', var.get(u'parseCode')(var.get(u'code'), (var.get(u'parserOpts') or var.get(u"this").get(u'parserOpts')))) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Parse stop')) + return var.get(u'ast') + PyJs_parse_122_._set_name(u'parse') + var.get(u'File').get(u'prototype').put(u'parse', PyJs_parse_122_) + @Js + def PyJs__addAst_126_(ast, this, arguments, var=var): + var = Scope({u'this':this, u'_addAst':PyJs__addAst_126_, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'ast']) + PyJs_Object_127_ = Js({u'hub':var.get(u"this").get(u'hub'),u'parentPath':var.get(u"null"),u'parent':var.get(u'ast'),u'container':var.get(u'ast'),u'key':Js(u'program')}) + var.get(u"this").put(u'path', var.get(u'_babelTraverse').get(u'NodePath').callprop(u'get', PyJs_Object_127_).callprop(u'setContext')) + var.get(u"this").put(u'scope', var.get(u"this").get(u'path').get(u'scope')) + var.get(u"this").put(u'ast', var.get(u'ast')) + var.get(u"this").callprop(u'getMetadata') + PyJs__addAst_126_._set_name(u'_addAst') + var.get(u'File').get(u'prototype').put(u'_addAst', PyJs__addAst_126_) + @Js + def PyJs_addAst_128_(ast, this, arguments, var=var): + var = Scope({u'this':this, u'addAst':PyJs_addAst_128_, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'ast']) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Start set AST')) + var.get(u"this").callprop(u'_addAst', var.get(u'ast')) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'End set AST')) + PyJs_addAst_128_._set_name(u'addAst') + var.get(u'File').get(u'prototype').put(u'addAst', PyJs_addAst_128_) + @Js + def PyJs_transform_129_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'transform':PyJs_transform_129_}, var) + var.registers([u'i', u'visitor', u'pluginPasses']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'pass', var.get(u'_ref3')) + var.put(u'plugin', var.get(u'pass').get(u'plugin')) + var.put(u'fn', var.get(u'plugin').get(var.get(u'key'))) + if var.get(u'fn'): + var.get(u'fn').callprop(u'call', var.get(u'pass'), var.get(u"this")) + + PyJs_call_135_._set_name(u'call') + var.get(u'File').get(u'prototype').put(u'call', PyJs_call_135_) + @Js + def PyJs_parseInputSourceMap_136_(code, this, arguments, var=var): + var = Scope({u'this':this, u'parseInputSourceMap':PyJs_parseInputSourceMap_136_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'inputMap', u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + if PyJsStrictNeq(var.get(u'opts').get(u'inputSourceMap'),Js(False)): + var.put(u'inputMap', var.get(u'_convertSourceMap2').get(u'default').callprop(u'fromSource', var.get(u'code'))) + if var.get(u'inputMap'): + var.get(u'opts').put(u'inputSourceMap', var.get(u'inputMap').callprop(u'toObject')) + var.put(u'code', var.get(u'_convertSourceMap2').get(u'default').callprop(u'removeComments', var.get(u'code'))) + return var.get(u'code') + PyJs_parseInputSourceMap_136_._set_name(u'parseInputSourceMap') + var.get(u'File').get(u'prototype').put(u'parseInputSourceMap', PyJs_parseInputSourceMap_136_) + @Js + def PyJs_parseShebang_137_(this, arguments, var=var): + var = Scope({u'this':this, u'parseShebang':PyJs_parseShebang_137_, u'arguments':arguments}, var) + var.registers([u'shebangMatch']) + var.put(u'shebangMatch', var.get(u'shebangRegex').callprop(u'exec', var.get(u"this").get(u'code'))) + if var.get(u'shebangMatch'): + var.get(u"this").put(u'shebang', var.get(u'shebangMatch').get(u'0')) + var.get(u"this").put(u'code', var.get(u"this").get(u'code').callprop(u'replace', var.get(u'shebangRegex'), Js(u''))) + PyJs_parseShebang_137_._set_name(u'parseShebang') + var.get(u'File').get(u'prototype').put(u'parseShebang', PyJs_parseShebang_137_) + @Js + def PyJs_makeResult_138_(_ref4, this, arguments, var=var): + var = Scope({u'this':this, u'makeResult':PyJs_makeResult_138_, u'_ref4':_ref4, u'arguments':arguments}, var) + var.registers([u'ignored', u'code', u'map', u'_ref4', u'ast', u'result']) + var.put(u'code', var.get(u'_ref4').get(u'code')) + var.put(u'map', var.get(u'_ref4').get(u'map')) + var.put(u'ast', var.get(u'_ref4').get(u'ast')) + var.put(u'ignored', var.get(u'_ref4').get(u'ignored')) + PyJs_Object_139_ = Js({u'metadata':var.get(u"null"),u'options':var.get(u"this").get(u'opts'),u'ignored':var.get(u'ignored').neg().neg(),u'code':var.get(u"null"),u'ast':var.get(u"null"),u'map':(var.get(u'map') or var.get(u"null"))}) + var.put(u'result', PyJs_Object_139_) + if var.get(u"this").get(u'opts').get(u'code'): + var.get(u'result').put(u'code', var.get(u'code')) + if var.get(u"this").get(u'opts').get(u'ast'): + var.get(u'result').put(u'ast', var.get(u'ast')) + if var.get(u"this").get(u'opts').get(u'metadata'): + var.get(u'result').put(u'metadata', var.get(u"this").get(u'metadata')) + return var.get(u'result') + PyJs_makeResult_138_._set_name(u'makeResult') + var.get(u'File').get(u'prototype').put(u'makeResult', PyJs_makeResult_138_) + @Js + def PyJs_generate_140_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generate':PyJs_generate_140_}, var) + var.registers([u'_result', u'generator', u'ast', u'result', u'dirname', u'gen', u'opts']) + var.put(u'opts', var.get(u"this").get(u'opts')) + var.put(u'ast', var.get(u"this").get(u'ast')) + PyJs_Object_141_ = Js({u'ast':var.get(u'ast')}) + var.put(u'result', PyJs_Object_141_) + if var.get(u'opts').get(u'code').neg(): + return var.get(u"this").callprop(u'makeResult', var.get(u'result')) + var.put(u'gen', var.get(u'_babelGenerator2').get(u'default')) + if var.get(u'opts').get(u'generatorOpts').get(u'generator'): + var.put(u'gen', var.get(u'opts').get(u'generatorOpts').get(u'generator')) + if PyJsStrictEq(var.get(u'gen',throw=False).typeof(),Js(u'string')): + var.put(u'dirname', (var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u"this").get(u'opts').get(u'filename')) or var.get(u'process').callprop(u'cwd'))) + var.put(u'generator', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'gen'), var.get(u'dirname'))) + if var.get(u'generator'): + var.put(u'gen', var.get(u'require')(var.get(u'generator')).get(u'print')) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u"Couldn't find generator ")+var.get(u'gen'))+Js(u' with "print" method relative to directory '))+var.get(u'dirname')))) + raise PyJsTempException + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Generation start')) + var.put(u'_result', var.get(u'gen')(var.get(u'ast'), (PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'opts'), var.get(u'opts').get(u'generatorOpts')) if var.get(u'opts').get(u'generatorOpts') else var.get(u'opts')), var.get(u"this").get(u'code'))) + var.get(u'result').put(u'code', var.get(u'_result').get(u'code')) + var.get(u'result').put(u'map', var.get(u'_result').get(u'map')) + var.get(u"this").get(u'log').callprop(u'debug', Js(u'Generation end')) + if var.get(u"this").get(u'shebang'): + var.get(u'result').put(u'code', ((var.get(u"this").get(u'shebang')+Js(u'\n'))+var.get(u'result').get(u'code'))) + if var.get(u'result').get(u'map'): + var.get(u'result').put(u'map', var.get(u"this").callprop(u'mergeSourceMap', var.get(u'result').get(u'map'))) + if (PyJsStrictEq(var.get(u'opts').get(u'sourceMaps'),Js(u'inline')) or PyJsStrictEq(var.get(u'opts').get(u'sourceMaps'),Js(u'both'))): + var.get(u'result').put(u'code', (Js(u'\n')+var.get(u'_convertSourceMap2').get(u'default').callprop(u'fromObject', var.get(u'result').get(u'map')).callprop(u'toComment')), u'+') + if PyJsStrictEq(var.get(u'opts').get(u'sourceMaps'),Js(u'inline')): + var.get(u'result').put(u'map', var.get(u"null")) + return var.get(u"this").callprop(u'makeResult', var.get(u'result')) + PyJs_generate_140_._set_name(u'generate') + var.get(u'File').get(u'prototype').put(u'generate', PyJs_generate_140_) + return var.get(u'File') + PyJs_anonymous_86_._set_name(u'anonymous') + var.put(u'File', PyJs_anonymous_86_(var.get(u'_store2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'File')) + var.get(u'exports').put(u'File', var.get(u'File')) + PyJs_anonymous_81_._set_name(u'anonymous') + PyJs_anonymous_81_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_80_._set_name(u'anonymous') +PyJs_Object_142_ = Js({u'../../helpers/resolve':Js(9.0),u'../../store':Js(10.0),u'../../util':Js(26.0),u'../internal-plugins/block-hoist':Js(21.0),u'../internal-plugins/shadow-functions':Js(22.0),u'../plugin-pass':Js(24.0),u'./logger':Js(13.0),u'./metadata':Js(14.0),u'./options/option-manager':Js(18.0),u'_process':Js(531.0),u'babel-code-frame':Js(4.0),u'babel-generator':Js(40.0),u'babel-helpers':Js(56.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0),u'babylon':Js(262.0),u'convert-source-map':Js(267.0),u'lodash/defaults':Js(442.0),u'path':Js(530.0),u'source-map':Js(519.0)}) +@Js +def PyJs_anonymous_143_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'seenDeprecatedMessages', u'require', u'module', u'_node2', u'_node', u'verboseDebug', u'_interopRequireDefault', u'generalDebug', u'_classCallCheck3', u'_classCallCheck2', u'Logger']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_144_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_144_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_node', var.get(u'require')(Js(u'debug/node'))) + var.put(u'_node2', var.get(u'_interopRequireDefault')(var.get(u'_node'))) + pass + var.put(u'verboseDebug', PyJsComma(Js(0.0),var.get(u'_node2').get(u'default'))(Js(u'babel:verbose'))) + var.put(u'generalDebug', PyJsComma(Js(0.0),var.get(u'_node2').get(u'default'))(Js(u'babel'))) + var.put(u'seenDeprecatedMessages', Js([])) + @Js + def PyJs_anonymous_145_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Logger']) + @Js + def PyJsHoisted_Logger_(file, filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'file':file, u'filename':filename}, var) + var.registers([u'file', u'filename']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Logger')) + var.get(u"this").put(u'filename', var.get(u'filename')) + var.get(u"this").put(u'file', var.get(u'file')) + PyJsHoisted_Logger_.func_name = u'Logger' + var.put(u'Logger', PyJsHoisted_Logger_) + pass + @Js + def PyJs__buildMessage_146_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'_buildMessage':PyJs__buildMessage_146_, u'arguments':arguments}, var) + var.registers([u'msg', u'parts']) + var.put(u'parts', (Js(u'[BABEL] ')+var.get(u"this").get(u'filename'))) + if var.get(u'msg'): + var.put(u'parts', (Js(u': ')+var.get(u'msg')), u'+') + return var.get(u'parts') + PyJs__buildMessage_146_._set_name(u'_buildMessage') + var.get(u'Logger').get(u'prototype').put(u'_buildMessage', PyJs__buildMessage_146_) + @Js + def PyJs_warn_147_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'warn':PyJs_warn_147_, u'arguments':arguments}, var) + var.registers([u'msg']) + var.get(u'console').callprop(u'warn', var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + PyJs_warn_147_._set_name(u'warn') + var.get(u'Logger').get(u'prototype').put(u'warn', PyJs_warn_147_) + @Js + def PyJs_error_148_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'error':PyJs_error_148_}, var) + var.registers([u'msg', u'Constructor']) + var.put(u'Constructor', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'Error'))) + PyJsTempException = JsToPyException(var.get(u'Constructor').create(var.get(u"this").callprop(u'_buildMessage', var.get(u'msg')))) + raise PyJsTempException + PyJs_error_148_._set_name(u'error') + var.get(u'Logger').get(u'prototype').put(u'error', PyJs_error_148_) + @Js + def PyJs_deprecate_149_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'deprecate':PyJs_deprecate_149_, u'arguments':arguments}, var) + var.registers([u'msg']) + if (var.get(u"this").get(u'file').get(u'opts') and var.get(u"this").get(u'file').get(u'opts').get(u'suppressDeprecationMessages')): + return var.get('undefined') + var.put(u'msg', var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + if (var.get(u'seenDeprecatedMessages').callprop(u'indexOf', var.get(u'msg'))>=Js(0.0)): + return var.get('undefined') + var.get(u'seenDeprecatedMessages').callprop(u'push', var.get(u'msg')) + var.get(u'console').callprop(u'error', var.get(u'msg')) + PyJs_deprecate_149_._set_name(u'deprecate') + var.get(u'Logger').get(u'prototype').put(u'deprecate', PyJs_deprecate_149_) + @Js + def PyJs_verbose_150_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'verbose':PyJs_verbose_150_}, var) + var.registers([u'msg']) + if var.get(u'verboseDebug').get(u'enabled'): + var.get(u'verboseDebug')(var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + PyJs_verbose_150_._set_name(u'verbose') + var.get(u'Logger').get(u'prototype').put(u'verbose', PyJs_verbose_150_) + @Js + def PyJs_debug_151_(msg, this, arguments, var=var): + var = Scope({u'msg':msg, u'this':this, u'arguments':arguments, u'debug':PyJs_debug_151_}, var) + var.registers([u'msg']) + if var.get(u'generalDebug').get(u'enabled'): + var.get(u'generalDebug')(var.get(u"this").callprop(u'_buildMessage', var.get(u'msg'))) + PyJs_debug_151_._set_name(u'debug') + var.get(u'Logger').get(u'prototype').put(u'debug', PyJs_debug_151_) + @Js + def PyJs_deopt_152_(node, msg, this, arguments, var=var): + var = Scope({u'node':node, u'msg':msg, u'this':this, u'arguments':arguments, u'deopt':PyJs_deopt_152_}, var) + var.registers([u'node', u'msg']) + var.get(u"this").callprop(u'debug', var.get(u'msg')) + PyJs_deopt_152_._set_name(u'deopt') + var.get(u'Logger').get(u'prototype').put(u'deopt', PyJs_deopt_152_) + return var.get(u'Logger') + PyJs_anonymous_145_._set_name(u'anonymous') + var.put(u'Logger', PyJs_anonymous_145_()) + var.get(u'exports').put(u'default', var.get(u'Logger')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_143_._set_name(u'anonymous') +PyJs_Object_153_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0),u'debug/node':Js(270.0)}) +@Js +def PyJs_anonymous_154_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ExportDeclaration', u'ModuleDeclaration', u'_interopRequireWildcard', u'ImportDeclaration', u'require', u'_babelTypes', u'module', u't', u'_interopRequireDefault', u'Scope', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_156_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_156_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Scope_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJsHoisted_Scope_.func_name = u'Scope' + var.put(u'Scope', PyJsHoisted_Scope_) + @Js + def PyJsHoisted_ExportDeclaration_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'specifier', u'exports', u'name', u'_i2', u'_ref2', u'source', u'declar', u'_isArray2', u'exported', u'file', u'path', u'bindings', u'local', u'_iterator2']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'source', (var.get(u'node').get(u'source').get(u'value') if var.get(u'node').get(u'source') else var.get(u"null"))) + var.put(u'exports', var.get(u'file').get(u'metadata').get(u'modules').get(u'exports')) + var.put(u'declar', var.get(u'path').callprop(u'get', Js(u'declaration'))) + if var.get(u'declar').callprop(u'isStatement'): + var.put(u'bindings', var.get(u'declar').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindings'): + var.put(u'name', PyJsTemp) + var.get(u'exports').get(u'exported').callprop(u'push', var.get(u'name')) + PyJs_Object_165_ = Js({u'kind':Js(u'local'),u'local':var.get(u'name'),u'exported':(Js(u'default') if var.get(u'path').callprop(u'isExportDefaultDeclaration') else var.get(u'name'))}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_165_) + if (var.get(u'path').callprop(u'isExportNamedDeclaration') and var.get(u'node').get(u'specifiers')): + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'specifiers')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'specifier', var.get(u'_ref2')) + var.put(u'exported', var.get(u'specifier').get(u'exported').get(u'name')) + var.get(u'exports').get(u'exported').callprop(u'push', var.get(u'exported')) + if var.get(u't').callprop(u'isExportDefaultSpecifier', var.get(u'specifier')): + PyJs_Object_166_ = Js({u'kind':Js(u'external'),u'local':var.get(u'exported'),u'exported':var.get(u'exported'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_166_) + if var.get(u't').callprop(u'isExportNamespaceSpecifier', var.get(u'specifier')): + PyJs_Object_167_ = Js({u'kind':Js(u'external-namespace'),u'exported':var.get(u'exported'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_167_) + var.put(u'local', var.get(u'specifier').get(u'local')) + if var.get(u'local').neg(): + continue + if var.get(u'source'): + PyJs_Object_168_ = Js({u'kind':Js(u'external'),u'local':var.get(u'local').get(u'name'),u'exported':var.get(u'exported'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_168_) + if var.get(u'source').neg(): + PyJs_Object_169_ = Js({u'kind':Js(u'local'),u'local':var.get(u'local').get(u'name'),u'exported':var.get(u'exported')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_169_) + + if var.get(u'path').callprop(u'isExportAllDeclaration'): + PyJs_Object_170_ = Js({u'kind':Js(u'external-all'),u'source':var.get(u'source')}) + var.get(u'exports').get(u'specifiers').callprop(u'push', PyJs_Object_170_) + PyJsHoisted_ExportDeclaration_.func_name = u'ExportDeclaration' + var.put(u'ExportDeclaration', PyJsHoisted_ExportDeclaration_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_155_ = Js({}) + var.put(u'newObj', PyJs_Object_155_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ImportDeclaration', var.get(u'exports').put(u'ModuleDeclaration', var.get(u'undefined'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'ExportDeclaration', var.get(u'ExportDeclaration')) + var.get(u'exports').put(u'Scope', var.get(u'Scope')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_enter_158_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'enter':PyJs_enter_158_}, var) + var.registers([u'node', u'path', u'file']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(u'source'): + var.get(u'node').get(u'source').put(u'value', var.get(u'file').callprop(u'resolveModuleSource', var.get(u'node').get(u'source').get(u'value'))) + PyJs_enter_158_._set_name(u'enter') + PyJs_Object_157_ = Js({u'enter':PyJs_enter_158_}) + var.put(u'ModuleDeclaration', var.get(u'exports').put(u'ModuleDeclaration', PyJs_Object_157_)) + @Js + def PyJs_exit_160_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_160_, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'specifiers', u'_isArray', u'imported', u'file', u'specifier', u'_i', u'importedName', u'_iterator', u'_ref', u'path', u'local']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'specifiers', Js([])) + var.put(u'imported', Js([])) + PyJs_Object_161_ = Js({u'source':var.get(u'node').get(u'source').get(u'value'),u'imported':var.get(u'imported'),u'specifiers':var.get(u'specifiers')}) + var.get(u'file').get(u'metadata').get(u'modules').get(u'imports').callprop(u'push', PyJs_Object_161_) + #for JS loop + var.put(u'_iterator', var.get(u'path').callprop(u'get', Js(u'specifiers'))) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'specifier', var.get(u'_ref')) + var.put(u'local', var.get(u'specifier').get(u'node').get(u'local').get(u'name')) + if var.get(u'specifier').callprop(u'isImportDefaultSpecifier'): + var.get(u'imported').callprop(u'push', Js(u'default')) + PyJs_Object_162_ = Js({u'kind':Js(u'named'),u'imported':Js(u'default'),u'local':var.get(u'local')}) + var.get(u'specifiers').callprop(u'push', PyJs_Object_162_) + if var.get(u'specifier').callprop(u'isImportSpecifier'): + var.put(u'importedName', var.get(u'specifier').get(u'node').get(u'imported').get(u'name')) + var.get(u'imported').callprop(u'push', var.get(u'importedName')) + PyJs_Object_163_ = Js({u'kind':Js(u'named'),u'imported':var.get(u'importedName'),u'local':var.get(u'local')}) + var.get(u'specifiers').callprop(u'push', PyJs_Object_163_) + if var.get(u'specifier').callprop(u'isImportNamespaceSpecifier'): + var.get(u'imported').callprop(u'push', Js(u'*')) + PyJs_Object_164_ = Js({u'kind':Js(u'namespace'),u'local':var.get(u'local')}) + var.get(u'specifiers').callprop(u'push', PyJs_Object_164_) + + PyJs_exit_160_._set_name(u'exit') + PyJs_Object_159_ = Js({u'exit':PyJs_exit_160_}) + var.put(u'ImportDeclaration', var.get(u'exports').put(u'ImportDeclaration', PyJs_Object_159_)) + pass + pass +PyJs_anonymous_154_._set_name(u'anonymous') +PyJs_Object_171_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_172_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_173_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_resolve', u'existsCache', u'exists', u'_fs', u'process', u'buildConfigChain', u'_json2', u'_interopRequireDefault', u'_fs2', u'BABELIGNORE_FILENAME', u'_json', u'PACKAGE_FILENAME', u'jsonCache', u'_classCallCheck3', u'_classCallCheck2', u'_assign', u'BABELRC_FILENAME', u'_pathIsAbsolute2', u'_path2', u'_assign2', u'_resolve2', u'_pathIsAbsolute', u'ConfigChainBuilder', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_174_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_174_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_buildConfigChain_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'builder', u'log', u'opts', u'filename']) + PyJs_Object_177_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_177_)) + var.put(u'log', var.get(u'arguments').get(u'1')) + var.put(u'filename', var.get(u'opts').get(u'filename')) + var.put(u'builder', var.get(u'ConfigChainBuilder').create(var.get(u'log'))) + if PyJsStrictNeq(var.get(u'opts').get(u'babelrc'),Js(False)): + var.get(u'builder').callprop(u'findConfigs', var.get(u'filename')) + PyJs_Object_178_ = Js({u'options':var.get(u'opts'),u'alias':Js(u'base'),u'dirname':(var.get(u'filename') and var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'filename')))}) + var.get(u'builder').callprop(u'mergeConfig', PyJs_Object_178_) + return var.get(u'builder').get(u'configs') + PyJsHoisted_buildConfigChain_.func_name = u'buildConfigChain' + var.put(u'buildConfigChain', PyJsHoisted_buildConfigChain_) + @Js + def PyJsHoisted_exists_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'cached', u'filename']) + var.put(u'cached', var.get(u'existsCache').get(var.get(u'filename'))) + if (var.get(u'cached')==var.get(u"null")): + return var.get(u'existsCache').put(var.get(u'filename'), var.get(u'_fs2').get(u'default').callprop(u'existsSync', var.get(u'filename'))) + else: + return var.get(u'cached') + PyJsHoisted_exists_.func_name = u'exists' + var.put(u'exists', PyJsHoisted_exists_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.get(u'exports').put(u'default', var.get(u'buildConfigChain')) + var.put(u'_resolve', var.get(u'require')(Js(u'../../../helpers/resolve'))) + var.put(u'_resolve2', var.get(u'_interopRequireDefault')(var.get(u'_resolve'))) + var.put(u'_json', var.get(u'require')(Js(u'json5'))) + var.put(u'_json2', var.get(u'_interopRequireDefault')(var.get(u'_json'))) + var.put(u'_pathIsAbsolute', var.get(u'require')(Js(u'path-is-absolute'))) + var.put(u'_pathIsAbsolute2', var.get(u'_interopRequireDefault')(var.get(u'_pathIsAbsolute'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + var.put(u'_fs', var.get(u'require')(Js(u'fs'))) + var.put(u'_fs2', var.get(u'_interopRequireDefault')(var.get(u'_fs'))) + pass + PyJs_Object_175_ = Js({}) + var.put(u'existsCache', PyJs_Object_175_) + PyJs_Object_176_ = Js({}) + var.put(u'jsonCache', PyJs_Object_176_) + var.put(u'BABELIGNORE_FILENAME', Js(u'.babelignore')) + var.put(u'BABELRC_FILENAME', Js(u'.babelrc')) + var.put(u'PACKAGE_FILENAME', Js(u'package.json')) + pass + pass + @Js + def PyJs_anonymous_179_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ConfigChainBuilder']) + @Js + def PyJsHoisted_ConfigChainBuilder_(log, this, arguments, var=var): + var = Scope({u'this':this, u'log':log, u'arguments':arguments}, var) + var.registers([u'log']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'ConfigChainBuilder')) + var.get(u"this").put(u'resolvedConfigs', Js([])) + var.get(u"this").put(u'configs', Js([])) + var.get(u"this").put(u'log', var.get(u'log')) + PyJsHoisted_ConfigChainBuilder_.func_name = u'ConfigChainBuilder' + var.put(u'ConfigChainBuilder', PyJsHoisted_ConfigChainBuilder_) + pass + @Js + def PyJs_findConfigs_180_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments, u'findConfigs':PyJs_findConfigs_180_}, var) + var.registers([u'loc', u'ignoreLoc', u'foundIgnore', u'pkgLoc', u'foundConfig', u'configLoc']) + if var.get(u'loc').neg(): + return var.get('undefined') + if PyJsComma(Js(0.0),var.get(u'_pathIsAbsolute2').get(u'default'))(var.get(u'loc')).neg(): + var.put(u'loc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'process').callprop(u'cwd'), var.get(u'loc'))) + var.put(u'foundConfig', Js(False)) + var.put(u'foundIgnore', Js(False)) + while PyJsStrictNeq(var.get(u'loc'),var.put(u'loc', var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'loc')))): + if var.get(u'foundConfig').neg(): + var.put(u'configLoc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'loc'), var.get(u'BABELRC_FILENAME'))) + if var.get(u'exists')(var.get(u'configLoc')): + var.get(u"this").callprop(u'addConfig', var.get(u'configLoc')) + var.put(u'foundConfig', var.get(u'true')) + var.put(u'pkgLoc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'loc'), var.get(u'PACKAGE_FILENAME'))) + if (var.get(u'foundConfig').neg() and var.get(u'exists')(var.get(u'pkgLoc'))): + var.put(u'foundConfig', var.get(u"this").callprop(u'addConfig', var.get(u'pkgLoc'), Js(u'babel'), var.get(u'JSON'))) + if var.get(u'foundIgnore').neg(): + var.put(u'ignoreLoc', var.get(u'_path2').get(u'default').callprop(u'join', var.get(u'loc'), var.get(u'BABELIGNORE_FILENAME'))) + if var.get(u'exists')(var.get(u'ignoreLoc')): + var.get(u"this").callprop(u'addIgnoreConfig', var.get(u'ignoreLoc')) + var.put(u'foundIgnore', var.get(u'true')) + if (var.get(u'foundIgnore') and var.get(u'foundConfig')): + return var.get('undefined') + PyJs_findConfigs_180_._set_name(u'findConfigs') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'findConfigs', PyJs_findConfigs_180_) + @Js + def PyJs_addIgnoreConfig_181_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments, u'addIgnoreConfig':PyJs_addIgnoreConfig_181_}, var) + var.registers([u'loc', u'lines', u'file']) + var.put(u'file', var.get(u'_fs2').get(u'default').callprop(u'readFileSync', var.get(u'loc'), Js(u'utf8'))) + var.put(u'lines', var.get(u'file').callprop(u'split', Js(u'\n'))) + @Js + def PyJs_anonymous_182_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return var.get(u'line').neg().neg() + PyJs_anonymous_182_._set_name(u'anonymous') + @Js + def PyJs_anonymous_183_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return var.get(u'line').callprop(u'replace', JsRegExp(u'/#(.*?)$/'), Js(u'')).callprop(u'trim') + PyJs_anonymous_183_._set_name(u'anonymous') + var.put(u'lines', var.get(u'lines').callprop(u'map', PyJs_anonymous_183_).callprop(u'filter', PyJs_anonymous_182_)) + if var.get(u'lines').get(u'length'): + PyJs_Object_185_ = Js({u'ignore':var.get(u'lines')}) + PyJs_Object_184_ = Js({u'options':PyJs_Object_185_,u'alias':var.get(u'loc'),u'dirname':var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'loc'))}) + var.get(u"this").callprop(u'mergeConfig', PyJs_Object_184_) + PyJs_addIgnoreConfig_181_._set_name(u'addIgnoreConfig') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'addIgnoreConfig', PyJs_addIgnoreConfig_181_) + @Js + def PyJs_addConfig_186_(loc, key, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'addConfig':PyJs_addConfig_186_, u'arguments':arguments, u'key':key}, var) + var.registers([u'content', u'loc', u'json', u'options', u'key']) + var.put(u'json', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'_json2').get(u'default'))) + if (var.get(u"this").get(u'resolvedConfigs').callprop(u'indexOf', var.get(u'loc'))>=Js(0.0)): + return Js(False) + var.get(u"this").get(u'resolvedConfigs').callprop(u'push', var.get(u'loc')) + var.put(u'content', var.get(u'_fs2').get(u'default').callprop(u'readFileSync', var.get(u'loc'), Js(u'utf8'))) + var.put(u'options', PyJsComma(Js(0.0), Js(None))) + try: + var.put(u'options', var.get(u'jsonCache').put(var.get(u'content'), (var.get(u'jsonCache').get(var.get(u'content')) or var.get(u'json').callprop(u'parse', var.get(u'content'))))) + if var.get(u'key'): + var.put(u'options', var.get(u'options').get(var.get(u'key'))) + except PyJsException as PyJsTempException: + PyJsHolder_657272_93340872 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + var.get(u'err').put(u'message', ((var.get(u'loc')+Js(u': Error while parsing JSON - '))+var.get(u'err').get(u'message'))) + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_93340872 is not None: + var.own[u'err'] = PyJsHolder_657272_93340872 + else: + del var.own[u'err'] + del PyJsHolder_657272_93340872 + PyJs_Object_187_ = Js({u'options':var.get(u'options'),u'alias':var.get(u'loc'),u'dirname':var.get(u'_path2').get(u'default').callprop(u'dirname', var.get(u'loc'))}) + var.get(u"this").callprop(u'mergeConfig', PyJs_Object_187_) + return var.get(u'options').neg().neg() + PyJs_addConfig_186_._set_name(u'addConfig') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'addConfig', PyJs_addConfig_186_) + @Js + def PyJs_mergeConfig_188_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments, u'mergeConfig':PyJs_mergeConfig_188_}, var) + var.registers([u'loc', u'envOpts', u'alias', u'envKey', u'extendsLoc', u'_ref', u'dirname', u'options']) + var.put(u'options', var.get(u'_ref').get(u'options')) + var.put(u'alias', var.get(u'_ref').get(u'alias')) + var.put(u'loc', var.get(u'_ref').get(u'loc')) + var.put(u'dirname', var.get(u'_ref').get(u'dirname')) + if var.get(u'options').neg(): + return Js(False) + PyJs_Object_189_ = Js({}) + var.put(u'options', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_189_, var.get(u'options'))) + var.put(u'dirname', (var.get(u'dirname') or var.get(u'process').callprop(u'cwd'))) + var.put(u'loc', (var.get(u'loc') or var.get(u'alias'))) + if var.get(u'options').get(u'extends'): + var.put(u'extendsLoc', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'options').get(u'extends'), var.get(u'dirname'))) + if var.get(u'extendsLoc'): + var.get(u"this").callprop(u'addConfig', var.get(u'extendsLoc')) + else: + if var.get(u"this").get(u'log'): + var.get(u"this").get(u'log').callprop(u'error', (((Js(u"Couldn't resolve extends clause of ")+var.get(u'options').get(u'extends'))+Js(u' in '))+var.get(u'alias'))) + var.get(u'options').delete(u'extends') + PyJs_Object_190_ = Js({u'options':var.get(u'options'),u'alias':var.get(u'alias'),u'loc':var.get(u'loc'),u'dirname':var.get(u'dirname')}) + var.get(u"this").get(u'configs').callprop(u'push', PyJs_Object_190_) + var.put(u'envOpts', PyJsComma(Js(0.0), Js(None))) + var.put(u'envKey', ((var.get(u'process').get(u'env').get(u'BABEL_ENV') or var.get(u'process').get(u'env').get(u'NODE_ENV')) or Js(u'development'))) + if var.get(u'options').get(u'env'): + var.put(u'envOpts', var.get(u'options').get(u'env').get(var.get(u'envKey'))) + var.get(u'options').delete(u'env') + PyJs_Object_191_ = Js({u'options':var.get(u'envOpts'),u'alias':((var.get(u'alias')+Js(u'.env.'))+var.get(u'envKey')),u'dirname':var.get(u'dirname')}) + var.get(u"this").callprop(u'mergeConfig', PyJs_Object_191_) + PyJs_mergeConfig_188_._set_name(u'mergeConfig') + var.get(u'ConfigChainBuilder').get(u'prototype').put(u'mergeConfig', PyJs_mergeConfig_188_) + return var.get(u'ConfigChainBuilder') + PyJs_anonymous_179_._set_name(u'anonymous') + var.put(u'ConfigChainBuilder', PyJs_anonymous_179_()) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_173_._set_name(u'anonymous') + PyJs_anonymous_173_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_172_._set_name(u'anonymous') +PyJs_Object_192_ = Js({u'../../../helpers/resolve':Js(9.0),u'_process':Js(531.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'fs':Js(523.0),u'json5':Js(284.0),u'path':Js(530.0),u'path-is-absolute':Js(499.0)}) +@Js +def PyJs_anonymous_193_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + PyJs_Object_195_ = Js({u'type':Js(u'filename'),u'description':Js(u'filename to use when reading from stdin - this will be used in source-maps, errors etc'),u'default':Js(u'unknown'),u'shorthand':Js(u'f')}) + PyJs_Object_196_ = Js({u'hidden':var.get(u'true'),u'type':Js(u'string')}) + PyJs_Object_197_ = Js({u'hidden':var.get(u'true')}) + PyJs_Object_199_ = Js({}) + PyJs_Object_198_ = Js({u'hidden':var.get(u'true'),u'default':PyJs_Object_199_}) + PyJs_Object_200_ = Js({u'description':Js(u''),u'hidden':var.get(u'true')}) + PyJs_Object_201_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'description':Js(u'retain line numbers - will result in really ugly code')}) + PyJs_Object_202_ = Js({u'description':Js(u'enable/disable ANSI syntax highlighting of code frames (on by default)'),u'type':Js(u'boolean'),u'default':var.get(u'true')}) + PyJs_Object_203_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'hidden':var.get(u'true')}) + PyJs_Object_204_ = Js({u'type':Js(u'list'),u'description':Js(u''),u'default':Js([])}) + PyJs_Object_205_ = Js({u'type':Js(u'list'),u'default':Js([]),u'description':Js(u'')}) + PyJs_Object_206_ = Js({u'type':Js(u'list'),u'description':Js(u'list of glob paths to **not** compile'),u'default':Js([])}) + PyJs_Object_207_ = Js({u'type':Js(u'list'),u'description':Js(u'list of glob paths to **only** compile')}) + PyJs_Object_208_ = Js({u'hidden':var.get(u'true'),u'default':var.get(u'true'),u'type':Js(u'boolean')}) + PyJs_Object_209_ = Js({u'hidden':var.get(u'true'),u'default':var.get(u'true'),u'type':Js(u'boolean')}) + PyJs_Object_210_ = Js({u'hidden':var.get(u'true'),u'default':var.get(u'true'),u'type':Js(u'boolean')}) + PyJs_Object_211_ = Js({u'type':Js(u'string'),u'hidden':var.get(u'true')}) + PyJs_Object_212_ = Js({u'type':Js(u'boolean'),u'default':var.get(u'true'),u'description':Js(u'write comments to generated output (true by default)')}) + PyJs_Object_213_ = Js({u'hidden':var.get(u'true'),u'description':Js(u'optional callback to control whether a comment should be inserted, when this is used the comments option is ignored')}) + PyJs_Object_214_ = Js({u'hidden':var.get(u'true'),u'description':Js(u'optional callback to wrap all visitor methods')}) + PyJs_Object_215_ = Js({u'type':Js(u'booleanString'),u'default':Js(u'auto'),u'description':Js(u'do not include superfluous whitespace characters and line terminators [true|false|auto]')}) + PyJs_Object_216_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'description':Js(u'save as much bytes when printing [true|false]')}) + PyJs_Object_217_ = Js({u'alias':Js(u'sourceMaps'),u'hidden':var.get(u'true')}) + PyJs_Object_218_ = Js({u'type':Js(u'booleanString'),u'description':Js(u'[true|false|inline]'),u'default':Js(False),u'shorthand':Js(u's')}) + PyJs_Object_219_ = Js({u'type':Js(u'string'),u'description':Js(u'set `file` on returned source map')}) + PyJs_Object_220_ = Js({u'type':Js(u'string'),u'description':Js(u'set `sources[0]` on returned source map')}) + PyJs_Object_221_ = Js({u'type':Js(u'filename'),u'description':Js(u'the root from which all sources are relative')}) + PyJs_Object_222_ = Js({u'description':Js(u'Whether or not to look up .babelrc and .babelignore files'),u'type':Js(u'boolean'),u'default':var.get(u'true')}) + PyJs_Object_223_ = Js({u'description':Js(u''),u'default':Js(u'module')}) + PyJs_Object_224_ = Js({u'type':Js(u'string'),u'description':Js(u'print a comment before any injected non-user code')}) + PyJs_Object_225_ = Js({u'type':Js(u'string'),u'description':Js(u'print a comment after any injected non-user code')}) + PyJs_Object_226_ = Js({u'hidden':var.get(u'true')}) + PyJs_Object_227_ = Js({u'hidden':var.get(u'true')}) + PyJs_Object_228_ = Js({u'type':Js(u'filename'),u'description':Js(u'optional prefix for the AMD module formatter that will be prepend to the filename on module definitions')}) + PyJs_Object_229_ = Js({u'type':Js(u'boolean'),u'default':Js(False),u'shorthand':Js(u'M'),u'description':Js(u'insert an explicit id for modules')}) + PyJs_Object_230_ = Js({u'description':Js(u'specify a custom name for module ids'),u'type':Js(u'string')}) + PyJs_Object_231_ = Js({u'description':Js(u'Whether to spawn a traversal pass per a preset. By default all presets are merged.'),u'type':Js(u'boolean'),u'default':Js(False),u'hidden':var.get(u'true')}) + PyJs_Object_232_ = Js({u'description':Js(u'Options to pass into the parser, or to change parsers (parserOpts.parser)'),u'default':Js(False)}) + PyJs_Object_233_ = Js({u'description':Js(u'Options to pass into the generator, or to change generators (generatorOpts.generator)'),u'default':Js(False)}) + PyJs_Object_194_ = Js({u'filename':PyJs_Object_195_,u'filenameRelative':PyJs_Object_196_,u'inputSourceMap':PyJs_Object_197_,u'env':PyJs_Object_198_,u'mode':PyJs_Object_200_,u'retainLines':PyJs_Object_201_,u'highlightCode':PyJs_Object_202_,u'suppressDeprecationMessages':PyJs_Object_203_,u'presets':PyJs_Object_204_,u'plugins':PyJs_Object_205_,u'ignore':PyJs_Object_206_,u'only':PyJs_Object_207_,u'code':PyJs_Object_208_,u'metadata':PyJs_Object_209_,u'ast':PyJs_Object_210_,u'extends':PyJs_Object_211_,u'comments':PyJs_Object_212_,u'shouldPrintComment':PyJs_Object_213_,u'wrapPluginVisitorMethod':PyJs_Object_214_,u'compact':PyJs_Object_215_,u'minified':PyJs_Object_216_,u'sourceMap':PyJs_Object_217_,u'sourceMaps':PyJs_Object_218_,u'sourceMapTarget':PyJs_Object_219_,u'sourceFileName':PyJs_Object_220_,u'sourceRoot':PyJs_Object_221_,u'babelrc':PyJs_Object_222_,u'sourceType':PyJs_Object_223_,u'auxiliaryCommentBefore':PyJs_Object_224_,u'auxiliaryCommentAfter':PyJs_Object_225_,u'resolveModuleSource':PyJs_Object_226_,u'getModuleId':PyJs_Object_227_,u'moduleRoot':PyJs_Object_228_,u'moduleIds':PyJs_Object_229_,u'moduleId':PyJs_Object_230_,u'passPerPreset':PyJs_Object_231_,u'parserOpts':PyJs_Object_232_,u'generatorOpts':PyJs_Object_233_}) + var.get(u'module').put(u'exports', PyJs_Object_194_) +PyJs_anonymous_193_._set_name(u'anonymous') +PyJs_Object_234_ = Js({}) +@Js +def PyJs_anonymous_235_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_config', u'_interopRequireWildcard', u'_parsers', u'require', u'exports', u'module', u'normaliseOptions', u'parsers', u'_config2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_236_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_236_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_normaliseOptions_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'opt', u'val', u'parser', u'options', u'key']) + PyJs_Object_238_ = Js({}) + var.put(u'options', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_238_)) + for PyJsTemp in var.get(u'options'): + var.put(u'key', PyJsTemp) + var.put(u'val', var.get(u'options').get(var.get(u'key'))) + if (var.get(u'val')==var.get(u"null")): + continue + var.put(u'opt', var.get(u'_config2').get(u'default').get(var.get(u'key'))) + if (var.get(u'opt') and var.get(u'opt').get(u'alias')): + var.put(u'opt', var.get(u'_config2').get(u'default').get(var.get(u'opt').get(u'alias'))) + if var.get(u'opt').neg(): + continue + var.put(u'parser', var.get(u'parsers').get(var.get(u'opt').get(u'type'))) + if var.get(u'parser'): + var.put(u'val', var.get(u'parser')(var.get(u'val'))) + var.get(u'options').put(var.get(u'key'), var.get(u'val')) + return var.get(u'options') + PyJsHoisted_normaliseOptions_.func_name = u'normaliseOptions' + var.put(u'normaliseOptions', PyJsHoisted_normaliseOptions_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_237_ = Js({}) + var.put(u'newObj', PyJs_Object_237_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'config', var.get(u'undefined')) + var.get(u'exports').put(u'normaliseOptions', var.get(u'normaliseOptions')) + var.put(u'_parsers', var.get(u'require')(Js(u'./parsers'))) + var.put(u'parsers', var.get(u'_interopRequireWildcard')(var.get(u'_parsers'))) + var.put(u'_config', var.get(u'require')(Js(u'./config'))) + var.put(u'_config2', var.get(u'_interopRequireDefault')(var.get(u'_config'))) + pass + pass + var.get(u'exports').put(u'config', var.get(u'_config2').get(u'default')) + pass +PyJs_anonymous_235_._set_name(u'anonymous') +PyJs_Object_239_ = Js({u'./config':Js(16.0),u'./parsers':Js(19.0)}) +@Js +def PyJs_anonymous_240_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_241_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'_resolve', u'_plugin2', u'_plugin3', u'_interopRequireDefault', u'_merge', u'_clone', u'_getIterator2', u'_getIterator3', u'_path2', u'_typeof2', u'_typeof3', u'process', u'_node', u'_removed', u'_objectWithoutProperties2', u'_classCallCheck3', u'_classCallCheck2', u'_babelMessages', u'_stringify2', u'OptionManager', u'_interopRequireWildcard', u'_assign', u'_config3', u'_config2', u'_buildConfigChain2', u'_merge2', u'_assign2', u'_resolve2', u'_index', u'messages', u'_cloneDeepWith2', u'_clone2', u'_stringify', u'_objectWithoutProperties3', u'context', u'_removed2', u'_path', u'_cloneDeepWith', u'_buildConfigChain']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_243_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_243_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_242_ = Js({}) + var.put(u'newObj', PyJs_Object_242_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_objectWithoutProperties2', var.get(u'require')(Js(u'babel-runtime/helpers/objectWithoutProperties'))) + var.put(u'_objectWithoutProperties3', var.get(u'_interopRequireDefault')(var.get(u'_objectWithoutProperties2'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_assign', var.get(u'require')(Js(u'babel-runtime/core-js/object/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_node', var.get(u'require')(Js(u'../../../api/node'))) + var.put(u'context', var.get(u'_interopRequireWildcard')(var.get(u'_node'))) + var.put(u'_plugin2', var.get(u'require')(Js(u'../../plugin'))) + var.put(u'_plugin3', var.get(u'_interopRequireDefault')(var.get(u'_plugin2'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_resolve', var.get(u'require')(Js(u'../../../helpers/resolve'))) + var.put(u'_resolve2', var.get(u'_interopRequireDefault')(var.get(u'_resolve'))) + var.put(u'_cloneDeepWith', var.get(u'require')(Js(u'lodash/cloneDeepWith'))) + var.put(u'_cloneDeepWith2', var.get(u'_interopRequireDefault')(var.get(u'_cloneDeepWith'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + var.put(u'_merge', var.get(u'require')(Js(u'../../../helpers/merge'))) + var.put(u'_merge2', var.get(u'_interopRequireDefault')(var.get(u'_merge'))) + var.put(u'_config2', var.get(u'require')(Js(u'./config'))) + var.put(u'_config3', var.get(u'_interopRequireDefault')(var.get(u'_config2'))) + var.put(u'_removed', var.get(u'require')(Js(u'./removed'))) + var.put(u'_removed2', var.get(u'_interopRequireDefault')(var.get(u'_removed'))) + var.put(u'_buildConfigChain', var.get(u'require')(Js(u'./build-config-chain'))) + var.put(u'_buildConfigChain2', var.get(u'_interopRequireDefault')(var.get(u'_buildConfigChain'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + pass + pass + @Js + def PyJs_anonymous_244_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'OptionManager']) + @Js + def PyJsHoisted_OptionManager_(log, this, arguments, var=var): + var = Scope({u'this':this, u'log':log, u'arguments':arguments}, var) + var.registers([u'log']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'OptionManager')) + var.get(u"this").put(u'resolvedConfigs', Js([])) + var.get(u"this").put(u'options', var.get(u'OptionManager').callprop(u'createBareOptions')) + var.get(u"this").put(u'log', var.get(u'log')) + PyJsHoisted_OptionManager_.func_name = u'OptionManager' + var.put(u'OptionManager', PyJsHoisted_OptionManager_) + pass + @Js + def PyJs_memoisePluginContainer_245_(fn, loc, i, alias, this, arguments, var=var): + var = Scope({u'loc':loc, u'arguments':arguments, u'alias':alias, u'i':i, u'memoisePluginContainer':PyJs_memoisePluginContainer_245_, u'this':this, u'fn':fn}, var) + var.registers([u'_plugin', u'_isArray', u'obj', u'loc', u'i', u'cache', u'alias', u'_i', u'_iterator', u'_ref', u'fn']) + #for JS loop + var.put(u'_iterator', var.get(u'OptionManager').get(u'memoisedPlugins')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'cache', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'cache').get(u'container'),var.get(u'fn')): + return var.get(u'cache').get(u'plugin') + + var.put(u'obj', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'fn',throw=False).typeof(),Js(u'function')): + var.put(u'obj', var.get(u'fn')(var.get(u'context'))) + else: + var.put(u'obj', var.get(u'fn')) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'obj'))),Js(u'object')): + var.put(u'_plugin', var.get(u'_plugin3').get(u'default').create(var.get(u'obj'), var.get(u'alias'))) + PyJs_Object_246_ = Js({u'container':var.get(u'fn'),u'plugin':var.get(u'_plugin')}) + var.get(u'OptionManager').get(u'memoisedPlugins').callprop(u'push', PyJs_Object_246_) + return var.get(u'_plugin') + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create(((var.get(u'messages').callprop(u'get', Js(u'pluginNotObject'), var.get(u'loc'), var.get(u'i'), (Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'obj'))))+var.get(u'loc'))+var.get(u'i')))) + raise PyJsTempException + PyJs_memoisePluginContainer_245_._set_name(u'memoisePluginContainer') + var.get(u'OptionManager').put(u'memoisePluginContainer', PyJs_memoisePluginContainer_245_) + @Js + def PyJs_createBareOptions_247_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'createBareOptions':PyJs_createBareOptions_247_}, var) + var.registers([u'_key', u'opt', u'opts']) + PyJs_Object_248_ = Js({}) + var.put(u'opts', PyJs_Object_248_) + for PyJsTemp in var.get(u'_config3').get(u'default'): + var.put(u'_key', PyJsTemp) + var.put(u'opt', var.get(u'_config3').get(u'default').get(var.get(u'_key'))) + var.get(u'opts').put(var.get(u'_key'), PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'opt').get(u'default'))) + return var.get(u'opts') + PyJs_createBareOptions_247_._set_name(u'createBareOptions') + var.get(u'OptionManager').put(u'createBareOptions', PyJs_createBareOptions_247_) + @Js + def PyJs_normalisePlugin_249_(plugin, loc, i, alias, this, arguments, var=var): + var = Scope({u'loc':loc, u'normalisePlugin':PyJs_normalisePlugin_249_, u'arguments':arguments, u'alias':alias, u'i':i, u'plugin':plugin, u'this':this}, var) + var.registers([u'i', u'loc', u'alias', u'plugin']) + var.put(u'plugin', (var.get(u'plugin').get(u'default') if var.get(u'plugin').get(u'__esModule') else var.get(u'plugin'))) + if var.get(u'plugin').instanceof(var.get(u'_plugin3').get(u'default')).neg(): + if (PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'function')) or PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'plugin'))),Js(u'object'))): + var.put(u'plugin', var.get(u'OptionManager').callprop(u'memoisePluginContainer', var.get(u'plugin'), var.get(u'loc'), var.get(u'i'), var.get(u'alias'))) + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create(var.get(u'messages').callprop(u'get', Js(u'pluginNotFunction'), var.get(u'loc'), var.get(u'i'), (Js(u'undefined') if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'plugin')))))) + raise PyJsTempException + var.get(u'plugin').callprop(u'init', var.get(u'loc'), var.get(u'i')) + return var.get(u'plugin') + PyJs_normalisePlugin_249_._set_name(u'normalisePlugin') + var.get(u'OptionManager').put(u'normalisePlugin', PyJs_normalisePlugin_249_) + @Js + def PyJs_normalisePlugins_250_(loc, dirname, plugins, this, arguments, var=var): + var = Scope({u'loc':loc, u'this':this, u'normalisePlugins':PyJs_normalisePlugins_250_, u'arguments':arguments, u'plugins':plugins, u'dirname':dirname}, var) + var.registers([u'loc', u'dirname', u'plugins']) + @Js + def PyJs_anonymous_251_(val, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val', u'plugin', u'i', u'pluginLoc', u'alias', u'options']) + var.put(u'plugin', PyJsComma(Js(0.0), Js(None))) + var.put(u'options', PyJsComma(Js(0.0), Js(None))) + if var.get(u'val').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Falsy value found in plugins'))) + raise PyJsTempException + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + var.put(u'plugin', var.get(u'val').get(u'0')) + var.put(u'options', var.get(u'val').get(u'1')) + else: + var.put(u'plugin', var.get(u'val')) + var.put(u'alias', (var.get(u'plugin') if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'string')) else ((var.get(u'loc')+Js(u'$'))+var.get(u'i')))) + if PyJsStrictEq(var.get(u'plugin',throw=False).typeof(),Js(u'string')): + var.put(u'pluginLoc', (PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))((Js(u'babel-plugin-')+var.get(u'plugin')), var.get(u'dirname')) or PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'plugin'), var.get(u'dirname')))) + if var.get(u'pluginLoc'): + var.put(u'plugin', var.get(u'require')(var.get(u'pluginLoc'))) + else: + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(var.get(u'messages').callprop(u'get', Js(u'pluginUnknown'), var.get(u'plugin'), var.get(u'loc'), var.get(u'i'), var.get(u'dirname')))) + raise PyJsTempException + var.put(u'plugin', var.get(u'OptionManager').callprop(u'normalisePlugin', var.get(u'plugin'), var.get(u'loc'), var.get(u'i'), var.get(u'alias'))) + return Js([var.get(u'plugin'), var.get(u'options')]) + PyJs_anonymous_251_._set_name(u'anonymous') + return var.get(u'plugins').callprop(u'map', PyJs_anonymous_251_) + PyJs_normalisePlugins_250_._set_name(u'normalisePlugins') + var.get(u'OptionManager').put(u'normalisePlugins', PyJs_normalisePlugins_250_) + @Js + def PyJs_mergeOptions_252_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'mergeOptions':PyJs_mergeOptions_252_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'loc', u'presetConfigErr', u'dirname', u'option', u'_this', u'unknownOptErr', u'_ref2', u'extendingOpts', u'alias', u'_key2', u'rawOpts', u'opts']) + var.put(u'_this', var.get(u"this")) + var.put(u'rawOpts', var.get(u'_ref2').get(u'options')) + var.put(u'extendingOpts', var.get(u'_ref2').get(u'extending')) + var.put(u'alias', var.get(u'_ref2').get(u'alias')) + var.put(u'loc', var.get(u'_ref2').get(u'loc')) + var.put(u'dirname', var.get(u'_ref2').get(u'dirname')) + var.put(u'alias', (var.get(u'alias') or Js(u'foreign'))) + if var.get(u'rawOpts').neg(): + return var.get('undefined') + if (PyJsStrictNeq((Js(u'undefined') if PyJsStrictEq(var.get(u'rawOpts',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'rawOpts'))),Js(u'object')) or var.get(u'Array').callprop(u'isArray', var.get(u'rawOpts'))): + var.get(u"this").get(u'log').callprop(u'error', (Js(u'Invalid options type for ')+var.get(u'alias')), var.get(u'TypeError')) + @Js + def PyJs_anonymous_253_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if var.get(u'val').instanceof(var.get(u'_plugin3').get(u'default')): + return var.get(u'val') + PyJs_anonymous_253_._set_name(u'anonymous') + var.put(u'opts', PyJsComma(Js(0.0),var.get(u'_cloneDeepWith2').get(u'default'))(var.get(u'rawOpts'), PyJs_anonymous_253_)) + var.put(u'dirname', (var.get(u'dirname') or var.get(u'process').callprop(u'cwd'))) + var.put(u'loc', (var.get(u'loc') or var.get(u'alias'))) + for PyJsTemp in var.get(u'opts'): + var.put(u'_key2', PyJsTemp) + var.put(u'option', var.get(u'_config3').get(u'default').get(var.get(u'_key2'))) + if (var.get(u'option').neg() and var.get(u"this").get(u'log')): + if var.get(u'_removed2').get(u'default').get(var.get(u'_key2')): + var.get(u"this").get(u'log').callprop(u'error', (((((Js(u'Using removed Babel 5 option: ')+var.get(u'alias'))+Js(u'.'))+var.get(u'_key2'))+Js(u' - '))+var.get(u'_removed2').get(u'default').get(var.get(u'_key2')).get(u'message')), var.get(u'ReferenceError')) + else: + var.put(u'unknownOptErr', ((((Js(u'Unknown option: ')+var.get(u'alias'))+Js(u'.'))+var.get(u'_key2'))+Js(u'. Check out http://babeljs.io/docs/usage/options/ for more information about options.'))) + var.put(u'presetConfigErr', Js(u"A common cause of this error is the presence of a configuration options object without the corresponding preset name. Example:\n\nInvalid:\n `{ presets: [{option: value}] }`\nValid:\n `{ presets: [['presetName', {option: value}]] }`\n\nFor more detailed information on preset configuration, please see http://babeljs.io/docs/plugins/#pluginpresets-options.")) + var.get(u"this").get(u'log').callprop(u'error', ((var.get(u'unknownOptErr')+Js(u'\n\n'))+var.get(u'presetConfigErr')), var.get(u'ReferenceError')) + PyJsComma(Js(0.0),var.get(u'_index').get(u'normaliseOptions'))(var.get(u'opts')) + if var.get(u'opts').get(u'plugins'): + var.get(u'opts').put(u'plugins', var.get(u'OptionManager').callprop(u'normalisePlugins', var.get(u'loc'), var.get(u'dirname'), var.get(u'opts').get(u'plugins'))) + if var.get(u'opts').get(u'presets'): + if var.get(u'opts').get(u'passPerPreset'): + @Js + def PyJs_anonymous_254_(preset, presetLoc, this, arguments, var=var): + var = Scope({u'presetLoc':presetLoc, u'this':this, u'preset':preset, u'arguments':arguments}, var) + var.registers([u'presetLoc', u'preset']) + PyJs_Object_255_ = Js({u'options':var.get(u'preset'),u'extending':var.get(u'preset'),u'alias':var.get(u'presetLoc'),u'loc':var.get(u'presetLoc'),u'dirname':var.get(u'dirname')}) + var.get(u'_this').callprop(u'mergeOptions', PyJs_Object_255_) + PyJs_anonymous_254_._set_name(u'anonymous') + var.get(u'opts').put(u'presets', var.get(u"this").callprop(u'resolvePresets', var.get(u'opts').get(u'presets'), var.get(u'dirname'), PyJs_anonymous_254_)) + else: + var.get(u"this").callprop(u'mergePresets', var.get(u'opts').get(u'presets'), var.get(u'dirname')) + var.get(u'opts').delete(u'presets') + if PyJsStrictEq(var.get(u'rawOpts'),var.get(u'extendingOpts')): + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'extendingOpts'), var.get(u'opts')) + else: + PyJsComma(Js(0.0),var.get(u'_merge2').get(u'default'))((var.get(u'extendingOpts') or var.get(u"this").get(u'options')), var.get(u'opts')) + PyJs_mergeOptions_252_._set_name(u'mergeOptions') + var.get(u'OptionManager').get(u'prototype').put(u'mergeOptions', PyJs_mergeOptions_252_) + @Js + def PyJs_mergePresets_256_(presets, dirname, this, arguments, var=var): + var = Scope({u'this':this, u'mergePresets':PyJs_mergePresets_256_, u'presets':presets, u'dirname':dirname, u'arguments':arguments}, var) + var.registers([u'presets', u'dirname', u'_this2']) + var.put(u'_this2', var.get(u"this")) + @Js + def PyJs_anonymous_257_(presetOpts, presetLoc, this, arguments, var=var): + var = Scope({u'presetLoc':presetLoc, u'this':this, u'presetOpts':presetOpts, u'arguments':arguments}, var) + var.registers([u'presetLoc', u'presetOpts']) + PyJs_Object_258_ = Js({u'options':var.get(u'presetOpts'),u'alias':var.get(u'presetLoc'),u'loc':var.get(u'presetLoc'),u'dirname':var.get(u'_path2').get(u'default').callprop(u'dirname', (var.get(u'presetLoc') or Js(u'')))}) + var.get(u'_this2').callprop(u'mergeOptions', PyJs_Object_258_) + PyJs_anonymous_257_._set_name(u'anonymous') + var.get(u"this").callprop(u'resolvePresets', var.get(u'presets'), var.get(u'dirname'), PyJs_anonymous_257_) + PyJs_mergePresets_256_._set_name(u'mergePresets') + var.get(u'OptionManager').get(u'prototype').put(u'mergePresets', PyJs_mergePresets_256_) + @Js + def PyJs_resolvePresets_259_(presets, dirname, onResolve, this, arguments, var=var): + var = Scope({u'this':this, u'presets':presets, u'onResolve':onResolve, u'arguments':arguments, u'dirname':dirname, u'resolvePresets':PyJs_resolvePresets_259_}, var) + var.registers([u'onResolve', u'presets', u'dirname']) + @Js + def PyJs_anonymous_260_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val', u'_val', u'matches', u'rest', u'presetLoc', u'presetPath', u'_val2', u'__esModule', u'options', u'orgName']) + var.put(u'options', PyJsComma(Js(0.0), Js(None))) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + if (var.get(u'val').get(u'length')>Js(2.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'Unexpected extra options ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val').callprop(u'slice', Js(2.0))))+Js(u' passed to preset.')))) + raise PyJsTempException + var.put(u'_val', var.get(u'val')) + var.put(u'val', var.get(u'_val').get(u'0')) + var.put(u'options', var.get(u'_val').get(u'1')) + var.put(u'presetLoc', PyJsComma(Js(0.0), Js(None))) + try: + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + var.put(u'presetLoc', (PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))((Js(u'babel-preset-')+var.get(u'val')), var.get(u'dirname')) or PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'val'), var.get(u'dirname')))) + if var.get(u'presetLoc').neg(): + var.put(u'matches', var.get(u'val').callprop(u'match', JsRegExp(u'/^(@[^/]+)\\/(.+)$/'))) + if var.get(u'matches'): + var.put(u'orgName', var.get(u'matches').get(u'1')) + var.put(u'presetPath', var.get(u'matches').get(u'2')) + var.put(u'val', ((var.get(u'orgName')+Js(u'/babel-preset-'))+var.get(u'presetPath'))) + var.put(u'presetLoc', PyJsComma(Js(0.0),var.get(u'_resolve2').get(u'default'))(var.get(u'val'), var.get(u'dirname'))) + if var.get(u'presetLoc').neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u"Couldn't find preset ")+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val')))+Js(u' relative to directory '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'dirname'))))) + raise PyJsTempException + var.put(u'val', var.get(u'require')(var.get(u'presetLoc'))) + if (PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))),Js(u'object')) and var.get(u'val').get(u'__esModule')): + if var.get(u'val').get(u'default'): + var.put(u'val', var.get(u'val').get(u'default')) + else: + var.put(u'_val2', var.get(u'val')) + var.put(u'__esModule', var.get(u'_val2').get(u'__esModule')) + var.put(u'rest', PyJsComma(Js(0.0),var.get(u'_objectWithoutProperties3').get(u'default'))(var.get(u'_val2'), Js([Js(u'__esModule')]))) + var.put(u'val', var.get(u'rest')) + if (PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))),Js(u'object')) and var.get(u'val').get(u'buildPreset')): + var.put(u'val', var.get(u'val').get(u'buildPreset')) + if (PyJsStrictNeq(var.get(u'val',throw=False).typeof(),Js(u'function')) and PyJsStrictNeq(var.get(u'options'),var.get(u'undefined'))): + PyJsTempException = JsToPyException(var.get(u'Error').create(((((Js(u'Options ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'options')))+Js(u' passed to '))+(var.get(u'presetLoc') or Js(u'a preset')))+Js(u' which does not accept options.')))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'function')): + var.put(u'val', var.get(u'val')(var.get(u'context'), var.get(u'options'))) + if PyJsStrictNeq((Js(u'undefined') if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'val'))),Js(u'object')): + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'Unsupported preset format: ')+var.get(u'val'))+Js(u'.')))) + raise PyJsTempException + (var.get(u'onResolve') and var.get(u'onResolve')(var.get(u'val'), var.get(u'presetLoc'))) + except PyJsException as PyJsTempException: + PyJsHolder_65_49729099 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'presetLoc'): + var.get(u'e').put(u'message', ((Js(u' (While processing preset: ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'presetLoc')))+Js(u')')), u'+') + PyJsTempException = JsToPyException(var.get(u'e')) + raise PyJsTempException + finally: + if PyJsHolder_65_49729099 is not None: + var.own[u'e'] = PyJsHolder_65_49729099 + else: + del var.own[u'e'] + del PyJsHolder_65_49729099 + return var.get(u'val') + PyJs_anonymous_260_._set_name(u'anonymous') + return var.get(u'presets').callprop(u'map', PyJs_anonymous_260_) + PyJs_resolvePresets_259_._set_name(u'resolvePresets') + var.get(u'OptionManager').get(u'prototype').put(u'resolvePresets', PyJs_resolvePresets_259_) + @Js + def PyJs_normaliseOptions_261_(this, arguments, var=var): + var = Scope({u'this':this, u'normaliseOptions':PyJs_normaliseOptions_261_, u'arguments':arguments}, var) + var.registers([u'_key3', u'val', u'option', u'opts']) + var.put(u'opts', var.get(u"this").get(u'options')) + for PyJsTemp in var.get(u'_config3').get(u'default'): + var.put(u'_key3', PyJsTemp) + var.put(u'option', var.get(u'_config3').get(u'default').get(var.get(u'_key3'))) + var.put(u'val', var.get(u'opts').get(var.get(u'_key3'))) + if (var.get(u'val').neg() and var.get(u'option').get(u'optional')): + continue + if var.get(u'option').get(u'alias'): + var.get(u'opts').put(var.get(u'option').get(u'alias'), (var.get(u'opts').get(var.get(u'option').get(u'alias')) or var.get(u'val'))) + else: + var.get(u'opts').put(var.get(u'_key3'), var.get(u'val')) + PyJs_normaliseOptions_261_._set_name(u'normaliseOptions') + var.get(u'OptionManager').get(u'prototype').put(u'normaliseOptions', PyJs_normaliseOptions_261_) + @Js + def PyJs_init_262_(this, arguments, var=var): + var = Scope({u'this':this, u'init':PyJs_init_262_, u'arguments':arguments}, var) + var.registers([u'_config', u'_isArray2', u'_ref3', u'_i2', u'opts', u'_iterator2']) + PyJs_Object_263_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else PyJs_Object_263_)) + #for JS loop + var.put(u'_iterator2', PyJsComma(Js(0.0),var.get(u'_buildConfigChain2').get(u'default'))(var.get(u'opts'), var.get(u"this").get(u'log'))) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'_config', var.get(u'_ref3')) + var.get(u"this").callprop(u'mergeOptions', var.get(u'_config')) + + var.get(u"this").callprop(u'normaliseOptions', var.get(u'opts')) + return var.get(u"this").get(u'options') + PyJs_init_262_._set_name(u'init') + var.get(u'OptionManager').get(u'prototype').put(u'init', PyJs_init_262_) + return var.get(u'OptionManager') + PyJs_anonymous_244_._set_name(u'anonymous') + var.put(u'OptionManager', PyJs_anonymous_244_()) + var.get(u'exports').put(u'default', var.get(u'OptionManager')) + var.get(u'OptionManager').put(u'memoisedPlugins', Js([])) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_241_._set_name(u'anonymous') + PyJs_anonymous_241_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_240_._set_name(u'anonymous') +PyJs_Object_264_ = Js({u'../../../api/node':Js(6.0),u'../../../helpers/merge':Js(7.0),u'../../../helpers/resolve':Js(9.0),u'../../plugin':Js(25.0),u'./build-config-chain':Js(15.0),u'./config':Js(16.0),u'./index':Js(17.0),u'./removed':Js(20.0),u'_process':Js(531.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/object/assign':Js(100.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/objectWithoutProperties':Js(112.0),u'babel-runtime/helpers/typeof':Js(114.0),u'lodash/clone':Js(438.0),u'lodash/cloneDeepWith':Js(440.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_265_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'util', u'exports', u'_interopRequireWildcard', u'require', u'list', u'_util', u'filename', u'_slash', u'booleanString', u'boolean', u'module', u'_slash2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_267_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_267_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_booleanString_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return var.get(u'util').callprop(u'booleanify', var.get(u'val')) + PyJsHoisted_booleanString_.func_name = u'booleanString' + var.put(u'booleanString', PyJsHoisted_booleanString_) + @Js + def PyJsHoisted_boolean_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return var.get(u'val').neg().neg() + PyJsHoisted_boolean_.func_name = u'boolean' + var.put(u'boolean', PyJsHoisted_boolean_) + @Js + def PyJsHoisted_list_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + return var.get(u'util').callprop(u'list', var.get(u'val')) + PyJsHoisted_list_.func_name = u'list' + var.put(u'list', PyJsHoisted_list_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_266_ = Js({}) + var.put(u'newObj', PyJs_Object_266_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'filename', var.get(u'undefined')) + var.get(u'exports').put(u'boolean', var.get(u'boolean')) + var.get(u'exports').put(u'booleanString', var.get(u'booleanString')) + var.get(u'exports').put(u'list', var.get(u'list')) + var.put(u'_slash', var.get(u'require')(Js(u'slash'))) + var.put(u'_slash2', var.get(u'_interopRequireDefault')(var.get(u'_slash'))) + var.put(u'_util', var.get(u'require')(Js(u'../../../util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + pass + pass + var.put(u'filename', var.get(u'exports').put(u'filename', var.get(u'_slash2').get(u'default'))) + pass + pass + pass +PyJs_anonymous_265_._set_name(u'anonymous') +PyJs_Object_268_ = Js({u'../../../util':Js(26.0),u'slash':Js(508.0)}) +@Js +def PyJs_anonymous_269_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + PyJs_Object_271_ = Js({u'message':Js(u'Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`')}) + PyJs_Object_272_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_273_ = Js({u'message':Js(u'This is not a necessary option in Babel 6')}) + PyJs_Object_274_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_275_ = Js({u'message':Js(u'Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/')}) + PyJs_Object_276_ = Js({u'message':Js(u'')}) + PyJs_Object_277_ = Js({u'message':Js(u'use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/')}) + PyJs_Object_278_ = Js({u'message':Js(u'Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option.')}) + PyJs_Object_279_ = Js({u'message':Js(u'Not required anymore as this is enabled by default')}) + PyJs_Object_280_ = Js({u'message':Js(u'Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules')}) + PyJs_Object_281_ = Js({u'message':Js(u'Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/')}) + PyJs_Object_282_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_283_ = Js({u'message':Js(u'Use the `sourceMapTarget` option')}) + PyJs_Object_284_ = Js({u'message':Js(u'Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets')}) + PyJs_Object_285_ = Js({u'message':Js(u'Put the specific transforms you want in the `plugins` option')}) + PyJs_Object_270_ = Js({u'auxiliaryComment':PyJs_Object_271_,u'blacklist':PyJs_Object_272_,u'breakConfig':PyJs_Object_273_,u'experimental':PyJs_Object_274_,u'externalHelpers':PyJs_Object_275_,u'extra':PyJs_Object_276_,u'jsxPragma':PyJs_Object_277_,u'loose':PyJs_Object_278_,u'metadataUsedHelpers':PyJs_Object_279_,u'modules':PyJs_Object_280_,u'nonStandard':PyJs_Object_281_,u'optional':PyJs_Object_282_,u'sourceMapName':PyJs_Object_283_,u'stage':PyJs_Object_284_,u'whitelist':PyJs_Object_285_}) + var.get(u'module').put(u'exports', PyJs_Object_270_) +PyJs_anonymous_269_._set_name(u'anonymous') +PyJs_Object_286_ = Js({}) +@Js +def PyJs_anonymous_287_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_plugin', u'exports', u'_plugin2', u'require', u'module', u'_sortBy2', u'_interopRequireDefault', u'_sortBy']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_288_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_288_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_plugin', var.get(u'require')(Js(u'../plugin'))) + var.put(u'_plugin2', var.get(u'_interopRequireDefault')(var.get(u'_plugin'))) + var.put(u'_sortBy', var.get(u'require')(Js(u'lodash/sortBy'))) + var.put(u'_sortBy2', var.get(u'_interopRequireDefault')(var.get(u'_sortBy'))) + pass + @Js + def PyJs_exit_292_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'exit':PyJs_exit_292_, u'arguments':arguments}, var) + var.registers([u'node', u'hasChange', u'_ref', u'bodyNode', u'i']) + var.put(u'node', var.get(u'_ref').get(u'node')) + var.put(u'hasChange', Js(False)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_316_)) + var.get(u'opts').put(u'code', Js(False)) + var.get(u'opts').put(u'mode', Js(u'lint')) + return var.get(u"this").callprop(u'transform', var.get(u'code'), var.get(u'opts')) + PyJs_lint_315_._set_name(u'lint') + var.get(u'Pipeline').get(u'prototype').put(u'lint', PyJs_lint_315_) + @Js + def PyJs_pretransform_317_(code, opts, this, arguments, var=var): + var = Scope({u'this':this, u'pretransform':PyJs_pretransform_317_, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'code', u'opts', u'file']) + var.put(u'file', var.get(u'_file2').get(u'default').create(var.get(u'opts'), var.get(u"this"))) + @Js + def PyJs_anonymous_318_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'file').callprop(u'addCode', var.get(u'code')) + var.get(u'file').callprop(u'parseCode', var.get(u'code')) + return var.get(u'file') + PyJs_anonymous_318_._set_name(u'anonymous') + return var.get(u'file').callprop(u'wrap', var.get(u'code'), PyJs_anonymous_318_) + PyJs_pretransform_317_._set_name(u'pretransform') + var.get(u'Pipeline').get(u'prototype').put(u'pretransform', PyJs_pretransform_317_) + @Js + def PyJs_transform_319_(code, opts, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'transform':PyJs_transform_319_}, var) + var.registers([u'code', u'opts', u'file']) + var.put(u'file', var.get(u'_file2').get(u'default').create(var.get(u'opts'), var.get(u"this"))) + @Js + def PyJs_anonymous_320_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'file').callprop(u'addCode', var.get(u'code')) + var.get(u'file').callprop(u'parseCode', var.get(u'code')) + return var.get(u'file').callprop(u'transform') + PyJs_anonymous_320_._set_name(u'anonymous') + return var.get(u'file').callprop(u'wrap', var.get(u'code'), PyJs_anonymous_320_) + PyJs_transform_319_._set_name(u'transform') + var.get(u'Pipeline').get(u'prototype').put(u'transform', PyJs_transform_319_) + @Js + def PyJs_analyse_321_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'analyse':PyJs_analyse_321_, u'arguments':arguments}, var) + var.registers([u'visitor', u'code', u'opts']) + PyJs_Object_322_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_322_)) + var.put(u'visitor', var.get(u'arguments').get(u'2')) + var.get(u'opts').put(u'code', Js(False)) + if var.get(u'visitor'): + var.get(u'opts').put(u'plugins', (var.get(u'opts').get(u'plugins') or Js([]))) + PyJs_Object_323_ = Js({u'visitor':var.get(u'visitor')}) + var.get(u'opts').get(u'plugins').callprop(u'push', var.get(u'_plugin2').get(u'default').create(PyJs_Object_323_)) + return var.get(u"this").callprop(u'transform', var.get(u'code'), var.get(u'opts')).get(u'metadata') + PyJs_analyse_321_._set_name(u'analyse') + var.get(u'Pipeline').get(u'prototype').put(u'analyse', PyJs_analyse_321_) + @Js + def PyJs_transformFromAst_324_(ast, code, opts, this, arguments, var=var): + var = Scope({u'code':code, u'ast':ast, u'this':this, u'transformFromAst':PyJs_transformFromAst_324_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'code', u'opts', u'file', u'ast']) + var.put(u'ast', PyJsComma(Js(0.0),var.get(u'_normalizeAst2').get(u'default'))(var.get(u'ast'))) + var.put(u'file', var.get(u'_file2').get(u'default').create(var.get(u'opts'), var.get(u"this"))) + @Js + def PyJs_anonymous_325_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'file').callprop(u'addCode', var.get(u'code')) + var.get(u'file').callprop(u'addAst', var.get(u'ast')) + return var.get(u'file').callprop(u'transform') + PyJs_anonymous_325_._set_name(u'anonymous') + return var.get(u'file').callprop(u'wrap', var.get(u'code'), PyJs_anonymous_325_) + PyJs_transformFromAst_324_._set_name(u'transformFromAst') + var.get(u'Pipeline').get(u'prototype').put(u'transformFromAst', PyJs_transformFromAst_324_) + return var.get(u'Pipeline') + PyJs_anonymous_314_._set_name(u'anonymous') + var.put(u'Pipeline', PyJs_anonymous_314_()) + var.get(u'exports').put(u'default', var.get(u'Pipeline')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_312_._set_name(u'anonymous') +PyJs_Object_326_ = Js({u'../helpers/normalize-ast':Js(8.0),u'./file':Js(12.0),u'./plugin':Js(25.0),u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_327_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_store', u'_inherits3', u'_inherits2', u'require', u'_file6', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'module', u'_file5', u'_store2', u'PluginPass', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_328_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_328_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_store', var.get(u'require')(Js(u'../store'))) + var.put(u'_store2', var.get(u'_interopRequireDefault')(var.get(u'_store'))) + var.put(u'_file5', var.get(u'require')(Js(u'./file'))) + var.put(u'_file6', var.get(u'_interopRequireDefault')(var.get(u'_file5'))) + pass + @Js + def PyJs_anonymous_329_(_Store, this, arguments, var=var): + var = Scope({u'this':this, u'_Store':_Store, u'arguments':arguments}, var) + var.registers([u'PluginPass', u'_Store']) + @Js + def PyJsHoisted_PluginPass_(file, plugin, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'file':file, u'plugin':plugin}, var) + var.registers([u'file', u'options', u'_this', u'plugin']) + PyJs_Object_330_ = Js({}) + var.put(u'options', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_330_)) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'PluginPass')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Store').callprop(u'call', var.get(u"this")))) + var.get(u'_this').put(u'plugin', var.get(u'plugin')) + var.get(u'_this').put(u'key', var.get(u'plugin').get(u'key')) + var.get(u'_this').put(u'file', var.get(u'file')) + var.get(u'_this').put(u'opts', var.get(u'options')) + return var.get(u'_this') + PyJsHoisted_PluginPass_.func_name = u'PluginPass' + var.put(u'PluginPass', PyJsHoisted_PluginPass_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'PluginPass'), var.get(u'_Store')) + pass + @Js + def PyJs_addHelper_331_(this, arguments, var=var): + var = Scope({u'this':this, u'addHelper':PyJs_addHelper_331_, u'arguments':arguments}, var) + var.registers([u'_file']) + pass + return var.put(u'_file', var.get(u"this").get(u'file')).get(u'addHelper').callprop(u'apply', var.get(u'_file'), var.get(u'arguments')) + PyJs_addHelper_331_._set_name(u'addHelper') + var.get(u'PluginPass').get(u'prototype').put(u'addHelper', PyJs_addHelper_331_) + @Js + def PyJs_addImport_332_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'addImport':PyJs_addImport_332_}, var) + var.registers([u'_file2']) + pass + return var.put(u'_file2', var.get(u"this").get(u'file')).get(u'addImport').callprop(u'apply', var.get(u'_file2'), var.get(u'arguments')) + PyJs_addImport_332_._set_name(u'addImport') + var.get(u'PluginPass').get(u'prototype').put(u'addImport', PyJs_addImport_332_) + @Js + def PyJs_getModuleName_333_(this, arguments, var=var): + var = Scope({u'this':this, u'getModuleName':PyJs_getModuleName_333_, u'arguments':arguments}, var) + var.registers([u'_file3']) + pass + return var.put(u'_file3', var.get(u"this").get(u'file')).get(u'getModuleName').callprop(u'apply', var.get(u'_file3'), var.get(u'arguments')) + PyJs_getModuleName_333_._set_name(u'getModuleName') + var.get(u'PluginPass').get(u'prototype').put(u'getModuleName', PyJs_getModuleName_333_) + @Js + def PyJs_buildCodeFrameError_334_(this, arguments, var=var): + var = Scope({u'this':this, u'buildCodeFrameError':PyJs_buildCodeFrameError_334_, u'arguments':arguments}, var) + var.registers([u'_file4']) + pass + return var.put(u'_file4', var.get(u"this").get(u'file')).get(u'buildCodeFrameError').callprop(u'apply', var.get(u'_file4'), var.get(u'arguments')) + PyJs_buildCodeFrameError_334_._set_name(u'buildCodeFrameError') + var.get(u'PluginPass').get(u'prototype').put(u'buildCodeFrameError', PyJs_buildCodeFrameError_334_) + return var.get(u'PluginPass') + PyJs_anonymous_329_._set_name(u'anonymous') + var.put(u'PluginPass', PyJs_anonymous_329_(var.get(u'_store2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'PluginPass')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_327_._set_name(u'anonymous') +PyJs_Object_335_ = Js({u'../store':Js(10.0),u'./file':Js(12.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0)}) +@Js +def PyJs_anonymous_336_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_store', u'module', u'_clone', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_babelTraverse', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'_store2', u'_optionManager2', u'_classCallCheck3', u'_classCallCheck2', u'_optionManager', u'exports', u'_babelTraverse2', u'_interopRequireWildcard', u'Plugin', u'_inherits3', u'_inherits2', u'_assign', u'_assign2', u'require', u'messages', u'GLOBAL_VISITOR_PROPS', u'_clone2', u'_babelMessages']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_338_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_338_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_337_ = Js({}) + var.put(u'newObj', PyJs_Object_337_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + var.put(u'_optionManager', var.get(u'require')(Js(u'./file/options/option-manager'))) + var.put(u'_optionManager2', var.get(u'_interopRequireDefault')(var.get(u'_optionManager'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_store', var.get(u'require')(Js(u'../store'))) + var.put(u'_store2', var.get(u'_interopRequireDefault')(var.get(u'_store'))) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_babelTraverse2', var.get(u'_interopRequireDefault')(var.get(u'_babelTraverse'))) + var.put(u'_assign', var.get(u'require')(Js(u'lodash/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + pass + pass + var.put(u'GLOBAL_VISITOR_PROPS', Js([Js(u'enter'), Js(u'exit')])) + @Js + def PyJs_anonymous_339_(_Store, this, arguments, var=var): + var = Scope({u'this':this, u'_Store':_Store, u'arguments':arguments}, var) + var.registers([u'_Store', u'Plugin']) + @Js + def PyJsHoisted_Plugin_(plugin, key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'plugin':plugin}, var) + var.registers([u'key', u'_this', u'plugin']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Plugin')) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Store').callprop(u'call', var.get(u"this")))) + var.get(u'_this').put(u'initialized', Js(False)) + PyJs_Object_340_ = Js({}) + var.get(u'_this').put(u'raw', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_340_, var.get(u'plugin'))) + var.get(u'_this').put(u'key', (var.get(u'_this').callprop(u'take', Js(u'name')) or var.get(u'key'))) + var.get(u'_this').put(u'manipulateOptions', var.get(u'_this').callprop(u'take', Js(u'manipulateOptions'))) + var.get(u'_this').put(u'post', var.get(u'_this').callprop(u'take', Js(u'post'))) + var.get(u'_this').put(u'pre', var.get(u'_this').callprop(u'take', Js(u'pre'))) + PyJs_Object_341_ = Js({}) + var.get(u'_this').put(u'visitor', var.get(u'_this').callprop(u'normaliseVisitor', (PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'_this').callprop(u'take', Js(u'visitor'))) or PyJs_Object_341_))) + return var.get(u'_this') + PyJsHoisted_Plugin_.func_name = u'Plugin' + var.put(u'Plugin', PyJsHoisted_Plugin_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'Plugin'), var.get(u'_Store')) + pass + @Js + def PyJs_take_342_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'take':PyJs_take_342_}, var) + var.registers([u'key', u'val']) + var.put(u'val', var.get(u"this").get(u'raw').get(var.get(u'key'))) + var.get(u"this").get(u'raw').delete(var.get(u'key')) + return var.get(u'val') + PyJs_take_342_._set_name(u'take') + var.get(u'Plugin').get(u'prototype').put(u'take', PyJs_take_342_) + @Js + def PyJs_chain_343_(target, key, this, arguments, var=var): + var = Scope({u'this':this, u'chain':PyJs_chain_343_, u'target':target, u'key':key, u'arguments':arguments}, var) + var.registers([u'fns', u'target', u'key']) + if var.get(u'target').get(var.get(u'key')).neg(): + return var.get(u"this").get(var.get(u'key')) + if var.get(u"this").get(var.get(u'key')).neg(): + return var.get(u'target').get(var.get(u'key')) + var.put(u'fns', Js([var.get(u'target').get(var.get(u'key')), var.get(u"this").get(var.get(u'key'))])) + @Js + def PyJs_anonymous_344_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'val', u'_len', u'args', u'ret', u'_key', u'_i', u'_ref', u'fn']) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'fn', var.get(u'_ref')) + if var.get(u'fn'): + var.put(u'ret', var.get(u'fn').callprop(u'apply', var.get(u"this"), var.get(u'args'))) + if (var.get(u'ret')!=var.get(u"null")): + var.put(u'val', var.get(u'ret')) + + return var.get(u'val') + PyJs_anonymous_344_._set_name(u'anonymous') + return PyJs_anonymous_344_ + PyJs_chain_343_._set_name(u'chain') + var.get(u'Plugin').get(u'prototype').put(u'chain', PyJs_chain_343_) + @Js + def PyJs_maybeInherit_345_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments, u'maybeInherit':PyJs_maybeInherit_345_}, var) + var.registers([u'inherits', u'loc']) + var.put(u'inherits', var.get(u"this").callprop(u'take', Js(u'inherits'))) + if var.get(u'inherits').neg(): + return var.get('undefined') + var.put(u'inherits', var.get(u'_optionManager2').get(u'default').callprop(u'normalisePlugin', var.get(u'inherits'), var.get(u'loc'), Js(u'inherits'))) + var.get(u"this").put(u'manipulateOptions', var.get(u"this").callprop(u'chain', var.get(u'inherits'), Js(u'manipulateOptions'))) + var.get(u"this").put(u'post', var.get(u"this").callprop(u'chain', var.get(u'inherits'), Js(u'post'))) + var.get(u"this").put(u'pre', var.get(u"this").callprop(u'chain', var.get(u'inherits'), Js(u'pre'))) + var.get(u"this").put(u'visitor', var.get(u'_babelTraverse2').get(u'default').get(u'visitors').callprop(u'merge', Js([var.get(u'inherits').get(u'visitor'), var.get(u"this").get(u'visitor')]))) + PyJs_maybeInherit_345_._set_name(u'maybeInherit') + var.get(u'Plugin').get(u'prototype').put(u'maybeInherit', PyJs_maybeInherit_345_) + @Js + def PyJs_init_346_(loc, i, this, arguments, var=var): + var = Scope({u'i':i, u'loc':loc, u'init':PyJs_init_346_, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'loc', u'key']) + if var.get(u"this").get(u'initialized'): + return var.get('undefined') + var.get(u"this").put(u'initialized', var.get(u'true')) + var.get(u"this").callprop(u'maybeInherit', var.get(u'loc')) + for PyJsTemp in var.get(u"this").get(u'raw'): + var.put(u'key', PyJsTemp) + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'pluginInvalidProperty'), var.get(u'loc'), var.get(u'i'), var.get(u'key')))) + raise PyJsTempException + PyJs_init_346_._set_name(u'init') + var.get(u'Plugin').get(u'prototype').put(u'init', PyJs_init_346_) + @Js + def PyJs_normaliseVisitor_347_(visitor, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'normaliseVisitor':PyJs_normaliseVisitor_347_, u'arguments':arguments}, var) + var.registers([u'_isArray2', u'visitor', u'_i2', u'_ref2', u'key', u'_iterator2']) + #for JS loop + var.put(u'_iterator2', var.get(u'GLOBAL_VISITOR_PROPS')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'key', var.get(u'_ref2')) + if var.get(u'visitor').get(var.get(u'key')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Plugins aren't allowed to specify catch-all enter/exit handlers. Please target individual nodes."))) + raise PyJsTempException + + var.get(u'_babelTraverse2').get(u'default').callprop(u'explode', var.get(u'visitor')) + return var.get(u'visitor') + PyJs_normaliseVisitor_347_._set_name(u'normaliseVisitor') + var.get(u'Plugin').get(u'prototype').put(u'normaliseVisitor', PyJs_normaliseVisitor_347_) + return var.get(u'Plugin') + PyJs_anonymous_339_._set_name(u'anonymous') + var.put(u'Plugin', PyJs_anonymous_339_(var.get(u'_store2').get(u'default'))) + var.get(u'exports').put(u'default', var.get(u'Plugin')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_336_._set_name(u'anonymous') +PyJs_Object_348_ = Js({u'../store':Js(10.0),u'./file/options/option-manager':Js(18.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'babel-traverse':Js(225.0),u'lodash/assign':Js(435.0),u'lodash/clone':Js(438.0)}) +@Js +def PyJs_anonymous_349_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_shouldIgnore', u'_startsWith', u'module', u'_isString2', u'_slash2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_isBoolean', u'_isRegExp2', u'shouldIgnore', u'_slash', u'booleanify', u'_isRegExp', u'_minimatch2', u'exports', u'_escapeRegExp2', u'_minimatch', u'_includes2', u'_util', u'canCompile', u'_path2', u'arrayify', u'_escapeRegExp', u'_isString', u'_startsWith2', u'list', u'regexify', u'_includes', u'require', u'_isBoolean2', u'_path']) + @Js + def PyJsHoisted__shouldIgnore_(pattern, filename, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'pattern', u'filename']) + if PyJsStrictEq(var.get(u'pattern',throw=False).typeof(),Js(u'function')): + return var.get(u'pattern')(var.get(u'filename')) + else: + return var.get(u'pattern').callprop(u'test', var.get(u'filename')) + PyJsHoisted__shouldIgnore_.func_name = u'_shouldIgnore' + var.put(u'_shouldIgnore', PyJsHoisted__shouldIgnore_) + @Js + def PyJsHoisted_shouldIgnore_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'_isArray', u'_pattern', u'_iterator', u'_isArray2', u'pattern', u'_i2', u'_ref2', u'ignore', u'only', u'_i', u'_ref', u'filename', u'_iterator2']) + var.put(u'ignore', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js([]))) + var.put(u'only', var.get(u'arguments').get(u'2')) + var.put(u'filename', var.get(u'filename').callprop(u'replace', JsRegExp(u'/\\\\/g'), Js(u'/'))) + if var.get(u'only'): + #for JS loop + var.put(u'_iterator', var.get(u'only')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'pattern', var.get(u'_ref')) + if var.get(u'_shouldIgnore')(var.get(u'pattern'), var.get(u'filename')): + return Js(False) + + return var.get(u'true') + else: + if var.get(u'ignore').get(u'length'): + #for JS loop + var.put(u'_iterator2', var.get(u'ignore')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_pattern', var.get(u'_ref2')) + if var.get(u'_shouldIgnore')(var.get(u'_pattern'), var.get(u'filename')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_shouldIgnore_.func_name = u'shouldIgnore' + var.put(u'shouldIgnore', PyJsHoisted_shouldIgnore_) + @Js + def PyJsHoisted_list_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if var.get(u'val').neg(): + return Js([]) + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + return var.get(u'val') + else: + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + return var.get(u'val').callprop(u'split', Js(u',')) + else: + return Js([var.get(u'val')]) + PyJsHoisted_list_.func_name = u'list' + var.put(u'list', PyJsHoisted_list_) + @Js + def PyJsHoisted_regexify_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'regex', u'val']) + if var.get(u'val').neg(): + return var.get(u'RegExp').create(JsRegExp(u'/.^/')) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + var.put(u'val', var.get(u'RegExp').create(var.get(u'val').callprop(u'map', var.get(u'_escapeRegExp2').get(u'default')).callprop(u'join', Js(u'|')), Js(u'i'))) + if PyJsStrictEq(var.get(u'val',throw=False).typeof(),Js(u'string')): + var.put(u'val', PyJsComma(Js(0.0),var.get(u'_slash2').get(u'default'))(var.get(u'val'))) + if (PyJsComma(Js(0.0),var.get(u'_startsWith2').get(u'default'))(var.get(u'val'), Js(u'./')) or PyJsComma(Js(0.0),var.get(u'_startsWith2').get(u'default'))(var.get(u'val'), Js(u'*/'))): + var.put(u'val', var.get(u'val').callprop(u'slice', Js(2.0))) + if PyJsComma(Js(0.0),var.get(u'_startsWith2').get(u'default'))(var.get(u'val'), Js(u'**/')): + var.put(u'val', var.get(u'val').callprop(u'slice', Js(3.0))) + PyJs_Object_355_ = Js({u'nocase':var.get(u'true')}) + var.put(u'regex', var.get(u'_minimatch2').get(u'default').callprop(u'makeRe', var.get(u'val'), PyJs_Object_355_)) + return var.get(u'RegExp').create(var.get(u'regex').get(u'source').callprop(u'slice', Js(1.0), (-Js(1.0))), Js(u'i')) + if PyJsComma(Js(0.0),var.get(u'_isRegExp2').get(u'default'))(var.get(u'val')): + return var.get(u'val') + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'illegal type for regexify'))) + raise PyJsTempException + PyJsHoisted_regexify_.func_name = u'regexify' + var.put(u'regexify', PyJsHoisted_regexify_) + @Js + def PyJsHoisted_booleanify_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if (PyJsStrictEq(var.get(u'val'),Js(u'true')) or (var.get(u'val')==Js(1.0))): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'val'),Js(u'false')) or (var.get(u'val')==Js(0.0))) or var.get(u'val').neg()): + return Js(False) + return var.get(u'val') + PyJsHoisted_booleanify_.func_name = u'booleanify' + var.put(u'booleanify', PyJsHoisted_booleanify_) + @Js + def PyJsHoisted_canCompile_(filename, altExts, this, arguments, var=var): + var = Scope({u'this':this, u'altExts':altExts, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'ext', u'exts', u'altExts', u'filename']) + var.put(u'exts', (var.get(u'altExts') or var.get(u'canCompile').get(u'EXTENSIONS'))) + var.put(u'ext', var.get(u'_path2').get(u'default').callprop(u'extname', var.get(u'filename'))) + return PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'exts'), var.get(u'ext')) + PyJsHoisted_canCompile_.func_name = u'canCompile' + var.put(u'canCompile', PyJsHoisted_canCompile_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_354_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_354_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_arrayify_(val, mapFn, this, arguments, var=var): + var = Scope({u'this':this, u'mapFn':mapFn, u'arguments':arguments, u'val':val}, var) + var.registers([u'mapFn', u'val']) + if var.get(u'val').neg(): + return Js([]) + if PyJsComma(Js(0.0),var.get(u'_isBoolean2').get(u'default'))(var.get(u'val')): + return var.get(u'arrayify')(Js([var.get(u'val')]), var.get(u'mapFn')) + if PyJsComma(Js(0.0),var.get(u'_isString2').get(u'default'))(var.get(u'val')): + return var.get(u'arrayify')(var.get(u'list')(var.get(u'val')), var.get(u'mapFn')) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + if var.get(u'mapFn'): + var.put(u'val', var.get(u'val').callprop(u'map', var.get(u'mapFn'))) + return var.get(u'val') + return Js([var.get(u'val')]) + PyJsHoisted_arrayify_.func_name = u'arrayify' + var.put(u'arrayify', PyJsHoisted_arrayify_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'inspect', var.get(u'exports').put(u'inherits', var.get(u'undefined'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_util', var.get(u'require')(Js(u'util'))) + @Js + def PyJs_get_351_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_351_}, var) + var.registers([]) + return var.get(u'_util').get(u'inherits') + PyJs_get_351_._set_name(u'get') + PyJs_Object_350_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_351_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'inherits'), PyJs_Object_350_) + @Js + def PyJs_get_353_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_353_}, var) + var.registers([]) + return var.get(u'_util').get(u'inspect') + PyJs_get_353_._set_name(u'get') + PyJs_Object_352_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_353_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'inspect'), PyJs_Object_352_) + var.get(u'exports').put(u'canCompile', var.get(u'canCompile')) + var.get(u'exports').put(u'list', var.get(u'list')) + var.get(u'exports').put(u'regexify', var.get(u'regexify')) + var.get(u'exports').put(u'arrayify', var.get(u'arrayify')) + var.get(u'exports').put(u'booleanify', var.get(u'booleanify')) + var.get(u'exports').put(u'shouldIgnore', var.get(u'shouldIgnore')) + var.put(u'_escapeRegExp', var.get(u'require')(Js(u'lodash/escapeRegExp'))) + var.put(u'_escapeRegExp2', var.get(u'_interopRequireDefault')(var.get(u'_escapeRegExp'))) + var.put(u'_startsWith', var.get(u'require')(Js(u'lodash/startsWith'))) + var.put(u'_startsWith2', var.get(u'_interopRequireDefault')(var.get(u'_startsWith'))) + var.put(u'_isBoolean', var.get(u'require')(Js(u'lodash/isBoolean'))) + var.put(u'_isBoolean2', var.get(u'_interopRequireDefault')(var.get(u'_isBoolean'))) + var.put(u'_minimatch', var.get(u'require')(Js(u'minimatch'))) + var.put(u'_minimatch2', var.get(u'_interopRequireDefault')(var.get(u'_minimatch'))) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_isString', var.get(u'require')(Js(u'lodash/isString'))) + var.put(u'_isString2', var.get(u'_interopRequireDefault')(var.get(u'_isString'))) + var.put(u'_isRegExp', var.get(u'require')(Js(u'lodash/isRegExp'))) + var.put(u'_isRegExp2', var.get(u'_interopRequireDefault')(var.get(u'_isRegExp'))) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_path2', var.get(u'_interopRequireDefault')(var.get(u'_path'))) + var.put(u'_slash', var.get(u'require')(Js(u'slash'))) + var.put(u'_slash2', var.get(u'_interopRequireDefault')(var.get(u'_slash'))) + pass + pass + var.get(u'canCompile').put(u'EXTENSIONS', Js([Js(u'.js'), Js(u'.jsx'), Js(u'.es6'), Js(u'.es')])) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_349_._set_name(u'anonymous') +PyJs_Object_356_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'lodash/escapeRegExp':Js(445.0),u'lodash/includes':Js(456.0),u'lodash/isBoolean':Js(461.0),u'lodash/isRegExp':Js(470.0),u'lodash/isString':Js(471.0),u'lodash/startsWith':Js(486.0),u'minimatch':Js(27.0),u'path':Js(530.0),u'slash':Js(508.0),u'util':Js(534.0)}) +@Js +def PyJs_anonymous_357_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Minimatch', u'qmark', u'module', u'parse', u'regExpEscape', u'path', u'minimatch', u'reSpecials', u'make', u'twoStarNoDot', u'match', u'exports', u'star', u'plTypes', u'charSet', u'parseNegate', u'twoStarDot', u'expand', u'SUBPARSE', u'globUnescape', u'braceExpand', u'makeRe', u'GLOBSTAR', u'slashSplit', u'filter', u'ext', u'require']) + @Js + def PyJsHoisted_minimatch_(p, pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'options':options, u'arguments':arguments, u'pattern':pattern}, var) + var.registers([u'p', u'options', u'pattern']) + if PyJsStrictNeq(var.get(u'pattern',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'glob pattern string required'))) + raise PyJsTempException + if var.get(u'options').neg(): + PyJs_Object_379_ = Js({}) + var.put(u'options', PyJs_Object_379_) + if (var.get(u'options').get(u'nocomment').neg() and PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', Js(0.0)),Js(u'#'))): + return Js(False) + if PyJsStrictEq(var.get(u'pattern').callprop(u'trim'),Js(u'')): + return PyJsStrictEq(var.get(u'p'),Js(u'')) + return var.get(u'Minimatch').create(var.get(u'pattern'), var.get(u'options')).callprop(u'match', var.get(u'p')) + PyJsHoisted_minimatch_.func_name = u'minimatch' + var.put(u'minimatch', PyJsHoisted_minimatch_) + @Js + def PyJsHoisted_globUnescape_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').callprop(u'replace', JsRegExp(u'/\\\\(.)/g'), Js(u'$1')) + PyJsHoisted_globUnescape_.func_name = u'globUnescape' + var.put(u'globUnescape', PyJsHoisted_globUnescape_) + @Js + def PyJsHoisted_makeRe_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'twoStar', u'set', u'flags', u'options', u're']) + if (var.get(u"this").get(u'regexp') or PyJsStrictEq(var.get(u"this").get(u'regexp'),Js(False))): + return var.get(u"this").get(u'regexp') + var.put(u'set', var.get(u"this").get(u'set')) + if var.get(u'set').get(u'length').neg(): + var.get(u"this").put(u'regexp', Js(False)) + return var.get(u"this").get(u'regexp') + var.put(u'options', var.get(u"this").get(u'options')) + var.put(u'twoStar', (var.get(u'star') if var.get(u'options').get(u'noglobstar') else (var.get(u'twoStarDot') if var.get(u'options').get(u'dot') else var.get(u'twoStarNoDot')))) + var.put(u'flags', (Js(u'i') if var.get(u'options').get(u'nocase') else Js(u''))) + @Js + def PyJs_anonymous_392_(pattern, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments}, var) + var.registers([u'pattern']) + @Js + def PyJs_anonymous_393_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return (var.get(u'twoStar') if PyJsStrictEq(var.get(u'p'),var.get(u'GLOBSTAR')) else (var.get(u'regExpEscape')(var.get(u'p')) if PyJsStrictEq(var.get(u'p',throw=False).typeof(),Js(u'string')) else var.get(u'p').get(u'_src'))) + PyJs_anonymous_393_._set_name(u'anonymous') + return var.get(u'pattern').callprop(u'map', PyJs_anonymous_393_).callprop(u'join', Js(u'\\/')) + PyJs_anonymous_392_._set_name(u'anonymous') + var.put(u're', var.get(u'set').callprop(u'map', PyJs_anonymous_392_).callprop(u'join', Js(u'|'))) + var.put(u're', ((Js(u'^(?:')+var.get(u're'))+Js(u')$'))) + if var.get(u"this").get(u'negate'): + var.put(u're', ((Js(u'^(?!')+var.get(u're'))+Js(u').*$'))) + try: + var.get(u"this").put(u'regexp', var.get(u'RegExp').create(var.get(u're'), var.get(u'flags'))) + except PyJsException as PyJsTempException: + PyJsHolder_6578_58961032 = var.own.get(u'ex') + var.force_own_put(u'ex', PyExceptionToJs(PyJsTempException)) + try: + var.get(u"this").put(u'regexp', Js(False)) + finally: + if PyJsHolder_6578_58961032 is not None: + var.own[u'ex'] = PyJsHolder_6578_58961032 + else: + del var.own[u'ex'] + del PyJsHolder_6578_58961032 + return var.get(u"this").get(u'regexp') + PyJsHoisted_makeRe_.func_name = u'makeRe' + var.put(u'makeRe', PyJsHoisted_makeRe_) + @Js + def PyJsHoisted_regExpEscape_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').callprop(u'replace', JsRegExp(u'/[-[\\]{}()*+?.,\\\\^$|#\\s]/g'), Js(u'\\$&')) + PyJsHoisted_regExpEscape_.func_name = u'regExpEscape' + var.put(u'regExpEscape', PyJsHoisted_regExpEscape_) + @Js + def PyJsHoisted_Minimatch_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + if var.get(u"this").instanceof(var.get(u'Minimatch')).neg(): + return var.get(u'Minimatch').create(var.get(u'pattern'), var.get(u'options')) + if PyJsStrictNeq(var.get(u'pattern',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'glob pattern string required'))) + raise PyJsTempException + if var.get(u'options').neg(): + PyJs_Object_380_ = Js({}) + var.put(u'options', PyJs_Object_380_) + var.put(u'pattern', var.get(u'pattern').callprop(u'trim')) + if PyJsStrictNeq(var.get(u'path').get(u'sep'),Js(u'/')): + var.put(u'pattern', var.get(u'pattern').callprop(u'split', var.get(u'path').get(u'sep')).callprop(u'join', Js(u'/'))) + var.get(u"this").put(u'options', var.get(u'options')) + var.get(u"this").put(u'set', Js([])) + var.get(u"this").put(u'pattern', var.get(u'pattern')) + var.get(u"this").put(u'regexp', var.get(u"null")) + var.get(u"this").put(u'negate', Js(False)) + var.get(u"this").put(u'comment', Js(False)) + var.get(u"this").put(u'empty', Js(False)) + var.get(u"this").callprop(u'make') + PyJsHoisted_Minimatch_.func_name = u'Minimatch' + var.put(u'Minimatch', PyJsHoisted_Minimatch_) + @Js + def PyJsHoisted_make_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'pattern', u'set', u'options']) + if var.get(u"this").get(u'_made'): + return var.get('undefined') + var.put(u'pattern', var.get(u"this").get(u'pattern')) + var.put(u'options', var.get(u"this").get(u'options')) + if (var.get(u'options').get(u'nocomment').neg() and PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', Js(0.0)),Js(u'#'))): + var.get(u"this").put(u'comment', var.get(u'true')) + return var.get('undefined') + if var.get(u'pattern').neg(): + var.get(u"this").put(u'empty', var.get(u'true')) + return var.get('undefined') + var.get(u"this").callprop(u'parseNegate') + var.put(u'set', var.get(u"this").put(u'globSet', var.get(u"this").callprop(u'braceExpand'))) + if var.get(u'options').get(u'debug'): + var.get(u"this").put(u'debug', var.get(u'console').get(u'error')) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + @Js + def PyJs_anonymous_382_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return var.get(u's').callprop(u'split', var.get(u'slashSplit')) + PyJs_anonymous_382_._set_name(u'anonymous') + var.put(u'set', var.get(u"this").put(u'globParts', var.get(u'set').callprop(u'map', PyJs_anonymous_382_))) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + @Js + def PyJs_anonymous_383_(s, si, set, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'set':set, u'si':si, u'arguments':arguments}, var) + var.registers([u's', u'set', u'si']) + return var.get(u's').callprop(u'map', var.get(u"this").get(u'parse'), var.get(u"this")) + PyJs_anonymous_383_._set_name(u'anonymous') + var.put(u'set', var.get(u'set').callprop(u'map', PyJs_anonymous_383_, var.get(u"this"))) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + @Js + def PyJs_anonymous_384_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + return PyJsStrictEq(var.get(u's').callprop(u'indexOf', Js(False)),(-Js(1.0))) + PyJs_anonymous_384_._set_name(u'anonymous') + var.put(u'set', var.get(u'set').callprop(u'filter', PyJs_anonymous_384_)) + var.get(u"this").callprop(u'debug', var.get(u"this").get(u'pattern'), var.get(u'set')) + var.get(u"this").put(u'set', var.get(u'set')) + PyJsHoisted_make_.func_name = u'make' + var.put(u'make', PyJsHoisted_make_) + @Js + def PyJsHoisted_charSet_(s, this, arguments, var=var): + var = Scope({u'this':this, u's':s, u'arguments':arguments}, var) + var.registers([u's']) + @Js + def PyJs_anonymous_366_(set, c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'set':set, u'arguments':arguments}, var) + var.registers([u'c', u'set']) + var.get(u'set').put(var.get(u'c'), var.get(u'true')) + return var.get(u'set') + PyJs_anonymous_366_._set_name(u'anonymous') + PyJs_Object_367_ = Js({}) + return var.get(u's').callprop(u'split', Js(u'')).callprop(u'reduce', PyJs_anonymous_366_, PyJs_Object_367_) + PyJsHoisted_charSet_.func_name = u'charSet' + var.put(u'charSet', PyJsHoisted_charSet_) + @Js + def PyJsHoisted_filter_(pattern, options, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'options':options, u'arguments':arguments}, var) + var.registers([u'pattern', u'options']) + PyJs_Object_368_ = Js({}) + var.put(u'options', (var.get(u'options') or PyJs_Object_368_)) + @Js + def PyJs_anonymous_369_(p, i, list, this, arguments, var=var): + var = Scope({u'i':i, u'p':p, u'this':this, u'list':list, u'arguments':arguments}, var) + var.registers([u'i', u'p', u'list']) + return var.get(u'minimatch')(var.get(u'p'), var.get(u'pattern'), var.get(u'options')) + PyJs_anonymous_369_._set_name(u'anonymous') + return PyJs_anonymous_369_ + PyJsHoisted_filter_.func_name = u'filter' + var.put(u'filter', PyJsHoisted_filter_) + @Js + def PyJsHoisted_ext_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u't']) + PyJs_Object_370_ = Js({}) + var.put(u'a', (var.get(u'a') or PyJs_Object_370_)) + PyJs_Object_371_ = Js({}) + var.put(u'b', (var.get(u'b') or PyJs_Object_371_)) + PyJs_Object_372_ = Js({}) + var.put(u't', PyJs_Object_372_) + @Js + def PyJs_anonymous_373_(k, this, arguments, var=var): + var = Scope({u'this':this, u'k':k, u'arguments':arguments}, var) + var.registers([u'k']) + var.get(u't').put(var.get(u'k'), var.get(u'b').get(var.get(u'k'))) + PyJs_anonymous_373_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'b')).callprop(u'forEach', PyJs_anonymous_373_) + @Js + def PyJs_anonymous_374_(k, this, arguments, var=var): + var = Scope({u'this':this, u'k':k, u'arguments':arguments}, var) + var.registers([u'k']) + var.get(u't').put(var.get(u'k'), var.get(u'a').get(var.get(u'k'))) + PyJs_anonymous_374_._set_name(u'anonymous') + var.get(u'Object').callprop(u'keys', var.get(u'a')).callprop(u'forEach', PyJs_anonymous_374_) + return var.get(u't') + PyJsHoisted_ext_.func_name = u'ext' + var.put(u'ext', PyJsHoisted_ext_) + @Js + def PyJsHoisted_parseNegate_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'pattern', u'l', u'negateOffset', u'negate', u'options']) + var.put(u'pattern', var.get(u"this").get(u'pattern')) + var.put(u'negate', Js(False)) + var.put(u'options', var.get(u"this").get(u'options')) + var.put(u'negateOffset', Js(0.0)) + if var.get(u'options').get(u'nonegate'): + return var.get('undefined') + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'l', var.get(u'pattern').get(u'length')) + while ((var.get(u'i')(Js(1024.0)*Js(64.0))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'pattern is too long'))) + raise PyJsTempException + var.put(u'options', var.get(u"this").get(u'options')) + if (var.get(u'options').get(u'noglobstar').neg() and PyJsStrictEq(var.get(u'pattern'),Js(u'**'))): + return var.get(u'GLOBSTAR') + if PyJsStrictEq(var.get(u'pattern'),Js(u'')): + return Js(u'') + var.put(u're', Js(u'')) + var.put(u'hasMagic', var.get(u'options').get(u'nocase').neg().neg()) + var.put(u'escaping', Js(False)) + var.put(u'patternListStack', Js([])) + var.put(u'negativeLists', Js([])) + pass + var.put(u'inClass', Js(False)) + var.put(u'reClassStart', (-Js(1.0))) + var.put(u'classStart', (-Js(1.0))) + var.put(u'patternStart', (Js(u'') if PyJsStrictEq(var.get(u'pattern').callprop(u'charAt', Js(0.0)),Js(u'.')) else (Js(u'(?!(?:^|\\/)\\.{1,2}(?:$|\\/))') if var.get(u'options').get(u'dot') else Js(u'(?!\\.)')))) + var.put(u'self', var.get(u"this")) + pass + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'pattern').get(u'length')) + while ((var.get(u'i')(-Js(1.0))): + try: + var.put(u'nl', var.get(u'negativeLists').get(var.get(u'n'))) + var.put(u'nlBefore', var.get(u're').callprop(u'slice', Js(0.0), var.get(u'nl').get(u'reStart'))) + var.put(u'nlFirst', var.get(u're').callprop(u'slice', var.get(u'nl').get(u'reStart'), (var.get(u'nl').get(u'reEnd')-Js(8.0)))) + var.put(u'nlLast', var.get(u're').callprop(u'slice', (var.get(u'nl').get(u'reEnd')-Js(8.0)), var.get(u'nl').get(u'reEnd'))) + var.put(u'nlAfter', var.get(u're').callprop(u'slice', var.get(u'nl').get(u'reEnd'))) + var.put(u'nlLast', var.get(u'nlAfter'), u'+') + var.put(u'openParensBefore', (var.get(u'nlBefore').callprop(u'split', Js(u'(')).get(u'length')-Js(1.0))) + var.put(u'cleanAfter', var.get(u'nlAfter')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0)): + try: + var.put(u'filename', var.get(u'f').get(var.get(u'i'))) + if var.get(u'filename'): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')>> no match, partial?'), var.get(u'file'), var.get(u'fr'), var.get(u'pattern'), var.get(u'pr')) + if PyJsStrictEq(var.get(u'fr'),var.get(u'fl')): + return var.get(u'true') + return Js(False) + pass + if PyJsStrictEq(var.get(u'p',throw=False).typeof(),Js(u'string')): + if var.get(u'options').get(u'nocase'): + var.put(u'hit', PyJsStrictEq(var.get(u'f').callprop(u'toLowerCase'),var.get(u'p').callprop(u'toLowerCase'))) + else: + var.put(u'hit', PyJsStrictEq(var.get(u'f'),var.get(u'p'))) + var.get(u"this").callprop(u'debug', Js(u'string match'), var.get(u'p'), var.get(u'f'), var.get(u'hit')) + else: + var.put(u'hit', var.get(u'f').callprop(u'match', var.get(u'p'))) + var.get(u"this").callprop(u'debug', Js(u'pattern match'), var.get(u'p'), var.get(u'f'), var.get(u'hit')) + if var.get(u'hit').neg(): + return Js(False) + finally: + PyJsComma((var.put(u'fi',Js(var.get(u'fi').to_number())+Js(1))-Js(1)),(var.put(u'pi',Js(var.get(u'pi').to_number())+Js(1))-Js(1))) + if (PyJsStrictEq(var.get(u'fi'),var.get(u'fl')) and PyJsStrictEq(var.get(u'pi'),var.get(u'pl'))): + return var.get(u'true') + else: + if PyJsStrictEq(var.get(u'fi'),var.get(u'fl')): + return var.get(u'partial') + else: + if PyJsStrictEq(var.get(u'pi'),var.get(u'pl')): + var.put(u'emptyFileEnd', (PyJsStrictEq(var.get(u'fi'),(var.get(u'fl')-Js(1.0))) and PyJsStrictEq(var.get(u'file').get(var.get(u'fi')),Js(u'')))) + return var.get(u'emptyFileEnd') + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'wtf?'))) + raise PyJsTempException + PyJs_anonymous_397_._set_name(u'anonymous') + var.get(u'Minimatch').get(u'prototype').put(u'matchOne', PyJs_anonymous_397_) + pass + pass +PyJs_anonymous_357_._set_name(u'anonymous') +PyJs_Object_399_ = Js({u'brace-expansion':Js(264.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_400_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_402_ = Js({u'raw':Js(u'babel-core'),u'scope':var.get(u"null"),u'escapedName':Js(u'babel-core'),u'name':Js(u'babel-core'),u'rawSpec':Js(u''),u'spec':Js(u'latest'),u'type':Js(u'tag')}) + PyJs_Object_403_ = Js({u'host':Js(u'packages-18-east.internal.npmjs.com'),u'tmp':Js(u'tmp/babel-core-6.18.2.tgz_1478035855416_0.08754534856416285')}) + PyJs_Object_404_ = Js({u'name':Js(u'hzoo'),u'email':Js(u'hi@henryzoo.com')}) + PyJs_Object_405_ = Js({u'brace-expansion':Js(u'1.1.5')}) + PyJs_Object_406_ = Js({u'raw':Js(u'babel-core'),u'scope':var.get(u"null"),u'escapedName':Js(u'babel-core'),u'name':Js(u'babel-core'),u'rawSpec':Js(u''),u'spec':Js(u'latest'),u'type':Js(u'tag')}) + PyJs_Object_407_ = Js({u'name':Js(u'Sebastian McKenzie'),u'email':Js(u'sebmck@gmail.com')}) + PyJs_Object_408_ = Js({u'babel-code-frame':Js(u'^6.16.0'),u'babel-generator':Js(u'^6.18.0'),u'babel-helpers':Js(u'^6.16.0'),u'babel-messages':Js(u'^6.8.0'),u'babel-register':Js(u'^6.18.0'),u'babel-runtime':Js(u'^6.9.1'),u'babel-template':Js(u'^6.16.0'),u'babel-traverse':Js(u'^6.18.0'),u'babel-types':Js(u'^6.18.0'),u'babylon':Js(u'^6.11.0'),u'convert-source-map':Js(u'^1.1.0'),u'debug':Js(u'^2.1.1'),u'json5':Js(u'^0.5.0'),u'lodash':Js(u'^4.2.0'),u'minimatch':Js(u'^3.0.2'),u'path-is-absolute':Js(u'^1.0.0'),u'private':Js(u'^0.1.6'),u'slash':Js(u'^1.0.0'),u'source-map':Js(u'^0.5.0')}) + PyJs_Object_409_ = Js({u'babel-helper-fixtures':Js(u'^6.18.2'),u'babel-helper-transform-fixture-test-runner':Js(u'^6.18.2'),u'babel-polyfill':Js(u'^6.16.0')}) + PyJs_Object_410_ = Js({}) + PyJs_Object_411_ = Js({u'shasum':Js(u'd8bb14dd6986fa4f3566a26ceda3964fa0e04e5b'),u'tarball':Js(u'https://registry.npmjs.org/babel-core/-/babel-core-6.18.2.tgz')}) + PyJs_Object_412_ = Js({u'name':Js(u'amasad'),u'email':Js(u'amjad.masad@gmail.com')}) + PyJs_Object_413_ = Js({u'name':Js(u'hzoo'),u'email':Js(u'hi@henryzoo.com')}) + PyJs_Object_414_ = Js({u'name':Js(u'jmm'),u'email':Js(u'npm-public@jessemccarthy.net')}) + PyJs_Object_415_ = Js({u'name':Js(u'loganfsmyth'),u'email':Js(u'loganfsmyth@gmail.com')}) + PyJs_Object_416_ = Js({u'name':Js(u'sebmck'),u'email':Js(u'sebmck@gmail.com')}) + PyJs_Object_417_ = Js({u'name':Js(u'thejameskyle'),u'email':Js(u'me@thejameskyle.com')}) + PyJs_Object_418_ = Js({}) + PyJs_Object_419_ = Js({u'type':Js(u'git'),u'url':Js(u'https://github.com/babel/babel/tree/master/packages/babel-core')}) + PyJs_Object_420_ = Js({u'bench':Js(u'make bench'),u'test':Js(u'make test')}) + PyJs_Object_401_ = Js({u'_args':Js([Js([PyJs_Object_402_, Js(u'/Users/PiotrDabkowski/PycharmProjects/Js2Py/js2py/es6')])]),u'_from':Js(u'babel-core@latest'),u'_id':Js(u'babel-core@6.18.2'),u'_inCache':var.get(u'true'),u'_location':Js(u'/babel-core'),u'_nodeVersion':Js(u'6.8.1'),u'_npmOperationalInternal':PyJs_Object_403_,u'_npmUser':PyJs_Object_404_,u'_npmVersion':Js(u'3.10.9'),u'_phantomChildren':PyJs_Object_405_,u'_requested':PyJs_Object_406_,u'_requiredBy':Js([Js(u'#USER'), Js(u'/babel-cli'), Js(u'/babel-register'), Js(u'/babelify')]),u'_resolved':Js(u'https://registry.npmjs.org/babel-core/-/babel-core-6.18.2.tgz'),u'_shasum':Js(u'd8bb14dd6986fa4f3566a26ceda3964fa0e04e5b'),u'_shrinkwrap':var.get(u"null"),u'_spec':Js(u'babel-core'),u'_where':Js(u'/Users/PiotrDabkowski/PycharmProjects/Js2Py/js2py/es6'),u'author':PyJs_Object_407_,u'dependencies':PyJs_Object_408_,u'description':Js(u'Babel compiler core.'),u'devDependencies':PyJs_Object_409_,u'directories':PyJs_Object_410_,u'dist':PyJs_Object_411_,u'homepage':Js(u'https://babeljs.io/'),u'keywords':Js([Js(u'6to5'), Js(u'babel'), Js(u'classes'), Js(u'const'), Js(u'es6'), Js(u'harmony'), Js(u'let'), Js(u'modules'), Js(u'transpile'), Js(u'transpiler'), Js(u'var')]),u'license':Js(u'MIT'),u'maintainers':Js([PyJs_Object_412_, PyJs_Object_413_, PyJs_Object_414_, PyJs_Object_415_, PyJs_Object_416_, PyJs_Object_417_]),u'name':Js(u'babel-core'),u'optionalDependencies':PyJs_Object_418_,u'readme':Js(u'ERROR: No README data found!'),u'repository':PyJs_Object_419_,u'scripts':PyJs_Object_420_,u'version':Js(u'6.18.2')}) + var.get(u'module').put(u'exports', PyJs_Object_401_) +PyJs_anonymous_400_._set_name(u'anonymous') +PyJs_Object_421_ = Js({}) +@Js +def PyJs_anonymous_422_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Buffer', u'require', u'_trimEnd2', u'module', u'_trimEnd', u'_interopRequireDefault', u'SPACES_RE', u'_classCallCheck2', u'_classCallCheck3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_423_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_423_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_trimEnd', var.get(u'require')(Js(u'lodash/trimEnd'))) + var.put(u'_trimEnd2', var.get(u'_interopRequireDefault')(var.get(u'_trimEnd'))) + pass + var.put(u'SPACES_RE', JsRegExp(u'/^[ \\t]+$/')) + @Js + def PyJs_anonymous_424_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Buffer']) + @Js + def PyJsHoisted_Buffer_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments}, var) + var.registers([u'map']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Buffer')) + var.get(u"this").put(u'_map', var.get(u"null")) + var.get(u"this").put(u'_buf', Js([])) + var.get(u"this").put(u'_last', Js(u'')) + var.get(u"this").put(u'_queue', Js([])) + PyJs_Object_425_ = Js({u'line':Js(1.0),u'column':Js(0.0)}) + var.get(u"this").put(u'_position', PyJs_Object_425_) + PyJs_Object_426_ = Js({u'identifierName':var.get(u"null"),u'line':var.get(u"null"),u'column':var.get(u"null"),u'filename':var.get(u"null")}) + var.get(u"this").put(u'_sourcePosition', PyJs_Object_426_) + var.get(u"this").put(u'_map', var.get(u'map')) + PyJsHoisted_Buffer_.func_name = u'Buffer' + var.put(u'Buffer', PyJsHoisted_Buffer_) + pass + @Js + def PyJs_get_427_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_427_}, var) + var.registers([]) + var.get(u"this").callprop(u'_flush') + PyJs_Object_428_ = Js({u'code':PyJsComma(Js(0.0),var.get(u'_trimEnd2').get(u'default'))(var.get(u"this").get(u'_buf').callprop(u'join', Js(u''))),u'map':(var.get(u"this").get(u'_map').callprop(u'get') if var.get(u"this").get(u'_map') else var.get(u"null"))}) + return PyJs_Object_428_ + PyJs_get_427_._set_name(u'get') + var.get(u'Buffer').get(u'prototype').put(u'get', PyJs_get_427_) + @Js + def PyJs_append_429_(str, this, arguments, var=var): + var = Scope({u'this':this, u'append':PyJs_append_429_, u'arguments':arguments, u'str':str}, var) + var.registers([u'identifierName', u'column', u'filename', u'str', u'line', u'_sourcePosition']) + var.get(u"this").callprop(u'_flush') + var.put(u'_sourcePosition', var.get(u"this").get(u'_sourcePosition')) + var.put(u'line', var.get(u'_sourcePosition').get(u'line')) + var.put(u'column', var.get(u'_sourcePosition').get(u'column')) + var.put(u'filename', var.get(u'_sourcePosition').get(u'filename')) + var.put(u'identifierName', var.get(u'_sourcePosition').get(u'identifierName')) + var.get(u"this").callprop(u'_append', var.get(u'str'), var.get(u'line'), var.get(u'column'), var.get(u'identifierName'), var.get(u'filename')) + PyJs_append_429_._set_name(u'append') + var.get(u'Buffer').get(u'prototype').put(u'append', PyJs_append_429_) + @Js + def PyJs_queue_430_(str, this, arguments, var=var): + var = Scope({u'this':this, u'queue':PyJs_queue_430_, u'arguments':arguments, u'str':str}, var) + var.registers([u'identifierName', u'column', u'filename', u'_sourcePosition2', u'str', u'line']) + if PyJsStrictEq(var.get(u'str'),Js(u'\n')): + while ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) and var.get(u'SPACES_RE').callprop(u'test', var.get(u"this").get(u'_queue').get(u'0').get(u'0'))): + var.get(u"this").get(u'_queue').callprop(u'shift') + var.put(u'_sourcePosition2', var.get(u"this").get(u'_sourcePosition')) + var.put(u'line', var.get(u'_sourcePosition2').get(u'line')) + var.put(u'column', var.get(u'_sourcePosition2').get(u'column')) + var.put(u'filename', var.get(u'_sourcePosition2').get(u'filename')) + var.put(u'identifierName', var.get(u'_sourcePosition2').get(u'identifierName')) + var.get(u"this").get(u'_queue').callprop(u'unshift', Js([var.get(u'str'), var.get(u'line'), var.get(u'column'), var.get(u'identifierName'), var.get(u'filename')])) + PyJs_queue_430_._set_name(u'queue') + var.get(u'Buffer').get(u'prototype').put(u'queue', PyJs_queue_430_) + @Js + def PyJs__flush_431_(this, arguments, var=var): + var = Scope({u'this':this, u'_flush':PyJs__flush_431_, u'arguments':arguments}, var) + var.registers([u'item']) + var.put(u'item', PyJsComma(Js(0.0), Js(None))) + while var.put(u'item', var.get(u"this").get(u'_queue').callprop(u'pop')): + var.get(u"this").get(u'_append').callprop(u'apply', var.get(u"this"), var.get(u'item')) + PyJs__flush_431_._set_name(u'_flush') + var.get(u'Buffer').get(u'prototype').put(u'_flush', PyJs__flush_431_) + @Js + def PyJs__append_432_(str, line, column, identifierName, filename, this, arguments, var=var): + var = Scope({u'this':this, u'_append':PyJs__append_432_, u'str':str, u'identifierName':identifierName, u'column':column, u'arguments':arguments, u'line':line, u'filename':filename}, var) + var.registers([u'identifierName', u'i', u'filename', u'column', u'str', u'line']) + if (var.get(u"this").get(u'_map') and PyJsStrictNeq(var.get(u'str').get(u'0'),Js(u'\n'))): + var.get(u"this").get(u'_map').callprop(u'mark', var.get(u"this").get(u'_position').get(u'line'), var.get(u"this").get(u'_position').get(u'column'), var.get(u'line'), var.get(u'column'), var.get(u'identifierName'), var.get(u'filename')) + var.get(u"this").get(u'_buf').callprop(u'push', var.get(u'str')) + var.get(u"this").put(u'_last', var.get(u'str').get((var.get(u'str').get(u'length')-Js(1.0)))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)) and PyJsStrictEq(var.get(u"this").get(u'_queue').get(u'0').get(u'0'),Js(u'\n'))): + var.get(u"this").get(u'_queue').callprop(u'shift') + PyJs_removeTrailingNewline_433_._set_name(u'removeTrailingNewline') + var.get(u'Buffer').get(u'prototype').put(u'removeTrailingNewline', PyJs_removeTrailingNewline_433_) + @Js + def PyJs_removeLastSemicolon_434_(this, arguments, var=var): + var = Scope({u'this':this, u'removeLastSemicolon':PyJs_removeLastSemicolon_434_, u'arguments':arguments}, var) + var.registers([]) + if ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) and PyJsStrictEq(var.get(u"this").get(u'_queue').get(u'0').get(u'0'),Js(u';'))): + var.get(u"this").get(u'_queue').callprop(u'shift') + PyJs_removeLastSemicolon_434_._set_name(u'removeLastSemicolon') + var.get(u'Buffer').get(u'prototype').put(u'removeLastSemicolon', PyJs_removeLastSemicolon_434_) + @Js + def PyJs_endsWith_435_(suffix, this, arguments, var=var): + var = Scope({u'this':this, u'endsWith':PyJs_endsWith_435_, u'suffix':suffix, u'arguments':arguments}, var) + var.registers([u'end', u'last', u'suffix', u'str']) + if PyJsStrictEq(var.get(u'suffix').get(u'length'),Js(1.0)): + var.put(u'last', PyJsComma(Js(0.0), Js(None))) + if (var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)): + var.put(u'str', var.get(u"this").get(u'_queue').get(u'0').get(u'0')) + var.put(u'last', var.get(u'str').get((var.get(u'str').get(u'length')-Js(1.0)))) + else: + var.put(u'last', var.get(u"this").get(u'_last')) + return PyJsStrictEq(var.get(u'last'),var.get(u'suffix')) + @Js + def PyJs_anonymous_436_(acc, item, this, arguments, var=var): + var = Scope({u'acc':acc, u'item':item, u'this':this, u'arguments':arguments}, var) + var.registers([u'acc', u'item']) + return (var.get(u'item').get(u'0')+var.get(u'acc')) + PyJs_anonymous_436_._set_name(u'anonymous') + var.put(u'end', (var.get(u"this").get(u'_last')+var.get(u"this").get(u'_queue').callprop(u'reduce', PyJs_anonymous_436_, Js(u'')))) + if (var.get(u'suffix').get(u'length')<=var.get(u'end').get(u'length')): + return PyJsStrictEq(var.get(u'end').callprop(u'slice', (-var.get(u'suffix').get(u'length'))),var.get(u'suffix')) + return Js(False) + PyJs_endsWith_435_._set_name(u'endsWith') + var.get(u'Buffer').get(u'prototype').put(u'endsWith', PyJs_endsWith_435_) + @Js + def PyJs_hasContent_437_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'hasContent':PyJs_hasContent_437_}, var) + var.registers([]) + return ((var.get(u"this").get(u'_queue').get(u'length')>Js(0.0)) or var.get(u"this").get(u'_last').neg().neg()) + PyJs_hasContent_437_._set_name(u'hasContent') + var.get(u'Buffer').get(u'prototype').put(u'hasContent', PyJs_hasContent_437_) + @Js + def PyJs_source_438_(prop, loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'source':PyJs_source_438_, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'loc', u'pos', u'prop']) + if (var.get(u'prop') and var.get(u'loc').neg()): + return var.get('undefined') + var.put(u'pos', (var.get(u'loc').get(var.get(u'prop')) if var.get(u'loc') else var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'identifierName', ((var.get(u'loc') and var.get(u'loc').get(u'identifierName')) or var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'line', (var.get(u'pos').get(u'line') if var.get(u'pos') else var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'column', (var.get(u'pos').get(u'column') if var.get(u'pos') else var.get(u"null"))) + var.get(u"this").get(u'_sourcePosition').put(u'filename', ((var.get(u'loc') and var.get(u'loc').get(u'filename')) or var.get(u"null"))) + PyJs_source_438_._set_name(u'source') + var.get(u'Buffer').get(u'prototype').put(u'source', PyJs_source_438_) + @Js + def PyJs_withSource_439_(prop, loc, cb, this, arguments, var=var): + var = Scope({u'loc':loc, u'this':this, u'cb':cb, u'prop':prop, u'withSource':PyJs_withSource_439_, u'arguments':arguments}, var) + var.registers([u'originalColumn', u'originalIdentifierName', u'loc', u'cb', u'prop', u'originalLine', u'originalFilename']) + if var.get(u"this").get(u'_map').neg(): + return var.get(u'cb')() + var.put(u'originalLine', var.get(u"this").get(u'_sourcePosition').get(u'line')) + var.put(u'originalColumn', var.get(u"this").get(u'_sourcePosition').get(u'column')) + var.put(u'originalFilename', var.get(u"this").get(u'_sourcePosition').get(u'filename')) + var.put(u'originalIdentifierName', var.get(u"this").get(u'_sourcePosition').get(u'identifierName')) + var.get(u"this").callprop(u'source', var.get(u'prop'), var.get(u'loc')) + var.get(u'cb')() + var.get(u"this").get(u'_sourcePosition').put(u'line', var.get(u'originalLine')) + var.get(u"this").get(u'_sourcePosition').put(u'column', var.get(u'originalColumn')) + var.get(u"this").get(u'_sourcePosition').put(u'filename', var.get(u'originalFilename')) + var.get(u"this").get(u'_sourcePosition').put(u'identifierName', var.get(u'originalIdentifierName')) + PyJs_withSource_439_._set_name(u'withSource') + var.get(u'Buffer').get(u'prototype').put(u'withSource', PyJs_withSource_439_) + @Js + def PyJs_getCurrentColumn_440_(this, arguments, var=var): + var = Scope({u'this':this, u'getCurrentColumn':PyJs_getCurrentColumn_440_, u'arguments':arguments}, var) + var.registers([u'lastIndex', u'extra']) + @Js + def PyJs_anonymous_441_(acc, item, this, arguments, var=var): + var = Scope({u'acc':acc, u'item':item, u'this':this, u'arguments':arguments}, var) + var.registers([u'acc', u'item']) + return (var.get(u'item').get(u'0')+var.get(u'acc')) + PyJs_anonymous_441_._set_name(u'anonymous') + var.put(u'extra', var.get(u"this").get(u'_queue').callprop(u'reduce', PyJs_anonymous_441_, Js(u''))) + var.put(u'lastIndex', var.get(u'extra').callprop(u'lastIndexOf', Js(u'\n'))) + return ((var.get(u"this").get(u'_position').get(u'column')+var.get(u'extra').get(u'length')) if PyJsStrictEq(var.get(u'lastIndex'),(-Js(1.0))) else ((var.get(u'extra').get(u'length')-Js(1.0))-var.get(u'lastIndex'))) + PyJs_getCurrentColumn_440_._set_name(u'getCurrentColumn') + var.get(u'Buffer').get(u'prototype').put(u'getCurrentColumn', PyJs_getCurrentColumn_440_) + @Js + def PyJs_getCurrentLine_442_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getCurrentLine':PyJs_getCurrentLine_442_}, var) + var.registers([u'count', u'i', u'extra']) + @Js + def PyJs_anonymous_443_(acc, item, this, arguments, var=var): + var = Scope({u'acc':acc, u'item':item, u'this':this, u'arguments':arguments}, var) + var.registers([u'acc', u'item']) + return (var.get(u'item').get(u'0')+var.get(u'acc')) + PyJs_anonymous_443_._set_name(u'anonymous') + var.put(u'extra', var.get(u"this").get(u'_queue').callprop(u'reduce', PyJs_anonymous_443_, Js(u''))) + var.put(u'count', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')')) + PyJsHoisted_TypeParameterInstantiation_.func_name = u'TypeParameterInstantiation' + var.put(u'TypeParameterInstantiation', PyJsHoisted_TypeParameterInstantiation_) + @Js + def PyJsHoisted_TypeParameter_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'_variance', var.get(u'node')) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'name')) + if var.get(u'node').get(u'bound'): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'bound'), var.get(u'node')) + if var.get(u'node').get(u'default'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'default'), var.get(u'node')) + PyJsHoisted_TypeParameter_.func_name = u'TypeParameter' + var.put(u'TypeParameter', PyJsHoisted_TypeParameter_) + @Js + def PyJsHoisted_ExistentialTypeParam_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'token', Js(u'*')) + PyJsHoisted_ExistentialTypeParam_.func_name = u'ExistentialTypeParam' + var.put(u'ExistentialTypeParam', PyJsHoisted_ExistentialTypeParam_) + @Js + def PyJsHoisted_FunctionTypeParam_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + if var.get(u'node').get(u'optional'): + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_FunctionTypeParam_.func_name = u'FunctionTypeParam' + var.put(u'FunctionTypeParam', PyJsHoisted_FunctionTypeParam_) + @Js + def PyJsHoisted_orSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'|')) + var.get(u"this").callprop(u'space') + PyJsHoisted_orSeparator_.func_name = u'orSeparator' + var.put(u'orSeparator', PyJsHoisted_orSeparator_) + @Js + def PyJsHoisted_UnionTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_469_ = Js({u'separator':var.get(u'orSeparator')}) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'types'), var.get(u'node'), PyJs_Object_469_) + PyJsHoisted_UnionTypeAnnotation_.func_name = u'UnionTypeAnnotation' + var.put(u'UnionTypeAnnotation', PyJsHoisted_UnionTypeAnnotation_) + @Js + def PyJsHoisted_DeclareModuleExports_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'module')) + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'word', Js(u'exports')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_DeclareModuleExports_.func_name = u'DeclareModuleExports' + var.put(u'DeclareModuleExports', PyJsHoisted_DeclareModuleExports_) + @Js + def PyJsHoisted_TypeCastExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + PyJsHoisted_TypeCastExpression_.func_name = u'TypeCastExpression' + var.put(u'TypeCastExpression', PyJsHoisted_TypeCastExpression_) + @Js + def PyJsHoisted_BooleanLiteralTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', (Js(u'true') if var.get(u'node').get(u'value') else Js(u'false'))) + PyJsHoisted_BooleanLiteralTypeAnnotation_.func_name = u'BooleanLiteralTypeAnnotation' + var.put(u'BooleanLiteralTypeAnnotation', PyJsHoisted_BooleanLiteralTypeAnnotation_) + @Js + def PyJsHoisted_VoidTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'void')) + PyJsHoisted_VoidTypeAnnotation_.func_name = u'VoidTypeAnnotation' + var.put(u'VoidTypeAnnotation', PyJsHoisted_VoidTypeAnnotation_) + @Js + def PyJsHoisted_ObjectTypeProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_variance', var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'key'), var.get(u'node')) + if var.get(u'node').get(u'optional'): + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_ObjectTypeProperty_.func_name = u'ObjectTypeProperty' + var.put(u'ObjectTypeProperty', PyJsHoisted_ObjectTypeProperty_) + @Js + def PyJsHoisted_IntersectionTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_465_ = Js({u'separator':var.get(u'andSeparator')}) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'types'), var.get(u'node'), PyJs_Object_465_) + PyJsHoisted_IntersectionTypeAnnotation_.func_name = u'IntersectionTypeAnnotation' + var.put(u'IntersectionTypeAnnotation', PyJsHoisted_IntersectionTypeAnnotation_) + @Js + def PyJsHoisted_ObjectTypeCallProperty_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'static'): + var.get(u"this").callprop(u'word', Js(u'static')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_ObjectTypeCallProperty_.func_name = u'ObjectTypeCallProperty' + var.put(u'ObjectTypeCallProperty', PyJsHoisted_ObjectTypeCallProperty_) + @Js + def PyJsHoisted_TupleTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'types'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + PyJsHoisted_TupleTypeAnnotation_.func_name = u'TupleTypeAnnotation' + var.put(u'TupleTypeAnnotation', PyJsHoisted_TupleTypeAnnotation_) + @Js + def PyJsHoisted_TypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'optional'): + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_TypeAnnotation_.func_name = u'TypeAnnotation' + var.put(u'TypeAnnotation', PyJsHoisted_TypeAnnotation_) + @Js + def PyJsHoisted__variance_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'plus')): + var.get(u"this").callprop(u'token', Js(u'+')) + else: + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'minus')): + var.get(u"this").callprop(u'token', Js(u'-')) + PyJsHoisted__variance_.func_name = u'_variance' + var.put(u'_variance', PyJsHoisted__variance_) + @Js + def PyJsHoisted_FunctionTypeAnnotation_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'params'), var.get(u'node')) + if var.get(u'node').get(u'rest'): + if var.get(u'node').get(u'params').get(u'length'): + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'...')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'rest'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + if (PyJsStrictEq(var.get(u'parent').get(u'type'),Js(u'ObjectTypeCallProperty')) or PyJsStrictEq(var.get(u'parent').get(u'type'),Js(u'DeclareFunction'))): + var.get(u"this").callprop(u'token', Js(u':')) + else: + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=>')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'returnType'), var.get(u'node')) + PyJsHoisted_FunctionTypeAnnotation_.func_name = u'FunctionTypeAnnotation' + var.put(u'FunctionTypeAnnotation', PyJsHoisted_FunctionTypeAnnotation_) + @Js + def PyJsHoisted_DeclareModule_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'declare')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'module')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_DeclareModule_.func_name = u'DeclareModule' + var.put(u'DeclareModule', PyJsHoisted_DeclareModule_) + @Js + def PyJsHoisted_NullableTypeAnnotation_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'?')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJsHoisted_NullableTypeAnnotation_.func_name = u'NullableTypeAnnotation' + var.put(u'NullableTypeAnnotation', PyJsHoisted_NullableTypeAnnotation_) + @Js + def PyJsHoisted_andSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'&')) + var.get(u"this").callprop(u'space') + PyJsHoisted_andSeparator_.func_name = u'andSeparator' + var.put(u'andSeparator', PyJsHoisted_andSeparator_) + @Js + def PyJsHoisted_BooleanTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'boolean')) + PyJsHoisted_BooleanTypeAnnotation_.func_name = u'BooleanTypeAnnotation' + var.put(u'BooleanTypeAnnotation', PyJsHoisted_BooleanTypeAnnotation_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'AnyTypeAnnotation', var.get(u'AnyTypeAnnotation')) + var.get(u'exports').put(u'ArrayTypeAnnotation', var.get(u'ArrayTypeAnnotation')) + var.get(u'exports').put(u'BooleanTypeAnnotation', var.get(u'BooleanTypeAnnotation')) + var.get(u'exports').put(u'BooleanLiteralTypeAnnotation', var.get(u'BooleanLiteralTypeAnnotation')) + var.get(u'exports').put(u'NullLiteralTypeAnnotation', var.get(u'NullLiteralTypeAnnotation')) + var.get(u'exports').put(u'DeclareClass', var.get(u'DeclareClass')) + var.get(u'exports').put(u'DeclareFunction', var.get(u'DeclareFunction')) + var.get(u'exports').put(u'DeclareInterface', var.get(u'DeclareInterface')) + var.get(u'exports').put(u'DeclareModule', var.get(u'DeclareModule')) + var.get(u'exports').put(u'DeclareModuleExports', var.get(u'DeclareModuleExports')) + var.get(u'exports').put(u'DeclareTypeAlias', var.get(u'DeclareTypeAlias')) + var.get(u'exports').put(u'DeclareVariable', var.get(u'DeclareVariable')) + var.get(u'exports').put(u'ExistentialTypeParam', var.get(u'ExistentialTypeParam')) + var.get(u'exports').put(u'FunctionTypeAnnotation', var.get(u'FunctionTypeAnnotation')) + var.get(u'exports').put(u'FunctionTypeParam', var.get(u'FunctionTypeParam')) + var.get(u'exports').put(u'InterfaceExtends', var.get(u'InterfaceExtends')) + var.get(u'exports').put(u'_interfaceish', var.get(u'_interfaceish')) + var.get(u'exports').put(u'_variance', var.get(u'_variance')) + var.get(u'exports').put(u'InterfaceDeclaration', var.get(u'InterfaceDeclaration')) + var.get(u'exports').put(u'IntersectionTypeAnnotation', var.get(u'IntersectionTypeAnnotation')) + var.get(u'exports').put(u'MixedTypeAnnotation', var.get(u'MixedTypeAnnotation')) + var.get(u'exports').put(u'EmptyTypeAnnotation', var.get(u'EmptyTypeAnnotation')) + var.get(u'exports').put(u'NullableTypeAnnotation', var.get(u'NullableTypeAnnotation')) + var.put(u'_types', var.get(u'require')(Js(u'./types'))) + @Js + def PyJs_get_462_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_462_}, var) + var.registers([]) + return var.get(u'_types').get(u'NumericLiteral') + PyJs_get_462_._set_name(u'get') + PyJs_Object_461_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_462_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NumericLiteralTypeAnnotation'), PyJs_Object_461_) + @Js + def PyJs_get_464_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_464_}, var) + var.registers([]) + return var.get(u'_types').get(u'StringLiteral') + PyJs_get_464_._set_name(u'get') + PyJs_Object_463_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_464_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'StringLiteralTypeAnnotation'), PyJs_Object_463_) + var.get(u'exports').put(u'NumberTypeAnnotation', var.get(u'NumberTypeAnnotation')) + var.get(u'exports').put(u'StringTypeAnnotation', var.get(u'StringTypeAnnotation')) + var.get(u'exports').put(u'ThisTypeAnnotation', var.get(u'ThisTypeAnnotation')) + var.get(u'exports').put(u'TupleTypeAnnotation', var.get(u'TupleTypeAnnotation')) + var.get(u'exports').put(u'TypeofTypeAnnotation', var.get(u'TypeofTypeAnnotation')) + var.get(u'exports').put(u'TypeAlias', var.get(u'TypeAlias')) + var.get(u'exports').put(u'TypeAnnotation', var.get(u'TypeAnnotation')) + var.get(u'exports').put(u'TypeParameter', var.get(u'TypeParameter')) + var.get(u'exports').put(u'TypeParameterInstantiation', var.get(u'TypeParameterInstantiation')) + var.get(u'exports').put(u'ObjectTypeAnnotation', var.get(u'ObjectTypeAnnotation')) + var.get(u'exports').put(u'ObjectTypeCallProperty', var.get(u'ObjectTypeCallProperty')) + var.get(u'exports').put(u'ObjectTypeIndexer', var.get(u'ObjectTypeIndexer')) + var.get(u'exports').put(u'ObjectTypeProperty', var.get(u'ObjectTypeProperty')) + var.get(u'exports').put(u'QualifiedTypeIdentifier', var.get(u'QualifiedTypeIdentifier')) + var.get(u'exports').put(u'UnionTypeAnnotation', var.get(u'UnionTypeAnnotation')) + var.get(u'exports').put(u'TypeCastExpression', var.get(u'TypeCastExpression')) + var.get(u'exports').put(u'VoidTypeAnnotation', var.get(u'VoidTypeAnnotation')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'ClassImplements', var.get(u'InterfaceExtends')) + var.get(u'exports').put(u'GenericTypeAnnotation', var.get(u'InterfaceExtends')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'TypeParameterDeclaration', var.get(u'TypeParameterInstantiation')) + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_460_._set_name(u'anonymous') +PyJs_Object_470_ = Js({u'./types':Js(39.0)}) +@Js +def PyJs_anonymous_471_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'JSXSpreadAttribute', u'exports', u'JSXOpeningElement', u'JSXMemberExpression', u'JSXClosingElement', u'module', u'JSXElement', u'JSXAttribute', u'JSXNamespacedName', u'JSXText', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'JSXExpressionContainer', u'spaceSeparator', u'JSXEmptyExpression', u'JSXIdentifier']) + @Js + def PyJsHoisted_JSXSpreadAttribute_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'token', Js(u'...')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'argument'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_JSXSpreadAttribute_.func_name = u'JSXSpreadAttribute' + var.put(u'JSXSpreadAttribute', PyJsHoisted_JSXSpreadAttribute_) + @Js + def PyJsHoisted_JSXOpeningElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'<')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + if (var.get(u'node').get(u'attributes').get(u'length')>Js(0.0)): + var.get(u"this").callprop(u'space') + PyJs_Object_473_ = Js({u'separator':var.get(u'spaceSeparator')}) + var.get(u"this").callprop(u'printJoin', var.get(u'node').get(u'attributes'), var.get(u'node'), PyJs_Object_473_) + if var.get(u'node').get(u'selfClosing'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'/>')) + else: + var.get(u"this").callprop(u'token', Js(u'>')) + PyJsHoisted_JSXOpeningElement_.func_name = u'JSXOpeningElement' + var.put(u'JSXOpeningElement', PyJsHoisted_JSXOpeningElement_) + @Js + def PyJsHoisted_JSXMemberExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'object'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'.')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'property'), var.get(u'node')) + PyJsHoisted_JSXMemberExpression_.func_name = u'JSXMemberExpression' + var.put(u'JSXMemberExpression', PyJsHoisted_JSXMemberExpression_) + @Js + def PyJsHoisted_JSXClosingElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'')) + PyJsHoisted_JSXClosingElement_.func_name = u'JSXClosingElement' + var.put(u'JSXClosingElement', PyJsHoisted_JSXClosingElement_) + @Js + def PyJsHoisted_JSXElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_i', u'child', u'_ref', u'open']) + var.put(u'open', var.get(u'node').get(u'openingElement')) + var.get(u"this").callprop(u'print', var.get(u'open'), var.get(u'node')) + if var.get(u'open').get(u'selfClosing'): + return var.get('undefined') + var.get(u"this").callprop(u'indent') + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'children')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'child', var.get(u'_ref')) + var.get(u"this").callprop(u'print', var.get(u'child'), var.get(u'node')) + + var.get(u"this").callprop(u'dedent') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'closingElement'), var.get(u'node')) + PyJsHoisted_JSXElement_.func_name = u'JSXElement' + var.put(u'JSXElement', PyJsHoisted_JSXElement_) + @Js + def PyJsHoisted_JSXAttribute_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + if var.get(u'node').get(u'value'): + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'value'), var.get(u'node')) + PyJsHoisted_JSXAttribute_.func_name = u'JSXAttribute' + var.put(u'JSXAttribute', PyJsHoisted_JSXAttribute_) + @Js + def PyJsHoisted_JSXNamespacedName_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'namespace'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u':')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'name'), var.get(u'node')) + PyJsHoisted_JSXNamespacedName_.func_name = u'JSXNamespacedName' + var.put(u'JSXNamespacedName', PyJsHoisted_JSXNamespacedName_) + @Js + def PyJsHoisted_JSXText_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', var.get(u'node').get(u'value')) + PyJsHoisted_JSXText_.func_name = u'JSXText' + var.put(u'JSXText', PyJsHoisted_JSXText_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_472_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_472_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_JSXExpressionContainer_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'expression'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_JSXExpressionContainer_.func_name = u'JSXExpressionContainer' + var.put(u'JSXExpressionContainer', PyJsHoisted_JSXExpressionContainer_) + @Js + def PyJsHoisted_spaceSeparator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'space') + PyJsHoisted_spaceSeparator_.func_name = u'spaceSeparator' + var.put(u'spaceSeparator', PyJsHoisted_spaceSeparator_) + @Js + def PyJsHoisted_JSXEmptyExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJsHoisted_JSXEmptyExpression_.func_name = u'JSXEmptyExpression' + var.put(u'JSXEmptyExpression', PyJsHoisted_JSXEmptyExpression_) + @Js + def PyJsHoisted_JSXIdentifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'name')) + PyJsHoisted_JSXIdentifier_.func_name = u'JSXIdentifier' + var.put(u'JSXIdentifier', PyJsHoisted_JSXIdentifier_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'JSXAttribute', var.get(u'JSXAttribute')) + var.get(u'exports').put(u'JSXIdentifier', var.get(u'JSXIdentifier')) + var.get(u'exports').put(u'JSXNamespacedName', var.get(u'JSXNamespacedName')) + var.get(u'exports').put(u'JSXMemberExpression', var.get(u'JSXMemberExpression')) + var.get(u'exports').put(u'JSXSpreadAttribute', var.get(u'JSXSpreadAttribute')) + var.get(u'exports').put(u'JSXExpressionContainer', var.get(u'JSXExpressionContainer')) + var.get(u'exports').put(u'JSXText', var.get(u'JSXText')) + var.get(u'exports').put(u'JSXElement', var.get(u'JSXElement')) + var.get(u'exports').put(u'JSXOpeningElement', var.get(u'JSXOpeningElement')) + var.get(u'exports').put(u'JSXClosingElement', var.get(u'JSXClosingElement')) + var.get(u'exports').put(u'JSXEmptyExpression', var.get(u'JSXEmptyExpression')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_471_._set_name(u'anonymous') +PyJs_Object_474_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_475_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ArrowFunctionExpression', u'_interopRequireWildcard', u'require', u'_babelTypes', u'FunctionExpression', u'module', u't', u'hasTypes', u'_params', u'_method']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_476_ = Js({}) + var.put(u'newObj', PyJs_Object_476_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ArrowFunctionExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'firstParam']) + if var.get(u'node').get(u'async'): + var.get(u"this").callprop(u'word', Js(u'async')) + var.get(u"this").callprop(u'space') + var.put(u'firstParam', var.get(u'node').get(u'params').get(u'0')) + if ((PyJsStrictEq(var.get(u'node').get(u'params').get(u'length'),Js(1.0)) and var.get(u't').callprop(u'isIdentifier', var.get(u'firstParam'))) and var.get(u'hasTypes')(var.get(u'node'), var.get(u'firstParam')).neg()): + var.get(u"this").callprop(u'print', var.get(u'firstParam'), var.get(u'node')) + else: + var.get(u"this").callprop(u'_params', var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=>')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_ArrowFunctionExpression_.func_name = u'ArrowFunctionExpression' + var.put(u'ArrowFunctionExpression', PyJsHoisted_ArrowFunctionExpression_) + @Js + def PyJsHoisted_FunctionExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'async'): + var.get(u"this").callprop(u'word', Js(u'async')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'function')) + if var.get(u'node').get(u'generator'): + var.get(u"this").callprop(u'token', Js(u'*')) + if var.get(u'node').get(u'id'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + else: + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'_params', var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted_FunctionExpression_.func_name = u'FunctionExpression' + var.put(u'FunctionExpression', PyJsHoisted_FunctionExpression_) + @Js + def PyJsHoisted_hasTypes_(node, param, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'param':param}, var) + var.registers([u'node', u'param']) + return ((((var.get(u'node').get(u'typeParameters') or var.get(u'node').get(u'returnType')) or var.get(u'param').get(u'typeAnnotation')) or var.get(u'param').get(u'optional')) or var.get(u'param').get(u'trailingComments')) + PyJsHoisted_hasTypes_.func_name = u'hasTypes' + var.put(u'hasTypes', PyJsHoisted_hasTypes_) + @Js + def PyJsHoisted__params_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_this']) + var.put(u'_this', var.get(u"this")) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'typeParameters'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u'(')) + @Js + def PyJs_iterator_478_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'iterator':PyJs_iterator_478_}, var) + var.registers([u'node']) + if var.get(u'node').get(u'optional'): + var.get(u'_this').callprop(u'token', Js(u'?')) + var.get(u'_this').callprop(u'print', var.get(u'node').get(u'typeAnnotation'), var.get(u'node')) + PyJs_iterator_478_._set_name(u'iterator') + PyJs_Object_477_ = Js({u'iterator':PyJs_iterator_478_}) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'params'), var.get(u'node'), PyJs_Object_477_) + var.get(u"this").callprop(u'token', Js(u')')) + if var.get(u'node').get(u'returnType'): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'returnType'), var.get(u'node')) + PyJsHoisted__params_.func_name = u'_params' + var.put(u'_params', PyJsHoisted__params_) + @Js + def PyJsHoisted__method_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'kind', u'key']) + var.put(u'kind', var.get(u'node').get(u'kind')) + var.put(u'key', var.get(u'node').get(u'key')) + if (PyJsStrictEq(var.get(u'kind'),Js(u'method')) or PyJsStrictEq(var.get(u'kind'),Js(u'init'))): + if var.get(u'node').get(u'generator'): + var.get(u"this").callprop(u'token', Js(u'*')) + if (PyJsStrictEq(var.get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'kind'),Js(u'set'))): + var.get(u"this").callprop(u'word', var.get(u'kind')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'async'): + var.get(u"this").callprop(u'word', Js(u'async')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'computed'): + var.get(u"this").callprop(u'token', Js(u'[')) + var.get(u"this").callprop(u'print', var.get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u']')) + else: + var.get(u"this").callprop(u'print', var.get(u'key'), var.get(u'node')) + var.get(u"this").callprop(u'_params', var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'body'), var.get(u'node')) + PyJsHoisted__method_.func_name = u'_method' + var.put(u'_method', PyJsHoisted__method_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'FunctionDeclaration', var.get(u'undefined')) + var.get(u'exports').put(u'_params', var.get(u'_params')) + var.get(u'exports').put(u'_method', var.get(u'_method')) + var.get(u'exports').put(u'FunctionExpression', var.get(u'FunctionExpression')) + var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'ArrowFunctionExpression')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + var.get(u'exports').put(u'FunctionDeclaration', var.get(u'FunctionExpression')) + pass + pass +PyJs_anonymous_475_._set_name(u'anonymous') +PyJs_Object_479_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_480_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ExportDeclaration', u'ExportNamespaceSpecifier', u'_interopRequireWildcard', u'ExportDefaultDeclaration', u'ImportDeclaration', u'ExportSpecifier', u'ImportSpecifier', u'_babelTypes', u'require', u'module', u'ImportDefaultSpecifier', u'ExportNamedDeclaration', u't', u'ImportNamespaceSpecifier', u'ExportDefaultSpecifier', u'ExportAllDeclaration']) + @Js + def PyJsHoisted_ExportNamespaceSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'*')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + PyJsHoisted_ExportNamespaceSpecifier_.func_name = u'ExportNamespaceSpecifier' + var.put(u'ExportNamespaceSpecifier', PyJsHoisted_ExportNamespaceSpecifier_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_481_ = Js({}) + var.put(u'newObj', PyJs_Object_481_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ExportDefaultDeclaration_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'export')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'default')) + var.get(u"this").callprop(u'space') + var.get(u'ExportDeclaration').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJsHoisted_ExportDefaultDeclaration_.func_name = u'ExportDefaultDeclaration' + var.put(u'ExportDefaultDeclaration', PyJsHoisted_ExportDefaultDeclaration_) + @Js + def PyJsHoisted_ImportDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifiers', u'first']) + var.get(u"this").callprop(u'word', Js(u'import')) + var.get(u"this").callprop(u'space') + if (PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'type')) or PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'typeof'))): + var.get(u"this").callprop(u'word', var.get(u'node').get(u'importKind')) + var.get(u"this").callprop(u'space') + var.put(u'specifiers', var.get(u'node').get(u'specifiers').callprop(u'slice', Js(0.0))) + if (var.get(u'specifiers') and var.get(u'specifiers').get(u'length')): + while var.get(u'true'): + var.put(u'first', var.get(u'specifiers').get(u'0')) + if (var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'first')) or var.get(u't').callprop(u'isImportNamespaceSpecifier', var.get(u'first'))): + var.get(u"this").callprop(u'print', var.get(u'specifiers').callprop(u'shift'), var.get(u'node')) + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + else: + break + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'specifiers'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'}')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'from')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'source'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ImportDeclaration_.func_name = u'ImportDeclaration' + var.put(u'ImportDeclaration', PyJsHoisted_ImportDeclaration_) + @Js + def PyJsHoisted_ExportSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + if (var.get(u'node').get(u'exported') and PyJsStrictNeq(var.get(u'node').get(u'local').get(u'name'),var.get(u'node').get(u'exported').get(u'name'))): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + PyJsHoisted_ExportSpecifier_.func_name = u'ExportSpecifier' + var.put(u'ExportSpecifier', PyJsHoisted_ExportSpecifier_) + @Js + def PyJsHoisted_ImportSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'imported'), var.get(u'node')) + if (var.get(u'node').get(u'local') and PyJsStrictNeq(var.get(u'node').get(u'local').get(u'name'),var.get(u'node').get(u'imported').get(u'name'))): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + PyJsHoisted_ImportSpecifier_.func_name = u'ImportSpecifier' + var.put(u'ImportSpecifier', PyJsHoisted_ImportSpecifier_) + @Js + def PyJsHoisted_ExportDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifiers', u'declar', u'first', u'hasSpecial']) + if var.get(u'node').get(u'declaration'): + var.put(u'declar', var.get(u'node').get(u'declaration')) + var.get(u"this").callprop(u'print', var.get(u'declar'), var.get(u'node')) + if var.get(u't').callprop(u'isStatement', var.get(u'declar')).neg(): + var.get(u"this").callprop(u'semicolon') + else: + if PyJsStrictEq(var.get(u'node').get(u'exportKind'),Js(u'type')): + var.get(u"this").callprop(u'word', Js(u'type')) + var.get(u"this").callprop(u'space') + var.put(u'specifiers', var.get(u'node').get(u'specifiers').callprop(u'slice', Js(0.0))) + var.put(u'hasSpecial', Js(False)) + while var.get(u'true'): + var.put(u'first', var.get(u'specifiers').get(u'0')) + if (var.get(u't').callprop(u'isExportDefaultSpecifier', var.get(u'first')) or var.get(u't').callprop(u'isExportNamespaceSpecifier', var.get(u'first'))): + var.put(u'hasSpecial', var.get(u'true')) + var.get(u"this").callprop(u'print', var.get(u'specifiers').callprop(u'shift'), var.get(u'node')) + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'space') + else: + break + if (var.get(u'specifiers').get(u'length') or (var.get(u'specifiers').get(u'length').neg() and var.get(u'hasSpecial').neg())): + var.get(u"this").callprop(u'token', Js(u'{')) + if var.get(u'specifiers').get(u'length'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printList', var.get(u'specifiers'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'}')) + if var.get(u'node').get(u'source'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'from')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'source'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ExportDeclaration_.func_name = u'ExportDeclaration' + var.put(u'ExportDeclaration', PyJsHoisted_ExportDeclaration_) + @Js + def PyJsHoisted_ImportDefaultSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + PyJsHoisted_ImportDefaultSpecifier_.func_name = u'ImportDefaultSpecifier' + var.put(u'ImportDefaultSpecifier', PyJsHoisted_ImportDefaultSpecifier_) + @Js + def PyJsHoisted_ExportNamedDeclaration_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'export')) + var.get(u"this").callprop(u'space') + var.get(u'ExportDeclaration').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJsHoisted_ExportNamedDeclaration_.func_name = u'ExportNamedDeclaration' + var.put(u'ExportNamedDeclaration', PyJsHoisted_ExportNamedDeclaration_) + @Js + def PyJsHoisted_ExportAllDeclaration_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'export')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'*')) + if var.get(u'node').get(u'exported'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'from')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'source'), var.get(u'node')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_ExportAllDeclaration_.func_name = u'ExportAllDeclaration' + var.put(u'ExportAllDeclaration', PyJsHoisted_ExportAllDeclaration_) + @Js + def PyJsHoisted_ImportNamespaceSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'token', Js(u'*')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'as')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'local'), var.get(u'node')) + PyJsHoisted_ImportNamespaceSpecifier_.func_name = u'ImportNamespaceSpecifier' + var.put(u'ImportNamespaceSpecifier', PyJsHoisted_ImportNamespaceSpecifier_) + @Js + def PyJsHoisted_ExportDefaultSpecifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'exported'), var.get(u'node')) + PyJsHoisted_ExportDefaultSpecifier_.func_name = u'ExportDefaultSpecifier' + var.put(u'ExportDefaultSpecifier', PyJsHoisted_ExportDefaultSpecifier_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ImportSpecifier', var.get(u'ImportSpecifier')) + var.get(u'exports').put(u'ImportDefaultSpecifier', var.get(u'ImportDefaultSpecifier')) + var.get(u'exports').put(u'ExportDefaultSpecifier', var.get(u'ExportDefaultSpecifier')) + var.get(u'exports').put(u'ExportSpecifier', var.get(u'ExportSpecifier')) + var.get(u'exports').put(u'ExportNamespaceSpecifier', var.get(u'ExportNamespaceSpecifier')) + var.get(u'exports').put(u'ExportAllDeclaration', var.get(u'ExportAllDeclaration')) + var.get(u'exports').put(u'ExportNamedDeclaration', var.get(u'ExportNamedDeclaration')) + var.get(u'exports').put(u'ExportDefaultDeclaration', var.get(u'ExportDefaultDeclaration')) + var.get(u'exports').put(u'ImportDeclaration', var.get(u'ImportDeclaration')) + var.get(u'exports').put(u'ImportNamespaceSpecifier', var.get(u'ImportNamespaceSpecifier')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_480_._set_name(u'anonymous') +PyJs_Object_482_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_483_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'ForOfStatement', u'LabeledStatement', u'ForAwaitStatement', u'module', u'DebuggerStatement', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'VariableDeclaration', u'ForStatement', u'getLastStatement', u'ContinueStatement', u'DoWhileStatement', u'SwitchStatement', u'CatchClause', u'buildLabelStatement', u'BreakStatement', u'buildForXStatement', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'TryStatement', u'ForInStatement', u'SwitchCase', u'constDeclarationIdent', u'ThrowStatement', u'WithStatement', u'WhileStatement', u'variableDeclarationIdent', u't', u'ReturnStatement', u'VariableDeclarator', u'require', u'IfStatement']) + @Js + def PyJsHoisted_ForStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'for')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + (var.get(u"this").put(u'inForStatementInitCounter',Js(var.get(u"this").get(u'inForStatementInitCounter').to_number())+Js(1))-Js(1)) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'init'), var.get(u'node')) + (var.get(u"this").put(u'inForStatementInitCounter',Js(var.get(u"this").get(u'inForStatementInitCounter').to_number())-Js(1))+Js(1)) + var.get(u"this").callprop(u'token', Js(u';')) + if var.get(u'node').get(u'test'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u';')) + if var.get(u'node').get(u'update'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'update'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'printBlock', var.get(u'node')) + PyJsHoisted_ForStatement_.func_name = u'ForStatement' + var.put(u'ForStatement', PyJsHoisted_ForStatement_) + @Js + def PyJsHoisted_constDeclarationIdent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i']) + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'newline') + if var.get(u"this").callprop(u'endsWith', Js(u'\n')): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'label'))) + @Js + def PyJs_anonymous_488_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'terminatorState', u'label']) + var.get(u"this").callprop(u'word', var.get(u'prefix')) + var.put(u'label', var.get(u'node').get(var.get(u'key'))) + if var.get(u'label'): + var.get(u"this").callprop(u'space') + var.put(u'terminatorState', var.get(u"this").callprop(u'startTerminatorless')) + var.get(u"this").callprop(u'print', var.get(u'label'), var.get(u'node')) + var.get(u"this").callprop(u'endTerminatorless', var.get(u'terminatorState')) + var.get(u"this").callprop(u'semicolon') + PyJs_anonymous_488_._set_name(u'anonymous') + return PyJs_anonymous_488_ + PyJsHoisted_buildLabelStatement_.func_name = u'buildLabelStatement' + var.put(u'buildLabelStatement', PyJsHoisted_buildLabelStatement_) + @Js + def PyJsHoisted_TryStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'try')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'block'), var.get(u'node')) + var.get(u"this").callprop(u'space') + if var.get(u'node').get(u'handlers'): + var.get(u"this").callprop(u'print', var.get(u'node').get(u'handlers').get(u'0'), var.get(u'node')) + else: + var.get(u"this").callprop(u'print', var.get(u'node').get(u'handler'), var.get(u'node')) + if var.get(u'node').get(u'finalizer'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'finally')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'finalizer'), var.get(u'node')) + PyJsHoisted_TryStatement_.func_name = u'TryStatement' + var.put(u'TryStatement', PyJsHoisted_TryStatement_) + @Js + def PyJsHoisted_DebuggerStatement_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'debugger')) + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_DebuggerStatement_.func_name = u'DebuggerStatement' + var.put(u'DebuggerStatement', PyJsHoisted_DebuggerStatement_) + @Js + def PyJsHoisted_SwitchStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'switch')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'discriminant'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'{')) + @Js + def PyJs_addNewlines_490_(leading, cas, this, arguments, var=var): + var = Scope({u'cas':cas, u'leading':leading, u'this':this, u'arguments':arguments, u'addNewlines':PyJs_addNewlines_490_}, var) + var.registers([u'cas', u'leading']) + if (var.get(u'leading').neg() and PyJsStrictEq(var.get(u'node').get(u'cases').get((var.get(u'node').get(u'cases').get(u'length')-Js(1.0))),var.get(u'cas'))): + return (-Js(1.0)) + PyJs_addNewlines_490_._set_name(u'addNewlines') + PyJs_Object_489_ = Js({u'indent':var.get(u'true'),u'addNewlines':PyJs_addNewlines_490_}) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'cases'), var.get(u'node'), PyJs_Object_489_) + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_SwitchStatement_.func_name = u'SwitchStatement' + var.put(u'SwitchStatement', PyJsHoisted_SwitchStatement_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_485_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_485_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_variableDeclarationIdent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i']) + var.get(u"this").callprop(u'token', Js(u',')) + var.get(u"this").callprop(u'newline') + if var.get(u"this").callprop(u'endsWith', Js(u'\n')): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref')) + if var.get(u'declar').get(u'init'): + var.put(u'hasInits', var.get(u'true')) + + var.put(u'separator', PyJsComma(Js(0.0), Js(None))) + if var.get(u'hasInits'): + var.put(u'separator', (var.get(u'constDeclarationIdent') if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'const')) else var.get(u'variableDeclarationIdent'))) + PyJs_Object_492_ = Js({u'separator':var.get(u'separator')}) + var.get(u"this").callprop(u'printList', var.get(u'node').get(u'declarations'), var.get(u'node'), PyJs_Object_492_) + if var.get(u't').callprop(u'isFor', var.get(u'parent')): + if (PyJsStrictEq(var.get(u'parent').get(u'left'),var.get(u'node')) or PyJsStrictEq(var.get(u'parent').get(u'init'),var.get(u'node'))): + return var.get('undefined') + var.get(u"this").callprop(u'semicolon') + PyJsHoisted_VariableDeclaration_.func_name = u'VariableDeclaration' + var.put(u'VariableDeclaration', PyJsHoisted_VariableDeclaration_) + @Js + def PyJsHoisted_SwitchCase_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'test'): + var.get(u"this").callprop(u'word', Js(u'case')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u':')) + else: + var.get(u"this").callprop(u'word', Js(u'default')) + var.get(u"this").callprop(u'token', Js(u':')) + if var.get(u'node').get(u'consequent').get(u'length'): + var.get(u"this").callprop(u'newline') + PyJs_Object_491_ = Js({u'indent':var.get(u'true')}) + var.get(u"this").callprop(u'printSequence', var.get(u'node').get(u'consequent'), var.get(u'node'), PyJs_Object_491_) + PyJsHoisted_SwitchCase_.func_name = u'SwitchCase' + var.put(u'SwitchCase', PyJsHoisted_SwitchCase_) + @Js + def PyJsHoisted_VariableDeclarator_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'id').get(u'typeAnnotation'), var.get(u'node')) + if var.get(u'node').get(u'init'): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'=')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'init'), var.get(u'node')) + PyJsHoisted_VariableDeclarator_.func_name = u'VariableDeclarator' + var.put(u'VariableDeclarator', PyJsHoisted_VariableDeclarator_) + @Js + def PyJsHoisted_IfStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'needsBlock']) + var.get(u"this").callprop(u'word', Js(u'if')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'test'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'space') + var.put(u'needsBlock', (var.get(u'node').get(u'alternate') and var.get(u't').callprop(u'isIfStatement', var.get(u'getLastStatement')(var.get(u'node').get(u'consequent'))))) + if var.get(u'needsBlock'): + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'indent') + var.get(u"this").callprop(u'printAndIndentOnComments', var.get(u'node').get(u'consequent'), var.get(u'node')) + if var.get(u'needsBlock'): + var.get(u"this").callprop(u'dedent') + var.get(u"this").callprop(u'newline') + var.get(u"this").callprop(u'token', Js(u'}')) + if var.get(u'node').get(u'alternate'): + if var.get(u"this").callprop(u'endsWith', Js(u'}')): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', Js(u'else')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'printAndIndentOnComments', var.get(u'node').get(u'alternate'), var.get(u'node')) + PyJsHoisted_IfStatement_.func_name = u'IfStatement' + var.put(u'IfStatement', PyJsHoisted_IfStatement_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ThrowStatement', var.get(u'exports').put(u'BreakStatement', var.get(u'exports').put(u'ReturnStatement', var.get(u'exports').put(u'ContinueStatement', var.get(u'exports').put(u'ForAwaitStatement', var.get(u'exports').put(u'ForOfStatement', var.get(u'exports').put(u'ForInStatement', var.get(u'undefined')))))))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'WithStatement', var.get(u'WithStatement')) + var.get(u'exports').put(u'IfStatement', var.get(u'IfStatement')) + var.get(u'exports').put(u'ForStatement', var.get(u'ForStatement')) + var.get(u'exports').put(u'WhileStatement', var.get(u'WhileStatement')) + var.get(u'exports').put(u'DoWhileStatement', var.get(u'DoWhileStatement')) + var.get(u'exports').put(u'LabeledStatement', var.get(u'LabeledStatement')) + var.get(u'exports').put(u'TryStatement', var.get(u'TryStatement')) + var.get(u'exports').put(u'CatchClause', var.get(u'CatchClause')) + var.get(u'exports').put(u'SwitchStatement', var.get(u'SwitchStatement')) + var.get(u'exports').put(u'SwitchCase', var.get(u'SwitchCase')) + var.get(u'exports').put(u'DebuggerStatement', var.get(u'DebuggerStatement')) + var.get(u'exports').put(u'VariableDeclaration', var.get(u'VariableDeclaration')) + var.get(u'exports').put(u'VariableDeclarator', var.get(u'VariableDeclarator')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + @Js + def PyJs_buildForXStatement_486_(op, this, arguments, var=var): + var = Scope({u'this':this, u'buildForXStatement':PyJs_buildForXStatement_486_, u'arguments':arguments, u'op':op}, var) + var.registers([u'op']) + @Js + def PyJs_anonymous_487_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', Js(u'for')) + var.get(u"this").callprop(u'space') + if PyJsStrictEq(var.get(u'op'),Js(u'await')): + var.get(u"this").callprop(u'word', Js(u'await')) + var.get(u"this").callprop(u'space') + var.put(u'op', Js(u'of')) + var.get(u"this").callprop(u'token', Js(u'(')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'left'), var.get(u'node')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'word', var.get(u'op')) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'node').get(u'right'), var.get(u'node')) + var.get(u"this").callprop(u'token', Js(u')')) + var.get(u"this").callprop(u'printBlock', var.get(u'node')) + PyJs_anonymous_487_._set_name(u'anonymous') + return PyJs_anonymous_487_ + PyJs_buildForXStatement_486_._set_name(u'buildForXStatement') + var.put(u'buildForXStatement', PyJs_buildForXStatement_486_) + var.put(u'ForInStatement', var.get(u'exports').put(u'ForInStatement', var.get(u'buildForXStatement')(Js(u'in')))) + var.put(u'ForOfStatement', var.get(u'exports').put(u'ForOfStatement', var.get(u'buildForXStatement')(Js(u'of')))) + var.put(u'ForAwaitStatement', var.get(u'exports').put(u'ForAwaitStatement', var.get(u'buildForXStatement')(Js(u'await')))) + pass + pass + var.put(u'ContinueStatement', var.get(u'exports').put(u'ContinueStatement', var.get(u'buildLabelStatement')(Js(u'continue')))) + var.put(u'ReturnStatement', var.get(u'exports').put(u'ReturnStatement', var.get(u'buildLabelStatement')(Js(u'return'), Js(u'argument')))) + var.put(u'BreakStatement', var.get(u'exports').put(u'BreakStatement', var.get(u'buildLabelStatement')(Js(u'break')))) + var.put(u'ThrowStatement', var.get(u'exports').put(u'ThrowStatement', var.get(u'buildLabelStatement')(Js(u'throw'), Js(u'argument')))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_483_._set_name(u'anonymous') +PyJs_Object_493_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_494_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'TaggedTemplateExpression', u'TemplateElement', u'TemplateLiteral']) + @Js + def PyJsHoisted_TemplateElement_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'value', u'parent', u'isFirst', u'isLast']) + var.put(u'isFirst', PyJsStrictEq(var.get(u'parent').get(u'quasis').get(u'0'),var.get(u'node'))) + var.put(u'isLast', PyJsStrictEq(var.get(u'parent').get(u'quasis').get((var.get(u'parent').get(u'quasis').get(u'length')-Js(1.0))),var.get(u'node'))) + var.put(u'value', (((Js(u'`') if var.get(u'isFirst') else Js(u'}'))+var.get(u'node').get(u'value').get(u'raw'))+(Js(u'`') if var.get(u'isLast') else Js(u'${')))) + if var.get(u'isFirst').neg(): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', var.get(u'value')) + if var.get(u'isLast').neg(): + var.get(u"this").callprop(u'space') + PyJsHoisted_TemplateElement_.func_name = u'TemplateElement' + var.put(u'TemplateElement', PyJsHoisted_TemplateElement_) + @Js + def PyJsHoisted_TaggedTemplateExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'tag'), var.get(u'node')) + var.get(u"this").callprop(u'print', var.get(u'node').get(u'quasi'), var.get(u'node')) + PyJsHoisted_TaggedTemplateExpression_.func_name = u'TaggedTemplateExpression' + var.put(u'TaggedTemplateExpression', PyJsHoisted_TaggedTemplateExpression_) + @Js + def PyJsHoisted_TemplateLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'quasis', u'i', u'node']) + var.put(u'quasis', var.get(u'node').get(u'quasis')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)): + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'print', var.get(u'elem'), var.get(u'node')) + if (var.get(u'i')<(var.get(u'len')-Js(1.0))): + var.get(u"this").callprop(u'token', Js(u',')) + else: + var.get(u"this").callprop(u'token', Js(u',')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u"this").callprop(u'token', Js(u']')) + PyJsHoisted_ArrayExpression_.func_name = u'ArrayExpression' + var.put(u'ArrayExpression', PyJsHoisted_ArrayExpression_) + @Js + def PyJsHoisted_BooleanLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', (Js(u'true') if var.get(u'node').get(u'value') else Js(u'false'))) + PyJsHoisted_BooleanLiteral_.func_name = u'BooleanLiteral' + var.put(u'BooleanLiteral', PyJsHoisted_BooleanLiteral_) + @Js + def PyJsHoisted_NumericLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'raw']) + var.put(u'raw', var.get(u"this").callprop(u'getPossibleRaw', var.get(u'node'))) + var.get(u"this").callprop(u'number', ((var.get(u'node').get(u'value')+Js(u'')) if (var.get(u'raw')==var.get(u"null")) else var.get(u'raw'))) + PyJsHoisted_NumericLiteral_.func_name = u'NumericLiteral' + var.put(u'NumericLiteral', PyJsHoisted_NumericLiteral_) + @Js + def PyJsHoisted_ObjectExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'props']) + var.put(u'props', var.get(u'node').get(u'properties')) + var.get(u"this").callprop(u'token', Js(u'{')) + var.get(u"this").callprop(u'printInnerComments', var.get(u'node')) + if var.get(u'props').get(u'length'): + var.get(u"this").callprop(u'space') + PyJs_Object_499_ = Js({u'indent':var.get(u'true'),u'statement':var.get(u'true')}) + var.get(u"this").callprop(u'printList', var.get(u'props'), var.get(u'node'), PyJs_Object_499_) + var.get(u"this").callprop(u'space') + var.get(u"this").callprop(u'token', Js(u'}')) + PyJsHoisted_ObjectExpression_.func_name = u'ObjectExpression' + var.put(u'ObjectExpression', PyJsHoisted_ObjectExpression_) + @Js + def PyJsHoisted_RegExpLiteral_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'word', (((Js(u'/')+var.get(u'node').get(u'pattern'))+Js(u'/'))+var.get(u'node').get(u'flags'))) + PyJsHoisted_RegExpLiteral_.func_name = u'RegExpLiteral' + var.put(u'RegExpLiteral', PyJsHoisted_RegExpLiteral_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_497_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_497_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Identifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'node').get(u'variance'): + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'plus')): + var.get(u"this").callprop(u'token', Js(u'+')) + else: + if PyJsStrictEq(var.get(u'node').get(u'variance'),Js(u'minus')): + var.get(u"this").callprop(u'token', Js(u'-')) + var.get(u"this").callprop(u'word', var.get(u'node').get(u'name')) + PyJsHoisted_Identifier_.func_name = u'Identifier' + var.put(u'Identifier', PyJsHoisted_Identifier_) + @Js + def PyJsHoisted_NullLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'word', Js(u'null')) + PyJsHoisted_NullLiteral_.func_name = u'NullLiteral' + var.put(u'NullLiteral', PyJsHoisted_NullLiteral_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ArrayPattern', var.get(u'exports').put(u'ObjectPattern', var.get(u'exports').put(u'RestProperty', var.get(u'exports').put(u'SpreadProperty', var.get(u'exports').put(u'SpreadElement', var.get(u'undefined')))))) + var.get(u'exports').put(u'Identifier', var.get(u'Identifier')) + var.get(u'exports').put(u'RestElement', var.get(u'RestElement')) + var.get(u'exports').put(u'ObjectExpression', var.get(u'ObjectExpression')) + var.get(u'exports').put(u'ObjectMethod', var.get(u'ObjectMethod')) + var.get(u'exports').put(u'ObjectProperty', var.get(u'ObjectProperty')) + var.get(u'exports').put(u'ArrayExpression', var.get(u'ArrayExpression')) + var.get(u'exports').put(u'RegExpLiteral', var.get(u'RegExpLiteral')) + var.get(u'exports').put(u'BooleanLiteral', var.get(u'BooleanLiteral')) + var.get(u'exports').put(u'NullLiteral', var.get(u'NullLiteral')) + var.get(u'exports').put(u'NumericLiteral', var.get(u'NumericLiteral')) + var.get(u'exports').put(u'StringLiteral', var.get(u'StringLiteral')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_jsesc', var.get(u'require')(Js(u'jsesc'))) + var.put(u'_jsesc2', var.get(u'_interopRequireDefault')(var.get(u'_jsesc'))) + pass + pass + pass + pass + var.get(u'exports').put(u'SpreadElement', var.get(u'RestElement')) + var.get(u'exports').put(u'SpreadProperty', var.get(u'RestElement')) + var.get(u'exports').put(u'RestProperty', var.get(u'RestElement')) + pass + var.get(u'exports').put(u'ObjectPattern', var.get(u'ObjectExpression')) + pass + pass + pass + var.get(u'exports').put(u'ArrayPattern', var.get(u'ArrayExpression')) + pass + pass + pass + pass + pass +PyJs_anonymous_496_._set_name(u'anonymous') +PyJs_Object_501_ = Js({u'babel-types':Js(258.0),u'jsesc':Js(283.0)}) +@Js +def PyJs_anonymous_502_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'Generator', u'_sourceMap', u'_detectIndent2', u'module', u'_interopRequireDefault', u'_printer2', u'normalizeOptions', u'findCommonStringDelimiter', u'_possibleConstructorReturn3', u'_possibleConstructorReturn2', u'_classCallCheck3', u'_classCallCheck2', u'_detectIndent', u'_babelMessages', u'exports', u'_printer', u'_interopRequireWildcard', u'_inherits3', u'_inherits2', u'require', u'CodeGenerator', u'messages', u'_sourceMap2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_505_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_505_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_findCommonStringDelimiter_(code, tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'checked', u'i', u'tokens', u'raw', u'token', u'DEFAULT_STRING_DELIMITER', u'occurences']) + var.put(u'DEFAULT_STRING_DELIMITER', Js(u'double')) + if var.get(u'code').neg(): + return var.get(u'DEFAULT_STRING_DELIMITER') + PyJs_Object_513_ = Js({u'single':Js(0.0),u'double':Js(0.0)}) + var.put(u'occurences', PyJs_Object_513_) + var.put(u'checked', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(3.0)): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if (var.get(u'occurences').get(u'single')>var.get(u'occurences').get(u'double')): + return Js(u'single') + else: + return Js(u'double') + PyJsHoisted_findCommonStringDelimiter_.func_name = u'findCommonStringDelimiter' + var.put(u'findCommonStringDelimiter', PyJsHoisted_findCommonStringDelimiter_) + @Js + def PyJsHoisted_normalizeOptions_(code, opts, tokens, this, arguments, var=var): + var = Scope({u'tokens':tokens, u'this':this, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'style', u'code', u'indent', u'format', u'tokens', u'opts']) + var.put(u'style', Js(u' ')) + if (var.get(u'code') and PyJsStrictEq(var.get(u'code',throw=False).typeof(),Js(u'string'))): + var.put(u'indent', PyJsComma(Js(0.0),var.get(u'_detectIndent2').get(u'default'))(var.get(u'code')).get(u'indent')) + if (var.get(u'indent') and PyJsStrictNeq(var.get(u'indent'),Js(u' '))): + var.put(u'style', var.get(u'indent')) + PyJs_Object_510_ = Js({u'adjustMultilineComment':var.get(u'true'),u'style':var.get(u'style'),u'base':Js(0.0)}) + PyJs_Object_509_ = Js({u'auxiliaryCommentBefore':var.get(u'opts').get(u'auxiliaryCommentBefore'),u'auxiliaryCommentAfter':var.get(u'opts').get(u'auxiliaryCommentAfter'),u'shouldPrintComment':var.get(u'opts').get(u'shouldPrintComment'),u'retainLines':var.get(u'opts').get(u'retainLines'),u'retainFunctionParens':var.get(u'opts').get(u'retainFunctionParens'),u'comments':((var.get(u'opts').get(u'comments')==var.get(u"null")) or var.get(u'opts').get(u'comments')),u'compact':var.get(u'opts').get(u'compact'),u'minified':var.get(u'opts').get(u'minified'),u'concise':var.get(u'opts').get(u'concise'),u'quotes':(var.get(u'opts').get(u'quotes') or var.get(u'findCommonStringDelimiter')(var.get(u'code'), var.get(u'tokens'))),u'indent':PyJs_Object_510_}) + var.put(u'format', PyJs_Object_509_) + if var.get(u'format').get(u'minified'): + var.get(u'format').put(u'compact', var.get(u'true')) + @Js + def PyJs_anonymous_511_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'format').get(u'comments') + PyJs_anonymous_511_._set_name(u'anonymous') + var.get(u'format').put(u'shouldPrintComment', (var.get(u'format').get(u'shouldPrintComment') or PyJs_anonymous_511_)) + else: + @Js + def PyJs_anonymous_512_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'format').get(u'comments') or (var.get(u'value').callprop(u'indexOf', Js(u'@license'))>=Js(0.0))) or (var.get(u'value').callprop(u'indexOf', Js(u'@preserve'))>=Js(0.0))) + PyJs_anonymous_512_._set_name(u'anonymous') + var.get(u'format').put(u'shouldPrintComment', (var.get(u'format').get(u'shouldPrintComment') or PyJs_anonymous_512_)) + if PyJsStrictEq(var.get(u'format').get(u'compact'),Js(u'auto')): + var.get(u'format').put(u'compact', (var.get(u'code').get(u'length')>Js(100000.0))) + if var.get(u'format').get(u'compact'): + var.get(u'console').callprop(u'error', (Js(u'[BABEL] ')+var.get(u'messages').callprop(u'get', Js(u'codeGeneratorDeopt'), var.get(u'opts').get(u'filename'), Js(u'100KB')))) + if var.get(u'format').get(u'compact'): + var.get(u'format').get(u'indent').put(u'adjustMultilineComment', Js(False)) + return var.get(u'format') + PyJsHoisted_normalizeOptions_.func_name = u'normalizeOptions' + var.put(u'normalizeOptions', PyJsHoisted_normalizeOptions_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_504_ = Js({}) + var.put(u'newObj', PyJs_Object_504_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'CodeGenerator', var.get(u'undefined')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_possibleConstructorReturn2', var.get(u'require')(Js(u'babel-runtime/helpers/possibleConstructorReturn'))) + var.put(u'_possibleConstructorReturn3', var.get(u'_interopRequireDefault')(var.get(u'_possibleConstructorReturn2'))) + var.put(u'_inherits2', var.get(u'require')(Js(u'babel-runtime/helpers/inherits'))) + var.put(u'_inherits3', var.get(u'_interopRequireDefault')(var.get(u'_inherits2'))) + @Js + def PyJs_anonymous_503_(ast, opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'ast':ast}, var) + var.registers([u'code', u'gen', u'opts', u'ast']) + var.put(u'gen', var.get(u'Generator').create(var.get(u'ast'), var.get(u'opts'), var.get(u'code'))) + return var.get(u'gen').callprop(u'generate') + PyJs_anonymous_503_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_503_) + var.put(u'_detectIndent', var.get(u'require')(Js(u'detect-indent'))) + var.put(u'_detectIndent2', var.get(u'_interopRequireDefault')(var.get(u'_detectIndent'))) + var.put(u'_sourceMap', var.get(u'require')(Js(u'./source-map'))) + var.put(u'_sourceMap2', var.get(u'_interopRequireDefault')(var.get(u'_sourceMap'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_printer', var.get(u'require')(Js(u'./printer'))) + var.put(u'_printer2', var.get(u'_interopRequireDefault')(var.get(u'_printer'))) + pass + pass + @Js + def PyJs_anonymous_506_(_Printer, this, arguments, var=var): + var = Scope({u'this':this, u'_Printer':_Printer, u'arguments':arguments}, var) + var.registers([u'_Printer', u'Generator']) + @Js + def PyJsHoisted_Generator_(ast, opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'ast':ast}, var) + var.registers([u'map', u'code', u'_this', u'ast', u'format', u'tokens', u'opts']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Generator')) + PyJs_Object_507_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_507_)) + var.put(u'tokens', (var.get(u'ast').get(u'tokens') or Js([]))) + var.put(u'format', var.get(u'normalizeOptions')(var.get(u'code'), var.get(u'opts'), var.get(u'tokens'))) + var.put(u'map', (var.get(u'_sourceMap2').get(u'default').create(var.get(u'opts'), var.get(u'code')) if var.get(u'opts').get(u'sourceMaps') else var.get(u"null"))) + var.put(u'_this', PyJsComma(Js(0.0),var.get(u'_possibleConstructorReturn3').get(u'default'))(var.get(u"this"), var.get(u'_Printer').callprop(u'call', var.get(u"this"), var.get(u'format'), var.get(u'map'), var.get(u'tokens')))) + var.get(u'_this').put(u'ast', var.get(u'ast')) + return var.get(u'_this') + PyJsHoisted_Generator_.func_name = u'Generator' + var.put(u'Generator', PyJsHoisted_Generator_) + PyJsComma(Js(0.0),var.get(u'_inherits3').get(u'default'))(var.get(u'Generator'), var.get(u'_Printer')) + pass + @Js + def PyJs_generate_508_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generate':PyJs_generate_508_}, var) + var.registers([]) + return var.get(u'_Printer').get(u'prototype').get(u'generate').callprop(u'call', var.get(u"this"), var.get(u"this").get(u'ast')) + PyJs_generate_508_._set_name(u'generate') + var.get(u'Generator').get(u'prototype').put(u'generate', PyJs_generate_508_) + return var.get(u'Generator') + PyJs_anonymous_506_._set_name(u'anonymous') + var.put(u'Generator', PyJs_anonymous_506_(var.get(u'_printer2').get(u'default'))) + pass + pass + @Js + def PyJs_anonymous_514_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'CodeGenerator']) + @Js + def PyJsHoisted_CodeGenerator_(ast, opts, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts, u'ast':ast}, var) + var.registers([u'code', u'opts', u'ast']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'CodeGenerator')) + var.get(u"this").put(u'_generator', var.get(u'Generator').create(var.get(u'ast'), var.get(u'opts'), var.get(u'code'))) + PyJsHoisted_CodeGenerator_.func_name = u'CodeGenerator' + var.put(u'CodeGenerator', PyJsHoisted_CodeGenerator_) + pass + @Js + def PyJs_generate_515_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generate':PyJs_generate_515_}, var) + var.registers([]) + return var.get(u"this").get(u'_generator').callprop(u'generate') + PyJs_generate_515_._set_name(u'generate') + var.get(u'CodeGenerator').get(u'prototype').put(u'generate', PyJs_generate_515_) + return var.get(u'CodeGenerator') + PyJs_anonymous_514_._set_name(u'anonymous') + var.put(u'CodeGenerator', var.get(u'exports').put(u'CodeGenerator', PyJs_anonymous_514_())) +PyJs_anonymous_502_._set_name(u'anonymous') +PyJs_Object_516_ = Js({u'./printer':Js(44.0),u'./source-map':Js(45.0),u'babel-messages':Js(57.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-runtime/helpers/inherits':Js(111.0),u'babel-runtime/helpers/possibleConstructorReturn':Js(113.0),u'detect-indent':Js(271.0)}) +@Js +def PyJs_anonymous_517_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'needsParens', u'module', u'_parentheses', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'find', u'needsWhitespaceBefore', u'_keys', u'parens', u'exports', u'expandedWhitespaceNodes', u'_interopRequireWildcard', u'_babelTypes', u'expandAliases', u'needsWhitespace', u'_keys2', u'_whitespace2', u'expandedParens', u'expandedWhitespaceList', u'require', u'isOrHasCallExpression', u'_whitespace', u't', u'needsWhitespaceAfter']) + @Js + def PyJsHoisted_needsParens_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + if var.get(u'parent').neg(): + return Js(False) + if (var.get(u't').callprop(u'isNewExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'callee'),var.get(u'node'))): + if var.get(u'isOrHasCallExpression')(var.get(u'node')): + return var.get(u'true') + return var.get(u'find')(var.get(u'expandedParens'), var.get(u'node'), var.get(u'parent'), var.get(u'printStack')) + PyJsHoisted_needsParens_.func_name = u'needsParens' + var.put(u'needsParens', PyJsHoisted_needsParens_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_518_ = Js({}) + var.put(u'newObj', PyJs_Object_518_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_needsWhitespaceBefore_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + return var.get(u'needsWhitespace')(var.get(u'node'), var.get(u'parent'), Js(u'before')) + PyJsHoisted_needsWhitespaceBefore_.func_name = u'needsWhitespaceBefore' + var.put(u'needsWhitespaceBefore', PyJsHoisted_needsWhitespaceBefore_) + @Js + def PyJsHoisted_expandAliases_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'_isArray2', u'_ref2', u'_i2', u'newObj', u'alias', u'add', u'_i', u'obj', u'_ref', u'_iterator2', u'type', u'aliases']) + @Js + def PyJsHoisted_add_(type, func, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'func':func}, var) + var.registers([u'type', u'func', u'fn']) + var.put(u'fn', var.get(u'newObj').get(var.get(u'type'))) + @Js + def PyJs_anonymous_521_(node, parent, stack, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'stack':stack, u'parent':parent, u'arguments':arguments}, var) + var.registers([u'node', u'result', u'parent', u'stack']) + var.put(u'result', var.get(u'fn')(var.get(u'node'), var.get(u'parent'), var.get(u'stack'))) + return (var.get(u'func')(var.get(u'node'), var.get(u'parent'), var.get(u'stack')) if (var.get(u'result')==var.get(u"null")) else var.get(u'result')) + PyJs_anonymous_521_._set_name(u'anonymous') + var.get(u'newObj').put(var.get(u'type'), (PyJs_anonymous_521_ if var.get(u'fn') else var.get(u'func'))) + PyJsHoisted_add_.func_name = u'add' + var.put(u'add', PyJsHoisted_add_) + PyJs_Object_520_ = Js({}) + var.put(u'newObj', PyJs_Object_520_) + pass + #for JS loop + var.put(u'_iterator', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'obj'))) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'type', var.get(u'_ref')) + var.put(u'aliases', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'type'))) + if var.get(u'aliases'): + #for JS loop + var.put(u'_iterator2', var.get(u'aliases')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'alias', var.get(u'_ref2')) + var.get(u'add')(var.get(u'alias'), var.get(u'obj').get(var.get(u'type'))) + + else: + var.get(u'add')(var.get(u'type'), var.get(u'obj').get(var.get(u'type'))) + + return var.get(u'newObj') + PyJsHoisted_expandAliases_.func_name = u'expandAliases' + var.put(u'expandAliases', PyJsHoisted_expandAliases_) + @Js + def PyJsHoisted_needsWhitespace_(node, parent, type, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'type':type, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent', u'i', u'items', u'linesInfo', u'type']) + if var.get(u'node').neg(): + return Js(0.0) + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'node')): + var.put(u'node', var.get(u'node').get(u'expression')) + var.put(u'linesInfo', var.get(u'find')(var.get(u'expandedWhitespaceNodes'), var.get(u'node'), var.get(u'parent'))) + if var.get(u'linesInfo').neg(): + var.put(u'items', var.get(u'find')(var.get(u'expandedWhitespaceList'), var.get(u'node'), var.get(u'parent'))) + if var.get(u'items'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')var.get(u'nodePos')): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'parentPos'),var.get(u'nodePos')) and PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node'))) and var.get(u't').callprop(u'isLogicalExpression', var.get(u'parent')).neg()): + return var.get(u'true') + return Js(False) + PyJsHoisted_Binary_.func_name = u'Binary' + var.put(u'Binary', PyJsHoisted_Binary_) + @Js + def PyJsHoisted_SequenceExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isForStatement', var.get(u'parent')): + return Js(False) + if (var.get(u't').callprop(u'isExpressionStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'expression'),var.get(u'node'))): + return Js(False) + if var.get(u't').callprop(u'isReturnStatement', var.get(u'parent')): + return Js(False) + if var.get(u't').callprop(u'isThrowStatement', var.get(u'parent')): + return Js(False) + if (var.get(u't').callprop(u'isSwitchStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'discriminant'),var.get(u'node'))): + return Js(False) + if (var.get(u't').callprop(u'isWhileStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'test'),var.get(u'node'))): + return Js(False) + if (var.get(u't').callprop(u'isIfStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'test'),var.get(u'node'))): + return Js(False) + if (var.get(u't').callprop(u'isForInStatement', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node'))): + return Js(False) + return var.get(u'true') + PyJsHoisted_SequenceExpression_.func_name = u'SequenceExpression' + var.put(u'SequenceExpression', PyJsHoisted_SequenceExpression_) + @Js + def PyJsHoisted_ArrowFunctionExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isExportDeclaration', var.get(u'parent')): + return var.get(u'true') + if (var.get(u't').callprop(u'isBinaryExpression', var.get(u'parent')) or var.get(u't').callprop(u'isLogicalExpression', var.get(u'parent'))): + return var.get(u'true') + if var.get(u't').callprop(u'isUnaryExpression', var.get(u'parent')): + return var.get(u'true') + return var.get(u'UnaryLike')(var.get(u'node'), var.get(u'parent')) + PyJsHoisted_ArrowFunctionExpression_.func_name = u'ArrowFunctionExpression' + var.put(u'ArrowFunctionExpression', PyJsHoisted_ArrowFunctionExpression_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_524_ = Js({}) + var.put(u'newObj', PyJs_Object_524_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_ClassExpression_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + PyJs_Object_528_ = Js({u'considerDefaultExports':var.get(u'true')}) + return var.get(u'isFirstInStatement')(var.get(u'printStack'), PyJs_Object_528_) + PyJsHoisted_ClassExpression_.func_name = u'ClassExpression' + var.put(u'ClassExpression', PyJsHoisted_ClassExpression_) + @Js + def PyJsHoisted_ConditionalExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isUnaryLike', var.get(u'parent')): + return var.get(u'true') + if var.get(u't').callprop(u'isBinary', var.get(u'parent')): + return var.get(u'true') + PyJs_Object_533_ = Js({u'test':var.get(u'node')}) + if var.get(u't').callprop(u'isConditionalExpression', var.get(u'parent'), PyJs_Object_533_): + return var.get(u'true') + return var.get(u'UnaryLike')(var.get(u'node'), var.get(u'parent')) + PyJsHoisted_ConditionalExpression_.func_name = u'ConditionalExpression' + var.put(u'ConditionalExpression', PyJsHoisted_ConditionalExpression_) + @Js + def PyJsHoisted_FunctionExpression_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + PyJs_Object_532_ = Js({u'considerDefaultExports':var.get(u'true')}) + return var.get(u'isFirstInStatement')(var.get(u'printStack'), PyJs_Object_532_) + PyJsHoisted_FunctionExpression_.func_name = u'FunctionExpression' + var.put(u'FunctionExpression', PyJsHoisted_FunctionExpression_) + @Js + def PyJsHoisted_UpdateExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_UpdateExpression_.func_name = u'UpdateExpression' + var.put(u'UpdateExpression', PyJsHoisted_UpdateExpression_) + @Js + def PyJsHoisted_YieldExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + def PyJs_LONG_527_(var=var): + return (((((var.get(u't').callprop(u'isBinary', var.get(u'parent')) or var.get(u't').callprop(u'isUnaryLike', var.get(u'parent'))) or var.get(u't').callprop(u'isCallExpression', var.get(u'parent'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'))) or var.get(u't').callprop(u'isNewExpression', var.get(u'parent'))) or (var.get(u't').callprop(u'isConditionalExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'node'),var.get(u'parent').get(u'test')))) + return PyJs_LONG_527_() + PyJsHoisted_YieldExpression_.func_name = u'YieldExpression' + var.put(u'YieldExpression', PyJsHoisted_YieldExpression_) + @Js + def PyJsHoisted_ObjectExpression_(node, parent, printStack, this, arguments, var=var): + var = Scope({u'node':node, u'printStack':printStack, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'printStack', u'parent']) + PyJs_Object_526_ = Js({u'considerArrow':var.get(u'true')}) + return var.get(u'isFirstInStatement')(var.get(u'printStack'), PyJs_Object_526_) + PyJsHoisted_ObjectExpression_.func_name = u'ObjectExpression' + var.put(u'ObjectExpression', PyJsHoisted_ObjectExpression_) + @Js + def PyJsHoisted_BinaryExpression_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'in')): + if var.get(u't').callprop(u'isVariableDeclarator', var.get(u'parent')): + return var.get(u'true') + if var.get(u't').callprop(u'isFor', var.get(u'parent')): + return var.get(u'true') + return Js(False) + PyJsHoisted_BinaryExpression_.func_name = u'BinaryExpression' + var.put(u'BinaryExpression', PyJsHoisted_BinaryExpression_) + @Js + def PyJsHoisted_AssignmentExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isObjectPattern', var.get(u'node').get(u'left')): + return var.get(u'true') + else: + return var.get(u'ConditionalExpression').callprop(u'apply', var.get(u'undefined'), var.get(u'arguments')) + PyJsHoisted_AssignmentExpression_.func_name = u'AssignmentExpression' + var.put(u'AssignmentExpression', PyJsHoisted_AssignmentExpression_) + @Js + def PyJsHoisted_isFirstInStatement_(printStack, this, arguments, var=var): + var = Scope({u'this':this, u'printStack':printStack, u'arguments':arguments}, var) + var.registers([u'_ref$considerArrow', u'node', u'considerDefaultExports', u'parent', u'i', u'printStack', u'_ref$considerDefaultE', u'considerArrow', u'_ref']) + PyJs_Object_534_ = Js({}) + var.put(u'_ref', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_534_)) + var.put(u'_ref$considerArrow', var.get(u'_ref').get(u'considerArrow')) + var.put(u'considerArrow', (Js(False) if PyJsStrictEq(var.get(u'_ref$considerArrow'),var.get(u'undefined')) else var.get(u'_ref$considerArrow'))) + var.put(u'_ref$considerDefaultE', var.get(u'_ref').get(u'considerDefaultExports')) + var.put(u'considerDefaultExports', (Js(False) if PyJsStrictEq(var.get(u'_ref$considerDefaultE'),var.get(u'undefined')) else var.get(u'_ref$considerDefaultE'))) + var.put(u'i', (var.get(u'printStack').get(u'length')-Js(1.0))) + var.put(u'node', var.get(u'printStack').get(var.get(u'i'))) + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + var.put(u'parent', var.get(u'printStack').get(var.get(u'i'))) + while (var.get(u'i')>Js(0.0)): + PyJs_Object_535_ = Js({u'expression':var.get(u'node')}) + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'parent'), PyJs_Object_535_): + return var.get(u'true') + PyJs_Object_536_ = Js({u'declaration':var.get(u'node')}) + if (var.get(u'considerDefaultExports') and var.get(u't').callprop(u'isExportDefaultDeclaration', var.get(u'parent'), PyJs_Object_536_)): + return var.get(u'true') + PyJs_Object_537_ = Js({u'body':var.get(u'node')}) + if (var.get(u'considerArrow') and var.get(u't').callprop(u'isArrowFunctionExpression', var.get(u'parent'), PyJs_Object_537_)): + return var.get(u'true') + def PyJs_LONG_541_(var=var): + PyJs_Object_538_ = Js({u'callee':var.get(u'node')}) + PyJs_Object_539_ = Js({u'object':var.get(u'node')}) + PyJs_Object_540_ = Js({u'test':var.get(u'node')}) + return (((var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_538_) or (var.get(u't').callprop(u'isSequenceExpression', var.get(u'parent')) and PyJsStrictEq(var.get(u'parent').get(u'expressions').get(u'0'),var.get(u'node')))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'), PyJs_Object_539_)) or var.get(u't').callprop(u'isConditional', var.get(u'parent'), PyJs_Object_540_)) + PyJs_Object_542_ = Js({u'left':var.get(u'node')}) + PyJs_Object_543_ = Js({u'left':var.get(u'node')}) + if ((PyJs_LONG_541_() or var.get(u't').callprop(u'isBinary', var.get(u'parent'), PyJs_Object_542_)) or var.get(u't').callprop(u'isAssignmentExpression', var.get(u'parent'), PyJs_Object_543_)): + var.put(u'node', var.get(u'parent')) + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + var.put(u'parent', var.get(u'printStack').get(var.get(u'i'))) + else: + return Js(False) + return Js(False) + PyJsHoisted_isFirstInStatement_.func_name = u'isFirstInStatement' + var.put(u'isFirstInStatement', PyJsHoisted_isFirstInStatement_) + @Js + def PyJsHoisted_UnaryLike_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + PyJs_Object_529_ = Js({u'object':var.get(u'node')}) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'parent'), PyJs_Object_529_): + return var.get(u'true') + PyJs_Object_530_ = Js({u'callee':var.get(u'node')}) + PyJs_Object_531_ = Js({u'callee':var.get(u'node')}) + if (var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_530_) or var.get(u't').callprop(u'isNewExpression', var.get(u'parent'), PyJs_Object_531_)): + return var.get(u'true') + return Js(False) + PyJsHoisted_UnaryLike_.func_name = u'UnaryLike' + var.put(u'UnaryLike', PyJsHoisted_UnaryLike_) + @Js + def PyJsHoisted_NullableTypeAnnotation_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + return var.get(u't').callprop(u'isArrayTypeAnnotation', var.get(u'parent')) + PyJsHoisted_NullableTypeAnnotation_.func_name = u'NullableTypeAnnotation' + var.put(u'NullableTypeAnnotation', PyJsHoisted_NullableTypeAnnotation_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'AwaitExpression', var.get(u'exports').put(u'FunctionTypeAnnotation', var.get(u'undefined'))) + var.get(u'exports').put(u'NullableTypeAnnotation', var.get(u'NullableTypeAnnotation')) + var.get(u'exports').put(u'UpdateExpression', var.get(u'UpdateExpression')) + var.get(u'exports').put(u'ObjectExpression', var.get(u'ObjectExpression')) + var.get(u'exports').put(u'Binary', var.get(u'Binary')) + var.get(u'exports').put(u'BinaryExpression', var.get(u'BinaryExpression')) + var.get(u'exports').put(u'SequenceExpression', var.get(u'SequenceExpression')) + var.get(u'exports').put(u'YieldExpression', var.get(u'YieldExpression')) + var.get(u'exports').put(u'ClassExpression', var.get(u'ClassExpression')) + var.get(u'exports').put(u'UnaryLike', var.get(u'UnaryLike')) + var.get(u'exports').put(u'FunctionExpression', var.get(u'FunctionExpression')) + var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'ArrowFunctionExpression')) + var.get(u'exports').put(u'ConditionalExpression', var.get(u'ConditionalExpression')) + var.get(u'exports').put(u'AssignmentExpression', var.get(u'AssignmentExpression')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + PyJs_Object_525_ = Js({u'||':Js(0.0),u'&&':Js(1.0),u'|':Js(2.0),u'^':Js(3.0),u'&':Js(4.0),u'==':Js(5.0),u'===':Js(5.0),u'!=':Js(5.0),u'!==':Js(5.0),u'<':Js(6.0),u'>':Js(6.0),u'<=':Js(6.0),u'>=':Js(6.0),u'in':Js(6.0),u'instanceof':Js(6.0),u'>>':Js(7.0),u'<<':Js(7.0),u'>>>':Js(7.0),u'+':Js(8.0),u'-':Js(8.0),u'*':Js(9.0),u'/':Js(9.0),u'%':Js(9.0),u'**':Js(10.0)}) + var.put(u'PRECEDENCE', PyJs_Object_525_) + pass + var.get(u'exports').put(u'FunctionTypeAnnotation', var.get(u'NullableTypeAnnotation')) + pass + pass + pass + pass + pass + pass + var.get(u'exports').put(u'AwaitExpression', var.get(u'YieldExpression')) + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_523_._set_name(u'anonymous') +PyJs_Object_544_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_545_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isHelper', u'exports', u'_babelTypes', u'_each', u'_interopRequireWildcard', u'_map', u'require', u'_isBoolean', u'module', u'_each2', u'_isBoolean2', u'isType', u'_interopRequireDefault', u'crawl', u'_map2', u't']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_547_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_547_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isHelper_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + return (var.get(u'isHelper')(var.get(u'node').get(u'object')) or var.get(u'isHelper')(var.get(u'node').get(u'property'))) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + return (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'require')) or PyJsStrictEq(var.get(u'node').get(u'name').get(u'0'),Js(u'_'))) + else: + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + return var.get(u'isHelper')(var.get(u'node').get(u'callee')) + else: + if (var.get(u't').callprop(u'isBinary', var.get(u'node')) or var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node'))): + return ((var.get(u't').callprop(u'isIdentifier', var.get(u'node').get(u'left')) and var.get(u'isHelper')(var.get(u'node').get(u'left'))) or var.get(u'isHelper')(var.get(u'node').get(u'right'))) + else: + return Js(False) + PyJsHoisted_isHelper_.func_name = u'isHelper' + var.put(u'isHelper', PyJsHoisted_isHelper_) + @Js + def PyJsHoisted_crawl_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'state']) + PyJs_Object_548_ = Js({}) + var.put(u'state', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_548_)) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + var.get(u'crawl')(var.get(u'node').get(u'object'), var.get(u'state')) + if var.get(u'node').get(u'computed'): + var.get(u'crawl')(var.get(u'node').get(u'property'), var.get(u'state')) + else: + if (var.get(u't').callprop(u'isBinary', var.get(u'node')) or var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node'))): + var.get(u'crawl')(var.get(u'node').get(u'left'), var.get(u'state')) + var.get(u'crawl')(var.get(u'node').get(u'right'), var.get(u'state')) + else: + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + var.get(u'state').put(u'hasCall', var.get(u'true')) + var.get(u'crawl')(var.get(u'node').get(u'callee'), var.get(u'state')) + else: + if var.get(u't').callprop(u'isFunction', var.get(u'node')): + var.get(u'state').put(u'hasFunction', var.get(u'true')) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.get(u'state').put(u'hasHelper', (var.get(u'state').get(u'hasHelper') or var.get(u'isHelper')(var.get(u'node').get(u'callee')))) + return var.get(u'state') + PyJsHoisted_crawl_.func_name = u'crawl' + var.put(u'crawl', PyJsHoisted_crawl_) + @Js + def PyJsHoisted_isType_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return ((((var.get(u't').callprop(u'isLiteral', var.get(u'node')) or var.get(u't').callprop(u'isObjectExpression', var.get(u'node'))) or var.get(u't').callprop(u'isArrayExpression', var.get(u'node'))) or var.get(u't').callprop(u'isIdentifier', var.get(u'node'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'node'))) + PyJsHoisted_isType_.func_name = u'isType' + var.put(u'isType', PyJsHoisted_isType_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_546_ = Js({}) + var.put(u'newObj', PyJs_Object_546_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_isBoolean', var.get(u'require')(Js(u'lodash/isBoolean'))) + var.put(u'_isBoolean2', var.get(u'_interopRequireDefault')(var.get(u'_isBoolean'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_map', var.get(u'require')(Js(u'lodash/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + @Js + def PyJs_AssignmentExpression_550_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'AssignmentExpression':PyJs_AssignmentExpression_550_}, var) + var.registers([u'node', u'state']) + var.put(u'state', var.get(u'crawl')(var.get(u'node').get(u'right'))) + if ((var.get(u'state').get(u'hasCall') and var.get(u'state').get(u'hasHelper')) or var.get(u'state').get(u'hasFunction')): + PyJs_Object_551_ = Js({u'before':var.get(u'state').get(u'hasFunction'),u'after':var.get(u'true')}) + return PyJs_Object_551_ + PyJs_AssignmentExpression_550_._set_name(u'AssignmentExpression') + @Js + def PyJs_SwitchCase_552_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'SwitchCase':PyJs_SwitchCase_552_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + PyJs_Object_553_ = Js({u'before':(var.get(u'node').get(u'consequent').get(u'length') or PyJsStrictEq(var.get(u'parent').get(u'cases').get(u'0'),var.get(u'node')))}) + return PyJs_Object_553_ + PyJs_SwitchCase_552_._set_name(u'SwitchCase') + @Js + def PyJs_LogicalExpression_554_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'LogicalExpression':PyJs_LogicalExpression_554_}, var) + var.registers([u'node']) + if (var.get(u't').callprop(u'isFunction', var.get(u'node').get(u'left')) or var.get(u't').callprop(u'isFunction', var.get(u'node').get(u'right'))): + PyJs_Object_555_ = Js({u'after':var.get(u'true')}) + return PyJs_Object_555_ + PyJs_LogicalExpression_554_._set_name(u'LogicalExpression') + @Js + def PyJs_Literal_556_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'Literal':PyJs_Literal_556_, u'arguments':arguments}, var) + var.registers([u'node']) + if PyJsStrictEq(var.get(u'node').get(u'value'),Js(u'use strict')): + PyJs_Object_557_ = Js({u'after':var.get(u'true')}) + return PyJs_Object_557_ + PyJs_Literal_556_._set_name(u'Literal') + @Js + def PyJs_CallExpression_558_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_558_}, var) + var.registers([u'node']) + if (var.get(u't').callprop(u'isFunction', var.get(u'node').get(u'callee')) or var.get(u'isHelper')(var.get(u'node'))): + PyJs_Object_559_ = Js({u'before':var.get(u'true'),u'after':var.get(u'true')}) + return PyJs_Object_559_ + PyJs_CallExpression_558_._set_name(u'CallExpression') + @Js + def PyJs_VariableDeclaration_560_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_560_}, var) + var.registers([u'i', u'node', u'state', u'declar', u'enabled']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)) else var.get(u"null"))) + PyJsHoisted_Printer_.func_name = u'Printer' + var.put(u'Printer', PyJsHoisted_Printer_) + pass + @Js + def PyJs_generate_582_(ast, this, arguments, var=var): + var = Scope({u'this':this, u'generate':PyJs_generate_582_, u'arguments':arguments, u'ast':ast}, var) + var.registers([u'ast']) + var.get(u"this").callprop(u'print', var.get(u'ast')) + var.get(u"this").callprop(u'_maybeAddAuxComment') + return var.get(u"this").get(u'_buf').callprop(u'get') + PyJs_generate_582_._set_name(u'generate') + var.get(u'Printer').get(u'prototype').put(u'generate', PyJs_generate_582_) + @Js + def PyJs_indent_583_(this, arguments, var=var): + var = Scope({u'this':this, u'indent':PyJs_indent_583_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'format').get(u'compact') or var.get(u"this").get(u'format').get(u'concise')): + return var.get('undefined') + (var.get(u"this").put(u'_indent',Js(var.get(u"this").get(u'_indent').to_number())+Js(1))-Js(1)) + PyJs_indent_583_._set_name(u'indent') + var.get(u'Printer').get(u'prototype').put(u'indent', PyJs_indent_583_) + @Js + def PyJs_dedent_584_(this, arguments, var=var): + var = Scope({u'this':this, u'dedent':PyJs_dedent_584_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'format').get(u'compact') or var.get(u"this").get(u'format').get(u'concise')): + return var.get('undefined') + (var.get(u"this").put(u'_indent',Js(var.get(u"this").get(u'_indent').to_number())-Js(1))+Js(1)) + PyJs_dedent_584_._set_name(u'dedent') + var.get(u'Printer').get(u'prototype').put(u'dedent', PyJs_dedent_584_) + @Js + def PyJs_semicolon_585_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'semicolon':PyJs_semicolon_585_}, var) + var.registers([u'force']) + var.put(u'force', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(False))) + var.get(u"this").callprop(u'_maybeAddAuxComment') + var.get(u"this").callprop(u'_append', Js(u';'), var.get(u'force').neg()) + PyJs_semicolon_585_._set_name(u'semicolon') + var.get(u'Printer').get(u'prototype').put(u'semicolon', PyJs_semicolon_585_) + @Js + def PyJs_rightBrace_586_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'rightBrace':PyJs_rightBrace_586_}, var) + var.registers([]) + if var.get(u"this").get(u'format').get(u'minified'): + var.get(u"this").get(u'_buf').callprop(u'removeLastSemicolon') + var.get(u"this").callprop(u'token', Js(u'}')) + PyJs_rightBrace_586_._set_name(u'rightBrace') + var.get(u'Printer').get(u'prototype').put(u'rightBrace', PyJs_rightBrace_586_) + @Js + def PyJs_space_587_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'space':PyJs_space_587_}, var) + var.registers([u'force']) + var.put(u'force', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(False))) + if var.get(u"this").get(u'format').get(u'compact'): + return var.get('undefined') + if (((var.get(u"this").get(u'_buf').callprop(u'hasContent') and var.get(u"this").callprop(u'endsWith', Js(u' ')).neg()) and var.get(u"this").callprop(u'endsWith', Js(u'\n')).neg()) or var.get(u'force')): + var.get(u"this").callprop(u'_space') + PyJs_space_587_._set_name(u'space') + var.get(u'Printer').get(u'prototype').put(u'space', PyJs_space_587_) + @Js + def PyJs_word_588_(str, this, arguments, var=var): + var = Scope({u'this':this, u'word':PyJs_word_588_, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if var.get(u"this").get(u'_endsWithWord'): + var.get(u"this").callprop(u'_space') + var.get(u"this").callprop(u'_maybeAddAuxComment') + var.get(u"this").callprop(u'_append', var.get(u'str')) + var.get(u"this").put(u'_endsWithWord', var.get(u'true')) + PyJs_word_588_._set_name(u'word') + var.get(u'Printer').get(u'prototype').put(u'word', PyJs_word_588_) + @Js + def PyJs_number_589_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str, u'number':PyJs_number_589_}, var) + var.registers([u'str']) + var.get(u"this").callprop(u'word', var.get(u'str')) + def PyJs_LONG_590_(var=var): + return ((((PyJsComma(Js(0.0),var.get(u'_isInteger2').get(u'default'))((+var.get(u'str'))) and var.get(u'NON_DECIMAL_LITERAL').callprop(u'test', var.get(u'str')).neg()) and var.get(u'SCIENTIFIC_NOTATION').callprop(u'test', var.get(u'str')).neg()) and var.get(u'ZERO_DECIMAL_INTEGER').callprop(u'test', var.get(u'str')).neg()) and PyJsStrictNeq(var.get(u'str').get((var.get(u'str').get(u'length')-Js(1.0))),Js(u'.'))) + var.get(u"this").put(u'_endsWithInteger', PyJs_LONG_590_()) + PyJs_number_589_._set_name(u'number') + var.get(u'Printer').get(u'prototype').put(u'number', PyJs_number_589_) + @Js + def PyJs_token_591_(str, this, arguments, var=var): + var = Scope({u'this':this, u'token':PyJs_token_591_, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + def PyJs_LONG_592_(var=var): + return ((((PyJsStrictEq(var.get(u'str'),Js(u'--')) and var.get(u"this").callprop(u'endsWith', Js(u'!'))) or (PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'+')) and var.get(u"this").callprop(u'endsWith', Js(u'+')))) or (PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'-')) and var.get(u"this").callprop(u'endsWith', Js(u'-')))) or (PyJsStrictEq(var.get(u'str').get(u'0'),Js(u'.')) and var.get(u"this").get(u'_endsWithInteger'))) + if PyJs_LONG_592_(): + var.get(u"this").callprop(u'_space') + var.get(u"this").callprop(u'_maybeAddAuxComment') + var.get(u"this").callprop(u'_append', var.get(u'str')) + PyJs_token_591_._set_name(u'token') + var.get(u'Printer').get(u'prototype').put(u'token', PyJs_token_591_) + @Js + def PyJs_newline_593_(i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'newline':PyJs_newline_593_, u'arguments':arguments}, var) + var.registers([u'i', u'j']) + if (var.get(u"this").get(u'format').get(u'retainLines') or var.get(u"this").get(u'format').get(u'compact')): + return var.get('undefined') + if var.get(u"this").get(u'format').get(u'concise'): + var.get(u"this").callprop(u'space') + return var.get('undefined') + if var.get(u"this").callprop(u'endsWith', Js(u'\n\n')): + return var.get('undefined') + if PyJsStrictNeq(var.get(u'i',throw=False).typeof(),Js(u'number')): + var.put(u'i', Js(1.0)) + var.put(u'i', var.get(u'Math').callprop(u'min', Js(2.0), var.get(u'i'))) + if (var.get(u"this").callprop(u'endsWith', Js(u'{\n')) or var.get(u"this").callprop(u'endsWith', Js(u':\n'))): + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + if (var.get(u'i')<=Js(0.0)): + return var.get('undefined') + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(False))) + var.get(u"this").callprop(u'_maybeAddParen', var.get(u'str')) + var.get(u"this").callprop(u'_maybeIndent', var.get(u'str')) + if var.get(u'queue'): + var.get(u"this").get(u'_buf').callprop(u'queue', var.get(u'str')) + else: + var.get(u"this").get(u'_buf').callprop(u'append', var.get(u'str')) + var.get(u"this").put(u'_endsWithWord', Js(False)) + var.get(u"this").put(u'_endsWithInteger', Js(False)) + PyJs__append_600_._set_name(u'_append') + var.get(u'Printer').get(u'prototype').put(u'_append', PyJs__append_600_) + @Js + def PyJs__maybeIndent_601_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str, u'_maybeIndent':PyJs__maybeIndent_601_}, var) + var.registers([u'str']) + if ((var.get(u"this").get(u'_indent') and var.get(u"this").callprop(u'endsWith', Js(u'\n'))) and PyJsStrictNeq(var.get(u'str').get(u'0'),Js(u'\n'))): + var.get(u"this").get(u'_buf').callprop(u'queue', var.get(u"this").callprop(u'_getIndent')) + PyJs__maybeIndent_601_._set_name(u'_maybeIndent') + var.get(u'Printer').get(u'prototype').put(u'_maybeIndent', PyJs__maybeIndent_601_) + @Js + def PyJs__maybeAddParen_602_(str, this, arguments, var=var): + var = Scope({u'this':this, u'_maybeAddParen':PyJs__maybeAddParen_602_, u'arguments':arguments, u'str':str}, var) + var.registers([u'i', u'cha', u'str', u'parenPushNewlineState']) + var.put(u'parenPushNewlineState', var.get(u"this").get(u'_parenPushNewlineState')) + if var.get(u'parenPushNewlineState').neg(): + return var.get('undefined') + var.get(u"this").put(u'_parenPushNewlineState', var.get(u"null")) + var.put(u'i', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while ((var.get(u'i')Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_617_)) + if (var.get(u'nodes').neg() or var.get(u'nodes').get(u'length').neg()): + return var.get('undefined') + if var.get(u'opts').get(u'indent'): + var.get(u"this").callprop(u'indent') + PyJs_Object_618_ = Js({u'addNewlines':var.get(u'opts').get(u'addNewlines')}) + var.put(u'newlineOpts', PyJs_Object_618_) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'true'))) + if var.get(u'node').get(u'innerComments').neg(): + return var.get('undefined') + if var.get(u'indent'): + var.get(u"this").callprop(u'indent') + var.get(u"this").callprop(u'_printComments', var.get(u'node').get(u'innerComments')) + if var.get(u'indent'): + var.get(u"this").callprop(u'dedent') + PyJs_printInnerComments_623_._set_name(u'printInnerComments') + var.get(u'Printer').get(u'prototype').put(u'printInnerComments', PyJs_printInnerComments_623_) + @Js + def PyJs_printSequence_624_(nodes, parent, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments, u'parent':parent, u'printSequence':PyJs_printSequence_624_}, var) + var.registers([u'nodes', u'parent', u'opts']) + PyJs_Object_625_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_625_)) + var.get(u'opts').put(u'statement', var.get(u'true')) + return var.get(u"this").callprop(u'printJoin', var.get(u'nodes'), var.get(u'parent'), var.get(u'opts')) + PyJs_printSequence_624_._set_name(u'printSequence') + var.get(u'Printer').get(u'prototype').put(u'printSequence', PyJs_printSequence_624_) + @Js + def PyJs_printList_626_(items, parent, this, arguments, var=var): + var = Scope({u'this':this, u'items':items, u'printList':PyJs_printList_626_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'items', u'parent', u'opts']) + PyJs_Object_627_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else PyJs_Object_627_)) + if (var.get(u'opts').get(u'separator')==var.get(u"null")): + var.get(u'opts').put(u'separator', var.get(u'commaSeparator')) + return var.get(u"this").callprop(u'printJoin', var.get(u'items'), var.get(u'parent'), var.get(u'opts')) + PyJs_printList_626_._set_name(u'printList') + var.get(u'Printer').get(u'prototype').put(u'printList', PyJs_printList_626_) + @Js + def PyJs__printNewline_628_(leading, node, parent, opts, this, arguments, var=var): + var = Scope({u'node':node, u'_printNewline':PyJs__printNewline_628_, u'arguments':arguments, u'parent':parent, u'this':this, u'leading':leading, u'opts':opts}, var) + var.registers([u'node', u'needs', u'parent', u'_comments2', u'leading', u'_comment', u'lines', u'_this2', u'_comments', u'_comment2', u'opts']) + var.put(u'_this2', var.get(u"this")) + if (var.get(u"this").get(u'format').get(u'retainLines') or var.get(u"this").get(u'format').get(u'compact')): + return var.get('undefined') + if var.get(u"this").get(u'format').get(u'concise'): + var.get(u"this").callprop(u'space') + return var.get('undefined') + var.put(u'lines', Js(0.0)) + if (((var.get(u'node').get(u'start')!=var.get(u"null")) and var.get(u'node').get(u'_ignoreUserWhitespace').neg()) and var.get(u"this").get(u'_whitespace')): + if var.get(u'leading'): + var.put(u'_comments', var.get(u'node').get(u'leadingComments')) + @Js + def PyJs_anonymous_629_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + return (var.get(u'comment').get(u'loc').neg().neg() and var.get(u'_this2').get(u'format').callprop(u'shouldPrintComment', var.get(u'comment').get(u'value'))) + PyJs_anonymous_629_._set_name(u'anonymous') + var.put(u'_comment', (var.get(u'_comments') and PyJsComma(Js(0.0),var.get(u'_find2').get(u'default'))(var.get(u'_comments'), PyJs_anonymous_629_))) + var.put(u'lines', var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesBefore', (var.get(u'_comment') or var.get(u'node')))) + else: + var.put(u'_comments2', var.get(u'node').get(u'trailingComments')) + @Js + def PyJs_anonymous_630_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + return (var.get(u'comment').get(u'loc').neg().neg() and var.get(u'_this2').get(u'format').callprop(u'shouldPrintComment', var.get(u'comment').get(u'value'))) + PyJs_anonymous_630_._set_name(u'anonymous') + var.put(u'_comment2', (var.get(u'_comments2') and PyJsComma(Js(0.0),var.get(u'_findLast2').get(u'default'))(var.get(u'_comments2'), PyJs_anonymous_630_))) + var.put(u'lines', var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesAfter', (var.get(u'_comment2') or var.get(u'node')))) + else: + if var.get(u'leading').neg(): + (var.put(u'lines',Js(var.get(u'lines').to_number())+Js(1))-Js(1)) + if var.get(u'opts').get(u'addNewlines'): + var.put(u'lines', (var.get(u'opts').callprop(u'addNewlines', var.get(u'leading'), var.get(u'node')) or Js(0.0)), u'+') + var.put(u'needs', var.get(u'n').get(u'needsWhitespaceAfter')) + if var.get(u'leading'): + var.put(u'needs', var.get(u'n').get(u'needsWhitespaceBefore')) + if var.get(u'needs')(var.get(u'node'), var.get(u'parent')): + (var.put(u'lines',Js(var.get(u'lines').to_number())+Js(1))-Js(1)) + if var.get(u"this").get(u'_buf').callprop(u'hasContent').neg(): + var.put(u'lines', Js(0.0)) + var.get(u"this").callprop(u'newline', var.get(u'lines')) + PyJs__printNewline_628_._set_name(u'_printNewline') + var.get(u'Printer').get(u'prototype').put(u'_printNewline', PyJs__printNewline_628_) + @Js + def PyJs__getComments_631_(leading, node, this, arguments, var=var): + var = Scope({u'node':node, u'leading':leading, u'this':this, u'arguments':arguments, u'_getComments':PyJs__getComments_631_}, var) + var.registers([u'node', u'leading']) + return ((var.get(u'node') and (var.get(u'node').get(u'leadingComments') if var.get(u'leading') else var.get(u'node').get(u'trailingComments'))) or Js([])) + PyJs__getComments_631_._set_name(u'_getComments') + var.get(u'Printer').get(u'prototype').put(u'_getComments', PyJs__getComments_631_) + @Js + def PyJs__printComment_632_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'_printComment':PyJs__printComment_632_, u'arguments':arguments}, var) + var.registers([u'comment', u'val', u'indentSize', u'newlineRegex', u'offset', u'_this3']) + var.put(u'_this3', var.get(u"this")) + if var.get(u"this").get(u'format').callprop(u'shouldPrintComment', var.get(u'comment').get(u'value')).neg(): + return var.get('undefined') + if var.get(u'comment').get(u'ignore'): + return var.get('undefined') + if var.get(u"this").get(u'_printedComments').callprop(u'has', var.get(u'comment')): + return var.get('undefined') + var.get(u"this").get(u'_printedComments').callprop(u'add', var.get(u'comment')) + if (var.get(u'comment').get(u'start')!=var.get(u"null")): + if var.get(u"this").get(u'_printedCommentStarts').get(var.get(u'comment').get(u'start')): + return var.get('undefined') + var.get(u"this").get(u'_printedCommentStarts').put(var.get(u'comment').get(u'start'), var.get(u'true')) + var.get(u"this").callprop(u'newline', (var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesBefore', var.get(u'comment')) if var.get(u"this").get(u'_whitespace') else Js(0.0))) + if (var.get(u"this").callprop(u'endsWith', Js(u'[')).neg() and var.get(u"this").callprop(u'endsWith', Js(u'{')).neg()): + var.get(u"this").callprop(u'space') + var.put(u'val', (((Js(u'//')+var.get(u'comment').get(u'value'))+Js(u'\n')) if PyJsStrictEq(var.get(u'comment').get(u'type'),Js(u'CommentLine')) else ((Js(u'/*')+var.get(u'comment').get(u'value'))+Js(u'*/')))) + if (PyJsStrictEq(var.get(u'comment').get(u'type'),Js(u'CommentBlock')) and var.get(u"this").get(u'format').get(u'indent').get(u'adjustMultilineComment')): + var.put(u'offset', (var.get(u'comment').get(u'loc') and var.get(u'comment').get(u'loc').get(u'start').get(u'column'))) + if var.get(u'offset'): + var.put(u'newlineRegex', var.get(u'RegExp').create(((Js(u'\\n\\s{1,')+var.get(u'offset'))+Js(u'}')), Js(u'g'))) + var.put(u'val', var.get(u'val').callprop(u'replace', var.get(u'newlineRegex'), Js(u'\n'))) + var.put(u'indentSize', var.get(u'Math').callprop(u'max', var.get(u"this").callprop(u'_getIndent').get(u'length'), var.get(u"this").get(u'_buf').callprop(u'getCurrentColumn'))) + var.put(u'val', var.get(u'val').callprop(u'replace', JsRegExp(u'/\\n(?!$)/g'), (Js(u'\n')+PyJsComma(Js(0.0),var.get(u'_repeat2').get(u'default'))(Js(u' '), var.get(u'indentSize'))))) + @Js + def PyJs_anonymous_633_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_this3').callprop(u'_append', var.get(u'val')) + PyJs_anonymous_633_._set_name(u'anonymous') + var.get(u"this").callprop(u'withSource', Js(u'start'), var.get(u'comment').get(u'loc'), PyJs_anonymous_633_) + var.get(u"this").callprop(u'newline', ((var.get(u"this").get(u'_whitespace').callprop(u'getNewlinesAfter', var.get(u'comment')) if var.get(u"this").get(u'_whitespace') else Js(0.0))+((-Js(1.0)) if PyJsStrictEq(var.get(u'comment').get(u'type'),Js(u'CommentLine')) else Js(0.0)))) + PyJs__printComment_632_._set_name(u'_printComment') + var.get(u'Printer').get(u'prototype').put(u'_printComment', PyJs__printComment_632_) + @Js + def PyJs__printComments_634_(comments, this, arguments, var=var): + var = Scope({u'this':this, u'_printComments':PyJs__printComments_634_, u'arguments':arguments, u'comments':comments}, var) + var.registers([u'_isArray', u'_iterator', u'comments', u'_i', u'_ref', u'_comment3']) + if (var.get(u'comments').neg() or var.get(u'comments').get(u'length').neg()): + return var.get('undefined') + #for JS loop + var.put(u'_iterator', var.get(u'comments')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'_comment3', var.get(u'_ref')) + var.get(u"this").callprop(u'_printComment', var.get(u'_comment3')) + + PyJs__printComments_634_._set_name(u'_printComments') + var.get(u'Printer').get(u'prototype').put(u'_printComments', PyJs__printComments_634_) + return var.get(u'Printer') + PyJs_anonymous_579_._set_name(u'anonymous') + var.put(u'Printer', PyJs_anonymous_579_()) + var.get(u'exports').put(u'default', var.get(u'Printer')) + pass + var.put(u'_arr', Js([var.get(u'require')(Js(u'./generators/template-literals')), var.get(u'require')(Js(u'./generators/expressions')), var.get(u'require')(Js(u'./generators/statements')), var.get(u'require')(Js(u'./generators/classes')), var.get(u'require')(Js(u'./generators/methods')), var.get(u'require')(Js(u'./generators/modules')), var.get(u'require')(Js(u'./generators/types')), var.get(u'require')(Js(u'./generators/flow')), var.get(u'require')(Js(u'./generators/base')), var.get(u'require')(Js(u'./generators/jsx'))])) + #for JS loop + var.put(u'_i2', Js(0.0)) + while (var.get(u'_i2')=Js(0.0)): + while (var.get(u'index') and PyJsStrictEq(var.get(u'node').get(u'start'),var.get(u'tokens').get((var.get(u'index')-Js(1.0))).get(u'start'))): + var.put(u'index',Js(var.get(u'index').to_number())-Js(1)) + var.put(u'startToken', var.get(u'tokens').get((var.get(u'index')-Js(1.0)))) + var.put(u'endToken', var.get(u'tokens').get(var.get(u'index'))) + return var.get(u"this").callprop(u'_getNewlinesBetween', var.get(u'startToken'), var.get(u'endToken')) + PyJs_getNewlinesBefore_651_._set_name(u'getNewlinesBefore') + var.get(u'Whitespace').get(u'prototype').put(u'getNewlinesBefore', PyJs_getNewlinesBefore_651_) + @Js + def PyJs_getNewlinesAfter_653_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'getNewlinesAfter':PyJs_getNewlinesAfter_653_}, var) + var.registers([u'tokens', u'startToken', u'node', u'endToken', u'index']) + var.put(u'startToken', PyJsComma(Js(0.0), Js(None))) + var.put(u'endToken', PyJsComma(Js(0.0), Js(None))) + var.put(u'tokens', var.get(u"this").get(u'tokens')) + @Js + def PyJs_anonymous_654_(token, this, arguments, var=var): + var = Scope({u'this':this, u'token':token, u'arguments':arguments}, var) + var.registers([u'token']) + return (var.get(u'token').get(u'end')-var.get(u'node').get(u'end')) + PyJs_anonymous_654_._set_name(u'anonymous') + var.put(u'index', var.get(u"this").callprop(u'_findToken', PyJs_anonymous_654_, Js(0.0), var.get(u'tokens').get(u'length'))) + if (var.get(u'index')>=Js(0.0)): + while (var.get(u'index') and PyJsStrictEq(var.get(u'node').get(u'end'),var.get(u'tokens').get((var.get(u'index')-Js(1.0))).get(u'end'))): + var.put(u'index',Js(var.get(u'index').to_number())-Js(1)) + var.put(u'startToken', var.get(u'tokens').get(var.get(u'index'))) + var.put(u'endToken', var.get(u'tokens').get((var.get(u'index')+Js(1.0)))) + if PyJsStrictEq(var.get(u'endToken').get(u'type').get(u'label'),Js(u',')): + var.put(u'endToken', var.get(u'tokens').get((var.get(u'index')+Js(2.0)))) + if (var.get(u'endToken') and PyJsStrictEq(var.get(u'endToken').get(u'type').get(u'label'),Js(u'eof'))): + return Js(1.0) + else: + return var.get(u"this").callprop(u'_getNewlinesBetween', var.get(u'startToken'), var.get(u'endToken')) + PyJs_getNewlinesAfter_653_._set_name(u'getNewlinesAfter') + var.get(u'Whitespace').get(u'prototype').put(u'getNewlinesAfter', PyJs_getNewlinesAfter_653_) + @Js + def PyJs__getNewlinesBetween_655_(startToken, endToken, this, arguments, var=var): + var = Scope({u'this':this, u'startToken':startToken, u'arguments':arguments, u'endToken':endToken, u'_getNewlinesBetween':PyJs__getNewlinesBetween_655_}, var) + var.registers([u'end', u'startToken', u'lines', u'start', u'line', u'endToken']) + if (var.get(u'endToken').neg() or var.get(u'endToken').get(u'loc').neg()): + return Js(0.0) + var.put(u'start', (var.get(u'startToken').get(u'loc').get(u'end').get(u'line') if var.get(u'startToken') else Js(1.0))) + var.put(u'end', var.get(u'endToken').get(u'loc').get(u'start').get(u'line')) + var.put(u'lines', Js(0.0)) + #for JS loop + var.put(u'line', var.get(u'start')) + while (var.get(u'line')=var.get(u'end')): + return (-Js(1.0)) + var.put(u'middle', PyJsBshift((var.get(u'start')+var.get(u'end')),Js(1.0))) + var.put(u'match', var.get(u'test')(var.get(u"this").get(u'tokens').get(var.get(u'middle')))) + if (var.get(u'match')Js(0.0)): + return var.get(u"this").callprop(u'_findToken', var.get(u'test'), var.get(u'start'), var.get(u'middle')) + else: + if PyJsStrictEq(var.get(u'match'),Js(0.0)): + return var.get(u'middle') + return (-Js(1.0)) + PyJs__findToken_656_._set_name(u'_findToken') + var.get(u'Whitespace').get(u'prototype').put(u'_findToken', PyJs__findToken_656_) + return var.get(u'Whitespace') + PyJs_anonymous_649_._set_name(u'anonymous') + var.put(u'Whitespace', PyJs_anonymous_649_()) + var.get(u'exports').put(u'default', var.get(u'Whitespace')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_647_._set_name(u'anonymous') +PyJs_Object_657_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_658_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'module', u'_babelHelperHoistVariables', u't', u'_babelHelperHoistVariables2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_664_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_664_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_663_ = Js({}) + var.put(u'newObj', PyJs_Object_663_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_659_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'node', u'container', u'args', u'state', u'call', u'path', u'scope', u'callee']) + var.put(u'scope', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'path').get(u'scope'))) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'container', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([]), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'async'))) + var.put(u'callee', var.get(u'container')) + var.put(u'args', Js([])) + @Js + def PyJs_anonymous_660_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + PyJs_Object_661_ = Js({u'id':var.get(u'id')}) + return var.get(u'scope').callprop(u'push', PyJs_Object_661_) + PyJs_anonymous_660_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_babelHelperHoistVariables2').get(u'default'))(var.get(u'path'), PyJs_anonymous_660_) + PyJs_Object_662_ = Js({u'foundThis':Js(False),u'foundArguments':Js(False)}) + var.put(u'state', PyJs_Object_662_) + var.get(u'path').callprop(u'traverse', var.get(u'visitor'), var.get(u'state')) + if var.get(u'state').get(u'foundArguments'): + var.put(u'callee', var.get(u't').callprop(u'memberExpression', var.get(u'container'), var.get(u't').callprop(u'identifier', Js(u'apply')))) + var.put(u'args', Js([])) + if var.get(u'state').get(u'foundThis'): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'thisExpression')) + if var.get(u'state').get(u'foundArguments'): + if var.get(u'state').get(u'foundThis').neg(): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'nullLiteral')) + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'identifier', Js(u'arguments'))) + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u'callee'), var.get(u'args'))) + if var.get(u'node').get(u'generator'): + var.put(u'call', var.get(u't').callprop(u'yieldExpression', var.get(u'call'), var.get(u'true'))) + return var.get(u't').callprop(u'returnStatement', var.get(u'call')) + PyJs_anonymous_659_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_659_) + var.put(u'_babelHelperHoistVariables', var.get(u'require')(Js(u'babel-helper-hoist-variables'))) + var.put(u'_babelHelperHoistVariables2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperHoistVariables'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_enter_666_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_666_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').callprop(u'isThisExpression'): + var.get(u'state').put(u'foundThis', var.get(u'true')) + PyJs_Object_667_ = Js({u'name':Js(u'arguments')}) + if var.get(u'path').callprop(u'isReferencedIdentifier', PyJs_Object_667_): + var.get(u'state').put(u'foundArguments', var.get(u'true')) + PyJs_enter_666_._set_name(u'enter') + @Js + def PyJs_Function_668_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_668_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_668_._set_name(u'Function') + PyJs_Object_665_ = Js({u'enter':PyJs_enter_666_,u'Function':PyJs_Function_668_}) + var.put(u'visitor', PyJs_Object_665_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_658_._set_name(u'anonymous') +PyJs_Object_669_ = Js({u'babel-helper-hoist-variables':Js(51.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_670_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toDefineObject', u'exports', u'toComputedObjectFromClass', u'_each', u'_interopRequireWildcard', u'_babelHelperFunctionName', u'require', u'_babelTypes', u'_has2', u'_has', u'hasComputed', u'push', u'module', u'_each2', u't', u'_babelHelperFunctionName2', u'_interopRequireDefault', u'toKind', u'toClassObject']) + @Js + def PyJsHoisted_toDefineObject_(mutatorMap, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'mutatorMap':mutatorMap}, var) + var.registers([u'mutatorMap']) + @Js + def PyJs_anonymous_678_(map, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'arguments':arguments}, var) + var.registers([u'map']) + if var.get(u'map').get(u'value'): + var.get(u'map').put(u'writable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + var.get(u'map').put(u'configurable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + var.get(u'map').put(u'enumerable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + PyJs_anonymous_678_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'mutatorMap'), PyJs_anonymous_678_) + return var.get(u'toClassObject')(var.get(u'mutatorMap')) + PyJsHoisted_toDefineObject_.func_name = u'toDefineObject' + var.put(u'toDefineObject', PyJsHoisted_toDefineObject_) + @Js + def PyJsHoisted_toComputedObjectFromClass_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'i', u'obj', u'objExpr', u'val', u'prop']) + var.put(u'objExpr', var.get(u't').callprop(u'arrayExpression', Js([]))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else Js(u'var'))) + PyJs_Object_696_ = Js({u'kind':var.get(u'kind'),u'emit':var.get(u'emit')}) + var.get(u'path').callprop(u'traverse', var.get(u'visitor'), PyJs_Object_696_) + PyJs_anonymous_695_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_695_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_Scope_700_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_700_}, var) + var.registers([u'path', u'state']) + if PyJsStrictEq(var.get(u'state').get(u'kind'),Js(u'let')): + var.get(u'path').callprop(u'skip') + PyJs_Scope_700_._set_name(u'Scope') + @Js + def PyJs_Function_701_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_701_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_701_._set_name(u'Function') + @Js + def PyJs_VariableDeclaration_702_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_702_}, var) + var.registers([u'_isArray', u'_iterator', u'firstId', u'declarations', u'state', u'declar', u'_i', u'path', u'nodes', u'_ref', u'name']) + if (var.get(u'state').get(u'kind') and PyJsStrictNeq(var.get(u'path').get(u'node').get(u'kind'),var.get(u'state').get(u'kind'))): + return var.get('undefined') + var.put(u'nodes', Js([])) + var.put(u'declarations', var.get(u'path').callprop(u'get', Js(u'declarations'))) + var.put(u'firstId', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'_iterator', var.get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref')) + var.put(u'firstId', var.get(u'declar').get(u'node').get(u'id')) + if var.get(u'declar').get(u'node').get(u'init'): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'node').get(u'id'), var.get(u'declar').get(u'node').get(u'init')))) + for PyJsTemp in var.get(u'declar').callprop(u'getBindingIdentifiers'): + var.put(u'name', PyJsTemp) + var.get(u'state').callprop(u'emit', var.get(u't').callprop(u'identifier', var.get(u'name')), var.get(u'name')) + + PyJs_Object_703_ = Js({u'left':var.get(u'path').get(u'node')}) + if var.get(u'path').get(u'parentPath').callprop(u'isFor', PyJs_Object_703_): + var.get(u'path').callprop(u'replaceWith', var.get(u'firstId')) + else: + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJs_VariableDeclaration_702_._set_name(u'VariableDeclaration') + PyJs_Object_699_ = Js({u'Scope':PyJs_Scope_700_,u'Function':PyJs_Function_701_,u'VariableDeclaration':PyJs_VariableDeclaration_702_}) + var.put(u'visitor', PyJs_Object_699_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_694_._set_name(u'anonymous') +PyJs_Object_704_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_705_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_708_ = Js({}) + var.put(u'newObj', PyJs_Object_708_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_706_(callee, thisNode, args, this, arguments, var=var): + var = Scope({u'thisNode':thisNode, u'this':this, u'args':args, u'callee':callee, u'arguments':arguments}, var) + var.registers([u'thisNode', u'args', u'callee']) + PyJs_Object_707_ = Js({u'name':Js(u'arguments')}) + if ((PyJsStrictEq(var.get(u'args').get(u'length'),Js(1.0)) and var.get(u't').callprop(u'isSpreadElement', var.get(u'args').get(u'0'))) and var.get(u't').callprop(u'isIdentifier', var.get(u'args').get(u'0').get(u'argument'), PyJs_Object_707_)): + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'apply'))), Js([var.get(u'thisNode'), var.get(u'args').get(u'0').get(u'argument')])) + else: + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'call'))), Js([var.get(u'thisNode')]).callprop(u'concat', var.get(u'args'))) + PyJs_anonymous_706_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_706_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_705_._set_name(u'anonymous') +PyJs_Object_709_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_710_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'pullFlag', u'_interopRequireWildcard', u'_pull', u'is', u'_babelTypes', u'module', u'_pull2', u't', u'_interopRequireDefault', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_712_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_712_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_is_(node, flag, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'flag':flag, u'arguments':arguments}, var) + var.registers([u'node', u'flag']) + return (var.get(u't').callprop(u'isRegExpLiteral', var.get(u'node')) and (var.get(u'node').get(u'flags').callprop(u'indexOf', var.get(u'flag'))>=Js(0.0))) + PyJsHoisted_is_.func_name = u'is' + var.put(u'is', PyJsHoisted_is_) + @Js + def PyJsHoisted_pullFlag_(node, flag, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'flag':flag, u'arguments':arguments}, var) + var.registers([u'node', u'flag', u'flags']) + var.put(u'flags', var.get(u'node').get(u'flags').callprop(u'split', Js(u''))) + if (var.get(u'node').get(u'flags').callprop(u'indexOf', var.get(u'flag'))Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(False))) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'ReplaceSupers')) + var.get(u"this").put(u'forceSuperMemoisation', var.get(u'opts').get(u'forceSuperMemoisation')) + var.get(u"this").put(u'methodPath', var.get(u'opts').get(u'methodPath')) + var.get(u"this").put(u'methodNode', var.get(u'opts').get(u'methodNode')) + var.get(u"this").put(u'superRef', var.get(u'opts').get(u'superRef')) + var.get(u"this").put(u'isStatic', var.get(u'opts').get(u'isStatic')) + var.get(u"this").put(u'hasSuper', Js(False)) + var.get(u"this").put(u'inClass', var.get(u'inClass')) + var.get(u"this").put(u'isLoose', var.get(u'opts').get(u'isLoose')) + var.get(u"this").put(u'scope', var.get(u"this").get(u'methodPath').get(u'scope')) + var.get(u"this").put(u'file', var.get(u'opts').get(u'file')) + var.get(u"this").put(u'opts', var.get(u'opts')) + var.get(u"this").put(u'bareSupers', Js([])) + var.get(u"this").put(u'returns', Js([])) + var.get(u"this").put(u'thises', Js([])) + PyJsHoisted_ReplaceSupers_.func_name = u'ReplaceSupers' + var.put(u'ReplaceSupers', PyJsHoisted_ReplaceSupers_) + pass + @Js + def PyJs_getObjectRef_726_(this, arguments, var=var): + var = Scope({u'this':this, u'getObjectRef':PyJs_getObjectRef_726_, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").get(u'opts').get(u'objectRef') or var.get(u"this").get(u'opts').callprop(u'getObjectRef')) + PyJs_getObjectRef_726_._set_name(u'getObjectRef') + var.get(u'ReplaceSupers').get(u'prototype').put(u'getObjectRef', PyJs_getObjectRef_726_) + @Js + def PyJs_setSuperProperty_727_(property, value, isComputed, this, arguments, var=var): + var = Scope({u'setSuperProperty':PyJs_setSuperProperty_727_, u'this':this, u'value':value, u'arguments':arguments, u'property':property, u'isComputed':isComputed}, var) + var.registers([u'property', u'value', u'isComputed']) + def PyJs_LONG_728_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'set')), Js([var.get(u'getPrototypeOfExpression')(var.get(u"this").callprop(u'getObjectRef'), var.get(u"this").get(u'isStatic')), (var.get(u'property') if var.get(u'isComputed') else var.get(u't').callprop(u'stringLiteral', var.get(u'property').get(u'name'))), var.get(u'value'), var.get(u't').callprop(u'thisExpression')])) + return PyJs_LONG_728_() + PyJs_setSuperProperty_727_._set_name(u'setSuperProperty') + var.get(u'ReplaceSupers').get(u'prototype').put(u'setSuperProperty', PyJs_setSuperProperty_727_) + @Js + def PyJs_getSuperProperty_729_(property, isComputed, this, arguments, var=var): + var = Scope({u'this':this, u'getSuperProperty':PyJs_getSuperProperty_729_, u'property':property, u'arguments':arguments, u'isComputed':isComputed}, var) + var.registers([u'property', u'isComputed']) + def PyJs_LONG_730_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'get')), Js([var.get(u'getPrototypeOfExpression')(var.get(u"this").callprop(u'getObjectRef'), var.get(u"this").get(u'isStatic')), (var.get(u'property') if var.get(u'isComputed') else var.get(u't').callprop(u'stringLiteral', var.get(u'property').get(u'name'))), var.get(u't').callprop(u'thisExpression')])) + return PyJs_LONG_730_() + PyJs_getSuperProperty_729_._set_name(u'getSuperProperty') + var.get(u'ReplaceSupers').get(u'prototype').put(u'getSuperProperty', PyJs_getSuperProperty_729_) + @Js + def PyJs_replace_731_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replace':PyJs_replace_731_}, var) + var.registers([]) + var.get(u"this").get(u'methodPath').callprop(u'traverse', var.get(u'visitor'), var.get(u"this")) + PyJs_replace_731_._set_name(u'replace') + var.get(u'ReplaceSupers').get(u'prototype').put(u'replace', PyJs_replace_731_) + @Js + def PyJs_getLooseSuperProperty_732_(id, parent, this, arguments, var=var): + var = Scope({u'this':this, u'getLooseSuperProperty':PyJs_getLooseSuperProperty_732_, u'id':id, u'parent':parent, u'arguments':arguments}, var) + var.registers([u'methodNode', u'superRef', u'id', u'parent']) + var.put(u'methodNode', var.get(u"this").get(u'methodNode')) + var.put(u'superRef', (var.get(u"this").get(u'superRef') or var.get(u't').callprop(u'identifier', Js(u'Function')))) + if PyJsStrictEq(var.get(u'parent').get(u'property'),var.get(u'id')): + return var.get('undefined') + else: + PyJs_Object_733_ = Js({u'callee':var.get(u'id')}) + if var.get(u't').callprop(u'isCallExpression', var.get(u'parent'), PyJs_Object_733_): + return var.get('undefined') + else: + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'parent')) and var.get(u'methodNode').get(u'static').neg()): + return var.get(u't').callprop(u'memberExpression', var.get(u'superRef'), var.get(u't').callprop(u'identifier', Js(u'prototype'))) + else: + return var.get(u'superRef') + PyJs_getLooseSuperProperty_732_._set_name(u'getLooseSuperProperty') + var.get(u'ReplaceSupers').get(u'prototype').put(u'getLooseSuperProperty', PyJs_getLooseSuperProperty_732_) + @Js + def PyJs_looseHandle_734_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'looseHandle':PyJs_looseHandle_734_}, var) + var.registers([u'node', u'path', u'callee']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'isSuper'): + return var.get(u"this").callprop(u'getLooseSuperProperty', var.get(u'node'), var.get(u'path').get(u'parent')) + else: + if var.get(u'path').callprop(u'isCallExpression'): + var.put(u'callee', var.get(u'node').get(u'callee')) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'callee')).neg(): + return var.get('undefined') + if var.get(u't').callprop(u'isSuper', var.get(u'callee').get(u'object')).neg(): + return var.get('undefined') + var.get(u't').callprop(u'appendToMemberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'call'))) + var.get(u'node').get(u'arguments').callprop(u'unshift', var.get(u't').callprop(u'thisExpression')) + return var.get(u'true') + PyJs_looseHandle_734_._set_name(u'looseHandle') + var.get(u'ReplaceSupers').get(u'prototype').put(u'looseHandle', PyJs_looseHandle_734_) + @Js + def PyJs_specHandleAssignmentExpression_735_(ref, path, node, this, arguments, var=var): + var = Scope({u'node':node, u'specHandleAssignmentExpression':PyJs_specHandleAssignmentExpression_735_, u'this':this, u'arguments':arguments, u'path':path, u'ref':ref}, var) + var.registers([u'node', u'path', u'ref']) + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'=')): + return var.get(u"this").callprop(u'setSuperProperty', var.get(u'node').get(u'left').get(u'property'), var.get(u'node').get(u'right'), var.get(u'node').get(u'left').get(u'computed')) + else: + var.put(u'ref', (var.get(u'ref') or var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref')))) + return Js([var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'node').get(u'left'))])), var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'node').get(u'left'), var.get(u't').callprop(u'binaryExpression', var.get(u'node').get(u'operator').get(u'0'), var.get(u'ref'), var.get(u'node').get(u'right'))))]) + PyJs_specHandleAssignmentExpression_735_._set_name(u'specHandleAssignmentExpression') + var.get(u'ReplaceSupers').get(u'prototype').put(u'specHandleAssignmentExpression', PyJs_specHandleAssignmentExpression_735_) + @Js + def PyJs_specHandle_736_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'specHandle':PyJs_specHandle_736_}, var) + var.registers([u'node', u'binary', u'superProperty', u'computed', u'parent', u'ref', u'args', u'path', u'property', u'callee']) + var.put(u'property', PyJsComma(Js(0.0), Js(None))) + var.put(u'computed', PyJsComma(Js(0.0), Js(None))) + var.put(u'args', PyJsComma(Js(0.0), Js(None))) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'isIllegalBareSuper')(var.get(u'node'), var.get(u'parent')): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', var.get(u'messages').callprop(u'get', Js(u'classesIllegalBareSuper')))) + raise PyJsTempException + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + var.put(u'callee', var.get(u'node').get(u'callee')) + if var.get(u't').callprop(u'isSuper', var.get(u'callee')): + return var.get('undefined') + else: + if var.get(u'isMemberExpressionSuper')(var.get(u'callee')): + var.put(u'property', var.get(u'callee').get(u'property')) + var.put(u'computed', var.get(u'callee').get(u'computed')) + var.put(u'args', var.get(u'node').get(u'arguments')) + else: + if (var.get(u't').callprop(u'isMemberExpression', var.get(u'node')) and var.get(u't').callprop(u'isSuper', var.get(u'node').get(u'object'))): + var.put(u'property', var.get(u'node').get(u'property')) + var.put(u'computed', var.get(u'node').get(u'computed')) + else: + if (var.get(u't').callprop(u'isUpdateExpression', var.get(u'node')) and var.get(u'isMemberExpressionSuper')(var.get(u'node').get(u'argument'))): + var.put(u'binary', var.get(u't').callprop(u'binaryExpression', var.get(u'node').get(u'operator').get(u'0'), var.get(u'node').get(u'argument'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + if var.get(u'node').get(u'prefix'): + return var.get(u"this").callprop(u'specHandleAssignmentExpression', var.get(u"null"), var.get(u'path'), var.get(u'binary')) + else: + var.put(u'ref', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + return var.get(u"this").callprop(u'specHandleAssignmentExpression', var.get(u'ref'), var.get(u'path'), var.get(u'binary')).callprop(u'concat', var.get(u't').callprop(u'expressionStatement', var.get(u'ref'))) + else: + if (var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node')) and var.get(u'isMemberExpressionSuper')(var.get(u'node').get(u'left'))): + return var.get(u"this").callprop(u'specHandleAssignmentExpression', var.get(u"null"), var.get(u'path'), var.get(u'node')) + if var.get(u'property').neg(): + return var.get('undefined') + var.put(u'superProperty', var.get(u"this").callprop(u'getSuperProperty', var.get(u'property'), var.get(u'computed'))) + if var.get(u'args'): + return var.get(u"this").callprop(u'optimiseCall', var.get(u'superProperty'), var.get(u'args')) + else: + return var.get(u'superProperty') + PyJs_specHandle_736_._set_name(u'specHandle') + var.get(u'ReplaceSupers').get(u'prototype').put(u'specHandle', PyJs_specHandle_736_) + @Js + def PyJs_optimiseCall_737_(callee, args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'callee':callee, u'arguments':arguments, u'optimiseCall':PyJs_optimiseCall_737_}, var) + var.registers([u'thisNode', u'args', u'callee']) + var.put(u'thisNode', var.get(u't').callprop(u'thisExpression')) + var.get(u'thisNode').put(var.get(u'HARDCORE_THIS_REF'), var.get(u'true')) + return PyJsComma(Js(0.0),var.get(u'_babelHelperOptimiseCallExpression2').get(u'default'))(var.get(u'callee'), var.get(u'thisNode'), var.get(u'args')) + PyJs_optimiseCall_737_._set_name(u'optimiseCall') + var.get(u'ReplaceSupers').get(u'prototype').put(u'optimiseCall', PyJs_optimiseCall_737_) + return var.get(u'ReplaceSupers') + PyJs_anonymous_725_._set_name(u'anonymous') + var.put(u'ReplaceSupers', PyJs_anonymous_725_()) + var.get(u'exports').put(u'default', var.get(u'ReplaceSupers')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_714_._set_name(u'anonymous') +PyJs_Object_738_ = Js({u'babel-helper-optimise-call-expression':Js(52.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_739_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'_babelTemplate', u'module', u'helpers', u'_interopRequireDefault', u'_babelTemplate2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_740_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_740_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + PyJs_Object_741_ = Js({}) + var.put(u'helpers', PyJs_Object_741_) + var.get(u'exports').put(u'default', var.get(u'helpers')) + def PyJs_LONG_742_(var=var): + return var.get(u'helpers').put(u'typeof', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (typeof Symbol === "function" && typeof Symbol.iterator === "symbol")\n ? function (obj) { return typeof obj; }\n : function (obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype\n ? "symbol"\n : typeof obj;\n };\n'))) + PyJs_LONG_742_() + def PyJs_LONG_743_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n var REACT_ELEMENT_TYPE = (typeof Symbol === "function" && Symbol.for && Symbol.for("react.element")) || 0xeac7;\n\n return function createRawReactElement (type, props, key, children) {\n var defaultProps = type && type.defaultProps;\n var childrenLength = arguments.length - 3;\n\n if (!props && childrenLength !== 0) {\n // If we\'re going to assign props.children, we create a new object now\n // to avoid mutating defaultProps.\n props = {};\n }\n if (props && defaultProps) {\n for (var propName in defaultProps) {\n if (props[propName] === void 0) {\n props[propName] = defaultProps[propName];\n }\n }\n } else if (!props) {\n props = defaultProps || {};\n }\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 3];\n }\n props.children = childArray;\n }\n\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key === undefined ? null : \'\' + key,\n ref: null,\n props: props,\n _owner: null,\n };\n };\n\n })()\n')) + var.get(u'helpers').put(u'jsx', PyJs_LONG_743_()) + def PyJs_LONG_744_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (iterable) {\n if (typeof Symbol === "function") {\n if (Symbol.asyncIterator) {\n var method = iterable[Symbol.asyncIterator];\n if (method != null) return method.call(iterable);\n }\n if (Symbol.iterator) {\n return iterable[Symbol.iterator]();\n }\n }\n throw new TypeError("Object is not async iterable");\n })\n')) + var.get(u'helpers').put(u'asyncIterator', PyJs_LONG_744_()) + def PyJs_LONG_745_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n function AwaitValue(value) {\n this.value = value;\n }\n\n function AsyncGenerator(gen) {\n var front, back;\n\n function send(key, arg) {\n return new Promise(function (resolve, reject) {\n var request = {\n key: key,\n arg: arg,\n resolve: resolve,\n reject: reject,\n next: null\n };\n\n if (back) {\n back = back.next = request;\n } else {\n front = back = request;\n resume(key, arg);\n }\n });\n }\n\n function resume(key, arg) {\n try {\n var result = gen[key](arg)\n var value = result.value;\n if (value instanceof AwaitValue) {\n Promise.resolve(value.value).then(\n function (arg) { resume("next", arg); },\n function (arg) { resume("throw", arg); });\n } else {\n settle(result.done ? "return" : "normal", result.value);\n }\n } catch (err) {\n settle("throw", err);\n }\n }\n\n function settle(type, value) {\n switch (type) {\n case "return":\n front.resolve({ value: value, done: true });\n break;\n case "throw":\n front.reject(value);\n break;\n default:\n front.resolve({ value: value, done: false });\n break;\n }\n\n front = front.next;\n if (front) {\n resume(front.key, front.arg);\n } else {\n back = null;\n }\n }\n\n this._invoke = send;\n\n // Hide "return" method if generator return is not supported\n if (typeof gen.return !== "function") {\n this.return = undefined;\n }\n }\n\n if (typeof Symbol === "function" && Symbol.asyncIterator) {\n AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; };\n }\n\n AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); };\n AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); };\n AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); };\n\n return {\n wrap: function (fn) {\n return function () {\n return new AsyncGenerator(fn.apply(this, arguments));\n };\n },\n await: function (value) {\n return new AwaitValue(value);\n }\n };\n\n })()\n')) + var.get(u'helpers').put(u'asyncGenerator', PyJs_LONG_745_()) + def PyJs_LONG_746_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (inner, awaitWrap) {\n var iter = {}, waiting = false;\n\n function pump(key, value) {\n waiting = true;\n value = new Promise(function (resolve) { resolve(inner[key](value)); });\n return { done: false, value: awaitWrap(value) };\n };\n\n if (typeof Symbol === "function" && Symbol.iterator) {\n iter[Symbol.iterator] = function () { return this; };\n }\n\n iter.next = function (value) {\n if (waiting) {\n waiting = false;\n return value;\n }\n return pump("next", value);\n };\n\n if (typeof inner.throw === "function") {\n iter.throw = function (value) {\n if (waiting) {\n waiting = false;\n throw value;\n }\n return pump("throw", value);\n };\n }\n\n if (typeof inner.return === "function") {\n iter.return = function (value) {\n return pump("return", value);\n };\n }\n\n return iter;\n })\n')) + var.get(u'helpers').put(u'asyncGeneratorDelegate', PyJs_LONG_746_()) + def PyJs_LONG_747_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (fn) {\n return function () {\n var gen = fn.apply(this, arguments);\n return new Promise(function (resolve, reject) {\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n return Promise.resolve(value).then(function (value) {\n step("next", value);\n }, function (err) {\n step("throw", err);\n });\n }\n }\n\n return step("next");\n });\n };\n })\n')) + var.get(u'helpers').put(u'asyncToGenerator', PyJs_LONG_747_()) + var.get(u'helpers').put(u'classCallCheck', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n });\n'))) + def PyJs_LONG_748_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function() {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i ++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n })()\n')) + var.get(u'helpers').put(u'createClass', PyJs_LONG_748_()) + var.get(u'helpers').put(u'defineEnumerableProperties', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, descs) {\n for (var key in descs) {\n var desc = descs[key];\n desc.configurable = desc.enumerable = true;\n if ("value" in desc) desc.writable = true;\n Object.defineProperty(obj, key, desc);\n }\n return obj;\n })\n'))) + def PyJs_LONG_749_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = Object.getOwnPropertyDescriptor(defaults, key);\n if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }\n return obj;\n })\n')) + var.get(u'helpers').put(u'defaults', PyJs_LONG_749_()) + def PyJs_LONG_750_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, key, value) {\n // Shortcircuit the slow defineProperty path when possible.\n // We are trying to avoid issues where setters defined on the\n // prototype cause side effects under the fast path of simple\n // assignment. By checking for existence of the property with\n // the in operator, we can optimize most of this overhead away.\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n });\n')) + var.get(u'helpers').put(u'defineProperty', PyJs_LONG_750_()) + def PyJs_LONG_751_(var=var): + return var.get(u'helpers').put(u'extends', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.assign || (function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n })\n'))) + PyJs_LONG_751_() + def PyJs_LONG_752_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if ("value" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n });\n')) + var.get(u'helpers').put(u'get', PyJs_LONG_752_()) + def PyJs_LONG_753_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n })\n')) + var.get(u'helpers').put(u'inherits', PyJs_LONG_753_()) + var.get(u'helpers').put(u'instanceof', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (left, right) {\n if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {\n return right[Symbol.hasInstance](left);\n } else {\n return left instanceof right;\n }\n });\n'))) + var.get(u'helpers').put(u'interopRequireDefault', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n })\n'))) + def PyJs_LONG_754_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj) {\n if (obj && obj.__esModule) {\n return obj;\n } else {\n var newObj = {};\n if (obj != null) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n }\n }\n newObj.default = obj;\n return newObj;\n }\n })\n')) + var.get(u'helpers').put(u'interopRequireWildcard', PyJs_LONG_754_()) + var.get(u'helpers').put(u'newArrowCheck', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (innerThis, boundThis) {\n if (innerThis !== boundThis) {\n throw new TypeError("Cannot instantiate an arrow function");\n }\n });\n'))) + var.get(u'helpers').put(u'objectDestructuringEmpty', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj) {\n if (obj == null) throw new TypeError("Cannot destructure undefined");\n });\n'))) + var.get(u'helpers').put(u'objectWithoutProperties', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (obj, keys) {\n var target = {};\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n return target;\n })\n'))) + var.get(u'helpers').put(u'possibleConstructorReturn', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n });\n'))) + var.get(u'helpers').put(u'selfGlobal', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n typeof global === "undefined" ? self : global\n'))) + def PyJs_LONG_755_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function set(object, property, value, receiver) {\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent !== null) {\n set(parent, property, value, receiver);\n }\n } else if ("value" in desc && desc.writable) {\n desc.value = value;\n } else {\n var setter = desc.set;\n\n if (setter !== undefined) {\n setter.call(receiver, value);\n }\n }\n\n return value;\n });\n')) + var.get(u'helpers').put(u'set', PyJs_LONG_755_()) + def PyJs_LONG_756_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function () {\n // Broken out into a separate function to avoid deoptimizations due to the try/catch for the\n // array iterator case.\n function sliceIterator(arr, i) {\n // this is an expanded form of `for...of` that properly supports abrupt completions of\n // iterators etc. variable names have been minimised to reduce the size of this massive\n // helper. sometimes spec compliancy is annoying :(\n //\n // _n = _iteratorNormalCompletion\n // _d = _didIteratorError\n // _e = _iteratorError\n // _i = _iterator\n // _s = _step\n\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"]) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n }\n };\n })();\n')) + var.get(u'helpers').put(u'slicedToArray', PyJs_LONG_756_()) + def PyJs_LONG_757_(var=var): + return PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n var _arr = [];\n for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {\n _arr.push(_step.value);\n if (i && _arr.length === i) break;\n }\n return _arr;\n } else {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n }\n });\n')) + var.get(u'helpers').put(u'slicedToArrayLoose', PyJs_LONG_757_()) + var.get(u'helpers').put(u'taggedTemplateLiteral', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (strings, raw) {\n return Object.freeze(Object.defineProperties(strings, {\n raw: { value: Object.freeze(raw) }\n }));\n });\n'))) + var.get(u'helpers').put(u'taggedTemplateLiteralLoose', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (strings, raw) {\n strings.raw = raw;\n return strings;\n });\n'))) + var.get(u'helpers').put(u'temporalRef', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (val, name, undef) {\n if (val === undef) {\n throw new ReferenceError(name + " is not defined - temporal dead zone");\n } else {\n return val;\n }\n })\n'))) + var.get(u'helpers').put(u'temporalUndefined', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n ({})\n'))) + var.get(u'helpers').put(u'toArray', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (arr) {\n return Array.isArray(arr) ? arr : Array.from(arr);\n });\n'))) + var.get(u'helpers').put(u'toConsumableArray', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n return arr2;\n } else {\n return Array.from(arr);\n }\n });\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_739_._set_name(u'anonymous') +PyJs_Object_758_ = Js({u'babel-template':Js(221.0)}) +@Js +def PyJs_anonymous_759_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'get', u'_helpers2', u'require', u'list', u'_helpers', u'_keys2', u'_keys', u'module', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_760_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_760_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_get_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name', u'fn']) + var.put(u'fn', var.get(u'_helpers2').get(u'default').get(var.get(u'name'))) + if var.get(u'fn').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create((Js(u'Unknown helper ')+var.get(u'name')))) + raise PyJsTempException + return var.get(u'fn')().get(u'expression') + PyJsHoisted_get_.func_name = u'get' + var.put(u'get', PyJsHoisted_get_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'list', var.get(u'undefined')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.get(u'exports').put(u'get', var.get(u'get')) + var.put(u'_helpers', var.get(u'require')(Js(u'./helpers'))) + var.put(u'_helpers2', var.get(u'_interopRequireDefault')(var.get(u'_helpers'))) + pass + pass + @Js + def PyJs_anonymous_761_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return PyJsStrictNeq(var.get(u'name'),Js(u'__esModule')) + PyJs_anonymous_761_._set_name(u'anonymous') + @Js + def PyJs_anonymous_762_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u'name').callprop(u'slice', Js(1.0)) if PyJsStrictEq(var.get(u'name').get(u'0'),Js(u'_')) else var.get(u'name')) + PyJs_anonymous_762_._set_name(u'anonymous') + var.put(u'list', var.get(u'exports').put(u'list', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'_helpers2').get(u'default')).callprop(u'map', PyJs_anonymous_762_).callprop(u'filter', PyJs_anonymous_761_))) + var.get(u'exports').put(u'default', var.get(u'get')) +PyJs_anonymous_759_._set_name(u'anonymous') +PyJs_Object_763_ = Js({u'./helpers':Js(55.0),u'babel-runtime/core-js/object/keys':Js(103.0)}) +@Js +def PyJs_anonymous_764_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_stringify2', u'_interopRequireWildcard', u'get', u'require', u'parseArgs', u'MESSAGES', u'_util', u'util', u'_stringify', u'module', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_766_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_766_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_parseArgs_(args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'arguments':arguments}, var) + var.registers([u'args']) + @Js + def PyJs_anonymous_769_(val, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'val':val}, var) + var.registers([u'val']) + if ((var.get(u'val')!=var.get(u"null")) and var.get(u'val').get(u'inspect')): + return var.get(u'val').callprop(u'inspect') + else: + try: + return (PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'val')) or (var.get(u'val')+Js(u''))) + except PyJsException as PyJsTempException: + PyJsHolder_65_98138155 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'util').callprop(u'inspect', var.get(u'val')) + finally: + if PyJsHolder_65_98138155 is not None: + var.own[u'e'] = PyJsHolder_65_98138155 + else: + del var.own[u'e'] + del PyJsHolder_65_98138155 + PyJs_anonymous_769_._set_name(u'anonymous') + return var.get(u'args').callprop(u'map', PyJs_anonymous_769_) + PyJsHoisted_parseArgs_.func_name = u'parseArgs' + var.put(u'parseArgs', PyJsHoisted_parseArgs_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_765_ = Js({}) + var.put(u'newObj', PyJs_Object_765_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_get_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'_len', u'_key', u'args', u'key', u'msg']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(((var.get(u'_len')-Js(1.0)) if (var.get(u'_len')>Js(1.0)) else Js(0.0)))) + var.put(u'_key', Js(1.0)) + while (var.get(u'_key')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i').get(u'value')) + var.put(u'violation', var.get(u'_ref3')) + PyJsTempException = JsToPyException(var.get(u'violation').callprop(u'buildCodeFrameError', var.get(u'messages').callprop(u'get', Js(u'readOnly'), var.get(u'name')))) + raise PyJsTempException + + PyJs_Scope_775_._set_name(u'Scope') + PyJs_Object_774_ = Js({u'Scope':PyJs_Scope_775_}) + PyJs_Object_773_ = Js({u'visitor':PyJs_Object_774_}) + return PyJs_Object_773_ + PyJs_anonymous_772_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_772_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_771_._set_name(u'anonymous') +PyJs_Object_777_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_778_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_779_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + @Js + def PyJs_ArrowFunctionExpression_782_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_782_}, var) + var.registers([u'node', u'path', u'state', u'boundThis']) + if var.get(u'state').get(u'opts').get(u'spec'): + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(u'shadow'): + return var.get('undefined') + PyJs_Object_783_ = Js({u'this':Js(False)}) + var.get(u'node').put(u'shadow', PyJs_Object_783_) + var.get(u'node').put(u'type', Js(u'FunctionExpression')) + var.put(u'boundThis', var.get(u't').callprop(u'thisExpression')) + var.get(u'boundThis').put(u'_forceShadow', var.get(u'path')) + var.get(u'path').callprop(u'ensureBlock') + var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'unshiftContainer', Js(u'body'), var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'newArrowCheck')), Js([var.get(u't').callprop(u'thisExpression'), var.get(u'boundThis')])))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'node'), var.get(u't').callprop(u'identifier', Js(u'bind'))), Js([var.get(u't').callprop(u'thisExpression')]))) + else: + var.get(u'path').callprop(u'arrowFunctionToShadowed') + PyJs_ArrowFunctionExpression_782_._set_name(u'ArrowFunctionExpression') + PyJs_Object_781_ = Js({u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_782_}) + PyJs_Object_780_ = Js({u'visitor':PyJs_Object_781_}) + return PyJs_Object_780_ + PyJs_anonymous_779_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_779_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_778_._set_name(u'anonymous') +PyJs_Object_784_ = Js({}) +@Js +def PyJs_anonymous_785_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_792_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_792_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_786_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u't', u'statementList']) + @Js + def PyJsHoisted_statementList_(key, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'key':key}, var) + var.registers([u'key', u'paths', u'_isArray', u'_iterator', u'func', u'_ref2', u'declar', u'_i', u'path', u'_path']) + var.put(u'paths', var.get(u'path').callprop(u'get', var.get(u'key'))) + #for JS loop + var.put(u'_iterator', var.get(u'paths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'_path', var.get(u'_ref2')) + var.put(u'func', var.get(u'_path').get(u'node')) + if var.get(u'_path').callprop(u'isFunctionDeclaration').neg(): + continue + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'let'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'func').get(u'id'), var.get(u't').callprop(u'toExpression', var.get(u'func')))]))) + var.get(u'declar').put(u'_blockHoist', Js(2.0)) + var.get(u'func').put(u'id', var.get(u"null")) + var.get(u'_path').callprop(u'replaceWith', var.get(u'declar')) + + PyJsHoisted_statementList_.func_name = u'statementList' + var.put(u'statementList', PyJsHoisted_statementList_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + @Js + def PyJs_BlockStatement_789_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'BlockStatement':PyJs_BlockStatement_789_}, var) + var.registers([u'node', u'path', u'parent']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + PyJs_Object_790_ = Js({u'body':var.get(u'node')}) + if (var.get(u't').callprop(u'isFunction', var.get(u'parent'), PyJs_Object_790_) or var.get(u't').callprop(u'isExportDeclaration', var.get(u'parent'))): + return var.get('undefined') + var.get(u'statementList')(Js(u'body'), var.get(u'path')) + PyJs_BlockStatement_789_._set_name(u'BlockStatement') + @Js + def PyJs_SwitchCase_791_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'SwitchCase':PyJs_SwitchCase_791_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'statementList')(Js(u'consequent'), var.get(u'path')) + PyJs_SwitchCase_791_._set_name(u'SwitchCase') + PyJs_Object_788_ = Js({u'BlockStatement':PyJs_BlockStatement_789_,u'SwitchCase':PyJs_SwitchCase_791_}) + PyJs_Object_787_ = Js({u'visitor':PyJs_Object_788_}) + return PyJs_Object_787_ + PyJs_anonymous_786_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_786_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_785_._set_name(u'anonymous') +PyJs_Object_793_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_794_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_symbol2', u'continuationVisitor', u'loopLabelVisitor', u'_babelTemplate', u'module', u'letReferenceFunctionVisitor', u'isVar', u'_interopRequireDefault', u'loopNodeTo', u'_extend', u'_babelTraverse', u'convertBlockScopedToVar', u'_tdz', u'BlockScoping', u'ignoreBlock', u'hoistVarDeclarationsVisitor', u'_values2', u'_extend2', u'_create2', u'buildRetCheck', u'_classCallCheck3', u'_classCallCheck2', u'_create', u'exports', u'_babelTraverse2', u'_interopRequireWildcard', u'_babelTypes', u'_symbol', u'isBlockScoped', u'loopVisitor', u'require', u'_babelTemplate2', u't', u'_values', u'letReferenceBlockVisitor']) + @Js + def PyJsHoisted_convertBlockScopedToVar_(path, node, parent, scope, this, arguments, var=var): + var = Scope({u'node':node, u'arguments':arguments, u'parent':parent, u'scope':scope, u'this':this, u'path':path}, var) + var.registers([u'node', u'name', u'moveBindingsToParent', u'i', u'binding', u'ids', u'declar', u'parent', u'parentScope', u'path', u'scope']) + var.put(u'moveBindingsToParent', (var.get(u'arguments').get(u'4') if ((var.get(u'arguments').get(u'length')>Js(4.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'4'),var.get(u'undefined'))) else Js(False))) + if var.get(u'node').neg(): + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u't').callprop(u'isFor', var.get(u'parent')).neg(): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0)): + return var.get('undefined') + var.put(u'loopText', ((var.get(u'loopText')+Js(u'|'))+var.get(u'node').get(u'label').get(u'name'))) + else: + if var.get(u'state').get(u'ignoreLabeless'): + return var.get('undefined') + if var.get(u'state').get(u'inSwitchCase'): + return var.get('undefined') + if (var.get(u't').callprop(u'isBreakStatement', var.get(u'node')) and var.get(u't').callprop(u'isSwitchCase', var.get(u'parent'))): + return var.get('undefined') + var.get(u'state').put(u'hasBreakContinue', var.get(u'true')) + var.get(u'state').get(u'map').put(var.get(u'loopText'), var.get(u'node')) + var.put(u'replace', var.get(u't').callprop(u'stringLiteral', var.get(u'loopText'))) + if var.get(u'path').callprop(u'isReturnStatement'): + var.get(u'state').put(u'hasReturn', var.get(u'true')) + var.put(u'replace', var.get(u't').callprop(u'objectExpression', Js([var.get(u't').callprop(u'objectProperty', var.get(u't').callprop(u'identifier', Js(u'v')), (var.get(u'node').get(u'argument') or var.get(u'scope').callprop(u'buildUndefinedNode')))]))) + if var.get(u'replace'): + var.put(u'replace', var.get(u't').callprop(u'returnStatement', var.get(u'replace'))) + var.get(u'replace').put(var.get(u"this").get(u'LOOP_IGNORE'), var.get(u'true')) + var.get(u'path').callprop(u'skip') + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'inherits', var.get(u'replace'), var.get(u'node'))) + PyJs_BreakStatementContinueStatementReturnStatement_820_._set_name(u'BreakStatementContinueStatementReturnStatement') + PyJs_Object_816_ = Js({u'Loop':PyJs_Loop_817_,u'Function':PyJs_Function_818_,u'SwitchCase':PyJs_SwitchCase_819_,u'BreakStatement|ContinueStatement|ReturnStatement':PyJs_BreakStatementContinueStatementReturnStatement_820_}) + var.put(u'loopVisitor', PyJs_Object_816_) + @Js + def PyJs_anonymous_821_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'BlockScoping']) + @Js + def PyJsHoisted_BlockScoping_(loopPath, blockPath, parent, scope, file, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'parent':parent, u'file':file, u'blockPath':blockPath, u'this':this, u'scope':scope, u'loopPath':loopPath}, var) + var.registers([u'scope', u'blockPath', u'file', u'parent', u'loopPath']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'BlockScoping')) + var.get(u"this").put(u'parent', var.get(u'parent')) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'file', var.get(u'file')) + var.get(u"this").put(u'blockPath', var.get(u'blockPath')) + var.get(u"this").put(u'block', var.get(u'blockPath').get(u'node')) + var.get(u"this").put(u'outsideLetReferences', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'hasLetReferences', Js(False)) + var.get(u"this").put(u'letReferences', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'body', Js([])) + if var.get(u'loopPath'): + var.get(u"this").put(u'loopParent', var.get(u'loopPath').get(u'parent')) + var.get(u"this").put(u'loopLabel', (var.get(u't').callprop(u'isLabeledStatement', var.get(u"this").get(u'loopParent')) and var.get(u"this").get(u'loopParent').get(u'label'))) + var.get(u"this").put(u'loopPath', var.get(u'loopPath')) + var.get(u"this").put(u'loop', var.get(u'loopPath').get(u'node')) + PyJsHoisted_BlockScoping_.func_name = u'BlockScoping' + var.put(u'BlockScoping', PyJsHoisted_BlockScoping_) + pass + @Js + def PyJs_run_822_(this, arguments, var=var): + var = Scope({u'this':this, u'run':PyJs_run_822_, u'arguments':arguments}, var) + var.registers([u'needsClosure', u'block']) + var.put(u'block', var.get(u"this").get(u'block')) + if var.get(u'block').get(u'_letDone'): + return var.get('undefined') + var.get(u'block').put(u'_letDone', var.get(u'true')) + var.put(u'needsClosure', var.get(u"this").callprop(u'getLetReferences')) + if (var.get(u't').callprop(u'isFunction', var.get(u"this").get(u'parent')) or var.get(u't').callprop(u'isProgram', var.get(u"this").get(u'block'))): + var.get(u"this").callprop(u'updateScopeInfo') + return var.get('undefined') + if var.get(u"this").get(u'hasLetReferences').neg(): + return var.get('undefined') + if var.get(u'needsClosure'): + var.get(u"this").callprop(u'wrapClosure') + else: + var.get(u"this").callprop(u'remap') + var.get(u"this").callprop(u'updateScopeInfo') + if (var.get(u"this").get(u'loopLabel') and var.get(u't').callprop(u'isLabeledStatement', var.get(u"this").get(u'loopParent')).neg()): + return var.get(u't').callprop(u'labeledStatement', var.get(u"this").get(u'loopLabel'), var.get(u"this").get(u'loop')) + PyJs_run_822_._set_name(u'run') + var.get(u'BlockScoping').get(u'prototype').put(u'run', PyJs_run_822_) + @Js + def PyJs_updateScopeInfo_823_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'updateScopeInfo':PyJs_updateScopeInfo_823_}, var) + var.registers([u'letRefs', u'binding', u'key', u'parentScope', u'scope', u'ref']) + var.put(u'scope', var.get(u"this").get(u'scope')) + var.put(u'parentScope', var.get(u'scope').callprop(u'getFunctionParent')) + var.put(u'letRefs', var.get(u"this").get(u'letReferences')) + for PyJsTemp in var.get(u'letRefs'): + var.put(u'key', PyJsTemp) + var.put(u'ref', var.get(u'letRefs').get(var.get(u'key'))) + var.put(u'binding', var.get(u'scope').callprop(u'getBinding', var.get(u'ref').get(u'name'))) + if var.get(u'binding').neg(): + continue + if (PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'let')) or PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'const'))): + var.get(u'binding').put(u'kind', Js(u'var')) + var.get(u'scope').callprop(u'moveBindingTo', var.get(u'ref').get(u'name'), var.get(u'parentScope')) + PyJs_updateScopeInfo_823_._set_name(u'updateScopeInfo') + var.get(u'BlockScoping').get(u'prototype').put(u'updateScopeInfo', PyJs_updateScopeInfo_823_) + @Js + def PyJs_remap_824_(this, arguments, var=var): + var = Scope({u'this':this, u'remap':PyJs_remap_824_, u'arguments':arguments}, var) + var.registers([u'scope', u'ref', u'key', u'letRefs']) + var.put(u'letRefs', var.get(u"this").get(u'letReferences')) + var.put(u'scope', var.get(u"this").get(u'scope')) + for PyJsTemp in var.get(u'letRefs'): + var.put(u'key', PyJsTemp) + var.put(u'ref', var.get(u'letRefs').get(var.get(u'key'))) + if (var.get(u'scope').callprop(u'parentHasBinding', var.get(u'key')) or var.get(u'scope').callprop(u'hasGlobal', var.get(u'key'))): + if var.get(u'scope').callprop(u'hasOwnBinding', var.get(u'key')): + var.get(u'scope').callprop(u'rename', var.get(u'ref').get(u'name')) + if var.get(u"this").get(u'blockPath').get(u'scope').callprop(u'hasOwnBinding', var.get(u'key')): + var.get(u"this").get(u'blockPath').get(u'scope').callprop(u'rename', var.get(u'ref').get(u'name')) + PyJs_remap_824_._set_name(u'remap') + var.get(u'BlockScoping').get(u'prototype').put(u'remap', PyJs_remap_824_) + @Js + def PyJs_wrapClosure_825_(this, arguments, var=var): + var = Scope({u'this':this, u'wrapClosure':PyJs_wrapClosure_825_, u'arguments':arguments}, var) + var.registers([u'hasYield', u'name', u'call', u'args', u'hasAsync', u'ret', u'params', u'fn', u'outsideRefs', u'isSwitch', u'ref', u'id', u'block']) + var.put(u'block', var.get(u"this").get(u'block')) + var.put(u'outsideRefs', var.get(u"this").get(u'outsideLetReferences')) + if var.get(u"this").get(u'loop'): + for PyJsTemp in var.get(u'outsideRefs'): + var.put(u'name', PyJsTemp) + var.put(u'id', var.get(u'outsideRefs').get(var.get(u'name'))) + if (var.get(u"this").get(u'scope').callprop(u'hasGlobal', var.get(u'id').get(u'name')) or var.get(u"this").get(u'scope').callprop(u'parentHasBinding', var.get(u'id').get(u'name'))): + var.get(u'outsideRefs').delete(var.get(u'id').get(u'name')) + var.get(u"this").get(u'letReferences').delete(var.get(u'id').get(u'name')) + var.get(u"this").get(u'scope').callprop(u'rename', var.get(u'id').get(u'name')) + var.get(u"this").get(u'letReferences').put(var.get(u'id').get(u'name'), var.get(u'id')) + var.get(u'outsideRefs').put(var.get(u'id').get(u'name'), var.get(u'id')) + var.get(u"this").put(u'has', var.get(u"this").callprop(u'checkLoop')) + var.get(u"this").callprop(u'hoistVarDeclarations') + var.put(u'params', PyJsComma(Js(0.0),var.get(u'_values2').get(u'default'))(var.get(u'outsideRefs'))) + var.put(u'args', PyJsComma(Js(0.0),var.get(u'_values2').get(u'default'))(var.get(u'outsideRefs'))) + var.put(u'isSwitch', var.get(u"this").get(u'blockPath').callprop(u'isSwitchStatement')) + var.put(u'fn', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'params'), var.get(u't').callprop(u'blockStatement', (Js([var.get(u'block')]) if var.get(u'isSwitch') else var.get(u'block').get(u'body'))))) + var.get(u'fn').put(u'shadow', var.get(u'true')) + var.get(u"this").callprop(u'addContinuations', var.get(u'fn')) + var.put(u'ref', var.get(u'fn')) + if var.get(u"this").get(u'loop'): + var.put(u'ref', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'loop'))) + var.get(u"this").get(u'loopPath').callprop(u'insertBefore', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'fn'))]))) + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u'ref'), var.get(u'args'))) + var.put(u'ret', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifier', Js(u'ret'))) + var.put(u'hasYield', var.get(u'_babelTraverse2').get(u'default').callprop(u'hasType', var.get(u'fn').get(u'body'), var.get(u"this").get(u'scope'), Js(u'YieldExpression'), var.get(u't').get(u'FUNCTION_TYPES'))) + if var.get(u'hasYield'): + var.get(u'fn').put(u'generator', var.get(u'true')) + var.put(u'call', var.get(u't').callprop(u'yieldExpression', var.get(u'call'), var.get(u'true'))) + var.put(u'hasAsync', var.get(u'_babelTraverse2').get(u'default').callprop(u'hasType', var.get(u'fn').get(u'body'), var.get(u"this").get(u'scope'), Js(u'AwaitExpression'), var.get(u't').get(u'FUNCTION_TYPES'))) + if var.get(u'hasAsync'): + var.get(u'fn').put(u'async', var.get(u'true')) + var.put(u'call', var.get(u't').callprop(u'awaitExpression', var.get(u'call'))) + var.get(u"this").callprop(u'buildClosure', var.get(u'ret'), var.get(u'call')) + if var.get(u'isSwitch'): + var.get(u"this").get(u'blockPath').callprop(u'replaceWithMultiple', var.get(u"this").get(u'body')) + else: + var.get(u'block').put(u'body', var.get(u"this").get(u'body')) + PyJs_wrapClosure_825_._set_name(u'wrapClosure') + var.get(u'BlockScoping').get(u'prototype').put(u'wrapClosure', PyJs_wrapClosure_825_) + @Js + def PyJs_buildClosure_826_(ret, call, this, arguments, var=var): + var = Scope({u'this':this, u'buildClosure':PyJs_buildClosure_826_, u'call':call, u'arguments':arguments, u'ret':ret}, var) + var.registers([u'has', u'call', u'ret']) + var.put(u'has', var.get(u"this").get(u'has')) + if (var.get(u'has').get(u'hasReturn') or var.get(u'has').get(u'hasBreakContinue')): + var.get(u"this").callprop(u'buildHas', var.get(u'ret'), var.get(u'call')) + else: + var.get(u"this").get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'call'))) + PyJs_buildClosure_826_._set_name(u'buildClosure') + var.get(u'BlockScoping').get(u'prototype').put(u'buildClosure', PyJs_buildClosure_826_) + @Js + def PyJs_addContinuations_827_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'addContinuations':PyJs_addContinuations_827_, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'i', u'state', u'newParam', u'param', u'fn']) + PyJs_Object_829_ = Js({}) + PyJs_Object_828_ = Js({u'reassignments':PyJs_Object_829_,u'outsideReferences':var.get(u"this").get(u'outsideLetReferences')}) + var.put(u'state', PyJs_Object_828_) + var.get(u"this").get(u'scope').callprop(u'traverse', var.get(u'fn'), var.get(u'continuationVisitor'), var.get(u'state')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else Js(u'value'))) + var.put(u'scope', var.get(u'arguments').get(u'3')) + var.put(u'mutatorMap', PyJsComma(Js(0.0), Js(None))) + if var.get(u'node').get(u'static'): + var.get(u"this").put(u'hasStaticDescriptors', var.get(u'true')) + var.put(u'mutatorMap', var.get(u"this").get(u'staticMutatorMap')) + else: + var.get(u"this").put(u'hasInstanceDescriptors', var.get(u'true')) + var.put(u'mutatorMap', var.get(u"this").get(u'instanceMutatorMap')) + var.put(u'map', var.get(u'defineMap').callprop(u'push', var.get(u'mutatorMap'), var.get(u'node'), var.get(u'kind'), var.get(u"this").get(u'file'), var.get(u'scope'))) + if var.get(u'enumerable'): + var.get(u'map').put(u'enumerable', var.get(u't').callprop(u'booleanLiteral', var.get(u'true'))) + return var.get(u'map') + PyJs_pushToMap_884_._set_name(u'pushToMap') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushToMap', PyJs_pushToMap_884_) + @Js + def PyJs_constructorMeMaybe_885_(this, arguments, var=var): + var = Scope({u'this':this, u'constructorMeMaybe':PyJs_constructorMeMaybe_885_, u'arguments':arguments}, var) + var.registers([u'body', u'paths', u'_isArray', u'_iterator', u'_constructor', u'params', u'_i', u'path', u'hasConstructor', u'_ref']) + var.put(u'hasConstructor', Js(False)) + var.put(u'paths', var.get(u"this").get(u'path').callprop(u'get', Js(u'body.body'))) + #for JS loop + var.put(u'_iterator', var.get(u'paths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'path', var.get(u'_ref')) + var.put(u'hasConstructor', var.get(u'path').callprop(u'equals', Js(u'kind'), Js(u'constructor'))) + if var.get(u'hasConstructor'): + break + + if var.get(u'hasConstructor'): + return var.get('undefined') + var.put(u'params', PyJsComma(Js(0.0), Js(None))) + var.put(u'body', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").get(u'isDerived'): + var.put(u'_constructor', var.get(u'buildDerivedConstructor')().get(u'expression')) + var.put(u'params', var.get(u'_constructor').get(u'params')) + var.put(u'body', var.get(u'_constructor').get(u'body')) + else: + var.put(u'params', Js([])) + var.put(u'body', var.get(u't').callprop(u'blockStatement', Js([]))) + var.get(u"this").get(u'path').callprop(u'get', Js(u'body')).callprop(u'unshiftContainer', Js(u'body'), var.get(u't').callprop(u'classMethod', Js(u'constructor'), var.get(u't').callprop(u'identifier', Js(u'constructor')), var.get(u'params'), var.get(u'body'))) + PyJs_constructorMeMaybe_885_._set_name(u'constructorMeMaybe') + var.get(u'ClassTransformer').get(u'prototype').put(u'constructorMeMaybe', PyJs_constructorMeMaybe_885_) + @Js + def PyJs_buildBody_886_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'buildBody':PyJs_buildBody_886_}, var) + var.registers([u'constructorBody']) + var.get(u"this").callprop(u'constructorMeMaybe') + var.get(u"this").callprop(u'pushBody') + var.get(u"this").callprop(u'verifyConstructor') + if var.get(u"this").get(u'userConstructor'): + var.put(u'constructorBody', var.get(u"this").get(u'constructorBody')) + var.get(u'constructorBody').put(u'body', var.get(u'constructorBody').get(u'body').callprop(u'concat', var.get(u"this").get(u'userConstructor').get(u'body').get(u'body'))) + var.get(u't').callprop(u'inherits', var.get(u"this").get(u'constructor'), var.get(u"this").get(u'userConstructor')) + var.get(u't').callprop(u'inherits', var.get(u'constructorBody'), var.get(u"this").get(u'userConstructor').get(u'body')) + var.get(u"this").callprop(u'pushDescriptors') + PyJs_buildBody_886_._set_name(u'buildBody') + var.get(u'ClassTransformer').get(u'prototype').put(u'buildBody', PyJs_buildBody_886_) + @Js + def PyJs_pushBody_887_(this, arguments, var=var): + var = Scope({u'this':this, u'pushBody':PyJs_pushBody_887_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray2', u'isConstructor', u'_i2', u'classBodyPaths', u'_ref2', u'replaceSupers', u'path', u'_iterator2']) + var.put(u'classBodyPaths', var.get(u"this").get(u'path').callprop(u'get', Js(u'body.body'))) + #for JS loop + var.put(u'_iterator2', var.get(u'classBodyPaths')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'path', var.get(u'_ref2')) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'isClassProperty'): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'Missing class properties transform.'))) + raise PyJsTempException + if var.get(u'node').get(u'decorators'): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'Method has decorators, put the decorator plugin before the classes one.'))) + raise PyJsTempException + if var.get(u't').callprop(u'isClassMethod', var.get(u'node')): + var.put(u'isConstructor', PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'constructor'))) + if var.get(u'isConstructor'): + var.get(u'path').callprop(u'traverse', var.get(u'verifyConstructorVisitor'), var.get(u"this")) + if (var.get(u"this").get(u'hasBareSuper').neg() and var.get(u"this").get(u'isDerived')): + PyJsTempException = JsToPyException(var.get(u'path').callprop(u'buildCodeFrameError', Js(u'missing super() call in constructor'))) + raise PyJsTempException + PyJs_Object_888_ = Js({u'forceSuperMemoisation':var.get(u'isConstructor'),u'methodPath':var.get(u'path'),u'methodNode':var.get(u'node'),u'objectRef':var.get(u"this").get(u'classRef'),u'superRef':var.get(u"this").get(u'superName'),u'isStatic':var.get(u'node').get(u'static'),u'isLoose':var.get(u"this").get(u'isLoose'),u'scope':var.get(u"this").get(u'scope'),u'file':var.get(u"this").get(u'file')}) + var.put(u'replaceSupers', var.get(u'_babelHelperReplaceSupers2').get(u'default').create(PyJs_Object_888_, var.get(u'true'))) + var.get(u'replaceSupers').callprop(u'replace') + if var.get(u'isConstructor'): + var.get(u"this").callprop(u'pushConstructor', var.get(u'replaceSupers'), var.get(u'node'), var.get(u'path')) + else: + var.get(u"this").callprop(u'pushMethod', var.get(u'node'), var.get(u'path')) + + PyJs_pushBody_887_._set_name(u'pushBody') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushBody', PyJs_pushBody_887_) + @Js + def PyJs_clearDescriptors_889_(this, arguments, var=var): + var = Scope({u'this':this, u'clearDescriptors':PyJs_clearDescriptors_889_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'hasInstanceDescriptors', Js(False)) + var.get(u"this").put(u'hasStaticDescriptors', Js(False)) + PyJs_Object_890_ = Js({}) + var.get(u"this").put(u'instanceMutatorMap', PyJs_Object_890_) + PyJs_Object_891_ = Js({}) + var.get(u"this").put(u'staticMutatorMap', PyJs_Object_891_) + PyJs_clearDescriptors_889_._set_name(u'clearDescriptors') + var.get(u'ClassTransformer').get(u'prototype').put(u'clearDescriptors', PyJs_clearDescriptors_889_) + @Js + def PyJs_pushDescriptors_892_(this, arguments, var=var): + var = Scope({u'this':this, u'pushDescriptors':PyJs_pushDescriptors_892_, u'arguments':arguments}, var) + var.registers([u'body', u'i', u'args', u'lastNonNullIndex', u'staticProps', u'instanceProps', u'nullNode']) + var.get(u"this").callprop(u'pushInherits') + var.put(u'body', var.get(u"this").get(u'body')) + var.put(u'instanceProps', PyJsComma(Js(0.0), Js(None))) + var.put(u'staticProps', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").get(u'hasInstanceDescriptors'): + var.put(u'instanceProps', var.get(u'defineMap').callprop(u'toClassObject', var.get(u"this").get(u'instanceMutatorMap'))) + if var.get(u"this").get(u'hasStaticDescriptors'): + var.put(u'staticProps', var.get(u'defineMap').callprop(u'toClassObject', var.get(u"this").get(u'staticMutatorMap'))) + if (var.get(u'instanceProps') or var.get(u'staticProps')): + if var.get(u'instanceProps'): + var.put(u'instanceProps', var.get(u'defineMap').callprop(u'toComputedObjectFromClass', var.get(u'instanceProps'))) + if var.get(u'staticProps'): + var.put(u'staticProps', var.get(u'defineMap').callprop(u'toComputedObjectFromClass', var.get(u'staticProps'))) + var.put(u'nullNode', var.get(u't').callprop(u'nullLiteral')) + var.put(u'args', Js([var.get(u"this").get(u'classRef'), var.get(u'nullNode'), var.get(u'nullNode'), var.get(u'nullNode'), var.get(u'nullNode')])) + if var.get(u'instanceProps'): + var.get(u'args').put(u'1', var.get(u'instanceProps')) + if var.get(u'staticProps'): + var.get(u'args').put(u'2', var.get(u'staticProps')) + if var.get(u"this").get(u'instanceInitializersId'): + var.get(u'args').put(u'3', var.get(u"this").get(u'instanceInitializersId')) + var.get(u'body').callprop(u'unshift', var.get(u"this").callprop(u'buildObjectAssignment', var.get(u"this").get(u'instanceInitializersId'))) + if var.get(u"this").get(u'staticInitializersId'): + var.get(u'args').put(u'4', var.get(u"this").get(u'staticInitializersId')) + var.get(u'body').callprop(u'unshift', var.get(u"this").callprop(u'buildObjectAssignment', var.get(u"this").get(u'staticInitializersId'))) + var.put(u'lastNonNullIndex', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'bareSuper', var.get(u'_ref3')) + var.get(u"this").callprop(u'wrapSuperCall', var.get(u'bareSuper'), var.get(u'superRef'), var.get(u'thisRef'), var.get(u'body')) + if var.get(u'guaranteedSuperBeforeFinish'): + @Js + def PyJs_anonymous_900_(parentPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parentPath':parentPath}, var) + var.registers([u'parentPath']) + if PyJsStrictEq(var.get(u'parentPath'),var.get(u'path')): + return var.get(u'true') + if (var.get(u'parentPath').callprop(u'isLoop') or var.get(u'parentPath').callprop(u'isConditional')): + var.put(u'guaranteedSuperBeforeFinish', Js(False)) + return var.get(u'true') + PyJs_anonymous_900_._set_name(u'anonymous') + var.get(u'bareSuper').callprop(u'find', PyJs_anonymous_900_) + + #for JS loop + var.put(u'_iterator4', var.get(u"this").get(u'superThises')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'thisPath', var.get(u'_ref4')) + var.get(u'thisPath').callprop(u'replaceWith', var.get(u'thisRef')) + + @Js + def PyJs_wrapReturn_901_(returnArg, this, arguments, var=var): + var = Scope({u'this':this, u'returnArg':returnArg, u'wrapReturn':PyJs_wrapReturn_901_, u'arguments':arguments}, var) + var.registers([u'returnArg']) + return var.get(u't').callprop(u'callExpression', var.get(u'_this2').get(u'file').callprop(u'addHelper', Js(u'possibleConstructorReturn')), Js([var.get(u'thisRef')]).callprop(u'concat', (var.get(u'returnArg') or Js([])))) + PyJs_wrapReturn_901_._set_name(u'wrapReturn') + var.put(u'wrapReturn', PyJs_wrapReturn_901_) + var.put(u'bodyPaths', var.get(u'body').callprop(u'get', Js(u'body'))) + if (var.get(u'bodyPaths').get(u'length') and var.get(u'bodyPaths').callprop(u'pop').callprop(u'isReturnStatement').neg()): + var.get(u'body').callprop(u'pushContainer', Js(u'body'), var.get(u't').callprop(u'returnStatement', (var.get(u'thisRef') if var.get(u'guaranteedSuperBeforeFinish') else var.get(u'wrapReturn')()))) + #for JS loop + var.put(u'_iterator5', var.get(u"this").get(u'superReturns')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'returnPath', var.get(u'_ref5')) + if var.get(u'returnPath').get(u'node').get(u'argument'): + var.put(u'ref', var.get(u'returnPath').get(u'scope').callprop(u'generateDeclaredUidIdentifier', Js(u'ret'))) + var.get(u'returnPath').callprop(u'get', Js(u'argument')).callprop(u'replaceWithMultiple', Js([var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'ref'), var.get(u'returnPath').get(u'node').get(u'argument')), var.get(u'wrapReturn')(var.get(u'ref'))])) + else: + var.get(u'returnPath').callprop(u'get', Js(u'argument')).callprop(u'replaceWith', var.get(u'wrapReturn')()) + + PyJs_verifyConstructor_899_._set_name(u'verifyConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'verifyConstructor', PyJs_verifyConstructor_899_) + @Js + def PyJs_pushMethod_902_(node, path, this, arguments, var=var): + var = Scope({u'node':node, u'path':path, u'this':this, u'arguments':arguments, u'pushMethod':PyJs_pushMethod_902_}, var) + var.registers([u'node', u'scope', u'path']) + var.put(u'scope', (var.get(u'path').get(u'scope') if var.get(u'path') else var.get(u"this").get(u'scope'))) + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'method')): + if var.get(u"this").callprop(u'_processMethod', var.get(u'node'), var.get(u'scope')): + return var.get('undefined') + var.get(u"this").callprop(u'pushToMap', var.get(u'node'), Js(False), var.get(u"null"), var.get(u'scope')) + PyJs_pushMethod_902_._set_name(u'pushMethod') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushMethod', PyJs_pushMethod_902_) + @Js + def PyJs__processMethod_903_(this, arguments, var=var): + var = Scope({u'this':this, u'_processMethod':PyJs__processMethod_903_, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJs__processMethod_903_._set_name(u'_processMethod') + var.get(u'ClassTransformer').get(u'prototype').put(u'_processMethod', PyJs__processMethod_903_) + @Js + def PyJs_pushConstructor_904_(replaceSupers, method, path, this, arguments, var=var): + var = Scope({u'this':this, u'replaceSupers':replaceSupers, u'arguments':arguments, u'path':path, u'method':method, u'pushConstructor':PyJs_pushConstructor_904_}, var) + var.registers([u'path', u'replaceSupers', u'construct', u'method']) + var.get(u"this").put(u'bareSupers', var.get(u'replaceSupers').get(u'bareSupers')) + var.get(u"this").put(u'superReturns', var.get(u'replaceSupers').get(u'returns')) + if var.get(u'path').get(u'scope').callprop(u'hasOwnBinding', var.get(u"this").get(u'classRef').get(u'name')): + var.get(u'path').get(u'scope').callprop(u'rename', var.get(u"this").get(u'classRef').get(u'name')) + var.put(u'construct', var.get(u"this").get(u'constructor')) + var.get(u"this").put(u'userConstructorPath', var.get(u'path')) + var.get(u"this").put(u'userConstructor', var.get(u'method')) + var.get(u"this").put(u'hasConstructor', var.get(u'true')) + var.get(u't').callprop(u'inheritsComments', var.get(u'construct'), var.get(u'method')) + var.get(u'construct').put(u'_ignoreUserWhitespace', var.get(u'true')) + var.get(u'construct').put(u'params', var.get(u'method').get(u'params')) + var.get(u't').callprop(u'inherits', var.get(u'construct').get(u'body'), var.get(u'method').get(u'body')) + var.get(u'construct').get(u'body').put(u'directives', var.get(u'method').get(u'body').get(u'directives')) + var.get(u"this").callprop(u'_pushConstructor') + PyJs_pushConstructor_904_._set_name(u'pushConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushConstructor', PyJs_pushConstructor_904_) + @Js + def PyJs__pushConstructor_905_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_pushConstructor':PyJs__pushConstructor_905_}, var) + var.registers([]) + if var.get(u"this").get(u'pushedConstructor'): + return var.get('undefined') + var.get(u"this").put(u'pushedConstructor', var.get(u'true')) + if (var.get(u"this").get(u'hasInstanceDescriptors') or var.get(u"this").get(u'hasStaticDescriptors')): + var.get(u"this").callprop(u'pushDescriptors') + var.get(u"this").get(u'body').callprop(u'push', var.get(u"this").get(u'constructor')) + var.get(u"this").callprop(u'pushInherits') + PyJs__pushConstructor_905_._set_name(u'_pushConstructor') + var.get(u'ClassTransformer').get(u'prototype').put(u'_pushConstructor', PyJs__pushConstructor_905_) + @Js + def PyJs_pushInherits_906_(this, arguments, var=var): + var = Scope({u'this':this, u'pushInherits':PyJs_pushInherits_906_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'isDerived').neg() or var.get(u"this").get(u'pushedInherits')): + return var.get('undefined') + var.get(u"this").put(u'pushedInherits', var.get(u'true')) + var.get(u"this").get(u'body').callprop(u'unshift', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'inherits')), Js([var.get(u"this").get(u'classRef'), var.get(u"this").get(u'superName')])))) + PyJs_pushInherits_906_._set_name(u'pushInherits') + var.get(u'ClassTransformer').get(u'prototype').put(u'pushInherits', PyJs_pushInherits_906_) + return var.get(u'ClassTransformer') + PyJs_anonymous_879_._set_name(u'anonymous') + var.put(u'ClassTransformer', PyJs_anonymous_879_()) + var.get(u'exports').put(u'default', var.get(u'ClassTransformer')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_865_._set_name(u'anonymous') +PyJs_Object_907_ = Js({u'babel-helper-define-map':Js(48.0),u'babel-helper-optimise-call-expression':Js(52.0),u'babel-helper-replace-supers':Js(54.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-template':Js(221.0),u'babel-traverse':Js(225.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_908_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_918_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_918_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_909_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'loose', u'pushAssign', u'getValue', u'pushMutatorDefine', u't', u'template', u'buildMutatorMapAssign', u'spec']) + @Js + def PyJsHoisted_spec_(info, this, arguments, var=var): + var = Scope({u'info':info, u'this':this, u'arguments':arguments}, var) + var.registers([u'body', u'info', u'_isArray2', u'_ref4', u'_i2', u'prop', u'state', u'computedProps', u'objId', u'key', u'_iterator2']) + var.put(u'objId', var.get(u'info').get(u'objId')) + var.put(u'body', var.get(u'info').get(u'body')) + var.put(u'computedProps', var.get(u'info').get(u'computedProps')) + var.put(u'state', var.get(u'info').get(u'state')) + #for JS loop + var.put(u'_iterator2', var.get(u'computedProps')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i2').get(u'value')) + var.put(u'prop', var.get(u'_ref4')) + var.put(u'key', var.get(u't').callprop(u'toComputedKey', var.get(u'prop'))) + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u'pushMutatorDefine')(var.get(u'info'), var.get(u'prop')) + else: + PyJs_Object_911_ = Js({u'value':Js(u'__proto__')}) + if var.get(u't').callprop(u'isStringLiteral', var.get(u'key'), PyJs_Object_911_): + var.get(u'pushAssign')(var.get(u'objId'), var.get(u'prop'), var.get(u'body')) + else: + if PyJsStrictEq(var.get(u'computedProps').get(u'length'),Js(1.0)): + return var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'defineProperty')), Js([var.get(u'info').get(u'initPropExpression'), var.get(u'key'), var.get(u'getValue')(var.get(u'prop'))])) + else: + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'defineProperty')), Js([var.get(u'objId'), var.get(u'key'), var.get(u'getValue')(var.get(u'prop'))])))) + + PyJsHoisted_spec_.func_name = u'spec' + var.put(u'spec', PyJsHoisted_spec_) + @Js + def PyJsHoisted_pushMutatorDefine_(_ref2, prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_ref2':_ref2, u'prop':prop}, var) + var.registers([u'body', u'maybeMemoise', u'_ref2', u'prop', u'objId', u'key', u'scope', u'getMutatorId']) + var.put(u'objId', var.get(u'_ref2').get(u'objId')) + var.put(u'body', var.get(u'_ref2').get(u'body')) + var.put(u'getMutatorId', var.get(u'_ref2').get(u'getMutatorId')) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + var.put(u'key', (var.get(u't').callprop(u'stringLiteral', var.get(u'prop').get(u'key').get(u'name')) if (var.get(u'prop').get(u'computed').neg() and var.get(u't').callprop(u'isIdentifier', var.get(u'prop').get(u'key'))) else var.get(u'prop').get(u'key'))) + var.put(u'maybeMemoise', var.get(u'scope').callprop(u'maybeGenerateMemoised', var.get(u'key'))) + if var.get(u'maybeMemoise'): + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'maybeMemoise'), var.get(u'key')))) + var.put(u'key', var.get(u'maybeMemoise')) + PyJs_Object_910_ = Js({u'MUTATOR_MAP_REF':var.get(u'getMutatorId')(),u'KEY':var.get(u'key'),u'VALUE':var.get(u'getValue')(var.get(u'prop')),u'KIND':var.get(u't').callprop(u'identifier', var.get(u'prop').get(u'kind'))}) + var.get(u'body').get(u'push').callprop(u'apply', var.get(u'body'), var.get(u'buildMutatorMapAssign')(PyJs_Object_910_)) + PyJsHoisted_pushMutatorDefine_.func_name = u'pushMutatorDefine' + var.put(u'pushMutatorDefine', PyJsHoisted_pushMutatorDefine_) + @Js + def PyJsHoisted_loose_(info, this, arguments, var=var): + var = Scope({u'info':info, u'this':this, u'arguments':arguments}, var) + var.registers([u'info', u'_isArray', u'_iterator', u'_ref3', u'prop', u'_i']) + #for JS loop + var.put(u'_iterator', var.get(u'info').get(u'computedProps')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref3')) + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u'pushMutatorDefine')(var.get(u'info'), var.get(u'prop')) + else: + var.get(u'pushAssign')(var.get(u'info').get(u'objId'), var.get(u'prop'), var.get(u'info').get(u'body')) + + PyJsHoisted_loose_.func_name = u'loose' + var.put(u'loose', PyJsHoisted_loose_) + @Js + def PyJsHoisted_pushAssign_(objId, prop, body, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'objId':objId, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'body', u'objId', u'prop']) + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) and PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u'pushMutatorDefine')(var.get(u'objId'), var.get(u'prop'), var.get(u'body')) + else: + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u'objId'), var.get(u'prop').get(u'key'), (var.get(u'prop').get(u'computed') or var.get(u't').callprop(u'isLiteral', var.get(u'prop').get(u'key')))), var.get(u'getValue')(var.get(u'prop'))))) + PyJsHoisted_pushAssign_.func_name = u'pushAssign' + var.put(u'pushAssign', PyJsHoisted_pushAssign_) + @Js + def PyJsHoisted_getValue_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'prop']) + if var.get(u't').callprop(u'isObjectProperty', var.get(u'prop')): + return var.get(u'prop').get(u'value') + else: + if var.get(u't').callprop(u'isObjectMethod', var.get(u'prop')): + return var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'prop').get(u'params'), var.get(u'prop').get(u'body'), var.get(u'prop').get(u'generator'), var.get(u'prop').get(u'async')) + PyJsHoisted_getValue_.func_name = u'getValue' + var.put(u'getValue', PyJsHoisted_getValue_) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'template', var.get(u'_ref').get(u'template')) + var.put(u'buildMutatorMapAssign', var.get(u'template')(Js(u'\n MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {};\n MUTATOR_MAP_REF[KEY].KIND = VALUE;\n '))) + pass + pass + pass + pass + pass + @Js + def PyJs_exit_915_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_915_, u'arguments':arguments}, var) + var.registers([u'body', u'_isArray4', u'_isArray3', u'initProps', u'single', u'computedProps', u'_i4', u'_i3', u'hasComputed', u'prop', u'state', u'scope', u'getMutatorId', u'node', u'parent', u'initPropExpression', u'mutatorRef', u'foundComputed', u'objId', u'path', u'_prop', u'_ref6', u'_ref5', u'callback', u'_iterator4', u'_iterator3']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'hasComputed', Js(False)) + #for JS loop + var.put(u'_iterator3', var.get(u'node').get(u'properties')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i3').get(u'value')) + var.put(u'prop', var.get(u'_ref5')) + var.put(u'hasComputed', PyJsStrictEq(var.get(u'prop').get(u'computed'),var.get(u'true'))) + if var.get(u'hasComputed'): + break + + if var.get(u'hasComputed').neg(): + return var.get('undefined') + var.put(u'initProps', Js([])) + var.put(u'computedProps', Js([])) + var.put(u'foundComputed', Js(False)) + #for JS loop + var.put(u'_iterator4', var.get(u'node').get(u'properties')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i4').get(u'value')) + var.put(u'_prop', var.get(u'_ref6')) + if var.get(u'_prop').get(u'computed'): + var.put(u'foundComputed', var.get(u'true')) + if var.get(u'foundComputed'): + var.get(u'computedProps').callprop(u'push', var.get(u'_prop')) + else: + var.get(u'initProps').callprop(u'push', var.get(u'_prop')) + + var.put(u'objId', var.get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'parent'))) + var.put(u'initPropExpression', var.get(u't').callprop(u'objectExpression', var.get(u'initProps'))) + var.put(u'body', Js([])) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'objId'), var.get(u'initPropExpression'))]))) + var.put(u'callback', var.get(u'spec')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'callback', var.get(u'loose')) + var.put(u'mutatorRef', PyJsComma(Js(0.0), Js(None))) + @Js + def PyJs_getMutatorId_916_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getMutatorId':PyJs_getMutatorId_916_}, var) + var.registers([]) + if var.get(u'mutatorRef').neg(): + var.put(u'mutatorRef', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'mutatorMap'))) + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'mutatorRef'), var.get(u't').callprop(u'objectExpression', Js([])))]))) + return var.get(u'mutatorRef') + PyJs_getMutatorId_916_._set_name(u'getMutatorId') + var.put(u'getMutatorId', PyJs_getMutatorId_916_) + PyJs_Object_917_ = Js({u'scope':var.get(u'scope'),u'objId':var.get(u'objId'),u'body':var.get(u'body'),u'computedProps':var.get(u'computedProps'),u'initPropExpression':var.get(u'initPropExpression'),u'getMutatorId':var.get(u'getMutatorId'),u'state':var.get(u'state')}) + var.put(u'single', var.get(u'callback')(PyJs_Object_917_)) + if var.get(u'mutatorRef'): + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'state').callprop(u'addHelper', Js(u'defineEnumerableProperties')), Js([var.get(u'objId'), var.get(u'mutatorRef')])))) + if var.get(u'single'): + var.get(u'path').callprop(u'replaceWith', var.get(u'single')) + else: + var.get(u'body').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'objId'))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'body')) + PyJs_exit_915_._set_name(u'exit') + PyJs_Object_914_ = Js({u'exit':PyJs_exit_915_}) + PyJs_Object_913_ = Js({u'ObjectExpression':PyJs_Object_914_}) + PyJs_Object_912_ = Js({u'visitor':PyJs_Object_913_}) + return PyJs_Object_912_ + PyJs_anonymous_909_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_909_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_908_._set_name(u'anonymous') +PyJs_Object_919_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_920_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_classCallCheck2', u'require', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_getIterator3', u'_getIterator2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_950_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_950_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_921_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'DestructuringTransformer', u'hasRest', u'variableDeclarationHasPattern', u't', u'_ref', u'arrayUnpackVisitor']) + @Js + def PyJsHoisted_hasRest_(pattern, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments}, var) + var.registers([u'_isArray2', u'pattern', u'_ref3', u'_i2', u'elem', u'_iterator2']) + #for JS loop + var.put(u'_iterator2', var.get(u'pattern').get(u'elements')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'elem', var.get(u'_ref3')) + if var.get(u't').callprop(u'isRestElement', var.get(u'elem')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_hasRest_.func_name = u'hasRest' + var.put(u'hasRest', PyJsHoisted_hasRest_) + @Js + def PyJsHoisted_variableDeclarationHasPattern_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_ref2', u'declar', u'_i']) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref2')) + if var.get(u't').callprop(u'isPattern', var.get(u'declar').get(u'id')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_variableDeclarationHasPattern_.func_name = u'variableDeclarationHasPattern' + var.put(u'variableDeclarationHasPattern', PyJsHoisted_variableDeclarationHasPattern_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + pass + @Js + def PyJs_ReferencedIdentifier_923_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_923_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if var.get(u'state').get(u'bindings').get(var.get(u'path').get(u'node').get(u'name')): + var.get(u'state').put(u'deopt', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJs_ReferencedIdentifier_923_._set_name(u'ReferencedIdentifier') + PyJs_Object_922_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_923_}) + var.put(u'arrayUnpackVisitor', PyJs_Object_922_) + @Js + def PyJs_anonymous_924_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'DestructuringTransformer']) + @Js + def PyJsHoisted_DestructuringTransformer_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'DestructuringTransformer')) + var.get(u"this").put(u'blockHoist', var.get(u'opts').get(u'blockHoist')) + var.get(u"this").put(u'operator', var.get(u'opts').get(u'operator')) + PyJs_Object_925_ = Js({}) + var.get(u"this").put(u'arrays', PyJs_Object_925_) + var.get(u"this").put(u'nodes', (var.get(u'opts').get(u'nodes') or Js([]))) + var.get(u"this").put(u'scope', var.get(u'opts').get(u'scope')) + var.get(u"this").put(u'file', var.get(u'opts').get(u'file')) + var.get(u"this").put(u'kind', var.get(u'opts').get(u'kind')) + PyJsHoisted_DestructuringTransformer_.func_name = u'DestructuringTransformer' + var.put(u'DestructuringTransformer', PyJsHoisted_DestructuringTransformer_) + pass + @Js + def PyJs_buildVariableAssignment_926_(id, init, this, arguments, var=var): + var = Scope({u'this':this, u'init':init, u'buildVariableAssignment':PyJs_buildVariableAssignment_926_, u'id':id, u'arguments':arguments}, var) + var.registers([u'node', u'init', u'id', u'op']) + var.put(u'op', var.get(u"this").get(u'operator')) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'id')): + var.put(u'op', Js(u'=')) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + if var.get(u'op'): + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', var.get(u'op'), var.get(u'id'), var.get(u'init')))) + else: + var.put(u'node', var.get(u't').callprop(u'variableDeclaration', var.get(u"this").get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'id'), var.get(u'init'))]))) + var.get(u'node').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + return var.get(u'node') + PyJs_buildVariableAssignment_926_._set_name(u'buildVariableAssignment') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'buildVariableAssignment', PyJs_buildVariableAssignment_926_) + @Js + def PyJs_buildVariableDeclaration_927_(id, init, this, arguments, var=var): + var = Scope({u'this':this, u'init':init, u'buildVariableDeclaration':PyJs_buildVariableDeclaration_927_, u'id':id, u'arguments':arguments}, var) + var.registers([u'init', u'declar', u'id']) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'id'), var.get(u'init'))]))) + var.get(u'declar').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + return var.get(u'declar') + PyJs_buildVariableDeclaration_927_._set_name(u'buildVariableDeclaration') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'buildVariableDeclaration', PyJs_buildVariableDeclaration_927_) + @Js + def PyJs_push_928_(id, init, this, arguments, var=var): + var = Scope({u'this':this, u'push':PyJs_push_928_, u'init':init, u'id':id, u'arguments':arguments}, var) + var.registers([u'init', u'id']) + if var.get(u't').callprop(u'isObjectPattern', var.get(u'id')): + var.get(u"this").callprop(u'pushObjectPattern', var.get(u'id'), var.get(u'init')) + else: + if var.get(u't').callprop(u'isArrayPattern', var.get(u'id')): + var.get(u"this").callprop(u'pushArrayPattern', var.get(u'id'), var.get(u'init')) + else: + if var.get(u't').callprop(u'isAssignmentPattern', var.get(u'id')): + var.get(u"this").callprop(u'pushAssignmentPattern', var.get(u'id'), var.get(u'init')) + else: + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'id'), var.get(u'init'))) + PyJs_push_928_._set_name(u'push') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'push', PyJs_push_928_) + @Js + def PyJs_toArray_929_(node, count, this, arguments, var=var): + var = Scope({u'node':node, u'count':count, u'this':this, u'arguments':arguments, u'toArray':PyJs_toArray_929_}, var) + var.registers([u'node', u'count']) + if (var.get(u"this").get(u'file').get(u'opts').get(u'loose') or (var.get(u't').callprop(u'isIdentifier', var.get(u'node')) and var.get(u"this").get(u'arrays').get(var.get(u'node').get(u'name')))): + return var.get(u'node') + else: + return var.get(u"this").get(u'scope').callprop(u'toArray', var.get(u'node'), var.get(u'count')) + PyJs_toArray_929_._set_name(u'toArray') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'toArray', PyJs_toArray_929_) + @Js + def PyJs_pushAssignmentPattern_930_(pattern, valueRef, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'valueRef':valueRef, u'arguments':arguments, u'pushAssignmentPattern':PyJs_pushAssignmentPattern_930_}, var) + var.registers([u'pattern', u'tempValueDefault', u'declar', u'tempValueRef', u'tempConditional', u'valueRef', u'left']) + var.put(u'tempValueRef', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'valueRef'))) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'tempValueRef'), var.get(u'valueRef'))]))) + var.get(u'declar').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u'declar')) + var.put(u'tempConditional', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'tempValueRef'), var.get(u't').callprop(u'identifier', Js(u'undefined'))), var.get(u'pattern').get(u'right'), var.get(u'tempValueRef'))) + var.put(u'left', var.get(u'pattern').get(u'left')) + if var.get(u't').callprop(u'isPattern', var.get(u'left')): + var.put(u'tempValueDefault', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'tempValueRef'), var.get(u'tempConditional')))) + var.get(u'tempValueDefault').put(u'_blockHoist', var.get(u"this").get(u'blockHoist')) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u'tempValueDefault')) + var.get(u"this").callprop(u'push', var.get(u'left'), var.get(u'tempValueRef')) + else: + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'left'), var.get(u'tempConditional'))) + PyJs_pushAssignmentPattern_930_._set_name(u'pushAssignmentPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushAssignmentPattern', PyJs_pushAssignmentPattern_930_) + @Js + def PyJs_pushObjectRest_931_(pattern, objRef, spreadProp, spreadPropIndex, this, arguments, var=var): + var = Scope({u'objRef':objRef, u'arguments':arguments, u'pushObjectRest':PyJs_pushObjectRest_931_, u'this':this, u'pattern':pattern, u'spreadProp':spreadProp, u'spreadPropIndex':spreadPropIndex}, var) + var.registers([u'keys', u'pattern', u'spreadProp', u'value', u'prop', u'objRef', u'i', u'key', u'spreadPropIndex']) + var.put(u'keys', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'spreadPropIndex')): + break + if var.get(u't').callprop(u'isRestProperty', var.get(u'prop')): + continue + var.put(u'key', var.get(u'prop').get(u'key')) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'key')) and var.get(u'prop').get(u'computed').neg()): + var.put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'prop').get(u'key').get(u'name'))) + var.get(u'keys').callprop(u'push', var.get(u'key')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.put(u'keys', var.get(u't').callprop(u'arrayExpression', var.get(u'keys'))) + var.put(u'value', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'objectWithoutProperties')), Js([var.get(u'objRef'), var.get(u'keys')]))) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'spreadProp').get(u'argument'), var.get(u'value'))) + PyJs_pushObjectRest_931_._set_name(u'pushObjectRest') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushObjectRest', PyJs_pushObjectRest_931_) + @Js + def PyJs_pushObjectProperty_932_(prop, propRef, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'pushObjectProperty':PyJs_pushObjectProperty_932_, u'propRef':propRef, u'prop':prop}, var) + var.registers([u'objRef', u'pattern', u'propRef', u'prop']) + if var.get(u't').callprop(u'isLiteral', var.get(u'prop').get(u'key')): + var.get(u'prop').put(u'computed', var.get(u'true')) + var.put(u'pattern', var.get(u'prop').get(u'value')) + var.put(u'objRef', var.get(u't').callprop(u'memberExpression', var.get(u'propRef'), var.get(u'prop').get(u'key'), var.get(u'prop').get(u'computed'))) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')): + var.get(u"this").callprop(u'push', var.get(u'pattern'), var.get(u'objRef')) + else: + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableAssignment', var.get(u'pattern'), var.get(u'objRef'))) + PyJs_pushObjectProperty_932_._set_name(u'pushObjectProperty') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushObjectProperty', PyJs_pushObjectProperty_932_) + @Js + def PyJs_pushObjectPattern_933_(pattern, objRef, this, arguments, var=var): + var = Scope({u'objRef':objRef, u'pattern':pattern, u'pushObjectPattern':PyJs_pushObjectPattern_933_, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'pattern', u'objRef', u'temp', u'prop']) + if var.get(u'pattern').get(u'properties').get(u'length').neg(): + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").get(u'file').callprop(u'addHelper', Js(u'objectDestructuringEmpty')), Js([var.get(u'objRef')])))) + if ((var.get(u'pattern').get(u'properties').get(u'length')>Js(1.0)) and var.get(u"this").get(u'scope').callprop(u'isStatic', var.get(u'objRef')).neg()): + var.put(u'temp', var.get(u"this").get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'objRef'))) + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableDeclaration', var.get(u'temp'), var.get(u'objRef'))) + var.put(u'objRef', var.get(u'temp')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')var.get(u'arr').get(u'elements').get(u'length')): + return var.get('undefined') + if ((var.get(u'pattern').get(u'elements').get(u'length')=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i3').get(u'value')) + var.put(u'elem', var.get(u'_ref4')) + if var.get(u'elem').neg(): + return Js(False) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'elem')): + return Js(False) + + #for JS loop + var.put(u'_iterator4', var.get(u'arr').get(u'elements')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i4').get(u'value')) + var.put(u'_elem', var.get(u'_ref5')) + if var.get(u't').callprop(u'isSpreadElement', var.get(u'_elem')): + return Js(False) + if var.get(u't').callprop(u'isCallExpression', var.get(u'_elem')): + return Js(False) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'_elem')): + return Js(False) + + var.put(u'bindings', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'pattern'))) + PyJs_Object_935_ = Js({u'deopt':Js(False),u'bindings':var.get(u'bindings')}) + var.put(u'state', PyJs_Object_935_) + var.get(u"this").get(u'scope').callprop(u'traverse', var.get(u'arr'), var.get(u'arrayUnpackVisitor'), var.get(u'state')) + return var.get(u'state').get(u'deopt').neg() + PyJs_canUnpackArrayPattern_934_._set_name(u'canUnpackArrayPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'canUnpackArrayPattern', PyJs_canUnpackArrayPattern_934_) + @Js + def PyJs_pushUnpackedArrayPattern_936_(pattern, arr, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arr':arr, u'arguments':arguments, u'pushUnpackedArrayPattern':PyJs_pushUnpackedArrayPattern_936_}, var) + var.registers([u'i', u'pattern', u'arr', u'elem']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)): + var.put(u'elemRef', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'elemRef'), var.get(u't').callprop(u'identifier', Js(u'slice'))), Js([var.get(u't').callprop(u'numericLiteral', var.get(u'i'))]))) + var.put(u'elem', var.get(u'elem').get(u'argument')) + else: + var.put(u'elemRef', var.get(u't').callprop(u'memberExpression', var.get(u'arrayRef'), var.get(u't').callprop(u'numericLiteral', var.get(u'i')), var.get(u'true'))) + var.get(u"this").callprop(u'push', var.get(u'elem'), var.get(u'elemRef')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJs_pushArrayPattern_937_._set_name(u'pushArrayPattern') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'pushArrayPattern', PyJs_pushArrayPattern_937_) + @Js + def PyJs_init_938_(pattern, ref, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'init':PyJs_init_938_, u'ref':ref, u'arguments':arguments}, var) + var.registers([u'pattern', u'memo', u'ref']) + if (var.get(u't').callprop(u'isArrayExpression', var.get(u'ref')).neg() and var.get(u't').callprop(u'isMemberExpression', var.get(u'ref')).neg()): + var.put(u'memo', var.get(u"this").get(u'scope').callprop(u'maybeGenerateMemoised', var.get(u'ref'), var.get(u'true'))) + if var.get(u'memo'): + var.get(u"this").get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'buildVariableDeclaration', var.get(u'memo'), var.get(u'ref'))) + var.put(u'ref', var.get(u'memo')) + var.get(u"this").callprop(u'push', var.get(u'pattern'), var.get(u'ref')) + return var.get(u"this").get(u'nodes') + PyJs_init_938_._set_name(u'init') + var.get(u'DestructuringTransformer').get(u'prototype').put(u'init', PyJs_init_938_) + return var.get(u'DestructuringTransformer') + PyJs_anonymous_924_._set_name(u'anonymous') + var.put(u'DestructuringTransformer', PyJs_anonymous_924_()) + @Js + def PyJs_ExportNamedDeclaration_941_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ExportNamedDeclaration':PyJs_ExportNamedDeclaration_941_}, var) + var.registers([u'id', u'specifiers', u'path', u'name', u'declaration']) + var.put(u'declaration', var.get(u'path').callprop(u'get', Js(u'declaration'))) + if var.get(u'declaration').callprop(u'isVariableDeclaration').neg(): + return var.get('undefined') + if var.get(u'variableDeclarationHasPattern')(var.get(u'declaration').get(u'node')).neg(): + return var.get('undefined') + var.put(u'specifiers', Js([])) + for PyJsTemp in var.get(u'path').callprop(u'getOuterBindingIdentifiers', var.get(u'path')): + var.put(u'name', PyJsTemp) + var.put(u'id', var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'exportSpecifier', var.get(u'id'), var.get(u'id'))) + var.get(u'path').callprop(u'replaceWith', var.get(u'declaration').get(u'node')) + var.get(u'path').callprop(u'insertAfter', var.get(u't').callprop(u'exportNamedDeclaration', var.get(u"null"), var.get(u'specifiers'))) + PyJs_ExportNamedDeclaration_941_._set_name(u'ExportNamedDeclaration') + @Js + def PyJs_ForXStatement_942_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'ForXStatement':PyJs_ForXStatement_942_}, var) + var.registers([u'node', u'destructuring', u'file', u'temp', u'pattern', u'key', u'path', u'scope', u'nodes', u'block', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'left', var.get(u'node').get(u'left')) + if var.get(u't').callprop(u'isPattern', var.get(u'left')): + var.put(u'temp', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'node').put(u'left', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'temp'))]))) + var.get(u'path').callprop(u'ensureBlock') + var.get(u'node').get(u'body').get(u'body').callprop(u'unshift', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'left'), var.get(u'temp'))]))) + return var.get('undefined') + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')).neg(): + return var.get('undefined') + var.put(u'pattern', var.get(u'left').get(u'declarations').get(u'0').get(u'id')) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')).neg(): + return var.get('undefined') + var.put(u'key', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'node').put(u'left', var.get(u't').callprop(u'variableDeclaration', var.get(u'left').get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'key'), var.get(u"null"))]))) + var.put(u'nodes', Js([])) + PyJs_Object_943_ = Js({u'kind':var.get(u'left').get(u'kind'),u'file':var.get(u'file'),u'scope':var.get(u'scope'),u'nodes':var.get(u'nodes')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_943_)) + var.get(u'destructuring').callprop(u'init', var.get(u'pattern'), var.get(u'key')) + var.get(u'path').callprop(u'ensureBlock') + var.put(u'block', var.get(u'node').get(u'body')) + var.get(u'block').put(u'body', var.get(u'nodes').callprop(u'concat', var.get(u'block').get(u'body'))) + PyJs_ForXStatement_942_._set_name(u'ForXStatement') + @Js + def PyJs_CatchClause_944_(_ref6, file, this, arguments, var=var): + var = Scope({u'this':this, u'_ref6':_ref6, u'arguments':arguments, u'file':file, u'CatchClause':PyJs_CatchClause_944_}, var) + var.registers([u'node', u'destructuring', u'pattern', u'file', u'_ref6', u'scope', u'nodes', u'ref']) + var.put(u'node', var.get(u'_ref6').get(u'node')) + var.put(u'scope', var.get(u'_ref6').get(u'scope')) + var.put(u'pattern', var.get(u'node').get(u'param')) + if var.get(u't').callprop(u'isPattern', var.get(u'pattern')).neg(): + return var.get('undefined') + var.put(u'ref', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'node').put(u'param', var.get(u'ref')) + var.put(u'nodes', Js([])) + PyJs_Object_945_ = Js({u'kind':Js(u'let'),u'file':var.get(u'file'),u'scope':var.get(u'scope'),u'nodes':var.get(u'nodes')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_945_)) + var.get(u'destructuring').callprop(u'init', var.get(u'pattern'), var.get(u'ref')) + var.get(u'node').get(u'body').put(u'body', var.get(u'nodes').callprop(u'concat', var.get(u'node').get(u'body').get(u'body'))) + PyJs_CatchClause_944_._set_name(u'CatchClause') + @Js + def PyJs_AssignmentExpression_946_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'AssignmentExpression':PyJs_AssignmentExpression_946_}, var) + var.registers([u'node', u'destructuring', u'file', u'path', u'scope', u'nodes', u'ref']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u't').callprop(u'isPattern', var.get(u'node').get(u'left')).neg(): + return var.get('undefined') + var.put(u'nodes', Js([])) + PyJs_Object_947_ = Js({u'operator':var.get(u'node').get(u'operator'),u'file':var.get(u'file'),u'scope':var.get(u'scope'),u'nodes':var.get(u'nodes')}) + var.put(u'destructuring', var.get(u'DestructuringTransformer').create(PyJs_Object_947_)) + var.put(u'ref', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'path').callprop(u'isCompletionRecord') or var.get(u'path').get(u'parentPath').callprop(u'isExpressionStatement').neg()): + var.put(u'ref', var.get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'node').get(u'right'), Js(u'ref'))) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'node').get(u'right'))]))) + if var.get(u't').callprop(u'isArrayExpression', var.get(u'node').get(u'right')): + var.get(u'destructuring').get(u'arrays').put(var.get(u'ref').get(u'name'), var.get(u'true')) + var.get(u'destructuring').callprop(u'init', var.get(u'node').get(u'left'), (var.get(u'ref') or var.get(u'node').get(u'right'))) + if var.get(u'ref'): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u'ref'))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJs_AssignmentExpression_946_._set_name(u'AssignmentExpression') + @Js + def PyJs_VariableDeclaration_948_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file, u'VariableDeclaration':PyJs_VariableDeclaration_948_}, var) + var.registers([u'node', u'_isArray5', u'patternId', u'_ref7', u'parent', u'i', u'pattern', u'_i5', u'tail', u'_iterator5', u'_node', u'declar', u'nodesOut', u'file', u'path', u'destructuring', u'scope', u'nodes', u'_tail$declarations']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'parent', var.get(u'path').get(u'parent')) + if var.get(u't').callprop(u'isForXStatement', var.get(u'parent')): + return var.get('undefined') + if (var.get(u'parent').neg() or var.get(u'path').get(u'container').neg()): + return var.get('undefined') + if var.get(u'variableDeclarationHasPattern')(var.get(u'node')).neg(): + return var.get('undefined') + var.put(u'nodes', Js([])) + var.put(u'declar', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i5').get(u'value')) + var.put(u'_node', var.get(u'_ref7')) + var.put(u'tail', var.get(u'nodesOut').get((var.get(u'nodesOut').get(u'length')-Js(1.0)))) + if (((var.get(u'tail') and var.get(u't').callprop(u'isVariableDeclaration', var.get(u'tail'))) and var.get(u't').callprop(u'isVariableDeclaration', var.get(u'_node'))) and PyJsStrictEq(var.get(u'tail').get(u'kind'),var.get(u'_node').get(u'kind'))): + pass + var.put(u'_tail$declarations', var.get(u'tail').get(u'declarations')).get(u'push').callprop(u'apply', var.get(u'_tail$declarations'), var.get(u'_node').get(u'declarations')) + else: + var.get(u'nodesOut').callprop(u'push', var.get(u'_node')) + + if PyJsStrictEq(var.get(u'nodesOut').get(u'length'),Js(1.0)): + var.get(u'path').callprop(u'replaceWith', var.get(u'nodesOut').get(u'0')) + else: + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodesOut')) + PyJs_VariableDeclaration_948_._set_name(u'VariableDeclaration') + PyJs_Object_940_ = Js({u'ExportNamedDeclaration':PyJs_ExportNamedDeclaration_941_,u'ForXStatement':PyJs_ForXStatement_942_,u'CatchClause':PyJs_CatchClause_944_,u'AssignmentExpression':PyJs_AssignmentExpression_946_,u'VariableDeclaration':PyJs_VariableDeclaration_948_}) + PyJs_Object_939_ = Js({u'visitor':PyJs_Object_940_}) + return PyJs_Object_939_ + PyJs_anonymous_921_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_921_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_920_._set_name(u'anonymous') +PyJs_Object_951_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_952_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'exports', u'_interopRequireWildcard', u'getName', u'_babelTypes', u'module', u'_create2', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_959_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_959_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getName_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + return var.get(u'key').get(u'name') + return var.get(u'key').get(u'value').callprop(u'toString') + PyJsHoisted_getName_.func_name = u'getName' + var.put(u'getName', PyJsHoisted_getName_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_958_ = Js({}) + var.put(u'newObj', PyJs_Object_958_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + @Js + def PyJs_anonymous_953_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_ObjectExpression_956_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ObjectExpression':PyJs_ObjectExpression_956_, u'arguments':arguments}, var) + var.registers([u'node', u'alreadySeenGetters', u'_isArray', u'plainProps', u'name', u'alreadySeenSetters', u'alreadySeenData', u'prop', u'_i', u'path', u'isDuplicate', u'_iterator', u'_ref']) + var.put(u'node', var.get(u'path').get(u'node')) + @Js + def PyJs_anonymous_957_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'prop']) + return (var.get(u't').callprop(u'isSpreadProperty', var.get(u'prop')).neg() and var.get(u'prop').get(u'computed').neg()) + PyJs_anonymous_957_._set_name(u'anonymous') + var.put(u'plainProps', var.get(u'node').get(u'properties').callprop(u'filter', PyJs_anonymous_957_)) + var.put(u'alreadySeenData', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'alreadySeenGetters', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'alreadySeenSetters', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + #for JS loop + var.put(u'_iterator', var.get(u'plainProps')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref')) + var.put(u'name', var.get(u'getName')(var.get(u'prop').get(u'key'))) + var.put(u'isDuplicate', Js(False)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'prop').get(u'kind')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'get')): + SWITCHED = True + if (var.get(u'alreadySeenData').get(var.get(u'name')) or var.get(u'alreadySeenGetters').get(var.get(u'name'))): + var.put(u'isDuplicate', var.get(u'true')) + var.get(u'alreadySeenGetters').put(var.get(u'name'), var.get(u'true')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'set')): + SWITCHED = True + if (var.get(u'alreadySeenData').get(var.get(u'name')) or var.get(u'alreadySeenSetters').get(var.get(u'name'))): + var.put(u'isDuplicate', var.get(u'true')) + var.get(u'alreadySeenSetters').put(var.get(u'name'), var.get(u'true')) + break + if True: + SWITCHED = True + if ((var.get(u'alreadySeenData').get(var.get(u'name')) or var.get(u'alreadySeenGetters').get(var.get(u'name'))) or var.get(u'alreadySeenSetters').get(var.get(u'name'))): + var.put(u'isDuplicate', var.get(u'true')) + var.get(u'alreadySeenData').put(var.get(u'name'), var.get(u'true')) + SWITCHED = True + break + if var.get(u'isDuplicate'): + var.get(u'prop').put(u'computed', var.get(u'true')) + var.get(u'prop').put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'name'))) + + PyJs_ObjectExpression_956_._set_name(u'ObjectExpression') + PyJs_Object_955_ = Js({u'ObjectExpression':PyJs_ObjectExpression_956_}) + PyJs_Object_954_ = Js({u'visitor':PyJs_Object_955_}) + return PyJs_Object_954_ + PyJs_anonymous_953_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_953_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_952_._set_name(u'anonymous') +PyJs_Object_960_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_961_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_962_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'loose', u'messages', u'_ForOfStatementArray', u'buildForOfArray', u'buildForOfLoose', u't', u'template', u'_ref', u'buildForOf', u'spec']) + @Js + def PyJsHoisted_loose_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'iteratorKey', u'isArrayKey', u'declar', u'file', u'path', u'scope', u'id', u'loop', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'left', var.get(u'node').get(u'left')) + var.put(u'declar', PyJsComma(Js(0.0), Js(None))) + var.put(u'id', PyJsComma(Js(0.0), Js(None))) + if ((var.get(u't').callprop(u'isIdentifier', var.get(u'left')) or var.get(u't').callprop(u'isPattern', var.get(u'left'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'left'))): + var.put(u'id', var.get(u'left')) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')): + var.put(u'id', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', var.get(u'left').get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'left').get(u'declarations').get(u'0').get(u'id'), var.get(u'id'))]))) + else: + PyJsTempException = JsToPyException(var.get(u'file').callprop(u'buildCodeFrameError', var.get(u'left'), var.get(u'messages').callprop(u'get', Js(u'unknownForHead'), var.get(u'left').get(u'type')))) + raise PyJsTempException + var.put(u'iteratorKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iterator'))) + var.put(u'isArrayKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'isArray'))) + PyJs_Object_969_ = Js({u'LOOP_OBJECT':var.get(u'iteratorKey'),u'IS_ARRAY':var.get(u'isArrayKey'),u'OBJECT':var.get(u'node').get(u'right'),u'INDEX':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'i')),u'ID':var.get(u'id')}) + var.put(u'loop', var.get(u'buildForOfLoose')(PyJs_Object_969_)) + if var.get(u'declar').neg(): + var.get(u'loop').get(u'body').get(u'body').callprop(u'shift') + PyJs_Object_970_ = Js({u'declar':var.get(u'declar'),u'node':var.get(u'loop'),u'loop':var.get(u'loop')}) + return PyJs_Object_970_ + PyJsHoisted_loose_.func_name = u'loose' + var.put(u'loose', PyJsHoisted_loose_) + @Js + def PyJsHoisted__ForOfStatementArray_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'node', u'iterationValue', u'right', u'uid', u'iterationKey', u'path', u'scope', u'nodes', u'loop', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'nodes', Js([])) + var.put(u'right', var.get(u'node').get(u'right')) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'right')).neg() or var.get(u'scope').callprop(u'hasBinding', var.get(u'right').get(u'name')).neg()): + var.put(u'uid', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'arr'))) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'uid'), var.get(u'right'))]))) + var.put(u'right', var.get(u'uid')) + var.put(u'iterationKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'i'))) + PyJs_Object_965_ = Js({u'BODY':var.get(u'node').get(u'body'),u'KEY':var.get(u'iterationKey'),u'ARR':var.get(u'right')}) + var.put(u'loop', var.get(u'buildForOfArray')(PyJs_Object_965_)) + var.get(u't').callprop(u'inherits', var.get(u'loop'), var.get(u'node')) + var.get(u't').callprop(u'ensureBlock', var.get(u'loop')) + var.put(u'iterationValue', var.get(u't').callprop(u'memberExpression', var.get(u'right'), var.get(u'iterationKey'), var.get(u'true'))) + var.put(u'left', var.get(u'node').get(u'left')) + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')): + var.get(u'left').get(u'declarations').get(u'0').put(u'init', var.get(u'iterationValue')) + var.get(u'loop').get(u'body').get(u'body').callprop(u'unshift', var.get(u'left')) + else: + var.get(u'loop').get(u'body').get(u'body').callprop(u'unshift', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'left'), var.get(u'iterationValue')))) + if var.get(u'path').get(u'parentPath').callprop(u'isLabeledStatement'): + var.put(u'loop', var.get(u't').callprop(u'labeledStatement', var.get(u'path').get(u'parentPath').get(u'node').get(u'label'), var.get(u'loop'))) + var.get(u'nodes').callprop(u'push', var.get(u'loop')) + return var.get(u'nodes') + PyJsHoisted__ForOfStatementArray_.func_name = u'_ForOfStatementArray' + var.put(u'_ForOfStatementArray', PyJsHoisted__ForOfStatementArray_) + @Js + def PyJsHoisted_spec_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'file':file}, var) + var.registers([u'node', u'stepValue', u'isLabeledParent', u'stepKey', u'file', u'parent', u'tryBody', u'declar', u'template', u'path', u'scope', u'iteratorKey', u'loop', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'parent', var.get(u'path').get(u'parent')) + var.put(u'left', var.get(u'node').get(u'left')) + var.put(u'declar', PyJsComma(Js(0.0), Js(None))) + var.put(u'stepKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'step'))) + var.put(u'stepValue', var.get(u't').callprop(u'memberExpression', var.get(u'stepKey'), var.get(u't').callprop(u'identifier', Js(u'value')))) + if ((var.get(u't').callprop(u'isIdentifier', var.get(u'left')) or var.get(u't').callprop(u'isPattern', var.get(u'left'))) or var.get(u't').callprop(u'isMemberExpression', var.get(u'left'))): + var.put(u'declar', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'left'), var.get(u'stepValue')))) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'left')): + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', var.get(u'left').get(u'kind'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'left').get(u'declarations').get(u'0').get(u'id'), var.get(u'stepValue'))]))) + else: + PyJsTempException = JsToPyException(var.get(u'file').callprop(u'buildCodeFrameError', var.get(u'left'), var.get(u'messages').callprop(u'get', Js(u'unknownForHead'), var.get(u'left').get(u'type')))) + raise PyJsTempException + var.put(u'iteratorKey', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iterator'))) + PyJs_Object_971_ = Js({u'ITERATOR_HAD_ERROR_KEY':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'didIteratorError')),u'ITERATOR_COMPLETION':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iteratorNormalCompletion')),u'ITERATOR_ERROR_KEY':var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'iteratorError')),u'ITERATOR_KEY':var.get(u'iteratorKey'),u'STEP_KEY':var.get(u'stepKey'),u'OBJECT':var.get(u'node').get(u'right'),u'BODY':var.get(u"null")}) + var.put(u'template', var.get(u'buildForOf')(PyJs_Object_971_)) + var.put(u'isLabeledParent', var.get(u't').callprop(u'isLabeledStatement', var.get(u'parent'))) + var.put(u'tryBody', var.get(u'template').get(u'3').get(u'block').get(u'body')) + var.put(u'loop', var.get(u'tryBody').get(u'0')) + if var.get(u'isLabeledParent'): + var.get(u'tryBody').put(u'0', var.get(u't').callprop(u'labeledStatement', var.get(u'parent').get(u'label'), var.get(u'loop'))) + PyJs_Object_972_ = Js({u'replaceParent':var.get(u'isLabeledParent'),u'declar':var.get(u'declar'),u'loop':var.get(u'loop'),u'node':var.get(u'template')}) + return PyJs_Object_972_ + PyJsHoisted_spec_.func_name = u'spec' + var.put(u'spec', PyJsHoisted_spec_) + var.put(u'messages', var.get(u'_ref').get(u'messages')) + var.put(u'template', var.get(u'_ref').get(u'template')) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'buildForOfArray', var.get(u'template')(Js(u'\n for (var KEY = 0; KEY < ARR.length; KEY++) BODY;\n '))) + def PyJs_LONG_963_(var=var): + return var.get(u'template')(Js(u'\n for (var LOOP_OBJECT = OBJECT,\n IS_ARRAY = Array.isArray(LOOP_OBJECT),\n INDEX = 0,\n LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {\n var ID;\n if (IS_ARRAY) {\n if (INDEX >= LOOP_OBJECT.length) break;\n ID = LOOP_OBJECT[INDEX++];\n } else {\n INDEX = LOOP_OBJECT.next();\n if (INDEX.done) break;\n ID = INDEX.value;\n }\n }\n ')) + var.put(u'buildForOfLoose', PyJs_LONG_963_()) + def PyJs_LONG_964_(var=var): + return var.get(u'template')(Js(u'\n var ITERATOR_COMPLETION = true;\n var ITERATOR_HAD_ERROR_KEY = false;\n var ITERATOR_ERROR_KEY = undefined;\n try {\n for (var ITERATOR_KEY = OBJECT[Symbol.iterator](), STEP_KEY; !(ITERATOR_COMPLETION = (STEP_KEY = ITERATOR_KEY.next()).done); ITERATOR_COMPLETION = true) {\n }\n } catch (err) {\n ITERATOR_HAD_ERROR_KEY = true;\n ITERATOR_ERROR_KEY = err;\n } finally {\n try {\n if (!ITERATOR_COMPLETION && ITERATOR_KEY.return) {\n ITERATOR_KEY.return();\n }\n } finally {\n if (ITERATOR_HAD_ERROR_KEY) {\n throw ITERATOR_ERROR_KEY;\n }\n }\n }\n ')) + var.put(u'buildForOf', PyJs_LONG_964_()) + pass + @Js + def PyJs_ForOfStatement_968_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ForOfStatement':PyJs_ForOfStatement_968_}, var) + var.registers([u'node', u'callback', u'state', u'declar', u'build', u'loop', u'path', u'block']) + if var.get(u'path').callprop(u'get', Js(u'right')).callprop(u'isArrayExpression'): + if var.get(u'path').get(u'parentPath').callprop(u'isLabeledStatement'): + return var.get(u'path').get(u'parentPath').callprop(u'replaceWithMultiple', var.get(u'_ForOfStatementArray')(var.get(u'path'))) + else: + return var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'_ForOfStatementArray')(var.get(u'path'))) + var.put(u'callback', var.get(u'spec')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'callback', var.get(u'loose')) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'build', var.get(u'callback')(var.get(u'path'), var.get(u'state'))) + var.put(u'declar', var.get(u'build').get(u'declar')) + var.put(u'loop', var.get(u'build').get(u'loop')) + var.put(u'block', var.get(u'loop').get(u'body')) + var.get(u'path').callprop(u'ensureBlock') + if var.get(u'declar'): + var.get(u'block').get(u'body').callprop(u'push', var.get(u'declar')) + var.get(u'block').put(u'body', var.get(u'block').get(u'body').callprop(u'concat', var.get(u'node').get(u'body').get(u'body'))) + var.get(u't').callprop(u'inherits', var.get(u'loop'), var.get(u'node')) + var.get(u't').callprop(u'inherits', var.get(u'loop').get(u'body'), var.get(u'node').get(u'body')) + if var.get(u'build').get(u'replaceParent'): + var.get(u'path').get(u'parentPath').callprop(u'replaceWithMultiple', var.get(u'build').get(u'node')) + var.get(u'path').callprop(u'remove') + else: + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'build').get(u'node')) + PyJs_ForOfStatement_968_._set_name(u'ForOfStatement') + PyJs_Object_967_ = Js({u'ForOfStatement':PyJs_ForOfStatement_968_}) + PyJs_Object_966_ = Js({u'visitor':PyJs_Object_967_}) + return PyJs_Object_966_ + pass + pass + PyJs_anonymous_962_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_962_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_961_._set_name(u'anonymous') +PyJs_Object_973_ = Js({}) +@Js +def PyJs_anonymous_974_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'_babelHelperFunctionName', u'module', u'_babelHelperFunctionName2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_981_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_981_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_975_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_exit_979_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_979_, u'arguments':arguments}, var) + var.registers([u'path', u'replacement']) + if (PyJsStrictNeq(var.get(u'path').get(u'key'),Js(u'value')) and var.get(u'path').get(u'parentPath').callprop(u'isObjectProperty').neg()): + var.put(u'replacement', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(var.get(u'path'))) + if var.get(u'replacement'): + var.get(u'path').callprop(u'replaceWith', var.get(u'replacement')) + PyJs_exit_979_._set_name(u'exit') + PyJs_Object_978_ = Js({u'exit':PyJs_exit_979_}) + @Js + def PyJs_ObjectProperty_980_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ObjectProperty':PyJs_ObjectProperty_980_, u'arguments':arguments}, var) + var.registers([u'newNode', u'value', u'path']) + var.put(u'value', var.get(u'path').callprop(u'get', Js(u'value'))) + if var.get(u'value').callprop(u'isFunction'): + var.put(u'newNode', PyJsComma(Js(0.0),var.get(u'_babelHelperFunctionName2').get(u'default'))(var.get(u'value'))) + if var.get(u'newNode'): + var.get(u'value').callprop(u'replaceWith', var.get(u'newNode')) + PyJs_ObjectProperty_980_._set_name(u'ObjectProperty') + PyJs_Object_977_ = Js({u'ArrowFunctionExpression|FunctionExpression':PyJs_Object_978_,u'ObjectProperty':PyJs_ObjectProperty_980_}) + PyJs_Object_976_ = Js({u'visitor':PyJs_Object_977_}) + return PyJs_Object_976_ + PyJs_anonymous_975_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_975_) + var.put(u'_babelHelperFunctionName', var.get(u'require')(Js(u'babel-helper-function-name'))) + var.put(u'_babelHelperFunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperFunctionName'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_974_._set_name(u'anonymous') +PyJs_Object_982_ = Js({u'babel-helper-function-name':Js(49.0)}) +@Js +def PyJs_anonymous_983_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_984_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_NumericLiteral_987_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'NumericLiteral':PyJs_NumericLiteral_987_, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if (var.get(u'node').get(u'extra') and JsRegExp(u'/^0[ob]/i').callprop(u'test', var.get(u'node').get(u'extra').get(u'raw'))): + var.get(u'node').put(u'extra', var.get(u'undefined')) + PyJs_NumericLiteral_987_._set_name(u'NumericLiteral') + @Js + def PyJs_StringLiteral_988_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'StringLiteral':PyJs_StringLiteral_988_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'node', u'_ref2']) + var.put(u'node', var.get(u'_ref2').get(u'node')) + if (var.get(u'node').get(u'extra') and JsRegExp(u'/\\\\[u]/gi').callprop(u'test', var.get(u'node').get(u'extra').get(u'raw'))): + var.get(u'node').put(u'extra', var.get(u'undefined')) + PyJs_StringLiteral_988_._set_name(u'StringLiteral') + PyJs_Object_986_ = Js({u'NumericLiteral':PyJs_NumericLiteral_987_,u'StringLiteral':PyJs_StringLiteral_988_}) + PyJs_Object_985_ = Js({u'visitor':PyJs_Object_986_}) + return PyJs_Object_985_ + PyJs_anonymous_984_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_984_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_983_._set_name(u'anonymous') +PyJs_Object_989_ = Js({}) +@Js +def PyJs_anonymous_990_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'buildDefine', u'exports', u'require', u'_babelTemplate', u'module', u'_create2', u'_babelTemplate2', u'buildFactory', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1007_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1007_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + @Js + def PyJs_anonymous_991_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'isValidRequireCall', u'amdVisitor', u'_ref', u't']) + @Js + def PyJsHoisted_isValidRequireCall_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'args', u'arg']) + if var.get(u'path').callprop(u'isCallExpression').neg(): + return Js(False) + PyJs_Object_992_ = Js({u'name':Js(u'require')}) + if var.get(u'path').callprop(u'get', Js(u'callee')).callprop(u'isIdentifier', PyJs_Object_992_).neg(): + return Js(False) + if var.get(u'path').get(u'scope').callprop(u'getBinding', Js(u'require')): + return Js(False) + var.put(u'args', var.get(u'path').callprop(u'get', Js(u'arguments'))) + if PyJsStrictNeq(var.get(u'args').get(u'length'),Js(1.0)): + return Js(False) + var.put(u'arg', var.get(u'args').get(u'0')) + if var.get(u'arg').callprop(u'isStringLiteral').neg(): + return Js(False) + return var.get(u'true') + PyJsHoisted_isValidRequireCall_.func_name = u'isValidRequireCall' + var.put(u'isValidRequireCall', PyJsHoisted_isValidRequireCall_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + @Js + def PyJs_ReferencedIdentifier_994_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_994_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'_ref2']) + var.put(u'node', var.get(u'_ref2').get(u'node')) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'exports')) and var.get(u'scope').callprop(u'getBinding', Js(u'exports')).neg()): + var.get(u"this").put(u'hasExports', var.get(u'true')) + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'module')) and var.get(u'scope').callprop(u'getBinding', Js(u'module')).neg()): + var.get(u"this").put(u'hasModule', var.get(u'true')) + PyJs_ReferencedIdentifier_994_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_CallExpression_995_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_995_}, var) + var.registers([u'path']) + if var.get(u'isValidRequireCall')(var.get(u'path')).neg(): + return var.get('undefined') + var.get(u"this").get(u'bareSources').callprop(u'push', var.get(u'path').get(u'node').get(u'arguments').get(u'0')) + var.get(u'path').callprop(u'remove') + PyJs_CallExpression_995_._set_name(u'CallExpression') + @Js + def PyJs_VariableDeclarator_996_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'VariableDeclarator':PyJs_VariableDeclarator_996_}, var) + var.registers([u'source', u'init', u'id', u'path']) + var.put(u'id', var.get(u'path').callprop(u'get', Js(u'id'))) + if var.get(u'id').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'init', var.get(u'path').callprop(u'get', Js(u'init'))) + if var.get(u'isValidRequireCall')(var.get(u'init')).neg(): + return var.get('undefined') + var.put(u'source', var.get(u'init').get(u'node').get(u'arguments').get(u'0')) + var.get(u"this").get(u'sourceNames').put(var.get(u'source').get(u'value'), var.get(u'true')) + var.get(u"this").get(u'sources').callprop(u'push', Js([var.get(u'id').get(u'node'), var.get(u'source')])) + var.get(u'path').callprop(u'remove') + PyJs_VariableDeclarator_996_._set_name(u'VariableDeclarator') + PyJs_Object_993_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_994_,u'CallExpression':PyJs_CallExpression_995_,u'VariableDeclarator':PyJs_VariableDeclarator_996_}) + var.put(u'amdVisitor', PyJs_Object_993_) + @Js + def PyJs_pre_998_(this, arguments, var=var): + var = Scope({u'this':this, u'pre':PyJs_pre_998_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'sources', Js([])) + var.get(u"this").put(u'sourceNames', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'bareSources', Js([])) + var.get(u"this").put(u'hasExports', Js(False)) + var.get(u"this").put(u'hasModule', Js(False)) + PyJs_pre_998_._set_name(u'pre') + @Js + def PyJs_exit_1001_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1001_, u'arguments':arguments}, var) + var.registers([u'node', u'moduleName', u'_this', u'factory', u'sources', u'params', u'path']) + var.put(u'_this', var.get(u"this")) + if var.get(u"this").get(u'ran'): + return var.get('undefined') + var.get(u"this").put(u'ran', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'amdVisitor'), var.get(u"this")) + @Js + def PyJs_anonymous_1002_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source']) + return var.get(u'source').get(u'0') + PyJs_anonymous_1002_._set_name(u'anonymous') + var.put(u'params', var.get(u"this").get(u'sources').callprop(u'map', PyJs_anonymous_1002_)) + @Js + def PyJs_anonymous_1003_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source']) + return var.get(u'source').get(u'1') + PyJs_anonymous_1003_._set_name(u'anonymous') + var.put(u'sources', var.get(u"this").get(u'sources').callprop(u'map', PyJs_anonymous_1003_)) + @Js + def PyJs_anonymous_1004_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'_this').get(u'sourceNames').get(var.get(u'str').get(u'value')).neg() + PyJs_anonymous_1004_._set_name(u'anonymous') + var.put(u'sources', var.get(u'sources').callprop(u'concat', var.get(u"this").get(u'bareSources').callprop(u'filter', PyJs_anonymous_1004_))) + var.put(u'moduleName', var.get(u"this").callprop(u'getModuleName')) + if var.get(u'moduleName'): + var.put(u'moduleName', var.get(u't').callprop(u'stringLiteral', var.get(u'moduleName'))) + if var.get(u"this").get(u'hasExports'): + var.get(u'sources').callprop(u'unshift', var.get(u't').callprop(u'stringLiteral', Js(u'exports'))) + var.get(u'params').callprop(u'unshift', var.get(u't').callprop(u'identifier', Js(u'exports'))) + if var.get(u"this").get(u'hasModule'): + var.get(u'sources').callprop(u'unshift', var.get(u't').callprop(u'stringLiteral', Js(u'module'))) + var.get(u'params').callprop(u'unshift', var.get(u't').callprop(u'identifier', Js(u'module'))) + var.put(u'node', var.get(u'path').get(u'node')) + PyJs_Object_1005_ = Js({u'PARAMS':var.get(u'params'),u'BODY':var.get(u'node').get(u'body')}) + var.put(u'factory', var.get(u'buildFactory')(PyJs_Object_1005_)) + var.get(u'factory').get(u'expression').get(u'body').put(u'directives', var.get(u'node').get(u'directives')) + var.get(u'node').put(u'directives', Js([])) + PyJs_Object_1006_ = Js({u'MODULE_NAME':var.get(u'moduleName'),u'SOURCES':var.get(u'sources'),u'FACTORY':var.get(u'factory')}) + var.get(u'node').put(u'body', Js([var.get(u'buildDefine')(PyJs_Object_1006_)])) + PyJs_exit_1001_._set_name(u'exit') + PyJs_Object_1000_ = Js({u'exit':PyJs_exit_1001_}) + PyJs_Object_999_ = Js({u'Program':PyJs_Object_1000_}) + PyJs_Object_997_ = Js({u'inherits':var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-commonjs')),u'pre':PyJs_pre_998_,u'visitor':PyJs_Object_999_}) + return PyJs_Object_997_ + PyJs_anonymous_991_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_991_) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + var.put(u'buildDefine', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n define(MODULE_NAME, [SOURCES], FACTORY);\n'))) + var.put(u'buildFactory', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (PARAMS) {\n BODY;\n })\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_990_._set_name(u'anonymous') +PyJs_Object_1008_ = Js({u'babel-plugin-transform-es2015-modules-commonjs':Js(73.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-template':Js(221.0)}) +@Js +def PyJs_anonymous_1009_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_symbol2', u'_babelTemplate', u'module', u'buildLooseExportsModuleDeclaration', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'buildExportAll', u'_create2', u'_keys', u'buildExportsAssignment', u'THIS_BREAK_KEYS', u'_create', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'buildRequire', u'buildExportsModuleDeclaration', u'_symbol', u'_path2', u'buildExportsFrom', u'_keys2', u'_babelTemplate2', u't', u'require']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1028_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1028_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1027_ = Js({}) + var.put(u'newObj', PyJs_Object_1027_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1010_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'reassignmentVisitor', u'REASSIGN_REMAP_SKIP']) + var.put(u'REASSIGN_REMAP_SKIP', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_ReferencedIdentifier_1012_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1012_, u'arguments':arguments}, var) + var.registers([u'property', u'remap', u'object', u'name', u'path']) + var.put(u'name', var.get(u'path').get(u'node').get(u'name')) + var.put(u'remap', var.get(u"this").get(u'remaps').get(var.get(u'name'))) + if var.get(u'remap').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + PyJs_Object_1013_ = Js({u'callee':var.get(u'path').get(u'node')}) + if var.get(u'path').get(u'parentPath').callprop(u'isCallExpression', PyJs_Object_1013_): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u't').callprop(u'numericLiteral', Js(0.0)), var.get(u'remap')]))) + else: + if (var.get(u'path').callprop(u'isJSXIdentifier') and var.get(u't').callprop(u'isMemberExpression', var.get(u'remap'))): + var.put(u'object', var.get(u'remap').get(u'object')) + var.put(u'property', var.get(u'remap').get(u'property')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'JSXMemberExpression', var.get(u't').callprop(u'JSXIdentifier', var.get(u'object').get(u'name')), var.get(u't').callprop(u'JSXIdentifier', var.get(u'property').get(u'name')))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'remap')) + var.get(u"this").callprop(u'requeueInParent', var.get(u'path')) + PyJs_ReferencedIdentifier_1012_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_AssignmentExpression_1014_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'AssignmentExpression':PyJs_AssignmentExpression_1014_}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'name', u'exports', u'reid', u'_i', u'path', u'_ref', u'left']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'node').get(var.get(u'REASSIGN_REMAP_SKIP')): + return var.get('undefined') + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left'))) + if var.get(u'left').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'left').get(u'node').get(u'name')) + var.put(u'exports', var.get(u"this").get(u'exports').get(var.get(u'name'))) + if var.get(u'exports').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + var.get(u'node').put(var.get(u'REASSIGN_REMAP_SKIP'), var.get(u'true')) + #for JS loop + var.put(u'_iterator', var.get(u'exports')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'reid', var.get(u'_ref')) + var.put(u'node', var.get(u'buildExportsAssignment')(var.get(u'reid'), var.get(u'node')).get(u'expression')) + + var.get(u'path').callprop(u'replaceWith', var.get(u'node')) + var.get(u"this").callprop(u'requeueInParent', var.get(u'path')) + PyJs_AssignmentExpression_1014_._set_name(u'AssignmentExpression') + @Js + def PyJs_UpdateExpression_1015_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'UpdateExpression':PyJs_UpdateExpression_1015_}, var) + var.registers([u'node', u'exports', u'name', u'arg', u'operator', u'path', u'nodes']) + var.put(u'arg', var.get(u'path').callprop(u'get', Js(u'argument'))) + if var.get(u'arg').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'arg').get(u'node').get(u'name')) + var.put(u'exports', var.get(u"this").get(u'exports').get(var.get(u'name'))) + if var.get(u'exports').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + var.put(u'node', var.get(u't').callprop(u'assignmentExpression', (var.get(u'path').get(u'node').get(u'operator').get(u'0')+Js(u'=')), var.get(u'arg').get(u'node'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + if ((var.get(u'path').get(u'parentPath').callprop(u'isExpressionStatement') and var.get(u'path').callprop(u'isCompletionRecord').neg()) or var.get(u'path').get(u'node').get(u'prefix')): + var.get(u'path').callprop(u'replaceWith', var.get(u'node')) + var.get(u"this").callprop(u'requeueInParent', var.get(u'path')) + return var.get('undefined') + var.put(u'nodes', Js([])) + var.get(u'nodes').callprop(u'push', var.get(u'node')) + var.put(u'operator', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'operator'),Js(u'--')): + var.put(u'operator', Js(u'+')) + else: + var.put(u'operator', Js(u'-')) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'binaryExpression', var.get(u'operator'), var.get(u'arg').get(u'node'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u't').callprop(u'sequenceExpression', var.get(u'nodes'))) + PyJs_UpdateExpression_1015_._set_name(u'UpdateExpression') + PyJs_Object_1011_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1012_,u'AssignmentExpression':PyJs_AssignmentExpression_1014_,u'UpdateExpression':PyJs_UpdateExpression_1015_}) + var.put(u'reassignmentVisitor', PyJs_Object_1011_) + @Js + def PyJs_ThisExpression_1018_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ThisExpression':PyJs_ThisExpression_1018_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if var.get(u"this").get(u'ranCommonJS'): + return var.get('undefined') + @Js + def PyJs_anonymous_1019_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'is', Js(u'shadow')).neg() and (var.get(u'THIS_BREAK_KEYS').callprop(u'indexOf', var.get(u'path').get(u'type'))>=Js(0.0))) + PyJs_anonymous_1019_._set_name(u'anonymous') + if (PyJsStrictNeq(var.get(u'state').get(u'opts').get(u'allowTopLevelThis'),var.get(u'true')) and var.get(u'path').callprop(u'findParent', PyJs_anonymous_1019_).neg()): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + PyJs_ThisExpression_1018_._set_name(u'ThisExpression') + @Js + def PyJs_exit_1021_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1021_, u'arguments':arguments}, var) + var.registers([u'decl', u'addRequire', u'_isArray5', u'_isArray4', u'_isArray3', u'_isArray2', u'_isArray6', u'imports', u'_specifiers', u'ids', u'_specifier4', u'_isArray7', u'hoistedExportsNode', u'_declaration', u'_specifier2', u'_specifier3', u'specifier', u'importsEntry', u'_specifier', u'_importsEntry$specifi', u'uid', u'_iterator6', u'i', u'_source', u'_i7', u'_i6', u'_i5', u'_i4', u'hasImports', u'_i2', u'id', u'strict', u'init', u'exportNode', u'scope', u'nodes', u'defNode', u'ref', u'addTo', u'body', u'exports', u'node', u'_i3', u'requireNode', u'nonHoistedExportNames', u'_varDecl', u'varDecl', u'declarators', u'topNodes', u'buildTemplate', u'key', u'declaration', u'_id4', u'path', u'name', u'_id2', u'_id3', u'remaps', u'specifiers', u'_id', u'_imports$source', u'hasExports', u'_defNode', u'_ref6', u'_ref5', u'_ref4', u'_ref3', u'_ref2', u'maxBlockHoist', u'_ref7', u'declar', u'source', u'wildcard', u'target', u'_iterator5', u'_iterator4', u'_iterator7', u'_iterator2', u'requires', u'_iterator3', u'_path']) + @Js + def PyJsHoisted_addRequire_(source, blockHoist, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'blockHoist':blockHoist, u'arguments':arguments}, var) + var.registers([u'cached', u'varDecl', u'blockHoist', u'ref', u'source']) + var.put(u'cached', var.get(u'requires').get(var.get(u'source'))) + if var.get(u'cached'): + return var.get(u'cached') + var.put(u'ref', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', PyJsComma(Js(0.0),var.get(u'_path2').get(u'basename'))(var.get(u'source'), PyJsComma(Js(0.0),var.get(u'_path2').get(u'extname'))(var.get(u'source'))))) + var.put(u'varDecl', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'ref'), var.get(u'buildRequire')(var.get(u't').callprop(u'stringLiteral', var.get(u'source'))).get(u'expression'))]))) + if var.get(u'imports').get(var.get(u'source')): + var.get(u'varDecl').put(u'loc', var.get(u'imports').get(var.get(u'source')).get(u'loc')) + if (PyJsStrictEq(var.get(u'blockHoist',throw=False).typeof(),Js(u'number')) and (var.get(u'blockHoist')>Js(0.0))): + var.get(u'varDecl').put(u'_blockHoist', var.get(u'blockHoist')) + var.get(u'topNodes').callprop(u'push', var.get(u'varDecl')) + return var.get(u'requires').put(var.get(u'source'), var.get(u'ref')) + PyJsHoisted_addRequire_.func_name = u'addRequire' + var.put(u'addRequire', PyJsHoisted_addRequire_) + @Js + def PyJsHoisted_addTo_(obj, key, arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'obj':obj, u'arguments':arguments, u'key':key}, var) + var.registers([u'arr', u'obj', u'key', u'existing']) + var.put(u'existing', (var.get(u'obj').get(var.get(u'key')) or Js([]))) + var.get(u'obj').put(var.get(u'key'), var.get(u'existing').callprop(u'concat', var.get(u'arr'))) + PyJsHoisted_addTo_.func_name = u'addTo' + var.put(u'addTo', PyJsHoisted_addTo_) + var.get(u"this").put(u'ranCommonJS', var.get(u'true')) + var.put(u'strict', var.get(u"this").get(u'opts').get(u'strict').neg().neg()) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.get(u'scope').callprop(u'rename', Js(u'module')) + var.get(u'scope').callprop(u'rename', Js(u'exports')) + var.get(u'scope').callprop(u'rename', Js(u'require')) + var.put(u'hasExports', Js(False)) + var.put(u'hasImports', Js(False)) + var.put(u'body', var.get(u'path').callprop(u'get', Js(u'body'))) + var.put(u'imports', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'exports', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'nonHoistedExportNames', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'topNodes', Js([])) + var.put(u'remaps', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'requires', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + pass + pass + #for JS loop + var.put(u'_iterator2', var.get(u'body')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_path', var.get(u'_ref2')) + if var.get(u'_path').callprop(u'isExportDeclaration'): + var.put(u'hasExports', var.get(u'true')) + var.put(u'specifiers', Js([]).callprop(u'concat', var.get(u'_path').callprop(u'get', Js(u'declaration')), var.get(u'_path').callprop(u'get', Js(u'specifiers')))) + #for JS loop + var.put(u'_iterator4', var.get(u'specifiers')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'_specifier2', var.get(u'_ref4')) + var.put(u'ids', var.get(u'_specifier2').callprop(u'getBindingIdentifiers')) + if var.get(u'ids').get(u'__esModule'): + PyJsTempException = JsToPyException(var.get(u'_specifier2').callprop(u'buildCodeFrameError', Js(u'Illegal export "__esModule"'))) + raise PyJsTempException + + if var.get(u'_path').callprop(u'isImportDeclaration'): + pass + var.put(u'hasImports', var.get(u'true')) + var.put(u'key', var.get(u'_path').get(u'node').get(u'source').get(u'value')) + PyJs_Object_1022_ = Js({u'specifiers':Js([]),u'maxBlockHoist':Js(0.0),u'loc':var.get(u'_path').get(u'node').get(u'loc')}) + var.put(u'importsEntry', (var.get(u'imports').get(var.get(u'key')) or PyJs_Object_1022_)) + var.put(u'_importsEntry$specifi', var.get(u'importsEntry').get(u'specifiers')).get(u'push').callprop(u'apply', var.get(u'_importsEntry$specifi'), var.get(u'_path').get(u'node').get(u'specifiers')) + if PyJsStrictEq(var.get(u'_path').get(u'node').get(u'_blockHoist').typeof(),Js(u'number')): + var.get(u'importsEntry').put(u'maxBlockHoist', var.get(u'Math').callprop(u'max', var.get(u'_path').get(u'node').get(u'_blockHoist'), var.get(u'importsEntry').get(u'maxBlockHoist'))) + var.get(u'imports').put(var.get(u'key'), var.get(u'importsEntry')) + var.get(u'_path').callprop(u'remove') + else: + if var.get(u'_path').callprop(u'isExportDefaultDeclaration'): + var.put(u'declaration', var.get(u'_path').callprop(u'get', Js(u'declaration'))) + if var.get(u'declaration').callprop(u'isFunctionDeclaration'): + var.put(u'id', var.get(u'declaration').get(u'node').get(u'id')) + var.put(u'defNode', var.get(u't').callprop(u'identifier', Js(u'default'))) + if var.get(u'id'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'id').get(u'name'), var.get(u'defNode')) + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'defNode'), var.get(u'id'))) + var.get(u'_path').callprop(u'replaceWith', var.get(u'declaration').get(u'node')) + else: + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'defNode'), var.get(u't').callprop(u'toExpression', var.get(u'declaration').get(u'node')))) + var.get(u'_path').callprop(u'remove') + else: + if var.get(u'declaration').callprop(u'isClassDeclaration'): + var.put(u'_id', var.get(u'declaration').get(u'node').get(u'id')) + var.put(u'_defNode', var.get(u't').callprop(u'identifier', Js(u'default'))) + if var.get(u'_id'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id').get(u'name'), var.get(u'_defNode')) + var.get(u'_path').callprop(u'replaceWithMultiple', Js([var.get(u'declaration').get(u'node'), var.get(u'buildExportsAssignment')(var.get(u'_defNode'), var.get(u'_id'))])) + else: + var.get(u'_path').callprop(u'replaceWith', var.get(u'buildExportsAssignment')(var.get(u'_defNode'), var.get(u't').callprop(u'toExpression', var.get(u'declaration').get(u'node')))) + var.get(u'_path').get(u'parentPath').callprop(u'requeue', var.get(u'_path').callprop(u'get', Js(u'expression.left'))) + else: + var.get(u'_path').callprop(u'replaceWith', var.get(u'buildExportsAssignment')(var.get(u't').callprop(u'identifier', Js(u'default')), var.get(u'declaration').get(u'node'))) + var.get(u'_path').get(u'parentPath').callprop(u'requeue', var.get(u'_path').callprop(u'get', Js(u'expression.left'))) + else: + if var.get(u'_path').callprop(u'isExportNamedDeclaration'): + var.put(u'_declaration', var.get(u'_path').callprop(u'get', Js(u'declaration'))) + if var.get(u'_declaration').get(u'node'): + if var.get(u'_declaration').callprop(u'isFunctionDeclaration'): + var.put(u'_id2', var.get(u'_declaration').get(u'node').get(u'id')) + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id2').get(u'name'), var.get(u'_id2')) + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'_id2'), var.get(u'_id2'))) + var.get(u'_path').callprop(u'replaceWith', var.get(u'_declaration').get(u'node')) + else: + if var.get(u'_declaration').callprop(u'isClassDeclaration'): + var.put(u'_id3', var.get(u'_declaration').get(u'node').get(u'id')) + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id3').get(u'name'), var.get(u'_id3')) + var.get(u'_path').callprop(u'replaceWithMultiple', Js([var.get(u'_declaration').get(u'node'), var.get(u'buildExportsAssignment')(var.get(u'_id3'), var.get(u'_id3'))])) + var.get(u'nonHoistedExportNames').put(var.get(u'_id3').get(u'name'), var.get(u'true')) + else: + if var.get(u'_declaration').callprop(u'isVariableDeclaration'): + var.put(u'declarators', var.get(u'_declaration').callprop(u'get', Js(u'declarations'))) + #for JS loop + var.put(u'_iterator5', var.get(u'declarators')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'decl', var.get(u'_ref5')) + var.put(u'_id4', var.get(u'decl').callprop(u'get', Js(u'id'))) + var.put(u'init', var.get(u'decl').callprop(u'get', Js(u'init'))) + if var.get(u'init').get(u'node').neg(): + var.get(u'init').callprop(u'replaceWith', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + if var.get(u'_id4').callprop(u'isIdentifier'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'_id4').get(u'node').get(u'name'), var.get(u'_id4').get(u'node')) + var.get(u'init').callprop(u'replaceWith', var.get(u'buildExportsAssignment')(var.get(u'_id4').get(u'node'), var.get(u'init').get(u'node')).get(u'expression')) + var.get(u'nonHoistedExportNames').put(var.get(u'_id4').get(u'node').get(u'name'), var.get(u'true')) + else: + pass + + var.get(u'_path').callprop(u'replaceWith', var.get(u'_declaration').get(u'node')) + continue + var.put(u'_specifiers', var.get(u'_path').callprop(u'get', Js(u'specifiers'))) + var.put(u'nodes', Js([])) + var.put(u'_source', var.get(u'_path').get(u'node').get(u'source')) + if var.get(u'_source'): + var.put(u'ref', var.get(u'addRequire')(var.get(u'_source').get(u'value'), var.get(u'_path').get(u'node').get(u'_blockHoist'))) + #for JS loop + var.put(u'_iterator6', var.get(u'_specifiers')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i6').get(u'value')) + var.put(u'_specifier3', var.get(u'_ref6')) + if var.get(u'_specifier3').callprop(u'isExportNamespaceSpecifier'): + pass + else: + if var.get(u'_specifier3').callprop(u'isExportDefaultSpecifier'): + pass + else: + if var.get(u'_specifier3').callprop(u'isExportSpecifier'): + if PyJsStrictEq(var.get(u'_specifier3').get(u'node').get(u'local').get(u'name'),Js(u'default')): + def PyJs_LONG_1023_(var=var): + return var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsFrom')(var.get(u't').callprop(u'stringLiteral', var.get(u'_specifier3').get(u'node').get(u'exported').get(u'name')), var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'interopRequireDefault')), Js([var.get(u'ref')])), var.get(u'_specifier3').get(u'node').get(u'local')))) + PyJs_LONG_1023_() + else: + var.get(u'topNodes').callprop(u'push', var.get(u'buildExportsFrom')(var.get(u't').callprop(u'stringLiteral', var.get(u'_specifier3').get(u'node').get(u'exported').get(u'name')), var.get(u't').callprop(u'memberExpression', var.get(u'ref'), var.get(u'_specifier3').get(u'node').get(u'local')))) + var.get(u'nonHoistedExportNames').put(var.get(u'_specifier3').get(u'node').get(u'exported').get(u'name'), var.get(u'true')) + + else: + #for JS loop + var.put(u'_iterator7', var.get(u'_specifiers')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i7').get(u'value')) + var.put(u'_specifier4', var.get(u'_ref7')) + if var.get(u'_specifier4').callprop(u'isExportSpecifier'): + var.get(u'addTo')(var.get(u'exports'), var.get(u'_specifier4').get(u'node').get(u'local').get(u'name'), var.get(u'_specifier4').get(u'node').get(u'exported')) + var.get(u'nonHoistedExportNames').put(var.get(u'_specifier4').get(u'node').get(u'exported').get(u'name'), var.get(u'true')) + var.get(u'nodes').callprop(u'push', var.get(u'buildExportsAssignment')(var.get(u'_specifier4').get(u'node').get(u'exported'), var.get(u'_specifier4').get(u'node').get(u'local'))) + + var.get(u'_path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + else: + if var.get(u'_path').callprop(u'isExportAllDeclaration'): + PyJs_Object_1024_ = Js({u'OBJECT':var.get(u'addRequire')(var.get(u'_path').get(u'node').get(u'source').get(u'value'), var.get(u'_path').get(u'node').get(u'_blockHoist'))}) + var.put(u'exportNode', var.get(u'buildExportAll')(PyJs_Object_1024_)) + var.get(u'exportNode').put(u'loc', var.get(u'_path').get(u'node').get(u'loc')) + var.get(u'topNodes').callprop(u'push', var.get(u'exportNode')) + var.get(u'_path').callprop(u'remove') + + for PyJsTemp in var.get(u'imports'): + var.put(u'source', PyJsTemp) + var.put(u'_imports$source', var.get(u'imports').get(var.get(u'source'))) + var.put(u'specifiers', var.get(u'_imports$source').get(u'specifiers')) + var.put(u'maxBlockHoist', var.get(u'_imports$source').get(u'maxBlockHoist')) + if var.get(u'specifiers').get(u'length'): + var.put(u'uid', var.get(u'addRequire')(var.get(u'source'), var.get(u'maxBlockHoist'))) + var.put(u'wildcard', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)): + var.get(u'varDecl').put(u'_blockHoist', var.get(u'maxBlockHoist')) + var.get(u'topNodes').callprop(u'push', var.get(u'varDecl')) + var.put(u'wildcard', var.get(u'specifier').get(u'local')) + else: + if var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'specifier')): + var.get(u'specifiers').put(var.get(u'i'), var.get(u't').callprop(u'importSpecifier', var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'identifier', Js(u'default')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + #for JS loop + var.put(u'_iterator3', var.get(u'specifiers')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'_specifier', var.get(u'_ref3')) + if var.get(u't').callprop(u'isImportSpecifier', var.get(u'_specifier')): + var.put(u'target', var.get(u'uid')) + if PyJsStrictEq(var.get(u'_specifier').get(u'imported').get(u'name'),Js(u'default')): + if var.get(u'wildcard'): + var.put(u'target', var.get(u'wildcard')) + else: + var.put(u'target', var.put(u'wildcard', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', var.get(u'uid').get(u'name')))) + var.put(u'_varDecl', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'target'), var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'interopRequireDefault')), Js([var.get(u'uid')])))]))) + if (var.get(u'maxBlockHoist')>Js(0.0)): + var.get(u'_varDecl').put(u'_blockHoist', var.get(u'maxBlockHoist')) + var.get(u'topNodes').callprop(u'push', var.get(u'_varDecl')) + var.get(u'remaps').put(var.get(u'_specifier').get(u'local').get(u'name'), var.get(u't').callprop(u'memberExpression', var.get(u'target'), var.get(u't').callprop(u'cloneWithoutLoc', var.get(u'_specifier').get(u'imported')))) + + else: + var.put(u'requireNode', var.get(u'buildRequire')(var.get(u't').callprop(u'stringLiteral', var.get(u'source')))) + var.get(u'requireNode').put(u'loc', var.get(u'imports').get(var.get(u'source')).get(u'loc')) + var.get(u'topNodes').callprop(u'push', var.get(u'requireNode')) + if (var.get(u'hasImports') and PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'nonHoistedExportNames')).get(u'length')): + var.put(u'hoistedExportsNode', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + for PyJsTemp in var.get(u'nonHoistedExportNames'): + var.put(u'name', PyJsTemp) + var.put(u'hoistedExportsNode', var.get(u'buildExportsAssignment')(var.get(u't').callprop(u'identifier', var.get(u'name')), var.get(u'hoistedExportsNode')).get(u'expression')) + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u'hoistedExportsNode'))) + var.get(u'node').put(u'_blockHoist', Js(3.0)) + var.get(u'topNodes').callprop(u'unshift', var.get(u'node')) + if (var.get(u'hasExports') and var.get(u'strict').neg()): + var.put(u'buildTemplate', var.get(u'buildExportsModuleDeclaration')) + if var.get(u"this").get(u'opts').get(u'loose'): + var.put(u'buildTemplate', var.get(u'buildLooseExportsModuleDeclaration')) + var.put(u'declar', var.get(u'buildTemplate')()) + var.get(u'declar').put(u'_blockHoist', Js(3.0)) + var.get(u'topNodes').callprop(u'unshift', var.get(u'declar')) + var.get(u'path').callprop(u'unshiftContainer', Js(u'body'), var.get(u'topNodes')) + @Js + def PyJs_requeueInParent_1026_(newPath, this, arguments, var=var): + var = Scope({u'newPath':newPath, u'this':this, u'arguments':arguments, u'requeueInParent':PyJs_requeueInParent_1026_}, var) + var.registers([u'newPath']) + return var.get(u'path').callprop(u'requeue', var.get(u'newPath')) + PyJs_requeueInParent_1026_._set_name(u'requeueInParent') + PyJs_Object_1025_ = Js({u'remaps':var.get(u'remaps'),u'scope':var.get(u'scope'),u'exports':var.get(u'exports'),u'requeueInParent':PyJs_requeueInParent_1026_}) + var.get(u'path').callprop(u'traverse', var.get(u'reassignmentVisitor'), PyJs_Object_1025_) + PyJs_exit_1021_._set_name(u'exit') + PyJs_Object_1020_ = Js({u'exit':PyJs_exit_1021_}) + PyJs_Object_1017_ = Js({u'ThisExpression':PyJs_ThisExpression_1018_,u'Program':PyJs_Object_1020_}) + PyJs_Object_1016_ = Js({u'inherits':var.get(u'require')(Js(u'babel-plugin-transform-strict-mode')),u'visitor':PyJs_Object_1017_}) + return PyJs_Object_1016_ + PyJs_anonymous_1010_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1010_) + var.put(u'_path2', var.get(u'require')(Js(u'path'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildRequire', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n require($0);\n'))) + var.put(u'buildExportsModuleDeclaration', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n'))) + var.put(u'buildExportsFrom', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.defineProperty(exports, $0, {\n enumerable: true,\n get: function () {\n return $1;\n }\n });\n'))) + var.put(u'buildLooseExportsModuleDeclaration', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n exports.__esModule = true;\n'))) + var.put(u'buildExportsAssignment', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n exports.$0 = $1;\n'))) + var.put(u'buildExportAll', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n Object.keys(OBJECT).forEach(function (key) {\n if (key === "default" || key === "__esModule") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return OBJECT[key];\n }\n });\n });\n'))) + var.put(u'THIS_BREAK_KEYS', Js([Js(u'FunctionExpression'), Js(u'FunctionDeclaration'), Js(u'ClassProperty'), Js(u'ClassMethod'), Js(u'ObjectMethod')])) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1009_._set_name(u'anonymous') +PyJs_Object_1029_ = Js({u'babel-plugin-transform-strict-mode':Js(94.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_1030_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'exports', u'_symbol2', u'_babelHelperHoistVariables', u'buildExportAll', u'require', u'_babelTemplate', u'module', u'_create2', u'buildTemplate', u'_symbol', u'_babelHelperHoistVariables2', u'_interopRequireDefault', u'_babelTemplate2', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1047_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1047_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1031_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'reassignmentVisitor', u'IGNORE_REASSIGNMENT_SYMBOL', u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'IGNORE_REASSIGNMENT_SYMBOL', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_AssignmentExpressionUpdateExpression_1033_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'AssignmentExpressionUpdateExpression':PyJs_AssignmentExpressionUpdateExpression_1033_}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'name', u'exportedNames', u'_ref2', u'exportedName', u'_i', u'arg', u'isPostUpdateExpression', u'path']) + if var.get(u'path').get(u'node').get(var.get(u'IGNORE_REASSIGNMENT_SYMBOL')): + return var.get('undefined') + var.get(u'path').get(u'node').put(var.get(u'IGNORE_REASSIGNMENT_SYMBOL'), var.get(u'true')) + var.put(u'arg', var.get(u'path').callprop(u'get', (Js(u'left') if var.get(u'path').callprop(u'isAssignmentExpression') else Js(u'argument')))) + if var.get(u'arg').callprop(u'isIdentifier').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'arg').get(u'node').get(u'name')) + if PyJsStrictNeq(var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'name')),var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))): + return var.get('undefined') + var.put(u'exportedNames', var.get(u"this").get(u'exports').get(var.get(u'name'))) + if var.get(u'exportedNames').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'isPostUpdateExpression', (var.get(u'path').callprop(u'isUpdateExpression') and var.get(u'node').get(u'prefix').neg())) + if var.get(u'isPostUpdateExpression'): + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'++')): + var.put(u'node', var.get(u't').callprop(u'binaryExpression', Js(u'+'), var.get(u'node').get(u'argument'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + else: + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'--')): + var.put(u'node', var.get(u't').callprop(u'binaryExpression', Js(u'-'), var.get(u'node').get(u'argument'), var.get(u't').callprop(u'numericLiteral', Js(1.0)))) + else: + var.put(u'isPostUpdateExpression', Js(False)) + #for JS loop + var.put(u'_iterator', var.get(u'exportedNames')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'exportedName', var.get(u'_ref2')) + var.put(u'node', var.get(u"this").callprop(u'buildCall', var.get(u'exportedName'), var.get(u'node')).get(u'expression')) + + if var.get(u'isPostUpdateExpression'): + var.put(u'node', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u'node'), var.get(u'path').get(u'node')]))) + var.get(u'path').callprop(u'replaceWith', var.get(u'node')) + PyJs_AssignmentExpressionUpdateExpression_1033_._set_name(u'AssignmentExpressionUpdateExpression') + PyJs_Object_1032_ = Js({u'AssignmentExpression|UpdateExpression':PyJs_AssignmentExpressionUpdateExpression_1033_}) + var.put(u'reassignmentVisitor', PyJs_Object_1032_) + @Js + def PyJs_ReferencedIdentifier_1036_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1036_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if ((var.get(u'path').get(u'node').get(u'name')==Js(u'__moduleName')) and var.get(u'path').get(u'scope').callprop(u'hasBinding', Js(u'__moduleName')).neg()): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'memberExpression', var.get(u'state').get(u'contextIdent'), var.get(u't').callprop(u'identifier', Js(u'id')))) + PyJs_ReferencedIdentifier_1036_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_enter_1038_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'enter':PyJs_enter_1038_}, var) + var.registers([u'path', u'state']) + var.get(u'state').put(u'contextIdent', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'context'))) + PyJs_enter_1038_._set_name(u'enter') + @Js + def PyJs_exit_1039_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_1039_, u'arguments':arguments}, var) + var.registers([u'_isArray7', u'specifier', u'_isArray5', u'_isArray4', u'_isArray3', u'contextIdent', u'_isArray6', u'_i3', u'_name2', u'canHoist', u'_nodes', u'sources', u'variableIds', u'path', u'id', u'_isArray2', u'setterBody', u'_source', u'_i7', u'_i6', u'_i5', u'addExportName', u'removedPaths', u'_i2', u'_specifier', u'source', u'_node', u'_declar', u'nodes', u'_ref3', u'body', u'node', u'state', u'bindingIdentifiers', u'pushModule', u'setters', u'_path3', u'exportIdent', u'_specifiers', u'exportObjRef', u'_bindingIdentifiers', u'_path2', u'beforeBody', u'target', u'specifiers', u'moduleName', u'_iterator6', u'name', u'_ref8', u'_ref7', u'_ref6', u'_ref5', u'_ref4', u'modules', u'exportNames', u'_name', u'buildExportCall', u'_i4', u'declar', u'_nodes2', u'_iterator5', u'_iterator4', u'_iterator7', u'_iterator2', u'_iterator3', u'_path']) + @Js + def PyJsHoisted_buildExportCall_(name, val, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'val':val, u'arguments':arguments}, var) + var.registers([u'name', u'val']) + return var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'exportIdent'), Js([var.get(u't').callprop(u'stringLiteral', var.get(u'name')), var.get(u'val')]))) + PyJsHoisted_buildExportCall_.func_name = u'buildExportCall' + var.put(u'buildExportCall', PyJsHoisted_buildExportCall_) + @Js + def PyJsHoisted_addExportName_(key, val, this, arguments, var=var): + var = Scope({u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'val', u'key']) + var.get(u'exportNames').put(var.get(u'key'), (var.get(u'exportNames').get(var.get(u'key')) or Js([]))) + var.get(u'exportNames').get(var.get(u'key')).callprop(u'push', var.get(u'val')) + PyJsHoisted_addExportName_.func_name = u'addExportName' + var.put(u'addExportName', PyJsHoisted_addExportName_) + @Js + def PyJsHoisted_pushModule_(source, key, specifiers, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments, u'key':key, u'specifiers':specifiers}, var) + var.registers([u'source', u'key', u'_modules', u'specifiers']) + PyJs_Object_1040_ = Js({u'imports':Js([]),u'exports':Js([])}) + var.put(u'_modules', var.get(u'modules').put(var.get(u'source'), (var.get(u'modules').get(var.get(u'source')) or PyJs_Object_1040_))) + var.get(u'_modules').put(var.get(u'key'), var.get(u'_modules').get(var.get(u'key')).callprop(u'concat', var.get(u'specifiers'))) + PyJsHoisted_pushModule_.func_name = u'pushModule' + var.put(u'pushModule', PyJsHoisted_pushModule_) + var.put(u'exportIdent', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'export'))) + var.put(u'contextIdent', var.get(u'state').get(u'contextIdent')) + var.put(u'exportNames', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'modules', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'beforeBody', Js([])) + var.put(u'setters', Js([])) + var.put(u'sources', Js([])) + var.put(u'variableIds', Js([])) + var.put(u'removedPaths', Js([])) + pass + pass + pass + var.put(u'body', var.get(u'path').callprop(u'get', Js(u'body'))) + var.put(u'canHoist', var.get(u'true')) + #for JS loop + var.put(u'_iterator2', var.get(u'body')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'_path', var.get(u'_ref3')) + if var.get(u'_path').callprop(u'isExportDeclaration'): + var.put(u'_path', var.get(u'_path').callprop(u'get', Js(u'declaration'))) + if (var.get(u'_path').callprop(u'isVariableDeclaration') and PyJsStrictNeq(var.get(u'_path').get(u'node').get(u'kind'),Js(u'var'))): + var.put(u'canHoist', Js(False)) + break + + #for JS loop + var.put(u'_iterator3', var.get(u'body')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i3').get(u'value')) + var.put(u'_path2', var.get(u'_ref4')) + if (var.get(u'canHoist') and var.get(u'_path2').callprop(u'isFunctionDeclaration')): + var.get(u'beforeBody').callprop(u'push', var.get(u'_path2').get(u'node')) + var.get(u'removedPaths').callprop(u'push', var.get(u'_path2')) + else: + if var.get(u'_path2').callprop(u'isImportDeclaration'): + var.put(u'_source', var.get(u'_path2').get(u'node').get(u'source').get(u'value')) + var.get(u'pushModule')(var.get(u'_source'), Js(u'imports'), var.get(u'_path2').get(u'node').get(u'specifiers')) + for PyJsTemp in var.get(u'_path2').callprop(u'getBindingIdentifiers'): + var.put(u'name', PyJsTemp) + var.get(u'_path2').get(u'scope').callprop(u'removeBinding', var.get(u'name')) + var.get(u'variableIds').callprop(u'push', var.get(u't').callprop(u'identifier', var.get(u'name'))) + var.get(u'_path2').callprop(u'remove') + else: + if var.get(u'_path2').callprop(u'isExportAllDeclaration'): + var.get(u'pushModule')(var.get(u'_path2').get(u'node').get(u'source').get(u'value'), Js(u'exports'), var.get(u'_path2').get(u'node')) + var.get(u'_path2').callprop(u'remove') + else: + if var.get(u'_path2').callprop(u'isExportDefaultDeclaration'): + var.put(u'declar', var.get(u'_path2').callprop(u'get', Js(u'declaration'))) + if (var.get(u'declar').callprop(u'isClassDeclaration') or var.get(u'declar').callprop(u'isFunctionDeclaration')): + var.put(u'id', var.get(u'declar').get(u'node').get(u'id')) + var.put(u'nodes', Js([])) + if var.get(u'id'): + var.get(u'nodes').callprop(u'push', var.get(u'declar').get(u'node')) + var.get(u'nodes').callprop(u'push', var.get(u'buildExportCall')(Js(u'default'), var.get(u'id'))) + var.get(u'addExportName')(var.get(u'id').get(u'name'), Js(u'default')) + else: + var.get(u'nodes').callprop(u'push', var.get(u'buildExportCall')(Js(u'default'), var.get(u't').callprop(u'toExpression', var.get(u'declar').get(u'node')))) + if (var.get(u'canHoist').neg() or var.get(u'declar').callprop(u'isClassDeclaration')): + var.get(u'_path2').callprop(u'replaceWithMultiple', var.get(u'nodes')) + else: + var.put(u'beforeBody', var.get(u'beforeBody').callprop(u'concat', var.get(u'nodes'))) + var.get(u'removedPaths').callprop(u'push', var.get(u'_path2')) + else: + var.get(u'_path2').callprop(u'replaceWith', var.get(u'buildExportCall')(Js(u'default'), var.get(u'declar').get(u'node'))) + else: + if var.get(u'_path2').callprop(u'isExportNamedDeclaration'): + var.put(u'_declar', var.get(u'_path2').callprop(u'get', Js(u'declaration'))) + if var.get(u'_declar').get(u'node'): + var.get(u'_path2').callprop(u'replaceWith', var.get(u'_declar')) + var.put(u'_nodes', Js([])) + var.put(u'bindingIdentifiers', PyJsComma(Js(0.0), Js(None))) + if var.get(u'_path2').callprop(u'isFunction'): + var.put(u'_node', var.get(u'_declar').get(u'node')) + var.put(u'_name', var.get(u'_node').get(u'id').get(u'name')) + if var.get(u'canHoist'): + var.get(u'addExportName')(var.get(u'_name'), var.get(u'_name')) + var.get(u'beforeBody').callprop(u'push', var.get(u'_node')) + var.get(u'beforeBody').callprop(u'push', var.get(u'buildExportCall')(var.get(u'_name'), var.get(u'_node').get(u'id'))) + var.get(u'removedPaths').callprop(u'push', var.get(u'_path2')) + else: + pass + PyJs_Object_1041_ = Js({}) + var.put(u'bindingIdentifiers', PyJsComma(PyJsComma(var.put(u'_bindingIdentifiers', PyJs_Object_1041_),var.get(u'_bindingIdentifiers').put(var.get(u'_name'), var.get(u'_node').get(u'id'))),var.get(u'_bindingIdentifiers'))) + else: + var.put(u'bindingIdentifiers', var.get(u'_declar').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindingIdentifiers'): + var.put(u'_name2', PyJsTemp) + var.get(u'addExportName')(var.get(u'_name2'), var.get(u'_name2')) + var.get(u'_nodes').callprop(u'push', var.get(u'buildExportCall')(var.get(u'_name2'), var.get(u't').callprop(u'identifier', var.get(u'_name2')))) + var.get(u'_path2').callprop(u'insertAfter', var.get(u'_nodes')) + else: + var.put(u'_specifiers', var.get(u'_path2').get(u'node').get(u'specifiers')) + if (var.get(u'_specifiers') and var.get(u'_specifiers').get(u'length')): + if var.get(u'_path2').get(u'node').get(u'source'): + var.get(u'pushModule')(var.get(u'_path2').get(u'node').get(u'source').get(u'value'), Js(u'exports'), var.get(u'_specifiers')) + var.get(u'_path2').callprop(u'remove') + else: + var.put(u'_nodes2', Js([])) + #for JS loop + var.put(u'_iterator7', var.get(u'_specifiers')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref8', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref8', var.get(u'_i7').get(u'value')) + var.put(u'_specifier', var.get(u'_ref8')) + var.get(u'_nodes2').callprop(u'push', var.get(u'buildExportCall')(var.get(u'_specifier').get(u'exported').get(u'name'), var.get(u'_specifier').get(u'local'))) + var.get(u'addExportName')(var.get(u'_specifier').get(u'local').get(u'name'), var.get(u'_specifier').get(u'exported').get(u'name')) + + var.get(u'_path2').callprop(u'replaceWithMultiple', var.get(u'_nodes2')) + + for PyJsTemp in var.get(u'modules'): + var.put(u'source', PyJsTemp) + var.put(u'specifiers', var.get(u'modules').get(var.get(u'source'))) + var.put(u'setterBody', Js([])) + var.put(u'target', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', var.get(u'source'))) + #for JS loop + var.put(u'_iterator4', var.get(u'specifiers').get(u'imports')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i4').get(u'value')) + var.put(u'specifier', var.get(u'_ref5')) + if var.get(u't').callprop(u'isImportNamespaceSpecifier', var.get(u'specifier')): + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'specifier').get(u'local'), var.get(u'target')))) + else: + if var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'specifier')): + var.put(u'specifier', var.get(u't').callprop(u'importSpecifier', var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'identifier', Js(u'default')))) + if var.get(u't').callprop(u'isImportSpecifier', var.get(u'specifier')): + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'specifier').get(u'local'), var.get(u't').callprop(u'memberExpression', var.get(u'target'), var.get(u'specifier').get(u'imported'))))) + + if var.get(u'specifiers').get(u'exports').get(u'length'): + var.put(u'exportObjRef', var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'exportObj'))) + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'exportObjRef'), var.get(u't').callprop(u'objectExpression', Js([])))]))) + #for JS loop + var.put(u'_iterator5', var.get(u'specifiers').get(u'exports')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i5').get(u'value')) + var.put(u'node', var.get(u'_ref6')) + if var.get(u't').callprop(u'isExportAllDeclaration', var.get(u'node')): + PyJs_Object_1042_ = Js({u'KEY':var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'key')),u'EXPORT_OBJ':var.get(u'exportObjRef'),u'TARGET':var.get(u'target')}) + var.get(u'setterBody').callprop(u'push', var.get(u'buildExportAll')(PyJs_Object_1042_)) + else: + if var.get(u't').callprop(u'isExportSpecifier', var.get(u'node')): + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'memberExpression', var.get(u'exportObjRef'), var.get(u'node').get(u'exported')), var.get(u't').callprop(u'memberExpression', var.get(u'target'), var.get(u'node').get(u'local'))))) + else: + pass + + var.get(u'setterBody').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'callExpression', var.get(u'exportIdent'), Js([var.get(u'exportObjRef')])))) + var.get(u'sources').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'source'))) + var.get(u'setters').callprop(u'push', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([var.get(u'target')]), var.get(u't').callprop(u'blockStatement', var.get(u'setterBody')))) + var.put(u'moduleName', var.get(u"this").callprop(u'getModuleName')) + if var.get(u'moduleName'): + var.put(u'moduleName', var.get(u't').callprop(u'stringLiteral', var.get(u'moduleName'))) + if var.get(u'canHoist'): + @Js + def PyJs_anonymous_1043_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u'variableIds').callprop(u'push', var.get(u'id')) + PyJs_anonymous_1043_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_babelHelperHoistVariables2').get(u'default'))(var.get(u'path'), PyJs_anonymous_1043_) + if var.get(u'variableIds').get(u'length'): + @Js + def PyJs_anonymous_1044_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u't').callprop(u'variableDeclarator', var.get(u'id')) + PyJs_anonymous_1044_._set_name(u'anonymous') + var.get(u'beforeBody').callprop(u'unshift', var.get(u't').callprop(u'variableDeclaration', Js(u'var'), var.get(u'variableIds').callprop(u'map', PyJs_anonymous_1044_))) + PyJs_Object_1045_ = Js({u'exports':var.get(u'exportNames'),u'buildCall':var.get(u'buildExportCall'),u'scope':var.get(u'path').get(u'scope')}) + var.get(u'path').callprop(u'traverse', var.get(u'reassignmentVisitor'), PyJs_Object_1045_) + #for JS loop + var.put(u'_iterator6', var.get(u'removedPaths')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i6').get(u'value')) + var.put(u'_path3', var.get(u'_ref7')) + var.get(u'_path3').callprop(u'remove') + + PyJs_Object_1046_ = Js({u'SYSTEM_REGISTER':var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', (var.get(u'state').get(u'opts').get(u'systemGlobal') or Js(u'System'))), var.get(u't').callprop(u'identifier', Js(u'register'))),u'BEFORE_BODY':var.get(u'beforeBody'),u'MODULE_NAME':var.get(u'moduleName'),u'SETTERS':var.get(u'setters'),u'SOURCES':var.get(u'sources'),u'BODY':var.get(u'path').get(u'node').get(u'body'),u'EXPORT_IDENTIFIER':var.get(u'exportIdent'),u'CONTEXT_IDENTIFIER':var.get(u'contextIdent')}) + var.get(u'path').get(u'node').put(u'body', Js([var.get(u'buildTemplate')(PyJs_Object_1046_)])) + PyJs_exit_1039_._set_name(u'exit') + PyJs_Object_1037_ = Js({u'enter':PyJs_enter_1038_,u'exit':PyJs_exit_1039_}) + PyJs_Object_1035_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1036_,u'Program':PyJs_Object_1037_}) + PyJs_Object_1034_ = Js({u'visitor':PyJs_Object_1035_}) + return PyJs_Object_1034_ + PyJs_anonymous_1031_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1031_) + var.put(u'_babelHelperHoistVariables', var.get(u'require')(Js(u'babel-helper-hoist-variables'))) + var.put(u'_babelHelperHoistVariables2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperHoistVariables'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + var.put(u'buildTemplate', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n SYSTEM_REGISTER(MODULE_NAME, [SOURCES], function (EXPORT_IDENTIFIER, CONTEXT_IDENTIFIER) {\n "use strict";\n BEFORE_BODY;\n return {\n setters: [SETTERS],\n execute: function () {\n BODY;\n }\n };\n });\n'))) + var.put(u'buildExportAll', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n for (var KEY in TARGET) {\n if (KEY !== "default" && KEY !== "__esModule") EXPORT_OBJ[KEY] = TARGET[KEY];\n }\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1030_._set_name(u'anonymous') +PyJs_Object_1048_ = Js({u'babel-helper-hoist-variables':Js(51.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/symbol':Js(105.0),u'babel-template':Js(221.0)}) +@Js +def PyJs_anonymous_1049_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'_babelTemplate', u'module', u'_babelTemplate2', u'buildWrapper', u'buildGlobalExport', u'_interopRequireDefault', u'buildPrerequisiteAssignment', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1064_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1064_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1050_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'isValidDefine', u't']) + @Js + def PyJsHoisted_isValidDefine_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'expr', u'args', u'path']) + if var.get(u'path').callprop(u'isExpressionStatement').neg(): + return var.get('undefined') + var.put(u'expr', var.get(u'path').callprop(u'get', Js(u'expression'))) + if var.get(u'expr').callprop(u'isCallExpression').neg(): + return Js(False) + PyJs_Object_1051_ = Js({u'name':Js(u'define')}) + if var.get(u'expr').callprop(u'get', Js(u'callee')).callprop(u'isIdentifier', PyJs_Object_1051_).neg(): + return Js(False) + var.put(u'args', var.get(u'expr').callprop(u'get', Js(u'arguments'))) + if (PyJsStrictEq(var.get(u'args').get(u'length'),Js(3.0)) and var.get(u'args').callprop(u'shift').callprop(u'isStringLiteral').neg()): + return Js(False) + if PyJsStrictNeq(var.get(u'args').get(u'length'),Js(2.0)): + return Js(False) + if var.get(u'args').callprop(u'shift').callprop(u'isArrayExpression').neg(): + return Js(False) + if var.get(u'args').callprop(u'shift').callprop(u'isFunctionExpression').neg(): + return Js(False) + return var.get(u'true') + PyJsHoisted_isValidDefine_.func_name = u'isValidDefine' + var.put(u'isValidDefine', PyJsHoisted_isValidDefine_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + @Js + def PyJs_exit_1055_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'exit':PyJs_exit_1055_, u'arguments':arguments}, var) + var.registers([u'browserGlobals', u'moduleName', u'last', u'members', u'globalName', u'args', u'browserArgs', u'commonArgs', u'amdArgs', u'state', u'call', u'func', u'globalToAssign', u'moduleNameOrBasename', u'path', u'globalExport', u'prerequisiteAssignments']) + var.put(u'last', var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'pop')) + if var.get(u'isValidDefine')(var.get(u'last')).neg(): + return var.get('undefined') + var.put(u'call', var.get(u'last').get(u'node').get(u'expression')) + var.put(u'args', var.get(u'call').get(u'arguments')) + var.put(u'moduleName', (var.get(u'args').callprop(u'shift') if PyJsStrictEq(var.get(u'args').get(u'length'),Js(3.0)) else var.get(u"null"))) + var.put(u'amdArgs', var.get(u'call').get(u'arguments').get(u'0')) + var.put(u'func', var.get(u'call').get(u'arguments').get(u'1')) + PyJs_Object_1056_ = Js({}) + var.put(u'browserGlobals', (var.get(u'state').get(u'opts').get(u'globals') or PyJs_Object_1056_)) + @Js + def PyJs_anonymous_1057_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + if (PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'module')) or PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'exports'))): + return var.get(u't').callprop(u'identifier', var.get(u'arg').get(u'value')) + else: + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'identifier', Js(u'require')), Js([var.get(u'arg')])) + PyJs_anonymous_1057_._set_name(u'anonymous') + var.put(u'commonArgs', var.get(u'amdArgs').get(u'elements').callprop(u'map', PyJs_anonymous_1057_)) + @Js + def PyJs_anonymous_1058_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'memberExpression', u'globalRef', u'arg', u'globalName', u'requireName']) + if PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'module')): + return var.get(u't').callprop(u'identifier', Js(u'mod')) + else: + if PyJsStrictEq(var.get(u'arg').get(u'value'),Js(u'exports')): + return var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'mod')), var.get(u't').callprop(u'identifier', Js(u'exports'))) + else: + var.put(u'memberExpression', PyJsComma(Js(0.0), Js(None))) + if var.get(u'state').get(u'opts').get(u'exactGlobals'): + var.put(u'globalRef', var.get(u'browserGlobals').get(var.get(u'arg').get(u'value'))) + if var.get(u'globalRef'): + @Js + def PyJs_anonymous_1059_(accum, curr, this, arguments, var=var): + var = Scope({u'this':this, u'curr':curr, u'accum':accum, u'arguments':arguments}, var) + var.registers([u'curr', u'accum']) + return var.get(u't').callprop(u'memberExpression', var.get(u'accum'), var.get(u't').callprop(u'identifier', var.get(u'curr'))) + PyJs_anonymous_1059_._set_name(u'anonymous') + var.put(u'memberExpression', var.get(u'globalRef').callprop(u'split', Js(u'.')).callprop(u'reduce', PyJs_anonymous_1059_, var.get(u't').callprop(u'identifier', Js(u'global')))) + else: + var.put(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u't').callprop(u'toIdentifier', var.get(u'arg').get(u'value'))))) + else: + var.put(u'requireName', PyJsComma(Js(0.0),var.get(u'_path').get(u'basename'))(var.get(u'arg').get(u'value'), PyJsComma(Js(0.0),var.get(u'_path').get(u'extname'))(var.get(u'arg').get(u'value')))) + var.put(u'globalName', (var.get(u'browserGlobals').get(var.get(u'requireName')) or var.get(u'requireName'))) + var.put(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u't').callprop(u'toIdentifier', var.get(u'globalName'))))) + return var.get(u'memberExpression') + PyJs_anonymous_1058_._set_name(u'anonymous') + var.put(u'browserArgs', var.get(u'amdArgs').get(u'elements').callprop(u'map', PyJs_anonymous_1058_)) + var.put(u'moduleNameOrBasename', (var.get(u'moduleName').get(u'value') if var.get(u'moduleName') else var.get(u"this").get(u'file').get(u'opts').get(u'basename'))) + var.put(u'globalToAssign', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u't').callprop(u'toIdentifier', var.get(u'moduleNameOrBasename'))))) + var.put(u'prerequisiteAssignments', var.get(u"null")) + if var.get(u'state').get(u'opts').get(u'exactGlobals'): + var.put(u'globalName', var.get(u'browserGlobals').get(var.get(u'moduleNameOrBasename'))) + if var.get(u'globalName'): + var.put(u'prerequisiteAssignments', Js([])) + var.put(u'members', var.get(u'globalName').callprop(u'split', Js(u'.'))) + @Js + def PyJs_anonymous_1060_(accum, curr, this, arguments, var=var): + var = Scope({u'this':this, u'curr':curr, u'accum':accum, u'arguments':arguments}, var) + var.registers([u'curr', u'accum']) + PyJs_Object_1061_ = Js({u'GLOBAL_REFERENCE':var.get(u'accum')}) + var.get(u'prerequisiteAssignments').callprop(u'push', var.get(u'buildPrerequisiteAssignment')(PyJs_Object_1061_)) + return var.get(u't').callprop(u'memberExpression', var.get(u'accum'), var.get(u't').callprop(u'identifier', var.get(u'curr'))) + PyJs_anonymous_1060_._set_name(u'anonymous') + var.put(u'globalToAssign', var.get(u'members').callprop(u'slice', Js(1.0)).callprop(u'reduce', PyJs_anonymous_1060_, var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'global')), var.get(u't').callprop(u'identifier', var.get(u'members').get(u'0'))))) + PyJs_Object_1062_ = Js({u'BROWSER_ARGUMENTS':var.get(u'browserArgs'),u'PREREQUISITE_ASSIGNMENTS':var.get(u'prerequisiteAssignments'),u'GLOBAL_TO_ASSIGN':var.get(u'globalToAssign')}) + var.put(u'globalExport', var.get(u'buildGlobalExport')(PyJs_Object_1062_)) + PyJs_Object_1063_ = Js({u'MODULE_NAME':var.get(u'moduleName'),u'AMD_ARGUMENTS':var.get(u'amdArgs'),u'COMMON_ARGUMENTS':var.get(u'commonArgs'),u'GLOBAL_EXPORT':var.get(u'globalExport'),u'FUNC':var.get(u'func')}) + var.get(u'last').callprop(u'replaceWith', var.get(u'buildWrapper')(PyJs_Object_1063_)) + PyJs_exit_1055_._set_name(u'exit') + PyJs_Object_1054_ = Js({u'exit':PyJs_exit_1055_}) + PyJs_Object_1053_ = Js({u'Program':PyJs_Object_1054_}) + PyJs_Object_1052_ = Js({u'inherits':var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-amd')),u'visitor':PyJs_Object_1053_}) + return PyJs_Object_1052_ + PyJs_anonymous_1050_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1050_) + var.put(u'_path', var.get(u'require')(Js(u'path'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + pass + var.put(u'buildPrerequisiteAssignment', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n GLOBAL_REFERENCE = GLOBAL_REFERENCE || {}\n'))) + var.put(u'buildGlobalExport', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n var mod = { exports: {} };\n factory(BROWSER_ARGUMENTS);\n PREREQUISITE_ASSIGNMENTS\n GLOBAL_TO_ASSIGN = mod.exports;\n'))) + var.put(u'buildWrapper', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n (function (global, factory) {\n if (typeof define === "function" && define.amd) {\n define(MODULE_NAME, AMD_ARGUMENTS, factory);\n } else if (typeof exports !== "undefined") {\n factory(COMMON_ARGUMENTS);\n } else {\n GLOBAL_EXPORT\n }\n })(this, FUNC);\n'))) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1049_._set_name(u'anonymous') +PyJs_Object_1065_ = Js({u'babel-plugin-transform-es2015-modules-amd':Js(72.0),u'babel-template':Js(221.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_1066_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_babelHelperReplaceSupers2', u'exports', u'_symbol2', u'require', u'module', u'_symbol', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_babelHelperReplaceSupers']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1077_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1077_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1067_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'Property', u't', u'CONTAINS_SUPER']) + @Js + def PyJsHoisted_Property_(path, node, scope, getObjectRef, file, this, arguments, var=var): + var = Scope({u'node':node, u'getObjectRef':getObjectRef, u'arguments':arguments, u'file':file, u'scope':scope, u'this':this, u'path':path}, var) + var.registers([u'node', u'getObjectRef', u'replaceSupers', u'file', u'scope', u'path']) + PyJs_Object_1068_ = Js({u'getObjectRef':var.get(u'getObjectRef'),u'methodNode':var.get(u'node'),u'methodPath':var.get(u'path'),u'isStatic':var.get(u'true'),u'scope':var.get(u'scope'),u'file':var.get(u'file')}) + var.put(u'replaceSupers', var.get(u'_babelHelperReplaceSupers2').get(u'default').create(PyJs_Object_1068_)) + var.get(u'replaceSupers').callprop(u'replace') + PyJsHoisted_Property_.func_name = u'Property' + var.put(u'Property', PyJsHoisted_Property_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + var.put(u'CONTAINS_SUPER', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_Super_1071_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Super':PyJs_Super_1071_, u'arguments':arguments}, var) + var.registers([u'path', u'parentObj']) + @Js + def PyJs_anonymous_1072_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'path').callprop(u'isObjectExpression') + PyJs_anonymous_1072_._set_name(u'anonymous') + var.put(u'parentObj', var.get(u'path').callprop(u'findParent', PyJs_anonymous_1072_)) + if var.get(u'parentObj'): + var.get(u'parentObj').get(u'node').put(var.get(u'CONTAINS_SUPER'), var.get(u'true')) + PyJs_Super_1071_._set_name(u'Super') + @Js + def PyJs_exit_1074_(path, file, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1074_, u'arguments':arguments, u'file':file}, var) + var.registers([u'getObjectRef', u'objectRef', u'_isArray', u'_iterator', u'file', u'propPath', u'_ref2', u'propPaths', u'_i', u'path']) + if var.get(u'path').get(u'node').get(var.get(u'CONTAINS_SUPER')).neg(): + return var.get('undefined') + var.put(u'objectRef', PyJsComma(Js(0.0), Js(None))) + @Js + def PyJs_getObjectRef_1075_(this, arguments, var=var): + var = Scope({u'this':this, u'getObjectRef':PyJs_getObjectRef_1075_, u'arguments':arguments}, var) + var.registers([]) + return var.put(u'objectRef', (var.get(u'objectRef') or var.get(u'path').get(u'scope').callprop(u'generateUidIdentifier', Js(u'obj')))) + PyJs_getObjectRef_1075_._set_name(u'getObjectRef') + var.put(u'getObjectRef', PyJs_getObjectRef_1075_) + var.put(u'propPaths', var.get(u'path').callprop(u'get', Js(u'properties'))) + #for JS loop + var.put(u'_iterator', var.get(u'propPaths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'propPath', var.get(u'_ref2')) + if var.get(u'propPath').callprop(u'isObjectProperty'): + var.put(u'propPath', var.get(u'propPath').callprop(u'get', Js(u'value'))) + var.get(u'Property')(var.get(u'propPath'), var.get(u'propPath').get(u'node'), var.get(u'path').get(u'scope'), var.get(u'getObjectRef'), var.get(u'file')) + + if var.get(u'objectRef'): + PyJs_Object_1076_ = Js({u'id':var.get(u'objectRef')}) + var.get(u'path').get(u'scope').callprop(u'push', PyJs_Object_1076_) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'objectRef'), var.get(u'path').get(u'node'))) + PyJs_exit_1074_._set_name(u'exit') + PyJs_Object_1073_ = Js({u'exit':PyJs_exit_1074_}) + PyJs_Object_1070_ = Js({u'Super':PyJs_Super_1071_,u'ObjectExpression':PyJs_Object_1073_}) + PyJs_Object_1069_ = Js({u'visitor':PyJs_Object_1070_}) + return PyJs_Object_1069_ + PyJs_anonymous_1067_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1067_) + var.put(u'_babelHelperReplaceSupers', var.get(u'require')(Js(u'babel-helper-replace-supers'))) + var.put(u'_babelHelperReplaceSupers2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperReplaceSupers'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1066_._set_name(u'anonymous') +PyJs_Object_1078_ = Js({u'babel-helper-replace-supers':Js(54.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/symbol':Js(105.0)}) +@Js +def PyJs_anonymous_1079_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_babelHelperCallDelegate', u'module', u'require', u'_babelHelperCallDelegate2', u'exports', u'_interopRequireWildcard', u'visitor', u'_babelHelperGetFunctionArity', u'_babelTypes', u'_babelHelperGetFunctionArity2', u'iifeVisitor', u'_babelTemplate', u'isSafeBinding', u'_babelTemplate2', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'buildCutOff', u'hasDefaults', u'buildDefaultParam']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1081_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1081_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isSafeBinding_(scope, node, this, arguments, var=var): + var = Scope({u'node':node, u'scope':scope, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'kind', u'_scope$getOwnBinding']) + if var.get(u'scope').callprop(u'hasOwnBinding', var.get(u'node').get(u'name')).neg(): + return var.get(u'true') + var.put(u'_scope$getOwnBinding', var.get(u'scope').callprop(u'getOwnBinding', var.get(u'node').get(u'name'))) + var.put(u'kind', var.get(u'_scope$getOwnBinding').get(u'kind')) + return (PyJsStrictEq(var.get(u'kind'),Js(u'param')) or PyJsStrictEq(var.get(u'kind'),Js(u'local'))) + PyJsHoisted_isSafeBinding_.func_name = u'isSafeBinding' + var.put(u'isSafeBinding', PyJsHoisted_isSafeBinding_) + @Js + def PyJsHoisted_hasDefaults_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'param', u'_i', u'_ref']) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'params')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'param')).neg(): + return var.get(u'true') + + return Js(False) + PyJsHoisted_hasDefaults_.func_name = u'hasDefaults' + var.put(u'hasDefaults', PyJsHoisted_hasDefaults_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1080_ = Js({}) + var.put(u'newObj', PyJs_Object_1080_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitor', var.get(u'undefined')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_babelHelperGetFunctionArity', var.get(u'require')(Js(u'babel-helper-get-function-arity'))) + var.put(u'_babelHelperGetFunctionArity2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperGetFunctionArity'))) + var.put(u'_babelHelperCallDelegate', var.get(u'require')(Js(u'babel-helper-call-delegate'))) + var.put(u'_babelHelperCallDelegate2', var.get(u'_interopRequireDefault')(var.get(u'_babelHelperCallDelegate'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildDefaultParam', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n let VARIABLE_NAME =\n ARGUMENTS.length > ARGUMENT_KEY && ARGUMENTS[ARGUMENT_KEY] !== undefined ?\n ARGUMENTS[ARGUMENT_KEY]\n :\n DEFAULT_VALUE;\n'))) + var.put(u'buildCutOff', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n let $0 = $1[$2];\n'))) + pass + pass + @Js + def PyJs_ReferencedIdentifier_1083_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1083_, u'arguments':arguments}, var) + var.registers([u'node', u'scope', u'state', u'path']) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'node', var.get(u'path').get(u'node')) + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'eval')) or var.get(u'isSafeBinding')(var.get(u'scope'), var.get(u'node')).neg()): + var.get(u'state').put(u'iife', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJs_ReferencedIdentifier_1083_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_Scope_1084_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Scope':PyJs_Scope_1084_}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Scope_1084_._set_name(u'Scope') + PyJs_Object_1082_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1083_,u'Scope':PyJs_Scope_1084_}) + var.put(u'iifeVisitor', PyJs_Object_1082_) + @Js + def PyJs_Function_1086_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1086_, u'arguments':arguments}, var) + var.registers([u'node', u'body', u'pushDefNode', u'right', u'lastNonDefaultParam', u'i', u'argsIdentifier', u'_i2', u'param', u'_param', u'state', u'declar', u'params', u'path', u'scope', u'placeholder', u'left']) + @Js + def PyJsHoisted_pushDefNode_(left, right, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'right':right, u'arguments':arguments, u'left':left}, var) + var.registers([u'i', u'defNode', u'right', u'left']) + PyJs_Object_1088_ = Js({u'VARIABLE_NAME':var.get(u'left'),u'DEFAULT_VALUE':var.get(u'right'),u'ARGUMENT_KEY':var.get(u't').callprop(u'numericLiteral', var.get(u'i')),u'ARGUMENTS':var.get(u'argsIdentifier')}) + var.put(u'defNode', var.get(u'buildDefaultParam')(PyJs_Object_1088_)) + var.get(u'defNode').put(u'_blockHoist', (var.get(u'node').get(u'params').get(u'length')-var.get(u'i'))) + var.get(u'body').callprop(u'push', var.get(u'defNode')) + PyJsHoisted_pushDefNode_.func_name = u'pushDefNode' + var.put(u'pushDefNode', PyJsHoisted_pushDefNode_) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'hasDefaults')(var.get(u'node')).neg(): + return var.get('undefined') + var.get(u'path').callprop(u'ensureBlock') + PyJs_Object_1087_ = Js({u'iife':Js(False),u'scope':var.get(u'scope')}) + var.put(u'state', PyJs_Object_1087_) + var.put(u'body', Js([])) + var.put(u'argsIdentifier', var.get(u't').callprop(u'identifier', Js(u'arguments'))) + var.get(u'argsIdentifier').put(u'_shadowedFunctionLiteral', var.get(u'path')) + pass + var.put(u'lastNonDefaultParam', PyJsComma(Js(0.0),var.get(u'_babelHelperGetFunctionArity2').get(u'default'))(var.get(u'node'))) + var.put(u'params', var.get(u'path').callprop(u'get', Js(u'params'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'lastNonDefaultParam')) or var.get(u'left').callprop(u'isPattern')): + var.put(u'placeholder', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'x'))) + var.get(u'placeholder').put(u'_isDefaultPlaceholder', var.get(u'true')) + var.get(u'node').get(u'params').put(var.get(u'i'), var.get(u'placeholder')) + else: + var.get(u'node').get(u'params').put(var.get(u'i'), var.get(u'left').get(u'node')) + if var.get(u'state').get(u'iife').neg(): + if (var.get(u'right').callprop(u'isIdentifier') and var.get(u'isSafeBinding')(var.get(u'scope'), var.get(u'right').get(u'node')).neg()): + var.get(u'state').put(u'iife', var.get(u'true')) + else: + var.get(u'right').callprop(u'traverse', var.get(u'iifeVisitor'), var.get(u'state')) + var.get(u'pushDefNode')(var.get(u'left').get(u'node'), var.get(u'right').get(u'node'), var.get(u'i')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + #for JS loop + var.put(u'_i2', (var.get(u'lastNonDefaultParam')+Js(1.0))) + while (var.get(u'_i2')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if (var.get(u'param').callprop(u'isRestElement') or var.get(u'param').callprop(u'isAssignmentPattern')): + var.get(u'path').callprop(u'arrowFunctionToShadowed') + break + + PyJs_ArrowFunctionExpression_1099_._set_name(u'ArrowFunctionExpression') + PyJs_Object_1098_ = Js({u'ArrowFunctionExpression':PyJs_ArrowFunctionExpression_1099_}) + PyJs_Object_1097_ = Js({u'visitor':var.get(u'_babelTraverse').get(u'visitors').callprop(u'merge', Js([PyJs_Object_1098_, var.get(u'destructuring').get(u'visitor'), var.get(u'rest').get(u'visitor'), var.get(u'def').get(u'visitor')]))}) + return PyJs_Object_1097_ + PyJs_anonymous_1096_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1096_) + var.put(u'_babelTraverse', var.get(u'require')(Js(u'babel-traverse'))) + var.put(u'_destructuring', var.get(u'require')(Js(u'./destructuring'))) + var.put(u'destructuring', var.get(u'_interopRequireWildcard')(var.get(u'_destructuring'))) + var.put(u'_default', var.get(u'require')(Js(u'./default'))) + var.put(u'def', var.get(u'_interopRequireWildcard')(var.get(u'_default'))) + var.put(u'_rest', var.get(u'require')(Js(u'./rest'))) + var.put(u'rest', var.get(u'_interopRequireWildcard')(var.get(u'_rest'))) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1095_._set_name(u'anonymous') +PyJs_Object_1102_ = Js({u'./default':Js(77.0),u'./destructuring':Js(78.0),u'./rest':Js(80.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-traverse':Js(225.0)}) +@Js +def PyJs_anonymous_1103_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'restIndexImpure', u'exports', u'optimiseLengthGetter', u'hasRest', u'_interopRequireWildcard', u'visitor', u'require', u'_babelTypes', u'_babelTemplate', u'module', u'restIndex', u'buildRest', u'_babelTemplate2', u't', u'_interopRequireDefault', u'restLength', u'_getIterator2', u'_getIterator3', u'optimiseIndexGetter', u'memberExpressionOptimisationVisitor']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1105_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1105_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_optimiseLengthGetter_(path, argsId, offset, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'argsId':argsId, u'offset':offset}, var) + var.registers([u'path', u'argsId', u'offset']) + if var.get(u'offset'): + PyJs_Object_1121_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'OFFSET':var.get(u't').callprop(u'numericLiteral', var.get(u'offset'))}) + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u'restLength')(PyJs_Object_1121_)) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'argsId')) + PyJsHoisted_optimiseLengthGetter_.func_name = u'optimiseLengthGetter' + var.put(u'optimiseLengthGetter', PyJsHoisted_optimiseLengthGetter_) + @Js + def PyJsHoisted_optimiseIndexGetter_(path, argsId, offset, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'argsId':argsId, u'offset':offset}, var) + var.registers([u'index', u'temp', u'argsId', u'offset', u'path', u'scope']) + var.put(u'index', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isNumericLiteral', var.get(u'path').get(u'parent').get(u'property')): + var.put(u'index', var.get(u't').callprop(u'numericLiteral', (var.get(u'path').get(u'parent').get(u'property').get(u'value')+var.get(u'offset')))) + else: + if PyJsStrictEq(var.get(u'offset'),Js(0.0)): + var.put(u'index', var.get(u'path').get(u'parent').get(u'property')) + else: + var.put(u'index', var.get(u't').callprop(u'binaryExpression', Js(u'+'), var.get(u'path').get(u'parent').get(u'property'), var.get(u't').callprop(u'numericLiteral', var.get(u'offset')))) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'scope').callprop(u'isPure', var.get(u'index')).neg(): + var.put(u'temp', var.get(u'scope').callprop(u'generateUidIdentifierBasedOnNode', var.get(u'index'))) + PyJs_Object_1118_ = Js({u'id':var.get(u'temp'),u'kind':Js(u'var')}) + var.get(u'scope').callprop(u'push', PyJs_Object_1118_) + PyJs_Object_1119_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'INDEX':var.get(u'index'),u'REF':var.get(u'temp')}) + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u'restIndexImpure')(PyJs_Object_1119_)) + else: + PyJs_Object_1120_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'INDEX':var.get(u'index')}) + var.get(u'path').get(u'parentPath').callprop(u'replaceWith', var.get(u'restIndex')(PyJs_Object_1120_)) + PyJsHoisted_optimiseIndexGetter_.func_name = u'optimiseIndexGetter' + var.put(u'optimiseIndexGetter', PyJsHoisted_optimiseIndexGetter_) + @Js + def PyJsHoisted_hasRest_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u't').callprop(u'isRestElement', var.get(u'node').get(u'params').get((var.get(u'node').get(u'params').get(u'length')-Js(1.0)))) + PyJsHoisted_hasRest_.func_name = u'hasRest' + var.put(u'hasRest', PyJsHoisted_hasRest_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1104_ = Js({}) + var.put(u'newObj', PyJs_Object_1104_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitor', var.get(u'undefined')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_babelTemplate', var.get(u'require')(Js(u'babel-template'))) + var.put(u'_babelTemplate2', var.get(u'_interopRequireDefault')(var.get(u'_babelTemplate'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'buildRest', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n for (var LEN = ARGUMENTS.length,\n ARRAY = Array(ARRAY_LEN),\n KEY = START;\n KEY < LEN;\n KEY++) {\n ARRAY[ARRAY_KEY] = ARGUMENTS[KEY];\n }\n'))) + var.put(u'restIndex', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n ARGUMENTS.length <= INDEX ? undefined : ARGUMENTS[INDEX]\n'))) + var.put(u'restIndexImpure', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n REF = INDEX, ARGUMENTS.length <= REF ? undefined : ARGUMENTS[REF]\n'))) + var.put(u'restLength', PyJsComma(Js(0.0),var.get(u'_babelTemplate2').get(u'default'))(Js(u'\n ARGUMENTS.length <= OFFSET ? 0 : ARGUMENTS.length - OFFSET\n'))) + @Js + def PyJs_Scope_1107_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_1107_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'scope').callprop(u'bindingIdentifierEquals', var.get(u'state').get(u'name'), var.get(u'state').get(u'outerBinding')).neg(): + var.get(u'path').callprop(u'skip') + PyJs_Scope_1107_._set_name(u'Scope') + @Js + def PyJs_Flow_1108_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Flow':PyJs_Flow_1108_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isTypeCastExpression'): + return var.get('undefined') + var.get(u'path').callprop(u'skip') + PyJs_Flow_1108_._set_name(u'Flow') + @Js + def PyJs_FunctionClassProperty_1109_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'FunctionClassProperty':PyJs_FunctionClassProperty_1109_}, var) + var.registers([u'oldNoOptimise', u'state', u'path']) + var.put(u'oldNoOptimise', var.get(u'state').get(u'noOptimise')) + var.get(u'state').put(u'noOptimise', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'memberExpressionOptimisationVisitor'), var.get(u'state')) + var.get(u'state').put(u'noOptimise', var.get(u'oldNoOptimise')) + var.get(u'path').callprop(u'skip') + PyJs_FunctionClassProperty_1109_._set_name(u'FunctionClassProperty') + @Js + def PyJs_ReferencedIdentifier_1110_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1110_, u'arguments':arguments}, var) + var.registers([u'node', u'grandparentPath', u'argsOptEligible', u'state', u'call', u'parentPath', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'arguments')): + var.get(u'state').put(u'deopted', var.get(u'true')) + if PyJsStrictNeq(var.get(u'node').get(u'name'),var.get(u'state').get(u'name')): + return var.get('undefined') + if var.get(u'state').get(u'noOptimise'): + var.get(u'state').put(u'deopted', var.get(u'true')) + else: + var.put(u'parentPath', var.get(u'path').get(u'parentPath')) + PyJs_Object_1111_ = Js({u'object':var.get(u'node')}) + if var.get(u'parentPath').callprop(u'isMemberExpression', PyJs_Object_1111_): + var.put(u'grandparentPath', var.get(u'parentPath').get(u'parentPath')) + def PyJs_LONG_1113_(var=var): + PyJs_Object_1112_ = Js({u'operator':Js(u'delete')}) + return (((((var.get(u'grandparentPath').callprop(u'isAssignmentExpression') and PyJsStrictEq(var.get(u'parentPath').get(u'node'),var.get(u'grandparentPath').get(u'node').get(u'left'))) or var.get(u'grandparentPath').callprop(u'isLVal')) or var.get(u'grandparentPath').callprop(u'isForXStatement')) or var.get(u'grandparentPath').callprop(u'isUpdateExpression')) or var.get(u'grandparentPath').callprop(u'isUnaryExpression', PyJs_Object_1112_)) + var.put(u'argsOptEligible', (var.get(u'state').get(u'deopted').neg() and (PyJs_LONG_1113_() or ((var.get(u'grandparentPath').callprop(u'isCallExpression') or var.get(u'grandparentPath').callprop(u'isNewExpression')) and PyJsStrictEq(var.get(u'parentPath').get(u'node'),var.get(u'grandparentPath').get(u'node').get(u'callee')))).neg())) + if var.get(u'argsOptEligible'): + if var.get(u'parentPath').get(u'node').get(u'computed'): + if var.get(u'parentPath').callprop(u'get', Js(u'property')).callprop(u'isBaseType', Js(u'number')): + PyJs_Object_1114_ = Js({u'cause':Js(u'indexGetter'),u'path':var.get(u'path')}) + var.get(u'state').get(u'candidates').callprop(u'push', PyJs_Object_1114_) + return var.get('undefined') + else: + if PyJsStrictEq(var.get(u'parentPath').get(u'node').get(u'property').get(u'name'),Js(u'length')): + PyJs_Object_1115_ = Js({u'cause':Js(u'lengthGetter'),u'path':var.get(u'path')}) + var.get(u'state').get(u'candidates').callprop(u'push', PyJs_Object_1115_) + return var.get('undefined') + if (PyJsStrictEq(var.get(u'state').get(u'offset'),Js(0.0)) and var.get(u'parentPath').callprop(u'isSpreadElement')): + var.put(u'call', var.get(u'parentPath').get(u'parentPath')) + if (var.get(u'call').callprop(u'isCallExpression') and PyJsStrictEq(var.get(u'call').get(u'node').get(u'arguments').get(u'length'),Js(1.0))): + PyJs_Object_1116_ = Js({u'cause':Js(u'argSpread'),u'path':var.get(u'path')}) + var.get(u'state').get(u'candidates').callprop(u'push', PyJs_Object_1116_) + return var.get('undefined') + var.get(u'state').get(u'references').callprop(u'push', var.get(u'path')) + PyJs_ReferencedIdentifier_1110_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_BindingIdentifier_1117_(_ref, state, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'BindingIdentifier':PyJs_BindingIdentifier_1117_, u'state':state, u'arguments':arguments}, var) + var.registers([u'node', u'_ref', u'state']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'name'),var.get(u'state').get(u'name')): + var.get(u'state').put(u'deopted', var.get(u'true')) + PyJs_BindingIdentifier_1117_._set_name(u'BindingIdentifier') + PyJs_Object_1106_ = Js({u'Scope':PyJs_Scope_1107_,u'Flow':PyJs_Flow_1108_,u'Function|ClassProperty':PyJs_FunctionClassProperty_1109_,u'ReferencedIdentifier':PyJs_ReferencedIdentifier_1110_,u'BindingIdentifier':PyJs_BindingIdentifier_1117_}) + var.put(u'memberExpressionOptimisationVisitor', PyJs_Object_1106_) + pass + pass + pass + @Js + def PyJs_Function_1123_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1123_, u'arguments':arguments}, var) + var.registers([u'node', u'arrLen', u'_isArray', u'_iterator', u'key', u'arrKey', u'_ref3', u'_ref2', u'argsId', u'len', u'start', u'state', u'rest', u'_i', u'target', u'scope', u'path', u'cause', u'loop', u'_path']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + if var.get(u'hasRest')(var.get(u'node')).neg(): + return var.get('undefined') + var.put(u'rest', var.get(u'node').get(u'params').callprop(u'pop').get(u'argument')) + var.put(u'argsId', var.get(u't').callprop(u'identifier', Js(u'arguments'))) + var.get(u'argsId').put(u'_shadowedFunctionLiteral', var.get(u'path')) + PyJs_Object_1124_ = Js({u'references':Js([]),u'offset':var.get(u'node').get(u'params').get(u'length'),u'argumentsNode':var.get(u'argsId'),u'outerBinding':var.get(u'scope').callprop(u'getBindingIdentifier', var.get(u'rest').get(u'name')),u'candidates':Js([]),u'name':var.get(u'rest').get(u'name'),u'deopted':Js(False)}) + var.put(u'state', PyJs_Object_1124_) + var.get(u'path').callprop(u'traverse', var.get(u'memberExpressionOptimisationVisitor'), var.get(u'state')) + if (var.get(u'state').get(u'deopted').neg() and var.get(u'state').get(u'references').get(u'length').neg()): + #for JS loop + var.put(u'_iterator', var.get(u'state').get(u'candidates')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'_ref3', var.get(u'_ref2')) + var.put(u'_path', var.get(u'_ref3').get(u'path')) + var.put(u'cause', var.get(u'_ref3').get(u'cause')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'cause')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'indexGetter')): + SWITCHED = True + var.get(u'optimiseIndexGetter')(var.get(u'_path'), var.get(u'argsId'), var.get(u'state').get(u'offset')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'lengthGetter')): + SWITCHED = True + var.get(u'optimiseLengthGetter')(var.get(u'_path'), var.get(u'argsId'), var.get(u'state').get(u'offset')) + break + if True: + SWITCHED = True + var.get(u'_path').callprop(u'replaceWith', var.get(u'argsId')) + SWITCHED = True + break + + return var.get('undefined') + @Js + def PyJs_anonymous_1125_(_ref4, this, arguments, var=var): + var = Scope({u'this':this, u'_ref4':_ref4, u'arguments':arguments}, var) + var.registers([u'path', u'_ref4']) + var.put(u'path', var.get(u'_ref4').get(u'path')) + return var.get(u'path') + PyJs_anonymous_1125_._set_name(u'anonymous') + var.get(u'state').put(u'references', var.get(u'state').get(u'references').callprop(u'concat', var.get(u'state').get(u'candidates').callprop(u'map', PyJs_anonymous_1125_))) + var.get(u'state').put(u'deopted', (var.get(u'state').get(u'deopted') or var.get(u'node').get(u'shadow').neg().neg())) + var.put(u'start', var.get(u't').callprop(u'numericLiteral', var.get(u'node').get(u'params').get(u'length'))) + var.put(u'key', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'key'))) + var.put(u'len', var.get(u'scope').callprop(u'generateUidIdentifier', Js(u'len'))) + var.put(u'arrKey', var.get(u'key')) + var.put(u'arrLen', var.get(u'len')) + if var.get(u'node').get(u'params').get(u'length'): + var.put(u'arrKey', var.get(u't').callprop(u'binaryExpression', Js(u'-'), var.get(u'key'), var.get(u'start'))) + var.put(u'arrLen', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'>'), var.get(u'len'), var.get(u'start')), var.get(u't').callprop(u'binaryExpression', Js(u'-'), var.get(u'len'), var.get(u'start')), var.get(u't').callprop(u'numericLiteral', Js(0.0)))) + PyJs_Object_1126_ = Js({u'ARGUMENTS':var.get(u'argsId'),u'ARRAY_KEY':var.get(u'arrKey'),u'ARRAY_LEN':var.get(u'arrLen'),u'START':var.get(u'start'),u'ARRAY':var.get(u'rest'),u'KEY':var.get(u'key'),u'LEN':var.get(u'len')}) + var.put(u'loop', var.get(u'buildRest')(PyJs_Object_1126_)) + if var.get(u'state').get(u'deopted'): + var.get(u'loop').put(u'_blockHoist', (var.get(u'node').get(u'params').get(u'length')+Js(1.0))) + var.get(u'node').get(u'body').get(u'body').callprop(u'unshift', var.get(u'loop')) + else: + var.get(u'loop').put(u'_blockHoist', Js(1.0)) + var.put(u'target', var.get(u'path').callprop(u'getEarliestCommonAncestorFrom', var.get(u'state').get(u'references')).callprop(u'getStatementParent')) + @Js + def PyJs_anonymous_1127_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isLoop'): + var.put(u'target', var.get(u'path')) + else: + return var.get(u'path').callprop(u'isFunction') + PyJs_anonymous_1127_._set_name(u'anonymous') + var.get(u'target').callprop(u'findParent', PyJs_anonymous_1127_) + var.get(u'target').callprop(u'insertBefore', var.get(u'loop')) + PyJs_Function_1123_._set_name(u'Function') + PyJs_Object_1122_ = Js({u'Function':PyJs_Function_1123_}) + var.put(u'visitor', var.get(u'exports').put(u'visitor', PyJs_Object_1122_)) +PyJs_anonymous_1103_._set_name(u'anonymous') +PyJs_Object_1128_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-template':Js(221.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1129_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1135_ = Js({}) + var.put(u'newObj', PyJs_Object_1135_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1130_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_ObjectMethod_1133_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ObjectMethod':PyJs_ObjectMethod_1133_}, var) + var.registers([u'node', u'path', u'func']) + var.put(u'node', var.get(u'path').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'method')): + var.put(u'func', var.get(u't').callprop(u'functionExpression', var.get(u"null"), var.get(u'node').get(u'params'), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'async'))) + var.get(u'func').put(u'returnType', var.get(u'node').get(u'returnType')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'objectProperty', var.get(u'node').get(u'key'), var.get(u'func'), var.get(u'node').get(u'computed'))) + PyJs_ObjectMethod_1133_._set_name(u'ObjectMethod') + @Js + def PyJs_ObjectProperty_1134_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'ObjectProperty':PyJs_ObjectProperty_1134_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if var.get(u'node').get(u'shorthand'): + var.get(u'node').put(u'shorthand', Js(False)) + PyJs_ObjectProperty_1134_._set_name(u'ObjectProperty') + PyJs_Object_1132_ = Js({u'ObjectMethod':PyJs_ObjectMethod_1133_,u'ObjectProperty':PyJs_ObjectProperty_1134_}) + PyJs_Object_1131_ = Js({u'visitor':PyJs_Object_1132_}) + return PyJs_Object_1131_ + PyJs_anonymous_1130_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1130_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1129_._set_name(u'anonymous') +PyJs_Object_1136_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1137_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1146_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1146_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1138_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'hasSpread', u't', u'getSpreadLiteral', u'build']) + @Js + def PyJsHoisted_hasSpread_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'i', u'nodes']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref2')) + if var.get(u't').callprop(u'isSpreadElement', var.get(u'prop')): + var.get(u'push')() + var.get(u'nodes').callprop(u'push', var.get(u'getSpreadLiteral')(var.get(u'prop'), var.get(u'scope'), var.get(u'state'))) + else: + var.get(u'_props').callprop(u'push', var.get(u'prop')) + + var.get(u'push')() + return var.get(u'nodes') + PyJsHoisted_build_.func_name = u'build' + var.put(u'build', PyJsHoisted_build_) + @Js + def PyJsHoisted_getSpreadLiteral_(spread, scope, state, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'state':state, u'spread':spread, u'arguments':arguments}, var) + var.registers([u'scope', u'state', u'spread']) + PyJs_Object_1139_ = Js({u'name':Js(u'arguments')}) + if (var.get(u'state').get(u'opts').get(u'loose') and var.get(u't').callprop(u'isIdentifier', var.get(u'spread').get(u'argument'), PyJs_Object_1139_).neg()): + return var.get(u'spread').get(u'argument') + else: + return var.get(u'scope').callprop(u'toArray', var.get(u'spread').get(u'argument'), var.get(u'true')) + PyJsHoisted_getSpreadLiteral_.func_name = u'getSpreadLiteral' + var.put(u'getSpreadLiteral', PyJsHoisted_getSpreadLiteral_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + pass + pass + @Js + def PyJs_ArrayExpression_1142_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ArrayExpression':PyJs_ArrayExpression_1142_}, var) + var.registers([u'node', u'elements', u'state', u'path', u'scope', u'nodes', u'first']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'elements', var.get(u'node').get(u'elements')) + if var.get(u'hasSpread')(var.get(u'elements')).neg(): + return var.get('undefined') + var.put(u'nodes', var.get(u'build')(var.get(u'elements'), var.get(u'scope'), var.get(u'state'))) + var.put(u'first', var.get(u'nodes').callprop(u'shift')) + if var.get(u't').callprop(u'isArrayExpression', var.get(u'first')).neg(): + var.get(u'nodes').callprop(u'unshift', var.get(u'first')) + var.put(u'first', var.get(u't').callprop(u'arrayExpression', Js([]))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'first'), var.get(u't').callprop(u'identifier', Js(u'concat'))), var.get(u'nodes'))) + PyJs_ArrayExpression_1142_._set_name(u'ArrayExpression') + @Js + def PyJs_CallExpression_1143_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'CallExpression':PyJs_CallExpression_1143_}, var) + var.registers([u'node', u'temp', u'contextLiteral', u'args', u'calleePath', u'state', u'path', u'scope', u'nodes', u'callee', u'first']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'args', var.get(u'node').get(u'arguments')) + if var.get(u'hasSpread')(var.get(u'args')).neg(): + return var.get('undefined') + var.put(u'calleePath', var.get(u'path').callprop(u'get', Js(u'callee'))) + if var.get(u'calleePath').callprop(u'isSuper'): + return var.get('undefined') + var.put(u'contextLiteral', var.get(u't').callprop(u'identifier', Js(u'undefined'))) + var.get(u'node').put(u'arguments', Js([])) + var.put(u'nodes', PyJsComma(Js(0.0), Js(None))) + if (PyJsStrictEq(var.get(u'args').get(u'length'),Js(1.0)) and PyJsStrictEq(var.get(u'args').get(u'0').get(u'argument').get(u'name'),Js(u'arguments'))): + var.put(u'nodes', Js([var.get(u'args').get(u'0').get(u'argument')])) + else: + var.put(u'nodes', var.get(u'build')(var.get(u'args'), var.get(u'scope'), var.get(u'state'))) + var.put(u'first', var.get(u'nodes').callprop(u'shift')) + if var.get(u'nodes').get(u'length'): + var.get(u'node').get(u'arguments').callprop(u'push', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'first'), var.get(u't').callprop(u'identifier', Js(u'concat'))), var.get(u'nodes'))) + else: + var.get(u'node').get(u'arguments').callprop(u'push', var.get(u'first')) + var.put(u'callee', var.get(u'node').get(u'callee')) + if var.get(u'calleePath').callprop(u'isMemberExpression'): + var.put(u'temp', var.get(u'scope').callprop(u'maybeGenerateMemoised', var.get(u'callee').get(u'object'))) + if var.get(u'temp'): + var.get(u'callee').put(u'object', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'temp'), var.get(u'callee').get(u'object'))) + var.put(u'contextLiteral', var.get(u'temp')) + else: + var.put(u'contextLiteral', var.get(u'callee').get(u'object')) + var.get(u't').callprop(u'appendToMemberExpression', var.get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'apply'))) + else: + var.get(u'node').put(u'callee', var.get(u't').callprop(u'memberExpression', var.get(u'node').get(u'callee'), var.get(u't').callprop(u'identifier', Js(u'apply')))) + if var.get(u't').callprop(u'isSuper', var.get(u'contextLiteral')): + var.put(u'contextLiteral', var.get(u't').callprop(u'thisExpression')) + var.get(u'node').get(u'arguments').callprop(u'unshift', var.get(u'contextLiteral')) + PyJs_CallExpression_1143_._set_name(u'CallExpression') + @Js + def PyJs_NewExpression_1144_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'NewExpression':PyJs_NewExpression_1144_}, var) + var.registers([u'node', u'args', u'state', u'context', u'path', u'scope', u'nodes']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'args', var.get(u'node').get(u'arguments')) + if var.get(u'hasSpread')(var.get(u'args')).neg(): + return var.get('undefined') + var.put(u'nodes', var.get(u'build')(var.get(u'args'), var.get(u'scope'), var.get(u'state'))) + var.put(u'context', var.get(u't').callprop(u'arrayExpression', Js([var.get(u't').callprop(u'nullLiteral')]))) + var.put(u'args', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u'context'), var.get(u't').callprop(u'identifier', Js(u'concat'))), var.get(u'nodes'))) + def PyJs_LONG_1145_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'Function')), var.get(u't').callprop(u'identifier', Js(u'prototype'))), var.get(u't').callprop(u'identifier', Js(u'bind'))), var.get(u't').callprop(u'identifier', Js(u'apply'))), Js([var.get(u'node').get(u'callee'), var.get(u'args')])) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'newExpression', PyJs_LONG_1145_(), Js([]))) + PyJs_NewExpression_1144_._set_name(u'NewExpression') + PyJs_Object_1141_ = Js({u'ArrayExpression':PyJs_ArrayExpression_1142_,u'CallExpression':PyJs_CallExpression_1143_,u'NewExpression':PyJs_NewExpression_1144_}) + PyJs_Object_1140_ = Js({u'visitor':PyJs_Object_1141_}) + return PyJs_Object_1140_ + PyJs_anonymous_1138_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1138_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1137_._set_name(u'anonymous') +PyJs_Object_1147_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_1148_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'regex', u'exports', u'_babelHelperRegex', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1153_ = Js({}) + var.put(u'newObj', PyJs_Object_1153_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1149_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_RegExpLiteral_1152_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'RegExpLiteral':PyJs_RegExpLiteral_1152_}, var) + var.registers([u'node', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'regex').callprop(u'is', var.get(u'node'), Js(u'y')).neg(): + return var.get('undefined') + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'newExpression', var.get(u't').callprop(u'identifier', Js(u'RegExp')), Js([var.get(u't').callprop(u'stringLiteral', var.get(u'node').get(u'pattern')), var.get(u't').callprop(u'stringLiteral', var.get(u'node').get(u'flags'))]))) + PyJs_RegExpLiteral_1152_._set_name(u'RegExpLiteral') + PyJs_Object_1151_ = Js({u'RegExpLiteral':PyJs_RegExpLiteral_1152_}) + PyJs_Object_1150_ = Js({u'visitor':PyJs_Object_1151_}) + return PyJs_Object_1150_ + PyJs_anonymous_1149_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1149_) + var.put(u'_babelHelperRegex', var.get(u'require')(Js(u'babel-helper-regex'))) + var.put(u'regex', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelperRegex'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1148_._set_name(u'anonymous') +PyJs_Object_1154_ = Js({u'babel-helper-regex':Js(53.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1155_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1163_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1163_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1156_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'_ref', u'isString', u'buildBinaryExpression', u't']) + @Js + def PyJsHoisted_isString_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u't').callprop(u'isLiteral', var.get(u'node')) and PyJsStrictEq(var.get(u'node').get(u'value').typeof(),Js(u'string'))) + PyJsHoisted_isString_.func_name = u'isString' + var.put(u'isString', PyJsHoisted_isString_) + @Js + def PyJsHoisted_buildBinaryExpression_(left, right, this, arguments, var=var): + var = Scope({u'this':this, u'right':right, u'arguments':arguments, u'left':left}, var) + var.registers([u'right', u'left']) + return var.get(u't').callprop(u'binaryExpression', Js(u'+'), var.get(u'left'), var.get(u'right')) + PyJsHoisted_buildBinaryExpression_.func_name = u'buildBinaryExpression' + var.put(u'buildBinaryExpression', PyJsHoisted_buildBinaryExpression_) + var.put(u't', var.get(u'_ref').get(u'types')) + pass + pass + @Js + def PyJs_TaggedTemplateExpression_1159_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'TaggedTemplateExpression':PyJs_TaggedTemplateExpression_1159_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'templateObject', u'templateName', u'args', u'_ref2', u'elem', u'raw', u'quasi', u'state', u'_i', u'path', u'strings']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'quasi', var.get(u'node').get(u'quasi')) + var.put(u'args', Js([])) + var.put(u'strings', Js([])) + var.put(u'raw', Js([])) + #for JS loop + var.put(u'_iterator', var.get(u'quasi').get(u'quasis')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'elem', var.get(u'_ref2')) + var.get(u'strings').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'elem').get(u'value').get(u'cooked'))) + var.get(u'raw').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'elem').get(u'value').get(u'raw'))) + + var.put(u'strings', var.get(u't').callprop(u'arrayExpression', var.get(u'strings'))) + var.put(u'raw', var.get(u't').callprop(u'arrayExpression', var.get(u'raw'))) + var.put(u'templateName', Js(u'taggedTemplateLiteral')) + if var.get(u'state').get(u'opts').get(u'loose'): + var.put(u'templateName', Js(u'Loose'), u'+') + var.put(u'templateObject', var.get(u'state').get(u'file').callprop(u'addTemplateObject', var.get(u'templateName'), var.get(u'strings'), var.get(u'raw'))) + var.get(u'args').callprop(u'push', var.get(u'templateObject')) + var.put(u'args', var.get(u'args').callprop(u'concat', var.get(u'quasi').get(u'expressions'))) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u'node').get(u'tag'), var.get(u'args'))) + PyJs_TaggedTemplateExpression_1159_._set_name(u'TaggedTemplateExpression') + @Js + def PyJs_TemplateLiteral_1160_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'TemplateLiteral':PyJs_TemplateLiteral_1160_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref4', u'_isArray3', u'_isArray2', u'expr', u'_i3', u'_ref3', u'_i2', u'elem', u'state', u'path', u'nodes', u'root', u'expressions', u'_iterator3', u'_iterator2']) + var.put(u'nodes', Js([])) + var.put(u'expressions', var.get(u'path').callprop(u'get', Js(u'expressions'))) + #for JS loop + var.put(u'_iterator2', var.get(u'path').get(u'node').get(u'quasis')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i2').get(u'value')) + var.put(u'elem', var.get(u'_ref3')) + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'stringLiteral', var.get(u'elem').get(u'value').get(u'cooked'))) + var.put(u'expr', var.get(u'expressions').callprop(u'shift')) + if var.get(u'expr'): + if ((var.get(u'state').get(u'opts').get(u'spec') and var.get(u'expr').callprop(u'isBaseType', Js(u'string')).neg()) and var.get(u'expr').callprop(u'isBaseType', Js(u'number')).neg()): + var.get(u'nodes').callprop(u'push', var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'identifier', Js(u'String')), Js([var.get(u'expr').get(u'node')]))) + else: + var.get(u'nodes').callprop(u'push', var.get(u'expr').get(u'node')) + + @Js + def PyJs_anonymous_1161_(n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'n':n}, var) + var.registers([u'n']) + PyJs_Object_1162_ = Js({u'value':Js(u'')}) + return var.get(u't').callprop(u'isLiteral', var.get(u'n'), PyJs_Object_1162_).neg() + PyJs_anonymous_1161_._set_name(u'anonymous') + var.put(u'nodes', var.get(u'nodes').callprop(u'filter', PyJs_anonymous_1161_)) + if (var.get(u'isString')(var.get(u'nodes').get(u'0')).neg() and var.get(u'isString')(var.get(u'nodes').get(u'1')).neg()): + var.get(u'nodes').callprop(u'unshift', var.get(u't').callprop(u'stringLiteral', Js(u''))) + if (var.get(u'nodes').get(u'length')>Js(1.0)): + var.put(u'root', var.get(u'buildBinaryExpression')(var.get(u'nodes').callprop(u'shift'), var.get(u'nodes').callprop(u'shift'))) + #for JS loop + var.put(u'_iterator3', var.get(u'nodes')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i3').get(u'value')) + var.put(u'node', var.get(u'_ref4')) + var.put(u'root', var.get(u'buildBinaryExpression')(var.get(u'root'), var.get(u'node'))) + + var.get(u'path').callprop(u'replaceWith', var.get(u'root')) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'nodes').get(u'0')) + PyJs_TemplateLiteral_1160_._set_name(u'TemplateLiteral') + PyJs_Object_1158_ = Js({u'TaggedTemplateExpression':PyJs_TaggedTemplateExpression_1159_,u'TemplateLiteral':PyJs_TemplateLiteral_1160_}) + PyJs_Object_1157_ = Js({u'visitor':PyJs_Object_1158_}) + return PyJs_Object_1157_ + PyJs_anonymous_1156_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1156_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1155_._set_name(u'anonymous') +PyJs_Object_1164_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_1165_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_symbol2', u'require', u'module', u'_symbol', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1172_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1172_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1166_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'IGNORE', u'_ref', u't']) + var.put(u't', var.get(u'_ref').get(u'types')) + var.put(u'IGNORE', PyJsComma(Js(0.0),var.get(u'_symbol2').get(u'default'))()) + @Js + def PyJs_Scope_1169_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'Scope':PyJs_Scope_1169_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'scope', u'_ref2']) + var.put(u'scope', var.get(u'_ref2').get(u'scope')) + if var.get(u'scope').callprop(u'getBinding', Js(u'Symbol')).neg(): + return var.get('undefined') + var.get(u'scope').callprop(u'rename', Js(u'Symbol')) + PyJs_Scope_1169_._set_name(u'Scope') + @Js + def PyJs_UnaryExpression_1170_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'UnaryExpression':PyJs_UnaryExpression_1170_, u'arguments':arguments}, var) + var.registers([u'node', u'parent', u'opposite', u'unary', u'call', u'undefLiteral', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'parent', var.get(u'path').get(u'parent')) + if var.get(u'node').get(var.get(u'IGNORE')): + return var.get('undefined') + @Js + def PyJs_anonymous_1171_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').get(u'node') and var.get(u'path').get(u'node').get(u'_generated').neg().neg()) + PyJs_anonymous_1171_._set_name(u'anonymous') + if var.get(u'path').callprop(u'find', PyJs_anonymous_1171_): + return var.get('undefined') + if (var.get(u'path').get(u'parentPath').callprop(u'isBinaryExpression') and (var.get(u't').get(u'EQUALITY_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'parent').get(u'operator'))>=Js(0.0))): + var.put(u'opposite', var.get(u'path').callprop(u'getOpposite')) + if ((var.get(u'opposite').callprop(u'isLiteral') and PyJsStrictNeq(var.get(u'opposite').get(u'node').get(u'value'),Js(u'symbol'))) and PyJsStrictNeq(var.get(u'opposite').get(u'node').get(u'value'),Js(u'object'))): + return var.get('undefined') + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'typeof')): + var.put(u'call', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'addHelper', Js(u'typeof')), Js([var.get(u'node').get(u'argument')]))) + if var.get(u'path').callprop(u'get', Js(u'argument')).callprop(u'isIdentifier'): + var.put(u'undefLiteral', var.get(u't').callprop(u'stringLiteral', Js(u'undefined'))) + var.put(u'unary', var.get(u't').callprop(u'unaryExpression', Js(u'typeof'), var.get(u'node').get(u'argument'))) + var.get(u'unary').put(var.get(u'IGNORE'), var.get(u'true')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'unary'), var.get(u'undefLiteral')), var.get(u'undefLiteral'), var.get(u'call'))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'call')) + PyJs_UnaryExpression_1170_._set_name(u'UnaryExpression') + PyJs_Object_1168_ = Js({u'Scope':PyJs_Scope_1169_,u'UnaryExpression':PyJs_UnaryExpression_1170_}) + PyJs_Object_1167_ = Js({u'visitor':PyJs_Object_1168_}) + return PyJs_Object_1167_ + PyJs_anonymous_1166_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1166_) + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1165_._set_name(u'anonymous') +PyJs_Object_1173_ = Js({u'babel-runtime/core-js/symbol':Js(105.0)}) +@Js +def PyJs_anonymous_1174_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_regexpuCore', u'regex', u'exports', u'_interopRequireWildcard', u'require', u'_babelHelperRegex', u'module', u'_interopRequireDefault', u'_regexpuCore2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1180_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1180_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1179_ = Js({}) + var.put(u'newObj', PyJs_Object_1179_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1175_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_RegExpLiteral_1178_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'RegExpLiteral':PyJs_RegExpLiteral_1178_, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'node', u'_ref']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if var.get(u'regex').callprop(u'is', var.get(u'node'), Js(u'u')).neg(): + return var.get('undefined') + var.get(u'node').put(u'pattern', PyJsComma(Js(0.0),var.get(u'_regexpuCore2').get(u'default'))(var.get(u'node').get(u'pattern'), var.get(u'node').get(u'flags'))) + var.get(u'regex').callprop(u'pullFlag', var.get(u'node'), Js(u'u')) + PyJs_RegExpLiteral_1178_._set_name(u'RegExpLiteral') + PyJs_Object_1177_ = Js({u'RegExpLiteral':PyJs_RegExpLiteral_1178_}) + PyJs_Object_1176_ = Js({u'visitor':PyJs_Object_1177_}) + return PyJs_Object_1176_ + PyJs_anonymous_1175_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1175_) + var.put(u'_regexpuCore', var.get(u'require')(Js(u'regexpu-core'))) + var.put(u'_regexpuCore2', var.get(u'_interopRequireDefault')(var.get(u'_regexpuCore'))) + var.put(u'_babelHelperRegex', var.get(u'require')(Js(u'babel-helper-regex'))) + var.put(u'regex', var.get(u'_interopRequireWildcard')(var.get(u'_babelHelperRegex'))) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1174_._set_name(u'anonymous') +PyJs_Object_1181_ = Js({u'babel-helper-regex':Js(53.0),u'regexpu-core':Js(504.0)}) +@Js +def PyJs_anonymous_1182_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'meta', u'_assert', u'_interopRequireDefault', u'loc', u'_typeof2', u'_typeof3', u'_stringify2', u'getDeclError', u'leap', u'Emitter', u'isValidCompletion', u'exports', u'_babelTypes', u'_interopRequireWildcard', u'_assert2', u'catchParamVisitor', u'_util', u'util', u'_meta', u'require', u'hasOwn', u'_stringify', u't', u'_leap', u'Ep']) + @Js + def PyJsHoisted_loc_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'numericLiteral', (-Js(1.0))) + PyJsHoisted_loc_.func_name = u'loc' + var.put(u'loc', PyJsHoisted_loc_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1183_ = Js({}) + var.put(u'newObj', PyJs_Object_1183_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_isValidCompletion_(record, this, arguments, var=var): + var = Scope({u'this':this, u'record':record, u'arguments':arguments}, var) + var.registers([u'record', u'type']) + var.put(u'type', var.get(u'record').get(u'type')) + if PyJsStrictEq(var.get(u'type'),Js(u'normal')): + return var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'target')).neg() + if (PyJsStrictEq(var.get(u'type'),Js(u'break')) or PyJsStrictEq(var.get(u'type'),Js(u'continue'))): + return (var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'value')).neg() and var.get(u't').callprop(u'isLiteral', var.get(u'record').get(u'target'))) + if (PyJsStrictEq(var.get(u'type'),Js(u'return')) or PyJsStrictEq(var.get(u'type'),Js(u'throw'))): + return (var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'value')) and var.get(u'hasOwn').callprop(u'call', var.get(u'record'), Js(u'target')).neg()) + return Js(False) + PyJsHoisted_isValidCompletion_.func_name = u'isValidCompletion' + var.put(u'isValidCompletion', PyJsHoisted_isValidCompletion_) + @Js + def PyJsHoisted_getDeclError_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'Error').create(((Js(u'all declarations should have been transformed into ')+Js(u'assignments before the Exploder began its work: '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'node')))) + PyJsHoisted_getDeclError_.func_name = u'getDeclError' + var.put(u'getDeclError', PyJsHoisted_getDeclError_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1184_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1184_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Emitter_(contextId, this, arguments, var=var): + var = Scope({u'this':this, u'contextId':contextId, u'arguments':arguments}, var) + var.registers([u'contextId']) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u"this").instanceof(var.get(u'Emitter'))) + var.get(u't').callprop(u'assertIdentifier', var.get(u'contextId')) + var.get(u"this").put(u'nextTempId', Js(0.0)) + var.get(u"this").put(u'contextId', var.get(u'contextId')) + var.get(u"this").put(u'listing', Js([])) + var.get(u"this").put(u'marked', Js([var.get(u'true')])) + var.get(u"this").put(u'finalLoc', var.get(u'loc')()) + var.get(u"this").put(u'tryEntries', Js([])) + var.get(u"this").put(u'leapManager', var.get(u'leap').get(u'LeapManager').create(var.get(u"this"))) + PyJsHoisted_Emitter_.func_name = u'Emitter' + var.put(u'Emitter', PyJsHoisted_Emitter_) + Js(u'use strict') + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_assert', var.get(u'require')(Js(u'assert'))) + var.put(u'_assert2', var.get(u'_interopRequireDefault')(var.get(u'_assert'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_leap', var.get(u'require')(Js(u'./leap'))) + var.put(u'leap', var.get(u'_interopRequireWildcard')(var.get(u'_leap'))) + var.put(u'_meta', var.get(u'require')(Js(u'./meta'))) + var.put(u'meta', var.get(u'_interopRequireWildcard')(var.get(u'_meta'))) + var.put(u'_util', var.get(u'require')(Js(u'./util'))) + var.put(u'util', var.get(u'_interopRequireWildcard')(var.get(u'_util'))) + pass + pass + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + pass + var.put(u'Ep', var.get(u'Emitter').get(u'prototype')) + var.get(u'exports').put(u'Emitter', var.get(u'Emitter')) + pass + @Js + def PyJs_anonymous_1185_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments}, var) + var.registers([u'index', u'loc']) + var.get(u't').callprop(u'assertLiteral', var.get(u'loc')) + var.put(u'index', var.get(u"this").get(u'listing').get(u'length')) + if PyJsStrictEq(var.get(u'loc').get(u'value'),(-Js(1.0))): + var.get(u'loc').put(u'value', var.get(u'index')) + else: + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'loc').get(u'value'), var.get(u'index')) + var.get(u"this").get(u'marked').put(var.get(u'index'), var.get(u'true')) + return var.get(u'loc') + PyJs_anonymous_1185_._set_name(u'anonymous') + var.get(u'Ep').put(u'mark', PyJs_anonymous_1185_) + @Js + def PyJs_anonymous_1186_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u'node'))) + var.get(u't').callprop(u'assertStatement', var.get(u'node')) + var.get(u"this").get(u'listing').callprop(u'push', var.get(u'node')) + PyJs_anonymous_1186_._set_name(u'anonymous') + var.get(u'Ep').put(u'emit', PyJs_anonymous_1186_) + @Js + def PyJs_anonymous_1187_(lhs, rhs, this, arguments, var=var): + var = Scope({u'this':this, u'rhs':rhs, u'lhs':lhs, u'arguments':arguments}, var) + var.registers([u'rhs', u'lhs']) + var.get(u"this").callprop(u'emit', var.get(u"this").callprop(u'assign', var.get(u'lhs'), var.get(u'rhs'))) + return var.get(u'lhs') + PyJs_anonymous_1187_._set_name(u'anonymous') + var.get(u'Ep').put(u'emitAssign', PyJs_anonymous_1187_) + @Js + def PyJs_anonymous_1188_(lhs, rhs, this, arguments, var=var): + var = Scope({u'this':this, u'rhs':rhs, u'lhs':lhs, u'arguments':arguments}, var) + var.registers([u'rhs', u'lhs']) + return var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'lhs'), var.get(u'rhs'))) + PyJs_anonymous_1188_._set_name(u'anonymous') + var.get(u'Ep').put(u'assign', PyJs_anonymous_1188_) + @Js + def PyJs_anonymous_1189_(name, computed, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'name':name, u'computed':computed}, var) + var.registers([u'name', u'computed']) + return var.get(u't').callprop(u'memberExpression', var.get(u"this").get(u'contextId'), (var.get(u't').callprop(u'stringLiteral', var.get(u'name')) if var.get(u'computed') else var.get(u't').callprop(u'identifier', var.get(u'name'))), var.get(u'computed').neg().neg()) + PyJs_anonymous_1189_._set_name(u'anonymous') + var.get(u'Ep').put(u'contextProperty', PyJs_anonymous_1189_) + @Js + def PyJs_anonymous_1190_(rval, this, arguments, var=var): + var = Scope({u'this':this, u'rval':rval, u'arguments':arguments}, var) + var.registers([u'rval']) + if var.get(u'rval'): + var.get(u"this").callprop(u'setReturnValue', var.get(u'rval')) + var.get(u"this").callprop(u'jump', var.get(u"this").get(u'finalLoc')) + PyJs_anonymous_1190_._set_name(u'anonymous') + var.get(u'Ep').put(u'stop', PyJs_anonymous_1190_) + @Js + def PyJs_anonymous_1191_(valuePath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'valuePath':valuePath}, var) + var.registers([u'valuePath']) + var.get(u't').callprop(u'assertExpression', var.get(u'valuePath').get(u'value')) + var.get(u"this").callprop(u'emitAssign', var.get(u"this").callprop(u'contextProperty', Js(u'rval')), var.get(u"this").callprop(u'explodeExpression', var.get(u'valuePath'))) + PyJs_anonymous_1191_._set_name(u'anonymous') + var.get(u'Ep').put(u'setReturnValue', PyJs_anonymous_1191_) + @Js + def PyJs_anonymous_1192_(tryLoc, assignee, this, arguments, var=var): + var = Scope({u'this':this, u'assignee':assignee, u'tryLoc':tryLoc, u'arguments':arguments}, var) + var.registers([u'assignee', u'catchCall', u'tryLoc']) + var.get(u't').callprop(u'assertLiteral', var.get(u'tryLoc')) + var.put(u'catchCall', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'contextProperty', Js(u'catch'), var.get(u'true')), Js([var.get(u'tryLoc')]))) + if var.get(u'assignee'): + var.get(u"this").callprop(u'emitAssign', var.get(u'assignee'), var.get(u'catchCall')) + else: + var.get(u"this").callprop(u'emit', var.get(u'catchCall')) + PyJs_anonymous_1192_._set_name(u'anonymous') + var.get(u'Ep').put(u'clearPendingException', PyJs_anonymous_1192_) + @Js + def PyJs_anonymous_1193_(toLoc, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'toLoc':toLoc}, var) + var.registers([u'toLoc']) + var.get(u"this").callprop(u'emitAssign', var.get(u"this").callprop(u'contextProperty', Js(u'next')), var.get(u'toLoc')) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'breakStatement')) + PyJs_anonymous_1193_._set_name(u'anonymous') + var.get(u'Ep').put(u'jump', PyJs_anonymous_1193_) + @Js + def PyJs_anonymous_1194_(test, toLoc, this, arguments, var=var): + var = Scope({u'test':test, u'this':this, u'arguments':arguments, u'toLoc':toLoc}, var) + var.registers([u'test', u'toLoc']) + var.get(u't').callprop(u'assertExpression', var.get(u'test')) + var.get(u't').callprop(u'assertLiteral', var.get(u'toLoc')) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'ifStatement', var.get(u'test'), var.get(u't').callprop(u'blockStatement', Js([var.get(u"this").callprop(u'assign', var.get(u"this").callprop(u'contextProperty', Js(u'next')), var.get(u'toLoc')), var.get(u't').callprop(u'breakStatement')])))) + PyJs_anonymous_1194_._set_name(u'anonymous') + var.get(u'Ep').put(u'jumpIf', PyJs_anonymous_1194_) + @Js + def PyJs_anonymous_1195_(test, toLoc, this, arguments, var=var): + var = Scope({u'test':test, u'this':this, u'arguments':arguments, u'toLoc':toLoc}, var) + var.registers([u'test', u'negatedTest', u'toLoc']) + var.get(u't').callprop(u'assertExpression', var.get(u'test')) + var.get(u't').callprop(u'assertLiteral', var.get(u'toLoc')) + var.put(u'negatedTest', PyJsComma(Js(0.0), Js(None))) + if (var.get(u't').callprop(u'isUnaryExpression', var.get(u'test')) and PyJsStrictEq(var.get(u'test').get(u'operator'),Js(u'!'))): + var.put(u'negatedTest', var.get(u'test').get(u'argument')) + else: + var.put(u'negatedTest', var.get(u't').callprop(u'unaryExpression', Js(u'!'), var.get(u'test'))) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'ifStatement', var.get(u'negatedTest'), var.get(u't').callprop(u'blockStatement', Js([var.get(u"this").callprop(u'assign', var.get(u"this").callprop(u'contextProperty', Js(u'next')), var.get(u'toLoc')), var.get(u't').callprop(u'breakStatement')])))) + PyJs_anonymous_1195_._set_name(u'anonymous') + var.get(u'Ep').put(u'jumpIfNot', PyJs_anonymous_1195_) + @Js + def PyJs_anonymous_1196_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'contextProperty', (Js(u't')+(var.get(u"this").put(u'nextTempId',Js(var.get(u"this").get(u'nextTempId').to_number())+Js(1))-Js(1)))) + PyJs_anonymous_1196_._set_name(u'anonymous') + var.get(u'Ep').put(u'makeTempVar', PyJs_anonymous_1196_) + @Js + def PyJs_anonymous_1197_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'id']) + return var.get(u't').callprop(u'functionExpression', (var.get(u'id') or var.get(u"null")), Js([var.get(u"this").get(u'contextId')]), var.get(u't').callprop(u'blockStatement', Js([var.get(u"this").callprop(u'getDispatchLoop')])), Js(False), Js(False)) + PyJs_anonymous_1197_._set_name(u'anonymous') + var.get(u'Ep').put(u'getContextFunction', PyJs_anonymous_1197_) + @Js + def PyJs_anonymous_1198_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'current', u'self', u'alreadyEnded', u'cases']) + var.put(u'self', var.get(u"this")) + var.put(u'cases', Js([])) + var.put(u'current', PyJsComma(Js(0.0), Js(None))) + var.put(u'alreadyEnded', Js(False)) + @Js + def PyJs_anonymous_1199_(stmt, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'arguments':arguments, u'stmt':stmt}, var) + var.registers([u'i', u'stmt']) + if var.get(u'self').get(u'marked').callprop(u'hasOwnProperty', var.get(u'i')): + var.get(u'cases').callprop(u'push', var.get(u't').callprop(u'switchCase', var.get(u't').callprop(u'numericLiteral', var.get(u'i')), var.put(u'current', Js([])))) + var.put(u'alreadyEnded', Js(False)) + if var.get(u'alreadyEnded').neg(): + var.get(u'current').callprop(u'push', var.get(u'stmt')) + if var.get(u't').callprop(u'isCompletionStatement', var.get(u'stmt')): + var.put(u'alreadyEnded', var.get(u'true')) + PyJs_anonymous_1199_._set_name(u'anonymous') + var.get(u'self').get(u'listing').callprop(u'forEach', PyJs_anonymous_1199_) + var.get(u"this").get(u'finalLoc').put(u'value', var.get(u"this").get(u'listing').get(u'length')) + var.get(u'cases').callprop(u'push', var.get(u't').callprop(u'switchCase', var.get(u"this").get(u'finalLoc'), Js([])), var.get(u't').callprop(u'switchCase', var.get(u't').callprop(u'stringLiteral', Js(u'end')), Js([var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'contextProperty', Js(u'stop')), Js([])))]))) + return var.get(u't').callprop(u'whileStatement', var.get(u't').callprop(u'numericLiteral', Js(1.0)), var.get(u't').callprop(u'switchStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u"this").callprop(u'contextProperty', Js(u'prev')), var.get(u"this").callprop(u'contextProperty', Js(u'next'))), var.get(u'cases'))) + PyJs_anonymous_1198_._set_name(u'anonymous') + var.get(u'Ep').put(u'getDispatchLoop', PyJs_anonymous_1198_) + @Js + def PyJs_anonymous_1200_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'lastLocValue']) + if PyJsStrictEq(var.get(u"this").get(u'tryEntries').get(u'length'),Js(0.0)): + return var.get(u"null") + var.put(u'lastLocValue', Js(0.0)) + @Js + def PyJs_anonymous_1201_(tryEntry, this, arguments, var=var): + var = Scope({u'this':this, u'tryEntry':tryEntry, u'arguments':arguments}, var) + var.registers([u'locs', u'tryEntry', u'thisLocValue', u'ce', u'fe']) + var.put(u'thisLocValue', var.get(u'tryEntry').get(u'firstLoc').get(u'value')) + var.get(u'_assert2').get(u'default').callprop(u'ok', (var.get(u'thisLocValue')>=var.get(u'lastLocValue')), Js(u'try entries out of order')) + var.put(u'lastLocValue', var.get(u'thisLocValue')) + var.put(u'ce', var.get(u'tryEntry').get(u'catchEntry')) + var.put(u'fe', var.get(u'tryEntry').get(u'finallyEntry')) + var.put(u'locs', Js([var.get(u'tryEntry').get(u'firstLoc'), (var.get(u'ce').get(u'firstLoc') if var.get(u'ce') else var.get(u"null"))])) + if var.get(u'fe'): + var.get(u'locs').put(u'2', var.get(u'fe').get(u'firstLoc')) + var.get(u'locs').put(u'3', var.get(u'fe').get(u'afterLoc')) + return var.get(u't').callprop(u'arrayExpression', var.get(u'locs')) + PyJs_anonymous_1201_._set_name(u'anonymous') + return var.get(u't').callprop(u'arrayExpression', var.get(u"this").get(u'tryEntries').callprop(u'map', PyJs_anonymous_1201_)) + PyJs_anonymous_1200_._set_name(u'anonymous') + var.get(u'Ep').put(u'getTryLocsList', PyJs_anonymous_1200_) + @Js + def PyJs_anonymous_1202_(path, ignoreResult, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ignoreResult':ignoreResult, u'arguments':arguments}, var) + var.registers([u'node', u'path', u'self', u'ignoreResult']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'self', var.get(u"this")) + var.get(u't').callprop(u'assertNode', var.get(u'node')) + if var.get(u't').callprop(u'isDeclaration', var.get(u'node')): + PyJsTempException = JsToPyException(var.get(u'getDeclError')(var.get(u'node'))) + raise PyJsTempException + if var.get(u't').callprop(u'isStatement', var.get(u'node')): + return var.get(u'self').callprop(u'explodeStatement', var.get(u'path')) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + return var.get(u'self').callprop(u'explodeExpression', var.get(u'path'), var.get(u'ignoreResult')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Program')): + SWITCHED = True + return var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'map', var.get(u'self').get(u'explodeStatement'), var.get(u'self')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'VariableDeclarator')): + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'getDeclError')(var.get(u'node'))) + raise PyJsTempException + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Property')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SwitchCase')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CatchClause')): + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((var.get(u'node').get(u'type')+Js(u' nodes should be handled by their parents')))) + raise PyJsTempException + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'unknown Node of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'node').get(u'type'))))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_1202_._set_name(u'anonymous') + var.get(u'Ep').put(u'explode', PyJs_anonymous_1202_) + pass + @Js + def PyJs_anonymous_1203_(path, labelId, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'labelId':labelId}, var) + var.registers([u'head', u'labelId', u'_ret', u'self', u'after', u'stmt', u'path', u'before']) + var.put(u'stmt', var.get(u'path').get(u'node')) + var.put(u'self', var.get(u"this")) + var.put(u'before', PyJsComma(Js(0.0), Js(None))) + var.put(u'after', PyJsComma(Js(0.0), Js(None))) + var.put(u'head', PyJsComma(Js(0.0), Js(None))) + var.get(u't').callprop(u'assertStatement', var.get(u'stmt')) + if var.get(u'labelId'): + var.get(u't').callprop(u'assertIdentifier', var.get(u'labelId')) + else: + var.put(u'labelId', var.get(u"null")) + if var.get(u't').callprop(u'isBlockStatement', var.get(u'stmt')): + @Js + def PyJs_anonymous_1204_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path')) + PyJs_anonymous_1204_._set_name(u'anonymous') + var.get(u'path').callprop(u'get', Js(u'body')).callprop(u'forEach', PyJs_anonymous_1204_) + return var.get('undefined') + if var.get(u'meta').callprop(u'containsLeap', var.get(u'stmt')).neg(): + var.get(u'self').callprop(u'emit', var.get(u'stmt')) + return var.get('undefined') + @Js + def PyJs_anonymous_1205_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'catchLoc', u'catchEntry', u'c', u'tryEntry', u'keyInfoTmpVar', u'discriminant', u'i', u'keyIterNextFn', u'finallyLoc', u'update', u'defaultLoc', u'caseLocs', u'disc', u'test', u'cases', u'finallyEntry', u'elseLoc', u'handler', u'condition', u'first']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'stmt').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExpressionStatement')): + SWITCHED = True + var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'expression')), var.get(u'true')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + @Js + def PyJs_anonymous_1206_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body')), var.get(u'stmt').get(u'label')) + PyJs_anonymous_1206_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LabeledEntry').create(var.get(u'after'), var.get(u'stmt').get(u'label')), PyJs_anonymous_1206_) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + var.put(u'before', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.get(u'self').callprop(u'mark', var.get(u'before')) + var.get(u'self').callprop(u'jumpIfNot', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), var.get(u'after')) + @Js + def PyJs_anonymous_1207_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1207_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'before'), var.get(u'labelId')), PyJs_anonymous_1207_) + var.get(u'self').callprop(u'jump', var.get(u'before')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DoWhileStatement')): + SWITCHED = True + var.put(u'first', var.get(u'loc')()) + var.put(u'test', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.get(u'self').callprop(u'mark', var.get(u'first')) + @Js + def PyJs_anonymous_1208_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1208_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'test'), var.get(u'labelId')), PyJs_anonymous_1208_) + var.get(u'self').callprop(u'mark', var.get(u'test')) + var.get(u'self').callprop(u'jumpIf', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), var.get(u'first')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + var.put(u'head', var.get(u'loc')()) + var.put(u'update', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + if var.get(u'stmt').get(u'init'): + var.get(u'self').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'init')), var.get(u'true')) + var.get(u'self').callprop(u'mark', var.get(u'head')) + if var.get(u'stmt').get(u'test'): + var.get(u'self').callprop(u'jumpIfNot', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), var.get(u'after')) + else: + pass + @Js + def PyJs_anonymous_1209_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1209_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'update'), var.get(u'labelId')), PyJs_anonymous_1209_) + var.get(u'self').callprop(u'mark', var.get(u'update')) + if var.get(u'stmt').get(u'update'): + var.get(u'self').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'update')), var.get(u'true')) + var.get(u'self').callprop(u'jump', var.get(u'head')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TypeCastExpression')): + SWITCHED = True + PyJs_Object_1210_ = Js({u'v':var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'expression')))}) + return PyJs_Object_1210_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + var.put(u'head', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.put(u'keyIterNextFn', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'emitAssign', var.get(u'keyIterNextFn'), var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', Js(u'keys')), Js([var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'right')))]))) + var.get(u'self').callprop(u'mark', var.get(u'head')) + var.put(u'keyInfoTmpVar', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'jumpIf', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'keyInfoTmpVar'), var.get(u't').callprop(u'callExpression', var.get(u'keyIterNextFn'), Js([]))), var.get(u't').callprop(u'identifier', Js(u'done')), Js(False)), var.get(u'after')) + var.get(u'self').callprop(u'emitAssign', var.get(u'stmt').get(u'left'), var.get(u't').callprop(u'memberExpression', var.get(u'keyInfoTmpVar'), var.get(u't').callprop(u'identifier', Js(u'value')), Js(False))) + @Js + def PyJs_anonymous_1211_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'body'))) + PyJs_anonymous_1211_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'LoopEntry').create(var.get(u'after'), var.get(u'head'), var.get(u'labelId')), PyJs_anonymous_1211_) + var.get(u'self').callprop(u'jump', var.get(u'head')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BreakStatement')): + SWITCHED = True + PyJs_Object_1212_ = Js({u'type':Js(u'break'),u'target':var.get(u'self').get(u'leapManager').callprop(u'getBreakLoc', var.get(u'stmt').get(u'label'))}) + var.get(u'self').callprop(u'emitAbruptCompletion', PyJs_Object_1212_) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ContinueStatement')): + SWITCHED = True + PyJs_Object_1213_ = Js({u'type':Js(u'continue'),u'target':var.get(u'self').get(u'leapManager').callprop(u'getContinueLoc', var.get(u'stmt').get(u'label'))}) + var.get(u'self').callprop(u'emitAbruptCompletion', PyJs_Object_1213_) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SwitchStatement')): + SWITCHED = True + var.put(u'disc', var.get(u'self').callprop(u'emitAssign', var.get(u'self').callprop(u'makeTempVar'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'discriminant'))))) + var.put(u'after', var.get(u'loc')()) + var.put(u'defaultLoc', var.get(u'loc')()) + var.put(u'condition', var.get(u'defaultLoc')) + var.put(u'caseLocs', Js([])) + var.put(u'cases', (var.get(u'stmt').get(u'cases') or Js([]))) + #for JS loop + var.put(u'i', (var.get(u'cases').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'c', var.get(u'cases').get(var.get(u'i'))) + var.get(u't').callprop(u'assertSwitchCase', var.get(u'c')) + if var.get(u'c').get(u'test'): + var.put(u'condition', var.get(u't').callprop(u'conditionalExpression', var.get(u't').callprop(u'binaryExpression', Js(u'==='), var.get(u'disc'), var.get(u'c').get(u'test')), var.get(u'caseLocs').put(var.get(u'i'), var.get(u'loc')()), var.get(u'condition'))) + else: + var.get(u'caseLocs').put(var.get(u'i'), var.get(u'defaultLoc')) + finally: + var.put(u'i',Js(var.get(u'i').to_number())-Js(1)) + var.put(u'discriminant', var.get(u'path').callprop(u'get', Js(u'discriminant'))) + var.get(u'discriminant').callprop(u'replaceWith', var.get(u'condition')) + var.get(u'self').callprop(u'jump', var.get(u'self').callprop(u'explodeExpression', var.get(u'discriminant'))) + @Js + def PyJs_anonymous_1214_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_1215_(casePath, this, arguments, var=var): + var = Scope({u'this':this, u'casePath':casePath, u'arguments':arguments}, var) + var.registers([u'i', u'casePath']) + var.put(u'i', var.get(u'casePath').get(u'key')) + var.get(u'self').callprop(u'mark', var.get(u'caseLocs').get(var.get(u'i'))) + @Js + def PyJs_anonymous_1216_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path')) + PyJs_anonymous_1216_._set_name(u'anonymous') + var.get(u'casePath').callprop(u'get', Js(u'consequent')).callprop(u'forEach', PyJs_anonymous_1216_) + PyJs_anonymous_1215_._set_name(u'anonymous') + var.get(u'path').callprop(u'get', Js(u'cases')).callprop(u'forEach', PyJs_anonymous_1215_) + PyJs_anonymous_1214_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'leap').get(u'SwitchEntry').create(var.get(u'after')), PyJs_anonymous_1214_) + var.get(u'self').callprop(u'mark', var.get(u'after')) + if PyJsStrictEq(var.get(u'defaultLoc').get(u'value'),(-Js(1.0))): + var.get(u'self').callprop(u'mark', var.get(u'defaultLoc')) + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'after').get(u'value'), var.get(u'defaultLoc').get(u'value')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'IfStatement')): + SWITCHED = True + var.put(u'elseLoc', (var.get(u'stmt').get(u'alternate') and var.get(u'loc')())) + var.put(u'after', var.get(u'loc')()) + var.get(u'self').callprop(u'jumpIfNot', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test'))), (var.get(u'elseLoc') or var.get(u'after'))) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'consequent'))) + if var.get(u'elseLoc'): + var.get(u'self').callprop(u'jump', var.get(u'after')) + var.get(u'self').callprop(u'mark', var.get(u'elseLoc')) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'alternate'))) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ReturnStatement')): + SWITCHED = True + PyJs_Object_1217_ = Js({u'type':Js(u'return'),u'value':var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument')))}) + var.get(u'self').callprop(u'emitAbruptCompletion', PyJs_Object_1217_) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WithStatement')): + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'WithStatement not supported in generator functions.'))) + raise PyJsTempException + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TryStatement')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + var.put(u'handler', var.get(u'stmt').get(u'handler')) + var.put(u'catchLoc', (var.get(u'handler') and var.get(u'loc')())) + var.put(u'catchEntry', (var.get(u'catchLoc') and var.get(u'leap').get(u'CatchEntry').create(var.get(u'catchLoc'), var.get(u'handler').get(u'param')))) + var.put(u'finallyLoc', (var.get(u'stmt').get(u'finalizer') and var.get(u'loc')())) + var.put(u'finallyEntry', (var.get(u'finallyLoc') and var.get(u'leap').get(u'FinallyEntry').create(var.get(u'finallyLoc'), var.get(u'after')))) + var.put(u'tryEntry', var.get(u'leap').get(u'TryEntry').create(var.get(u'self').callprop(u'getUnmarkedCurrentLoc'), var.get(u'catchEntry'), var.get(u'finallyEntry'))) + var.get(u'self').get(u'tryEntries').callprop(u'push', var.get(u'tryEntry')) + var.get(u'self').callprop(u'updateContextPrevLoc', var.get(u'tryEntry').get(u'firstLoc')) + @Js + def PyJs_anonymous_1218_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'block'))) + if var.get(u'catchLoc'): + @Js + def PyJs_anonymous_1219_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'bodyPath', u'safeParam']) + if var.get(u'finallyLoc'): + var.get(u'self').callprop(u'jump', var.get(u'finallyLoc')) + else: + var.get(u'self').callprop(u'jump', var.get(u'after')) + var.get(u'self').callprop(u'updateContextPrevLoc', var.get(u'self').callprop(u'mark', var.get(u'catchLoc'))) + var.put(u'bodyPath', var.get(u'path').callprop(u'get', Js(u'handler.body'))) + var.put(u'safeParam', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'clearPendingException', var.get(u'tryEntry').get(u'firstLoc'), var.get(u'safeParam')) + PyJs_Object_1220_ = Js({u'safeParam':var.get(u'safeParam'),u'catchParamName':var.get(u'handler').get(u'param').get(u'name')}) + var.get(u'bodyPath').callprop(u'traverse', var.get(u'catchParamVisitor'), PyJs_Object_1220_) + @Js + def PyJs_anonymous_1221_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'bodyPath')) + PyJs_anonymous_1221_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'catchEntry'), PyJs_anonymous_1221_) + PyJs_anonymous_1219_._set_name(u'anonymous') + PyJs_anonymous_1219_() + if var.get(u'finallyLoc'): + var.get(u'self').callprop(u'updateContextPrevLoc', var.get(u'self').callprop(u'mark', var.get(u'finallyLoc'))) + @Js + def PyJs_anonymous_1222_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'self').callprop(u'explodeStatement', var.get(u'path').callprop(u'get', Js(u'finalizer'))) + PyJs_anonymous_1222_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'finallyEntry'), PyJs_anonymous_1222_) + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u'self').callprop(u'contextProperty', Js(u'finish')), Js([var.get(u'finallyEntry').get(u'firstLoc')])))) + PyJs_anonymous_1218_._set_name(u'anonymous') + var.get(u'self').get(u'leapManager').callprop(u'withEntry', var.get(u'tryEntry'), PyJs_anonymous_1218_) + var.get(u'self').callprop(u'mark', var.get(u'after')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ThrowStatement')): + SWITCHED = True + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'throwStatement', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))))) + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'unknown Statement of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'stmt').get(u'type'))))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_1205_._set_name(u'anonymous') + var.put(u'_ret', PyJs_anonymous_1205_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret'))),Js(u'object')): + return var.get(u'_ret').get(u'v') + PyJs_anonymous_1203_._set_name(u'anonymous') + var.get(u'Ep').put(u'explodeStatement', PyJs_anonymous_1203_) + @Js + def PyJs_Identifier_1224_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Identifier':PyJs_Identifier_1224_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if (PyJsStrictEq(var.get(u'path').get(u'node').get(u'name'),var.get(u'state').get(u'catchParamName')) and var.get(u'util').callprop(u'isReference', var.get(u'path'))): + var.get(u'path').callprop(u'replaceWith', var.get(u'state').get(u'safeParam')) + PyJs_Identifier_1224_._set_name(u'Identifier') + @Js + def PyJs_Scope_1225_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_1225_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'scope').callprop(u'hasOwnBinding', var.get(u'state').get(u'catchParamName')): + var.get(u'path').callprop(u'skip') + PyJs_Scope_1225_._set_name(u'Scope') + PyJs_Object_1223_ = Js({u'Identifier':PyJs_Identifier_1224_,u'Scope':PyJs_Scope_1225_}) + var.put(u'catchParamVisitor', PyJs_Object_1223_) + @Js + def PyJs_anonymous_1226_(record, this, arguments, var=var): + var = Scope({u'this':this, u'record':record, u'arguments':arguments}, var) + var.registers([u'record', u'abruptArgs']) + if var.get(u'isValidCompletion')(var.get(u'record')).neg(): + var.get(u'_assert2').get(u'default').callprop(u'ok', Js(False), (Js(u'invalid completion record: ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'record')))) + var.get(u'_assert2').get(u'default').callprop(u'notStrictEqual', var.get(u'record').get(u'type'), Js(u'normal'), Js(u'normal completions are not abrupt')) + var.put(u'abruptArgs', Js([var.get(u't').callprop(u'stringLiteral', var.get(u'record').get(u'type'))])) + if (PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'break')) or PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'continue'))): + var.get(u't').callprop(u'assertLiteral', var.get(u'record').get(u'target')) + var.get(u'abruptArgs').put(u'1', var.get(u'record').get(u'target')) + else: + if (PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'return')) or PyJsStrictEq(var.get(u'record').get(u'type'),Js(u'throw'))): + if var.get(u'record').get(u'value'): + var.get(u't').callprop(u'assertExpression', var.get(u'record').get(u'value')) + var.get(u'abruptArgs').put(u'1', var.get(u'record').get(u'value')) + var.get(u"this").callprop(u'emit', var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u"this").callprop(u'contextProperty', Js(u'abrupt')), var.get(u'abruptArgs')))) + PyJs_anonymous_1226_._set_name(u'anonymous') + var.get(u'Ep').put(u'emitAbruptCompletion', PyJs_anonymous_1226_) + pass + @Js + def PyJs_anonymous_1227_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'numericLiteral', var.get(u"this").get(u'listing').get(u'length')) + PyJs_anonymous_1227_._set_name(u'anonymous') + var.get(u'Ep').put(u'getUnmarkedCurrentLoc', PyJs_anonymous_1227_) + @Js + def PyJs_anonymous_1228_(loc, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'arguments':arguments}, var) + var.registers([u'loc']) + if var.get(u'loc'): + var.get(u't').callprop(u'assertLiteral', var.get(u'loc')) + if PyJsStrictEq(var.get(u'loc').get(u'value'),(-Js(1.0))): + var.get(u'loc').put(u'value', var.get(u"this").get(u'listing').get(u'length')) + else: + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'loc').get(u'value'), var.get(u"this").get(u'listing').get(u'length')) + else: + var.put(u'loc', var.get(u"this").callprop(u'getUnmarkedCurrentLoc')) + var.get(u"this").callprop(u'emitAssign', var.get(u"this").callprop(u'contextProperty', Js(u'prev')), var.get(u'loc')) + PyJs_anonymous_1228_._set_name(u'anonymous') + var.get(u'Ep').put(u'updateContextPrevLoc', PyJs_anonymous_1228_) + @Js + def PyJs_anonymous_1229_(path, ignoreResult, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ignoreResult':ignoreResult, u'arguments':arguments}, var) + var.registers([u'finish', u'ignoreResult', u'expr', u'self', u'after', u'_ret3', u'result', u'hasLeapingChildren', u'path', u'explodeViaTempVar']) + @Js + def PyJsHoisted_explodeViaTempVar_(tempVar, childPath, ignoreChildResult, this, arguments, var=var): + var = Scope({u'this':this, u'ignoreChildResult':ignoreChildResult, u'childPath':childPath, u'tempVar':tempVar, u'arguments':arguments}, var) + var.registers([u'childPath', u'ignoreChildResult', u'result', u'tempVar']) + var.get(u'_assert2').get(u'default').callprop(u'ok', (var.get(u'ignoreChildResult').neg() or var.get(u'tempVar').neg()), (Js(u'Ignoring the result of a child expression but forcing it to ')+Js(u'be assigned to a temporary variable?'))) + var.put(u'result', var.get(u'self').callprop(u'explodeExpression', var.get(u'childPath'), var.get(u'ignoreChildResult'))) + if var.get(u'ignoreChildResult'): + pass + else: + if (var.get(u'tempVar') or (var.get(u'hasLeapingChildren') and var.get(u't').callprop(u'isLiteral', var.get(u'result')).neg())): + var.put(u'result', var.get(u'self').callprop(u'emitAssign', (var.get(u'tempVar') or var.get(u'self').callprop(u'makeTempVar')), var.get(u'result'))) + return var.get(u'result') + PyJsHoisted_explodeViaTempVar_.func_name = u'explodeViaTempVar' + var.put(u'explodeViaTempVar', PyJsHoisted_explodeViaTempVar_) + @Js + def PyJsHoisted_finish_(expr, this, arguments, var=var): + var = Scope({u'this':this, u'expr':expr, u'arguments':arguments}, var) + var.registers([u'expr']) + var.get(u't').callprop(u'assertExpression', var.get(u'expr')) + if var.get(u'ignoreResult'): + var.get(u'self').callprop(u'emit', var.get(u'expr')) + else: + return var.get(u'expr') + PyJsHoisted_finish_.func_name = u'finish' + var.put(u'finish', PyJsHoisted_finish_) + var.put(u'expr', var.get(u'path').get(u'node')) + if var.get(u'expr'): + var.get(u't').callprop(u'assertExpression', var.get(u'expr')) + else: + return var.get(u'expr') + var.put(u'self', var.get(u"this")) + var.put(u'result', PyJsComma(Js(0.0), Js(None))) + var.put(u'after', PyJsComma(Js(0.0), Js(None))) + pass + if var.get(u'meta').callprop(u'containsLeap', var.get(u'expr')).neg(): + return var.get(u'finish')(var.get(u'expr')) + var.put(u'hasLeapingChildren', var.get(u'meta').get(u'containsLeap').callprop(u'onlyChildren', var.get(u'expr'))) + pass + @Js + def PyJs_anonymous_1230_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'argsPath', u'_result', u'hasLeapingArgs', u'calleePath', u'lastIndex', u'newProperty', u'newObject', u'arg', u'test', u'newCallee', u'newArgs', u'elseLoc', u'left']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'expr').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + PyJs_Object_1231_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'memberExpression', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'object'))), (var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'property'))) if var.get(u'expr').get(u'computed') else var.get(u'expr').get(u'property')), var.get(u'expr').get(u'computed')))}) + return PyJs_Object_1231_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CallExpression')): + SWITCHED = True + var.put(u'calleePath', var.get(u'path').callprop(u'get', Js(u'callee'))) + var.put(u'argsPath', var.get(u'path').callprop(u'get', Js(u'arguments'))) + var.put(u'newCallee', PyJsComma(Js(0.0), Js(None))) + var.put(u'newArgs', Js([])) + var.put(u'hasLeapingArgs', Js(False)) + @Js + def PyJs_anonymous_1232_(argPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argPath':argPath}, var) + var.registers([u'argPath']) + var.put(u'hasLeapingArgs', (var.get(u'hasLeapingArgs') or var.get(u'meta').callprop(u'containsLeap', var.get(u'argPath').get(u'node')))) + PyJs_anonymous_1232_._set_name(u'anonymous') + var.get(u'argsPath').callprop(u'forEach', PyJs_anonymous_1232_) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'calleePath').get(u'node')): + if var.get(u'hasLeapingArgs'): + var.put(u'newObject', var.get(u'explodeViaTempVar')(var.get(u'self').callprop(u'makeTempVar'), var.get(u'calleePath').callprop(u'get', Js(u'object')))) + var.put(u'newProperty', (var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'calleePath').callprop(u'get', Js(u'property'))) if var.get(u'calleePath').get(u'node').get(u'computed') else var.get(u'calleePath').get(u'node').get(u'property'))) + var.get(u'newArgs').callprop(u'unshift', var.get(u'newObject')) + var.put(u'newCallee', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u'newObject'), var.get(u'newProperty'), var.get(u'calleePath').get(u'node').get(u'computed')), var.get(u't').callprop(u'identifier', Js(u'call')), Js(False))) + else: + var.put(u'newCallee', var.get(u'self').callprop(u'explodeExpression', var.get(u'calleePath'))) + else: + var.put(u'newCallee', var.get(u'self').callprop(u'explodeExpression', var.get(u'calleePath'))) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'newCallee')): + var.put(u'newCallee', var.get(u't').callprop(u'sequenceExpression', Js([var.get(u't').callprop(u'numericLiteral', Js(0.0)), var.get(u'newCallee')]))) + @Js + def PyJs_anonymous_1233_(argPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argPath':argPath}, var) + var.registers([u'argPath']) + var.get(u'newArgs').callprop(u'push', var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'argPath'))) + PyJs_anonymous_1233_._set_name(u'anonymous') + var.get(u'argsPath').callprop(u'forEach', PyJs_anonymous_1233_) + PyJs_Object_1234_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'callExpression', var.get(u'newCallee'), var.get(u'newArgs')))}) + return PyJs_Object_1234_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'NewExpression')): + SWITCHED = True + @Js + def PyJs_anonymous_1236_(argPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'argPath':argPath}, var) + var.registers([u'argPath']) + return var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'argPath')) + PyJs_anonymous_1236_._set_name(u'anonymous') + PyJs_Object_1235_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'newExpression', var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'callee'))), var.get(u'path').callprop(u'get', Js(u'arguments')).callprop(u'map', PyJs_anonymous_1236_)))}) + return PyJs_Object_1235_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectExpression')): + SWITCHED = True + @Js + def PyJs_anonymous_1238_(propPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'propPath':propPath}, var) + var.registers([u'propPath']) + if var.get(u'propPath').callprop(u'isObjectProperty'): + return var.get(u't').callprop(u'objectProperty', var.get(u'propPath').get(u'node').get(u'key'), var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'propPath').callprop(u'get', Js(u'value'))), var.get(u'propPath').get(u'node').get(u'computed')) + else: + return var.get(u'propPath').get(u'node') + PyJs_anonymous_1238_._set_name(u'anonymous') + PyJs_Object_1237_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'objectExpression', var.get(u'path').callprop(u'get', Js(u'properties')).callprop(u'map', PyJs_anonymous_1238_)))}) + return PyJs_Object_1237_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayExpression')): + SWITCHED = True + @Js + def PyJs_anonymous_1240_(elemPath, this, arguments, var=var): + var = Scope({u'this':this, u'elemPath':elemPath, u'arguments':arguments}, var) + var.registers([u'elemPath']) + return var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'elemPath')) + PyJs_anonymous_1240_._set_name(u'anonymous') + PyJs_Object_1239_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'arrayExpression', var.get(u'path').callprop(u'get', Js(u'elements')).callprop(u'map', PyJs_anonymous_1240_)))}) + return PyJs_Object_1239_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SequenceExpression')): + SWITCHED = True + var.put(u'lastIndex', (var.get(u'expr').get(u'expressions').get(u'length')-Js(1.0))) + @Js + def PyJs_anonymous_1241_(exprPath, this, arguments, var=var): + var = Scope({u'exprPath':exprPath, u'this':this, u'arguments':arguments}, var) + var.registers([u'exprPath']) + if PyJsStrictEq(var.get(u'exprPath').get(u'key'),var.get(u'lastIndex')): + var.put(u'result', var.get(u'self').callprop(u'explodeExpression', var.get(u'exprPath'), var.get(u'ignoreResult'))) + else: + var.get(u'self').callprop(u'explodeExpression', var.get(u'exprPath'), var.get(u'true')) + PyJs_anonymous_1241_._set_name(u'anonymous') + var.get(u'path').callprop(u'get', Js(u'expressions')).callprop(u'forEach', PyJs_anonymous_1241_) + PyJs_Object_1242_ = Js({u'v':var.get(u'result')}) + return PyJs_Object_1242_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LogicalExpression')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + if var.get(u'ignoreResult').neg(): + var.put(u'result', var.get(u'self').callprop(u'makeTempVar')) + var.put(u'left', var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'left')))) + if PyJsStrictEq(var.get(u'expr').get(u'operator'),Js(u'&&')): + var.get(u'self').callprop(u'jumpIfNot', var.get(u'left'), var.get(u'after')) + else: + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'expr').get(u'operator'), Js(u'||')) + var.get(u'self').callprop(u'jumpIf', var.get(u'left'), var.get(u'after')) + var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'right')), var.get(u'ignoreResult')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1243_ = Js({u'v':var.get(u'result')}) + return PyJs_Object_1243_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ConditionalExpression')): + SWITCHED = True + var.put(u'elseLoc', var.get(u'loc')()) + var.put(u'after', var.get(u'loc')()) + var.put(u'test', var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'test')))) + var.get(u'self').callprop(u'jumpIfNot', var.get(u'test'), var.get(u'elseLoc')) + if var.get(u'ignoreResult').neg(): + var.put(u'result', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'consequent')), var.get(u'ignoreResult')) + var.get(u'self').callprop(u'jump', var.get(u'after')) + var.get(u'self').callprop(u'mark', var.get(u'elseLoc')) + var.get(u'explodeViaTempVar')(var.get(u'result'), var.get(u'path').callprop(u'get', Js(u'alternate')), var.get(u'ignoreResult')) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1244_ = Js({u'v':var.get(u'result')}) + return PyJs_Object_1244_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UnaryExpression')): + SWITCHED = True + PyJs_Object_1245_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'unaryExpression', var.get(u'expr').get(u'operator'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))), var.get(u'expr').get(u'prefix').neg().neg()))}) + return PyJs_Object_1245_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BinaryExpression')): + SWITCHED = True + PyJs_Object_1246_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'binaryExpression', var.get(u'expr').get(u'operator'), var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'left'))), var.get(u'explodeViaTempVar')(var.get(u"null"), var.get(u'path').callprop(u'get', Js(u'right')))))}) + return PyJs_Object_1246_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + PyJs_Object_1247_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'assignmentExpression', var.get(u'expr').get(u'operator'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'left'))), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'right')))))}) + return PyJs_Object_1247_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UpdateExpression')): + SWITCHED = True + PyJs_Object_1248_ = Js({u'v':var.get(u'finish')(var.get(u't').callprop(u'updateExpression', var.get(u'expr').get(u'operator'), var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))), var.get(u'expr').get(u'prefix')))}) + return PyJs_Object_1248_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'YieldExpression')): + SWITCHED = True + var.put(u'after', var.get(u'loc')()) + var.put(u'arg', (var.get(u'expr').get(u'argument') and var.get(u'self').callprop(u'explodeExpression', var.get(u'path').callprop(u'get', Js(u'argument'))))) + if (var.get(u'arg') and var.get(u'expr').get(u'delegate')): + var.put(u'_result', var.get(u'self').callprop(u'makeTempVar')) + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'returnStatement', var.get(u't').callprop(u'callExpression', var.get(u'self').callprop(u'contextProperty', Js(u'delegateYield')), Js([var.get(u'arg'), var.get(u't').callprop(u'stringLiteral', var.get(u'_result').get(u'property').get(u'name')), var.get(u'after')])))) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1249_ = Js({u'v':var.get(u'_result')}) + return PyJs_Object_1249_ + var.get(u'self').callprop(u'emitAssign', var.get(u'self').callprop(u'contextProperty', Js(u'next')), var.get(u'after')) + var.get(u'self').callprop(u'emit', var.get(u't').callprop(u'returnStatement', (var.get(u'arg') or var.get(u"null")))) + var.get(u'self').callprop(u'mark', var.get(u'after')) + PyJs_Object_1250_ = Js({u'v':var.get(u'self').callprop(u'contextProperty', Js(u'sent'))}) + return PyJs_Object_1250_ + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'unknown Expression of type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'expr').get(u'type'))))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_1230_._set_name(u'anonymous') + var.put(u'_ret3', PyJs_anonymous_1230_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret3',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret3'))),Js(u'object')): + return var.get(u'_ret3').get(u'v') + PyJs_anonymous_1229_._set_name(u'anonymous') + var.get(u'Ep').put(u'explodeExpression', PyJs_anonymous_1229_) +PyJs_anonymous_1182_._set_name(u'anonymous') +PyJs_Object_1251_ = Js({u'./leap':Js(90.0),u'./meta':Js(91.0),u'./util':Js(92.0),u'assert':Js(524.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1252_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'hasOwn', u'_keys2', u'_keys', u't', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1254_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1254_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1253_ = Js({}) + var.put(u'newObj', PyJs_Object_1253_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_1255_(funPath, this, arguments, var=var): + var = Scope({u'this':this, u'funPath':funPath, u'arguments':arguments}, var) + var.registers([u'varDeclToExpr', u'funPath', u'paramNames', u'declarations', u'vars']) + @Js + def PyJsHoisted_varDeclToExpr_(vdec, includeIdentifiers, this, arguments, var=var): + var = Scope({u'this':this, u'vdec':vdec, u'arguments':arguments, u'includeIdentifiers':includeIdentifiers}, var) + var.registers([u'exprs', u'vdec', u'includeIdentifiers']) + var.get(u't').callprop(u'assertVariableDeclaration', var.get(u'vdec')) + var.put(u'exprs', Js([])) + @Js + def PyJs_anonymous_1257_(dec, this, arguments, var=var): + var = Scope({u'this':this, u'dec':dec, u'arguments':arguments}, var) + var.registers([u'dec']) + var.get(u'vars').put(var.get(u'dec').get(u'id').get(u'name'), var.get(u't').callprop(u'identifier', var.get(u'dec').get(u'id').get(u'name'))) + if var.get(u'dec').get(u'init'): + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'dec').get(u'id'), var.get(u'dec').get(u'init'))) + else: + if var.get(u'includeIdentifiers'): + var.get(u'exprs').callprop(u'push', var.get(u'dec').get(u'id')) + PyJs_anonymous_1257_._set_name(u'anonymous') + var.get(u'vdec').get(u'declarations').callprop(u'forEach', PyJs_anonymous_1257_) + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(0.0)): + return var.get(u"null") + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(1.0)): + return var.get(u'exprs').get(u'0') + return var.get(u't').callprop(u'sequenceExpression', var.get(u'exprs')) + PyJsHoisted_varDeclToExpr_.func_name = u'varDeclToExpr' + var.put(u'varDeclToExpr', PyJsHoisted_varDeclToExpr_) + var.get(u't').callprop(u'assertFunction', var.get(u'funPath').get(u'node')) + PyJs_Object_1256_ = Js({}) + var.put(u'vars', PyJs_Object_1256_) + pass + @Js + def PyJs_exit_1260_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_1260_, u'arguments':arguments}, var) + var.registers([u'expr', u'path']) + var.put(u'expr', var.get(u'varDeclToExpr')(var.get(u'path').get(u'node'), Js(False))) + if PyJsStrictEq(var.get(u'expr'),var.get(u"null")): + var.get(u'path').callprop(u'remove') + else: + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'expressionStatement', var.get(u'expr'))) + var.get(u'path').callprop(u'skip') + PyJs_exit_1260_._set_name(u'exit') + PyJs_Object_1259_ = Js({u'exit':PyJs_exit_1260_}) + @Js + def PyJs_ForStatement_1261_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ForStatement':PyJs_ForStatement_1261_}, var) + var.registers([u'path', u'init']) + var.put(u'init', var.get(u'path').get(u'node').get(u'init')) + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'init')): + var.get(u'path').callprop(u'get', Js(u'init')).callprop(u'replaceWith', var.get(u'varDeclToExpr')(var.get(u'init'), Js(False))) + PyJs_ForStatement_1261_._set_name(u'ForStatement') + @Js + def PyJs_ForXStatement_1262_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'ForXStatement':PyJs_ForXStatement_1262_}, var) + var.registers([u'path', u'left']) + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left'))) + if var.get(u'left').callprop(u'isVariableDeclaration'): + var.get(u'left').callprop(u'replaceWith', var.get(u'varDeclToExpr')(var.get(u'left').get(u'node'), var.get(u'true'))) + PyJs_ForXStatement_1262_._set_name(u'ForXStatement') + @Js + def PyJs_FunctionDeclaration_1263_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'FunctionDeclaration':PyJs_FunctionDeclaration_1263_}, var) + var.registers([u'node', u'assignment', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + var.get(u'vars').put(var.get(u'node').get(u'id').get(u'name'), var.get(u'node').get(u'id')) + var.put(u'assignment', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'node').get(u'id'), var.get(u't').callprop(u'functionExpression', var.get(u'node').get(u'id'), var.get(u'node').get(u'params'), var.get(u'node').get(u'body'), var.get(u'node').get(u'generator'), var.get(u'node').get(u'expression'))))) + if var.get(u'path').get(u'parentPath').callprop(u'isBlockStatement'): + var.get(u'path').get(u'parentPath').callprop(u'unshiftContainer', Js(u'body'), var.get(u'assignment')) + var.get(u'path').callprop(u'remove') + else: + var.get(u'path').callprop(u'replaceWith', var.get(u'assignment')) + var.get(u'path').callprop(u'skip') + PyJs_FunctionDeclaration_1263_._set_name(u'FunctionDeclaration') + @Js + def PyJs_FunctionExpression_1264_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'FunctionExpression':PyJs_FunctionExpression_1264_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_FunctionExpression_1264_._set_name(u'FunctionExpression') + PyJs_Object_1258_ = Js({u'VariableDeclaration':PyJs_Object_1259_,u'ForStatement':PyJs_ForStatement_1261_,u'ForXStatement':PyJs_ForXStatement_1262_,u'FunctionDeclaration':PyJs_FunctionDeclaration_1263_,u'FunctionExpression':PyJs_FunctionExpression_1264_}) + var.get(u'funPath').callprop(u'get', Js(u'body')).callprop(u'traverse', PyJs_Object_1258_) + PyJs_Object_1265_ = Js({}) + var.put(u'paramNames', PyJs_Object_1265_) + @Js + def PyJs_anonymous_1266_(paramPath, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'paramPath':paramPath}, var) + var.registers([u'param', u'paramPath']) + var.put(u'param', var.get(u'paramPath').get(u'node')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'param')): + var.get(u'paramNames').put(var.get(u'param').get(u'name'), var.get(u'param')) + else: + pass + PyJs_anonymous_1266_._set_name(u'anonymous') + var.get(u'funPath').callprop(u'get', Js(u'params')).callprop(u'forEach', PyJs_anonymous_1266_) + var.put(u'declarations', Js([])) + @Js + def PyJs_anonymous_1267_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + if var.get(u'hasOwn').callprop(u'call', var.get(u'paramNames'), var.get(u'name')).neg(): + var.get(u'declarations').callprop(u'push', var.get(u't').callprop(u'variableDeclarator', var.get(u'vars').get(var.get(u'name')), var.get(u"null"))) + PyJs_anonymous_1267_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'vars')).callprop(u'forEach', PyJs_anonymous_1267_) + if PyJsStrictEq(var.get(u'declarations').get(u'length'),Js(0.0)): + return var.get(u"null") + return var.get(u't').callprop(u'variableDeclaration', Js(u'var'), var.get(u'declarations')) + PyJs_anonymous_1255_._set_name(u'anonymous') + var.get(u'exports').put(u'hoist', PyJs_anonymous_1255_) +PyJs_anonymous_1252_._set_name(u'anonymous') +PyJs_Object_1268_ = Js({u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1269_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1270_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'require')(Js(u'./visit')) + PyJs_anonymous_1270_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1270_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1269_._set_name(u'anonymous') +PyJs_Object_1271_ = Js({u'./visit':Js(93.0)}) +@Js +def PyJs_anonymous_1272_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'CatchEntry', u'LabeledEntry', u'SwitchEntry', u'module', u'TryEntry', u'_interopRequireWildcard', u'LMp', u'_assert2', u'require', u'_babelTypes', u'exports', u'_util', u'LeapManager', u't', u'_assert', u'FunctionEntry', u'_interopRequireDefault', u'Entry', u'LoopEntry', u'FinallyEntry']) + @Js + def PyJsHoisted_CatchEntry_(firstLoc, paramId, this, arguments, var=var): + var = Scope({u'firstLoc':firstLoc, u'this':this, u'paramId':paramId, u'arguments':arguments}, var) + var.registers([u'firstLoc', u'paramId']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'firstLoc')) + var.get(u't').callprop(u'assertIdentifier', var.get(u'paramId')) + var.get(u"this").put(u'firstLoc', var.get(u'firstLoc')) + var.get(u"this").put(u'paramId', var.get(u'paramId')) + PyJsHoisted_CatchEntry_.func_name = u'CatchEntry' + var.put(u'CatchEntry', PyJsHoisted_CatchEntry_) + @Js + def PyJsHoisted_LabeledEntry_(breakLoc, label, this, arguments, var=var): + var = Scope({u'this':this, u'breakLoc':breakLoc, u'arguments':arguments, u'label':label}, var) + var.registers([u'breakLoc', u'label']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'breakLoc')) + var.get(u't').callprop(u'assertIdentifier', var.get(u'label')) + var.get(u"this").put(u'breakLoc', var.get(u'breakLoc')) + var.get(u"this").put(u'label', var.get(u'label')) + PyJsHoisted_LabeledEntry_.func_name = u'LabeledEntry' + var.put(u'LabeledEntry', PyJsHoisted_LabeledEntry_) + @Js + def PyJsHoisted_SwitchEntry_(breakLoc, this, arguments, var=var): + var = Scope({u'this':this, u'breakLoc':breakLoc, u'arguments':arguments}, var) + var.registers([u'breakLoc']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'breakLoc')) + var.get(u"this").put(u'breakLoc', var.get(u'breakLoc')) + PyJsHoisted_SwitchEntry_.func_name = u'SwitchEntry' + var.put(u'SwitchEntry', PyJsHoisted_SwitchEntry_) + @Js + def PyJsHoisted_TryEntry_(firstLoc, catchEntry, finallyEntry, this, arguments, var=var): + var = Scope({u'firstLoc':firstLoc, u'catchEntry':catchEntry, u'this':this, u'arguments':arguments, u'finallyEntry':finallyEntry}, var) + var.registers([u'firstLoc', u'catchEntry', u'finallyEntry']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'firstLoc')) + if var.get(u'catchEntry'): + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'catchEntry').instanceof(var.get(u'CatchEntry'))) + else: + var.put(u'catchEntry', var.get(u"null")) + if var.get(u'finallyEntry'): + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'finallyEntry').instanceof(var.get(u'FinallyEntry'))) + else: + var.put(u'finallyEntry', var.get(u"null")) + var.get(u'_assert2').get(u'default').callprop(u'ok', (var.get(u'catchEntry') or var.get(u'finallyEntry'))) + var.get(u"this").put(u'firstLoc', var.get(u'firstLoc')) + var.get(u"this").put(u'catchEntry', var.get(u'catchEntry')) + var.get(u"this").put(u'finallyEntry', var.get(u'finallyEntry')) + PyJsHoisted_TryEntry_.func_name = u'TryEntry' + var.put(u'TryEntry', PyJsHoisted_TryEntry_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1273_ = Js({}) + var.put(u'newObj', PyJs_Object_1273_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_LeapManager_(emitter, this, arguments, var=var): + var = Scope({u'this':this, u'emitter':emitter, u'arguments':arguments}, var) + var.registers([u'Emitter', u'emitter']) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u"this").instanceof(var.get(u'LeapManager'))) + var.put(u'Emitter', var.get(u'require')(Js(u'./emit')).get(u'Emitter')) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'emitter').instanceof(var.get(u'Emitter'))) + var.get(u"this").put(u'emitter', var.get(u'emitter')) + var.get(u"this").put(u'entryStack', Js([var.get(u'FunctionEntry').create(var.get(u'emitter').get(u'finalLoc'))])) + PyJsHoisted_LeapManager_.func_name = u'LeapManager' + var.put(u'LeapManager', PyJsHoisted_LeapManager_) + @Js + def PyJsHoisted_FunctionEntry_(returnLoc, this, arguments, var=var): + var = Scope({u'this':this, u'returnLoc':returnLoc, u'arguments':arguments}, var) + var.registers([u'returnLoc']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'returnLoc')) + var.get(u"this").put(u'returnLoc', var.get(u'returnLoc')) + PyJsHoisted_FunctionEntry_.func_name = u'FunctionEntry' + var.put(u'FunctionEntry', PyJsHoisted_FunctionEntry_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1274_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1274_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_Entry_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u"this").instanceof(var.get(u'Entry'))) + PyJsHoisted_Entry_.func_name = u'Entry' + var.put(u'Entry', PyJsHoisted_Entry_) + @Js + def PyJsHoisted_LoopEntry_(breakLoc, continueLoc, label, this, arguments, var=var): + var = Scope({u'continueLoc':continueLoc, u'breakLoc':breakLoc, u'this':this, u'arguments':arguments, u'label':label}, var) + var.registers([u'continueLoc', u'breakLoc', u'label']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'breakLoc')) + var.get(u't').callprop(u'assertLiteral', var.get(u'continueLoc')) + if var.get(u'label'): + var.get(u't').callprop(u'assertIdentifier', var.get(u'label')) + else: + var.put(u'label', var.get(u"null")) + var.get(u"this").put(u'breakLoc', var.get(u'breakLoc')) + var.get(u"this").put(u'continueLoc', var.get(u'continueLoc')) + var.get(u"this").put(u'label', var.get(u'label')) + PyJsHoisted_LoopEntry_.func_name = u'LoopEntry' + var.put(u'LoopEntry', PyJsHoisted_LoopEntry_) + @Js + def PyJsHoisted_FinallyEntry_(firstLoc, afterLoc, this, arguments, var=var): + var = Scope({u'firstLoc':firstLoc, u'this':this, u'afterLoc':afterLoc, u'arguments':arguments}, var) + var.registers([u'firstLoc', u'afterLoc']) + var.get(u'Entry').callprop(u'call', var.get(u"this")) + var.get(u't').callprop(u'assertLiteral', var.get(u'firstLoc')) + var.get(u't').callprop(u'assertLiteral', var.get(u'afterLoc')) + var.get(u"this").put(u'firstLoc', var.get(u'firstLoc')) + var.get(u"this").put(u'afterLoc', var.get(u'afterLoc')) + PyJsHoisted_FinallyEntry_.func_name = u'FinallyEntry' + var.put(u'FinallyEntry', PyJsHoisted_FinallyEntry_) + Js(u'use strict') + var.put(u'_assert', var.get(u'require')(Js(u'assert'))) + var.put(u'_assert2', var.get(u'_interopRequireDefault')(var.get(u'_assert'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_util', var.get(u'require')(Js(u'util'))) + pass + pass + pass + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'FunctionEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'FunctionEntry', var.get(u'FunctionEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'LoopEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'LoopEntry', var.get(u'LoopEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'SwitchEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'SwitchEntry', var.get(u'SwitchEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'TryEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'TryEntry', var.get(u'TryEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'CatchEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'CatchEntry', var.get(u'CatchEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'FinallyEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'FinallyEntry', var.get(u'FinallyEntry')) + pass + PyJsComma(Js(0.0),var.get(u'_util').get(u'inherits'))(var.get(u'LabeledEntry'), var.get(u'Entry')) + var.get(u'exports').put(u'LabeledEntry', var.get(u'LabeledEntry')) + pass + var.put(u'LMp', var.get(u'LeapManager').get(u'prototype')) + var.get(u'exports').put(u'LeapManager', var.get(u'LeapManager')) + @Js + def PyJs_anonymous_1275_(entry, callback, this, arguments, var=var): + var = Scope({u'this':this, u'entry':entry, u'arguments':arguments, u'callback':callback}, var) + var.registers([u'entry', u'popped', u'callback']) + var.get(u'_assert2').get(u'default').callprop(u'ok', var.get(u'entry').instanceof(var.get(u'Entry'))) + var.get(u"this").get(u'entryStack').callprop(u'push', var.get(u'entry')) + try: + var.get(u'callback').callprop(u'call', var.get(u"this").get(u'emitter')) + finally: + var.put(u'popped', var.get(u"this").get(u'entryStack').callprop(u'pop')) + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'popped'), var.get(u'entry')) + PyJs_anonymous_1275_._set_name(u'anonymous') + var.get(u'LMp').put(u'withEntry', PyJs_anonymous_1275_) + @Js + def PyJs_anonymous_1276_(property, label, this, arguments, var=var): + var = Scope({u'this':this, u'property':property, u'arguments':arguments, u'label':label}, var) + var.registers([u'i', u'entry', u'property', u'label', u'loc']) + #for JS loop + var.put(u'i', (var.get(u"this").get(u'entryStack').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'entry', var.get(u"this").get(u'entryStack').get(var.get(u'i'))) + var.put(u'loc', var.get(u'entry').get(var.get(u'property'))) + if var.get(u'loc'): + if var.get(u'label'): + if (var.get(u'entry').get(u'label') and PyJsStrictEq(var.get(u'entry').get(u'label').get(u'name'),var.get(u'label').get(u'name'))): + return var.get(u'loc') + else: + if var.get(u'entry').instanceof(var.get(u'LabeledEntry')): + pass + else: + return var.get(u'loc') + finally: + var.put(u'i',Js(var.get(u'i').to_number())-Js(1)) + return var.get(u"null") + PyJs_anonymous_1276_._set_name(u'anonymous') + var.get(u'LMp').put(u'_findLeapLocation', PyJs_anonymous_1276_) + @Js + def PyJs_anonymous_1277_(label, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'label':label}, var) + var.registers([u'label']) + return var.get(u"this").callprop(u'_findLeapLocation', Js(u'breakLoc'), var.get(u'label')) + PyJs_anonymous_1277_._set_name(u'anonymous') + var.get(u'LMp').put(u'getBreakLoc', PyJs_anonymous_1277_) + @Js + def PyJs_anonymous_1278_(label, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'label':label}, var) + var.registers([u'label']) + return var.get(u"this").callprop(u'_findLeapLocation', Js(u'continueLoc'), var.get(u'label')) + PyJs_anonymous_1278_._set_name(u'anonymous') + var.get(u'LMp').put(u'getContinueLoc', PyJs_anonymous_1278_) +PyJs_anonymous_1272_._set_name(u'anonymous') +PyJs_Object_1279_ = Js({u'./emit':Js(87.0),u'assert':Js(524.0),u'babel-types':Js(258.0),u'util':Js(534.0)}) +@Js +def PyJs_anonymous_1280_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'sideEffectTypes', u'opaqueTypes', u'_interopRequireWildcard', u'leapTypes', u'_assert2', u'require', u'_babelTypes', u'm', u'exports', u'hasOwn', u'makePredicate', u't', u'_assert', u'_interopRequireDefault', u'type']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1282_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1282_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_makePredicate_(propertyName, knownTypes, this, arguments, var=var): + var = Scope({u'this':this, u'propertyName':propertyName, u'arguments':arguments, u'knownTypes':knownTypes}, var) + var.registers([u'predicate', u'onlyChildren', u'propertyName', u'knownTypes']) + @Js + def PyJsHoisted_predicate_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'meta']) + var.get(u't').callprop(u'assertNode', var.get(u'node')) + var.put(u'meta', var.get(u'm')(var.get(u'node'))) + if var.get(u'hasOwn').callprop(u'call', var.get(u'meta'), var.get(u'propertyName')): + return var.get(u'meta').get(var.get(u'propertyName')) + if var.get(u'hasOwn').callprop(u'call', var.get(u'opaqueTypes'), var.get(u'node').get(u'type')): + return var.get(u'meta').put(var.get(u'propertyName'), Js(False)) + if var.get(u'hasOwn').callprop(u'call', var.get(u'knownTypes'), var.get(u'node').get(u'type')): + return var.get(u'meta').put(var.get(u'propertyName'), var.get(u'true')) + return var.get(u'meta').put(var.get(u'propertyName'), var.get(u'onlyChildren')(var.get(u'node'))) + PyJsHoisted_predicate_.func_name = u'predicate' + var.put(u'predicate', PyJsHoisted_predicate_) + @Js + def PyJsHoisted_onlyChildren_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'keys', u'i', u'result', u'key', u'child', u'check']) + @Js + def PyJsHoisted_check_(child, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'child':child}, var) + var.registers([u'child']) + if var.get(u'result'): + pass + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'child')): + var.get(u'child').callprop(u'some', var.get(u'check')) + else: + if var.get(u't').callprop(u'isNode', var.get(u'child')): + var.get(u'_assert2').get(u'default').callprop(u'strictEqual', var.get(u'result'), Js(False)) + var.put(u'result', var.get(u'predicate')(var.get(u'child'))) + return var.get(u'result') + PyJsHoisted_check_.func_name = u'check' + var.put(u'check', PyJsHoisted_check_) + var.get(u't').callprop(u'assertNode', var.get(u'node')) + var.put(u'result', Js(False)) + pass + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if var.get(u'keys'): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)): + var.get(u'bodyBlockPath').get(u'node').put(u'body', var.get(u'innerBody')) + var.put(u'outerFnExpr', var.get(u'getOuterFnExpr')(var.get(u'path'))) + var.get(u't').callprop(u'assertIdentifier', var.get(u'node').get(u'id')) + var.put(u'innerFnId', var.get(u't').callprop(u'identifier', (var.get(u'node').get(u'id').get(u'name')+Js(u'$')))) + var.put(u'vars', PyJsComma(Js(0.0),var.get(u'_hoist').get(u'hoist'))(var.get(u'path'))) + var.put(u'didRenameArguments', var.get(u'renameArguments')(var.get(u'path'), var.get(u'argsId'))) + if var.get(u'didRenameArguments'): + var.put(u'vars', (var.get(u'vars') or var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([])))) + var.get(u'vars').get(u'declarations').callprop(u'push', var.get(u't').callprop(u'variableDeclarator', var.get(u'argsId'), var.get(u't').callprop(u'identifier', Js(u'arguments')))) + var.put(u'emitter', var.get(u'_emit').get(u'Emitter').create(var.get(u'contextId'))) + var.get(u'emitter').callprop(u'explode', var.get(u'path').callprop(u'get', Js(u'body'))) + if (var.get(u'vars') and (var.get(u'vars').get(u'declarations').get(u'length')>Js(0.0))): + var.get(u'outerBody').callprop(u'push', var.get(u'vars')) + var.put(u'wrapArgs', Js([var.get(u'emitter').callprop(u'getContextFunction', var.get(u'innerFnId')), (var.get(u'outerFnExpr') if var.get(u'node').get(u'generator') else var.get(u't').callprop(u'nullLiteral')), var.get(u't').callprop(u'thisExpression')])) + var.put(u'tryLocsList', var.get(u'emitter').callprop(u'getTryLocsList')) + if var.get(u'tryLocsList'): + var.get(u'wrapArgs').callprop(u'push', var.get(u'tryLocsList')) + var.put(u'wrapCall', var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', (Js(u'async') if var.get(u'node').get(u'async') else Js(u'wrap'))), var.get(u'wrapArgs'))) + var.get(u'outerBody').callprop(u'push', var.get(u't').callprop(u'returnStatement', var.get(u'wrapCall'))) + var.get(u'node').put(u'body', var.get(u't').callprop(u'blockStatement', var.get(u'outerBody'))) + var.put(u'wasGeneratorFunction', var.get(u'node').get(u'generator')) + if var.get(u'wasGeneratorFunction'): + var.get(u'node').put(u'generator', Js(False)) + if var.get(u'node').get(u'async'): + var.get(u'node').put(u'async', Js(False)) + if (var.get(u'wasGeneratorFunction') and var.get(u't').callprop(u'isExpression', var.get(u'node'))): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', Js(u'mark')), Js([var.get(u'node')]))) + var.get(u'path').callprop(u'requeue') + PyJs_exit_1296_._set_name(u'exit') + PyJs_Object_1295_ = Js({u'exit':PyJs_exit_1296_}) + PyJs_Object_1294_ = Js({u'Function':PyJs_Object_1295_}) + var.get(u'exports').put(u'visitor', PyJs_Object_1294_) + pass + pass + pass + @Js + def PyJs_FunctionExpressionFunctionDeclaration_1303_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'FunctionExpressionFunctionDeclaration':PyJs_FunctionExpressionFunctionDeclaration_1303_}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_FunctionExpressionFunctionDeclaration_1303_._set_name(u'FunctionExpressionFunctionDeclaration') + @Js + def PyJs_Identifier_1304_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Identifier':PyJs_Identifier_1304_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if (PyJsStrictEq(var.get(u'path').get(u'node').get(u'name'),Js(u'arguments')) and var.get(u'util').callprop(u'isReference', var.get(u'path'))): + var.get(u'path').callprop(u'replaceWith', var.get(u'state').get(u'argsId')) + var.get(u'state').put(u'didRenameArguments', var.get(u'true')) + PyJs_Identifier_1304_._set_name(u'Identifier') + PyJs_Object_1302_ = Js({u'FunctionExpression|FunctionDeclaration':PyJs_FunctionExpressionFunctionDeclaration_1303_,u'Identifier':PyJs_Identifier_1304_}) + var.put(u'argumentsVisitor', PyJs_Object_1302_) + @Js + def PyJs_MetaProperty_1306_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'MetaProperty':PyJs_MetaProperty_1306_, u'arguments':arguments}, var) + var.registers([u'node', u'path']) + var.put(u'node', var.get(u'path').get(u'node')) + if (PyJsStrictEq(var.get(u'node').get(u'meta').get(u'name'),Js(u'function')) and PyJsStrictEq(var.get(u'node').get(u'property').get(u'name'),Js(u'sent'))): + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'memberExpression', var.get(u"this").get(u'context'), var.get(u't').callprop(u'identifier', Js(u'_sent')))) + PyJs_MetaProperty_1306_._set_name(u'MetaProperty') + PyJs_Object_1305_ = Js({u'MetaProperty':PyJs_MetaProperty_1306_}) + var.put(u'functionSentVisitor', PyJs_Object_1305_) + @Js + def PyJs_Function_1308_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_1308_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_1308_._set_name(u'Function') + @Js + def PyJs_AwaitExpression_1309_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'AwaitExpression':PyJs_AwaitExpression_1309_}, var) + var.registers([u'path', u'argument']) + var.put(u'argument', var.get(u'path').get(u'node').get(u'argument')) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'yieldExpression', var.get(u't').callprop(u'callExpression', var.get(u'util').callprop(u'runtimeProperty', Js(u'awrap')), Js([var.get(u'argument')])), Js(False))) + PyJs_AwaitExpression_1309_._set_name(u'AwaitExpression') + PyJs_Object_1307_ = Js({u'Function':PyJs_Function_1308_,u'AwaitExpression':PyJs_AwaitExpression_1309_}) + var.put(u'awaitVisitor', PyJs_Object_1307_) +PyJs_anonymous_1291_._set_name(u'anonymous') +PyJs_Object_1310_ = Js({u'./emit':Js(87.0),u'./hoist':Js(88.0),u'./util':Js(92.0),u'assert':Js(524.0),u'babel-types':Js(258.0),u'private':Js(500.0)}) +@Js +def PyJs_anonymous_1311_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1317_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1317_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1316_ = Js({}) + var.put(u'newObj', PyJs_Object_1316_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1312_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_Program_1315_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'Program':PyJs_Program_1315_, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'directive', u'state', u'_i', u'path', u'_ref']) + if (PyJsStrictEq(var.get(u'state').get(u'opts').get(u'strict'),Js(False)) or PyJsStrictEq(var.get(u'state').get(u'opts').get(u'strictMode'),Js(False))): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'directives')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'directive', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'directive').get(u'value').get(u'value'),Js(u'use strict')): + return var.get('undefined') + + var.get(u'path').callprop(u'unshiftContainer', Js(u'directives'), var.get(u't').callprop(u'directive', var.get(u't').callprop(u'directiveLiteral', Js(u'use strict')))) + PyJs_Program_1315_._set_name(u'Program') + PyJs_Object_1314_ = Js({u'Program':PyJs_Program_1315_}) + PyJs_Object_1313_ = Js({u'visitor':PyJs_Object_1314_}) + return PyJs_Object_1313_ + PyJs_anonymous_1312_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1312_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1311_._set_name(u'anonymous') +PyJs_Object_1318_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1319_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_babelPluginTransformEs2015ModulesCommonjs', u'_babelPluginTransformEs2015ComputedProperties', u'_babelPluginTransformEs2015BlockScopedFunctions2', u'_babelPluginTransformEs2015ForOf2', u'_babelPluginTransformEs2015ModulesUmd', u'_babelPluginTransformEs2015ArrowFunctions', u'_babelPluginTransformEs2015TypeofSymbol', u'exports', u'module', u'_interopRequireDefault', u'_babelPluginTransformEs2015ForOf', u'_babelPluginTransformEs2015BlockScoping', u'_babelPluginTransformEs2015Parameters2', u'_babelPluginTransformEs2015TemplateLiterals', u'_babelPluginTransformEs2015ComputedProperties2', u'_babelPluginTransformEs2015Spread', u'_babelPluginCheckEs2015Constants', u'_babelPluginTransformEs2015Destructuring', u'_babelPluginTransformEs2015DuplicateKeys2', u'_babelPluginTransformEs2015ModulesCommonjs2', u'_babelPluginTransformEs2015TemplateLiterals2', u'_babelPluginTransformEs2015Parameters', u'_babelPluginCheckEs2015Constants2', u'_babelPluginTransformEs2015StickyRegex2', u'_babelPluginTransformEs2015BlockScopedFunctions', u'_babelPluginTransformEs2015ShorthandProperties2', u'_babelPluginTransformRegenerator', u'_babelPluginTransformEs2015ModulesSystemjs', u'_babelPluginTransformEs2015DuplicateKeys', u'_babelPluginTransformEs2015ModulesAmd2', u'_babelPluginTransformEs2015FunctionName', u'_babelPluginTransformEs2015ObjectSuper2', u'_babelPluginTransformEs2015Destructuring2', u'_babelPluginTransformEs2015ShorthandProperties', u'_babelPluginTransformEs2015StickyRegex', u'_babelPluginTransformEs2015ModulesAmd', u'_babelPluginTransformEs2015ModulesUmd2', u'_babelPluginTransformEs2015Classes2', u'preset', u'_babelPluginTransformEs2015ObjectSuper', u'_babelPluginTransformEs2015TypeofSymbol2', u'_babelPluginTransformEs2015UnicodeRegex', u'_babelPluginTransformEs2015Classes', u'_babelPluginTransformEs2015Literals2', u'_babelPluginTransformEs2015ModulesSystemjs2', u'_babelPluginTransformEs2015Literals', u'_babelPluginTransformEs2015UnicodeRegex2', u'_babelPluginTransformEs2015FunctionName2', u'_babelPluginTransformEs2015BlockScoping2', u'_babelPluginTransformRegenerator2', u'oldConfig', u'_babelPluginTransformEs2015Spread2', u'require', u'_babelPluginTransformEs2015ArrowFunctions2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1320_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1320_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_preset_(context, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'context':context}, var) + var.registers([u'optsLoose', u'moduleTypes', u'loose', u'modules', u'context', u'spec', u'opts']) + PyJs_Object_1321_ = Js({}) + var.put(u'opts', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_1321_)) + var.put(u'moduleTypes', Js([Js(u'commonjs'), Js(u'amd'), Js(u'umd'), Js(u'systemjs')])) + var.put(u'loose', Js(False)) + var.put(u'modules', Js(u'commonjs')) + var.put(u'spec', Js(False)) + if PyJsStrictNeq(var.get(u'opts'),var.get(u'undefined')): + if PyJsStrictNeq(var.get(u'opts').get(u'loose'),var.get(u'undefined')): + var.put(u'loose', var.get(u'opts').get(u'loose')) + if PyJsStrictNeq(var.get(u'opts').get(u'modules'),var.get(u'undefined')): + var.put(u'modules', var.get(u'opts').get(u'modules')) + if PyJsStrictNeq(var.get(u'opts').get(u'spec'),var.get(u'undefined')): + var.put(u'spec', var.get(u'opts').get(u'spec')) + if PyJsStrictNeq(var.get(u'loose',throw=False).typeof(),Js(u'boolean')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Preset es2015 'loose' option must be a boolean."))) + raise PyJsTempException + if PyJsStrictNeq(var.get(u'spec',throw=False).typeof(),Js(u'boolean')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Preset es2015 'spec' option must be a boolean."))) + raise PyJsTempException + if (PyJsStrictNeq(var.get(u'modules'),Js(False)) and PyJsStrictEq(var.get(u'moduleTypes').callprop(u'indexOf', var.get(u'modules')),(-Js(1.0)))): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u"Preset es2015 'modules' option must be 'false' to indicate no modules\n")+Js(u"or a module type which be be one of: 'commonjs' (default), 'amd', 'umd', 'systemjs'")))) + raise PyJsTempException + PyJs_Object_1322_ = Js({u'loose':var.get(u'loose')}) + var.put(u'optsLoose', PyJs_Object_1322_) + def PyJs_LONG_1327_(var=var): + PyJs_Object_1324_ = Js({u'loose':var.get(u'loose'),u'spec':var.get(u'spec')}) + PyJs_Object_1325_ = Js({u'spec':var.get(u'spec')}) + PyJs_Object_1326_ = Js({u'async':Js(False),u'asyncGenerators':Js(False)}) + return Js([Js([var.get(u'_babelPluginTransformEs2015TemplateLiterals2').get(u'default'), PyJs_Object_1324_]), var.get(u'_babelPluginTransformEs2015Literals2').get(u'default'), var.get(u'_babelPluginTransformEs2015FunctionName2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015ArrowFunctions2').get(u'default'), PyJs_Object_1325_]), var.get(u'_babelPluginTransformEs2015BlockScopedFunctions2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015Classes2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015ObjectSuper2').get(u'default'), var.get(u'_babelPluginTransformEs2015ShorthandProperties2').get(u'default'), var.get(u'_babelPluginTransformEs2015DuplicateKeys2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015ComputedProperties2').get(u'default'), var.get(u'optsLoose')]), Js([var.get(u'_babelPluginTransformEs2015ForOf2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015StickyRegex2').get(u'default'), var.get(u'_babelPluginTransformEs2015UnicodeRegex2').get(u'default'), var.get(u'_babelPluginCheckEs2015Constants2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015Spread2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015Parameters2').get(u'default'), Js([var.get(u'_babelPluginTransformEs2015Destructuring2').get(u'default'), var.get(u'optsLoose')]), var.get(u'_babelPluginTransformEs2015BlockScoping2').get(u'default'), var.get(u'_babelPluginTransformEs2015TypeofSymbol2').get(u'default'), (PyJsStrictEq(var.get(u'modules'),Js(u'commonjs')) and Js([var.get(u'_babelPluginTransformEs2015ModulesCommonjs2').get(u'default'), var.get(u'optsLoose')])), (PyJsStrictEq(var.get(u'modules'),Js(u'systemjs')) and Js([var.get(u'_babelPluginTransformEs2015ModulesSystemjs2').get(u'default'), var.get(u'optsLoose')])), (PyJsStrictEq(var.get(u'modules'),Js(u'amd')) and Js([var.get(u'_babelPluginTransformEs2015ModulesAmd2').get(u'default'), var.get(u'optsLoose')])), (PyJsStrictEq(var.get(u'modules'),Js(u'umd')) and Js([var.get(u'_babelPluginTransformEs2015ModulesUmd2').get(u'default'), var.get(u'optsLoose')])), Js([var.get(u'_babelPluginTransformRegenerator2').get(u'default'), PyJs_Object_1326_])]).callprop(u'filter', var.get(u'Boolean')) + PyJs_Object_1323_ = Js({u'plugins':PyJs_LONG_1327_()}) + return PyJs_Object_1323_ + PyJsHoisted_preset_.func_name = u'preset' + var.put(u'preset', PyJsHoisted_preset_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_babelPluginTransformEs2015TemplateLiterals', var.get(u'require')(Js(u'babel-plugin-transform-es2015-template-literals'))) + var.put(u'_babelPluginTransformEs2015TemplateLiterals2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015TemplateLiterals'))) + var.put(u'_babelPluginTransformEs2015Literals', var.get(u'require')(Js(u'babel-plugin-transform-es2015-literals'))) + var.put(u'_babelPluginTransformEs2015Literals2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Literals'))) + var.put(u'_babelPluginTransformEs2015FunctionName', var.get(u'require')(Js(u'babel-plugin-transform-es2015-function-name'))) + var.put(u'_babelPluginTransformEs2015FunctionName2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015FunctionName'))) + var.put(u'_babelPluginTransformEs2015ArrowFunctions', var.get(u'require')(Js(u'babel-plugin-transform-es2015-arrow-functions'))) + var.put(u'_babelPluginTransformEs2015ArrowFunctions2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ArrowFunctions'))) + var.put(u'_babelPluginTransformEs2015BlockScopedFunctions', var.get(u'require')(Js(u'babel-plugin-transform-es2015-block-scoped-functions'))) + var.put(u'_babelPluginTransformEs2015BlockScopedFunctions2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015BlockScopedFunctions'))) + var.put(u'_babelPluginTransformEs2015Classes', var.get(u'require')(Js(u'babel-plugin-transform-es2015-classes'))) + var.put(u'_babelPluginTransformEs2015Classes2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Classes'))) + var.put(u'_babelPluginTransformEs2015ObjectSuper', var.get(u'require')(Js(u'babel-plugin-transform-es2015-object-super'))) + var.put(u'_babelPluginTransformEs2015ObjectSuper2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ObjectSuper'))) + var.put(u'_babelPluginTransformEs2015ShorthandProperties', var.get(u'require')(Js(u'babel-plugin-transform-es2015-shorthand-properties'))) + var.put(u'_babelPluginTransformEs2015ShorthandProperties2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ShorthandProperties'))) + var.put(u'_babelPluginTransformEs2015DuplicateKeys', var.get(u'require')(Js(u'babel-plugin-transform-es2015-duplicate-keys'))) + var.put(u'_babelPluginTransformEs2015DuplicateKeys2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015DuplicateKeys'))) + var.put(u'_babelPluginTransformEs2015ComputedProperties', var.get(u'require')(Js(u'babel-plugin-transform-es2015-computed-properties'))) + var.put(u'_babelPluginTransformEs2015ComputedProperties2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ComputedProperties'))) + var.put(u'_babelPluginTransformEs2015ForOf', var.get(u'require')(Js(u'babel-plugin-transform-es2015-for-of'))) + var.put(u'_babelPluginTransformEs2015ForOf2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ForOf'))) + var.put(u'_babelPluginTransformEs2015StickyRegex', var.get(u'require')(Js(u'babel-plugin-transform-es2015-sticky-regex'))) + var.put(u'_babelPluginTransformEs2015StickyRegex2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015StickyRegex'))) + var.put(u'_babelPluginTransformEs2015UnicodeRegex', var.get(u'require')(Js(u'babel-plugin-transform-es2015-unicode-regex'))) + var.put(u'_babelPluginTransformEs2015UnicodeRegex2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015UnicodeRegex'))) + var.put(u'_babelPluginCheckEs2015Constants', var.get(u'require')(Js(u'babel-plugin-check-es2015-constants'))) + var.put(u'_babelPluginCheckEs2015Constants2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginCheckEs2015Constants'))) + var.put(u'_babelPluginTransformEs2015Spread', var.get(u'require')(Js(u'babel-plugin-transform-es2015-spread'))) + var.put(u'_babelPluginTransformEs2015Spread2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Spread'))) + var.put(u'_babelPluginTransformEs2015Parameters', var.get(u'require')(Js(u'babel-plugin-transform-es2015-parameters'))) + var.put(u'_babelPluginTransformEs2015Parameters2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Parameters'))) + var.put(u'_babelPluginTransformEs2015Destructuring', var.get(u'require')(Js(u'babel-plugin-transform-es2015-destructuring'))) + var.put(u'_babelPluginTransformEs2015Destructuring2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015Destructuring'))) + var.put(u'_babelPluginTransformEs2015BlockScoping', var.get(u'require')(Js(u'babel-plugin-transform-es2015-block-scoping'))) + var.put(u'_babelPluginTransformEs2015BlockScoping2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015BlockScoping'))) + var.put(u'_babelPluginTransformEs2015TypeofSymbol', var.get(u'require')(Js(u'babel-plugin-transform-es2015-typeof-symbol'))) + var.put(u'_babelPluginTransformEs2015TypeofSymbol2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015TypeofSymbol'))) + var.put(u'_babelPluginTransformEs2015ModulesCommonjs', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-commonjs'))) + var.put(u'_babelPluginTransformEs2015ModulesCommonjs2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesCommonjs'))) + var.put(u'_babelPluginTransformEs2015ModulesSystemjs', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-systemjs'))) + var.put(u'_babelPluginTransformEs2015ModulesSystemjs2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesSystemjs'))) + var.put(u'_babelPluginTransformEs2015ModulesAmd', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-amd'))) + var.put(u'_babelPluginTransformEs2015ModulesAmd2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesAmd'))) + var.put(u'_babelPluginTransformEs2015ModulesUmd', var.get(u'require')(Js(u'babel-plugin-transform-es2015-modules-umd'))) + var.put(u'_babelPluginTransformEs2015ModulesUmd2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformEs2015ModulesUmd'))) + var.put(u'_babelPluginTransformRegenerator', var.get(u'require')(Js(u'babel-plugin-transform-regenerator'))) + var.put(u'_babelPluginTransformRegenerator2', var.get(u'_interopRequireDefault')(var.get(u'_babelPluginTransformRegenerator'))) + pass + pass + PyJs_Object_1328_ = Js({}) + var.put(u'oldConfig', var.get(u'preset')(PyJs_Object_1328_)) + var.get(u'exports').put(u'default', var.get(u'oldConfig')) + PyJs_Object_1329_ = Js({u'configurable':var.get(u'true'),u'writable':var.get(u'true'),u'enumerable':Js(False),u'value':var.get(u'preset')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'oldConfig'), Js(u'buildPreset'), PyJs_Object_1329_) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1319_._set_name(u'anonymous') +PyJs_Object_1330_ = Js({u'babel-plugin-check-es2015-constants':Js(58.0),u'babel-plugin-transform-es2015-arrow-functions':Js(59.0),u'babel-plugin-transform-es2015-block-scoped-functions':Js(60.0),u'babel-plugin-transform-es2015-block-scoping':Js(61.0),u'babel-plugin-transform-es2015-classes':Js(63.0),u'babel-plugin-transform-es2015-computed-properties':Js(66.0),u'babel-plugin-transform-es2015-destructuring':Js(67.0),u'babel-plugin-transform-es2015-duplicate-keys':Js(68.0),u'babel-plugin-transform-es2015-for-of':Js(69.0),u'babel-plugin-transform-es2015-function-name':Js(70.0),u'babel-plugin-transform-es2015-literals':Js(71.0),u'babel-plugin-transform-es2015-modules-amd':Js(72.0),u'babel-plugin-transform-es2015-modules-commonjs':Js(73.0),u'babel-plugin-transform-es2015-modules-systemjs':Js(74.0),u'babel-plugin-transform-es2015-modules-umd':Js(75.0),u'babel-plugin-transform-es2015-object-super':Js(76.0),u'babel-plugin-transform-es2015-parameters':Js(79.0),u'babel-plugin-transform-es2015-shorthand-properties':Js(81.0),u'babel-plugin-transform-es2015-spread':Js(82.0),u'babel-plugin-transform-es2015-sticky-regex':Js(83.0),u'babel-plugin-transform-es2015-template-literals':Js(84.0),u'babel-plugin-transform-es2015-typeof-symbol':Js(85.0),u'babel-plugin-transform-es2015-unicode-regex':Js(86.0),u'babel-plugin-transform-regenerator':Js(89.0)}) +@Js +def PyJs_anonymous_1331_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1332_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/get-iterator')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1332_) +PyJs_anonymous_1331_._set_name(u'anonymous') +PyJs_Object_1333_ = Js({u'core-js/library/fn/get-iterator':Js(115.0)}) +@Js +def PyJs_anonymous_1334_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1335_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/json/stringify')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1335_) +PyJs_anonymous_1334_._set_name(u'anonymous') +PyJs_Object_1336_ = Js({u'core-js/library/fn/json/stringify':Js(116.0)}) +@Js +def PyJs_anonymous_1337_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1338_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/map')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1338_) +PyJs_anonymous_1337_._set_name(u'anonymous') +PyJs_Object_1339_ = Js({u'core-js/library/fn/map':Js(117.0)}) +@Js +def PyJs_anonymous_1340_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1341_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/number/max-safe-integer')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1341_) +PyJs_anonymous_1340_._set_name(u'anonymous') +PyJs_Object_1342_ = Js({u'core-js/library/fn/number/max-safe-integer':Js(118.0)}) +@Js +def PyJs_anonymous_1343_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1344_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/assign')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1344_) +PyJs_anonymous_1343_._set_name(u'anonymous') +PyJs_Object_1345_ = Js({u'core-js/library/fn/object/assign':Js(119.0)}) +@Js +def PyJs_anonymous_1346_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1347_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/create')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1347_) +PyJs_anonymous_1346_._set_name(u'anonymous') +PyJs_Object_1348_ = Js({u'core-js/library/fn/object/create':Js(120.0)}) +@Js +def PyJs_anonymous_1349_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1350_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/get-own-property-symbols')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1350_) +PyJs_anonymous_1349_._set_name(u'anonymous') +PyJs_Object_1351_ = Js({u'core-js/library/fn/object/get-own-property-symbols':Js(121.0)}) +@Js +def PyJs_anonymous_1352_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1353_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/keys')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1353_) +PyJs_anonymous_1352_._set_name(u'anonymous') +PyJs_Object_1354_ = Js({u'core-js/library/fn/object/keys':Js(122.0)}) +@Js +def PyJs_anonymous_1355_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1356_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/object/set-prototype-of')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1356_) +PyJs_anonymous_1355_._set_name(u'anonymous') +PyJs_Object_1357_ = Js({u'core-js/library/fn/object/set-prototype-of':Js(123.0)}) +@Js +def PyJs_anonymous_1358_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1359_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/symbol')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1359_) +PyJs_anonymous_1358_._set_name(u'anonymous') +PyJs_Object_1360_ = Js({u'core-js/library/fn/symbol':Js(125.0)}) +@Js +def PyJs_anonymous_1361_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1362_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/symbol/for')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1362_) +PyJs_anonymous_1361_._set_name(u'anonymous') +PyJs_Object_1363_ = Js({u'core-js/library/fn/symbol/for':Js(124.0)}) +@Js +def PyJs_anonymous_1364_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1365_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/symbol/iterator')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1365_) +PyJs_anonymous_1364_._set_name(u'anonymous') +PyJs_Object_1366_ = Js({u'core-js/library/fn/symbol/iterator':Js(126.0)}) +@Js +def PyJs_anonymous_1367_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1368_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/weak-map')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1368_) +PyJs_anonymous_1367_._set_name(u'anonymous') +PyJs_Object_1369_ = Js({u'core-js/library/fn/weak-map':Js(127.0)}) +@Js +def PyJs_anonymous_1370_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1371_ = Js({u'default':var.get(u'require')(Js(u'core-js/library/fn/weak-set')),u'__esModule':var.get(u'true')}) + var.get(u'module').put(u'exports', PyJs_Object_1371_) +PyJs_anonymous_1370_._set_name(u'anonymous') +PyJs_Object_1372_ = Js({u'core-js/library/fn/weak-set':Js(128.0)}) +@Js +def PyJs_anonymous_1373_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1374_(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJs_anonymous_1374_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1374_) +PyJs_anonymous_1373_._set_name(u'anonymous') +PyJs_Object_1375_ = Js({}) +@Js +def PyJs_anonymous_1376_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'_typeof2', u'_typeof3', u'_setPrototypeOf', u'require', u'exports', u'module', u'_create2', u'_setPrototypeOf2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1377_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1377_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_setPrototypeOf', var.get(u'require')(Js(u'../core-js/object/set-prototype-of'))) + var.put(u'_setPrototypeOf2', var.get(u'_interopRequireDefault')(var.get(u'_setPrototypeOf'))) + var.put(u'_create', var.get(u'require')(Js(u'../core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_typeof2', var.get(u'require')(Js(u'../helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + pass + @Js + def PyJs_anonymous_1378_(subClass, superClass, this, arguments, var=var): + var = Scope({u'this':this, u'superClass':superClass, u'subClass':subClass, u'arguments':arguments}, var) + var.registers([u'superClass', u'subClass']) + if (PyJsStrictNeq(var.get(u'superClass',throw=False).typeof(),Js(u'function')) and PyJsStrictNeq(var.get(u'superClass'),var.get(u"null"))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Super expression must either be null or a function, not ')+(Js(u'undefined') if PyJsStrictEq(var.get(u'superClass',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'superClass')))))) + raise PyJsTempException + PyJs_Object_1380_ = Js({u'value':var.get(u'subClass'),u'enumerable':Js(False),u'writable':var.get(u'true'),u'configurable':var.get(u'true')}) + PyJs_Object_1379_ = Js({u'constructor':PyJs_Object_1380_}) + var.get(u'subClass').put(u'prototype', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))((var.get(u'superClass') and var.get(u'superClass').get(u'prototype')), PyJs_Object_1379_)) + if var.get(u'superClass'): + (PyJsComma(Js(0.0),var.get(u'_setPrototypeOf2').get(u'default'))(var.get(u'subClass'), var.get(u'superClass')) if var.get(u'_setPrototypeOf2').get(u'default') else var.get(u'subClass').put(u'__proto__', var.get(u'superClass'))) + PyJs_anonymous_1378_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1378_) +PyJs_anonymous_1376_._set_name(u'anonymous') +PyJs_Object_1381_ = Js({u'../core-js/object/create':Js(101.0),u'../core-js/object/set-prototype-of':Js(104.0),u'../helpers/typeof':Js(114.0)}) +@Js +def PyJs_anonymous_1382_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_1383_(obj, keys, this, arguments, var=var): + var = Scope({u'keys':keys, u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'i', u'keys', u'obj', u'target']) + PyJs_Object_1384_ = Js({}) + var.put(u'target', PyJs_Object_1384_) + for PyJsTemp in var.get(u'obj'): + var.put(u'i', PyJsTemp) + if (var.get(u'keys').callprop(u'indexOf', var.get(u'i'))>=Js(0.0)): + continue + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'i')).neg(): + continue + var.get(u'target').put(var.get(u'i'), var.get(u'obj').get(var.get(u'i'))) + return var.get(u'target') + PyJs_anonymous_1383_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1383_) +PyJs_anonymous_1382_._set_name(u'anonymous') +PyJs_Object_1385_ = Js({}) +@Js +def PyJs_anonymous_1386_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_typeof2', u'_typeof3', u'require', u'exports', u'module', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1387_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1387_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'../helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + pass + @Js + def PyJs_anonymous_1388_(self, call, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'call':call, u'arguments':arguments}, var) + var.registers([u'self', u'call']) + if var.get(u'self').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u"this hasn't been initialised - super() hasn't been called"))) + raise PyJsTempException + return (var.get(u'call') if (var.get(u'call') and (PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'call'))),Js(u'object')) or PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'function')))) else var.get(u'self')) + PyJs_anonymous_1388_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1388_) +PyJs_anonymous_1386_._set_name(u'anonymous') +PyJs_Object_1389_ = Js({u'../helpers/typeof':Js(114.0)}) +@Js +def PyJs_anonymous_1390_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_symbol2', u'_iterator', u'require', u'module', u'_typeof', u'_symbol', u'_interopRequireDefault', u'_iterator2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1393_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1393_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_iterator', var.get(u'require')(Js(u'../core-js/symbol/iterator'))) + var.put(u'_iterator2', var.get(u'_interopRequireDefault')(var.get(u'_iterator'))) + var.put(u'_symbol', var.get(u'require')(Js(u'../core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1391_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return var.get(u'obj',throw=False).typeof() + PyJs_anonymous_1391_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1392_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return (Js(u'symbol') if (((var.get(u'obj') and PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'obj').get(u'constructor'),var.get(u'_symbol2').get(u'default'))) and PyJsStrictNeq(var.get(u'obj'),var.get(u'_symbol2').get(u'default').get(u'prototype'))) else var.get(u'obj',throw=False).typeof()) + PyJs_anonymous_1392_._set_name(u'anonymous') + var.put(u'_typeof', (PyJs_anonymous_1391_ if (PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function')) and PyJsStrictEq(var.get(u'_iterator2').get(u'default').typeof(),Js(u'symbol'))) else PyJs_anonymous_1392_)) + pass + @Js + def PyJs_anonymous_1394_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return (Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else var.get(u'_typeof')(var.get(u'obj'))) + PyJs_anonymous_1394_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1395_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + def PyJs_LONG_1396_(var=var): + return (Js(u'symbol') if (((var.get(u'obj') and PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'obj').get(u'constructor'),var.get(u'_symbol2').get(u'default'))) and PyJsStrictNeq(var.get(u'obj'),var.get(u'_symbol2').get(u'default').get(u'prototype'))) else (Js(u'undefined') if PyJsStrictEq(var.get(u'obj',throw=False).typeof(),Js(u'undefined')) else var.get(u'_typeof')(var.get(u'obj')))) + return PyJs_LONG_1396_() + PyJs_anonymous_1395_._set_name(u'anonymous') + var.get(u'exports').put(u'default', (PyJs_anonymous_1394_ if (PyJsStrictEq(var.get(u'_symbol2').get(u'default').typeof(),Js(u'function')) and PyJsStrictEq(var.get(u'_typeof')(var.get(u'_iterator2').get(u'default')),Js(u'symbol'))) else PyJs_anonymous_1395_)) +PyJs_anonymous_1390_._set_name(u'anonymous') +PyJs_Object_1397_ = Js({u'../core-js/symbol':Js(105.0),u'../core-js/symbol/iterator':Js(107.0)}) +@Js +def PyJs_anonymous_1398_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.string.iterator')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/core.get-iterator'))) +PyJs_anonymous_1398_._set_name(u'anonymous') +PyJs_Object_1399_ = Js({u'../modules/core.get-iterator':Js(204.0),u'../modules/es6.string.iterator':Js(213.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1400_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'require', u'exports', u'module', u'$JSON']) + var.put(u'core', var.get(u'require')(Js(u'../../modules/_core'))) + PyJs_Object_1401_ = Js({u'stringify':var.get(u'JSON').get(u'stringify')}) + var.put(u'$JSON', (var.get(u'core').get(u'JSON') or var.get(u'core').put(u'JSON', PyJs_Object_1401_))) + @Js + def PyJs_stringify_1402_(it, this, arguments, var=var): + var = Scope({u'this':this, u'stringify':PyJs_stringify_1402_, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'$JSON').get(u'stringify').callprop(u'apply', var.get(u'$JSON'), var.get(u'arguments')) + PyJs_stringify_1402_._set_name(u'stringify') + var.get(u'module').put(u'exports', PyJs_stringify_1402_) +PyJs_anonymous_1400_._set_name(u'anonymous') +PyJs_Object_1403_ = Js({u'../../modules/_core':Js(144.0)}) +@Js +def PyJs_anonymous_1404_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../modules/es6.string.iterator')) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.map')) + var.get(u'require')(Js(u'../modules/es7.map.to-json')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/_core')).get(u'Map')) +PyJs_anonymous_1404_._set_name(u'anonymous') +PyJs_Object_1405_ = Js({u'../modules/_core':Js(144.0),u'../modules/es6.map':Js(206.0),u'../modules/es6.object.to-string':Js(212.0),u'../modules/es6.string.iterator':Js(213.0),u'../modules/es7.map.to-json':Js(217.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1406_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.number.max-safe-integer')) + var.get(u'module').put(u'exports', Js(9007199254740991)) +PyJs_anonymous_1406_._set_name(u'anonymous') +PyJs_Object_1407_ = Js({u'../../modules/es6.number.max-safe-integer':Js(207.0)}) +@Js +def PyJs_anonymous_1408_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.object.assign')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'assign')) +PyJs_anonymous_1408_._set_name(u'anonymous') +PyJs_Object_1409_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.assign':Js(208.0)}) +@Js +def PyJs_anonymous_1410_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'$Object']) + var.get(u'require')(Js(u'../../modules/es6.object.create')) + var.put(u'$Object', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object')) + @Js + def PyJs_create_1411_(P, D, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'create':PyJs_create_1411_, u'D':D, u'arguments':arguments}, var) + var.registers([u'P', u'D']) + return var.get(u'$Object').callprop(u'create', var.get(u'P'), var.get(u'D')) + PyJs_create_1411_._set_name(u'create') + var.get(u'module').put(u'exports', PyJs_create_1411_) +PyJs_anonymous_1410_._set_name(u'anonymous') +PyJs_Object_1412_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.create':Js(209.0)}) +@Js +def PyJs_anonymous_1413_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.symbol')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'getOwnPropertySymbols')) +PyJs_anonymous_1413_._set_name(u'anonymous') +PyJs_Object_1414_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.symbol':Js(214.0)}) +@Js +def PyJs_anonymous_1415_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.object.keys')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'keys')) +PyJs_anonymous_1415_._set_name(u'anonymous') +PyJs_Object_1416_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.keys':Js(210.0)}) +@Js +def PyJs_anonymous_1417_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.object.set-prototype-of')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Object').get(u'setPrototypeOf')) +PyJs_anonymous_1417_._set_name(u'anonymous') +PyJs_Object_1418_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.set-prototype-of':Js(211.0)}) +@Js +def PyJs_anonymous_1419_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.symbol')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Symbol').get(u'for')) +PyJs_anonymous_1419_._set_name(u'anonymous') +PyJs_Object_1420_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.symbol':Js(214.0)}) +@Js +def PyJs_anonymous_1421_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.symbol')) + var.get(u'require')(Js(u'../../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../../modules/es7.symbol.async-iterator')) + var.get(u'require')(Js(u'../../modules/es7.symbol.observable')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_core')).get(u'Symbol')) +PyJs_anonymous_1421_._set_name(u'anonymous') +PyJs_Object_1422_ = Js({u'../../modules/_core':Js(144.0),u'../../modules/es6.object.to-string':Js(212.0),u'../../modules/es6.symbol':Js(214.0),u'../../modules/es7.symbol.async-iterator':Js(218.0),u'../../modules/es7.symbol.observable':Js(219.0)}) +@Js +def PyJs_anonymous_1423_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../../modules/es6.string.iterator')) + var.get(u'require')(Js(u'../../modules/web.dom.iterable')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../../modules/_wks-ext')).callprop(u'f', Js(u'iterator'))) +PyJs_anonymous_1423_._set_name(u'anonymous') +PyJs_Object_1424_ = Js({u'../../modules/_wks-ext':Js(201.0),u'../../modules/es6.string.iterator':Js(213.0),u'../../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1425_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.weak-map')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/_core')).get(u'WeakMap')) +PyJs_anonymous_1425_._set_name(u'anonymous') +PyJs_Object_1426_ = Js({u'../modules/_core':Js(144.0),u'../modules/es6.object.to-string':Js(212.0),u'../modules/es6.weak-map':Js(215.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1427_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'../modules/es6.object.to-string')) + var.get(u'require')(Js(u'../modules/web.dom.iterable')) + var.get(u'require')(Js(u'../modules/es6.weak-set')) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'../modules/_core')).get(u'WeakSet')) +PyJs_anonymous_1427_._set_name(u'anonymous') +PyJs_Object_1428_ = Js({u'../modules/_core':Js(144.0),u'../modules/es6.object.to-string':Js(212.0),u'../modules/es6.weak-set':Js(216.0),u'../modules/web.dom.iterable':Js(220.0)}) +@Js +def PyJs_anonymous_1429_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1430_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (var.get(u'it',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'it')+Js(u' is not a function!')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1430_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1430_) +PyJs_anonymous_1429_._set_name(u'anonymous') +PyJs_Object_1431_ = Js({}) +@Js +def PyJs_anonymous_1432_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1433_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_1433_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1433_) +PyJs_anonymous_1432_._set_name(u'anonymous') +PyJs_Object_1434_ = Js({}) +@Js +def PyJs_anonymous_1435_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1436_(it, Constructor, name, forbiddenField, this, arguments, var=var): + var = Scope({u'name':name, u'Constructor':Constructor, u'this':this, u'arguments':arguments, u'it':it, u'forbiddenField':forbiddenField}, var) + var.registers([u'forbiddenField', u'it', u'name', u'Constructor']) + if (var.get(u'it').instanceof(var.get(u'Constructor')).neg() or (PyJsStrictNeq(var.get(u'forbiddenField'),var.get(u'undefined')) and var.get(u'it').contains(var.get(u'forbiddenField')))): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'name')+Js(u': incorrect invocation!')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1436_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1436_) +PyJs_anonymous_1435_._set_name(u'anonymous') +PyJs_Object_1437_ = Js({}) +@Js +def PyJs_anonymous_1438_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isObject', u'module']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + @Js + def PyJs_anonymous_1439_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if var.get(u'isObject')(var.get(u'it')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'it')+Js(u' is not an object!')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1439_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1439_) +PyJs_anonymous_1438_._set_name(u'anonymous') +PyJs_Object_1440_ = Js({u'./_is-object':Js(162.0)}) +@Js +def PyJs_anonymous_1441_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'forOf', u'exports', u'module']) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + @Js + def PyJs_anonymous_1442_(iter, ITERATOR, this, arguments, var=var): + var = Scope({u'this':this, u'ITERATOR':ITERATOR, u'iter':iter, u'arguments':arguments}, var) + var.registers([u'ITERATOR', u'result', u'iter']) + var.put(u'result', Js([])) + var.get(u'forOf')(var.get(u'iter'), Js(False), var.get(u'result').get(u'push'), var.get(u'result'), var.get(u'ITERATOR')) + return var.get(u'result') + PyJs_anonymous_1442_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1442_) +PyJs_anonymous_1441_._set_name(u'anonymous') +PyJs_Object_1443_ = Js({u'./_for-of':Js(153.0)}) +@Js +def PyJs_anonymous_1444_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toLength', u'require', u'toIndex', u'module', u'toIObject']) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'toLength', var.get(u'require')(Js(u'./_to-length'))) + var.put(u'toIndex', var.get(u'require')(Js(u'./_to-index'))) + @Js + def PyJs_anonymous_1445_(IS_INCLUDES, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'IS_INCLUDES':IS_INCLUDES}, var) + var.registers([u'IS_INCLUDES']) + @Js + def PyJs_anonymous_1446_(PyJsArg_2474686973_, el, fromIndex, this, arguments, var=var): + var = Scope({u'this':this, u'el':el, u'$this':PyJsArg_2474686973_, u'arguments':arguments, u'fromIndex':fromIndex}, var) + var.registers([u'el', u'index', u'$this', u'value', u'fromIndex', u'length', u'O']) + var.put(u'O', var.get(u'toIObject')(var.get(u'$this'))) + var.put(u'length', var.get(u'toLength')(var.get(u'O').get(u'length'))) + var.put(u'index', var.get(u'toIndex')(var.get(u'fromIndex'), var.get(u'length'))) + if (var.get(u'IS_INCLUDES') and (var.get(u'el')!=var.get(u'el'))): + while (var.get(u'length')>var.get(u'index')): + var.put(u'value', var.get(u'O').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)))) + if (var.get(u'value')!=var.get(u'value')): + return var.get(u'true') + else: + #for JS loop + + while (var.get(u'length')>var.get(u'index')): + try: + if (var.get(u'IS_INCLUDES') or var.get(u'O').contains(var.get(u'index'))): + if PyJsStrictEq(var.get(u'O').get(var.get(u'index')),var.get(u'el')): + return ((var.get(u'IS_INCLUDES') or var.get(u'index')) or Js(0.0)) + finally: + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + return (var.get(u'IS_INCLUDES').neg() and (-Js(1.0))) + PyJs_anonymous_1446_._set_name(u'anonymous') + return PyJs_anonymous_1446_ + PyJs_anonymous_1445_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1445_) +PyJs_anonymous_1444_._set_name(u'anonymous') +PyJs_Object_1447_ = Js({u'./_to-index':Js(193.0),u'./_to-iobject':Js(195.0),u'./_to-length':Js(196.0)}) +@Js +def PyJs_anonymous_1448_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toLength', u'IObject', u'toObject', u'ctx', u'module', u'asc', u'require']) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'IObject', var.get(u'require')(Js(u'./_iobject'))) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'toLength', var.get(u'require')(Js(u'./_to-length'))) + var.put(u'asc', var.get(u'require')(Js(u'./_array-species-create'))) + @Js + def PyJs_anonymous_1449_(TYPE, PyJsArg_24637265617465_, this, arguments, var=var): + var = Scope({u'this':this, u'TYPE':TYPE, u'arguments':arguments, u'$create':PyJsArg_24637265617465_}, var) + var.registers([u'IS_FIND_INDEX', u'IS_SOME', u'IS_MAP', u'$create', u'NO_HOLES', u'IS_EVERY', u'IS_FILTER', u'TYPE', u'create']) + var.put(u'IS_MAP', (var.get(u'TYPE')==Js(1.0))) + var.put(u'IS_FILTER', (var.get(u'TYPE')==Js(2.0))) + var.put(u'IS_SOME', (var.get(u'TYPE')==Js(3.0))) + var.put(u'IS_EVERY', (var.get(u'TYPE')==Js(4.0))) + var.put(u'IS_FIND_INDEX', (var.get(u'TYPE')==Js(6.0))) + var.put(u'NO_HOLES', ((var.get(u'TYPE')==Js(5.0)) or var.get(u'IS_FIND_INDEX'))) + var.put(u'create', (var.get(u'$create') or var.get(u'asc'))) + @Js + def PyJs_anonymous_1450_(PyJsArg_2474686973_, callbackfn, that, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'callbackfn':callbackfn, u'$this':PyJsArg_2474686973_, u'that':that}, var) + var.registers([u'index', u'callbackfn', u'val', u'f', u'res', u'self', u'that', u'$this', u'O', u'length', u'result']) + var.put(u'O', var.get(u'toObject')(var.get(u'$this'))) + var.put(u'self', var.get(u'IObject')(var.get(u'O'))) + var.put(u'f', var.get(u'ctx')(var.get(u'callbackfn'), var.get(u'that'), Js(3.0))) + var.put(u'length', var.get(u'toLength')(var.get(u'self').get(u'length'))) + var.put(u'index', Js(0.0)) + var.put(u'result', (var.get(u'create')(var.get(u'$this'), var.get(u'length')) if var.get(u'IS_MAP') else (var.get(u'create')(var.get(u'$this'), Js(0.0)) if var.get(u'IS_FILTER') else var.get(u'undefined')))) + #for JS loop + + while (var.get(u'length')>var.get(u'index')): + try: + if (var.get(u'NO_HOLES') or var.get(u'self').contains(var.get(u'index'))): + var.put(u'val', var.get(u'self').get(var.get(u'index'))) + var.put(u'res', var.get(u'f')(var.get(u'val'), var.get(u'index'), var.get(u'O'))) + if var.get(u'TYPE'): + if var.get(u'IS_MAP'): + var.get(u'result').put(var.get(u'index'), var.get(u'res')) + else: + if var.get(u'res'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'TYPE')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + return var.get(u'true') + if SWITCHED or PyJsStrictEq(CONDITION, Js(5.0)): + SWITCHED = True + return var.get(u'val') + if SWITCHED or PyJsStrictEq(CONDITION, Js(6.0)): + SWITCHED = True + return var.get(u'index') + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + var.get(u'result').callprop(u'push', var.get(u'val')) + SWITCHED = True + break + else: + if var.get(u'IS_EVERY'): + return Js(False) + finally: + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + return ((-Js(1.0)) if var.get(u'IS_FIND_INDEX') else (var.get(u'IS_EVERY') if (var.get(u'IS_SOME') or var.get(u'IS_EVERY')) else var.get(u'result'))) + PyJs_anonymous_1450_._set_name(u'anonymous') + return PyJs_anonymous_1450_ + PyJs_anonymous_1449_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1449_) +PyJs_anonymous_1448_._set_name(u'anonymous') +PyJs_Object_1451_ = Js({u'./_array-species-create':Js(137.0),u'./_ctx':Js(145.0),u'./_iobject':Js(159.0),u'./_to-length':Js(196.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1452_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'require', u'module', u'SPECIES', u'isObject']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'isArray', var.get(u'require')(Js(u'./_is-array'))) + var.put(u'SPECIES', var.get(u'require')(Js(u'./_wks'))(Js(u'species'))) + @Js + def PyJs_anonymous_1453_(original, this, arguments, var=var): + var = Scope({u'this':this, u'original':original, u'arguments':arguments}, var) + var.registers([u'C', u'original']) + pass + if var.get(u'isArray')(var.get(u'original')): + var.put(u'C', var.get(u'original').get(u'constructor')) + if ((var.get(u'C',throw=False).typeof()==Js(u'function')) and (PyJsStrictEq(var.get(u'C'),var.get(u'Array')) or var.get(u'isArray')(var.get(u'C').get(u'prototype')))): + var.put(u'C', var.get(u'undefined')) + if var.get(u'isObject')(var.get(u'C')): + var.put(u'C', var.get(u'C').get(var.get(u'SPECIES'))) + if PyJsStrictEq(var.get(u'C'),var.get(u"null")): + var.put(u'C', var.get(u'undefined')) + return (var.get(u'Array') if PyJsStrictEq(var.get(u'C'),var.get(u'undefined')) else var.get(u'C')) + PyJs_anonymous_1453_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1453_) +PyJs_anonymous_1452_._set_name(u'anonymous') +PyJs_Object_1454_ = Js({u'./_is-array':Js(161.0),u'./_is-object':Js(162.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1455_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'speciesConstructor', u'require', u'exports', u'module']) + var.put(u'speciesConstructor', var.get(u'require')(Js(u'./_array-species-constructor'))) + @Js + def PyJs_anonymous_1456_(original, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'original':original, u'arguments':arguments}, var) + var.registers([u'length', u'original']) + return var.get(u'speciesConstructor')(var.get(u'original')).create(var.get(u'length')) + PyJs_anonymous_1456_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1456_) +PyJs_anonymous_1455_._set_name(u'anonymous') +PyJs_Object_1457_ = Js({u'./_array-species-constructor':Js(136.0)}) +@Js +def PyJs_anonymous_1458_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'cof', u'module', u'tryGet', u'TAG', u'ARG']) + var.put(u'cof', var.get(u'require')(Js(u'./_cof'))) + var.put(u'TAG', var.get(u'require')(Js(u'./_wks'))(Js(u'toStringTag'))) + @Js + def PyJs_anonymous_1459_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'arguments') + PyJs_anonymous_1459_._set_name(u'anonymous') + var.put(u'ARG', (var.get(u'cof')(PyJs_anonymous_1459_())==Js(u'Arguments'))) + @Js + def PyJs_anonymous_1460_(it, key, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'key':key, u'arguments':arguments}, var) + var.registers([u'it', u'key']) + try: + return var.get(u'it').get(var.get(u'key')) + except PyJsException as PyJsTempException: + PyJsHolder_65_48759406 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_48759406 is not None: + var.own[u'e'] = PyJsHolder_65_48759406 + else: + del var.own[u'e'] + del PyJsHolder_65_48759406 + PyJs_anonymous_1460_._set_name(u'anonymous') + var.put(u'tryGet', PyJs_anonymous_1460_) + @Js + def PyJs_anonymous_1461_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'B', u'T', u'O', u'it']) + pass + def PyJs_LONG_1462_(var=var): + return (Js(u'Null') if PyJsStrictEq(var.get(u'it'),var.get(u"null")) else (var.get(u'T') if (var.put(u'T', var.get(u'tryGet')(var.put(u'O', var.get(u'Object')(var.get(u'it'))), var.get(u'TAG'))).typeof()==Js(u'string')) else (var.get(u'cof')(var.get(u'O')) if var.get(u'ARG') else (Js(u'Arguments') if ((var.put(u'B', var.get(u'cof')(var.get(u'O')))==Js(u'Object')) and (var.get(u'O').get(u'callee').typeof()==Js(u'function'))) else var.get(u'B'))))) + return (Js(u'Undefined') if PyJsStrictEq(var.get(u'it'),var.get(u'undefined')) else PyJs_LONG_1462_()) + PyJs_anonymous_1461_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1461_) +PyJs_anonymous_1458_._set_name(u'anonymous') +PyJs_Object_1463_ = Js({u'./_cof':Js(139.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1464_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'toString', u'exports', u'module']) + PyJs_Object_1465_ = Js({}) + var.put(u'toString', PyJs_Object_1465_.get(u'toString')) + @Js + def PyJs_anonymous_1466_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'toString').callprop(u'call', var.get(u'it')).callprop(u'slice', Js(8.0), (-Js(1.0))) + PyJs_anonymous_1466_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1466_) +PyJs_anonymous_1464_._set_name(u'anonymous') +PyJs_Object_1467_ = Js({}) +@Js +def PyJs_anonymous_1468_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'fastKey', u'exports', u'forOf', u'anInstance', u'defined', u'$iterDefine', u'create', u'ctx', u'module', u'setSpecies', u'getEntry', u'step', u'redefineAll', u'DESCRIPTORS', u'require', u'dP', u'SIZE']) + Js(u'use strict') + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'create', var.get(u'require')(Js(u'./_object-create'))) + var.put(u'redefineAll', var.get(u'require')(Js(u'./_redefine-all'))) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'anInstance', var.get(u'require')(Js(u'./_an-instance'))) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + var.put(u'$iterDefine', var.get(u'require')(Js(u'./_iter-define'))) + var.put(u'step', var.get(u'require')(Js(u'./_iter-step'))) + var.put(u'setSpecies', var.get(u'require')(Js(u'./_set-species'))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + var.put(u'fastKey', var.get(u'require')(Js(u'./_meta')).get(u'fastKey')) + var.put(u'SIZE', (Js(u'_s') if var.get(u'DESCRIPTORS') else Js(u'size'))) + @Js + def PyJs_anonymous_1469_(that, key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'that':that}, var) + var.registers([u'index', u'that', u'key', u'entry']) + var.put(u'index', var.get(u'fastKey')(var.get(u'key'))) + if PyJsStrictNeq(var.get(u'index'),Js(u'F')): + return var.get(u'that').get(u'_i').get(var.get(u'index')) + #for JS loop + var.put(u'entry', var.get(u'that').get(u'_f')) + while var.get(u'entry'): + try: + if (var.get(u'entry').get(u'k')==var.get(u'key')): + return var.get(u'entry') + finally: + var.put(u'entry', var.get(u'entry').get(u'n')) + PyJs_anonymous_1469_._set_name(u'anonymous') + var.put(u'getEntry', PyJs_anonymous_1469_) + @Js + def PyJs_anonymous_1471_(wrapper, NAME, IS_MAP, ADDER, this, arguments, var=var): + var = Scope({u'ADDER':ADDER, u'this':this, u'arguments':arguments, u'IS_MAP':IS_MAP, u'wrapper':wrapper, u'NAME':NAME}, var) + var.registers([u'ADDER', u'C', u'NAME', u'wrapper', u'IS_MAP']) + @Js + def PyJs_anonymous_1472_(that, iterable, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterable':iterable, u'that':that}, var) + var.registers([u'iterable', u'that']) + var.get(u'anInstance')(var.get(u'that'), var.get(u'C'), var.get(u'NAME'), Js(u'_i')) + var.get(u'that').put(u'_i', var.get(u'create')(var.get(u"null"))) + var.get(u'that').put(u'_f', var.get(u'undefined')) + var.get(u'that').put(u'_l', var.get(u'undefined')) + var.get(u'that').put(var.get(u'SIZE'), Js(0.0)) + if (var.get(u'iterable')!=var.get(u'undefined')): + var.get(u'forOf')(var.get(u'iterable'), var.get(u'IS_MAP'), var.get(u'that').get(var.get(u'ADDER')), var.get(u'that')) + PyJs_anonymous_1472_._set_name(u'anonymous') + var.put(u'C', var.get(u'wrapper')(PyJs_anonymous_1472_)) + @Js + def PyJs_clear_1474_(this, arguments, var=var): + var = Scope({u'this':this, u'clear':PyJs_clear_1474_, u'arguments':arguments}, var) + var.registers([u'entry', u'data', u'that']) + #for JS loop + var.put(u'that', var.get(u"this")) + var.put(u'data', var.get(u'that').get(u'_i')) + var.put(u'entry', var.get(u'that').get(u'_f')) + while var.get(u'entry'): + try: + var.get(u'entry').put(u'r', var.get(u'true')) + if var.get(u'entry').get(u'p'): + var.get(u'entry').put(u'p', var.get(u'entry').get(u'p').put(u'n', var.get(u'undefined'))) + var.get(u'data').delete(var.get(u'entry').get(u'i')) + finally: + var.put(u'entry', var.get(u'entry').get(u'n')) + var.get(u'that').put(u'_f', var.get(u'that').put(u'_l', var.get(u'undefined'))) + var.get(u'that').put(var.get(u'SIZE'), Js(0.0)) + PyJs_clear_1474_._set_name(u'clear') + @Js + def PyJs_anonymous_1475_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'prev', u'entry', u'next', u'key', u'that']) + var.put(u'that', var.get(u"this")) + var.put(u'entry', var.get(u'getEntry')(var.get(u'that'), var.get(u'key'))) + if var.get(u'entry'): + var.put(u'next', var.get(u'entry').get(u'n')) + var.put(u'prev', var.get(u'entry').get(u'p')) + var.get(u'that').get(u'_i').delete(var.get(u'entry').get(u'i')) + var.get(u'entry').put(u'r', var.get(u'true')) + if var.get(u'prev'): + var.get(u'prev').put(u'n', var.get(u'next')) + if var.get(u'next'): + var.get(u'next').put(u'p', var.get(u'prev')) + if (var.get(u'that').get(u'_f')==var.get(u'entry')): + var.get(u'that').put(u'_f', var.get(u'next')) + if (var.get(u'that').get(u'_l')==var.get(u'entry')): + var.get(u'that').put(u'_l', var.get(u'prev')) + (var.get(u'that').put(var.get(u'SIZE'),Js(var.get(u'that').get(var.get(u'SIZE')).to_number())-Js(1))+Js(1)) + return var.get(u'entry').neg().neg() + PyJs_anonymous_1475_._set_name(u'anonymous') + @Js + def PyJs_forEach_1476_(callbackfn, this, arguments, var=var): + var = Scope({u'this':this, u'callbackfn':callbackfn, u'arguments':arguments, u'forEach':PyJs_forEach_1476_}, var) + var.registers([u'entry', u'callbackfn', u'f']) + var.get(u'anInstance')(var.get(u"this"), var.get(u'C'), Js(u'forEach')) + var.put(u'f', var.get(u'ctx')(var.get(u'callbackfn'), (var.get(u'arguments').get(u'1') if (var.get(u'arguments').get(u'length')>Js(1.0)) else var.get(u'undefined')), Js(3.0))) + while var.put(u'entry', (var.get(u'entry').get(u'n') if var.get(u'entry') else var.get(u"this").get(u'_f'))): + var.get(u'f')(var.get(u'entry').get(u'v'), var.get(u'entry').get(u'k'), var.get(u"this")) + while (var.get(u'entry') and var.get(u'entry').get(u'r')): + var.put(u'entry', var.get(u'entry').get(u'p')) + PyJs_forEach_1476_._set_name(u'forEach') + @Js + def PyJs_has_1477_(key, this, arguments, var=var): + var = Scope({u'this':this, u'has':PyJs_has_1477_, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'getEntry')(var.get(u"this"), var.get(u'key')).neg().neg() + PyJs_has_1477_._set_name(u'has') + PyJs_Object_1473_ = Js({u'clear':PyJs_clear_1474_,u'delete':PyJs_anonymous_1475_,u'forEach':PyJs_forEach_1476_,u'has':PyJs_has_1477_}) + var.get(u'redefineAll')(var.get(u'C').get(u'prototype'), PyJs_Object_1473_) + if var.get(u'DESCRIPTORS'): + @Js + def PyJs_anonymous_1479_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'defined')(var.get(u"this").get(var.get(u'SIZE'))) + PyJs_anonymous_1479_._set_name(u'anonymous') + PyJs_Object_1478_ = Js({u'get':PyJs_anonymous_1479_}) + var.get(u'dP')(var.get(u'C').get(u'prototype'), Js(u'size'), PyJs_Object_1478_) + return var.get(u'C') + PyJs_anonymous_1471_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1480_(that, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value, u'key':key, u'that':that}, var) + var.registers([u'index', u'that', u'value', u'key', u'entry', u'prev']) + var.put(u'entry', var.get(u'getEntry')(var.get(u'that'), var.get(u'key'))) + if var.get(u'entry'): + var.get(u'entry').put(u'v', var.get(u'value')) + else: + PyJs_Object_1481_ = Js({u'i':var.put(u'index', var.get(u'fastKey')(var.get(u'key'), var.get(u'true'))),u'k':var.get(u'key'),u'v':var.get(u'value'),u'p':var.put(u'prev', var.get(u'that').get(u'_l')),u'n':var.get(u'undefined'),u'r':Js(False)}) + var.get(u'that').put(u'_l', var.put(u'entry', PyJs_Object_1481_)) + if var.get(u'that').get(u'_f').neg(): + var.get(u'that').put(u'_f', var.get(u'entry')) + if var.get(u'prev'): + var.get(u'prev').put(u'n', var.get(u'entry')) + (var.get(u'that').put(var.get(u'SIZE'),Js(var.get(u'that').get(var.get(u'SIZE')).to_number())+Js(1))-Js(1)) + if PyJsStrictNeq(var.get(u'index'),Js(u'F')): + var.get(u'that').get(u'_i').put(var.get(u'index'), var.get(u'entry')) + return var.get(u'that') + PyJs_anonymous_1480_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1482_(C, NAME, IS_MAP, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'C':C, u'NAME':NAME, u'IS_MAP':IS_MAP}, var) + var.registers([u'C', u'NAME', u'IS_MAP']) + @Js + def PyJs_anonymous_1483_(iterated, kind, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments, u'iterated':iterated}, var) + var.registers([u'kind', u'iterated']) + var.get(u"this").put(u'_t', var.get(u'iterated')) + var.get(u"this").put(u'_k', var.get(u'kind')) + var.get(u"this").put(u'_l', var.get(u'undefined')) + PyJs_anonymous_1483_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1484_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'entry', u'kind', u'that']) + var.put(u'that', var.get(u"this")) + var.put(u'kind', var.get(u'that').get(u'_k')) + var.put(u'entry', var.get(u'that').get(u'_l')) + while (var.get(u'entry') and var.get(u'entry').get(u'r')): + var.put(u'entry', var.get(u'entry').get(u'p')) + if (var.get(u'that').get(u'_t').neg() or var.get(u'that').put(u'_l', var.put(u'entry', (var.get(u'entry').get(u'n') if var.get(u'entry') else var.get(u'that').get(u'_t').get(u'_f')))).neg()): + var.get(u'that').put(u'_t', var.get(u'undefined')) + return var.get(u'step')(Js(1.0)) + if (var.get(u'kind')==Js(u'keys')): + return var.get(u'step')(Js(0.0), var.get(u'entry').get(u'k')) + if (var.get(u'kind')==Js(u'values')): + return var.get(u'step')(Js(0.0), var.get(u'entry').get(u'v')) + return var.get(u'step')(Js(0.0), Js([var.get(u'entry').get(u'k'), var.get(u'entry').get(u'v')])) + PyJs_anonymous_1484_._set_name(u'anonymous') + var.get(u'$iterDefine')(var.get(u'C'), var.get(u'NAME'), PyJs_anonymous_1483_, PyJs_anonymous_1484_, (Js(u'entries') if var.get(u'IS_MAP') else Js(u'values')), var.get(u'IS_MAP').neg(), var.get(u'true')) + var.get(u'setSpecies')(var.get(u'NAME')) + PyJs_anonymous_1482_._set_name(u'anonymous') + PyJs_Object_1470_ = Js({u'getConstructor':PyJs_anonymous_1471_,u'def':PyJs_anonymous_1480_,u'getEntry':var.get(u'getEntry'),u'setStrong':PyJs_anonymous_1482_}) + var.get(u'module').put(u'exports', PyJs_Object_1470_) +PyJs_anonymous_1468_._set_name(u'anonymous') +PyJs_Object_1485_ = Js({u'./_an-instance':Js(131.0),u'./_ctx':Js(145.0),u'./_defined':Js(146.0),u'./_descriptors':Js(147.0),u'./_for-of':Js(153.0),u'./_iter-define':Js(165.0),u'./_iter-step':Js(166.0),u'./_meta':Js(170.0),u'./_object-create':Js(172.0),u'./_object-dp':Js(173.0),u'./_redefine-all':Js(185.0),u'./_set-species':Js(188.0)}) +@Js +def PyJs_anonymous_1486_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'from', u'require', u'classof', u'exports', u'module']) + var.put(u'classof', var.get(u'require')(Js(u'./_classof'))) + var.put(u'from', var.get(u'require')(Js(u'./_array-from-iterable'))) + @Js + def PyJs_anonymous_1487_(NAME, this, arguments, var=var): + var = Scope({u'this':this, u'NAME':NAME, u'arguments':arguments}, var) + var.registers([u'NAME']) + @Js + def PyJs_toJSON_1488_(this, arguments, var=var): + var = Scope({u'this':this, u'toJSON':PyJs_toJSON_1488_, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u'classof')(var.get(u"this"))!=var.get(u'NAME')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'NAME')+Js(u"#toJSON isn't generic")))) + raise PyJsTempException + return var.get(u'from')(var.get(u"this")) + PyJs_toJSON_1488_._set_name(u'toJSON') + return PyJs_toJSON_1488_ + PyJs_anonymous_1487_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1487_) +PyJs_anonymous_1486_._set_name(u'anonymous') +PyJs_Object_1489_ = Js({u'./_array-from-iterable':Js(133.0),u'./_classof':Js(138.0)}) +@Js +def PyJs_anonymous_1490_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'forOf', u'findUncaughtFrozen', u'createArrayMethod', u'anInstance', u'require', u'arrayFindIndex', u'module', u'id', u'$has', u'anObject', u'uncaughtFrozenStore', u'UncaughtFrozenStore', u'redefineAll', u'getWeak', u'isObject', u'arrayFind']) + Js(u'use strict') + var.put(u'redefineAll', var.get(u'require')(Js(u'./_redefine-all'))) + var.put(u'getWeak', var.get(u'require')(Js(u'./_meta')).get(u'getWeak')) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'anInstance', var.get(u'require')(Js(u'./_an-instance'))) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + var.put(u'createArrayMethod', var.get(u'require')(Js(u'./_array-methods'))) + var.put(u'$has', var.get(u'require')(Js(u'./_has'))) + var.put(u'arrayFind', var.get(u'createArrayMethod')(Js(5.0))) + var.put(u'arrayFindIndex', var.get(u'createArrayMethod')(Js(6.0))) + var.put(u'id', Js(0.0)) + @Js + def PyJs_anonymous_1491_(that, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'that':that}, var) + var.registers([u'that']) + return (var.get(u'that').get(u'_l') or var.get(u'that').put(u'_l', var.get(u'UncaughtFrozenStore').create())) + PyJs_anonymous_1491_._set_name(u'anonymous') + var.put(u'uncaughtFrozenStore', PyJs_anonymous_1491_) + @Js + def PyJs_anonymous_1492_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'a', Js([])) + PyJs_anonymous_1492_._set_name(u'anonymous') + var.put(u'UncaughtFrozenStore', PyJs_anonymous_1492_) + @Js + def PyJs_anonymous_1493_(store, key, this, arguments, var=var): + var = Scope({u'this':this, u'key':key, u'store':store, u'arguments':arguments}, var) + var.registers([u'key', u'store']) + @Js + def PyJs_anonymous_1494_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return PyJsStrictEq(var.get(u'it').get(u'0'),var.get(u'key')) + PyJs_anonymous_1494_._set_name(u'anonymous') + return var.get(u'arrayFind')(var.get(u'store').get(u'a'), PyJs_anonymous_1494_) + PyJs_anonymous_1493_._set_name(u'anonymous') + var.put(u'findUncaughtFrozen', PyJs_anonymous_1493_) + @Js + def PyJs_anonymous_1496_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'entry', u'key']) + var.put(u'entry', var.get(u'findUncaughtFrozen')(var.get(u"this"), var.get(u'key'))) + if var.get(u'entry'): + return var.get(u'entry').get(u'1') + PyJs_anonymous_1496_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1497_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u'findUncaughtFrozen')(var.get(u"this"), var.get(u'key')).neg().neg() + PyJs_anonymous_1497_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1498_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'entry', u'value', u'key']) + var.put(u'entry', var.get(u'findUncaughtFrozen')(var.get(u"this"), var.get(u'key'))) + if var.get(u'entry'): + var.get(u'entry').put(u'1', var.get(u'value')) + else: + var.get(u"this").get(u'a').callprop(u'push', Js([var.get(u'key'), var.get(u'value')])) + PyJs_anonymous_1498_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1499_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'index', u'key']) + @Js + def PyJs_anonymous_1500_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return PyJsStrictEq(var.get(u'it').get(u'0'),var.get(u'key')) + PyJs_anonymous_1500_._set_name(u'anonymous') + var.put(u'index', var.get(u'arrayFindIndex')(var.get(u"this").get(u'a'), PyJs_anonymous_1500_)) + if (~var.get(u'index')): + var.get(u"this").get(u'a').callprop(u'splice', var.get(u'index'), Js(1.0)) + return (~var.get(u'index')).neg().neg() + PyJs_anonymous_1499_._set_name(u'anonymous') + PyJs_Object_1495_ = Js({u'get':PyJs_anonymous_1496_,u'has':PyJs_anonymous_1497_,u'set':PyJs_anonymous_1498_,u'delete':PyJs_anonymous_1499_}) + var.get(u'UncaughtFrozenStore').put(u'prototype', PyJs_Object_1495_) + @Js + def PyJs_anonymous_1502_(wrapper, NAME, IS_MAP, ADDER, this, arguments, var=var): + var = Scope({u'ADDER':ADDER, u'this':this, u'arguments':arguments, u'IS_MAP':IS_MAP, u'wrapper':wrapper, u'NAME':NAME}, var) + var.registers([u'ADDER', u'C', u'NAME', u'wrapper', u'IS_MAP']) + @Js + def PyJs_anonymous_1503_(that, iterable, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterable':iterable, u'that':that}, var) + var.registers([u'iterable', u'that']) + var.get(u'anInstance')(var.get(u'that'), var.get(u'C'), var.get(u'NAME'), Js(u'_i')) + var.get(u'that').put(u'_i', (var.put(u'id',Js(var.get(u'id').to_number())+Js(1))-Js(1))) + var.get(u'that').put(u'_l', var.get(u'undefined')) + if (var.get(u'iterable')!=var.get(u'undefined')): + var.get(u'forOf')(var.get(u'iterable'), var.get(u'IS_MAP'), var.get(u'that').get(var.get(u'ADDER')), var.get(u'that')) + PyJs_anonymous_1503_._set_name(u'anonymous') + var.put(u'C', var.get(u'wrapper')(PyJs_anonymous_1503_)) + @Js + def PyJs_anonymous_1505_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'data', u'key']) + if var.get(u'isObject')(var.get(u'key')).neg(): + return Js(False) + var.put(u'data', var.get(u'getWeak')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + return var.get(u'uncaughtFrozenStore')(var.get(u"this")).callprop(u'delete', var.get(u'key')) + return ((var.get(u'data') and var.get(u'$has')(var.get(u'data'), var.get(u"this").get(u'_i'))) and var.get(u'data').delete(var.get(u"this").get(u'_i'))) + PyJs_anonymous_1505_._set_name(u'anonymous') + @Js + def PyJs_has_1506_(key, this, arguments, var=var): + var = Scope({u'this':this, u'has':PyJs_has_1506_, u'arguments':arguments, u'key':key}, var) + var.registers([u'data', u'key']) + if var.get(u'isObject')(var.get(u'key')).neg(): + return Js(False) + var.put(u'data', var.get(u'getWeak')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + return var.get(u'uncaughtFrozenStore')(var.get(u"this")).callprop(u'has', var.get(u'key')) + return (var.get(u'data') and var.get(u'$has')(var.get(u'data'), var.get(u"this").get(u'_i'))) + PyJs_has_1506_._set_name(u'has') + PyJs_Object_1504_ = Js({u'delete':PyJs_anonymous_1505_,u'has':PyJs_has_1506_}) + var.get(u'redefineAll')(var.get(u'C').get(u'prototype'), PyJs_Object_1504_) + return var.get(u'C') + PyJs_anonymous_1502_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1507_(that, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value, u'key':key, u'that':that}, var) + var.registers([u'data', u'value', u'key', u'that']) + var.put(u'data', var.get(u'getWeak')(var.get(u'anObject')(var.get(u'key')), var.get(u'true'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + var.get(u'uncaughtFrozenStore')(var.get(u'that')).callprop(u'set', var.get(u'key'), var.get(u'value')) + else: + var.get(u'data').put(var.get(u'that').get(u'_i'), var.get(u'value')) + return var.get(u'that') + PyJs_anonymous_1507_._set_name(u'anonymous') + PyJs_Object_1501_ = Js({u'getConstructor':PyJs_anonymous_1502_,u'def':PyJs_anonymous_1507_,u'ufstore':var.get(u'uncaughtFrozenStore')}) + var.get(u'module').put(u'exports', PyJs_Object_1501_) +PyJs_anonymous_1490_._set_name(u'anonymous') +PyJs_Object_1508_ = Js({u'./_an-instance':Js(131.0),u'./_an-object':Js(132.0),u'./_array-methods':Js(135.0),u'./_for-of':Js(153.0),u'./_has':Js(155.0),u'./_is-object':Js(162.0),u'./_meta':Js(170.0),u'./_redefine-all':Js(185.0)}) +@Js +def PyJs_anonymous_1509_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'fails', u'forOf', u'hide', u'anInstance', u'$export', u'setToStringTag', u'global', u'require', u'module', u'DESCRIPTORS', u'meta', u'redefineAll', u'each', u'isObject', u'dP']) + Js(u'use strict') + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'meta', var.get(u'require')(Js(u'./_meta'))) + var.put(u'fails', var.get(u'require')(Js(u'./_fails'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'redefineAll', var.get(u'require')(Js(u'./_redefine-all'))) + var.put(u'forOf', var.get(u'require')(Js(u'./_for-of'))) + var.put(u'anInstance', var.get(u'require')(Js(u'./_an-instance'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'each', var.get(u'require')(Js(u'./_array-methods'))(Js(0.0))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + @Js + def PyJs_anonymous_1510_(NAME, wrapper, methods, common, IS_MAP, IS_WEAK, this, arguments, var=var): + var = Scope({u'NAME':NAME, u'this':this, u'arguments':arguments, u'IS_MAP':IS_MAP, u'wrapper':wrapper, u'IS_WEAK':IS_WEAK, u'common':common, u'methods':methods}, var) + var.registers([u'C', u'wrapper', u'NAME', u'proto', u'IS_MAP', u'O', u'common', u'Base', u'IS_WEAK', u'ADDER', u'methods']) + var.put(u'Base', var.get(u'global').get(var.get(u'NAME'))) + var.put(u'C', var.get(u'Base')) + var.put(u'ADDER', (Js(u'set') if var.get(u'IS_MAP') else Js(u'add'))) + var.put(u'proto', (var.get(u'C') and var.get(u'C').get(u'prototype'))) + PyJs_Object_1511_ = Js({}) + var.put(u'O', PyJs_Object_1511_) + @Js + def PyJs_anonymous_1512_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'C').create().callprop(u'entries').callprop(u'next') + PyJs_anonymous_1512_._set_name(u'anonymous') + if ((var.get(u'DESCRIPTORS').neg() or (var.get(u'C',throw=False).typeof()!=Js(u'function'))) or (var.get(u'IS_WEAK') or (var.get(u'proto').get(u'forEach') and var.get(u'fails')(PyJs_anonymous_1512_).neg())).neg()): + var.put(u'C', var.get(u'common').callprop(u'getConstructor', var.get(u'wrapper'), var.get(u'NAME'), var.get(u'IS_MAP'), var.get(u'ADDER'))) + var.get(u'redefineAll')(var.get(u'C').get(u'prototype'), var.get(u'methods')) + var.get(u'meta').put(u'NEED', var.get(u'true')) + else: + @Js + def PyJs_anonymous_1513_(target, iterable, this, arguments, var=var): + var = Scope({u'this':this, u'target':target, u'iterable':iterable, u'arguments':arguments}, var) + var.registers([u'target', u'iterable']) + var.get(u'anInstance')(var.get(u'target'), var.get(u'C'), var.get(u'NAME'), Js(u'_c')) + var.get(u'target').put(u'_c', var.get(u'Base').create()) + if (var.get(u'iterable')!=var.get(u'undefined')): + var.get(u'forOf')(var.get(u'iterable'), var.get(u'IS_MAP'), var.get(u'target').get(var.get(u'ADDER')), var.get(u'target')) + PyJs_anonymous_1513_._set_name(u'anonymous') + var.put(u'C', var.get(u'wrapper')(PyJs_anonymous_1513_)) + @Js + def PyJs_anonymous_1514_(KEY, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'KEY':KEY}, var) + var.registers([u'IS_ADDER', u'KEY']) + var.put(u'IS_ADDER', ((var.get(u'KEY')==Js(u'add')) or (var.get(u'KEY')==Js(u'set')))) + if (var.get(u'proto').contains(var.get(u'KEY')) and (var.get(u'IS_WEAK') and (var.get(u'KEY')==Js(u'clear'))).neg()): + @Js + def PyJs_anonymous_1515_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u'result']) + var.get(u'anInstance')(var.get(u"this"), var.get(u'C'), var.get(u'KEY')) + if ((var.get(u'IS_ADDER').neg() and var.get(u'IS_WEAK')) and var.get(u'isObject')(var.get(u'a')).neg()): + return (var.get(u'undefined') if (var.get(u'KEY')==Js(u'get')) else Js(False)) + var.put(u'result', var.get(u"this").get(u'_c').callprop(var.get(u'KEY'), (Js(0.0) if PyJsStrictEq(var.get(u'a'),Js(0.0)) else var.get(u'a')), var.get(u'b'))) + return (var.get(u"this") if var.get(u'IS_ADDER') else var.get(u'result')) + PyJs_anonymous_1515_._set_name(u'anonymous') + var.get(u'hide')(var.get(u'C').get(u'prototype'), var.get(u'KEY'), PyJs_anonymous_1515_) + PyJs_anonymous_1514_._set_name(u'anonymous') + var.get(u'each')(Js(u'add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON').callprop(u'split', Js(u',')), PyJs_anonymous_1514_) + if var.get(u'proto').contains(Js(u'size')): + @Js + def PyJs_anonymous_1517_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'_c').get(u'size') + PyJs_anonymous_1517_._set_name(u'anonymous') + PyJs_Object_1516_ = Js({u'get':PyJs_anonymous_1517_}) + var.get(u'dP')(var.get(u'C').get(u'prototype'), Js(u'size'), PyJs_Object_1516_) + var.get(u'setToStringTag')(var.get(u'C'), var.get(u'NAME')) + var.get(u'O').put(var.get(u'NAME'), var.get(u'C')) + var.get(u'$export')(((var.get(u'$export').get(u'G')+var.get(u'$export').get(u'W'))+var.get(u'$export').get(u'F')), var.get(u'O')) + if var.get(u'IS_WEAK').neg(): + var.get(u'common').callprop(u'setStrong', var.get(u'C'), var.get(u'NAME'), var.get(u'IS_MAP')) + return var.get(u'C') + PyJs_anonymous_1510_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1510_) +PyJs_anonymous_1509_._set_name(u'anonymous') +PyJs_Object_1518_ = Js({u'./_an-instance':Js(131.0),u'./_array-methods':Js(135.0),u'./_descriptors':Js(147.0),u'./_export':Js(151.0),u'./_fails':Js(152.0),u'./_for-of':Js(153.0),u'./_global':Js(154.0),u'./_hide':Js(156.0),u'./_is-object':Js(162.0),u'./_meta':Js(170.0),u'./_object-dp':Js(173.0),u'./_redefine-all':Js(185.0),u'./_set-to-string-tag':Js(189.0)}) +@Js +def PyJs_anonymous_1519_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'require', u'exports', u'module']) + PyJs_Object_1520_ = Js({u'version':Js(u'2.4.0')}) + var.put(u'core', var.get(u'module').put(u'exports', PyJs_Object_1520_)) + if (var.get(u'__e',throw=False).typeof()==Js(u'number')): + var.put(u'__e', var.get(u'core')) +PyJs_anonymous_1519_._set_name(u'anonymous') +PyJs_Object_1521_ = Js({}) +@Js +def PyJs_anonymous_1522_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'aFunction', u'require', u'exports', u'module']) + var.put(u'aFunction', var.get(u'require')(Js(u'./_a-function'))) + @Js + def PyJs_anonymous_1523_(fn, that, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments, u'fn':fn, u'that':that}, var) + var.registers([u'length', u'fn', u'that']) + var.get(u'aFunction')(var.get(u'fn')) + if PyJsStrictEq(var.get(u'that'),var.get(u'undefined')): + return var.get(u'fn') + while 1: + SWITCHED = False + CONDITION = (var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + @Js + def PyJs_anonymous_1524_(a, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'arguments':arguments}, var) + var.registers([u'a']) + return var.get(u'fn').callprop(u'call', var.get(u'that'), var.get(u'a')) + PyJs_anonymous_1524_._set_name(u'anonymous') + return PyJs_anonymous_1524_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + @Js + def PyJs_anonymous_1525_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b']) + return var.get(u'fn').callprop(u'call', var.get(u'that'), var.get(u'a'), var.get(u'b')) + PyJs_anonymous_1525_._set_name(u'anonymous') + return PyJs_anonymous_1525_ + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + @Js + def PyJs_anonymous_1526_(a, b, c, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'c':c, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'c', u'b']) + return var.get(u'fn').callprop(u'call', var.get(u'that'), var.get(u'a'), var.get(u'b'), var.get(u'c')) + PyJs_anonymous_1526_._set_name(u'anonymous') + return PyJs_anonymous_1526_ + SWITCHED = True + break + @Js + def PyJs_anonymous_1527_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'fn').callprop(u'apply', var.get(u'that'), var.get(u'arguments')) + PyJs_anonymous_1527_._set_name(u'anonymous') + return PyJs_anonymous_1527_ + PyJs_anonymous_1523_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1523_) +PyJs_anonymous_1522_._set_name(u'anonymous') +PyJs_Object_1528_ = Js({u'./_a-function':Js(129.0)}) +@Js +def PyJs_anonymous_1529_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1530_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (var.get(u'it')==var.get(u'undefined')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((Js(u"Can't call method on ")+var.get(u'it')))) + raise PyJsTempException + return var.get(u'it') + PyJs_anonymous_1530_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1530_) +PyJs_anonymous_1529_._set_name(u'anonymous') +PyJs_Object_1531_ = Js({}) +@Js +def PyJs_anonymous_1532_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1533_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1534_ = Js({}) + @Js + def PyJs_anonymous_1536_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(7.0) + PyJs_anonymous_1536_._set_name(u'anonymous') + PyJs_Object_1535_ = Js({u'get':PyJs_anonymous_1536_}) + return (var.get(u'Object').callprop(u'defineProperty', PyJs_Object_1534_, Js(u'a'), PyJs_Object_1535_).get(u'a')!=Js(7.0)) + PyJs_anonymous_1533_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1533_).neg()) +PyJs_anonymous_1532_._set_name(u'anonymous') +PyJs_Object_1537_ = Js({u'./_fails':Js(152.0)}) +@Js +def PyJs_anonymous_1538_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'is', u'module', u'isObject', u'document', u'require']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'document', var.get(u'require')(Js(u'./_global')).get(u'document')) + var.put(u'is', (var.get(u'isObject')(var.get(u'document')) and var.get(u'isObject')(var.get(u'document').get(u'createElement')))) + @Js + def PyJs_anonymous_1539_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + PyJs_Object_1540_ = Js({}) + return (var.get(u'document').callprop(u'createElement', var.get(u'it')) if var.get(u'is') else PyJs_Object_1540_) + PyJs_anonymous_1539_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1539_) +PyJs_anonymous_1538_._set_name(u'anonymous') +PyJs_Object_1541_ = Js({u'./_global':Js(154.0),u'./_is-object':Js(162.0)}) +@Js +def PyJs_anonymous_1542_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', Js(u'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf').callprop(u'split', Js(u','))) +PyJs_anonymous_1542_._set_name(u'anonymous') +PyJs_Object_1543_ = Js({}) +@Js +def PyJs_anonymous_1544_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'pIE', u'module', u'gOPS', u'getKeys']) + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'gOPS', var.get(u'require')(Js(u'./_object-gops'))) + var.put(u'pIE', var.get(u'require')(Js(u'./_object-pie'))) + @Js + def PyJs_anonymous_1545_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'getSymbols', u'i', u'it', u'symbols', u'isEnum', u'result', u'key']) + var.put(u'result', var.get(u'getKeys')(var.get(u'it'))) + var.put(u'getSymbols', var.get(u'gOPS').get(u'f')) + if var.get(u'getSymbols'): + var.put(u'symbols', var.get(u'getSymbols')(var.get(u'it'))) + var.put(u'isEnum', var.get(u'pIE').get(u'f')) + var.put(u'i', Js(0.0)) + while (var.get(u'symbols').get(u'length')>var.get(u'i')): + if var.get(u'isEnum').callprop(u'call', var.get(u'it'), var.put(u'key', var.get(u'symbols').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJs_anonymous_1545_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1545_) +PyJs_anonymous_1544_._set_name(u'anonymous') +PyJs_Object_1546_ = Js({u'./_object-gops':Js(178.0),u'./_object-keys':Js(181.0),u'./_object-pie':Js(182.0)}) +@Js +def PyJs_anonymous_1547_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'exports', u'hide', u'$export', u'require', u'global', u'ctx', u'module', u'PROTOTYPE']) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'PROTOTYPE', Js(u'prototype')) + @Js + def PyJs_anonymous_1548_(type, name, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'type':type, u'name':name, u'arguments':arguments}, var) + var.registers([u'IS_STATIC', u'IS_WRAP', u'exports', u'IS_GLOBAL', u'target', u'expProto', u'name', u'source', u'IS_PROTO', u'key', u'own', u'IS_FORCED', u'type', u'IS_BIND', u'out']) + var.put(u'IS_FORCED', (var.get(u'type')&var.get(u'$export').get(u'F'))) + var.put(u'IS_GLOBAL', (var.get(u'type')&var.get(u'$export').get(u'G'))) + var.put(u'IS_STATIC', (var.get(u'type')&var.get(u'$export').get(u'S'))) + var.put(u'IS_PROTO', (var.get(u'type')&var.get(u'$export').get(u'P'))) + var.put(u'IS_BIND', (var.get(u'type')&var.get(u'$export').get(u'B'))) + var.put(u'IS_WRAP', (var.get(u'type')&var.get(u'$export').get(u'W'))) + PyJs_Object_1549_ = Js({}) + var.put(u'exports', (var.get(u'core') if var.get(u'IS_GLOBAL') else (var.get(u'core').get(var.get(u'name')) or var.get(u'core').put(var.get(u'name'), PyJs_Object_1549_)))) + var.put(u'expProto', var.get(u'exports').get(var.get(u'PROTOTYPE'))) + PyJs_Object_1550_ = Js({}) + var.put(u'target', (var.get(u'global') if var.get(u'IS_GLOBAL') else (var.get(u'global').get(var.get(u'name')) if var.get(u'IS_STATIC') else (var.get(u'global').get(var.get(u'name')) or PyJs_Object_1550_).get(var.get(u'PROTOTYPE'))))) + if var.get(u'IS_GLOBAL'): + var.put(u'source', var.get(u'name')) + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + var.put(u'own', ((var.get(u'IS_FORCED').neg() and var.get(u'target')) and PyJsStrictNeq(var.get(u'target').get(var.get(u'key')),var.get(u'undefined')))) + if (var.get(u'own') and var.get(u'exports').contains(var.get(u'key'))): + continue + var.put(u'out', (var.get(u'target').get(var.get(u'key')) if var.get(u'own') else var.get(u'source').get(var.get(u'key')))) + def PyJs_LONG_1553_(var=var): + @Js + def PyJs_anonymous_1551_(C, this, arguments, var=var): + var = Scope({u'this':this, u'C':C, u'arguments':arguments}, var) + var.registers([u'C', u'F']) + @Js + def PyJs_anonymous_1552_(a, b, c, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'c':c, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'c', u'b']) + if var.get(u"this").instanceof(var.get(u'C')): + while 1: + SWITCHED = False + CONDITION = (var.get(u'arguments').get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(0.0)): + SWITCHED = True + return var.get(u'C').create() + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + return var.get(u'C').create(var.get(u'a')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + return var.get(u'C').create(var.get(u'a'), var.get(u'b')) + SWITCHED = True + break + return var.get(u'C').create(var.get(u'a'), var.get(u'b'), var.get(u'c')) + return var.get(u'C').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_anonymous_1552_._set_name(u'anonymous') + var.put(u'F', PyJs_anonymous_1552_) + var.get(u'F').put(var.get(u'PROTOTYPE'), var.get(u'C').get(var.get(u'PROTOTYPE'))) + return var.get(u'F') + PyJs_anonymous_1551_._set_name(u'anonymous') + return (var.get(u'ctx')(var.get(u'out'), var.get(u'global')) if (var.get(u'IS_BIND') and var.get(u'own')) else (PyJs_anonymous_1551_(var.get(u'out')) if (var.get(u'IS_WRAP') and (var.get(u'target').get(var.get(u'key'))==var.get(u'out'))) else (var.get(u'ctx')(var.get(u'Function').get(u'call'), var.get(u'out')) if (var.get(u'IS_PROTO') and (var.get(u'out',throw=False).typeof()==Js(u'function'))) else var.get(u'out')))) + var.get(u'exports').put(var.get(u'key'), (var.get(u'source').get(var.get(u'key')) if (var.get(u'IS_GLOBAL') and (var.get(u'target').get(var.get(u'key')).typeof()!=Js(u'function'))) else PyJs_LONG_1553_())) + if var.get(u'IS_PROTO'): + PyJs_Object_1554_ = Js({}) + (var.get(u'exports').get(u'virtual') or var.get(u'exports').put(u'virtual', PyJs_Object_1554_)).put(var.get(u'key'), var.get(u'out')) + if (((var.get(u'type')&var.get(u'$export').get(u'R')) and var.get(u'expProto')) and var.get(u'expProto').get(var.get(u'key')).neg()): + var.get(u'hide')(var.get(u'expProto'), var.get(u'key'), var.get(u'out')) + PyJs_anonymous_1548_._set_name(u'anonymous') + var.put(u'$export', PyJs_anonymous_1548_) + var.get(u'$export').put(u'F', Js(1.0)) + var.get(u'$export').put(u'G', Js(2.0)) + var.get(u'$export').put(u'S', Js(4.0)) + var.get(u'$export').put(u'P', Js(8.0)) + var.get(u'$export').put(u'B', Js(16.0)) + var.get(u'$export').put(u'W', Js(32.0)) + var.get(u'$export').put(u'U', Js(64.0)) + var.get(u'$export').put(u'R', Js(128.0)) + var.get(u'module').put(u'exports', var.get(u'$export')) +PyJs_anonymous_1547_._set_name(u'anonymous') +PyJs_Object_1555_ = Js({u'./_core':Js(144.0),u'./_ctx':Js(145.0),u'./_global':Js(154.0),u'./_hide':Js(156.0)}) +@Js +def PyJs_anonymous_1556_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1557_(PyJsArg_65786563_, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'exec':PyJsArg_65786563_}, var) + var.registers([u'exec']) + try: + return var.get(u'exec')().neg().neg() + except PyJsException as PyJsTempException: + PyJsHolder_65_66067223 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'true') + finally: + if PyJsHolder_65_66067223 is not None: + var.own[u'e'] = PyJsHolder_65_66067223 + else: + del var.own[u'e'] + del PyJsHolder_65_66067223 + PyJs_anonymous_1557_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1557_) +PyJs_anonymous_1556_._set_name(u'anonymous') +PyJs_Object_1558_ = Js({}) +@Js +def PyJs_anonymous_1559_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'getIterFn', u'RETURN', u'require', u'ctx', u'module', u'BREAK', u'toLength', u'call', u'isArrayIter', u'anObject']) + var.put(u'ctx', var.get(u'require')(Js(u'./_ctx'))) + var.put(u'call', var.get(u'require')(Js(u'./_iter-call'))) + var.put(u'isArrayIter', var.get(u'require')(Js(u'./_is-array-iter'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'toLength', var.get(u'require')(Js(u'./_to-length'))) + var.put(u'getIterFn', var.get(u'require')(Js(u'./core.get-iterator-method'))) + PyJs_Object_1560_ = Js({}) + var.put(u'BREAK', PyJs_Object_1560_) + PyJs_Object_1561_ = Js({}) + var.put(u'RETURN', PyJs_Object_1561_) + @Js + def PyJs_anonymous_1562_(iterable, entries, fn, that, ITERATOR, this, arguments, var=var): + var = Scope({u'iterable':iterable, u'ITERATOR':ITERATOR, u'that':that, u'this':this, u'entries':entries, u'fn':fn, u'arguments':arguments}, var) + var.registers([u'iterFn', u'index', u'ITERATOR', u'iterator', u'f', u'that', u'step', u'length', u'result', u'entries', u'fn', u'iterable']) + @Js + def PyJs_anonymous_1563_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'iterable') + PyJs_anonymous_1563_._set_name(u'anonymous') + var.put(u'iterFn', (PyJs_anonymous_1563_ if var.get(u'ITERATOR') else var.get(u'getIterFn')(var.get(u'iterable')))) + var.put(u'f', var.get(u'ctx')(var.get(u'fn'), var.get(u'that'), (Js(2.0) if var.get(u'entries') else Js(1.0)))) + var.put(u'index', Js(0.0)) + if (var.get(u'iterFn',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'iterable')+Js(u' is not iterable!')))) + raise PyJsTempException + if var.get(u'isArrayIter')(var.get(u'iterFn')): + #for JS loop + var.put(u'length', var.get(u'toLength')(var.get(u'iterable').get(u'length'))) + while (var.get(u'length')>var.get(u'index')): + try: + var.put(u'result', (var.get(u'f')(var.get(u'anObject')(var.put(u'step', var.get(u'iterable').get(var.get(u'index')))).get(u'0'), var.get(u'step').get(u'1')) if var.get(u'entries') else var.get(u'f')(var.get(u'iterable').get(var.get(u'index'))))) + if (PyJsStrictEq(var.get(u'result'),var.get(u'BREAK')) or PyJsStrictEq(var.get(u'result'),var.get(u'RETURN'))): + return var.get(u'result') + finally: + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + else: + #for JS loop + var.put(u'iterator', var.get(u'iterFn').callprop(u'call', var.get(u'iterable'))) + while var.put(u'step', var.get(u'iterator').callprop(u'next')).get(u'done').neg(): + var.put(u'result', var.get(u'call')(var.get(u'iterator'), var.get(u'f'), var.get(u'step').get(u'value'), var.get(u'entries'))) + if (PyJsStrictEq(var.get(u'result'),var.get(u'BREAK')) or PyJsStrictEq(var.get(u'result'),var.get(u'RETURN'))): + return var.get(u'result') + + PyJs_anonymous_1562_._set_name(u'anonymous') + var.put(u'exports', var.get(u'module').put(u'exports', PyJs_anonymous_1562_)) + var.get(u'exports').put(u'BREAK', var.get(u'BREAK')) + var.get(u'exports').put(u'RETURN', var.get(u'RETURN')) +PyJs_anonymous_1559_._set_name(u'anonymous') +PyJs_Object_1564_ = Js({u'./_an-object':Js(132.0),u'./_ctx':Js(145.0),u'./_is-array-iter':Js(160.0),u'./_iter-call':Js(163.0),u'./_to-length':Js(196.0),u'./core.get-iterator-method':Js(203.0)}) +@Js +def PyJs_anonymous_1565_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'global', u'exports', u'module']) + var.put(u'global', var.get(u'module').put(u'exports', (var.get(u'window') if ((var.get(u'window',throw=False).typeof()!=Js(u'undefined')) and (var.get(u'window').get(u'Math')==var.get(u'Math'))) else (var.get(u'self') if ((var.get(u'self',throw=False).typeof()!=Js(u'undefined')) and (var.get(u'self').get(u'Math')==var.get(u'Math'))) else var.get(u'Function')(Js(u'return this'))())))) + if (var.get(u'__g',throw=False).typeof()==Js(u'number')): + var.put(u'__g', var.get(u'global')) +PyJs_anonymous_1565_._set_name(u'anonymous') +PyJs_Object_1566_ = Js({}) +@Js +def PyJs_anonymous_1567_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'hasOwnProperty', u'module']) + PyJs_Object_1568_ = Js({}) + var.put(u'hasOwnProperty', PyJs_Object_1568_.get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_1569_(it, key, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'key':key, u'arguments':arguments}, var) + var.registers([u'it', u'key']) + return var.get(u'hasOwnProperty').callprop(u'call', var.get(u'it'), var.get(u'key')) + PyJs_anonymous_1569_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1569_) +PyJs_anonymous_1567_._set_name(u'anonymous') +PyJs_Object_1570_ = Js({}) +@Js +def PyJs_anonymous_1571_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'require', u'exports', u'createDesc', u'dP']) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'createDesc', var.get(u'require')(Js(u'./_property-desc'))) + @Js + def PyJs_anonymous_1572_(object, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'object', u'value', u'key']) + return var.get(u'dP').callprop(u'f', var.get(u'object'), var.get(u'key'), var.get(u'createDesc')(Js(1.0), var.get(u'value'))) + PyJs_anonymous_1572_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1573_(object, key, value, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'object', u'value', u'key']) + var.get(u'object').put(var.get(u'key'), var.get(u'value')) + return var.get(u'object') + PyJs_anonymous_1573_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (PyJs_anonymous_1572_ if var.get(u'require')(Js(u'./_descriptors')) else PyJs_anonymous_1573_)) +PyJs_anonymous_1571_._set_name(u'anonymous') +PyJs_Object_1574_ = Js({u'./_descriptors':Js(147.0),u'./_object-dp':Js(173.0),u'./_property-desc':Js(184.0)}) +@Js +def PyJs_anonymous_1575_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', (var.get(u'require')(Js(u'./_global')).get(u'document') and var.get(u'document').get(u'documentElement'))) +PyJs_anonymous_1575_._set_name(u'anonymous') +PyJs_Object_1576_ = Js({u'./_global':Js(154.0)}) +@Js +def PyJs_anonymous_1577_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1578_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_1580_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(7.0) + PyJs_anonymous_1580_._set_name(u'anonymous') + PyJs_Object_1579_ = Js({u'get':PyJs_anonymous_1580_}) + return (var.get(u'Object').callprop(u'defineProperty', var.get(u'require')(Js(u'./_dom-create'))(Js(u'div')), Js(u'a'), PyJs_Object_1579_).get(u'a')!=Js(7.0)) + PyJs_anonymous_1578_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'require')(Js(u'./_descriptors')).neg() and var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1578_).neg())) +PyJs_anonymous_1577_._set_name(u'anonymous') +PyJs_Object_1581_ = Js({u'./_descriptors':Js(147.0),u'./_dom-create':Js(148.0),u'./_fails':Js(152.0)}) +@Js +def PyJs_anonymous_1582_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'cof']) + var.put(u'cof', var.get(u'require')(Js(u'./_cof'))) + @Js + def PyJs_anonymous_1583_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'it').callprop(u'split', Js(u'')) if (var.get(u'cof')(var.get(u'it'))==Js(u'String')) else var.get(u'Object')(var.get(u'it'))) + PyJs_anonymous_1583_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Object') if var.get(u'Object')(Js(u'z')).callprop(u'propertyIsEnumerable', Js(0.0)) else PyJs_anonymous_1583_)) +PyJs_anonymous_1582_._set_name(u'anonymous') +PyJs_Object_1584_ = Js({u'./_cof':Js(139.0)}) +@Js +def PyJs_anonymous_1585_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ITERATOR', u'ArrayProto', u'require', u'module', u'Iterators']) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'ITERATOR', var.get(u'require')(Js(u'./_wks'))(Js(u'iterator'))) + var.put(u'ArrayProto', var.get(u'Array').get(u'prototype')) + @Js + def PyJs_anonymous_1586_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (PyJsStrictNeq(var.get(u'it'),var.get(u'undefined')) and (PyJsStrictEq(var.get(u'Iterators').get(u'Array'),var.get(u'it')) or PyJsStrictEq(var.get(u'ArrayProto').get(var.get(u'ITERATOR')),var.get(u'it')))) + PyJs_anonymous_1586_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1586_) +PyJs_anonymous_1585_._set_name(u'anonymous') +PyJs_Object_1587_ = Js({u'./_iterators':Js(167.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1588_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'cof']) + var.put(u'cof', var.get(u'require')(Js(u'./_cof'))) + @Js + def PyJs_isArray_1589_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'isArray':PyJs_isArray_1589_, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (var.get(u'cof')(var.get(u'arg'))==Js(u'Array')) + PyJs_isArray_1589_._set_name(u'isArray') + var.get(u'module').put(u'exports', (var.get(u'Array').get(u'isArray') or PyJs_isArray_1589_)) +PyJs_anonymous_1588_._set_name(u'anonymous') +PyJs_Object_1590_ = Js({u'./_cof':Js(139.0)}) +@Js +def PyJs_anonymous_1591_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1592_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (PyJsStrictNeq(var.get(u'it'),var.get(u"null")) if PyJsStrictEq(var.get(u'it',throw=False).typeof(),Js(u'object')) else PyJsStrictEq(var.get(u'it',throw=False).typeof(),Js(u'function'))) + PyJs_anonymous_1592_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1592_) +PyJs_anonymous_1591_._set_name(u'anonymous') +PyJs_Object_1593_ = Js({}) +@Js +def PyJs_anonymous_1594_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'anObject', u'exports', u'module']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + @Js + def PyJs_anonymous_1595_(iterator, fn, value, entries, this, arguments, var=var): + var = Scope({u'fn':fn, u'iterator':iterator, u'entries':entries, u'this':this, u'value':value, u'arguments':arguments}, var) + var.registers([u'fn', u'value', u'iterator', u'ret', u'entries']) + try: + return (var.get(u'fn')(var.get(u'anObject')(var.get(u'value')).get(u'0'), var.get(u'value').get(u'1')) if var.get(u'entries') else var.get(u'fn')(var.get(u'value'))) + except PyJsException as PyJsTempException: + PyJsHolder_65_64523188 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'ret', var.get(u'iterator').get(u'return')) + if PyJsStrictNeq(var.get(u'ret'),var.get(u'undefined')): + var.get(u'anObject')(var.get(u'ret').callprop(u'call', var.get(u'iterator'))) + PyJsTempException = JsToPyException(var.get(u'e')) + raise PyJsTempException + finally: + if PyJsHolder_65_64523188 is not None: + var.own[u'e'] = PyJsHolder_65_64523188 + else: + del var.own[u'e'] + del PyJsHolder_65_64523188 + PyJs_anonymous_1595_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1595_) +PyJs_anonymous_1594_._set_name(u'anonymous') +PyJs_Object_1596_ = Js({u'./_an-object':Js(132.0)}) +@Js +def PyJs_anonymous_1597_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'setToStringTag', u'exports', u'IteratorPrototype', u'create', u'module', u'descriptor', u'require']) + Js(u'use strict') + var.put(u'create', var.get(u'require')(Js(u'./_object-create'))) + var.put(u'descriptor', var.get(u'require')(Js(u'./_property-desc'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + PyJs_Object_1598_ = Js({}) + var.put(u'IteratorPrototype', PyJs_Object_1598_) + @Js + def PyJs_anonymous_1599_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this") + PyJs_anonymous_1599_._set_name(u'anonymous') + var.get(u'require')(Js(u'./_hide'))(var.get(u'IteratorPrototype'), var.get(u'require')(Js(u'./_wks'))(Js(u'iterator')), PyJs_anonymous_1599_) + @Js + def PyJs_anonymous_1600_(Constructor, NAME, next, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'next':next, u'NAME':NAME, u'Constructor':Constructor}, var) + var.registers([u'next', u'NAME', u'Constructor']) + PyJs_Object_1601_ = Js({u'next':var.get(u'descriptor')(Js(1.0), var.get(u'next'))}) + var.get(u'Constructor').put(u'prototype', var.get(u'create')(var.get(u'IteratorPrototype'), PyJs_Object_1601_)) + var.get(u'setToStringTag')(var.get(u'Constructor'), (var.get(u'NAME')+Js(u' Iterator'))) + PyJs_anonymous_1600_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1600_) +PyJs_anonymous_1597_._set_name(u'anonymous') +PyJs_Object_1602_ = Js({u'./_hide':Js(156.0),u'./_object-create':Js(172.0),u'./_property-desc':Js(184.0),u'./_set-to-string-tag':Js(189.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1603_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'returnThis', u'$iterCreate', u'redefine', u'hide', u'ITERATOR', u'KEYS', u'$export', u'setToStringTag', u'BUGGY', u'require', u'LIBRARY', u'getPrototypeOf', u'Iterators', u'VALUES', u'module', u'has', u'FF_ITERATOR', u'exports']) + Js(u'use strict') + var.put(u'LIBRARY', var.get(u'require')(Js(u'./_library'))) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'redefine', var.get(u'require')(Js(u'./_redefine'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'$iterCreate', var.get(u'require')(Js(u'./_iter-create'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + var.put(u'getPrototypeOf', var.get(u'require')(Js(u'./_object-gpo'))) + var.put(u'ITERATOR', var.get(u'require')(Js(u'./_wks'))(Js(u'iterator'))) + var.put(u'BUGGY', (Js([]).get(u'keys') and Js([]).callprop(u'keys').contains(Js(u'next'))).neg()) + var.put(u'FF_ITERATOR', Js(u'@@iterator')) + var.put(u'KEYS', Js(u'keys')) + var.put(u'VALUES', Js(u'values')) + @Js + def PyJs_anonymous_1604_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this") + PyJs_anonymous_1604_._set_name(u'anonymous') + var.put(u'returnThis', PyJs_anonymous_1604_) + @Js + def PyJs_anonymous_1605_(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED, this, arguments, var=var): + var = Scope({u'FORCED':FORCED, u'NAME':NAME, u'DEFAULT':DEFAULT, u'Constructor':Constructor, u'next':next, u'this':this, u'Base':Base, u'arguments':arguments, u'IS_SET':IS_SET}, var) + var.registers([u'DEF_VALUES', u'Base', u'$entries', u'methods', u'$default', u'proto', u'DEFAULT', u'IteratorPrototype', u'Constructor', u'getMethod', u'next', u'IS_SET', u'$anyNative', u'TAG', u'key', u'VALUES_BUG', u'$native', u'FORCED', u'NAME']) + var.get(u'$iterCreate')(var.get(u'Constructor'), var.get(u'NAME'), var.get(u'next')) + @Js + def PyJs_anonymous_1606_(kind, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments}, var) + var.registers([u'kind']) + if (var.get(u'BUGGY').neg() and var.get(u'proto').contains(var.get(u'kind'))): + return var.get(u'proto').get(var.get(u'kind')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'kind')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'KEYS')): + SWITCHED = True + @Js + def PyJs_keys_1607_(this, arguments, var=var): + var = Scope({u'this':this, u'keys':PyJs_keys_1607_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Constructor').create(var.get(u"this"), var.get(u'kind')) + PyJs_keys_1607_._set_name(u'keys') + return PyJs_keys_1607_ + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'VALUES')): + SWITCHED = True + @Js + def PyJs_values_1608_(this, arguments, var=var): + var = Scope({u'this':this, u'values':PyJs_values_1608_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Constructor').create(var.get(u"this"), var.get(u'kind')) + PyJs_values_1608_._set_name(u'values') + return PyJs_values_1608_ + SWITCHED = True + break + @Js + def PyJs_entries_1609_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':PyJs_entries_1609_}, var) + var.registers([]) + return var.get(u'Constructor').create(var.get(u"this"), var.get(u'kind')) + PyJs_entries_1609_._set_name(u'entries') + return PyJs_entries_1609_ + PyJs_anonymous_1606_._set_name(u'anonymous') + var.put(u'getMethod', PyJs_anonymous_1606_) + var.put(u'TAG', (var.get(u'NAME')+Js(u' Iterator'))) + var.put(u'DEF_VALUES', (var.get(u'DEFAULT')==var.get(u'VALUES'))) + var.put(u'VALUES_BUG', Js(False)) + var.put(u'proto', var.get(u'Base').get(u'prototype')) + var.put(u'$native', ((var.get(u'proto').get(var.get(u'ITERATOR')) or var.get(u'proto').get(var.get(u'FF_ITERATOR'))) or (var.get(u'DEFAULT') and var.get(u'proto').get(var.get(u'DEFAULT'))))) + var.put(u'$default', (var.get(u'$native') or var.get(u'getMethod')(var.get(u'DEFAULT')))) + var.put(u'$entries', ((var.get(u'$default') if var.get(u'DEF_VALUES').neg() else var.get(u'getMethod')(Js(u'entries'))) if var.get(u'DEFAULT') else var.get(u'undefined'))) + var.put(u'$anyNative', ((var.get(u'proto').get(u'entries') or var.get(u'$native')) if (var.get(u'NAME')==Js(u'Array')) else var.get(u'$native'))) + if var.get(u'$anyNative'): + var.put(u'IteratorPrototype', var.get(u'getPrototypeOf')(var.get(u'$anyNative').callprop(u'call', var.get(u'Base').create()))) + if PyJsStrictNeq(var.get(u'IteratorPrototype'),var.get(u'Object').get(u'prototype')): + var.get(u'setToStringTag')(var.get(u'IteratorPrototype'), var.get(u'TAG'), var.get(u'true')) + if (var.get(u'LIBRARY').neg() and var.get(u'has')(var.get(u'IteratorPrototype'), var.get(u'ITERATOR')).neg()): + var.get(u'hide')(var.get(u'IteratorPrototype'), var.get(u'ITERATOR'), var.get(u'returnThis')) + if ((var.get(u'DEF_VALUES') and var.get(u'$native')) and PyJsStrictNeq(var.get(u'$native').get(u'name'),var.get(u'VALUES'))): + var.put(u'VALUES_BUG', var.get(u'true')) + @Js + def PyJs_values_1610_(this, arguments, var=var): + var = Scope({u'this':this, u'values':PyJs_values_1610_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'$native').callprop(u'call', var.get(u"this")) + PyJs_values_1610_._set_name(u'values') + var.put(u'$default', PyJs_values_1610_) + if ((var.get(u'LIBRARY').neg() or var.get(u'FORCED')) and ((var.get(u'BUGGY') or var.get(u'VALUES_BUG')) or var.get(u'proto').get(var.get(u'ITERATOR')).neg())): + var.get(u'hide')(var.get(u'proto'), var.get(u'ITERATOR'), var.get(u'$default')) + var.get(u'Iterators').put(var.get(u'NAME'), var.get(u'$default')) + var.get(u'Iterators').put(var.get(u'TAG'), var.get(u'returnThis')) + if var.get(u'DEFAULT'): + PyJs_Object_1611_ = Js({u'values':(var.get(u'$default') if var.get(u'DEF_VALUES') else var.get(u'getMethod')(var.get(u'VALUES'))),u'keys':(var.get(u'$default') if var.get(u'IS_SET') else var.get(u'getMethod')(var.get(u'KEYS'))),u'entries':var.get(u'$entries')}) + var.put(u'methods', PyJs_Object_1611_) + if var.get(u'FORCED'): + for PyJsTemp in var.get(u'methods'): + var.put(u'key', PyJsTemp) + if var.get(u'proto').contains(var.get(u'key')).neg(): + var.get(u'redefine')(var.get(u'proto'), var.get(u'key'), var.get(u'methods').get(var.get(u'key'))) + else: + var.get(u'$export')((var.get(u'$export').get(u'P')+(var.get(u'$export').get(u'F')*(var.get(u'BUGGY') or var.get(u'VALUES_BUG')))), var.get(u'NAME'), var.get(u'methods')) + return var.get(u'methods') + PyJs_anonymous_1605_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1605_) +PyJs_anonymous_1603_._set_name(u'anonymous') +PyJs_Object_1612_ = Js({u'./_export':Js(151.0),u'./_has':Js(155.0),u'./_hide':Js(156.0),u'./_iter-create':Js(164.0),u'./_iterators':Js(167.0),u'./_library':Js(169.0),u'./_object-gpo':Js(179.0),u'./_redefine':Js(186.0),u'./_set-to-string-tag':Js(189.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1613_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1614_(done, value, this, arguments, var=var): + var = Scope({u'this':this, u'done':done, u'arguments':arguments, u'value':value}, var) + var.registers([u'done', u'value']) + PyJs_Object_1615_ = Js({u'value':var.get(u'value'),u'done':var.get(u'done').neg().neg()}) + return PyJs_Object_1615_ + PyJs_anonymous_1614_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1614_) +PyJs_anonymous_1613_._set_name(u'anonymous') +PyJs_Object_1616_ = Js({}) +@Js +def PyJs_anonymous_1617_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1618_ = Js({}) + var.get(u'module').put(u'exports', PyJs_Object_1618_) +PyJs_anonymous_1617_._set_name(u'anonymous') +PyJs_Object_1619_ = Js({}) +@Js +def PyJs_anonymous_1620_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'toIObject', u'exports', u'module', u'getKeys']) + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + @Js + def PyJs_anonymous_1621_(object, el, this, arguments, var=var): + var = Scope({u'this':this, u'el':el, u'object':object, u'arguments':arguments}, var) + var.registers([u'index', u'el', u'keys', u'object', u'O', u'length', u'key']) + var.put(u'O', var.get(u'toIObject')(var.get(u'object'))) + var.put(u'keys', var.get(u'getKeys')(var.get(u'O'))) + var.put(u'length', var.get(u'keys').get(u'length')) + var.put(u'index', Js(0.0)) + while (var.get(u'length')>var.get(u'index')): + if PyJsStrictEq(var.get(u'O').get(var.put(u'key', var.get(u'keys').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1))))),var.get(u'el')): + return var.get(u'key') + PyJs_anonymous_1621_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1621_) +PyJs_anonymous_1620_._set_name(u'anonymous') +PyJs_Object_1622_ = Js({u'./_object-keys':Js(181.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1623_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'true')) +PyJs_anonymous_1623_._set_name(u'anonymous') +PyJs_Object_1624_ = Js({}) +@Js +def PyJs_anonymous_1625_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'fastKey', u'FREEZE', u'getWeak', u'require', u'isExtensible', u'exports', u'module', u'id', u'setMeta', u'META', u'meta', u'onFreeze', u'has', u'setDesc', u'isObject']) + var.put(u'META', var.get(u'require')(Js(u'./_uid'))(Js(u'meta'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'setDesc', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'id', Js(0.0)) + @Js + def PyJs_anonymous_1626_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'true') + PyJs_anonymous_1626_._set_name(u'anonymous') + var.put(u'isExtensible', (var.get(u'Object').get(u'isExtensible') or PyJs_anonymous_1626_)) + @Js + def PyJs_anonymous_1627_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1628_ = Js({}) + return var.get(u'isExtensible')(var.get(u'Object').callprop(u'preventExtensions', PyJs_Object_1628_)) + PyJs_anonymous_1627_._set_name(u'anonymous') + var.put(u'FREEZE', var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1627_).neg()) + @Js + def PyJs_anonymous_1629_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + PyJs_Object_1632_ = Js({}) + PyJs_Object_1631_ = Js({u'i':(Js(u'O')+var.put(u'id',Js(var.get(u'id').to_number())+Js(1))),u'w':PyJs_Object_1632_}) + PyJs_Object_1630_ = Js({u'value':PyJs_Object_1631_}) + var.get(u'setDesc')(var.get(u'it'), var.get(u'META'), PyJs_Object_1630_) + PyJs_anonymous_1629_._set_name(u'anonymous') + var.put(u'setMeta', PyJs_anonymous_1629_) + @Js + def PyJs_anonymous_1633_(it, create, this, arguments, var=var): + var = Scope({u'this':this, u'create':create, u'it':it, u'arguments':arguments}, var) + var.registers([u'create', u'it']) + if var.get(u'isObject')(var.get(u'it')).neg(): + return (var.get(u'it') if (var.get(u'it',throw=False).typeof()==Js(u'symbol')) else ((Js(u'S') if (var.get(u'it',throw=False).typeof()==Js(u'string')) else Js(u'P'))+var.get(u'it'))) + if var.get(u'has')(var.get(u'it'), var.get(u'META')).neg(): + if var.get(u'isExtensible')(var.get(u'it')).neg(): + return Js(u'F') + if var.get(u'create').neg(): + return Js(u'E') + var.get(u'setMeta')(var.get(u'it')) + return var.get(u'it').get(var.get(u'META')).get(u'i') + PyJs_anonymous_1633_._set_name(u'anonymous') + var.put(u'fastKey', PyJs_anonymous_1633_) + @Js + def PyJs_anonymous_1634_(it, create, this, arguments, var=var): + var = Scope({u'this':this, u'create':create, u'it':it, u'arguments':arguments}, var) + var.registers([u'create', u'it']) + if var.get(u'has')(var.get(u'it'), var.get(u'META')).neg(): + if var.get(u'isExtensible')(var.get(u'it')).neg(): + return var.get(u'true') + if var.get(u'create').neg(): + return Js(False) + var.get(u'setMeta')(var.get(u'it')) + return var.get(u'it').get(var.get(u'META')).get(u'w') + PyJs_anonymous_1634_._set_name(u'anonymous') + var.put(u'getWeak', PyJs_anonymous_1634_) + @Js + def PyJs_anonymous_1635_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (((var.get(u'FREEZE') and var.get(u'meta').get(u'NEED')) and var.get(u'isExtensible')(var.get(u'it'))) and var.get(u'has')(var.get(u'it'), var.get(u'META')).neg()): + var.get(u'setMeta')(var.get(u'it')) + return var.get(u'it') + PyJs_anonymous_1635_._set_name(u'anonymous') + var.put(u'onFreeze', PyJs_anonymous_1635_) + PyJs_Object_1636_ = Js({u'KEY':var.get(u'META'),u'NEED':Js(False),u'fastKey':var.get(u'fastKey'),u'getWeak':var.get(u'getWeak'),u'onFreeze':var.get(u'onFreeze')}) + var.put(u'meta', var.get(u'module').put(u'exports', PyJs_Object_1636_)) +PyJs_anonymous_1625_._set_name(u'anonymous') +PyJs_Object_1637_ = Js({u'./_fails':Js(152.0),u'./_has':Js(155.0),u'./_is-object':Js(162.0),u'./_object-dp':Js(173.0),u'./_uid':Js(199.0)}) +@Js +def PyJs_anonymous_1638_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'IObject', u'$assign', u'toObject', u'pIE', u'module', u'gOPS', u'getKeys', u'require']) + Js(u'use strict') + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'gOPS', var.get(u'require')(Js(u'./_object-gops'))) + var.put(u'pIE', var.get(u'require')(Js(u'./_object-pie'))) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'IObject', var.get(u'require')(Js(u'./_iobject'))) + var.put(u'$assign', var.get(u'Object').get(u'assign')) + @Js + def PyJs_assign_1639_(target, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'assign':PyJs_assign_1639_, u'target':target, u'arguments':arguments}, var) + var.registers([u'index', u'target', u'getSymbols', u'keys', u'j', u'S', u'isEnum', u'aLen', u'T', u'key', u'length', u'source']) + var.put(u'T', var.get(u'toObject')(var.get(u'target'))) + var.put(u'aLen', var.get(u'arguments').get(u'length')) + var.put(u'index', Js(1.0)) + var.put(u'getSymbols', var.get(u'gOPS').get(u'f')) + var.put(u'isEnum', var.get(u'pIE').get(u'f')) + while (var.get(u'aLen')>var.get(u'index')): + var.put(u'S', var.get(u'IObject')(var.get(u'arguments').get((var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1))))) + var.put(u'keys', (var.get(u'getKeys')(var.get(u'S')).callprop(u'concat', var.get(u'getSymbols')(var.get(u'S'))) if var.get(u'getSymbols') else var.get(u'getKeys')(var.get(u'S')))) + var.put(u'length', var.get(u'keys').get(u'length')) + var.put(u'j', Js(0.0)) + while (var.get(u'length')>var.get(u'j')): + if var.get(u'isEnum').callprop(u'call', var.get(u'S'), var.put(u'key', var.get(u'keys').get((var.put(u'j',Js(var.get(u'j').to_number())+Js(1))-Js(1))))): + var.get(u'T').put(var.get(u'key'), var.get(u'S').get(var.get(u'key'))) + return var.get(u'T') + PyJs_assign_1639_._set_name(u'assign') + @Js + def PyJs_anonymous_1640_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'A', u'S', u'B', u'K']) + PyJs_Object_1641_ = Js({}) + var.put(u'A', PyJs_Object_1641_) + PyJs_Object_1642_ = Js({}) + var.put(u'B', PyJs_Object_1642_) + var.put(u'S', var.get(u'Symbol')()) + var.put(u'K', Js(u'abcdefghijklmnopqrst')) + var.get(u'A').put(var.get(u'S'), Js(7.0)) + @Js + def PyJs_anonymous_1643_(k, this, arguments, var=var): + var = Scope({u'this':this, u'k':k, u'arguments':arguments}, var) + var.registers([u'k']) + var.get(u'B').put(var.get(u'k'), var.get(u'k')) + PyJs_anonymous_1643_._set_name(u'anonymous') + var.get(u'K').callprop(u'split', Js(u'')).callprop(u'forEach', PyJs_anonymous_1643_) + PyJs_Object_1644_ = Js({}) + PyJs_Object_1645_ = Js({}) + return ((var.get(u'$assign')(PyJs_Object_1644_, var.get(u'A')).get(var.get(u'S'))!=Js(7.0)) or (var.get(u'Object').callprop(u'keys', var.get(u'$assign')(PyJs_Object_1645_, var.get(u'B'))).callprop(u'join', Js(u''))!=var.get(u'K'))) + PyJs_anonymous_1640_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (PyJs_assign_1639_ if (var.get(u'$assign').neg() or var.get(u'require')(Js(u'./_fails'))(PyJs_anonymous_1640_)) else var.get(u'$assign'))) +PyJs_anonymous_1638_._set_name(u'anonymous') +PyJs_Object_1646_ = Js({u'./_fails':Js(152.0),u'./_iobject':Js(159.0),u'./_object-gops':Js(178.0),u'./_object-keys':Js(181.0),u'./_object-pie':Js(182.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1647_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'dPs', u'require', u'enumBugKeys', u'module', u'IE_PROTO', u'anObject', u'createDict', u'PROTOTYPE', u'Empty']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'dPs', var.get(u'require')(Js(u'./_object-dps'))) + var.put(u'enumBugKeys', var.get(u'require')(Js(u'./_enum-bug-keys'))) + var.put(u'IE_PROTO', var.get(u'require')(Js(u'./_shared-key'))(Js(u'IE_PROTO'))) + @Js + def PyJs_anonymous_1648_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_1648_._set_name(u'anonymous') + var.put(u'Empty', PyJs_anonymous_1648_) + var.put(u'PROTOTYPE', Js(u'prototype')) + @Js + def PyJs_anonymous_1649_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'lt', u'gt', u'iframeDocument', u'iframe']) + var.put(u'iframe', var.get(u'require')(Js(u'./_dom-create'))(Js(u'iframe'))) + var.put(u'i', var.get(u'enumBugKeys').get(u'length')) + var.put(u'lt', Js(u'<')) + var.put(u'gt', Js(u'>')) + var.get(u'iframe').get(u'style').put(u'display', Js(u'none')) + var.get(u'require')(Js(u'./_html')).callprop(u'appendChild', var.get(u'iframe')) + var.get(u'iframe').put(u'src', Js(u'javascript:')) + var.put(u'iframeDocument', var.get(u'iframe').get(u'contentWindow').get(u'document')) + var.get(u'iframeDocument').callprop(u'open') + var.get(u'iframeDocument').callprop(u'write', ((((((var.get(u'lt')+Js(u'script'))+var.get(u'gt'))+Js(u'document.F=Object'))+var.get(u'lt'))+Js(u'/script'))+var.get(u'gt'))) + var.get(u'iframeDocument').callprop(u'close') + var.put(u'createDict', var.get(u'iframeDocument').get(u'F')) + while (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)): + var.get(u'createDict').get(var.get(u'PROTOTYPE')).delete(var.get(u'enumBugKeys').get(var.get(u'i'))) + return var.get(u'createDict')() + PyJs_anonymous_1649_._set_name(u'anonymous') + var.put(u'createDict', PyJs_anonymous_1649_) + @Js + def PyJs_create_1650_(O, Properties, this, arguments, var=var): + var = Scope({u'this':this, u'create':PyJs_create_1650_, u'Properties':Properties, u'O':O, u'arguments':arguments}, var) + var.registers([u'result', u'O', u'Properties']) + pass + if PyJsStrictNeq(var.get(u'O'),var.get(u"null")): + var.get(u'Empty').put(var.get(u'PROTOTYPE'), var.get(u'anObject')(var.get(u'O'))) + var.put(u'result', var.get(u'Empty').create()) + var.get(u'Empty').put(var.get(u'PROTOTYPE'), var.get(u"null")) + var.get(u'result').put(var.get(u'IE_PROTO'), var.get(u'O')) + else: + var.put(u'result', var.get(u'createDict')()) + return (var.get(u'result') if PyJsStrictEq(var.get(u'Properties'),var.get(u'undefined')) else var.get(u'dPs')(var.get(u'result'), var.get(u'Properties'))) + PyJs_create_1650_._set_name(u'create') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'create') or PyJs_create_1650_)) +PyJs_anonymous_1647_._set_name(u'anonymous') +PyJs_Object_1651_ = Js({u'./_an-object':Js(132.0),u'./_dom-create':Js(148.0),u'./_enum-bug-keys':Js(149.0),u'./_html':Js(157.0),u'./_object-dps':Js(174.0),u'./_shared-key':Js(190.0)}) +@Js +def PyJs_anonymous_1652_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'toPrimitive', u'module', u'anObject', u'IE8_DOM_DEFINE', u'dP']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'IE8_DOM_DEFINE', var.get(u'require')(Js(u'./_ie8-dom-define'))) + var.put(u'toPrimitive', var.get(u'require')(Js(u'./_to-primitive'))) + var.put(u'dP', var.get(u'Object').get(u'defineProperty')) + @Js + def PyJs_defineProperty_1653_(O, P, Attributes, this, arguments, var=var): + var = Scope({u'this':this, u'O':O, u'P':P, u'arguments':arguments, u'defineProperty':PyJs_defineProperty_1653_, u'Attributes':Attributes}, var) + var.registers([u'P', u'O', u'Attributes']) + var.get(u'anObject')(var.get(u'O')) + var.put(u'P', var.get(u'toPrimitive')(var.get(u'P'), var.get(u'true'))) + var.get(u'anObject')(var.get(u'Attributes')) + if var.get(u'IE8_DOM_DEFINE'): + try: + return var.get(u'dP')(var.get(u'O'), var.get(u'P'), var.get(u'Attributes')) + except PyJsException as PyJsTempException: + PyJsHolder_65_75205354 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_75205354 is not None: + var.own[u'e'] = PyJsHolder_65_75205354 + else: + del var.own[u'e'] + del PyJsHolder_65_75205354 + if (var.get(u'Attributes').contains(Js(u'get')) or var.get(u'Attributes').contains(Js(u'set'))): + PyJsTempException = JsToPyException(var.get(u'TypeError')(Js(u'Accessors not supported!'))) + raise PyJsTempException + if var.get(u'Attributes').contains(Js(u'value')): + var.get(u'O').put(var.get(u'P'), var.get(u'Attributes').get(u'value')) + return var.get(u'O') + PyJs_defineProperty_1653_._set_name(u'defineProperty') + var.get(u'exports').put(u'f', (var.get(u'Object').get(u'defineProperty') if var.get(u'require')(Js(u'./_descriptors')) else PyJs_defineProperty_1653_)) +PyJs_anonymous_1652_._set_name(u'anonymous') +PyJs_Object_1654_ = Js({u'./_an-object':Js(132.0),u'./_descriptors':Js(147.0),u'./_ie8-dom-define':Js(158.0),u'./_to-primitive':Js(198.0)}) +@Js +def PyJs_anonymous_1655_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'getKeys', u'anObject', u'dP']) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'getKeys', var.get(u'require')(Js(u'./_object-keys'))) + @Js + def PyJs_defineProperties_1656_(O, Properties, this, arguments, var=var): + var = Scope({u'this':this, u'defineProperties':PyJs_defineProperties_1656_, u'Properties':Properties, u'O':O, u'arguments':arguments}, var) + var.registers([u'P', u'keys', u'O', u'i', u'length', u'Properties']) + var.get(u'anObject')(var.get(u'O')) + var.put(u'keys', var.get(u'getKeys')(var.get(u'Properties'))) + var.put(u'length', var.get(u'keys').get(u'length')) + var.put(u'i', Js(0.0)) + while (var.get(u'length')>var.get(u'i')): + var.get(u'dP').callprop(u'f', var.get(u'O'), var.put(u'P', var.get(u'keys').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))), var.get(u'Properties').get(var.get(u'P'))) + return var.get(u'O') + PyJs_defineProperties_1656_._set_name(u'defineProperties') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'defineProperties') if var.get(u'require')(Js(u'./_descriptors')) else PyJs_defineProperties_1656_)) +PyJs_anonymous_1655_._set_name(u'anonymous') +PyJs_Object_1657_ = Js({u'./_an-object':Js(132.0),u'./_descriptors':Js(147.0),u'./_object-dp':Js(173.0),u'./_object-keys':Js(181.0)}) +@Js +def PyJs_anonymous_1658_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'toPrimitive', u'module', u'pIE', u'toIObject', u'IE8_DOM_DEFINE', u'gOPD', u'has', u'createDesc']) + var.put(u'pIE', var.get(u'require')(Js(u'./_object-pie'))) + var.put(u'createDesc', var.get(u'require')(Js(u'./_property-desc'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'toPrimitive', var.get(u'require')(Js(u'./_to-primitive'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'IE8_DOM_DEFINE', var.get(u'require')(Js(u'./_ie8-dom-define'))) + var.put(u'gOPD', var.get(u'Object').get(u'getOwnPropertyDescriptor')) + @Js + def PyJs_getOwnPropertyDescriptor_1659_(O, P, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'getOwnPropertyDescriptor':PyJs_getOwnPropertyDescriptor_1659_, u'arguments':arguments, u'O':O}, var) + var.registers([u'P', u'O']) + var.put(u'O', var.get(u'toIObject')(var.get(u'O'))) + var.put(u'P', var.get(u'toPrimitive')(var.get(u'P'), var.get(u'true'))) + if var.get(u'IE8_DOM_DEFINE'): + try: + return var.get(u'gOPD')(var.get(u'O'), var.get(u'P')) + except PyJsException as PyJsTempException: + PyJsHolder_65_6934147 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_6934147 is not None: + var.own[u'e'] = PyJsHolder_65_6934147 + else: + del var.own[u'e'] + del PyJsHolder_65_6934147 + if var.get(u'has')(var.get(u'O'), var.get(u'P')): + return var.get(u'createDesc')(var.get(u'pIE').get(u'f').callprop(u'call', var.get(u'O'), var.get(u'P')).neg(), var.get(u'O').get(var.get(u'P'))) + PyJs_getOwnPropertyDescriptor_1659_._set_name(u'getOwnPropertyDescriptor') + var.get(u'exports').put(u'f', (var.get(u'gOPD') if var.get(u'require')(Js(u'./_descriptors')) else PyJs_getOwnPropertyDescriptor_1659_)) +PyJs_anonymous_1658_._set_name(u'anonymous') +PyJs_Object_1660_ = Js({u'./_descriptors':Js(147.0),u'./_has':Js(155.0),u'./_ie8-dom-define':Js(158.0),u'./_object-pie':Js(182.0),u'./_property-desc':Js(184.0),u'./_to-iobject':Js(195.0),u'./_to-primitive':Js(198.0)}) +@Js +def PyJs_anonymous_1661_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'getWindowNames', u'windowNames', u'gOPN', u'toString', u'module', u'toIObject']) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'gOPN', var.get(u'require')(Js(u'./_object-gopn')).get(u'f')) + PyJs_Object_1662_ = Js({}) + var.put(u'toString', PyJs_Object_1662_.get(u'toString')) + var.put(u'windowNames', (var.get(u'Object').callprop(u'getOwnPropertyNames', var.get(u'window')) if (((var.get(u'window',throw=False).typeof()==Js(u'object')) and var.get(u'window')) and var.get(u'Object').get(u'getOwnPropertyNames')) else Js([]))) + @Js + def PyJs_anonymous_1663_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + try: + return var.get(u'gOPN')(var.get(u'it')) + except PyJsException as PyJsTempException: + PyJsHolder_65_72290655 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + return var.get(u'windowNames').callprop(u'slice') + finally: + if PyJsHolder_65_72290655 is not None: + var.own[u'e'] = PyJsHolder_65_72290655 + else: + del var.own[u'e'] + del PyJsHolder_65_72290655 + PyJs_anonymous_1663_._set_name(u'anonymous') + var.put(u'getWindowNames', PyJs_anonymous_1663_) + @Js + def PyJs_getOwnPropertyNames_1664_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_1664_, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'getWindowNames')(var.get(u'it')) if (var.get(u'windowNames') and (var.get(u'toString').callprop(u'call', var.get(u'it'))==Js(u'[object Window]'))) else var.get(u'gOPN')(var.get(u'toIObject')(var.get(u'it')))) + PyJs_getOwnPropertyNames_1664_._set_name(u'getOwnPropertyNames') + var.get(u'module').get(u'exports').put(u'f', PyJs_getOwnPropertyNames_1664_) +PyJs_anonymous_1661_._set_name(u'anonymous') +PyJs_Object_1665_ = Js({u'./_object-gopn':Js(177.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1666_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'hiddenKeys', u'require', u'$keys', u'module']) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys-internal'))) + var.put(u'hiddenKeys', var.get(u'require')(Js(u'./_enum-bug-keys')).callprop(u'concat', Js(u'length'), Js(u'prototype'))) + @Js + def PyJs_getOwnPropertyNames_1667_(O, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'O':O, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_1667_}, var) + var.registers([u'O']) + return var.get(u'$keys')(var.get(u'O'), var.get(u'hiddenKeys')) + PyJs_getOwnPropertyNames_1667_._set_name(u'getOwnPropertyNames') + var.get(u'exports').put(u'f', (var.get(u'Object').get(u'getOwnPropertyNames') or PyJs_getOwnPropertyNames_1667_)) +PyJs_anonymous_1666_._set_name(u'anonymous') +PyJs_Object_1668_ = Js({u'./_enum-bug-keys':Js(149.0),u'./_object-keys-internal':Js(180.0)}) +@Js +def PyJs_anonymous_1669_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'exports').put(u'f', var.get(u'Object').get(u'getOwnPropertySymbols')) +PyJs_anonymous_1669_._set_name(u'anonymous') +PyJs_Object_1670_ = Js({}) +@Js +def PyJs_anonymous_1671_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toObject', u'module', u'IE_PROTO', u'ObjectProto', u'has', u'require']) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'IE_PROTO', var.get(u'require')(Js(u'./_shared-key'))(Js(u'IE_PROTO'))) + var.put(u'ObjectProto', var.get(u'Object').get(u'prototype')) + @Js + def PyJs_anonymous_1672_(O, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'O':O}, var) + var.registers([u'O']) + var.put(u'O', var.get(u'toObject')(var.get(u'O'))) + if var.get(u'has')(var.get(u'O'), var.get(u'IE_PROTO')): + return var.get(u'O').get(var.get(u'IE_PROTO')) + if ((var.get(u'O').get(u'constructor').typeof()==Js(u'function')) and var.get(u'O').instanceof(var.get(u'O').get(u'constructor'))): + return var.get(u'O').get(u'constructor').get(u'prototype') + return (var.get(u'ObjectProto') if var.get(u'O').instanceof(var.get(u'Object')) else var.get(u"null")) + PyJs_anonymous_1672_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'getPrototypeOf') or PyJs_anonymous_1672_)) +PyJs_anonymous_1671_._set_name(u'anonymous') +PyJs_Object_1673_ = Js({u'./_has':Js(155.0),u'./_shared-key':Js(190.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1674_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'IE_PROTO', u'toIObject', u'arrayIndexOf', u'has']) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'arrayIndexOf', var.get(u'require')(Js(u'./_array-includes'))(Js(False))) + var.put(u'IE_PROTO', var.get(u'require')(Js(u'./_shared-key'))(Js(u'IE_PROTO'))) + @Js + def PyJs_anonymous_1675_(object, names, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'names':names, u'arguments':arguments}, var) + var.registers([u'i', u'object', u'O', u'result', u'key', u'names']) + var.put(u'O', var.get(u'toIObject')(var.get(u'object'))) + var.put(u'i', Js(0.0)) + var.put(u'result', Js([])) + for PyJsTemp in var.get(u'O'): + var.put(u'key', PyJsTemp) + if (var.get(u'key')!=var.get(u'IE_PROTO')): + (var.get(u'has')(var.get(u'O'), var.get(u'key')) and var.get(u'result').callprop(u'push', var.get(u'key'))) + while (var.get(u'names').get(u'length')>var.get(u'i')): + if var.get(u'has')(var.get(u'O'), var.put(u'key', var.get(u'names').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))): + ((~var.get(u'arrayIndexOf')(var.get(u'result'), var.get(u'key'))) or var.get(u'result').callprop(u'push', var.get(u'key'))) + return var.get(u'result') + PyJs_anonymous_1675_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1675_) +PyJs_anonymous_1674_._set_name(u'anonymous') +PyJs_Object_1676_ = Js({u'./_array-includes':Js(134.0),u'./_has':Js(155.0),u'./_shared-key':Js(190.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1677_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'enumBugKeys', u'$keys', u'module']) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys-internal'))) + var.put(u'enumBugKeys', var.get(u'require')(Js(u'./_enum-bug-keys'))) + @Js + def PyJs_keys_1678_(O, this, arguments, var=var): + var = Scope({u'this':this, u'keys':PyJs_keys_1678_, u'arguments':arguments, u'O':O}, var) + var.registers([u'O']) + return var.get(u'$keys')(var.get(u'O'), var.get(u'enumBugKeys')) + PyJs_keys_1678_._set_name(u'keys') + var.get(u'module').put(u'exports', (var.get(u'Object').get(u'keys') or PyJs_keys_1678_)) +PyJs_anonymous_1677_._set_name(u'anonymous') +PyJs_Object_1679_ = Js({u'./_enum-bug-keys':Js(149.0),u'./_object-keys-internal':Js(180.0)}) +@Js +def PyJs_anonymous_1680_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1681_ = Js({}) + var.get(u'exports').put(u'f', PyJs_Object_1681_.get(u'propertyIsEnumerable')) +PyJs_anonymous_1680_._set_name(u'anonymous') +PyJs_Object_1682_ = Js({}) +@Js +def PyJs_anonymous_1683_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'fails', u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'fails', var.get(u'require')(Js(u'./_fails'))) + @Js + def PyJs_anonymous_1684_(KEY, PyJsArg_65786563_, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'KEY':KEY, u'exec':PyJsArg_65786563_}, var) + var.registers([u'KEY', u'exp', u'fn', u'exec']) + PyJs_Object_1685_ = Js({}) + var.put(u'fn', ((var.get(u'core').get(u'Object') or PyJs_Object_1685_).get(var.get(u'KEY')) or var.get(u'Object').get(var.get(u'KEY')))) + PyJs_Object_1686_ = Js({}) + var.put(u'exp', PyJs_Object_1686_) + var.get(u'exp').put(var.get(u'KEY'), var.get(u'exec')(var.get(u'fn'))) + @Js + def PyJs_anonymous_1687_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'fn')(Js(1.0)) + PyJs_anonymous_1687_._set_name(u'anonymous') + var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*var.get(u'fails')(PyJs_anonymous_1687_))), Js(u'Object'), var.get(u'exp')) + PyJs_anonymous_1684_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1684_) +PyJs_anonymous_1683_._set_name(u'anonymous') +PyJs_Object_1688_ = Js({u'./_core':Js(144.0),u'./_export':Js(151.0),u'./_fails':Js(152.0)}) +@Js +def PyJs_anonymous_1689_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_1690_(bitmap, value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value, u'bitmap':bitmap}, var) + var.registers([u'value', u'bitmap']) + PyJs_Object_1691_ = Js({u'enumerable':(var.get(u'bitmap')&Js(1.0)).neg(),u'configurable':(var.get(u'bitmap')&Js(2.0)).neg(),u'writable':(var.get(u'bitmap')&Js(4.0)).neg(),u'value':var.get(u'value')}) + return PyJs_Object_1691_ + PyJs_anonymous_1690_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1690_) +PyJs_anonymous_1689_._set_name(u'anonymous') +PyJs_Object_1692_ = Js({}) +@Js +def PyJs_anonymous_1693_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'hide', u'exports', u'module']) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + @Js + def PyJs_anonymous_1694_(target, src, safe, this, arguments, var=var): + var = Scope({u'this':this, u'src':src, u'safe':safe, u'target':target, u'arguments':arguments}, var) + var.registers([u'src', u'safe', u'target', u'key']) + for PyJsTemp in var.get(u'src'): + var.put(u'key', PyJsTemp) + if (var.get(u'safe') and var.get(u'target').get(var.get(u'key'))): + var.get(u'target').put(var.get(u'key'), var.get(u'src').get(var.get(u'key'))) + else: + var.get(u'hide')(var.get(u'target'), var.get(u'key'), var.get(u'src').get(var.get(u'key'))) + return var.get(u'target') + PyJs_anonymous_1694_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1694_) +PyJs_anonymous_1693_._set_name(u'anonymous') +PyJs_Object_1695_ = Js({u'./_hide':Js(156.0)}) +@Js +def PyJs_anonymous_1696_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_hide'))) +PyJs_anonymous_1696_._set_name(u'anonymous') +PyJs_Object_1697_ = Js({u'./_hide':Js(156.0)}) +@Js +def PyJs_anonymous_1698_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'check', u'anObject', u'isObject']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + @Js + def PyJs_anonymous_1699_(O, proto, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'O':O, u'proto':proto}, var) + var.registers([u'O', u'proto']) + var.get(u'anObject')(var.get(u'O')) + if (var.get(u'isObject')(var.get(u'proto')).neg() and PyJsStrictNeq(var.get(u'proto'),var.get(u"null"))): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'proto')+Js(u": can't set as prototype!")))) + raise PyJsTempException + PyJs_anonymous_1699_._set_name(u'anonymous') + var.put(u'check', PyJs_anonymous_1699_) + PyJs_Object_1701_ = Js({}) + @Js + def PyJs_anonymous_1702_(test, buggy, set, this, arguments, var=var): + var = Scope({u'test':test, u'this':this, u'buggy':buggy, u'set':set, u'arguments':arguments}, var) + var.registers([u'test', u'buggy', u'set']) + try: + var.put(u'set', var.get(u'require')(Js(u'./_ctx'))(var.get(u'Function').get(u'call'), var.get(u'require')(Js(u'./_object-gopd')).callprop(u'f', var.get(u'Object').get(u'prototype'), Js(u'__proto__')).get(u'set'), Js(2.0))) + var.get(u'set')(var.get(u'test'), Js([])) + var.put(u'buggy', var.get(u'test').instanceof(var.get(u'Array')).neg()) + except PyJsException as PyJsTempException: + PyJsHolder_65_30361003 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'buggy', var.get(u'true')) + finally: + if PyJsHolder_65_30361003 is not None: + var.own[u'e'] = PyJsHolder_65_30361003 + else: + del var.own[u'e'] + del PyJsHolder_65_30361003 + @Js + def PyJs_setPrototypeOf_1703_(O, proto, this, arguments, var=var): + var = Scope({u'this':this, u'setPrototypeOf':PyJs_setPrototypeOf_1703_, u'arguments':arguments, u'O':O, u'proto':proto}, var) + var.registers([u'O', u'proto']) + var.get(u'check')(var.get(u'O'), var.get(u'proto')) + if var.get(u'buggy'): + var.get(u'O').put(u'__proto__', var.get(u'proto')) + else: + var.get(u'set')(var.get(u'O'), var.get(u'proto')) + return var.get(u'O') + PyJs_setPrototypeOf_1703_._set_name(u'setPrototypeOf') + return PyJs_setPrototypeOf_1703_ + PyJs_anonymous_1702_._set_name(u'anonymous') + PyJs_Object_1704_ = Js({}) + PyJs_Object_1700_ = Js({u'set':(var.get(u'Object').get(u'setPrototypeOf') or (PyJs_anonymous_1702_(PyJs_Object_1701_, Js(False)) if PyJs_Object_1704_.contains(Js(u'__proto__')) else var.get(u'undefined'))),u'check':var.get(u'check')}) + var.get(u'module').put(u'exports', PyJs_Object_1700_) +PyJs_anonymous_1698_._set_name(u'anonymous') +PyJs_Object_1705_ = Js({u'./_an-object':Js(132.0),u'./_ctx':Js(145.0),u'./_is-object':Js(162.0),u'./_object-gopd':Js(175.0)}) +@Js +def PyJs_anonymous_1706_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'exports', u'DESCRIPTORS', u'require', u'global', u'module', u'SPECIES', u'dP']) + Js(u'use strict') + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'dP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + var.put(u'SPECIES', var.get(u'require')(Js(u'./_wks'))(Js(u'species'))) + @Js + def PyJs_anonymous_1707_(KEY, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'KEY':KEY}, var) + var.registers([u'C', u'KEY']) + var.put(u'C', (var.get(u'core').get(var.get(u'KEY')) if (var.get(u'core').get(var.get(u'KEY')).typeof()==Js(u'function')) else var.get(u'global').get(var.get(u'KEY')))) + if ((var.get(u'DESCRIPTORS') and var.get(u'C')) and var.get(u'C').get(var.get(u'SPECIES')).neg()): + @Js + def PyJs_anonymous_1709_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this") + PyJs_anonymous_1709_._set_name(u'anonymous') + PyJs_Object_1708_ = Js({u'configurable':var.get(u'true'),u'get':PyJs_anonymous_1709_}) + var.get(u'dP').callprop(u'f', var.get(u'C'), var.get(u'SPECIES'), PyJs_Object_1708_) + PyJs_anonymous_1707_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1707_) +PyJs_anonymous_1706_._set_name(u'anonymous') +PyJs_Object_1710_ = Js({u'./_core':Js(144.0),u'./_descriptors':Js(147.0),u'./_global':Js(154.0),u'./_object-dp':Js(173.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1711_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'TAG', u'has', u'def']) + var.put(u'def', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'TAG', var.get(u'require')(Js(u'./_wks'))(Js(u'toStringTag'))) + @Js + def PyJs_anonymous_1712_(it, tag, stat, this, arguments, var=var): + var = Scope({u'this':this, u'stat':stat, u'tag':tag, u'it':it, u'arguments':arguments}, var) + var.registers([u'stat', u'tag', u'it']) + if (var.get(u'it') and var.get(u'has')(var.put(u'it', (var.get(u'it') if var.get(u'stat') else var.get(u'it').get(u'prototype'))), var.get(u'TAG')).neg()): + PyJs_Object_1713_ = Js({u'configurable':var.get(u'true'),u'value':var.get(u'tag')}) + var.get(u'def')(var.get(u'it'), var.get(u'TAG'), PyJs_Object_1713_) + PyJs_anonymous_1712_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1712_) +PyJs_anonymous_1711_._set_name(u'anonymous') +PyJs_Object_1714_ = Js({u'./_has':Js(155.0),u'./_object-dp':Js(173.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1715_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'shared', u'require', u'exports', u'uid', u'module']) + var.put(u'shared', var.get(u'require')(Js(u'./_shared'))(Js(u'keys'))) + var.put(u'uid', var.get(u'require')(Js(u'./_uid'))) + @Js + def PyJs_anonymous_1716_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return (var.get(u'shared').get(var.get(u'key')) or var.get(u'shared').put(var.get(u'key'), var.get(u'uid')(var.get(u'key')))) + PyJs_anonymous_1716_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1716_) +PyJs_anonymous_1715_._set_name(u'anonymous') +PyJs_Object_1717_ = Js({u'./_shared':Js(191.0),u'./_uid':Js(199.0)}) +@Js +def PyJs_anonymous_1718_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'global', u'module', u'SHARED', u'store']) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'SHARED', Js(u'__core-js_shared__')) + PyJs_Object_1719_ = Js({}) + var.put(u'store', (var.get(u'global').get(var.get(u'SHARED')) or var.get(u'global').put(var.get(u'SHARED'), PyJs_Object_1719_))) + @Js + def PyJs_anonymous_1720_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + PyJs_Object_1721_ = Js({}) + return (var.get(u'store').get(var.get(u'key')) or var.get(u'store').put(var.get(u'key'), PyJs_Object_1721_)) + PyJs_anonymous_1720_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1720_) +PyJs_anonymous_1718_._set_name(u'anonymous') +PyJs_Object_1722_ = Js({u'./_global':Js(154.0)}) +@Js +def PyJs_anonymous_1723_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defined', u'toInteger', u'exports', u'require', u'module']) + var.put(u'toInteger', var.get(u'require')(Js(u'./_to-integer'))) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + @Js + def PyJs_anonymous_1724_(TO_STRING, this, arguments, var=var): + var = Scope({u'TO_STRING':TO_STRING, u'this':this, u'arguments':arguments}, var) + var.registers([u'TO_STRING']) + @Js + def PyJs_anonymous_1725_(that, pos, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'pos':pos, u'that':that}, var) + var.registers([u'a', u'b', u'that', u'i', u'l', u'pos', u's']) + var.put(u's', var.get(u'String')(var.get(u'defined')(var.get(u'that')))) + var.put(u'i', var.get(u'toInteger')(var.get(u'pos'))) + var.put(u'l', var.get(u's').get(u'length')) + if ((var.get(u'i')=var.get(u'l'))): + return (Js(u'') if var.get(u'TO_STRING') else var.get(u'undefined')) + var.put(u'a', var.get(u's').callprop(u'charCodeAt', var.get(u'i'))) + def PyJs_LONG_1726_(var=var): + return ((var.get(u's').callprop(u'charAt', var.get(u'i')) if var.get(u'TO_STRING') else var.get(u'a')) if (((((var.get(u'a')Js(56319))) or PyJsStrictEq((var.get(u'i')+Js(1.0)),var.get(u'l'))) or (var.put(u'b', var.get(u's').callprop(u'charCodeAt', (var.get(u'i')+Js(1.0))))Js(57343))) else (var.get(u's').callprop(u'slice', var.get(u'i'), (var.get(u'i')+Js(2.0))) if var.get(u'TO_STRING') else ((((var.get(u'a')-Js(55296))<Js(0.0)) else var.get(u'ceil'))(var.get(u'it'))) + PyJs_anonymous_1732_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1732_) +PyJs_anonymous_1731_._set_name(u'anonymous') +PyJs_Object_1733_ = Js({}) +@Js +def PyJs_anonymous_1734_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defined', u'require', u'exports', u'module', u'IObject']) + var.put(u'IObject', var.get(u'require')(Js(u'./_iobject'))) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + @Js + def PyJs_anonymous_1735_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'IObject')(var.get(u'defined')(var.get(u'it'))) + PyJs_anonymous_1735_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1735_) +PyJs_anonymous_1734_._set_name(u'anonymous') +PyJs_Object_1736_ = Js({u'./_defined':Js(146.0),u'./_iobject':Js(159.0)}) +@Js +def PyJs_anonymous_1737_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toInteger', u'exports', u'require', u'module', u'min']) + var.put(u'toInteger', var.get(u'require')(Js(u'./_to-integer'))) + var.put(u'min', var.get(u'Math').get(u'min')) + @Js + def PyJs_anonymous_1738_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'min')(var.get(u'toInteger')(var.get(u'it')), Js(9007199254740991)) if (var.get(u'it')>Js(0.0)) else Js(0.0)) + PyJs_anonymous_1738_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1738_) +PyJs_anonymous_1737_._set_name(u'anonymous') +PyJs_Object_1739_ = Js({u'./_to-integer':Js(194.0)}) +@Js +def PyJs_anonymous_1740_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'defined', u'require', u'exports', u'module']) + var.put(u'defined', var.get(u'require')(Js(u'./_defined'))) + @Js + def PyJs_anonymous_1741_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'Object')(var.get(u'defined')(var.get(u'it'))) + PyJs_anonymous_1741_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1741_) +PyJs_anonymous_1740_._set_name(u'anonymous') +PyJs_Object_1742_ = Js({u'./_defined':Js(146.0)}) +@Js +def PyJs_anonymous_1743_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isObject', u'module']) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + @Js + def PyJs_anonymous_1744_(it, S, this, arguments, var=var): + var = Scope({u'this':this, u'S':S, u'it':it, u'arguments':arguments}, var) + var.registers([u'S', u'val', u'fn', u'it']) + if var.get(u'isObject')(var.get(u'it')).neg(): + return var.get(u'it') + pass + if ((var.get(u'S') and (var.put(u'fn', var.get(u'it').get(u'toString')).typeof()==Js(u'function'))) and var.get(u'isObject')(var.put(u'val', var.get(u'fn').callprop(u'call', var.get(u'it')))).neg()): + return var.get(u'val') + if ((var.put(u'fn', var.get(u'it').get(u'valueOf')).typeof()==Js(u'function')) and var.get(u'isObject')(var.put(u'val', var.get(u'fn').callprop(u'call', var.get(u'it')))).neg()): + return var.get(u'val') + if ((var.get(u'S').neg() and (var.put(u'fn', var.get(u'it').get(u'toString')).typeof()==Js(u'function'))) and var.get(u'isObject')(var.put(u'val', var.get(u'fn').callprop(u'call', var.get(u'it')))).neg()): + return var.get(u'val') + PyJsTempException = JsToPyException(var.get(u'TypeError')(Js(u"Can't convert object to primitive value"))) + raise PyJsTempException + PyJs_anonymous_1744_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1744_) +PyJs_anonymous_1743_._set_name(u'anonymous') +PyJs_Object_1745_ = Js({u'./_is-object':Js(162.0)}) +@Js +def PyJs_anonymous_1746_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'px', u'require', u'id', u'module']) + var.put(u'id', Js(0.0)) + var.put(u'px', var.get(u'Math').callprop(u'random')) + @Js + def PyJs_anonymous_1747_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return Js(u'Symbol(').callprop(u'concat', (Js(u'') if PyJsStrictEq(var.get(u'key'),var.get(u'undefined')) else var.get(u'key')), Js(u')_'), (var.put(u'id',Js(var.get(u'id').to_number())+Js(1))+var.get(u'px')).callprop(u'toString', Js(36.0))) + PyJs_anonymous_1747_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1747_) +PyJs_anonymous_1746_._set_name(u'anonymous') +PyJs_Object_1748_ = Js({}) +@Js +def PyJs_anonymous_1749_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'core', u'exports', u'wksExt', u'require', u'global', u'LIBRARY', u'module', u'defineProperty']) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'core', var.get(u'require')(Js(u'./_core'))) + var.put(u'LIBRARY', var.get(u'require')(Js(u'./_library'))) + var.put(u'wksExt', var.get(u'require')(Js(u'./_wks-ext'))) + var.put(u'defineProperty', var.get(u'require')(Js(u'./_object-dp')).get(u'f')) + @Js + def PyJs_anonymous_1750_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name', u'$Symbol']) + PyJs_Object_1751_ = Js({}) + PyJs_Object_1752_ = Js({}) + var.put(u'$Symbol', (var.get(u'core').get(u'Symbol') or var.get(u'core').put(u'Symbol', (PyJs_Object_1751_ if var.get(u'LIBRARY') else (var.get(u'global').get(u'Symbol') or PyJs_Object_1752_))))) + if ((var.get(u'name').callprop(u'charAt', Js(0.0))!=Js(u'_')) and var.get(u'$Symbol').contains(var.get(u'name')).neg()): + PyJs_Object_1753_ = Js({u'value':var.get(u'wksExt').callprop(u'f', var.get(u'name'))}) + var.get(u'defineProperty')(var.get(u'$Symbol'), var.get(u'name'), PyJs_Object_1753_) + PyJs_anonymous_1750_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_1750_) +PyJs_anonymous_1749_._set_name(u'anonymous') +PyJs_Object_1754_ = Js({u'./_core':Js(144.0),u'./_global':Js(154.0),u'./_library':Js(169.0),u'./_object-dp':Js(173.0),u'./_wks-ext':Js(201.0)}) +@Js +def PyJs_anonymous_1755_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'exports').put(u'f', var.get(u'require')(Js(u'./_wks'))) +PyJs_anonymous_1755_._set_name(u'anonymous') +PyJs_Object_1756_ = Js({u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1757_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'uid', u'Symbol', u'module', u'$exports', u'require', u'store', u'USE_SYMBOL']) + var.put(u'store', var.get(u'require')(Js(u'./_shared'))(Js(u'wks'))) + var.put(u'uid', var.get(u'require')(Js(u'./_uid'))) + var.put(u'Symbol', var.get(u'require')(Js(u'./_global')).get(u'Symbol')) + var.put(u'USE_SYMBOL', (var.get(u'Symbol',throw=False).typeof()==Js(u'function'))) + @Js + def PyJs_anonymous_1758_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u'store').get(var.get(u'name')) or var.get(u'store').put(var.get(u'name'), ((var.get(u'USE_SYMBOL') and var.get(u'Symbol').get(var.get(u'name'))) or (var.get(u'Symbol') if var.get(u'USE_SYMBOL') else var.get(u'uid'))((Js(u'Symbol.')+var.get(u'name')))))) + PyJs_anonymous_1758_._set_name(u'anonymous') + var.put(u'$exports', var.get(u'module').put(u'exports', PyJs_anonymous_1758_)) + var.get(u'$exports').put(u'store', var.get(u'store')) +PyJs_anonymous_1757_._set_name(u'anonymous') +PyJs_Object_1759_ = Js({u'./_global':Js(154.0),u'./_shared':Js(191.0),u'./_uid':Js(199.0)}) +@Js +def PyJs_anonymous_1760_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'ITERATOR', u'require', u'module', u'Iterators', u'classof']) + var.put(u'classof', var.get(u'require')(Js(u'./_classof'))) + var.put(u'ITERATOR', var.get(u'require')(Js(u'./_wks'))(Js(u'iterator'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + @Js + def PyJs_anonymous_1761_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + if (var.get(u'it')!=var.get(u'undefined')): + return ((var.get(u'it').get(var.get(u'ITERATOR')) or var.get(u'it').get(u'@@iterator')) or var.get(u'Iterators').get(var.get(u'classof')(var.get(u'it')))) + PyJs_anonymous_1761_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_core')).put(u'getIteratorMethod', PyJs_anonymous_1761_)) +PyJs_anonymous_1760_._set_name(u'anonymous') +PyJs_Object_1762_ = Js({u'./_classof':Js(138.0),u'./_core':Js(144.0),u'./_iterators':Js(167.0),u'./_wks':Js(202.0)}) +@Js +def PyJs_anonymous_1763_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'anObject', u'exports', u'module', u'get']) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'get', var.get(u'require')(Js(u'./core.get-iterator-method'))) + @Js + def PyJs_anonymous_1764_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'iterFn', u'it']) + var.put(u'iterFn', var.get(u'get')(var.get(u'it'))) + if (var.get(u'iterFn',throw=False).typeof()!=Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'it')+Js(u' is not iterable!')))) + raise PyJsTempException + return var.get(u'anObject')(var.get(u'iterFn').callprop(u'call', var.get(u'it'))) + PyJs_anonymous_1764_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_core')).put(u'getIterator', PyJs_anonymous_1764_)) +PyJs_anonymous_1763_._set_name(u'anonymous') +PyJs_Object_1765_ = Js({u'./_an-object':Js(132.0),u'./_core':Js(144.0),u'./core.get-iterator-method':Js(203.0)}) +@Js +def PyJs_anonymous_1766_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'addToUnscopables', u'Iterators', u'step', u'toIObject']) + Js(u'use strict') + var.put(u'addToUnscopables', var.get(u'require')(Js(u'./_add-to-unscopables'))) + var.put(u'step', var.get(u'require')(Js(u'./_iter-step'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + @Js + def PyJs_anonymous_1767_(iterated, kind, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments, u'iterated':iterated}, var) + var.registers([u'kind', u'iterated']) + var.get(u"this").put(u'_t', var.get(u'toIObject')(var.get(u'iterated'))) + var.get(u"this").put(u'_i', Js(0.0)) + var.get(u"this").put(u'_k', var.get(u'kind')) + PyJs_anonymous_1767_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1768_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'index', u'kind', u'O']) + var.put(u'O', var.get(u"this").get(u'_t')) + var.put(u'kind', var.get(u"this").get(u'_k')) + var.put(u'index', (var.get(u"this").put(u'_i',Js(var.get(u"this").get(u'_i').to_number())+Js(1))-Js(1))) + if (var.get(u'O').neg() or (var.get(u'index')>=var.get(u'O').get(u'length'))): + var.get(u"this").put(u'_t', var.get(u'undefined')) + return var.get(u'step')(Js(1.0)) + if (var.get(u'kind')==Js(u'keys')): + return var.get(u'step')(Js(0.0), var.get(u'index')) + if (var.get(u'kind')==Js(u'values')): + return var.get(u'step')(Js(0.0), var.get(u'O').get(var.get(u'index'))) + return var.get(u'step')(Js(0.0), Js([var.get(u'index'), var.get(u'O').get(var.get(u'index'))])) + PyJs_anonymous_1768_._set_name(u'anonymous') + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_iter-define'))(var.get(u'Array'), Js(u'Array'), PyJs_anonymous_1767_, PyJs_anonymous_1768_, Js(u'values'))) + var.get(u'Iterators').put(u'Arguments', var.get(u'Iterators').get(u'Array')) + var.get(u'addToUnscopables')(Js(u'keys')) + var.get(u'addToUnscopables')(Js(u'values')) + var.get(u'addToUnscopables')(Js(u'entries')) +PyJs_anonymous_1766_._set_name(u'anonymous') +PyJs_Object_1769_ = Js({u'./_add-to-unscopables':Js(130.0),u'./_iter-define':Js(165.0),u'./_iter-step':Js(166.0),u'./_iterators':Js(167.0),u'./_to-iobject':Js(195.0)}) +@Js +def PyJs_anonymous_1770_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'strong', u'exports', u'module']) + Js(u'use strict') + var.put(u'strong', var.get(u'require')(Js(u'./_collection-strong'))) + @Js + def PyJs_anonymous_1771_(get, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':get}, var) + var.registers([u'get']) + @Js + def PyJs_Map_1772_(this, arguments, var=var): + var = Scope({u'this':this, u'Map':PyJs_Map_1772_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'get')(var.get(u"this"), (var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined'))) + PyJs_Map_1772_._set_name(u'Map') + return PyJs_Map_1772_ + PyJs_anonymous_1771_._set_name(u'anonymous') + @Js + def PyJs_get_1774_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'get':PyJs_get_1774_}, var) + var.registers([u'entry', u'key']) + var.put(u'entry', var.get(u'strong').callprop(u'getEntry', var.get(u"this"), var.get(u'key'))) + return (var.get(u'entry') and var.get(u'entry').get(u'v')) + PyJs_get_1774_._set_name(u'get') + @Js + def PyJs_set_1775_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'set':PyJs_set_1775_, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + return var.get(u'strong').callprop(u'def', var.get(u"this"), (Js(0.0) if PyJsStrictEq(var.get(u'key'),Js(0.0)) else var.get(u'key')), var.get(u'value')) + PyJs_set_1775_._set_name(u'set') + PyJs_Object_1773_ = Js({u'get':PyJs_get_1774_,u'set':PyJs_set_1775_}) + var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_collection'))(Js(u'Map'), PyJs_anonymous_1771_, PyJs_Object_1773_, var.get(u'strong'), var.get(u'true'))) +PyJs_anonymous_1770_._set_name(u'anonymous') +PyJs_Object_1776_ = Js({u'./_collection':Js(143.0),u'./_collection-strong':Js(140.0)}) +@Js +def PyJs_anonymous_1777_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1778_ = Js({u'MAX_SAFE_INTEGER':Js(9007199254740991)}) + var.get(u'$export')(var.get(u'$export').get(u'S'), Js(u'Number'), PyJs_Object_1778_) +PyJs_anonymous_1777_._set_name(u'anonymous') +PyJs_Object_1779_ = Js({u'./_export':Js(151.0)}) +@Js +def PyJs_anonymous_1780_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1781_ = Js({u'assign':var.get(u'require')(Js(u'./_object-assign'))}) + var.get(u'$export')((var.get(u'$export').get(u'S')+var.get(u'$export').get(u'F')), Js(u'Object'), PyJs_Object_1781_) +PyJs_anonymous_1780_._set_name(u'anonymous') +PyJs_Object_1782_ = Js({u'./_export':Js(151.0),u'./_object-assign':Js(171.0)}) +@Js +def PyJs_anonymous_1783_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1784_ = Js({u'create':var.get(u'require')(Js(u'./_object-create'))}) + var.get(u'$export')(var.get(u'$export').get(u'S'), Js(u'Object'), PyJs_Object_1784_) +PyJs_anonymous_1783_._set_name(u'anonymous') +PyJs_Object_1785_ = Js({u'./_export':Js(151.0),u'./_object-create':Js(172.0)}) +@Js +def PyJs_anonymous_1786_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toObject', u'require', u'$keys', u'module']) + var.put(u'toObject', var.get(u'require')(Js(u'./_to-object'))) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys'))) + @Js + def PyJs_anonymous_1787_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_keys_1788_(it, this, arguments, var=var): + var = Scope({u'this':this, u'keys':PyJs_keys_1788_, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'$keys')(var.get(u'toObject')(var.get(u'it'))) + PyJs_keys_1788_._set_name(u'keys') + return PyJs_keys_1788_ + PyJs_anonymous_1787_._set_name(u'anonymous') + var.get(u'require')(Js(u'./_object-sap'))(Js(u'keys'), PyJs_anonymous_1787_) +PyJs_anonymous_1786_._set_name(u'anonymous') +PyJs_Object_1789_ = Js({u'./_object-keys':Js(181.0),u'./_object-sap':Js(183.0),u'./_to-object':Js(197.0)}) +@Js +def PyJs_anonymous_1790_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1791_ = Js({u'setPrototypeOf':var.get(u'require')(Js(u'./_set-proto')).get(u'set')}) + var.get(u'$export')(var.get(u'$export').get(u'S'), Js(u'Object'), PyJs_Object_1791_) +PyJs_anonymous_1790_._set_name(u'anonymous') +PyJs_Object_1792_ = Js({u'./_export':Js(151.0),u'./_set-proto':Js(187.0)}) +@Js +def PyJs_anonymous_1793_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + pass +PyJs_anonymous_1793_._set_name(u'anonymous') +PyJs_Object_1794_ = Js({}) +@Js +def PyJs_anonymous_1795_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$at', u'require', u'exports', u'module']) + Js(u'use strict') + var.put(u'$at', var.get(u'require')(Js(u'./_string-at'))(var.get(u'true'))) + @Js + def PyJs_anonymous_1796_(iterated, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'iterated':iterated}, var) + var.registers([u'iterated']) + var.get(u"this").put(u'_t', var.get(u'String')(var.get(u'iterated'))) + var.get(u"this").put(u'_i', Js(0.0)) + PyJs_anonymous_1796_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1797_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'index', u'O', u'point']) + var.put(u'O', var.get(u"this").get(u'_t')) + var.put(u'index', var.get(u"this").get(u'_i')) + if (var.get(u'index')>=var.get(u'O').get(u'length')): + PyJs_Object_1798_ = Js({u'value':var.get(u'undefined'),u'done':var.get(u'true')}) + return PyJs_Object_1798_ + var.put(u'point', var.get(u'$at')(var.get(u'O'), var.get(u'index'))) + var.get(u"this").put(u'_i', var.get(u'point').get(u'length'), u'+') + PyJs_Object_1799_ = Js({u'value':var.get(u'point'),u'done':Js(False)}) + return PyJs_Object_1799_ + PyJs_anonymous_1797_._set_name(u'anonymous') + var.get(u'require')(Js(u'./_iter-define'))(var.get(u'String'), Js(u'String'), PyJs_anonymous_1796_, PyJs_anonymous_1797_) +PyJs_anonymous_1795_._set_name(u'anonymous') +PyJs_Object_1800_ = Js({u'./_iter-define':Js(165.0),u'./_string-at':Js(192.0)}) +@Js +def PyJs_anonymous_1801_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_create', u'redefine', u'uid', u'setter', u'global', u'$keys', u'$create', u'$JSON', u'$getOwnPropertySymbols', u'META', u'toIObject', u'$defineProperty', u'wrap', u'wks', u'PROTOTYPE', u'$propertyIsEnumerable', u'ObjectProto', u'OPSymbols', u'$export', u'gOPNExt', u'$DP', u'toPrimitive', u'$GOPD', u'gOPN', u'isEnum', u'keyOf', u'shared', u'gOPD', u'has', u'isArray', u'exports', u'wksExt', u'$fails', u'TO_PRIMITIVE', u'setToStringTag', u'enumKeys', u'SymbolRegistry', u'$defineProperties', u'anObject', u'module', u'$getOwnPropertyDescriptor', u'AllSymbols', u'USE_NATIVE', u'symbols', u'setSymbolDesc', u'i', u'DESCRIPTORS', u'require', u'$getOwnPropertyNames', u'$Symbol', u'_stringify', u'wksDefine', u'HIDDEN', u'isSymbol', u'createDesc', u'dP', u'QObject']) + Js(u'use strict') + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'has', var.get(u'require')(Js(u'./_has'))) + var.put(u'DESCRIPTORS', var.get(u'require')(Js(u'./_descriptors'))) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + var.put(u'redefine', var.get(u'require')(Js(u'./_redefine'))) + var.put(u'META', var.get(u'require')(Js(u'./_meta')).get(u'KEY')) + var.put(u'$fails', var.get(u'require')(Js(u'./_fails'))) + var.put(u'shared', var.get(u'require')(Js(u'./_shared'))) + var.put(u'setToStringTag', var.get(u'require')(Js(u'./_set-to-string-tag'))) + var.put(u'uid', var.get(u'require')(Js(u'./_uid'))) + var.put(u'wks', var.get(u'require')(Js(u'./_wks'))) + var.put(u'wksExt', var.get(u'require')(Js(u'./_wks-ext'))) + var.put(u'wksDefine', var.get(u'require')(Js(u'./_wks-define'))) + var.put(u'keyOf', var.get(u'require')(Js(u'./_keyof'))) + var.put(u'enumKeys', var.get(u'require')(Js(u'./_enum-keys'))) + var.put(u'isArray', var.get(u'require')(Js(u'./_is-array'))) + var.put(u'anObject', var.get(u'require')(Js(u'./_an-object'))) + var.put(u'toIObject', var.get(u'require')(Js(u'./_to-iobject'))) + var.put(u'toPrimitive', var.get(u'require')(Js(u'./_to-primitive'))) + var.put(u'createDesc', var.get(u'require')(Js(u'./_property-desc'))) + var.put(u'_create', var.get(u'require')(Js(u'./_object-create'))) + var.put(u'gOPNExt', var.get(u'require')(Js(u'./_object-gopn-ext'))) + var.put(u'$GOPD', var.get(u'require')(Js(u'./_object-gopd'))) + var.put(u'$DP', var.get(u'require')(Js(u'./_object-dp'))) + var.put(u'$keys', var.get(u'require')(Js(u'./_object-keys'))) + var.put(u'gOPD', var.get(u'$GOPD').get(u'f')) + var.put(u'dP', var.get(u'$DP').get(u'f')) + var.put(u'gOPN', var.get(u'gOPNExt').get(u'f')) + var.put(u'$Symbol', var.get(u'global').get(u'Symbol')) + var.put(u'$JSON', var.get(u'global').get(u'JSON')) + var.put(u'_stringify', (var.get(u'$JSON') and var.get(u'$JSON').get(u'stringify'))) + var.put(u'PROTOTYPE', Js(u'prototype')) + var.put(u'HIDDEN', var.get(u'wks')(Js(u'_hidden'))) + var.put(u'TO_PRIMITIVE', var.get(u'wks')(Js(u'toPrimitive'))) + PyJs_Object_1802_ = Js({}) + var.put(u'isEnum', PyJs_Object_1802_.get(u'propertyIsEnumerable')) + var.put(u'SymbolRegistry', var.get(u'shared')(Js(u'symbol-registry'))) + var.put(u'AllSymbols', var.get(u'shared')(Js(u'symbols'))) + var.put(u'OPSymbols', var.get(u'shared')(Js(u'op-symbols'))) + var.put(u'ObjectProto', var.get(u'Object').get(var.get(u'PROTOTYPE'))) + var.put(u'USE_NATIVE', (var.get(u'$Symbol',throw=False).typeof()==Js(u'function'))) + var.put(u'QObject', var.get(u'global').get(u'QObject')) + var.put(u'setter', ((var.get(u'QObject').neg() or var.get(u'QObject').get(var.get(u'PROTOTYPE')).neg()) or var.get(u'QObject').get(var.get(u'PROTOTYPE')).get(u'findChild').neg())) + @Js + def PyJs_anonymous_1803_(it, key, D, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'it':it, u'key':key, u'D':D}, var) + var.registers([u'protoDesc', u'it', u'key', u'D']) + var.put(u'protoDesc', var.get(u'gOPD')(var.get(u'ObjectProto'), var.get(u'key'))) + if var.get(u'protoDesc'): + var.get(u'ObjectProto').delete(var.get(u'key')) + var.get(u'dP')(var.get(u'it'), var.get(u'key'), var.get(u'D')) + if (var.get(u'protoDesc') and PyJsStrictNeq(var.get(u'it'),var.get(u'ObjectProto'))): + var.get(u'dP')(var.get(u'ObjectProto'), var.get(u'key'), var.get(u'protoDesc')) + PyJs_anonymous_1803_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1804_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1805_ = Js({}) + @Js + def PyJs_anonymous_1807_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_1808_ = Js({u'value':Js(7.0)}) + return var.get(u'dP')(var.get(u"this"), Js(u'a'), PyJs_Object_1808_).get(u'a') + PyJs_anonymous_1807_._set_name(u'anonymous') + PyJs_Object_1806_ = Js({u'get':PyJs_anonymous_1807_}) + return (var.get(u'_create')(var.get(u'dP')(PyJs_Object_1805_, Js(u'a'), PyJs_Object_1806_)).get(u'a')!=Js(7.0)) + PyJs_anonymous_1804_._set_name(u'anonymous') + var.put(u'setSymbolDesc', (PyJs_anonymous_1803_ if (var.get(u'DESCRIPTORS') and var.get(u'$fails')(PyJs_anonymous_1804_)) else var.get(u'dP'))) + @Js + def PyJs_anonymous_1809_(tag, this, arguments, var=var): + var = Scope({u'this':this, u'tag':tag, u'arguments':arguments}, var) + var.registers([u'tag', u'sym']) + var.put(u'sym', var.get(u'AllSymbols').put(var.get(u'tag'), var.get(u'_create')(var.get(u'$Symbol').get(var.get(u'PROTOTYPE'))))) + var.get(u'sym').put(u'_k', var.get(u'tag')) + return var.get(u'sym') + PyJs_anonymous_1809_._set_name(u'anonymous') + var.put(u'wrap', PyJs_anonymous_1809_) + @Js + def PyJs_anonymous_1810_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return (var.get(u'it',throw=False).typeof()==Js(u'symbol')) + PyJs_anonymous_1810_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1811_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'arguments':arguments}, var) + var.registers([u'it']) + return var.get(u'it').instanceof(var.get(u'$Symbol')) + PyJs_anonymous_1811_._set_name(u'anonymous') + var.put(u'isSymbol', (PyJs_anonymous_1810_ if (var.get(u'USE_NATIVE') and (var.get(u'$Symbol').get(u'iterator').typeof()==Js(u'symbol'))) else PyJs_anonymous_1811_)) + @Js + def PyJs_defineProperty_1812_(it, key, D, this, arguments, var=var): + var = Scope({u'D':D, u'this':this, u'it':it, u'arguments':arguments, u'key':key, u'defineProperty':PyJs_defineProperty_1812_}, var) + var.registers([u'it', u'key', u'D']) + if PyJsStrictEq(var.get(u'it'),var.get(u'ObjectProto')): + var.get(u'$defineProperty')(var.get(u'OPSymbols'), var.get(u'key'), var.get(u'D')) + var.get(u'anObject')(var.get(u'it')) + var.put(u'key', var.get(u'toPrimitive')(var.get(u'key'), var.get(u'true'))) + var.get(u'anObject')(var.get(u'D')) + if var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key')): + if var.get(u'D').get(u'enumerable').neg(): + if var.get(u'has')(var.get(u'it'), var.get(u'HIDDEN')).neg(): + PyJs_Object_1813_ = Js({}) + var.get(u'dP')(var.get(u'it'), var.get(u'HIDDEN'), var.get(u'createDesc')(Js(1.0), PyJs_Object_1813_)) + var.get(u'it').get(var.get(u'HIDDEN')).put(var.get(u'key'), var.get(u'true')) + else: + if (var.get(u'has')(var.get(u'it'), var.get(u'HIDDEN')) and var.get(u'it').get(var.get(u'HIDDEN')).get(var.get(u'key'))): + var.get(u'it').get(var.get(u'HIDDEN')).put(var.get(u'key'), Js(False)) + PyJs_Object_1814_ = Js({u'enumerable':var.get(u'createDesc')(Js(0.0), Js(False))}) + var.put(u'D', var.get(u'_create')(var.get(u'D'), PyJs_Object_1814_)) + return var.get(u'setSymbolDesc')(var.get(u'it'), var.get(u'key'), var.get(u'D')) + return var.get(u'dP')(var.get(u'it'), var.get(u'key'), var.get(u'D')) + PyJs_defineProperty_1812_._set_name(u'defineProperty') + var.put(u'$defineProperty', PyJs_defineProperty_1812_) + @Js + def PyJs_defineProperties_1815_(it, P, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'it':it, u'defineProperties':PyJs_defineProperties_1815_, u'arguments':arguments}, var) + var.registers([u'P', u'keys', u'l', u'it', u'i', u'key']) + var.get(u'anObject')(var.get(u'it')) + var.put(u'keys', var.get(u'enumKeys')(var.put(u'P', var.get(u'toIObject')(var.get(u'P'))))) + var.put(u'i', Js(0.0)) + var.put(u'l', var.get(u'keys').get(u'length')) + while (var.get(u'l')>var.get(u'i')): + var.get(u'$defineProperty')(var.get(u'it'), var.put(u'key', var.get(u'keys').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))), var.get(u'P').get(var.get(u'key'))) + return var.get(u'it') + PyJs_defineProperties_1815_._set_name(u'defineProperties') + var.put(u'$defineProperties', PyJs_defineProperties_1815_) + @Js + def PyJs_create_1816_(it, P, this, arguments, var=var): + var = Scope({u'this':this, u'P':P, u'create':PyJs_create_1816_, u'it':it, u'arguments':arguments}, var) + var.registers([u'P', u'it']) + return (var.get(u'_create')(var.get(u'it')) if PyJsStrictEq(var.get(u'P'),var.get(u'undefined')) else var.get(u'$defineProperties')(var.get(u'_create')(var.get(u'it')), var.get(u'P'))) + PyJs_create_1816_._set_name(u'create') + var.put(u'$create', PyJs_create_1816_) + @Js + def PyJs_propertyIsEnumerable_1817_(key, this, arguments, var=var): + var = Scope({u'this':this, u'propertyIsEnumerable':PyJs_propertyIsEnumerable_1817_, u'arguments':arguments, u'key':key}, var) + var.registers([u'E', u'key']) + var.put(u'E', var.get(u'isEnum').callprop(u'call', var.get(u"this"), var.put(u'key', var.get(u'toPrimitive')(var.get(u'key'), var.get(u'true'))))) + if ((PyJsStrictEq(var.get(u"this"),var.get(u'ObjectProto')) and var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key'))) and var.get(u'has')(var.get(u'OPSymbols'), var.get(u'key')).neg()): + return Js(False) + return (var.get(u'E') if (((var.get(u'E') or var.get(u'has')(var.get(u"this"), var.get(u'key')).neg()) or var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key')).neg()) or (var.get(u'has')(var.get(u"this"), var.get(u'HIDDEN')) and var.get(u"this").get(var.get(u'HIDDEN')).get(var.get(u'key')))) else var.get(u'true')) + PyJs_propertyIsEnumerable_1817_._set_name(u'propertyIsEnumerable') + var.put(u'$propertyIsEnumerable', PyJs_propertyIsEnumerable_1817_) + @Js + def PyJs_getOwnPropertyDescriptor_1818_(it, key, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnPropertyDescriptor':PyJs_getOwnPropertyDescriptor_1818_, u'it':it, u'key':key, u'arguments':arguments}, var) + var.registers([u'D', u'key', u'it']) + var.put(u'it', var.get(u'toIObject')(var.get(u'it'))) + var.put(u'key', var.get(u'toPrimitive')(var.get(u'key'), var.get(u'true'))) + if ((PyJsStrictEq(var.get(u'it'),var.get(u'ObjectProto')) and var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key'))) and var.get(u'has')(var.get(u'OPSymbols'), var.get(u'key')).neg()): + return var.get('undefined') + var.put(u'D', var.get(u'gOPD')(var.get(u'it'), var.get(u'key'))) + if ((var.get(u'D') and var.get(u'has')(var.get(u'AllSymbols'), var.get(u'key'))) and (var.get(u'has')(var.get(u'it'), var.get(u'HIDDEN')) and var.get(u'it').get(var.get(u'HIDDEN')).get(var.get(u'key'))).neg()): + var.get(u'D').put(u'enumerable', var.get(u'true')) + return var.get(u'D') + PyJs_getOwnPropertyDescriptor_1818_._set_name(u'getOwnPropertyDescriptor') + var.put(u'$getOwnPropertyDescriptor', PyJs_getOwnPropertyDescriptor_1818_) + @Js + def PyJs_getOwnPropertyNames_1819_(it, this, arguments, var=var): + var = Scope({u'this':this, u'it':it, u'getOwnPropertyNames':PyJs_getOwnPropertyNames_1819_, u'arguments':arguments}, var) + var.registers([u'i', u'it', u'names', u'key', u'result']) + var.put(u'names', var.get(u'gOPN')(var.get(u'toIObject')(var.get(u'it')))) + var.put(u'result', Js([])) + var.put(u'i', Js(0.0)) + while (var.get(u'names').get(u'length')>var.get(u'i')): + if ((var.get(u'has')(var.get(u'AllSymbols'), var.put(u'key', var.get(u'names').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))).neg() and (var.get(u'key')!=var.get(u'HIDDEN'))) and (var.get(u'key')!=var.get(u'META'))): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJs_getOwnPropertyNames_1819_._set_name(u'getOwnPropertyNames') + var.put(u'$getOwnPropertyNames', PyJs_getOwnPropertyNames_1819_) + @Js + def PyJs_getOwnPropertySymbols_1820_(it, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnPropertySymbols':PyJs_getOwnPropertySymbols_1820_, u'it':it, u'arguments':arguments}, var) + var.registers([u'i', u'it', u'names', u'key', u'IS_OP', u'result']) + var.put(u'IS_OP', PyJsStrictEq(var.get(u'it'),var.get(u'ObjectProto'))) + var.put(u'names', var.get(u'gOPN')((var.get(u'OPSymbols') if var.get(u'IS_OP') else var.get(u'toIObject')(var.get(u'it'))))) + var.put(u'result', Js([])) + var.put(u'i', Js(0.0)) + while (var.get(u'names').get(u'length')>var.get(u'i')): + if (var.get(u'has')(var.get(u'AllSymbols'), var.put(u'key', var.get(u'names').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1))))) and (var.get(u'has')(var.get(u'ObjectProto'), var.get(u'key')) if var.get(u'IS_OP') else var.get(u'true'))): + var.get(u'result').callprop(u'push', var.get(u'AllSymbols').get(var.get(u'key'))) + return var.get(u'result') + PyJs_getOwnPropertySymbols_1820_._set_name(u'getOwnPropertySymbols') + var.put(u'$getOwnPropertySymbols', PyJs_getOwnPropertySymbols_1820_) + if var.get(u'USE_NATIVE').neg(): + @Js + def PyJs_Symbol_1821_(this, arguments, var=var): + var = Scope({u'this':this, u'Symbol':PyJs_Symbol_1821_, u'arguments':arguments}, var) + var.registers([u'$set', u'tag']) + if var.get(u"this").instanceof(var.get(u'$Symbol')): + PyJsTempException = JsToPyException(var.get(u'TypeError')(Js(u'Symbol is not a constructor!'))) + raise PyJsTempException + var.put(u'tag', var.get(u'uid')((var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined')))) + @Js + def PyJs_anonymous_1822_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if PyJsStrictEq(var.get(u"this"),var.get(u'ObjectProto')): + var.get(u'$set').callprop(u'call', var.get(u'OPSymbols'), var.get(u'value')) + if (var.get(u'has')(var.get(u"this"), var.get(u'HIDDEN')) and var.get(u'has')(var.get(u"this").get(var.get(u'HIDDEN')), var.get(u'tag'))): + var.get(u"this").get(var.get(u'HIDDEN')).put(var.get(u'tag'), Js(False)) + var.get(u'setSymbolDesc')(var.get(u"this"), var.get(u'tag'), var.get(u'createDesc')(Js(1.0), var.get(u'value'))) + PyJs_anonymous_1822_._set_name(u'anonymous') + var.put(u'$set', PyJs_anonymous_1822_) + if (var.get(u'DESCRIPTORS') and var.get(u'setter')): + PyJs_Object_1823_ = Js({u'configurable':var.get(u'true'),u'set':var.get(u'$set')}) + var.get(u'setSymbolDesc')(var.get(u'ObjectProto'), var.get(u'tag'), PyJs_Object_1823_) + return var.get(u'wrap')(var.get(u'tag')) + PyJs_Symbol_1821_._set_name(u'Symbol') + var.put(u'$Symbol', PyJs_Symbol_1821_) + @Js + def PyJs_toString_1824_(this, arguments, var=var): + var = Scope({u'this':this, u'toString':PyJs_toString_1824_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'_k') + PyJs_toString_1824_._set_name(u'toString') + var.get(u'redefine')(var.get(u'$Symbol').get(var.get(u'PROTOTYPE')), Js(u'toString'), PyJs_toString_1824_) + var.get(u'$GOPD').put(u'f', var.get(u'$getOwnPropertyDescriptor')) + var.get(u'$DP').put(u'f', var.get(u'$defineProperty')) + var.get(u'require')(Js(u'./_object-gopn')).put(u'f', var.get(u'gOPNExt').put(u'f', var.get(u'$getOwnPropertyNames'))) + var.get(u'require')(Js(u'./_object-pie')).put(u'f', var.get(u'$propertyIsEnumerable')) + var.get(u'require')(Js(u'./_object-gops')).put(u'f', var.get(u'$getOwnPropertySymbols')) + if (var.get(u'DESCRIPTORS') and var.get(u'require')(Js(u'./_library')).neg()): + var.get(u'redefine')(var.get(u'ObjectProto'), Js(u'propertyIsEnumerable'), var.get(u'$propertyIsEnumerable'), var.get(u'true')) + @Js + def PyJs_anonymous_1825_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u'wrap')(var.get(u'wks')(var.get(u'name'))) + PyJs_anonymous_1825_._set_name(u'anonymous') + var.get(u'wksExt').put(u'f', PyJs_anonymous_1825_) + PyJs_Object_1826_ = Js({u'Symbol':var.get(u'$Symbol')}) + var.get(u'$export')(((var.get(u'$export').get(u'G')+var.get(u'$export').get(u'W'))+(var.get(u'$export').get(u'F')*var.get(u'USE_NATIVE').neg())), PyJs_Object_1826_) + #for JS loop + var.put(u'symbols', Js(u'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables').callprop(u'split', Js(u','))) + var.put(u'i', Js(0.0)) + while (var.get(u'symbols').get(u'length')>var.get(u'i')): + var.get(u'wks')(var.get(u'symbols').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + + #for JS loop + var.put(u'symbols', var.get(u'$keys')(var.get(u'wks').get(u'store'))) + var.put(u'i', Js(0.0)) + while (var.get(u'symbols').get(u'length')>var.get(u'i')): + var.get(u'wksDefine')(var.get(u'symbols').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + + @Js + def PyJs_anonymous_1828_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return (var.get(u'SymbolRegistry').get(var.get(u'key')) if var.get(u'has')(var.get(u'SymbolRegistry'), var.put(u'key', Js(u''), u'+')) else var.get(u'SymbolRegistry').put(var.get(u'key'), var.get(u'$Symbol')(var.get(u'key')))) + PyJs_anonymous_1828_._set_name(u'anonymous') + @Js + def PyJs_keyFor_1829_(key, this, arguments, var=var): + var = Scope({u'this':this, u'keyFor':PyJs_keyFor_1829_, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if var.get(u'isSymbol')(var.get(u'key')): + return var.get(u'keyOf')(var.get(u'SymbolRegistry'), var.get(u'key')) + PyJsTempException = JsToPyException(var.get(u'TypeError')((var.get(u'key')+Js(u' is not a symbol!')))) + raise PyJsTempException + PyJs_keyFor_1829_._set_name(u'keyFor') + @Js + def PyJs_anonymous_1830_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.put(u'setter', var.get(u'true')) + PyJs_anonymous_1830_._set_name(u'anonymous') + @Js + def PyJs_anonymous_1831_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.put(u'setter', Js(False)) + PyJs_anonymous_1831_._set_name(u'anonymous') + PyJs_Object_1827_ = Js({u'for':PyJs_anonymous_1828_,u'keyFor':PyJs_keyFor_1829_,u'useSetter':PyJs_anonymous_1830_,u'useSimple':PyJs_anonymous_1831_}) + var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*var.get(u'USE_NATIVE').neg())), Js(u'Symbol'), PyJs_Object_1827_) + PyJs_Object_1832_ = Js({u'create':var.get(u'$create'),u'defineProperty':var.get(u'$defineProperty'),u'defineProperties':var.get(u'$defineProperties'),u'getOwnPropertyDescriptor':var.get(u'$getOwnPropertyDescriptor'),u'getOwnPropertyNames':var.get(u'$getOwnPropertyNames'),u'getOwnPropertySymbols':var.get(u'$getOwnPropertySymbols')}) + var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*var.get(u'USE_NATIVE').neg())), Js(u'Object'), PyJs_Object_1832_) + @Js + def PyJs_anonymous_1833_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'S']) + var.put(u'S', var.get(u'$Symbol')()) + PyJs_Object_1834_ = Js({u'a':var.get(u'S')}) + return (((var.get(u'_stringify')(Js([var.get(u'S')]))!=Js(u'[null]')) or (var.get(u'_stringify')(PyJs_Object_1834_)!=Js(u'{}'))) or (var.get(u'_stringify')(var.get(u'Object')(var.get(u'S')))!=Js(u'{}'))) + PyJs_anonymous_1833_._set_name(u'anonymous') + @Js + def PyJs_stringify_1836_(it, this, arguments, var=var): + var = Scope({u'this':this, u'stringify':PyJs_stringify_1836_, u'it':it, u'arguments':arguments}, var) + var.registers([u'i', u'replacer', u'args', u'it', u'$replacer']) + if (PyJsStrictEq(var.get(u'it'),var.get(u'undefined')) or var.get(u'isSymbol')(var.get(u'it'))): + return var.get('undefined') + var.put(u'args', Js([var.get(u'it')])) + var.put(u'i', Js(1.0)) + while (var.get(u'arguments').get(u'length')>var.get(u'i')): + var.get(u'args').callprop(u'push', var.get(u'arguments').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + var.put(u'replacer', var.get(u'args').get(u'1')) + if (var.get(u'replacer',throw=False).typeof()==Js(u'function')): + var.put(u'$replacer', var.get(u'replacer')) + if (var.get(u'$replacer') or var.get(u'isArray')(var.get(u'replacer')).neg()): + @Js + def PyJs_anonymous_1837_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + if var.get(u'$replacer'): + var.put(u'value', var.get(u'$replacer').callprop(u'call', var.get(u"this"), var.get(u'key'), var.get(u'value'))) + if var.get(u'isSymbol')(var.get(u'value')).neg(): + return var.get(u'value') + PyJs_anonymous_1837_._set_name(u'anonymous') + var.put(u'replacer', PyJs_anonymous_1837_) + var.get(u'args').put(u'1', var.get(u'replacer')) + return var.get(u'_stringify').callprop(u'apply', var.get(u'$JSON'), var.get(u'args')) + PyJs_stringify_1836_._set_name(u'stringify') + PyJs_Object_1835_ = Js({u'stringify':PyJs_stringify_1836_}) + (var.get(u'$JSON') and var.get(u'$export')((var.get(u'$export').get(u'S')+(var.get(u'$export').get(u'F')*(var.get(u'USE_NATIVE').neg() or var.get(u'$fails')(PyJs_anonymous_1833_)))), Js(u'JSON'), PyJs_Object_1835_)) + (var.get(u'$Symbol').get(var.get(u'PROTOTYPE')).get(var.get(u'TO_PRIMITIVE')) or var.get(u'require')(Js(u'./_hide'))(var.get(u'$Symbol').get(var.get(u'PROTOTYPE')), var.get(u'TO_PRIMITIVE'), var.get(u'$Symbol').get(var.get(u'PROTOTYPE')).get(u'valueOf'))) + var.get(u'setToStringTag')(var.get(u'$Symbol'), Js(u'Symbol')) + var.get(u'setToStringTag')(var.get(u'Math'), Js(u'Math'), var.get(u'true')) + var.get(u'setToStringTag')(var.get(u'global').get(u'JSON'), Js(u'JSON'), var.get(u'true')) +PyJs_anonymous_1801_._set_name(u'anonymous') +PyJs_Object_1838_ = Js({u'./_an-object':Js(132.0),u'./_descriptors':Js(147.0),u'./_enum-keys':Js(150.0),u'./_export':Js(151.0),u'./_fails':Js(152.0),u'./_global':Js(154.0),u'./_has':Js(155.0),u'./_hide':Js(156.0),u'./_is-array':Js(161.0),u'./_keyof':Js(168.0),u'./_library':Js(169.0),u'./_meta':Js(170.0),u'./_object-create':Js(172.0),u'./_object-dp':Js(173.0),u'./_object-gopd':Js(175.0),u'./_object-gopn':Js(177.0),u'./_object-gopn-ext':Js(176.0),u'./_object-gops':Js(178.0),u'./_object-keys':Js(181.0),u'./_object-pie':Js(182.0),u'./_property-desc':Js(184.0),u'./_redefine':Js(186.0),u'./_set-to-string-tag':Js(189.0),u'./_shared':Js(191.0),u'./_to-iobject':Js(195.0),u'./_to-primitive':Js(198.0),u'./_uid':Js(199.0),u'./_wks':Js(202.0),u'./_wks-define':Js(200.0),u'./_wks-ext':Js(201.0)}) +@Js +def PyJs_anonymous_1839_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'tmp', u'redefine', u'InternalMap', u'methods', u'$WeakMap', u'require', u'isExtensible', u'weak', u'exports', u'wrapper', u'isObject', u'meta', u'module', u'each', u'uncaughtFrozenStore', u'getWeak', u'assign']) + Js(u'use strict') + var.put(u'each', var.get(u'require')(Js(u'./_array-methods'))(Js(0.0))) + var.put(u'redefine', var.get(u'require')(Js(u'./_redefine'))) + var.put(u'meta', var.get(u'require')(Js(u'./_meta'))) + var.put(u'assign', var.get(u'require')(Js(u'./_object-assign'))) + var.put(u'weak', var.get(u'require')(Js(u'./_collection-weak'))) + var.put(u'isObject', var.get(u'require')(Js(u'./_is-object'))) + var.put(u'getWeak', var.get(u'meta').get(u'getWeak')) + var.put(u'isExtensible', var.get(u'Object').get(u'isExtensible')) + var.put(u'uncaughtFrozenStore', var.get(u'weak').get(u'ufstore')) + PyJs_Object_1840_ = Js({}) + var.put(u'tmp', PyJs_Object_1840_) + @Js + def PyJs_anonymous_1841_(get, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':get}, var) + var.registers([u'get']) + @Js + def PyJs_WeakMap_1842_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'WeakMap':PyJs_WeakMap_1842_}, var) + var.registers([]) + return var.get(u'get')(var.get(u"this"), (var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined'))) + PyJs_WeakMap_1842_._set_name(u'WeakMap') + return PyJs_WeakMap_1842_ + PyJs_anonymous_1841_._set_name(u'anonymous') + var.put(u'wrapper', PyJs_anonymous_1841_) + @Js + def PyJs_get_1844_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key, u'get':PyJs_get_1844_}, var) + var.registers([u'data', u'key']) + if var.get(u'isObject')(var.get(u'key')): + var.put(u'data', var.get(u'getWeak')(var.get(u'key'))) + if PyJsStrictEq(var.get(u'data'),var.get(u'true')): + return var.get(u'uncaughtFrozenStore')(var.get(u"this")).callprop(u'get', var.get(u'key')) + return (var.get(u'data').get(var.get(u"this").get(u'_i')) if var.get(u'data') else var.get(u'undefined')) + PyJs_get_1844_._set_name(u'get') + @Js + def PyJs_set_1845_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'set':PyJs_set_1845_, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + return var.get(u'weak').callprop(u'def', var.get(u"this"), var.get(u'key'), var.get(u'value')) + PyJs_set_1845_._set_name(u'set') + PyJs_Object_1843_ = Js({u'get':PyJs_get_1844_,u'set':PyJs_set_1845_}) + var.put(u'methods', PyJs_Object_1843_) + var.put(u'$WeakMap', var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./_collection'))(Js(u'WeakMap'), var.get(u'wrapper'), var.get(u'methods'), var.get(u'weak'), var.get(u'true'), var.get(u'true')))) + if (var.get(u'$WeakMap').create().callprop(u'set', (var.get(u'Object').get(u'freeze') or var.get(u'Object'))(var.get(u'tmp')), Js(7.0)).callprop(u'get', var.get(u'tmp'))!=Js(7.0)): + var.put(u'InternalMap', var.get(u'weak').callprop(u'getConstructor', var.get(u'wrapper'))) + var.get(u'assign')(var.get(u'InternalMap').get(u'prototype'), var.get(u'methods')) + var.get(u'meta').put(u'NEED', var.get(u'true')) + @Js + def PyJs_anonymous_1846_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'method', u'key', u'proto']) + var.put(u'proto', var.get(u'$WeakMap').get(u'prototype')) + var.put(u'method', var.get(u'proto').get(var.get(u'key'))) + @Js + def PyJs_anonymous_1847_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u'result']) + if (var.get(u'isObject')(var.get(u'a')) and var.get(u'isExtensible')(var.get(u'a')).neg()): + if var.get(u"this").get(u'_f').neg(): + var.get(u"this").put(u'_f', var.get(u'InternalMap').create()) + var.put(u'result', var.get(u"this").get(u'_f').callprop(var.get(u'key'), var.get(u'a'), var.get(u'b'))) + return (var.get(u"this") if (var.get(u'key')==Js(u'set')) else var.get(u'result')) + return var.get(u'method').callprop(u'call', var.get(u"this"), var.get(u'a'), var.get(u'b')) + PyJs_anonymous_1847_._set_name(u'anonymous') + var.get(u'redefine')(var.get(u'proto'), var.get(u'key'), PyJs_anonymous_1847_) + PyJs_anonymous_1846_._set_name(u'anonymous') + var.get(u'each')(Js([Js(u'delete'), Js(u'has'), Js(u'get'), Js(u'set')]), PyJs_anonymous_1846_) +PyJs_anonymous_1839_._set_name(u'anonymous') +PyJs_Object_1848_ = Js({u'./_array-methods':Js(135.0),u'./_collection':Js(143.0),u'./_collection-weak':Js(142.0),u'./_is-object':Js(162.0),u'./_meta':Js(170.0),u'./_object-assign':Js(171.0),u'./_redefine':Js(186.0)}) +@Js +def PyJs_anonymous_1849_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'weak', u'exports', u'module']) + Js(u'use strict') + var.put(u'weak', var.get(u'require')(Js(u'./_collection-weak'))) + @Js + def PyJs_anonymous_1850_(get, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':get}, var) + var.registers([u'get']) + @Js + def PyJs_WeakSet_1851_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'WeakSet':PyJs_WeakSet_1851_}, var) + var.registers([]) + return var.get(u'get')(var.get(u"this"), (var.get(u'arguments').get(u'0') if (var.get(u'arguments').get(u'length')>Js(0.0)) else var.get(u'undefined'))) + PyJs_WeakSet_1851_._set_name(u'WeakSet') + return PyJs_WeakSet_1851_ + PyJs_anonymous_1850_._set_name(u'anonymous') + @Js + def PyJs_add_1853_(value, this, arguments, var=var): + var = Scope({u'this':this, u'add':PyJs_add_1853_, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'weak').callprop(u'def', var.get(u"this"), var.get(u'value'), var.get(u'true')) + PyJs_add_1853_._set_name(u'add') + PyJs_Object_1852_ = Js({u'add':PyJs_add_1853_}) + var.get(u'require')(Js(u'./_collection'))(Js(u'WeakSet'), PyJs_anonymous_1850_, PyJs_Object_1852_, var.get(u'weak'), Js(False), var.get(u'true')) +PyJs_anonymous_1849_._set_name(u'anonymous') +PyJs_Object_1854_ = Js({u'./_collection':Js(143.0),u'./_collection-weak':Js(142.0)}) +@Js +def PyJs_anonymous_1855_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'$export', u'require', u'exports', u'module']) + var.put(u'$export', var.get(u'require')(Js(u'./_export'))) + PyJs_Object_1856_ = Js({u'toJSON':var.get(u'require')(Js(u'./_collection-to-json'))(Js(u'Map'))}) + var.get(u'$export')((var.get(u'$export').get(u'P')+var.get(u'$export').get(u'R')), Js(u'Map'), PyJs_Object_1856_) +PyJs_anonymous_1855_._set_name(u'anonymous') +PyJs_Object_1857_ = Js({u'./_collection-to-json':Js(141.0),u'./_export':Js(151.0)}) +@Js +def PyJs_anonymous_1858_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'./_wks-define'))(Js(u'asyncIterator')) +PyJs_anonymous_1858_._set_name(u'anonymous') +PyJs_Object_1859_ = Js({u'./_wks-define':Js(200.0)}) +@Js +def PyJs_anonymous_1860_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'require')(Js(u'./_wks-define'))(Js(u'observable')) +PyJs_anonymous_1860_._set_name(u'anonymous') +PyJs_Object_1861_ = Js({u'./_wks-define':Js(200.0)}) +@Js +def PyJs_anonymous_1862_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'TO_STRING_TAG', u'exports', u'hide', u'NAME', u'proto', u'i', u'require', u'global', u'Collection', u'Iterators', u'collections', u'module']) + var.get(u'require')(Js(u'./es6.array.iterator')) + var.put(u'global', var.get(u'require')(Js(u'./_global'))) + var.put(u'hide', var.get(u'require')(Js(u'./_hide'))) + var.put(u'Iterators', var.get(u'require')(Js(u'./_iterators'))) + var.put(u'TO_STRING_TAG', var.get(u'require')(Js(u'./_wks'))(Js(u'toStringTag'))) + #for JS loop + var.put(u'collections', Js([Js(u'NodeList'), Js(u'DOMTokenList'), Js(u'MediaList'), Js(u'StyleSheetList'), Js(u'CSSRuleList')])) + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)): + return var.get(u'program').get(u'body') + else: + return var.get(u'program').get(u'body').get(u'0') + PyJsHoisted_useTemplate_.func_name = u'useTemplate' + var.put(u'useTemplate', PyJsHoisted_useTemplate_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1872_ = Js({}) + var.put(u'newObj', PyJs_Object_1872_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_symbol', var.get(u'require')(Js(u'babel-runtime/core-js/symbol'))) + var.put(u'_symbol2', var.get(u'_interopRequireDefault')(var.get(u'_symbol'))) + @Js + def PyJs_anonymous_1865_(code, opts, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'_getAst', u'code', u'stack', u'opts']) + var.put(u'stack', PyJsComma(Js(0.0), Js(None))) + try: + PyJsTempException = JsToPyException(var.get(u'Error').create()) + raise PyJsTempException + except PyJsException as PyJsTempException: + PyJsHolder_6572726f72_58122749 = var.own.get(u'error') + var.force_own_put(u'error', PyExceptionToJs(PyJsTempException)) + try: + if var.get(u'error').get(u'stack'): + var.put(u'stack', var.get(u'error').get(u'stack').callprop(u'split', Js(u'\n')).callprop(u'slice', Js(1.0)).callprop(u'join', Js(u'\n'))) + finally: + if PyJsHolder_6572726f72_58122749 is not None: + var.own[u'error'] = PyJsHolder_6572726f72_58122749 + else: + del var.own[u'error'] + del PyJsHolder_6572726f72_58122749 + PyJs_Object_1866_ = Js({u'allowReturnOutsideFunction':var.get(u'true'),u'allowSuperOutsideMethod':var.get(u'true'),u'preserveComments':Js(False)}) + var.put(u'opts', PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(PyJs_Object_1866_, var.get(u'opts'))) + @Js + def PyJs_getAst_1867_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAst':PyJs_getAst_1867_}, var) + var.registers([u'ast']) + var.put(u'ast', PyJsComma(Js(0.0), Js(None))) + try: + var.put(u'ast', var.get(u'babylon').callprop(u'parse', var.get(u'code'), var.get(u'opts'))) + PyJs_Object_1868_ = Js({u'preserveComments':var.get(u'opts').get(u'preserveComments')}) + var.put(u'ast', var.get(u'_babelTraverse2').get(u'default').callprop(u'removeProperties', var.get(u'ast'), PyJs_Object_1868_)) + @Js + def PyJs_anonymous_1869_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(var.get(u'FROM_TEMPLATE'), var.get(u'true')) + PyJs_anonymous_1869_._set_name(u'anonymous') + var.get(u'_babelTraverse2').get(u'default').callprop(u'cheap', var.get(u'ast'), PyJs_anonymous_1869_) + except PyJsException as PyJsTempException: + PyJsHolder_657272_43794349 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + var.get(u'err').put(u'stack', ((var.get(u'err').get(u'stack')+Js(u'from\n'))+var.get(u'stack'))) + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_43794349 is not None: + var.own[u'err'] = PyJsHolder_657272_43794349 + else: + del var.own[u'err'] + del PyJsHolder_657272_43794349 + @Js + def PyJs_getAst_1870_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAst':PyJs_getAst_1870_}, var) + var.registers([]) + return var.get(u'ast') + PyJs_getAst_1870_._set_name(u'getAst') + var.put(u'_getAst', PyJs_getAst_1870_) + return var.get(u'ast') + PyJs_getAst_1867_._set_name(u'getAst') + var.put(u'_getAst', PyJs_getAst_1867_) + @Js + def PyJs_anonymous_1871_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_len', u'_key', u'args']) + #for JS loop + var.put(u'_len', var.get(u'arguments').get(u'length')) + var.put(u'args', var.get(u'Array')(var.get(u'_len'))) + var.put(u'_key', Js(0.0)) + while (var.get(u'_key')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'key', var.get(u'_ref')) + if var.get(u'node').get(var.get(u'key')): + return var.get(u'true') + + return Js(False) + PyJs_shouldVisit_1886_._set_name(u'shouldVisit') + var.get(u'TraversalContext').get(u'prototype').put(u'shouldVisit', PyJs_shouldVisit_1886_) + @Js + def PyJs_create_1887_(node, obj, key, listKey, this, arguments, var=var): + var = Scope({u'node':node, u'obj':obj, u'arguments':arguments, u'key':key, u'this':this, u'listKey':listKey, u'create':PyJs_create_1887_}, var) + var.registers([u'node', u'listKey', u'obj', u'key']) + PyJs_Object_1888_ = Js({u'parentPath':var.get(u"this").get(u'parentPath'),u'parent':var.get(u'node'),u'container':var.get(u'obj'),u'key':var.get(u'key'),u'listKey':var.get(u'listKey')}) + return var.get(u'_path3').get(u'default').callprop(u'get', PyJs_Object_1888_) + PyJs_create_1887_._set_name(u'create') + var.get(u'TraversalContext').get(u'prototype').put(u'create', PyJs_create_1887_) + @Js + def PyJs_maybeQueue_1889_(path, notPriority, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'maybeQueue':PyJs_maybeQueue_1889_, u'notPriority':notPriority, u'arguments':arguments}, var) + var.registers([u'path', u'notPriority']) + if var.get(u"this").get(u'trap'): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Infinite cycle detected'))) + raise PyJsTempException + if var.get(u"this").get(u'queue'): + if var.get(u'notPriority'): + var.get(u"this").get(u'queue').callprop(u'push', var.get(u'path')) + else: + var.get(u"this").get(u'priorityQueue').callprop(u'push', var.get(u'path')) + PyJs_maybeQueue_1889_._set_name(u'maybeQueue') + var.get(u'TraversalContext').get(u'prototype').put(u'maybeQueue', PyJs_maybeQueue_1889_) + @Js + def PyJs_visitMultiple_1890_(container, parent, listKey, this, arguments, var=var): + var = Scope({u'visitMultiple':PyJs_visitMultiple_1890_, u'container':container, u'parent':parent, u'this':this, u'listKey':listKey, u'arguments':arguments}, var) + var.registers([u'node', u'container', u'parent', u'listKey', u'queue', u'key']) + if PyJsStrictEq(var.get(u'container').get(u'length'),Js(0.0)): + return Js(False) + var.put(u'queue', Js([])) + #for JS loop + var.put(u'key', Js(0.0)) + while (var.get(u'key')=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'path', var.get(u'_ref2')) + var.get(u'path').callprop(u'resync') + if (PyJsStrictEq(var.get(u'path').get(u'contexts').get(u'length'),Js(0.0)) or PyJsStrictNeq(var.get(u'path').get(u'contexts').get((var.get(u'path').get(u'contexts').get(u'length')-Js(1.0))),var.get(u"this"))): + var.get(u'path').callprop(u'pushContext', var.get(u"this")) + if PyJsStrictEq(var.get(u'path').get(u'key'),var.get(u"null")): + continue + if (var.get(u'testing') and (var.get(u'queue').get(u'length')>=Js(10000.0))): + var.get(u"this").put(u'trap', var.get(u'true')) + if (var.get(u'visited').callprop(u'indexOf', var.get(u'path').get(u'node'))>=Js(0.0)): + continue + var.get(u'visited').callprop(u'push', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'visit'): + var.put(u'stop', var.get(u'true')) + break + if var.get(u"this").get(u'priorityQueue').get(u'length'): + var.put(u'stop', var.get(u"this").callprop(u'visitQueue', var.get(u"this").get(u'priorityQueue'))) + var.get(u"this").put(u'priorityQueue', Js([])) + var.get(u"this").put(u'queue', var.get(u'queue')) + if var.get(u'stop'): + break + + #for JS loop + var.put(u'_iterator3', var.get(u'queue')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'_path', var.get(u'_ref3')) + var.get(u'_path').callprop(u'popContext') + + var.get(u"this").put(u'queue', var.get(u"null")) + return var.get(u'stop') + PyJs_visitQueue_1892_._set_name(u'visitQueue') + var.get(u'TraversalContext').get(u'prototype').put(u'visitQueue', PyJs_visitQueue_1892_) + @Js + def PyJs_visit_1893_(node, key, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'visit':PyJs_visit_1893_, u'arguments':arguments, u'key':key}, var) + var.registers([u'node', u'nodes', u'key']) + var.put(u'nodes', var.get(u'node').get(var.get(u'key'))) + if var.get(u'nodes').neg(): + return Js(False) + if var.get(u'Array').callprop(u'isArray', var.get(u'nodes')): + return var.get(u"this").callprop(u'visitMultiple', var.get(u'nodes'), var.get(u'node'), var.get(u'key')) + else: + return var.get(u"this").callprop(u'visitSingle', var.get(u'node'), var.get(u'key')) + PyJs_visit_1893_._set_name(u'visit') + var.get(u'TraversalContext').get(u'prototype').put(u'visit', PyJs_visit_1893_) + return var.get(u'TraversalContext') + PyJs_anonymous_1885_._set_name(u'anonymous') + var.put(u'TraversalContext', PyJs_anonymous_1885_()) + var.get(u'exports').put(u'default', var.get(u'TraversalContext')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) + PyJs_anonymous_1882_._set_name(u'anonymous') + PyJs_anonymous_1882_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'_process'))) +PyJs_anonymous_1881_._set_name(u'anonymous') +PyJs_Object_1894_ = Js({u'./path':Js(232.0),u'_process':Js(531.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1895_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Hub', u'require', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1896_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1896_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + pass + @Js + def PyJs_Hub_1897_(file, options, this, arguments, var=var): + var = Scope({u'this':this, u'Hub':PyJs_Hub_1897_, u'options':options, u'file':file, u'arguments':arguments}, var) + var.registers([u'options', u'file']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Hub')) + var.get(u"this").put(u'file', var.get(u'file')) + var.get(u"this").put(u'options', var.get(u'options')) + PyJs_Hub_1897_._set_name(u'Hub') + var.put(u'Hub', PyJs_Hub_1897_) + var.get(u'exports').put(u'default', var.get(u'Hub')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1895_._set_name(u'anonymous') +PyJs_Object_1898_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_1899_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'traverse', u'_context', u'_scope', u'module', u'_hub', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'_context2', u'_visitors', u'cache', u'hasBlacklistedType', u'_babelMessages', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'_includes2', u'visitors', u'_includes', u'require', u'messages', u't', u'_path']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1907_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1907_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_traverse_(parent, opts, scope, state, parentPath, this, arguments, var=var): + var = Scope({u'state':state, u'arguments':arguments, u'parent':parent, u'parentPath':parentPath, u'this':this, u'scope':scope, u'opts':opts}, var) + var.registers([u'scope', u'state', u'opts', u'parent', u'parentPath']) + if var.get(u'parent').neg(): + return var.get('undefined') + if var.get(u'opts').neg(): + PyJs_Object_1908_ = Js({}) + var.put(u'opts', PyJs_Object_1908_) + if (var.get(u'opts').get(u'noScope').neg() and var.get(u'scope').neg()): + if (PyJsStrictNeq(var.get(u'parent').get(u'type'),Js(u'Program')) and PyJsStrictNeq(var.get(u'parent').get(u'type'),Js(u'File'))): + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'traverseNeedsParent'), var.get(u'parent').get(u'type')))) + raise PyJsTempException + var.get(u'visitors').callprop(u'explode', var.get(u'opts')) + var.get(u'traverse').callprop(u'node', var.get(u'parent'), var.get(u'opts'), var.get(u'scope'), var.get(u'state'), var.get(u'parentPath')) + PyJsHoisted_traverse_.func_name = u'traverse' + var.put(u'traverse', PyJsHoisted_traverse_) + @Js + def PyJsHoisted_hasBlacklistedType_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'type'),var.get(u'state').get(u'type')): + var.get(u'state').put(u'has', var.get(u'true')) + var.get(u'path').callprop(u'stop') + PyJsHoisted_hasBlacklistedType_.func_name = u'hasBlacklistedType' + var.put(u'hasBlacklistedType', PyJsHoisted_hasBlacklistedType_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1906_ = Js({}) + var.put(u'newObj', PyJs_Object_1906_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'visitors', var.get(u'exports').put(u'Hub', var.get(u'exports').put(u'Scope', var.get(u'exports').put(u'NodePath', var.get(u'undefined'))))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_path', var.get(u'require')(Js(u'./path'))) + @Js + def PyJs_get_1901_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_1901_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_path')).get(u'default') + PyJs_get_1901_._set_name(u'get') + PyJs_Object_1900_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_1901_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NodePath'), PyJs_Object_1900_) + var.put(u'_scope', var.get(u'require')(Js(u'./scope'))) + @Js + def PyJs_get_1903_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_1903_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_scope')).get(u'default') + PyJs_get_1903_._set_name(u'get') + PyJs_Object_1902_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_1903_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'Scope'), PyJs_Object_1902_) + var.put(u'_hub', var.get(u'require')(Js(u'./hub'))) + @Js + def PyJs_get_1905_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_1905_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_hub')).get(u'default') + PyJs_get_1905_._set_name(u'get') + PyJs_Object_1904_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_1905_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'Hub'), PyJs_Object_1904_) + var.get(u'exports').put(u'default', var.get(u'traverse')) + var.put(u'_context', var.get(u'require')(Js(u'./context'))) + var.put(u'_context2', var.get(u'_interopRequireDefault')(var.get(u'_context'))) + var.put(u'_visitors', var.get(u'require')(Js(u'./visitors'))) + var.put(u'visitors', var.get(u'_interopRequireWildcard')(var.get(u'_visitors'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_cache', var.get(u'require')(Js(u'./cache'))) + var.put(u'cache', var.get(u'_interopRequireWildcard')(var.get(u'_cache'))) + pass + pass + var.get(u'exports').put(u'visitors', var.get(u'visitors')) + pass + var.get(u'traverse').put(u'visitors', var.get(u'visitors')) + var.get(u'traverse').put(u'verify', var.get(u'visitors').get(u'verify')) + var.get(u'traverse').put(u'explode', var.get(u'visitors').get(u'explode')) + var.get(u'traverse').put(u'NodePath', var.get(u'require')(Js(u'./path'))) + var.get(u'traverse').put(u'Scope', var.get(u'require')(Js(u'./scope'))) + var.get(u'traverse').put(u'Hub', var.get(u'require')(Js(u'./hub'))) + @Js + def PyJs_anonymous_1909_(node, enter, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'enter':enter}, var) + var.registers([u'node', u'enter']) + return var.get(u't').callprop(u'traverseFast', var.get(u'node'), var.get(u'enter')) + PyJs_anonymous_1909_._set_name(u'anonymous') + var.get(u'traverse').put(u'cheap', PyJs_anonymous_1909_) + @Js + def PyJs_anonymous_1910_(node, opts, scope, state, parentPath, skipKeys, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'state':state, u'skipKeys':skipKeys, u'parentPath':parentPath, u'scope':scope, u'opts':opts, u'arguments':arguments}, var) + var.registers([u'key', u'node', u'_isArray', u'_iterator', u'context', u'keys', u'state', u'skipKeys', u'_i', u'parentPath', u'scope', u'_ref', u'opts']) + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if var.get(u'keys').neg(): + return var.get('undefined') + var.put(u'context', var.get(u'_context2').get(u'default').create(var.get(u'scope'), var.get(u'opts'), var.get(u'state'), var.get(u'parentPath'))) + #for JS loop + var.put(u'_iterator', var.get(u'keys')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'key', var.get(u'_ref')) + if (var.get(u'skipKeys') and var.get(u'skipKeys').get(var.get(u'key'))): + continue + if var.get(u'context').callprop(u'visit', var.get(u'node'), var.get(u'key')): + return var.get('undefined') + + PyJs_anonymous_1910_._set_name(u'anonymous') + var.get(u'traverse').put(u'node', PyJs_anonymous_1910_) + @Js + def PyJs_anonymous_1911_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'opts']) + var.get(u't').callprop(u'removeProperties', var.get(u'node'), var.get(u'opts')) + var.get(u'cache').get(u'path').callprop(u'delete', var.get(u'node')) + PyJs_anonymous_1911_._set_name(u'anonymous') + var.get(u'traverse').put(u'clearNode', PyJs_anonymous_1911_) + @Js + def PyJs_anonymous_1912_(tree, opts, this, arguments, var=var): + var = Scope({u'this':this, u'tree':tree, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'tree', u'opts']) + var.get(u't').callprop(u'traverseFast', var.get(u'tree'), var.get(u'traverse').get(u'clearNode'), var.get(u'opts')) + return var.get(u'tree') + PyJs_anonymous_1912_._set_name(u'anonymous') + var.get(u'traverse').put(u'removeProperties', PyJs_anonymous_1912_) + pass + @Js + def PyJs_anonymous_1913_(tree, scope, type, blacklistTypes, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'type':type, u'this':this, u'scope':scope, u'tree':tree, u'blacklistTypes':blacklistTypes}, var) + var.registers([u'scope', u'state', u'tree', u'blacklistTypes', u'type']) + if PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'blacklistTypes'), var.get(u'tree').get(u'type')): + return Js(False) + if PyJsStrictEq(var.get(u'tree').get(u'type'),var.get(u'type')): + return var.get(u'true') + PyJs_Object_1914_ = Js({u'has':Js(False),u'type':var.get(u'type')}) + var.put(u'state', PyJs_Object_1914_) + PyJs_Object_1915_ = Js({u'blacklist':var.get(u'blacklistTypes'),u'enter':var.get(u'hasBlacklistedType')}) + var.get(u'traverse')(var.get(u'tree'), PyJs_Object_1915_, var.get(u'scope'), var.get(u'state')) + return var.get(u'state').get(u'has') + PyJs_anonymous_1913_._set_name(u'anonymous') + var.get(u'traverse').put(u'hasType', PyJs_anonymous_1913_) + @Js + def PyJs_anonymous_1916_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'cache').callprop(u'clear') + PyJs_anonymous_1916_._set_name(u'anonymous') + var.get(u'traverse').put(u'clearCache', PyJs_anonymous_1916_) + @Js + def PyJs_anonymous_1917_(source, destination, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'destination':destination, u'arguments':arguments}, var) + var.registers([u'source', u'destination']) + if var.get(u'cache').get(u'path').callprop(u'has', var.get(u'source')): + var.get(u'cache').get(u'path').callprop(u'set', var.get(u'destination'), var.get(u'cache').get(u'path').callprop(u'get', var.get(u'source'))) + PyJs_anonymous_1917_._set_name(u'anonymous') + var.get(u'traverse').put(u'copyCache', PyJs_anonymous_1917_) +PyJs_anonymous_1899_._set_name(u'anonymous') +PyJs_Object_1918_ = Js({u'./cache':Js(222.0),u'./context':Js(223.0),u'./hub':Js(224.0),u'./path':Js(232.0),u'./scope':Js(244.0),u'./visitors':Js(246.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0),u'lodash/includes':Js(456.0)}) +@Js +def PyJs_anonymous_1919_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'findParent', u'_interopRequireWildcard', u'_index', u'require', u'_babelTypes', u'getAncestry', u'inShadow', u'module', u'inType', u'getStatementParent', u'getEarliestCommonAncestorFrom', u't', u'_index2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'find', u'getDeepestCommonAncestorFrom', u'getFunctionParent']) + @Js + def PyJsHoisted_inType_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_isArray3', u'_ref3', u'_i3', u'path', u'type', u'_iterator3']) + var.put(u'path', var.get(u"this")) + while var.get(u'path'): + #for JS loop + var.put(u'_iterator3', var.get(u'arguments')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'type', var.get(u'_ref3')) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'type'),var.get(u'type')): + return var.get(u'true') + + var.put(u'path', var.get(u'path').get(u'parentPath')) + return Js(False) + PyJsHoisted_inType_.func_name = u'inType' + var.put(u'inType', PyJsHoisted_inType_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1920_ = Js({}) + var.put(u'newObj', PyJs_Object_1920_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_findParent_(callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments}, var) + var.registers([u'path', u'callback']) + var.put(u'path', var.get(u"this")) + while var.put(u'path', var.get(u'path').get(u'parentPath')): + if var.get(u'callback')(var.get(u'path')): + return var.get(u'path') + return var.get(u"null") + PyJsHoisted_findParent_.func_name = u'findParent' + var.put(u'findParent', PyJsHoisted_findParent_) + @Js + def PyJsHoisted_getAncestry_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'path', u'paths']) + var.put(u'path', var.get(u"this")) + var.put(u'paths', Js([])) + while 1: + var.get(u'paths').callprop(u'push', var.get(u'path')) + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + return var.get(u'paths') + PyJsHoisted_getAncestry_.func_name = u'getAncestry' + var.put(u'getAncestry', PyJsHoisted_getAncestry_) + @Js + def PyJsHoisted_getStatementParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'path']) + var.put(u'path', var.get(u"this")) + while 1: + if var.get(u'Array').callprop(u'isArray', var.get(u'path').get(u'container')): + return var.get(u'path') + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + PyJsHoisted_getStatementParent_.func_name = u'getStatementParent' + var.put(u'getStatementParent', PyJsHoisted_getStatementParent_) + @Js + def PyJsHoisted_getEarliestCommonAncestorFrom_(paths, this, arguments, var=var): + var = Scope({u'this':this, u'paths':paths, u'arguments':arguments}, var) + var.registers([u'paths']) + @Js + def PyJs_anonymous_1923_(deepest, i, ancestries, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'deepest':deepest, u'arguments':arguments, u'ancestries':ancestries}, var) + var.registers([u'_isArray', u'_iterator', u'keys', u'i', u'ancestry', u'earliestKeyIndex', u'deepest', u'_i', u'currentKeyIndex', u'path', u'_ref', u'earliest', u'ancestries']) + var.put(u'earliest', PyJsComma(Js(0.0), Js(None))) + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'deepest').get(u'type'))) + #for JS loop + var.put(u'_iterator', var.get(u'ancestries')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'ancestry', var.get(u'_ref')) + var.put(u'path', var.get(u'ancestry').get((var.get(u'i')+Js(1.0)))) + if var.get(u'earliest').neg(): + var.put(u'earliest', var.get(u'path')) + continue + if (var.get(u'path').get(u'listKey') and PyJsStrictEq(var.get(u'earliest').get(u'listKey'),var.get(u'path').get(u'listKey'))): + if (var.get(u'path').get(u'key')var.get(u'currentKeyIndex')): + var.put(u'earliest', var.get(u'path')) + + return var.get(u'earliest') + PyJs_anonymous_1923_._set_name(u'anonymous') + return var.get(u"this").callprop(u'getDeepestCommonAncestorFrom', var.get(u'paths'), PyJs_anonymous_1923_) + PyJsHoisted_getEarliestCommonAncestorFrom_.func_name = u'getEarliestCommonAncestorFrom' + var.put(u'getEarliestCommonAncestorFrom', PyJsHoisted_getEarliestCommonAncestorFrom_) + @Js + def PyJsHoisted_getFunctionParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + @Js + def PyJs_anonymous_1922_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'isFunction') or var.get(u'path').callprop(u'isProgram')) + PyJs_anonymous_1922_._set_name(u'anonymous') + return var.get(u"this").callprop(u'findParent', PyJs_anonymous_1922_) + PyJsHoisted_getFunctionParent_.func_name = u'getFunctionParent' + var.put(u'getFunctionParent', PyJsHoisted_getFunctionParent_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1921_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1921_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_find_(callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments}, var) + var.registers([u'path', u'callback']) + var.put(u'path', var.get(u"this")) + while 1: + if var.get(u'callback')(var.get(u'path')): + return var.get(u'path') + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + return var.get(u"null") + PyJsHoisted_find_.func_name = u'find' + var.put(u'find', PyJsHoisted_find_) + @Js + def PyJsHoisted_getDeepestCommonAncestorFrom_(paths, filter, this, arguments, var=var): + var = Scope({u'filter':filter, u'paths':paths, u'this':this, u'arguments':arguments}, var) + var.registers([u'paths', u'minDepth', u'_isArray2', u'_this', u'i', u'lastCommonIndex', u'_i2', u'_ref2', u'filter', u'ancestry', u'ancestries', u'lastCommon', u'shouldMatch', u'_iterator2', u'first']) + var.put(u'_this', var.get(u"this")) + if var.get(u'paths').get(u'length').neg(): + return var.get(u"this") + if PyJsStrictEq(var.get(u'paths').get(u'length'),Js(1.0)): + return var.get(u'paths').get(u'0') + var.put(u'minDepth', var.get(u'Infinity')) + var.put(u'lastCommonIndex', PyJsComma(Js(0.0), Js(None))) + var.put(u'lastCommon', PyJsComma(Js(0.0), Js(None))) + @Js + def PyJs_anonymous_1924_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'ancestry']) + var.put(u'ancestry', Js([])) + while 1: + var.get(u'ancestry').callprop(u'unshift', var.get(u'path')) + if not (var.put(u'path', var.get(u'path').get(u'parentPath')) and PyJsStrictNeq(var.get(u'path'),var.get(u'_this'))): + break + if (var.get(u'ancestry').get(u'length')=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'ancestry', var.get(u'_ref2')) + if PyJsStrictNeq(var.get(u'ancestry').get(var.get(u'i')),var.get(u'shouldMatch')): + raise JS_BREAK_LABEL_64657074684c6f6f70("Breaked") + + var.put(u'lastCommonIndex', var.get(u'i')) + var.put(u'lastCommon', var.get(u'shouldMatch')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + except JS_CONTINUE_LABEL_64657074684c6f6f70: + pass + except JS_BREAK_LABEL_64657074684c6f6f70: + pass + if var.get(u'lastCommon'): + if var.get(u'filter'): + return var.get(u'filter')(var.get(u'lastCommon'), var.get(u'lastCommonIndex'), var.get(u'ancestries')) + else: + return var.get(u'lastCommon') + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Couldn't find intersection"))) + raise PyJsTempException + PyJsHoisted_getDeepestCommonAncestorFrom_.func_name = u'getDeepestCommonAncestorFrom' + var.put(u'getDeepestCommonAncestorFrom', PyJsHoisted_getDeepestCommonAncestorFrom_) + @Js + def PyJsHoisted_inShadow_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'shadow', u'parentFn', u'key']) + @Js + def PyJs_anonymous_1925_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').callprop(u'isFunction') + PyJs_anonymous_1925_._set_name(u'anonymous') + var.put(u'parentFn', (var.get(u"this") if var.get(u"this").callprop(u'isFunction') else var.get(u"this").callprop(u'findParent', PyJs_anonymous_1925_))) + if var.get(u'parentFn').neg(): + return var.get('undefined') + if (var.get(u'parentFn').callprop(u'isFunctionExpression') or var.get(u'parentFn').callprop(u'isFunctionDeclaration')): + var.put(u'shadow', var.get(u'parentFn').get(u'node').get(u'shadow')) + if (var.get(u'shadow') and (var.get(u'key').neg() or PyJsStrictNeq(var.get(u'shadow').get(var.get(u'key')),Js(False)))): + return var.get(u'parentFn') + else: + if var.get(u'parentFn').callprop(u'isArrowFunctionExpression'): + return var.get(u'parentFn') + return var.get(u"null") + PyJsHoisted_inShadow_.func_name = u'inShadow' + var.put(u'inShadow', PyJsHoisted_inShadow_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'findParent', var.get(u'findParent')) + var.get(u'exports').put(u'find', var.get(u'find')) + var.get(u'exports').put(u'getFunctionParent', var.get(u'getFunctionParent')) + var.get(u'exports').put(u'getStatementParent', var.get(u'getStatementParent')) + var.get(u'exports').put(u'getEarliestCommonAncestorFrom', var.get(u'getEarliestCommonAncestorFrom')) + var.get(u'exports').put(u'getDeepestCommonAncestorFrom', var.get(u'getDeepestCommonAncestorFrom')) + var.get(u'exports').put(u'getAncestry', var.get(u'getAncestry')) + var.get(u'exports').put(u'inType', var.get(u'inType')) + var.get(u'exports').put(u'inShadow', var.get(u'inShadow')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1919_._set_name(u'anonymous') +PyJs_Object_1926_ = Js({u'./index':Js(232.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1927_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'addComments', u'module', u'shareCommentsWithSiblings', u'addComment']) + @Js + def PyJsHoisted_addComments_(type, comments, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'comments':comments}, var) + var.registers([u'node', u'type', u'comments', u'key']) + if var.get(u'comments').neg(): + return var.get('undefined') + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'key', (var.get(u'type')+Js(u'Comments'))) + if var.get(u'node').get(var.get(u'key')): + var.get(u'node').put(var.get(u'key'), var.get(u'node').get(var.get(u'key')).callprop(u'concat', var.get(u'comments'))) + else: + var.get(u'node').put(var.get(u'key'), var.get(u'comments')) + PyJsHoisted_addComments_.func_name = u'addComments' + var.put(u'addComments', PyJsHoisted_addComments_) + @Js + def PyJsHoisted_addComment_(type, content, line, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'line':line, u'type':type, u'arguments':arguments}, var) + var.registers([u'content', u'line', u'type']) + PyJs_Object_1928_ = Js({u'type':(Js(u'CommentLine') if var.get(u'line') else Js(u'CommentBlock')),u'value':var.get(u'content')}) + var.get(u"this").callprop(u'addComments', var.get(u'type'), Js([PyJs_Object_1928_])) + PyJsHoisted_addComment_.func_name = u'addComment' + var.put(u'addComment', PyJsHoisted_addComment_) + @Js + def PyJsHoisted_shareCommentsWithSiblings_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'leading', u'prev', u'trailing', u'next']) + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'trailing', var.get(u'node').get(u'trailingComments')) + var.put(u'leading', var.get(u'node').get(u'leadingComments')) + if (var.get(u'trailing').neg() and var.get(u'leading').neg()): + return var.get('undefined') + var.put(u'prev', var.get(u"this").callprop(u'getSibling', (var.get(u"this").get(u'key')-Js(1.0)))) + var.put(u'next', var.get(u"this").callprop(u'getSibling', (var.get(u"this").get(u'key')+Js(1.0)))) + if var.get(u'prev').get(u'node').neg(): + var.put(u'prev', var.get(u'next')) + if var.get(u'next').get(u'node').neg(): + var.put(u'next', var.get(u'prev')) + var.get(u'prev').callprop(u'addComments', Js(u'trailing'), var.get(u'leading')) + var.get(u'next').callprop(u'addComments', Js(u'leading'), var.get(u'trailing')) + PyJsHoisted_shareCommentsWithSiblings_.func_name = u'shareCommentsWithSiblings' + var.put(u'shareCommentsWithSiblings', PyJsHoisted_shareCommentsWithSiblings_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'shareCommentsWithSiblings', var.get(u'shareCommentsWithSiblings')) + var.get(u'exports').put(u'addComment', var.get(u'addComment')) + var.get(u'exports').put(u'addComments', var.get(u'addComments')) + pass + pass + pass +PyJs_anonymous_1927_._set_name(u'anonymous') +PyJs_Object_1929_ = Js({}) +@Js +def PyJs_anonymous_1930_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_getQueueContexts', u'pushContext', u'skip', u'module', u'resync', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'skipKey', u'_call', u'popContext', u'visit', u'setKey', u'call', u'exports', u'_resyncParent', u'_resyncRemoved', u'isBlacklisted', u'stop', u'_resyncList', u'_resyncKey', u'_index2', u'setContext', u'_index', u'setup', u'setScope', u'requeue', u'require']) + @Js + def PyJsHoisted_popContext_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'contexts').callprop(u'pop') + var.get(u"this").callprop(u'setContext', var.get(u"this").get(u'contexts').get((var.get(u"this").get(u'contexts').get(u'length')-Js(1.0)))) + PyJsHoisted_popContext_.func_name = u'popContext' + var.put(u'popContext', PyJsHoisted_popContext_) + @Js + def PyJsHoisted_setup_(parentPath, container, listKey, key, this, arguments, var=var): + var = Scope({u'container':container, u'arguments':arguments, u'key':key, u'parentPath':parentPath, u'this':this, u'listKey':listKey}, var) + var.registers([u'listKey', u'container', u'key', u'parentPath']) + var.get(u"this").put(u'inList', var.get(u'listKey').neg().neg()) + var.get(u"this").put(u'listKey', var.get(u'listKey')) + var.get(u"this").put(u'parentKey', (var.get(u'listKey') or var.get(u'key'))) + var.get(u"this").put(u'container', var.get(u'container')) + var.get(u"this").put(u'parentPath', (var.get(u'parentPath') or var.get(u"this").get(u'parentPath'))) + var.get(u"this").callprop(u'setKey', var.get(u'key')) + PyJsHoisted_setup_.func_name = u'setup' + var.put(u'setup', PyJsHoisted_setup_) + @Js + def PyJsHoisted_requeue_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'_isArray2', u'contexts', u'_i2', u'_ref2', u'context', u'pathToQueue', u'_iterator2']) + var.put(u'pathToQueue', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else var.get(u"this"))) + if var.get(u'pathToQueue').get(u'removed'): + return var.get('undefined') + var.put(u'contexts', var.get(u"this").get(u'contexts')) + #for JS loop + var.put(u'_iterator2', var.get(u'contexts')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'context', var.get(u'_ref2')) + var.get(u'context').callprop(u'maybeQueue', var.get(u'pathToQueue')) + + PyJsHoisted_requeue_.func_name = u'requeue' + var.put(u'requeue', PyJsHoisted_requeue_) + @Js + def PyJsHoisted__resyncParent_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'parentPath'): + var.get(u"this").put(u'parent', var.get(u"this").get(u'parentPath').get(u'node')) + PyJsHoisted__resyncParent_.func_name = u'_resyncParent' + var.put(u'_resyncParent', PyJsHoisted__resyncParent_) + @Js + def PyJsHoisted__resyncRemoved_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (((var.get(u"this").get(u'key')==var.get(u"null")) or var.get(u"this").get(u'container').neg()) or PyJsStrictNeq(var.get(u"this").get(u'container').get(var.get(u"this").get(u'key')),var.get(u"this").get(u'node'))): + var.get(u"this").callprop(u'_markRemoved') + PyJsHoisted__resyncRemoved_.func_name = u'_resyncRemoved' + var.put(u'_resyncRemoved', PyJsHoisted__resyncRemoved_) + @Js + def PyJsHoisted_skip_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'shouldSkip', var.get(u'true')) + PyJsHoisted_skip_.func_name = u'skip' + var.put(u'skip', PyJsHoisted_skip_) + @Js + def PyJsHoisted_resync_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'removed'): + return var.get('undefined') + var.get(u"this").callprop(u'_resyncParent') + var.get(u"this").callprop(u'_resyncList') + var.get(u"this").callprop(u'_resyncKey') + PyJsHoisted_resync_.func_name = u'resync' + var.put(u'resync', PyJsHoisted_resync_) + @Js + def PyJsHoisted_isBlacklisted_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'blacklist']) + var.put(u'blacklist', var.get(u"this").get(u'opts').get(u'blacklist')) + return (var.get(u'blacklist') and (var.get(u'blacklist').callprop(u'indexOf', var.get(u"this").get(u'node').get(u'type'))>(-Js(1.0)))) + PyJsHoisted_isBlacklisted_.func_name = u'isBlacklisted' + var.put(u'isBlacklisted', PyJsHoisted_isBlacklisted_) + @Js + def PyJsHoisted_visit_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'node').neg(): + return Js(False) + if var.get(u"this").callprop(u'isBlacklisted'): + return Js(False) + if (var.get(u"this").get(u'opts').get(u'shouldSkip') and var.get(u"this").get(u'opts').callprop(u'shouldSkip', var.get(u"this"))): + return Js(False) + if (var.get(u"this").callprop(u'call', Js(u'enter')) or var.get(u"this").get(u'shouldSkip')): + @Js + def PyJs_anonymous_1933_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'Skip...') + PyJs_anonymous_1933_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_1933_) + return var.get(u"this").get(u'shouldStop') + @Js + def PyJs_anonymous_1934_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'Recursing into...') + PyJs_anonymous_1934_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_1934_) + var.get(u'_index2').get(u'default').callprop(u'node', var.get(u"this").get(u'node'), var.get(u"this").get(u'opts'), var.get(u"this").get(u'scope'), var.get(u"this").get(u'state'), var.get(u"this"), var.get(u"this").get(u'skipKeys')) + var.get(u"this").callprop(u'call', Js(u'exit')) + return var.get(u"this").get(u'shouldStop') + PyJsHoisted_visit_.func_name = u'visit' + var.put(u'visit', PyJsHoisted_visit_) + @Js + def PyJsHoisted__resyncList_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'newContainer']) + if (var.get(u"this").get(u'parent').neg() or var.get(u"this").get(u'inList').neg()): + return var.get('undefined') + var.put(u'newContainer', var.get(u"this").get(u'parent').get(var.get(u"this").get(u'listKey'))) + if PyJsStrictEq(var.get(u"this").get(u'container'),var.get(u'newContainer')): + return var.get('undefined') + var.get(u"this").put(u'container', (var.get(u'newContainer') or var.get(u"null"))) + PyJsHoisted__resyncList_.func_name = u'_resyncList' + var.put(u'_resyncList', PyJsHoisted__resyncList_) + @Js + def PyJsHoisted_stop_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'shouldStop', var.get(u'true')) + var.get(u"this").put(u'shouldSkip', var.get(u'true')) + PyJsHoisted_stop_.func_name = u'stop' + var.put(u'stop', PyJsHoisted_stop_) + @Js + def PyJsHoisted__resyncKey_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'key']) + if var.get(u"this").get(u'container').neg(): + return var.get('undefined') + if PyJsStrictEq(var.get(u"this").get(u'node'),var.get(u"this").get(u'container').get(var.get(u"this").get(u'key'))): + return var.get('undefined') + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'fn', var.get(u'_ref')) + if var.get(u'fn').neg(): + continue + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + return var.get(u'true') + var.put(u'ret', var.get(u'fn').callprop(u'call', var.get(u"this").get(u'state'), var.get(u"this"), var.get(u"this").get(u'state'))) + if var.get(u'ret'): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Unexpected return value from visitor method ')+var.get(u'fn')))) + raise PyJsTempException + if PyJsStrictNeq(var.get(u"this").get(u'node'),var.get(u'node')): + return var.get(u'true') + if ((var.get(u"this").get(u'shouldStop') or var.get(u"this").get(u'shouldSkip')) or var.get(u"this").get(u'removed')): + return var.get(u'true') + + return Js(False) + PyJsHoisted__call_.func_name = u'_call' + var.put(u'_call', PyJsHoisted__call_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'call', var.get(u'call')) + var.get(u'exports').put(u'_call', var.get(u'_call')) + var.get(u'exports').put(u'isBlacklisted', var.get(u'isBlacklisted')) + var.get(u'exports').put(u'visit', var.get(u'visit')) + var.get(u'exports').put(u'skip', var.get(u'skip')) + var.get(u'exports').put(u'skipKey', var.get(u'skipKey')) + var.get(u'exports').put(u'stop', var.get(u'stop')) + var.get(u'exports').put(u'setScope', var.get(u'setScope')) + var.get(u'exports').put(u'setContext', var.get(u'setContext')) + var.get(u'exports').put(u'resync', var.get(u'resync')) + var.get(u'exports').put(u'_resyncParent', var.get(u'_resyncParent')) + var.get(u'exports').put(u'_resyncKey', var.get(u'_resyncKey')) + var.get(u'exports').put(u'_resyncList', var.get(u'_resyncList')) + var.get(u'exports').put(u'_resyncRemoved', var.get(u'_resyncRemoved')) + var.get(u'exports').put(u'popContext', var.get(u'popContext')) + var.get(u'exports').put(u'pushContext', var.get(u'pushContext')) + var.get(u'exports').put(u'setup', var.get(u'setup')) + var.get(u'exports').put(u'setKey', var.get(u'setKey')) + var.get(u'exports').put(u'requeue', var.get(u'requeue')) + var.get(u'exports').put(u'_getQueueContexts', var.get(u'_getQueueContexts')) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1930_._set_name(u'anonymous') +PyJs_Object_1936_ = Js({u'../index':Js(225.0),u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_1937_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'arrowFunctionToShadowed', u'_interopRequireWildcard', u'toComputedKey', u'_babelTypes', u'module', u't', u'ensureBlock', u'require']) + @Js + def PyJsHoisted_toComputedKey_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'key']) + var.put(u'node', var.get(u"this").get(u'node')) + var.put(u'key', PyJsComma(Js(0.0), Js(None))) + if var.get(u"this").callprop(u'isMemberExpression'): + var.put(u'key', var.get(u'node').get(u'property')) + else: + if (var.get(u"this").callprop(u'isProperty') or var.get(u"this").callprop(u'isMethod')): + var.put(u'key', var.get(u'node').get(u'key')) + else: + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u'todo'))) + raise PyJsTempException + if var.get(u'node').get(u'computed').neg(): + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + var.put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'key').get(u'name'))) + return var.get(u'key') + PyJsHoisted_toComputedKey_.func_name = u'toComputedKey' + var.put(u'toComputedKey', PyJsHoisted_toComputedKey_) + @Js + def PyJsHoisted_arrowFunctionToShadowed_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'isArrowFunctionExpression').neg(): + return var.get('undefined') + var.get(u"this").callprop(u'ensureBlock') + var.put(u'node', var.get(u"this").get(u'node')) + var.get(u'node').put(u'expression', Js(False)) + var.get(u'node').put(u'type', Js(u'FunctionExpression')) + var.get(u'node').put(u'shadow', (var.get(u'node').get(u'shadow') or var.get(u'true'))) + PyJsHoisted_arrowFunctionToShadowed_.func_name = u'arrowFunctionToShadowed' + var.put(u'arrowFunctionToShadowed', PyJsHoisted_arrowFunctionToShadowed_) + @Js + def PyJsHoisted_ensureBlock_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'ensureBlock', var.get(u"this").get(u'node')) + PyJsHoisted_ensureBlock_.func_name = u'ensureBlock' + var.put(u'ensureBlock', PyJsHoisted_ensureBlock_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1938_ = Js({}) + var.put(u'newObj', PyJs_Object_1938_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'toComputedKey', var.get(u'toComputedKey')) + var.get(u'exports').put(u'ensureBlock', var.get(u'ensureBlock')) + var.get(u'exports').put(u'arrowFunctionToShadowed', var.get(u'arrowFunctionToShadowed')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass +PyJs_anonymous_1937_._set_name(u'anonymous') +PyJs_Object_1939_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1940_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_1941_ = Js({}) + @Js + def PyJs_anonymous_1942_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'_typeof2', u'_typeof3', u'_map', u'INVALID_METHODS', u'VALID_CALLEES', u'evaluateTruthy', u'global', u'evaluate', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_map2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1943_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1943_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_evaluate_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'deoptPath', u'evaluate', u'value', u'_evaluate', u'confident', u'deopt', u'seen']) + @Js + def PyJsHoisted_evaluate_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'node', u'item', u'path', u'val', u'existing']) + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'seen').callprop(u'has', var.get(u'node')): + var.put(u'existing', var.get(u'seen').callprop(u'get', var.get(u'node'))) + if var.get(u'existing').get(u'resolved'): + return var.get(u'existing').get(u'value') + else: + var.get(u'deopt')(var.get(u'path')) + return var.get('undefined') + else: + PyJs_Object_1945_ = Js({u'resolved':Js(False)}) + var.put(u'item', PyJs_Object_1945_) + var.get(u'seen').callprop(u'set', var.get(u'node'), var.get(u'item')) + var.put(u'val', var.get(u'_evaluate')(var.get(u'path'))) + if var.get(u'confident'): + var.get(u'item').put(u'resolved', var.get(u'true')) + var.get(u'item').put(u'value', var.get(u'val')) + return var.get(u'val') + PyJsHoisted_evaluate_.func_name = u'evaluate' + var.put(u'evaluate', PyJsHoisted_evaluate_) + @Js + def PyJsHoisted_deopt_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'confident').neg(): + return var.get('undefined') + var.put(u'deoptPath', var.get(u'path')) + var.put(u'confident', Js(False)) + PyJsHoisted_deopt_.func_name = u'deopt' + var.put(u'deopt', PyJsHoisted_deopt_) + @Js + def PyJsHoisted__evaluate_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'resolved', u'arr', u'right', u'_isArray3', u'_isArray2', u'leftConfident', u'binding', u'argument', u'_ref2', u'_object', u'_value2', u'arg', u'_ref', u'_exprs', u'_iterator', u'_right', u'_i3', u'_i2', u'prop', u'_i', u'props', u'wasConfident', u'type', u'_left', u'node', u'_type', u'args', u'func', u'testResult', u'object', u'elems', u'_value', u'_elem', u'key', u'path', u'_isArray', u'context', u'obj', u'left', u'valuePath', u'i', u'expr', u'keyPath', u'_ref3', u'elem', u'rightConfident', u'exprs', u'str', u'_property', u'property', u'callee', u'_iterator3', u'_iterator2']) + if var.get(u'confident').neg(): + return var.get('undefined') + var.put(u'node', var.get(u'path').get(u'node')) + if var.get(u'path').callprop(u'isSequenceExpression'): + var.put(u'exprs', var.get(u'path').callprop(u'get', Js(u'expressions'))) + return var.get(u'evaluate')(var.get(u'exprs').get((var.get(u'exprs').get(u'length')-Js(1.0)))) + if ((var.get(u'path').callprop(u'isStringLiteral') or var.get(u'path').callprop(u'isNumericLiteral')) or var.get(u'path').callprop(u'isBooleanLiteral')): + return var.get(u'node').get(u'value') + if var.get(u'path').callprop(u'isNullLiteral'): + return var.get(u"null") + if var.get(u'path').callprop(u'isTemplateLiteral'): + var.put(u'str', Js(u'')) + var.put(u'i', Js(0.0)) + var.put(u'_exprs', var.get(u'path').callprop(u'get', Js(u'expressions'))) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'quasis')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'elem', var.get(u'_ref')) + if var.get(u'confident').neg(): + break + var.put(u'str', var.get(u'elem').get(u'value').get(u'cooked'), u'+') + var.put(u'expr', var.get(u'_exprs').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if var.get(u'expr'): + var.put(u'str', var.get(u'String')(var.get(u'evaluate')(var.get(u'expr'))), u'+') + + if var.get(u'confident').neg(): + return var.get('undefined') + return var.get(u'str') + if var.get(u'path').callprop(u'isConditionalExpression'): + var.put(u'testResult', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'test')))) + if var.get(u'confident').neg(): + return var.get('undefined') + if var.get(u'testResult'): + return var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'consequent'))) + else: + return var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'alternate'))) + if var.get(u'path').callprop(u'isExpressionWrapper'): + return var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'expression'))) + PyJs_Object_1946_ = Js({u'callee':var.get(u'node')}) + if (var.get(u'path').callprop(u'isMemberExpression') and var.get(u'path').get(u'parentPath').callprop(u'isCallExpression', PyJs_Object_1946_).neg()): + var.put(u'property', var.get(u'path').callprop(u'get', Js(u'property'))) + var.put(u'object', var.get(u'path').callprop(u'get', Js(u'object'))) + if (var.get(u'object').callprop(u'isLiteral') and var.get(u'property').callprop(u'isIdentifier')): + var.put(u'_value', var.get(u'object').get(u'node').get(u'value')) + var.put(u'type', (Js(u'undefined') if PyJsStrictEq(var.get(u'_value',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_value')))) + if (PyJsStrictEq(var.get(u'type'),Js(u'number')) or PyJsStrictEq(var.get(u'type'),Js(u'string'))): + return var.get(u'_value').get(var.get(u'property').get(u'node').get(u'name')) + if var.get(u'path').callprop(u'isReferencedIdentifier'): + var.put(u'binding', var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'node').get(u'name'))) + if (var.get(u'binding') and (var.get(u'binding').get(u'constantViolations').get(u'length')>Js(0.0))): + return var.get(u'deopt')(var.get(u'binding').get(u'path')) + if (var.get(u'binding') and var.get(u'binding').get(u'hasValue')): + return var.get(u'binding').get(u'value') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'undefined')): + return var.get(u'undefined') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'Infinity')): + return var.get(u'Infinity') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'NaN')): + return var.get(u'NaN') + var.put(u'resolved', var.get(u'path').callprop(u'resolve')) + if PyJsStrictEq(var.get(u'resolved'),var.get(u'path')): + return var.get(u'deopt')(var.get(u'path')) + else: + return var.get(u'evaluate')(var.get(u'resolved')) + PyJs_Object_1947_ = Js({u'prefix':var.get(u'true')}) + if var.get(u'path').callprop(u'isUnaryExpression', PyJs_Object_1947_): + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'void')): + return var.get(u'undefined') + var.put(u'argument', var.get(u'path').callprop(u'get', Js(u'argument'))) + if (PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'typeof')) and (var.get(u'argument').callprop(u'isFunction') or var.get(u'argument').callprop(u'isClass'))): + return Js(u'function') + var.put(u'arg', var.get(u'evaluate')(var.get(u'argument'))) + if var.get(u'confident').neg(): + return var.get('undefined') + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'operator')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!')): + SWITCHED = True + return var.get(u'arg').neg() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + return (+var.get(u'arg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'-')): + SWITCHED = True + return (-var.get(u'arg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'~')): + SWITCHED = True + return (~var.get(u'arg')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'typeof')): + SWITCHED = True + return (Js(u'undefined') if PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'arg'))) + SWITCHED = True + break + if var.get(u'path').callprop(u'isArrayExpression'): + var.put(u'arr', Js([])) + var.put(u'elems', var.get(u'path').callprop(u'get', Js(u'elements'))) + #for JS loop + var.put(u'_iterator2', var.get(u'elems')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_elem', var.get(u'_ref2')) + var.put(u'_elem', var.get(u'_elem').callprop(u'evaluate')) + if var.get(u'_elem').get(u'confident'): + var.get(u'arr').callprop(u'push', var.get(u'_elem').get(u'value')) + else: + return var.get(u'deopt')(var.get(u'_elem')) + + return var.get(u'arr') + if var.get(u'path').callprop(u'isObjectExpression'): + PyJs_Object_1948_ = Js({}) + var.put(u'obj', PyJs_Object_1948_) + var.put(u'props', var.get(u'path').callprop(u'get', Js(u'properties'))) + #for JS loop + var.put(u'_iterator3', var.get(u'props')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'prop', var.get(u'_ref3')) + if (var.get(u'prop').callprop(u'isObjectMethod') or var.get(u'prop').callprop(u'isSpreadProperty')): + return var.get(u'deopt')(var.get(u'prop')) + var.put(u'keyPath', var.get(u'prop').callprop(u'get', Js(u'key'))) + var.put(u'key', var.get(u'keyPath')) + if var.get(u'prop').get(u'node').get(u'computed'): + var.put(u'key', var.get(u'key').callprop(u'evaluate')) + if var.get(u'key').get(u'confident').neg(): + return var.get(u'deopt')(var.get(u'keyPath')) + var.put(u'key', var.get(u'key').get(u'value')) + else: + if var.get(u'key').callprop(u'isIdentifier'): + var.put(u'key', var.get(u'key').get(u'node').get(u'name')) + else: + var.put(u'key', var.get(u'key').get(u'node').get(u'value')) + var.put(u'valuePath', var.get(u'prop').callprop(u'get', Js(u'value'))) + var.put(u'_value2', var.get(u'valuePath').callprop(u'evaluate')) + if var.get(u'_value2').get(u'confident').neg(): + return var.get(u'deopt')(var.get(u'valuePath')) + var.put(u'_value2', var.get(u'_value2').get(u'value')) + var.get(u'obj').put(var.get(u'key'), var.get(u'_value2')) + + return var.get(u'obj') + if var.get(u'path').callprop(u'isLogicalExpression'): + var.put(u'wasConfident', var.get(u'confident')) + var.put(u'left', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'left')))) + var.put(u'leftConfident', var.get(u'confident')) + var.put(u'confident', var.get(u'wasConfident')) + var.put(u'right', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'right')))) + var.put(u'rightConfident', var.get(u'confident')) + var.put(u'confident', (var.get(u'leftConfident') and var.get(u'rightConfident'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'operator')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'||')): + SWITCHED = True + if (var.get(u'left') and var.get(u'leftConfident')): + var.put(u'confident', var.get(u'true')) + return var.get(u'left') + if var.get(u'confident').neg(): + return var.get('undefined') + return (var.get(u'left') or var.get(u'right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'&&')): + SWITCHED = True + if ((var.get(u'left').neg() and var.get(u'leftConfident')) or (var.get(u'right').neg() and var.get(u'rightConfident'))): + var.put(u'confident', var.get(u'true')) + if var.get(u'confident').neg(): + return var.get('undefined') + return (var.get(u'left') and var.get(u'right')) + SWITCHED = True + break + if var.get(u'path').callprop(u'isBinaryExpression'): + var.put(u'_left', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'left')))) + if var.get(u'confident').neg(): + return var.get('undefined') + var.put(u'_right', var.get(u'evaluate')(var.get(u'path').callprop(u'get', Js(u'right')))) + if var.get(u'confident').neg(): + return var.get('undefined') + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'operator')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'-')): + SWITCHED = True + return (var.get(u'_left')-var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + return (var.get(u'_left')+var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'/')): + SWITCHED = True + return (var.get(u'_left')/var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'*')): + SWITCHED = True + return (var.get(u'_left')*var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%')): + SWITCHED = True + return (var.get(u'_left')%var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'**')): + SWITCHED = True + return var.get(u'Math').callprop(u'pow', var.get(u'_left'), var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'<')): + SWITCHED = True + return (var.get(u'_left')')): + SWITCHED = True + return (var.get(u'_left')>var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'<=')): + SWITCHED = True + return (var.get(u'_left')<=var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'>=')): + SWITCHED = True + return (var.get(u'_left')>=var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'==')): + SWITCHED = True + return (var.get(u'_left')==var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!=')): + SWITCHED = True + return (var.get(u'_left')!=var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'===')): + SWITCHED = True + return PyJsStrictEq(var.get(u'_left'),var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'!==')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'_left'),var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'|')): + SWITCHED = True + return (var.get(u'_left')|var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'&')): + SWITCHED = True + return (var.get(u'_left')&var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'^')): + SWITCHED = True + return (var.get(u'_left')^var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'<<')): + SWITCHED = True + return (var.get(u'_left')<>')): + SWITCHED = True + return (var.get(u'_left')>>var.get(u'_right')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'>>>')): + SWITCHED = True + return PyJsBshift(var.get(u'_left'),var.get(u'_right')) + SWITCHED = True + break + if var.get(u'path').callprop(u'isCallExpression'): + var.put(u'callee', var.get(u'path').callprop(u'get', Js(u'callee'))) + var.put(u'context', PyJsComma(Js(0.0), Js(None))) + var.put(u'func', PyJsComma(Js(0.0), Js(None))) + if ((var.get(u'callee').callprop(u'isIdentifier') and var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'callee').get(u'node').get(u'name'), var.get(u'true')).neg()) and (var.get(u'VALID_CALLEES').callprop(u'indexOf', var.get(u'callee').get(u'node').get(u'name'))>=Js(0.0))): + var.put(u'func', var.get(u'global').get(var.get(u'node').get(u'callee').get(u'name'))) + if var.get(u'callee').callprop(u'isMemberExpression'): + var.put(u'_object', var.get(u'callee').callprop(u'get', Js(u'object'))) + var.put(u'_property', var.get(u'callee').callprop(u'get', Js(u'property'))) + if (((var.get(u'_object').callprop(u'isIdentifier') and var.get(u'_property').callprop(u'isIdentifier')) and (var.get(u'VALID_CALLEES').callprop(u'indexOf', var.get(u'_object').get(u'node').get(u'name'))>=Js(0.0))) and (var.get(u'INVALID_METHODS').callprop(u'indexOf', var.get(u'_property').get(u'node').get(u'name'))=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'part', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'part'),Js(u'.')): + var.put(u'path', var.get(u'path').get(u'parentPath')) + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'path')): + var.put(u'path', var.get(u'path').get(var.get(u'part'))) + else: + var.put(u'path', var.get(u'path').callprop(u'get', var.get(u'part'), var.get(u'context'))) + + return var.get(u'path') + PyJsHoisted__getPattern_.func_name = u'_getPattern' + var.put(u'_getPattern', PyJsHoisted__getPattern_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'getStatementParent', var.get(u'getStatementParent')) + var.get(u'exports').put(u'getOpposite', var.get(u'getOpposite')) + var.get(u'exports').put(u'getCompletionRecords', var.get(u'getCompletionRecords')) + var.get(u'exports').put(u'getSibling', var.get(u'getSibling')) + var.get(u'exports').put(u'get', var.get(u'get')) + var.get(u'exports').put(u'_getKey', var.get(u'_getKey')) + var.get(u'exports').put(u'_getPattern', var.get(u'_getPattern')) + var.get(u'exports').put(u'getBindingIdentifiers', var.get(u'getBindingIdentifiers')) + var.get(u'exports').put(u'getOuterBindingIdentifiers', var.get(u'getOuterBindingIdentifiers')) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1950_._set_name(u'anonymous') +PyJs_Object_1958_ = Js({u'./index':Js(232.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1959_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'_scope', u'_ret', u'_invariant2', u'_virtualTypes', u'_ret2', u'_loop2', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'virtualTypes', u'_iterator', u'_debug', u'_i', u'_classCallCheck3', u'_classCallCheck2', u'type', u'NodePath', u'exports', u'_assign', u'_interopRequireWildcard', u'_babelTypes', u'_debug3', u'_debug2', u'_index2', u'_loop', u'_assign2', u'_isArray', u'_index', u'require', u'_ref2', u't', u'_scope2', u'_invariant']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1961_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1961_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1960_ = Js({}) + var.put(u'newObj', PyJs_Object_1960_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_virtualTypes', var.get(u'require')(Js(u'./lib/virtual-types'))) + var.put(u'virtualTypes', var.get(u'_interopRequireWildcard')(var.get(u'_virtualTypes'))) + var.put(u'_debug2', var.get(u'require')(Js(u'debug'))) + var.put(u'_debug3', var.get(u'_interopRequireDefault')(var.get(u'_debug2'))) + var.put(u'_invariant', var.get(u'require')(Js(u'invariant'))) + var.put(u'_invariant2', var.get(u'_interopRequireDefault')(var.get(u'_invariant'))) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_assign', var.get(u'require')(Js(u'lodash/assign'))) + var.put(u'_assign2', var.get(u'_interopRequireDefault')(var.get(u'_assign'))) + var.put(u'_scope', var.get(u'require')(Js(u'../scope'))) + var.put(u'_scope2', var.get(u'_interopRequireDefault')(var.get(u'_scope'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_cache', var.get(u'require')(Js(u'../cache'))) + pass + pass + var.put(u'_debug', PyJsComma(Js(0.0),var.get(u'_debug3').get(u'default'))(Js(u'babel'))) + @Js + def PyJs_anonymous_1962_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'NodePath']) + @Js + def PyJsHoisted_NodePath_(hub, parent, this, arguments, var=var): + var = Scope({u'this':this, u'parent':parent, u'hub':hub, u'arguments':arguments}, var) + var.registers([u'parent', u'hub']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'NodePath')) + var.get(u"this").put(u'parent', var.get(u'parent')) + var.get(u"this").put(u'hub', var.get(u'hub')) + var.get(u"this").put(u'contexts', Js([])) + PyJs_Object_1963_ = Js({}) + var.get(u"this").put(u'data', PyJs_Object_1963_) + var.get(u"this").put(u'shouldSkip', Js(False)) + var.get(u"this").put(u'shouldStop', Js(False)) + var.get(u"this").put(u'removed', Js(False)) + var.get(u"this").put(u'state', var.get(u"null")) + var.get(u"this").put(u'opts', var.get(u"null")) + var.get(u"this").put(u'skipKeys', var.get(u"null")) + var.get(u"this").put(u'parentPath', var.get(u"null")) + var.get(u"this").put(u'context', var.get(u"null")) + var.get(u"this").put(u'container', var.get(u"null")) + var.get(u"this").put(u'listKey', var.get(u"null")) + var.get(u"this").put(u'inList', Js(False)) + var.get(u"this").put(u'parentKey', var.get(u"null")) + var.get(u"this").put(u'key', var.get(u"null")) + var.get(u"this").put(u'node', var.get(u"null")) + var.get(u"this").put(u'scope', var.get(u"null")) + var.get(u"this").put(u'type', var.get(u"null")) + var.get(u"this").put(u'typeAnnotation', var.get(u"null")) + PyJsHoisted_NodePath_.func_name = u'NodePath' + var.put(u'NodePath', PyJsHoisted_NodePath_) + pass + @Js + def PyJs_get_1964_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments, u'get':PyJs_get_1964_}, var) + var.registers([u'paths', u'container', u'hub', u'parent', u'i', u'listKey', u'targetNode', u'key', u'parentPath', u'path', u'pathCheck', u'_ref']) + var.put(u'hub', var.get(u'_ref').get(u'hub')) + var.put(u'parentPath', var.get(u'_ref').get(u'parentPath')) + var.put(u'parent', var.get(u'_ref').get(u'parent')) + var.put(u'container', var.get(u'_ref').get(u'container')) + var.put(u'listKey', var.get(u'_ref').get(u'listKey')) + var.put(u'key', var.get(u'_ref').get(u'key')) + if (var.get(u'hub').neg() and var.get(u'parentPath')): + var.put(u'hub', var.get(u'parentPath').get(u'hub')) + PyJsComma(Js(0.0),var.get(u'_invariant2').get(u'default'))(var.get(u'parent'), Js(u'To get a node path the parent needs to exist')) + var.put(u'targetNode', var.get(u'container').get(var.get(u'key'))) + var.put(u'paths', (var.get(u'_cache').get(u'path').callprop(u'get', var.get(u'parent')) or Js([]))) + if var.get(u'_cache').get(u'path').callprop(u'has', var.get(u'parent')).neg(): + var.get(u'_cache').get(u'path').callprop(u'set', var.get(u'parent'), var.get(u'paths')) + var.put(u'path', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'SyntaxError'))) + return var.get(u"this").get(u'hub').get(u'file').callprop(u'buildCodeFrameError', var.get(u"this").get(u'node'), var.get(u'msg'), var.get(u'Error')) + PyJs_buildCodeFrameError_1968_._set_name(u'buildCodeFrameError') + var.get(u'NodePath').get(u'prototype').put(u'buildCodeFrameError', PyJs_buildCodeFrameError_1968_) + @Js + def PyJs_traverse_1969_(visitor, state, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'state':state, u'arguments':arguments, u'traverse':PyJs_traverse_1969_}, var) + var.registers([u'visitor', u'state']) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(var.get(u"this").get(u'node'), var.get(u'visitor'), var.get(u"this").get(u'scope'), var.get(u'state'), var.get(u"this")) + PyJs_traverse_1969_._set_name(u'traverse') + var.get(u'NodePath').get(u'prototype').put(u'traverse', PyJs_traverse_1969_) + @Js + def PyJs_mark_1970_(type, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'type':type, u'arguments':arguments, u'mark':PyJs_mark_1970_}, var) + var.registers([u'message', u'type']) + PyJs_Object_1971_ = Js({u'type':var.get(u'type'),u'message':var.get(u'message'),u'loc':var.get(u"this").get(u'node').get(u'loc')}) + var.get(u"this").get(u'hub').get(u'file').get(u'metadata').get(u'marked').callprop(u'push', PyJs_Object_1971_) + PyJs_mark_1970_._set_name(u'mark') + var.get(u'NodePath').get(u'prototype').put(u'mark', PyJs_mark_1970_) + @Js + def PyJs_set_1972_(key, node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'set':PyJs_set_1972_, u'arguments':arguments, u'key':key}, var) + var.registers([u'node', u'key']) + var.get(u't').callprop(u'validate', var.get(u"this").get(u'node'), var.get(u'key'), var.get(u'node')) + var.get(u"this").get(u'node').put(var.get(u'key'), var.get(u'node')) + PyJs_set_1972_._set_name(u'set') + var.get(u'NodePath').get(u'prototype').put(u'set', PyJs_set_1972_) + @Js + def PyJs_getPathLocation_1973_(this, arguments, var=var): + var = Scope({u'this':this, u'getPathLocation':PyJs_getPathLocation_1973_, u'arguments':arguments}, var) + var.registers([u'path', u'parts', u'key']) + var.put(u'parts', Js([])) + var.put(u'path', var.get(u"this")) + while 1: + var.put(u'key', var.get(u'path').get(u'key')) + if var.get(u'path').get(u'inList'): + var.put(u'key', (((var.get(u'path').get(u'listKey')+Js(u'['))+var.get(u'key'))+Js(u']'))) + var.get(u'parts').callprop(u'unshift', var.get(u'key')) + if not var.put(u'path', var.get(u'path').get(u'parentPath')): + break + return var.get(u'parts').callprop(u'join', Js(u'.')) + PyJs_getPathLocation_1973_._set_name(u'getPathLocation') + var.get(u'NodePath').get(u'prototype').put(u'getPathLocation', PyJs_getPathLocation_1973_) + @Js + def PyJs_debug_1974_(buildMessage, this, arguments, var=var): + var = Scope({u'this':this, u'buildMessage':buildMessage, u'arguments':arguments, u'debug':PyJs_debug_1974_}, var) + var.registers([u'buildMessage']) + if var.get(u'_debug').get(u'enabled').neg(): + return var.get('undefined') + var.get(u'_debug')(((((var.get(u"this").callprop(u'getPathLocation')+Js(u' '))+var.get(u"this").get(u'type'))+Js(u': '))+var.get(u'buildMessage')())) + PyJs_debug_1974_._set_name(u'debug') + var.get(u'NodePath').get(u'prototype').put(u'debug', PyJs_debug_1974_) + return var.get(u'NodePath') + PyJs_anonymous_1962_._set_name(u'anonymous') + var.put(u'NodePath', PyJs_anonymous_1962_()) + var.get(u'exports').put(u'default', var.get(u'NodePath')) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./ancestry'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./inference'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./replacement'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./evaluation'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./conversion'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./introspection'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./context'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./removal'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./modification'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./family'))) + PyJsComma(Js(0.0),var.get(u'_assign2').get(u'default'))(var.get(u'NodePath').get(u'prototype'), var.get(u'require')(Js(u'./comments'))) + @Js + def PyJs__loop2_1975_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_loop2':PyJs__loop2_1975_}, var) + var.registers([u'typeKey', u'type']) + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + return Js(u'break') + var.put(u'_ref2', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + return Js(u'break') + var.put(u'_ref2', var.get(u'_i').get(u'value')) + var.put(u'type', var.get(u'_ref2')) + var.put(u'typeKey', (Js(u'is')+var.get(u'type'))) + @Js + def PyJs_anonymous_1976_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + return var.get(u't').callprop(var.get(u'typeKey'), var.get(u"this").get(u'node'), var.get(u'opts')) + PyJs_anonymous_1976_._set_name(u'anonymous') + var.get(u'NodePath').get(u'prototype').put(var.get(u'typeKey'), PyJs_anonymous_1976_) + @Js + def PyJs_anonymous_1977_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts']) + if var.get(u"this").callprop(var.get(u'typeKey'), var.get(u'opts')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Expected node path of type ')+var.get(u'type')))) + raise PyJsTempException + PyJs_anonymous_1977_._set_name(u'anonymous') + var.get(u'NodePath').get(u'prototype').put((Js(u'assert')+var.get(u'type')), PyJs_anonymous_1977_) + PyJs__loop2_1975_._set_name(u'_loop2') + var.put(u'_loop2', PyJs__loop2_1975_) + #for JS loop + var.put(u'_iterator', var.get(u't').get(u'TYPES')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + var.put(u'_ret2', var.get(u'_loop2')()) + if PyJsStrictEq(var.get(u'_ret2'),Js(u'break')): + break + + @Js + def PyJs__loop_1978_(type, this, arguments, var=var): + var = Scope({u'this':this, u'_loop':PyJs__loop_1978_, u'type':type, u'arguments':arguments}, var) + var.registers([u'virtualType', u'type']) + if PyJsStrictEq(var.get(u'type').get(u'0'),Js(u'_')): + return Js(u'continue') + if (var.get(u't').get(u'TYPES').callprop(u'indexOf', var.get(u'type'))=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'type2', var.get(u'_ref')) + if (var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'type2')) or var.get(u'_isBaseType')(var.get(u'name'), var.get(u'type2'), var.get(u'true'))): + return var.get(u'true') + + return Js(False) + else: + return var.get(u'_isBaseType')(var.get(u'name'), var.get(u'type'), var.get(u'true')) + PyJsHoisted_couldBeBaseType_.func_name = u'couldBeBaseType' + var.put(u'couldBeBaseType', PyJsHoisted_couldBeBaseType_) + @Js + def PyJsHoisted_getTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'type']) + if var.get(u"this").get(u'typeAnnotation'): + return var.get(u"this").get(u'typeAnnotation') + var.put(u'type', (var.get(u"this").callprop(u'_getTypeAnnotation') or var.get(u't').callprop(u'anyTypeAnnotation'))) + if var.get(u't').callprop(u'isTypeAnnotation', var.get(u'type')): + var.put(u'type', var.get(u'type').get(u'typeAnnotation')) + return var.get(u"this").put(u'typeAnnotation', var.get(u'type')) + PyJsHoisted_getTypeAnnotation_.func_name = u'getTypeAnnotation' + var.put(u'getTypeAnnotation', PyJsHoisted_getTypeAnnotation_) + @Js + def PyJsHoisted_isBaseType_(baseName, soft, this, arguments, var=var): + var = Scope({u'this':this, u'baseName':baseName, u'soft':soft, u'arguments':arguments}, var) + var.registers([u'baseName', u'soft']) + return var.get(u'_isBaseType')(var.get(u'baseName'), var.get(u"this").callprop(u'getTypeAnnotation'), var.get(u'soft')) + PyJsHoisted_isBaseType_.func_name = u'isBaseType' + var.put(u'isBaseType', PyJsHoisted_isBaseType_) + @Js + def PyJsHoisted_baseTypeStrictlyMatches_(right, this, arguments, var=var): + var = Scope({u'this':this, u'right':right, u'arguments':arguments}, var) + var.registers([u'right', u'left']) + var.put(u'left', var.get(u"this").callprop(u'getTypeAnnotation')) + var.put(u'right', var.get(u'right').callprop(u'getTypeAnnotation')) + if (var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'left')).neg() and var.get(u't').callprop(u'isFlowBaseAnnotation', var.get(u'left'))): + return PyJsStrictEq(var.get(u'right').get(u'type'),var.get(u'left').get(u'type')) + PyJsHoisted_baseTypeStrictlyMatches_.func_name = u'baseTypeStrictlyMatches' + var.put(u'baseTypeStrictlyMatches', PyJsHoisted_baseTypeStrictlyMatches_) + @Js + def PyJsHoisted__getTypeAnnotation_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'declarParent', u'inferer', u'declar']) + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').neg(): + if (PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')) and var.get(u"this").get(u'parentPath').callprop(u'isVariableDeclarator')): + var.put(u'declar', var.get(u"this").get(u'parentPath').get(u'parentPath')) + var.put(u'declarParent', var.get(u'declar').get(u'parentPath')) + if (PyJsStrictEq(var.get(u'declar').get(u'key'),Js(u'left')) and var.get(u'declarParent').callprop(u'isForInStatement')): + return var.get(u't').callprop(u'stringTypeAnnotation') + if (PyJsStrictEq(var.get(u'declar').get(u'key'),Js(u'left')) and var.get(u'declarParent').callprop(u'isForOfStatement')): + return var.get(u't').callprop(u'anyTypeAnnotation') + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + return var.get('undefined') + if var.get(u'node').get(u'typeAnnotation'): + return var.get(u'node').get(u'typeAnnotation') + var.put(u'inferer', var.get(u'inferers').get(var.get(u'node').get(u'type'))) + if var.get(u'inferer'): + return var.get(u'inferer').callprop(u'call', var.get(u"this"), var.get(u'node')) + var.put(u'inferer', var.get(u'inferers').get(var.get(u"this").get(u'parentPath').get(u'type'))) + if (var.get(u'inferer') and var.get(u'inferer').get(u'validParent')): + return var.get(u"this").get(u'parentPath').callprop(u'getTypeAnnotation') + PyJsHoisted__getTypeAnnotation_.func_name = u'_getTypeAnnotation' + var.put(u'_getTypeAnnotation', PyJsHoisted__getTypeAnnotation_) + @Js + def PyJsHoisted_isGenericType_(genericName, this, arguments, var=var): + var = Scope({u'this':this, u'genericName':genericName, u'arguments':arguments}, var) + var.registers([u'genericName', u'type']) + var.put(u'type', var.get(u"this").callprop(u'getTypeAnnotation')) + PyJs_Object_1984_ = Js({u'name':var.get(u'genericName')}) + return (var.get(u't').callprop(u'isGenericTypeAnnotation', var.get(u'type')) and var.get(u't').callprop(u'isIdentifier', var.get(u'type').get(u'id'), PyJs_Object_1984_)) + PyJsHoisted_isGenericType_.func_name = u'isGenericType' + var.put(u'isGenericType', PyJsHoisted_isGenericType_) + @Js + def PyJsHoisted__isBaseType_(baseName, type, soft, this, arguments, var=var): + var = Scope({u'this':this, u'soft':soft, u'baseName':baseName, u'type':type, u'arguments':arguments}, var) + var.registers([u'soft', u'baseName', u'type']) + if PyJsStrictEq(var.get(u'baseName'),Js(u'string')): + return var.get(u't').callprop(u'isStringTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'number')): + return var.get(u't').callprop(u'isNumberTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'boolean')): + return var.get(u't').callprop(u'isBooleanTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'any')): + return var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'mixed')): + return var.get(u't').callprop(u'isMixedTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'empty')): + return var.get(u't').callprop(u'isEmptyTypeAnnotation', var.get(u'type')) + else: + if PyJsStrictEq(var.get(u'baseName'),Js(u'void')): + return var.get(u't').callprop(u'isVoidTypeAnnotation', var.get(u'type')) + else: + if var.get(u'soft'): + return Js(False) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Unknown base type ')+var.get(u'baseName')))) + raise PyJsTempException + PyJsHoisted__isBaseType_.func_name = u'_isBaseType' + var.put(u'_isBaseType', PyJsHoisted__isBaseType_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1983_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1983_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'getTypeAnnotation', var.get(u'getTypeAnnotation')) + var.get(u'exports').put(u'_getTypeAnnotation', var.get(u'_getTypeAnnotation')) + var.get(u'exports').put(u'isBaseType', var.get(u'isBaseType')) + var.get(u'exports').put(u'couldBeBaseType', var.get(u'couldBeBaseType')) + var.get(u'exports').put(u'baseTypeStrictlyMatches', var.get(u'baseTypeStrictlyMatches')) + var.get(u'exports').put(u'isGenericType', var.get(u'isGenericType')) + var.put(u'_inferers', var.get(u'require')(Js(u'./inferers'))) + var.put(u'inferers', var.get(u'_interopRequireWildcard')(var.get(u'_inferers'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_1981_._set_name(u'anonymous') +PyJs_Object_1985_ = Js({u'./inferers':Js(235.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_1986_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'getConditionalAnnotation', u'_interopRequireWildcard', u'getParentConditionalPath', u'require', u'_babelTypes', u'module', u'inferAnnotationFromBinaryExpression', u't', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'getTypeAnnotationBindingConstantViolations', u'getConstantViolationsBefore']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_1988_ = Js({}) + var.put(u'newObj', PyJs_Object_1988_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_getParentConditionalPath_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'parentPath']) + var.put(u'parentPath', PyJsComma(Js(0.0), Js(None))) + while var.put(u'parentPath', var.get(u'path').get(u'parentPath')): + if (var.get(u'parentPath').callprop(u'isIfStatement') or var.get(u'parentPath').callprop(u'isConditionalExpression')): + if PyJsStrictEq(var.get(u'path').get(u'key'),Js(u'test')): + return var.get('undefined') + else: + return var.get(u'parentPath') + else: + var.put(u'path', var.get(u'parentPath')) + PyJsHoisted_getParentConditionalPath_.func_name = u'getParentConditionalPath' + var.put(u'getParentConditionalPath', PyJsHoisted_getParentConditionalPath_) + @Js + def PyJsHoisted_inferAnnotationFromBinaryExpression_(name, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'name':name, u'arguments':arguments}, var) + var.registers([u'right', u'target', u'typeValue', u'typeofPath', u'typePath', u'name', u'operator', u'path', u'left']) + var.put(u'operator', var.get(u'path').get(u'node').get(u'operator')) + var.put(u'right', var.get(u'path').callprop(u'get', Js(u'right')).callprop(u'resolve')) + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left')).callprop(u'resolve')) + var.put(u'target', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_1993_ = Js({u'name':var.get(u'name')}) + if var.get(u'left').callprop(u'isIdentifier', PyJs_Object_1993_): + var.put(u'target', var.get(u'right')) + else: + PyJs_Object_1994_ = Js({u'name':var.get(u'name')}) + if var.get(u'right').callprop(u'isIdentifier', PyJs_Object_1994_): + var.put(u'target', var.get(u'left')) + if var.get(u'target'): + if PyJsStrictEq(var.get(u'operator'),Js(u'===')): + return var.get(u'target').callprop(u'getTypeAnnotation') + else: + if (var.get(u't').get(u'BOOLEAN_NUMBER_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + return var.get('undefined') + else: + if PyJsStrictNeq(var.get(u'operator'),Js(u'===')): + return var.get('undefined') + var.put(u'typeofPath', PyJsComma(Js(0.0), Js(None))) + var.put(u'typePath', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_1995_ = Js({u'operator':Js(u'typeof')}) + if var.get(u'left').callprop(u'isUnaryExpression', PyJs_Object_1995_): + var.put(u'typeofPath', var.get(u'left')) + var.put(u'typePath', var.get(u'right')) + else: + PyJs_Object_1996_ = Js({u'operator':Js(u'typeof')}) + if var.get(u'right').callprop(u'isUnaryExpression', PyJs_Object_1996_): + var.put(u'typeofPath', var.get(u'right')) + var.put(u'typePath', var.get(u'left')) + if (var.get(u'typePath').neg() and var.get(u'typeofPath').neg()): + return var.get('undefined') + var.put(u'typePath', var.get(u'typePath').callprop(u'resolve')) + if var.get(u'typePath').callprop(u'isLiteral').neg(): + return var.get('undefined') + var.put(u'typeValue', var.get(u'typePath').get(u'node').get(u'value')) + if PyJsStrictNeq(var.get(u'typeValue',throw=False).typeof(),Js(u'string')): + return var.get('undefined') + PyJs_Object_1997_ = Js({u'name':var.get(u'name')}) + if var.get(u'typeofPath').callprop(u'get', Js(u'argument')).callprop(u'isIdentifier', PyJs_Object_1997_).neg(): + return var.get('undefined') + return var.get(u't').callprop(u'createTypeAnnotationBasedOnTypeof', var.get(u'typePath').get(u'node').get(u'value')) + PyJsHoisted_inferAnnotationFromBinaryExpression_.func_name = u'inferAnnotationFromBinaryExpression' + var.put(u'inferAnnotationFromBinaryExpression', PyJsHoisted_inferAnnotationFromBinaryExpression_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_1989_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_1989_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getConstantViolationsBefore_(binding, path, functions, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'functions':functions, u'binding':binding, u'arguments':arguments}, var) + var.registers([u'path', u'violations', u'binding', u'functions']) + var.put(u'violations', var.get(u'binding').get(u'constantViolations').callprop(u'slice')) + var.get(u'violations').callprop(u'unshift', var.get(u'binding').get(u'path')) + @Js + def PyJs_anonymous_1992_(violation, this, arguments, var=var): + var = Scope({u'violation':violation, u'this':this, u'arguments':arguments}, var) + var.registers([u'status', u'violation']) + var.put(u'violation', var.get(u'violation').callprop(u'resolve')) + var.put(u'status', var.get(u'violation').callprop(u'_guessExecutionStatusRelativeTo', var.get(u'path'))) + if (var.get(u'functions') and PyJsStrictEq(var.get(u'status'),Js(u'function'))): + var.get(u'functions').callprop(u'push', var.get(u'violation')) + return PyJsStrictEq(var.get(u'status'),Js(u'before')) + PyJs_anonymous_1992_._set_name(u'anonymous') + return var.get(u'violations').callprop(u'filter', PyJs_anonymous_1992_) + PyJsHoisted_getConstantViolationsBefore_.func_name = u'getConstantViolationsBefore' + var.put(u'getConstantViolationsBefore', PyJsHoisted_getConstantViolationsBefore_) + @Js + def PyJsHoisted_getConditionalAnnotation_(path, name, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'name':name, u'arguments':arguments}, var) + var.registers([u'paths', u'name', u'test', u'path', u'ifStatement', u'type', u'types', u'_path']) + var.put(u'ifStatement', var.get(u'getParentConditionalPath')(var.get(u'path'))) + if var.get(u'ifStatement').neg(): + return var.get('undefined') + var.put(u'test', var.get(u'ifStatement').callprop(u'get', Js(u'test'))) + var.put(u'paths', Js([var.get(u'test')])) + var.put(u'types', Js([])) + while 1: + var.put(u'_path', var.get(u'paths').callprop(u'shift').callprop(u'resolve')) + if var.get(u'_path').callprop(u'isLogicalExpression'): + var.get(u'paths').callprop(u'push', var.get(u'_path').callprop(u'get', Js(u'left'))) + var.get(u'paths').callprop(u'push', var.get(u'_path').callprop(u'get', Js(u'right'))) + if var.get(u'_path').callprop(u'isBinaryExpression'): + var.put(u'type', var.get(u'inferAnnotationFromBinaryExpression')(var.get(u'name'), var.get(u'_path'))) + if var.get(u'type'): + var.get(u'types').callprop(u'push', var.get(u'type')) + if not var.get(u'paths').get(u'length'): + break + if var.get(u'types').get(u'length'): + PyJs_Object_1998_ = Js({u'typeAnnotation':var.get(u't').callprop(u'createUnionTypeAnnotation', var.get(u'types')),u'ifStatement':var.get(u'ifStatement')}) + return PyJs_Object_1998_ + else: + return var.get(u'getConditionalAnnotation')(var.get(u'ifStatement'), var.get(u'name')) + PyJsHoisted_getConditionalAnnotation_.func_name = u'getConditionalAnnotation' + var.put(u'getConditionalAnnotation', PyJsHoisted_getConditionalAnnotation_) + @Js + def PyJsHoisted_getTypeAnnotationBindingConstantViolations_(path, name, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'name':name, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'name', u'violation', u'binding', u'functionConstantViolations', u'_i', u'types', u'path', u'_ref', u'testType', u'constantViolations']) + var.put(u'binding', var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))) + var.put(u'types', Js([])) + var.get(u'path').put(u'typeAnnotation', var.get(u't').callprop(u'unionTypeAnnotation', var.get(u'types'))) + var.put(u'functionConstantViolations', Js([])) + var.put(u'constantViolations', var.get(u'getConstantViolationsBefore')(var.get(u'binding'), var.get(u'path'), var.get(u'functionConstantViolations'))) + var.put(u'testType', var.get(u'getConditionalAnnotation')(var.get(u'path'), var.get(u'name'))) + if var.get(u'testType'): + @Js + def PyJs_anonymous_1990_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'testConstantViolations']) + var.put(u'testConstantViolations', var.get(u'getConstantViolationsBefore')(var.get(u'binding'), var.get(u'testType').get(u'ifStatement'))) + @Js + def PyJs_anonymous_1991_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'testConstantViolations').callprop(u'indexOf', var.get(u'path'))=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'violation', var.get(u'_ref')) + var.get(u'types').callprop(u'push', var.get(u'violation').callprop(u'getTypeAnnotation')) + + if var.get(u'types').get(u'length'): + return var.get(u't').callprop(u'createUnionTypeAnnotation', var.get(u'types')) + PyJsHoisted_getTypeAnnotationBindingConstantViolations_.func_name = u'getTypeAnnotationBindingConstantViolations' + var.put(u'getTypeAnnotationBindingConstantViolations', PyJsHoisted_getTypeAnnotationBindingConstantViolations_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + @Js + def PyJs_anonymous_1987_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'binding']) + if var.get(u"this").callprop(u'isReferenced').neg(): + return var.get('undefined') + var.put(u'binding', var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u'node').get(u'name'))) + if var.get(u'binding'): + if var.get(u'binding').get(u'identifier').get(u'typeAnnotation'): + return var.get(u'binding').get(u'identifier').get(u'typeAnnotation') + else: + return var.get(u'getTypeAnnotationBindingConstantViolations')(var.get(u"this"), var.get(u'node').get(u'name')) + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'undefined')): + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + if (PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'NaN')) or PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'Infinity'))): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'arguments')): + pass + PyJs_anonymous_1987_._set_name(u'anonymous') + var.get(u'exports').put(u'default', PyJs_anonymous_1987_) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_1986_._set_name(u'anonymous') +PyJs_Object_1999_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2000_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'CallExpression', u'UpdateExpression', u'module', u'ObjectExpression', u'_interopRequireDefault', u'resolveCall', u'RegExpLiteral', u'ArrayExpression', u'Func', u'AssignmentExpression', u'exports', u'_interopRequireWildcard', u'RestElement', u'_babelTypes', u'NullLiteral', u'TypeCastExpression', u'SequenceExpression', u'BinaryExpression', u'BooleanLiteral', u'ConditionalExpression', u'UnaryExpression', u'NewExpression', u'require', u'StringLiteral', u'NumericLiteral', u'TaggedTemplateExpression', u't', u'_infererReference', u'TemplateLiteral', u'LogicalExpression', u'VariableDeclarator']) + @Js + def PyJsHoisted_CallExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'resolveCall')(var.get(u"this").callprop(u'get', Js(u'callee'))) + PyJsHoisted_CallExpression_.func_name = u'CallExpression' + var.put(u'CallExpression', PyJsHoisted_CallExpression_) + @Js + def PyJsHoisted_UpdateExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'operator', u'node']) + var.put(u'operator', var.get(u'node').get(u'operator')) + if (PyJsStrictEq(var.get(u'operator'),Js(u'++')) or PyJsStrictEq(var.get(u'operator'),Js(u'--'))): + return var.get(u't').callprop(u'numberTypeAnnotation') + PyJsHoisted_UpdateExpression_.func_name = u'UpdateExpression' + var.put(u'UpdateExpression', PyJsHoisted_UpdateExpression_) + @Js + def PyJsHoisted_ObjectExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Object'))) + PyJsHoisted_ObjectExpression_.func_name = u'ObjectExpression' + var.put(u'ObjectExpression', PyJsHoisted_ObjectExpression_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2004_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2004_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_resolveCall_(callee, this, arguments, var=var): + var = Scope({u'this':this, u'callee':callee, u'arguments':arguments}, var) + var.registers([u'callee']) + var.put(u'callee', var.get(u'callee').callprop(u'resolve')) + if var.get(u'callee').callprop(u'isFunction'): + if var.get(u'callee').callprop(u'is', Js(u'async')): + if var.get(u'callee').callprop(u'is', Js(u'generator')): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'AsyncIterator'))) + else: + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Promise'))) + else: + if var.get(u'callee').get(u'node').get(u'returnType'): + return var.get(u'callee').get(u'node').get(u'returnType') + else: + pass + PyJsHoisted_resolveCall_.func_name = u'resolveCall' + var.put(u'resolveCall', PyJsHoisted_resolveCall_) + @Js + def PyJsHoisted_RegExpLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'RegExp'))) + PyJsHoisted_RegExpLiteral_.func_name = u'RegExpLiteral' + var.put(u'RegExpLiteral', PyJsHoisted_RegExpLiteral_) + @Js + def PyJsHoisted_ArrayExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Array'))) + PyJsHoisted_ArrayExpression_.func_name = u'ArrayExpression' + var.put(u'ArrayExpression', PyJsHoisted_ArrayExpression_) + @Js + def PyJsHoisted_Func_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u't').callprop(u'identifier', Js(u'Function'))) + PyJsHoisted_Func_.func_name = u'Func' + var.put(u'Func', PyJsHoisted_Func_) + @Js + def PyJsHoisted_AssignmentExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'get', Js(u'right')).callprop(u'getTypeAnnotation') + PyJsHoisted_AssignmentExpression_.func_name = u'AssignmentExpression' + var.put(u'AssignmentExpression', PyJsHoisted_AssignmentExpression_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2003_ = Js({}) + var.put(u'newObj', PyJs_Object_2003_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_RestElement_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'ArrayExpression')() + PyJsHoisted_RestElement_.func_name = u'RestElement' + var.put(u'RestElement', PyJsHoisted_RestElement_) + @Js + def PyJsHoisted_NullLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'nullLiteralTypeAnnotation') + PyJsHoisted_NullLiteral_.func_name = u'NullLiteral' + var.put(u'NullLiteral', PyJsHoisted_NullLiteral_) + @Js + def PyJsHoisted_TypeCastExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'node').get(u'typeAnnotation') + PyJsHoisted_TypeCastExpression_.func_name = u'TypeCastExpression' + var.put(u'TypeCastExpression', PyJsHoisted_TypeCastExpression_) + @Js + def PyJsHoisted_SequenceExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'get', Js(u'expressions')).callprop(u'pop').callprop(u'getTypeAnnotation') + PyJsHoisted_SequenceExpression_.func_name = u'SequenceExpression' + var.put(u'SequenceExpression', PyJsHoisted_SequenceExpression_) + @Js + def PyJsHoisted_BinaryExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'operator', u'node', u'right', u'left']) + var.put(u'operator', var.get(u'node').get(u'operator')) + if (var.get(u't').get(u'NUMBER_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if (var.get(u't').get(u'BOOLEAN_BINARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'booleanTypeAnnotation') + else: + if PyJsStrictEq(var.get(u'operator'),Js(u'+')): + var.put(u'right', var.get(u"this").callprop(u'get', Js(u'right'))) + var.put(u'left', var.get(u"this").callprop(u'get', Js(u'left'))) + if (var.get(u'left').callprop(u'isBaseType', Js(u'number')) and var.get(u'right').callprop(u'isBaseType', Js(u'number'))): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if (var.get(u'left').callprop(u'isBaseType', Js(u'string')) or var.get(u'right').callprop(u'isBaseType', Js(u'string'))): + return var.get(u't').callprop(u'stringTypeAnnotation') + return var.get(u't').callprop(u'unionTypeAnnotation', Js([var.get(u't').callprop(u'stringTypeAnnotation'), var.get(u't').callprop(u'numberTypeAnnotation')])) + PyJsHoisted_BinaryExpression_.func_name = u'BinaryExpression' + var.put(u'BinaryExpression', PyJsHoisted_BinaryExpression_) + @Js + def PyJsHoisted_BooleanLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'booleanTypeAnnotation') + PyJsHoisted_BooleanLiteral_.func_name = u'BooleanLiteral' + var.put(u'BooleanLiteral', PyJsHoisted_BooleanLiteral_) + @Js + def PyJsHoisted_ConditionalExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'createUnionTypeAnnotation', Js([var.get(u"this").callprop(u'get', Js(u'consequent')).callprop(u'getTypeAnnotation'), var.get(u"this").callprop(u'get', Js(u'alternate')).callprop(u'getTypeAnnotation')])) + PyJsHoisted_ConditionalExpression_.func_name = u'ConditionalExpression' + var.put(u'ConditionalExpression', PyJsHoisted_ConditionalExpression_) + @Js + def PyJsHoisted_UnaryExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'operator', u'node']) + var.put(u'operator', var.get(u'node').get(u'operator')) + if PyJsStrictEq(var.get(u'operator'),Js(u'void')): + return var.get(u't').callprop(u'voidTypeAnnotation') + else: + if (var.get(u't').get(u'NUMBER_UNARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'numberTypeAnnotation') + else: + if (var.get(u't').get(u'STRING_UNARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'stringTypeAnnotation') + else: + if (var.get(u't').get(u'BOOLEAN_UNARY_OPERATORS').callprop(u'indexOf', var.get(u'operator'))>=Js(0.0)): + return var.get(u't').callprop(u'booleanTypeAnnotation') + PyJsHoisted_UnaryExpression_.func_name = u'UnaryExpression' + var.put(u'UnaryExpression', PyJsHoisted_UnaryExpression_) + @Js + def PyJsHoisted_NewExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'get', Js(u'callee')).callprop(u'isIdentifier'): + return var.get(u't').callprop(u'genericTypeAnnotation', var.get(u'node').get(u'callee')) + PyJsHoisted_NewExpression_.func_name = u'NewExpression' + var.put(u'NewExpression', PyJsHoisted_NewExpression_) + @Js + def PyJsHoisted_StringLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'stringTypeAnnotation') + PyJsHoisted_StringLiteral_.func_name = u'StringLiteral' + var.put(u'StringLiteral', PyJsHoisted_StringLiteral_) + @Js + def PyJsHoisted_NumericLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'numberTypeAnnotation') + PyJsHoisted_NumericLiteral_.func_name = u'NumericLiteral' + var.put(u'NumericLiteral', PyJsHoisted_NumericLiteral_) + @Js + def PyJsHoisted_TaggedTemplateExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'resolveCall')(var.get(u"this").callprop(u'get', Js(u'tag'))) + PyJsHoisted_TaggedTemplateExpression_.func_name = u'TaggedTemplateExpression' + var.put(u'TaggedTemplateExpression', PyJsHoisted_TaggedTemplateExpression_) + @Js + def PyJsHoisted_TemplateLiteral_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'stringTypeAnnotation') + PyJsHoisted_TemplateLiteral_.func_name = u'TemplateLiteral' + var.put(u'TemplateLiteral', PyJsHoisted_TemplateLiteral_) + @Js + def PyJsHoisted_LogicalExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u't').callprop(u'createUnionTypeAnnotation', Js([var.get(u"this").callprop(u'get', Js(u'left')).callprop(u'getTypeAnnotation'), var.get(u"this").callprop(u'get', Js(u'right')).callprop(u'getTypeAnnotation')])) + PyJsHoisted_LogicalExpression_.func_name = u'LogicalExpression' + var.put(u'LogicalExpression', PyJsHoisted_LogicalExpression_) + @Js + def PyJsHoisted_VariableDeclarator_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'id']) + var.put(u'id', var.get(u"this").callprop(u'get', Js(u'id'))) + if var.get(u'id').callprop(u'isIdentifier'): + return var.get(u"this").callprop(u'get', Js(u'init')).callprop(u'getTypeAnnotation') + else: + return var.get('undefined') + PyJsHoisted_VariableDeclarator_.func_name = u'VariableDeclarator' + var.put(u'VariableDeclarator', PyJsHoisted_VariableDeclarator_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'ClassDeclaration', var.get(u'exports').put(u'ClassExpression', var.get(u'exports').put(u'FunctionDeclaration', var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'exports').put(u'FunctionExpression', var.get(u'exports').put(u'Identifier', var.get(u'undefined'))))))) + var.put(u'_infererReference', var.get(u'require')(Js(u'./inferer-reference'))) + @Js + def PyJs_get_2002_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2002_}, var) + var.registers([]) + return var.get(u'_interopRequireDefault')(var.get(u'_infererReference')).get(u'default') + PyJs_get_2002_._set_name(u'get') + PyJs_Object_2001_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2002_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'Identifier'), PyJs_Object_2001_) + var.get(u'exports').put(u'VariableDeclarator', var.get(u'VariableDeclarator')) + var.get(u'exports').put(u'TypeCastExpression', var.get(u'TypeCastExpression')) + var.get(u'exports').put(u'NewExpression', var.get(u'NewExpression')) + var.get(u'exports').put(u'TemplateLiteral', var.get(u'TemplateLiteral')) + var.get(u'exports').put(u'UnaryExpression', var.get(u'UnaryExpression')) + var.get(u'exports').put(u'BinaryExpression', var.get(u'BinaryExpression')) + var.get(u'exports').put(u'LogicalExpression', var.get(u'LogicalExpression')) + var.get(u'exports').put(u'ConditionalExpression', var.get(u'ConditionalExpression')) + var.get(u'exports').put(u'SequenceExpression', var.get(u'SequenceExpression')) + var.get(u'exports').put(u'AssignmentExpression', var.get(u'AssignmentExpression')) + var.get(u'exports').put(u'UpdateExpression', var.get(u'UpdateExpression')) + var.get(u'exports').put(u'StringLiteral', var.get(u'StringLiteral')) + var.get(u'exports').put(u'NumericLiteral', var.get(u'NumericLiteral')) + var.get(u'exports').put(u'BooleanLiteral', var.get(u'BooleanLiteral')) + var.get(u'exports').put(u'NullLiteral', var.get(u'NullLiteral')) + var.get(u'exports').put(u'RegExpLiteral', var.get(u'RegExpLiteral')) + var.get(u'exports').put(u'ObjectExpression', var.get(u'ObjectExpression')) + var.get(u'exports').put(u'ArrayExpression', var.get(u'ArrayExpression')) + var.get(u'exports').put(u'RestElement', var.get(u'RestElement')) + var.get(u'exports').put(u'CallExpression', var.get(u'CallExpression')) + var.get(u'exports').put(u'TaggedTemplateExpression', var.get(u'TaggedTemplateExpression')) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + var.get(u'TypeCastExpression').put(u'validParent', var.get(u'true')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.get(u'RestElement').put(u'validParent', var.get(u'true')) + pass + var.get(u'exports').put(u'FunctionExpression', var.get(u'Func')) + var.get(u'exports').put(u'ArrowFunctionExpression', var.get(u'Func')) + var.get(u'exports').put(u'FunctionDeclaration', var.get(u'Func')) + var.get(u'exports').put(u'ClassExpression', var.get(u'Func')) + var.get(u'exports').put(u'ClassDeclaration', var.get(u'Func')) + pass + pass + pass +PyJs_anonymous_2000_._set_name(u'anonymous') +PyJs_Object_2005_ = Js({u'./inferer-reference':Js(234.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2006_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_resolve', u'is', u'exports', u'module', u'isnt', u'canSwapBetweenExpressionAndStatement', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'referencesImport', u'_typeof2', u'_typeof3', u'canHaveVariableDeclarationOrExpression', u'isStatementOrBlock', u't', u'has', u'_guessExecutionStatusRelativeTo', u'_includes', u'isStatic', u'isCompletionRecord', u'_interopRequireWildcard', u'_babelTypes', u'_includes2', u'equals', u'isNodeType', u'_guessExecutionStatusRelativeToDifferentFunctions', u'resolve', u'willIMaybeExecuteBefore', u'require', u'matchesPattern', u'getSource']) + @Js + def PyJsHoisted__resolve_(dangerous, resolved, this, arguments, var=var): + var = Scope({u'resolved':resolved, u'dangerous':dangerous, u'this':this, u'arguments':arguments}, var) + var.registers([u'resolved', u'dangerous', u'_isArray3', u'target', u'_this', u'_ret', u'_i3', u'binding', u'elems', u'prop', u'match', u'key', u'props', u'targetKey', u'elem', u'targetName', u'_ref3', u'_iterator3']) + var.put(u'_this', var.get(u"this")) + if (var.get(u'resolved') and (var.get(u'resolved').callprop(u'indexOf', var.get(u"this"))>=Js(0.0))): + return var.get('undefined') + var.put(u'resolved', (var.get(u'resolved') or Js([]))) + var.get(u'resolved').callprop(u'push', var.get(u"this")) + if var.get(u"this").callprop(u'isVariableDeclarator'): + if var.get(u"this").callprop(u'get', Js(u'id')).callprop(u'isIdentifier'): + return var.get(u"this").callprop(u'get', Js(u'init')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + else: + pass + else: + if var.get(u"this").callprop(u'isReferencedIdentifier'): + var.put(u'binding', var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u"this").get(u'node').get(u'name'))) + if var.get(u'binding').neg(): + return var.get('undefined') + if var.get(u'binding').get(u'constant').neg(): + return var.get('undefined') + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'module')): + return var.get('undefined') + if PyJsStrictNeq(var.get(u'binding').get(u'path'),var.get(u"this")): + @Js + def PyJs_anonymous_2010_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ret']) + var.put(u'ret', var.get(u'binding').get(u'path').callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved'))) + @Js + def PyJs_anonymous_2011_(parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'parent']) + return PyJsStrictEq(var.get(u'parent').get(u'node'),var.get(u'ret').get(u'node')) + PyJs_anonymous_2011_._set_name(u'anonymous') + if var.get(u'_this').callprop(u'find', PyJs_anonymous_2011_): + PyJs_Object_2012_ = Js({u'v':PyJsComma(Js(0.0), Js(None))}) + return PyJs_Object_2012_ + PyJs_Object_2013_ = Js({u'v':var.get(u'ret')}) + return PyJs_Object_2013_ + PyJs_anonymous_2010_._set_name(u'anonymous') + var.put(u'_ret', PyJs_anonymous_2010_()) + if PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'_ret',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'_ret'))),Js(u'object')): + return var.get(u'_ret').get(u'v') + else: + if var.get(u"this").callprop(u'isTypeCastExpression'): + return var.get(u"this").callprop(u'get', Js(u'expression')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + else: + if (var.get(u'dangerous') and var.get(u"this").callprop(u'isMemberExpression')): + var.put(u'targetKey', var.get(u"this").callprop(u'toComputedKey')) + if var.get(u't').callprop(u'isLiteral', var.get(u'targetKey')).neg(): + return var.get('undefined') + var.put(u'targetName', var.get(u'targetKey').get(u'value')) + var.put(u'target', var.get(u"this").callprop(u'get', Js(u'object')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved'))) + if var.get(u'target').callprop(u'isObjectExpression'): + var.put(u'props', var.get(u'target').callprop(u'get', Js(u'properties'))) + #for JS loop + var.put(u'_iterator3', var.get(u'props')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'prop', var.get(u'_ref3')) + if var.get(u'prop').callprop(u'isProperty').neg(): + continue + var.put(u'key', var.get(u'prop').callprop(u'get', Js(u'key'))) + PyJs_Object_2014_ = Js({u'name':var.get(u'targetName')}) + var.put(u'match', (var.get(u'prop').callprop(u'isnt', Js(u'computed')) and var.get(u'key').callprop(u'isIdentifier', PyJs_Object_2014_))) + PyJs_Object_2015_ = Js({u'value':var.get(u'targetName')}) + var.put(u'match', (var.get(u'match') or var.get(u'key').callprop(u'isLiteral', PyJs_Object_2015_))) + if var.get(u'match'): + return var.get(u'prop').callprop(u'get', Js(u'value')).callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + + else: + if (var.get(u'target').callprop(u'isArrayExpression') and var.get(u'isNaN')((+var.get(u'targetName'))).neg()): + var.put(u'elems', var.get(u'target').callprop(u'get', Js(u'elements'))) + var.put(u'elem', var.get(u'elems').get(var.get(u'targetName'))) + if var.get(u'elem'): + return var.get(u'elem').callprop(u'resolve', var.get(u'dangerous'), var.get(u'resolved')) + PyJsHoisted__resolve_.func_name = u'_resolve' + var.put(u'_resolve', PyJsHoisted__resolve_) + @Js + def PyJsHoisted_isStatic_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").get(u'scope').callprop(u'isStatic', var.get(u"this").get(u'node')) + PyJsHoisted_isStatic_.func_name = u'isStatic' + var.put(u'isStatic', PyJsHoisted_isStatic_) + @Js + def PyJsHoisted_isCompletionRecord_(allowInsideFunction, this, arguments, var=var): + var = Scope({u'this':this, u'allowInsideFunction':allowInsideFunction, u'arguments':arguments}, var) + var.registers([u'path', u'allowInsideFunction', u'container', u'first']) + var.put(u'path', var.get(u"this")) + var.put(u'first', var.get(u'true')) + while 1: + var.put(u'container', var.get(u'path').get(u'container')) + if (var.get(u'path').callprop(u'isFunction') and var.get(u'first').neg()): + return var.get(u'allowInsideFunction').neg().neg() + var.put(u'first', Js(False)) + if (var.get(u'Array').callprop(u'isArray', var.get(u'container')) and PyJsStrictNeq(var.get(u'path').get(u'key'),(var.get(u'container').get(u'length')-Js(1.0)))): + return Js(False) + if not (var.put(u'path', var.get(u'path').get(u'parentPath')) and var.get(u'path').callprop(u'isProgram').neg()): + break + return var.get(u'true') + PyJsHoisted_isCompletionRecord_.func_name = u'isCompletionRecord' + var.put(u'isCompletionRecord', PyJsHoisted_isCompletionRecord_) + @Js + def PyJsHoisted_willIMaybeExecuteBefore_(target, this, arguments, var=var): + var = Scope({u'this':this, u'target':target, u'arguments':arguments}, var) + var.registers([u'target']) + return PyJsStrictNeq(var.get(u"this").callprop(u'_guessExecutionStatusRelativeTo', var.get(u'target')),Js(u'after')) + PyJsHoisted_willIMaybeExecuteBefore_.func_name = u'willIMaybeExecuteBefore' + var.put(u'willIMaybeExecuteBefore', PyJsHoisted_willIMaybeExecuteBefore_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2007_ = Js({}) + var.put(u'newObj', PyJs_Object_2007_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_canHaveVariableDeclarationOrExpression_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')) or PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'left'))) and var.get(u"this").get(u'parentPath').callprop(u'isFor')) + PyJsHoisted_canHaveVariableDeclarationOrExpression_.func_name = u'canHaveVariableDeclarationOrExpression' + var.put(u'canHaveVariableDeclarationOrExpression', PyJsHoisted_canHaveVariableDeclarationOrExpression_) + @Js + def PyJsHoisted__guessExecutionStatusRelativeTo_(target, this, arguments, var=var): + var = Scope({u'this':this, u'target':target, u'arguments':arguments}, var) + var.registers([u'status', u'targetKeyPosition', u'target', u'selfIndex', u'selfPath', u'commonPath', u'targetRelationship', u'selfRelationship', u'selfFuncParent', u'selfPaths', u'targetFuncParent', u'targetPaths', u'selfKeyPosition', u'targetIndex']) + var.put(u'targetFuncParent', var.get(u'target').get(u'scope').callprop(u'getFunctionParent')) + var.put(u'selfFuncParent', var.get(u"this").get(u'scope').callprop(u'getFunctionParent')) + if PyJsStrictNeq(var.get(u'targetFuncParent').get(u'node'),var.get(u'selfFuncParent').get(u'node')): + var.put(u'status', var.get(u"this").callprop(u'_guessExecutionStatusRelativeToDifferentFunctions', var.get(u'targetFuncParent'))) + if var.get(u'status'): + return var.get(u'status') + else: + var.put(u'target', var.get(u'targetFuncParent').get(u'path')) + var.put(u'targetPaths', var.get(u'target').callprop(u'getAncestry')) + if (var.get(u'targetPaths').callprop(u'indexOf', var.get(u"this"))>=Js(0.0)): + return Js(u'after') + var.put(u'selfPaths', var.get(u"this").callprop(u'getAncestry')) + var.put(u'commonPath', PyJsComma(Js(0.0), Js(None))) + var.put(u'targetIndex', PyJsComma(Js(0.0), Js(None))) + var.put(u'selfIndex', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'selfIndex', Js(0.0)) + while (var.get(u'selfIndex')=Js(0.0)): + var.put(u'commonPath', var.get(u'selfPath')) + break + finally: + (var.put(u'selfIndex',Js(var.get(u'selfIndex').to_number())+Js(1))-Js(1)) + if var.get(u'commonPath').neg(): + return Js(u'before') + var.put(u'targetRelationship', var.get(u'targetPaths').get((var.get(u'targetIndex')-Js(1.0)))) + var.put(u'selfRelationship', var.get(u'selfPaths').get((var.get(u'selfIndex')-Js(1.0)))) + if (var.get(u'targetRelationship').neg() or var.get(u'selfRelationship').neg()): + return Js(u'before') + if (var.get(u'targetRelationship').get(u'listKey') and PyJsStrictEq(var.get(u'targetRelationship').get(u'container'),var.get(u'selfRelationship').get(u'container'))): + return (Js(u'before') if (var.get(u'targetRelationship').get(u'key')>var.get(u'selfRelationship').get(u'key')) else Js(u'after')) + var.put(u'targetKeyPosition', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'targetRelationship').get(u'type')).callprop(u'indexOf', var.get(u'targetRelationship').get(u'key'))) + var.put(u'selfKeyPosition', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'selfRelationship').get(u'type')).callprop(u'indexOf', var.get(u'selfRelationship').get(u'key'))) + return (Js(u'before') if (var.get(u'targetKeyPosition')>var.get(u'selfKeyPosition')) else Js(u'after')) + PyJsHoisted__guessExecutionStatusRelativeTo_.func_name = u'_guessExecutionStatusRelativeTo' + var.put(u'_guessExecutionStatusRelativeTo', PyJsHoisted__guessExecutionStatusRelativeTo_) + @Js + def PyJsHoisted_equals_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + return PyJsStrictEq(var.get(u"this").get(u'node').get(var.get(u'key')),var.get(u'value')) + PyJsHoisted_equals_.func_name = u'equals' + var.put(u'equals', PyJsHoisted_equals_) + @Js + def PyJsHoisted_isNodeType_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'type']) + return var.get(u't').callprop(u'isType', var.get(u"this").get(u'type'), var.get(u'type')) + PyJsHoisted_isNodeType_.func_name = u'isNodeType' + var.put(u'isNodeType', PyJsHoisted_isNodeType_) + @Js + def PyJsHoisted_isStatementOrBlock_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u"this").get(u'parentPath').callprop(u'isLabeledStatement') or var.get(u't').callprop(u'isBlockStatement', var.get(u"this").get(u'container'))): + return Js(False) + else: + return PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u't').get(u'STATEMENT_OR_BLOCK_KEYS'), var.get(u"this").get(u'key')) + PyJsHoisted_isStatementOrBlock_.func_name = u'isStatementOrBlock' + var.put(u'isStatementOrBlock', PyJsHoisted_isStatementOrBlock_) + @Js + def PyJsHoisted_isnt_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").callprop(u'has', var.get(u'key')).neg() + PyJsHoisted_isnt_.func_name = u'isnt' + var.put(u'isnt', PyJsHoisted_isnt_) + @Js + def PyJsHoisted_resolve_(dangerous, resolved, this, arguments, var=var): + var = Scope({u'resolved':resolved, u'dangerous':dangerous, u'this':this, u'arguments':arguments}, var) + var.registers([u'resolved', u'dangerous']) + return (var.get(u"this").callprop(u'_resolve', var.get(u'dangerous'), var.get(u'resolved')) or var.get(u"this")) + PyJsHoisted_resolve_.func_name = u'resolve' + var.put(u'resolve', PyJsHoisted_resolve_) + @Js + def PyJsHoisted_matchesPattern_(pattern, allowPartial, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'arguments':arguments, u'allowPartial':allowPartial}, var) + var.registers([u'node', u'search', u'i', u'pattern', u'allowPartial', u'matches', u'parts']) + @Js + def PyJsHoisted_matches_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'part', u'name']) + var.put(u'part', var.get(u'parts').get(var.get(u'i'))) + return (PyJsStrictEq(var.get(u'part'),Js(u'*')) or PyJsStrictEq(var.get(u'name'),var.get(u'part'))) + PyJsHoisted_matches_.func_name = u'matches' + var.put(u'matches', PyJsHoisted_matches_) + if var.get(u"this").callprop(u'isMemberExpression').neg(): + return Js(False) + var.put(u'parts', var.get(u'pattern').callprop(u'split', Js(u'.'))) + var.put(u'search', Js([var.get(u"this").get(u'node')])) + var.put(u'i', Js(0.0)) + pass + while var.get(u'search').get(u'length'): + var.put(u'node', var.get(u'search').callprop(u'shift')) + if (var.get(u'allowPartial') and PyJsStrictEq(var.get(u'i'),var.get(u'parts').get(u'length'))): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + if var.get(u'matches')(var.get(u'node').get(u'name')).neg(): + return Js(False) + else: + if var.get(u't').callprop(u'isLiteral', var.get(u'node')): + if var.get(u'matches')(var.get(u'node').get(u'value')).neg(): + return Js(False) + else: + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + if (var.get(u'node').get(u'computed') and var.get(u't').callprop(u'isLiteral', var.get(u'node').get(u'property')).neg()): + return Js(False) + else: + var.get(u'search').callprop(u'unshift', var.get(u'node').get(u'property')) + var.get(u'search').callprop(u'unshift', var.get(u'node').get(u'object')) + continue + else: + if var.get(u't').callprop(u'isThisExpression', var.get(u'node')): + if var.get(u'matches')(Js(u'this')).neg(): + return Js(False) + else: + return Js(False) + if (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))>var.get(u'parts').get(u'length')): + return Js(False) + return PyJsStrictEq(var.get(u'i'),var.get(u'parts').get(u'length')) + PyJsHoisted_matchesPattern_.func_name = u'matchesPattern' + var.put(u'matchesPattern', PyJsHoisted_matchesPattern_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2008_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2008_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getSource_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").get(u'node')) + if var.get(u'node').get(u'end'): + return var.get(u"this").get(u'hub').get(u'file').get(u'code').callprop(u'slice', var.get(u'node').get(u'start'), var.get(u'node').get(u'end')) + else: + return Js(u'') + PyJsHoisted_getSource_.func_name = u'getSource' + var.put(u'getSource', PyJsHoisted_getSource_) + @Js + def PyJsHoisted_has_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key', u'val']) + var.put(u'val', (var.get(u"this").get(u'node') and var.get(u"this").get(u'node').get(var.get(u'key')))) + if (var.get(u'val') and var.get(u'Array').callprop(u'isArray', var.get(u'val'))): + return var.get(u'val').get(u'length').neg().neg() + else: + return var.get(u'val').neg().neg() + PyJsHoisted_has_.func_name = u'has' + var.put(u'has', PyJsHoisted_has_) + @Js + def PyJsHoisted_referencesImport_(moduleSource, importName, this, arguments, var=var): + var = Scope({u'importName':importName, u'this':this, u'moduleSource':moduleSource, u'arguments':arguments}, var) + var.registers([u'importName', u'path', u'moduleSource', u'binding', u'parent']) + if var.get(u"this").callprop(u'isReferencedIdentifier').neg(): + return Js(False) + var.put(u'binding', var.get(u"this").get(u'scope').callprop(u'getBinding', var.get(u"this").get(u'node').get(u'name'))) + if (var.get(u'binding').neg() or PyJsStrictNeq(var.get(u'binding').get(u'kind'),Js(u'module'))): + return Js(False) + var.put(u'path', var.get(u'binding').get(u'path')) + var.put(u'parent', var.get(u'path').get(u'parentPath')) + if var.get(u'parent').callprop(u'isImportDeclaration').neg(): + return Js(False) + if PyJsStrictEq(var.get(u'parent').get(u'node').get(u'source').get(u'value'),var.get(u'moduleSource')): + if var.get(u'importName').neg(): + return var.get(u'true') + else: + return Js(False) + if (var.get(u'path').callprop(u'isImportDefaultSpecifier') and PyJsStrictEq(var.get(u'importName'),Js(u'default'))): + return var.get(u'true') + if (var.get(u'path').callprop(u'isImportNamespaceSpecifier') and PyJsStrictEq(var.get(u'importName'),Js(u'*'))): + return var.get(u'true') + if (var.get(u'path').callprop(u'isImportSpecifier') and PyJsStrictEq(var.get(u'path').get(u'node').get(u'imported').get(u'name'),var.get(u'importName'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_referencesImport_.func_name = u'referencesImport' + var.put(u'referencesImport', PyJsHoisted_referencesImport_) + @Js + def PyJsHoisted__guessExecutionStatusRelativeToDifferentFunctions_(targetFuncParent, this, arguments, var=var): + var = Scope({u'this':this, u'targetFuncParent':targetFuncParent, u'arguments':arguments}, var) + var.registers([u'status', u'targetFuncPath', u'referencePaths', u'_iterator', u'_isArray2', u'binding', u'_isArray', u'_i2', u'childOfFunction', u'targetFuncParent', u'_i', u'_path', u'path', u'_ref', u'_ref2', u'allStatus', u'_iterator2']) + var.put(u'targetFuncPath', var.get(u'targetFuncParent').get(u'path')) + if var.get(u'targetFuncPath').callprop(u'isFunctionDeclaration').neg(): + return var.get('undefined') + var.put(u'binding', var.get(u'targetFuncPath').get(u'scope').callprop(u'getBinding', var.get(u'targetFuncPath').get(u'node').get(u'id').get(u'name'))) + if var.get(u'binding').get(u'references').neg(): + return Js(u'before') + var.put(u'referencePaths', var.get(u'binding').get(u'referencePaths')) + #for JS loop + var.put(u'_iterator', var.get(u'referencePaths')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'path', var.get(u'_ref')) + if (PyJsStrictNeq(var.get(u'path').get(u'key'),Js(u'callee')) or var.get(u'path').get(u'parentPath').callprop(u'isCallExpression').neg()): + return var.get('undefined') + + var.put(u'allStatus', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'_iterator2', var.get(u'referencePaths')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_path', var.get(u'_ref2')) + @Js + def PyJs_anonymous_2009_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return PyJsStrictEq(var.get(u'path').get(u'node'),var.get(u'targetFuncPath').get(u'node')) + PyJs_anonymous_2009_._set_name(u'anonymous') + var.put(u'childOfFunction', var.get(u'_path').callprop(u'find', PyJs_anonymous_2009_).neg().neg()) + if var.get(u'childOfFunction'): + continue + var.put(u'status', var.get(u"this").callprop(u'_guessExecutionStatusRelativeTo', var.get(u'_path'))) + if var.get(u'allStatus'): + if PyJsStrictNeq(var.get(u'allStatus'),var.get(u'status')): + return var.get('undefined') + else: + var.put(u'allStatus', var.get(u'status')) + + return var.get(u'allStatus') + PyJsHoisted__guessExecutionStatusRelativeToDifferentFunctions_.func_name = u'_guessExecutionStatusRelativeToDifferentFunctions' + var.put(u'_guessExecutionStatusRelativeToDifferentFunctions', PyJsHoisted__guessExecutionStatusRelativeToDifferentFunctions_) + @Js + def PyJsHoisted_canSwapBetweenExpressionAndStatement_(replacement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replacement':replacement}, var) + var.registers([u'replacement']) + if (PyJsStrictNeq(var.get(u"this").get(u'key'),Js(u'body')) or var.get(u"this").get(u'parentPath').callprop(u'isArrowFunctionExpression').neg()): + return Js(False) + if var.get(u"this").callprop(u'isExpression'): + return var.get(u't').callprop(u'isBlockStatement', var.get(u'replacement')) + else: + if var.get(u"this").callprop(u'isBlockStatement'): + return var.get(u't').callprop(u'isExpression', var.get(u'replacement')) + return Js(False) + PyJsHoisted_canSwapBetweenExpressionAndStatement_.func_name = u'canSwapBetweenExpressionAndStatement' + var.put(u'canSwapBetweenExpressionAndStatement', PyJsHoisted_canSwapBetweenExpressionAndStatement_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.get(u'exports').put(u'is', var.get(u'undefined')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'matchesPattern', var.get(u'matchesPattern')) + var.get(u'exports').put(u'has', var.get(u'has')) + var.get(u'exports').put(u'isStatic', var.get(u'isStatic')) + var.get(u'exports').put(u'isnt', var.get(u'isnt')) + var.get(u'exports').put(u'equals', var.get(u'equals')) + var.get(u'exports').put(u'isNodeType', var.get(u'isNodeType')) + var.get(u'exports').put(u'canHaveVariableDeclarationOrExpression', var.get(u'canHaveVariableDeclarationOrExpression')) + var.get(u'exports').put(u'canSwapBetweenExpressionAndStatement', var.get(u'canSwapBetweenExpressionAndStatement')) + var.get(u'exports').put(u'isCompletionRecord', var.get(u'isCompletionRecord')) + var.get(u'exports').put(u'isStatementOrBlock', var.get(u'isStatementOrBlock')) + var.get(u'exports').put(u'referencesImport', var.get(u'referencesImport')) + var.get(u'exports').put(u'getSource', var.get(u'getSource')) + var.get(u'exports').put(u'willIMaybeExecuteBefore', var.get(u'willIMaybeExecuteBefore')) + var.get(u'exports').put(u'_guessExecutionStatusRelativeTo', var.get(u'_guessExecutionStatusRelativeTo')) + var.get(u'exports').put(u'_guessExecutionStatusRelativeToDifferentFunctions', var.get(u'_guessExecutionStatusRelativeToDifferentFunctions')) + var.get(u'exports').put(u'resolve', var.get(u'resolve')) + var.get(u'exports').put(u'_resolve', var.get(u'_resolve')) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + var.put(u'is', var.get(u'exports').put(u'is', var.get(u'has'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2006_._set_name(u'anonymous') +PyJs_Object_2016_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0),u'lodash/includes':Js(456.0)}) +@Js +def PyJs_anonymous_2017_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_classCallCheck2', u'PathHoister', u'_interopRequireWildcard', u'require', u'_babelTypes', u'module', u'referenceVisitor', u't', u'_interopRequireDefault', u'_classCallCheck3', u'_getIterator3', u'_getIterator2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2019_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2019_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2018_ = Js({}) + var.put(u'newObj', PyJs_Object_2018_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_ReferencedIdentifier_2021_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2021_, u'arguments':arguments}, var) + var.registers([u'_isArray', u'_iterator', u'binding', u'violationPath', u'state', u'_i', u'path', u'_ref']) + if (var.get(u'path').callprop(u'isJSXIdentifier') and var.get(u'_babelTypes').get(u'react').callprop(u'isCompatTag', var.get(u'path').get(u'node').get(u'name'))): + return var.get('undefined') + var.put(u'binding', var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'path').get(u'node').get(u'name'))) + if var.get(u'binding').neg(): + return var.get('undefined') + if PyJsStrictNeq(var.get(u'binding'),var.get(u'state').get(u'scope').callprop(u'getBinding', var.get(u'path').get(u'node').get(u'name'))): + return var.get('undefined') + if var.get(u'binding').get(u'constant'): + var.get(u'state').get(u'bindings').put(var.get(u'path').get(u'node').get(u'name'), var.get(u'binding')) + else: + #for JS loop + var.put(u'_iterator', var.get(u'binding').get(u'constantViolations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'violationPath', var.get(u'_ref')) + var.get(u'state').put(u'breakOnScopePaths', var.get(u'state').get(u'breakOnScopePaths').callprop(u'concat', var.get(u'violationPath').callprop(u'getAncestry'))) + + PyJs_ReferencedIdentifier_2021_._set_name(u'ReferencedIdentifier') + PyJs_Object_2020_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2021_}) + var.put(u'referenceVisitor', PyJs_Object_2020_) + @Js + def PyJs_anonymous_2022_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'PathHoister']) + @Js + def PyJsHoisted_PathHoister_(path, scope, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'scope':scope}, var) + var.registers([u'path', u'scope']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'PathHoister')) + var.get(u"this").put(u'breakOnScopePaths', Js([])) + PyJs_Object_2023_ = Js({}) + var.get(u"this").put(u'bindings', PyJs_Object_2023_) + var.get(u"this").put(u'scopes', Js([])) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'path', var.get(u'path')) + PyJsHoisted_PathHoister_.func_name = u'PathHoister' + var.put(u'PathHoister', PyJsHoisted_PathHoister_) + pass + @Js + def PyJs_isCompatibleScope_2024_(scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'arguments':arguments, u'isCompatibleScope':PyJs_isCompatibleScope_2024_}, var) + var.registers([u'scope', u'binding', u'key']) + for PyJsTemp in var.get(u"this").get(u'bindings'): + var.put(u'key', PyJsTemp) + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'key'))) + if var.get(u'scope').callprop(u'bindingIdentifierEquals', var.get(u'key'), var.get(u'binding').get(u'identifier')).neg(): + return Js(False) + return var.get(u'true') + PyJs_isCompatibleScope_2024_._set_name(u'isCompatibleScope') + var.get(u'PathHoister').get(u'prototype').put(u'isCompatibleScope', PyJs_isCompatibleScope_2024_) + @Js + def PyJs_getCompatibleScopes_2025_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getCompatibleScopes':PyJs_getCompatibleScopes_2025_}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this").get(u'path').get(u'scope')) + while 1: + if var.get(u"this").callprop(u'isCompatibleScope', var.get(u'scope')): + var.get(u"this").get(u'scopes').callprop(u'push', var.get(u'scope')) + else: + break + if (var.get(u"this").get(u'breakOnScopePaths').callprop(u'indexOf', var.get(u'scope').get(u'path'))>=Js(0.0)): + break + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_getCompatibleScopes_2025_._set_name(u'getCompatibleScopes') + var.get(u'PathHoister').get(u'prototype').put(u'getCompatibleScopes', PyJs_getCompatibleScopes_2025_) + @Js + def PyJs_getAttachmentPath_2026_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAttachmentPath':PyJs_getAttachmentPath_2026_}, var) + var.registers([u'path', u'binding', u'name', u'targetScope']) + var.put(u'path', var.get(u"this").callprop(u'_getAttachmentPath')) + if var.get(u'path').neg(): + return var.get('undefined') + var.put(u'targetScope', var.get(u'path').get(u'scope')) + if PyJsStrictEq(var.get(u'targetScope').get(u'path'),var.get(u'path')): + var.put(u'targetScope', var.get(u'path').get(u'scope').get(u'parent')) + if (var.get(u'targetScope').get(u'path').callprop(u'isProgram') or var.get(u'targetScope').get(u'path').callprop(u'isFunction')): + for PyJsTemp in var.get(u"this").get(u'bindings'): + var.put(u'name', PyJsTemp) + if var.get(u'targetScope').callprop(u'hasOwnBinding', var.get(u'name')).neg(): + continue + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'param')): + continue + if (var.get(u'binding').get(u'path').callprop(u'getStatementParent').get(u'key')>var.get(u'path').get(u'key')): + return var.get('undefined') + return var.get(u'path') + PyJs_getAttachmentPath_2026_._set_name(u'getAttachmentPath') + var.get(u'PathHoister').get(u'prototype').put(u'getAttachmentPath', PyJs_getAttachmentPath_2026_) + @Js + def PyJs__getAttachmentPath_2027_(this, arguments, var=var): + var = Scope({u'this':this, u'_getAttachmentPath':PyJs__getAttachmentPath_2027_, u'arguments':arguments}, var) + var.registers([u'scopes', u'scope']) + var.put(u'scopes', var.get(u"this").get(u'scopes')) + var.put(u'scope', var.get(u'scopes').callprop(u'pop')) + if var.get(u'scope').neg(): + return var.get('undefined') + if var.get(u'scope').get(u'path').callprop(u'isFunction'): + if var.get(u"this").callprop(u'hasOwnParamBindings', var.get(u'scope')): + if PyJsStrictEq(var.get(u"this").get(u'scope'),var.get(u'scope')): + return var.get('undefined') + return var.get(u'scope').get(u'path').callprop(u'get', Js(u'body')).callprop(u'get', Js(u'body')).get(u'0') + else: + return var.get(u"this").callprop(u'getNextScopeStatementParent') + else: + if var.get(u'scope').get(u'path').callprop(u'isProgram'): + return var.get(u"this").callprop(u'getNextScopeStatementParent') + PyJs__getAttachmentPath_2027_._set_name(u'_getAttachmentPath') + var.get(u'PathHoister').get(u'prototype').put(u'_getAttachmentPath', PyJs__getAttachmentPath_2027_) + @Js + def PyJs_getNextScopeStatementParent_2028_(this, arguments, var=var): + var = Scope({u'this':this, u'getNextScopeStatementParent':PyJs_getNextScopeStatementParent_2028_, u'arguments':arguments}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this").get(u'scopes').callprop(u'pop')) + if var.get(u'scope'): + return var.get(u'scope').get(u'path').callprop(u'getStatementParent') + PyJs_getNextScopeStatementParent_2028_._set_name(u'getNextScopeStatementParent') + var.get(u'PathHoister').get(u'prototype').put(u'getNextScopeStatementParent', PyJs_getNextScopeStatementParent_2028_) + @Js + def PyJs_hasOwnParamBindings_2029_(scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'arguments':arguments, u'hasOwnParamBindings':PyJs_hasOwnParamBindings_2029_}, var) + var.registers([u'scope', u'binding', u'name']) + for PyJsTemp in var.get(u"this").get(u'bindings'): + var.put(u'name', PyJsTemp) + if var.get(u'scope').callprop(u'hasOwnBinding', var.get(u'name')).neg(): + continue + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + if PyJsStrictEq(var.get(u'binding').get(u'kind'),Js(u'param')): + return var.get(u'true') + return Js(False) + PyJs_hasOwnParamBindings_2029_._set_name(u'hasOwnParamBindings') + var.get(u'PathHoister').get(u'prototype').put(u'hasOwnParamBindings', PyJs_hasOwnParamBindings_2029_) + @Js + def PyJs_run_2030_(this, arguments, var=var): + var = Scope({u'this':this, u'run':PyJs_run_2030_, u'arguments':arguments}, var) + var.registers([u'node', u'attachTo', u'uid', u'parent']) + var.put(u'node', var.get(u"this").get(u'path').get(u'node')) + if var.get(u'node').get(u'_hoisted'): + return var.get('undefined') + var.get(u'node').put(u'_hoisted', var.get(u'true')) + var.get(u"this").get(u'path').callprop(u'traverse', var.get(u'referenceVisitor'), var.get(u"this")) + var.get(u"this").callprop(u'getCompatibleScopes') + var.put(u'attachTo', var.get(u"this").callprop(u'getAttachmentPath')) + if var.get(u'attachTo').neg(): + return var.get('undefined') + if PyJsStrictEq(var.get(u'attachTo').callprop(u'getFunctionParent'),var.get(u"this").get(u'path').callprop(u'getFunctionParent')): + return var.get('undefined') + var.put(u'uid', var.get(u'attachTo').get(u'scope').callprop(u'generateUidIdentifier', Js(u'ref'))) + var.get(u'attachTo').callprop(u'insertBefore', Js([var.get(u't').callprop(u'variableDeclaration', Js(u'var'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u'uid'), var.get(u"this").get(u'path').get(u'node'))]))])) + var.put(u'parent', var.get(u"this").get(u'path').get(u'parentPath')) + if (var.get(u'parent').callprop(u'isJSXElement') and PyJsStrictEq(var.get(u"this").get(u'path').get(u'container'),var.get(u'parent').get(u'node').get(u'children'))): + var.put(u'uid', var.get(u't').callprop(u'JSXExpressionContainer', var.get(u'uid'))) + var.get(u"this").get(u'path').callprop(u'replaceWith', var.get(u'uid')) + PyJs_run_2030_._set_name(u'run') + var.get(u'PathHoister').get(u'prototype').put(u'run', PyJs_run_2030_) + return var.get(u'PathHoister') + PyJs_anonymous_2022_._set_name(u'anonymous') + var.put(u'PathHoister', PyJs_anonymous_2022_()) + var.get(u'exports').put(u'default', var.get(u'PathHoister')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2017_._set_name(u'anonymous') +PyJs_Object_2031_ = Js({u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2032_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'hooks', u'require', u'exports', u'module']) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + @Js + def PyJs_anonymous_2033_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'body')) and var.get(u'parent').callprop(u'isArrowFunctionExpression')): + var.get(u'self').callprop(u'replaceWith', var.get(u'self').get(u'scope').callprop(u'buildUndefinedNode')) + return var.get(u'true') + PyJs_anonymous_2033_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2034_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'removeParent', u'parent']) + var.put(u'removeParent', Js(False)) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'test')) and (var.get(u'parent').callprop(u'isWhile') or var.get(u'parent').callprop(u'isSwitchCase'))))) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'declaration')) and var.get(u'parent').callprop(u'isExportDeclaration')))) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'body')) and var.get(u'parent').callprop(u'isLabeledStatement')))) + var.put(u'removeParent', (var.get(u'removeParent') or ((PyJsStrictEq(var.get(u'self').get(u'listKey'),Js(u'declarations')) and var.get(u'parent').callprop(u'isVariableDeclaration')) and PyJsStrictEq(var.get(u'parent').get(u'node').get(u'declarations').get(u'length'),Js(1.0))))) + var.put(u'removeParent', (var.get(u'removeParent') or (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'expression')) and var.get(u'parent').callprop(u'isExpressionStatement')))) + if var.get(u'removeParent'): + var.get(u'parent').callprop(u'remove') + return var.get(u'true') + PyJs_anonymous_2034_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2035_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if (var.get(u'parent').callprop(u'isSequenceExpression') and PyJsStrictEq(var.get(u'parent').get(u'node').get(u'expressions').get(u'length'),Js(1.0))): + var.get(u'parent').callprop(u'replaceWith', var.get(u'parent').get(u'node').get(u'expressions').get(u'0')) + return var.get(u'true') + PyJs_anonymous_2035_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2036_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if var.get(u'parent').callprop(u'isBinary'): + if PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'left')): + var.get(u'parent').callprop(u'replaceWith', var.get(u'parent').get(u'node').get(u'right')) + else: + var.get(u'parent').callprop(u'replaceWith', var.get(u'parent').get(u'node').get(u'left')) + return var.get(u'true') + PyJs_anonymous_2036_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2037_(self, parent, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'self', u'parent']) + if ((var.get(u'parent').callprop(u'isIfStatement') and (PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'consequent')) or PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'alternate')))) or (var.get(u'parent').callprop(u'isLoop') and PyJsStrictEq(var.get(u'self').get(u'key'),Js(u'body')))): + PyJs_Object_2038_ = Js({u'type':Js(u'BlockStatement'),u'body':Js([])}) + var.get(u'self').callprop(u'replaceWith', PyJs_Object_2038_) + return var.get(u'true') + PyJs_anonymous_2037_._set_name(u'anonymous') + var.put(u'hooks', var.get(u'exports').put(u'hooks', Js([PyJs_anonymous_2033_, PyJs_anonymous_2034_, PyJs_anonymous_2035_, PyJs_anonymous_2036_, PyJs_anonymous_2037_]))) +PyJs_anonymous_2032_._set_name(u'anonymous') +PyJs_Object_2039_ = Js({}) +@Js +def PyJs_anonymous_2040_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Referenced', u'ReferencedIdentifier', u'Pure', u'_interopRequireWildcard', u'require', u'_babelTypes', u'Flow', u'module', u'ReferencedMemberExpression', u'BlockScoped', u'Generated', u'User', u't', u'Statement', u'Var', u'Scope', u'Expression', u'BindingIdentifier']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2042_ = Js({}) + var.put(u'newObj', PyJs_Object_2042_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_2041_(var=var): + return var.get(u'exports').put(u'Var', var.get(u'exports').put(u'BlockScoped', var.get(u'exports').put(u'Referenced', var.get(u'exports').put(u'Scope', var.get(u'exports').put(u'Expression', var.get(u'exports').put(u'Statement', var.get(u'exports').put(u'BindingIdentifier', var.get(u'exports').put(u'ReferencedMemberExpression', var.get(u'exports').put(u'ReferencedIdentifier', var.get(u'undefined')))))))))) + var.get(u'exports').put(u'Flow', var.get(u'exports').put(u'Pure', var.get(u'exports').put(u'Generated', var.get(u'exports').put(u'User', PyJs_LONG_2041_())))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + @Js + def PyJs_checkPath_2044_(_ref, opts, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'checkPath':PyJs_checkPath_2044_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'_ref', u'opts', u'parent']) + var.put(u'node', var.get(u'_ref').get(u'node')) + var.put(u'parent', var.get(u'_ref').get(u'parent')) + if (var.get(u't').callprop(u'isIdentifier', var.get(u'node'), var.get(u'opts')).neg() and var.get(u't').callprop(u'isJSXMemberExpression', var.get(u'parent'), var.get(u'opts')).neg()): + if var.get(u't').callprop(u'isJSXIdentifier', var.get(u'node'), var.get(u'opts')): + if var.get(u'_babelTypes').get(u'react').callprop(u'isCompatTag', var.get(u'node').get(u'name')): + return Js(False) + else: + return Js(False) + return var.get(u't').callprop(u'isReferenced', var.get(u'node'), var.get(u'parent')) + PyJs_checkPath_2044_._set_name(u'checkPath') + PyJs_Object_2043_ = Js({u'types':Js([Js(u'Identifier'), Js(u'JSXIdentifier')]),u'checkPath':PyJs_checkPath_2044_}) + var.put(u'ReferencedIdentifier', var.get(u'exports').put(u'ReferencedIdentifier', PyJs_Object_2043_)) + @Js + def PyJs_checkPath_2046_(_ref2, this, arguments, var=var): + var = Scope({u'this':this, u'checkPath':PyJs_checkPath_2046_, u'_ref2':_ref2, u'arguments':arguments}, var) + var.registers([u'node', u'_ref2', u'parent']) + var.put(u'node', var.get(u'_ref2').get(u'node')) + var.put(u'parent', var.get(u'_ref2').get(u'parent')) + return (var.get(u't').callprop(u'isMemberExpression', var.get(u'node')) and var.get(u't').callprop(u'isReferenced', var.get(u'node'), var.get(u'parent'))) + PyJs_checkPath_2046_._set_name(u'checkPath') + PyJs_Object_2045_ = Js({u'types':Js([Js(u'MemberExpression')]),u'checkPath':PyJs_checkPath_2046_}) + var.put(u'ReferencedMemberExpression', var.get(u'exports').put(u'ReferencedMemberExpression', PyJs_Object_2045_)) + @Js + def PyJs_checkPath_2048_(_ref3, this, arguments, var=var): + var = Scope({u'this':this, u'checkPath':PyJs_checkPath_2048_, u'_ref3':_ref3, u'arguments':arguments}, var) + var.registers([u'node', u'_ref3', u'parent']) + var.put(u'node', var.get(u'_ref3').get(u'node')) + var.put(u'parent', var.get(u'_ref3').get(u'parent')) + return (var.get(u't').callprop(u'isIdentifier', var.get(u'node')) and var.get(u't').callprop(u'isBinding', var.get(u'node'), var.get(u'parent'))) + PyJs_checkPath_2048_._set_name(u'checkPath') + PyJs_Object_2047_ = Js({u'types':Js([Js(u'Identifier')]),u'checkPath':PyJs_checkPath_2048_}) + var.put(u'BindingIdentifier', var.get(u'exports').put(u'BindingIdentifier', PyJs_Object_2047_)) + @Js + def PyJs_checkPath_2050_(_ref4, this, arguments, var=var): + var = Scope({u'this':this, u'_ref4':_ref4, u'checkPath':PyJs_checkPath_2050_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref4', u'parent']) + var.put(u'node', var.get(u'_ref4').get(u'node')) + var.put(u'parent', var.get(u'_ref4').get(u'parent')) + if var.get(u't').callprop(u'isStatement', var.get(u'node')): + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')): + PyJs_Object_2051_ = Js({u'left':var.get(u'node')}) + if var.get(u't').callprop(u'isForXStatement', var.get(u'parent'), PyJs_Object_2051_): + return Js(False) + PyJs_Object_2052_ = Js({u'init':var.get(u'node')}) + if var.get(u't').callprop(u'isForStatement', var.get(u'parent'), PyJs_Object_2052_): + return Js(False) + return var.get(u'true') + else: + return Js(False) + PyJs_checkPath_2050_._set_name(u'checkPath') + PyJs_Object_2049_ = Js({u'types':Js([Js(u'Statement')]),u'checkPath':PyJs_checkPath_2050_}) + var.put(u'Statement', var.get(u'exports').put(u'Statement', PyJs_Object_2049_)) + @Js + def PyJs_checkPath_2054_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2054_, u'arguments':arguments}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isIdentifier'): + return var.get(u'path').callprop(u'isReferencedIdentifier') + else: + return var.get(u't').callprop(u'isExpression', var.get(u'path').get(u'node')) + PyJs_checkPath_2054_._set_name(u'checkPath') + PyJs_Object_2053_ = Js({u'types':Js([Js(u'Expression')]),u'checkPath':PyJs_checkPath_2054_}) + var.put(u'Expression', var.get(u'exports').put(u'Expression', PyJs_Object_2053_)) + @Js + def PyJs_checkPath_2056_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2056_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isScope', var.get(u'path').get(u'node'), var.get(u'path').get(u'parent')) + PyJs_checkPath_2056_._set_name(u'checkPath') + PyJs_Object_2055_ = Js({u'types':Js([Js(u'Scopable')]),u'checkPath':PyJs_checkPath_2056_}) + var.put(u'Scope', var.get(u'exports').put(u'Scope', PyJs_Object_2055_)) + @Js + def PyJs_checkPath_2058_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2058_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isReferenced', var.get(u'path').get(u'node'), var.get(u'path').get(u'parent')) + PyJs_checkPath_2058_._set_name(u'checkPath') + PyJs_Object_2057_ = Js({u'checkPath':PyJs_checkPath_2058_}) + var.put(u'Referenced', var.get(u'exports').put(u'Referenced', PyJs_Object_2057_)) + @Js + def PyJs_checkPath_2060_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2060_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isBlockScoped', var.get(u'path').get(u'node')) + PyJs_checkPath_2060_._set_name(u'checkPath') + PyJs_Object_2059_ = Js({u'checkPath':PyJs_checkPath_2060_}) + var.put(u'BlockScoped', var.get(u'exports').put(u'BlockScoped', PyJs_Object_2059_)) + @Js + def PyJs_checkPath_2062_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2062_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u't').callprop(u'isVar', var.get(u'path').get(u'node')) + PyJs_checkPath_2062_._set_name(u'checkPath') + PyJs_Object_2061_ = Js({u'types':Js([Js(u'VariableDeclaration')]),u'checkPath':PyJs_checkPath_2062_}) + var.put(u'Var', var.get(u'exports').put(u'Var', PyJs_Object_2061_)) + @Js + def PyJs_checkPath_2064_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2064_, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').get(u'node') and var.get(u'path').get(u'node').get(u'loc').neg().neg()) + PyJs_checkPath_2064_._set_name(u'checkPath') + PyJs_Object_2063_ = Js({u'checkPath':PyJs_checkPath_2064_}) + var.put(u'User', var.get(u'exports').put(u'User', PyJs_Object_2063_)) + @Js + def PyJs_checkPath_2066_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2066_, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'path').callprop(u'isUser').neg() + PyJs_checkPath_2066_._set_name(u'checkPath') + PyJs_Object_2065_ = Js({u'checkPath':PyJs_checkPath_2066_}) + var.put(u'Generated', var.get(u'exports').put(u'Generated', PyJs_Object_2065_)) + @Js + def PyJs_checkPath_2068_(path, opts, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'checkPath':PyJs_checkPath_2068_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'path', u'opts']) + return var.get(u'path').get(u'scope').callprop(u'isPure', var.get(u'path').get(u'node'), var.get(u'opts')) + PyJs_checkPath_2068_._set_name(u'checkPath') + PyJs_Object_2067_ = Js({u'checkPath':PyJs_checkPath_2068_}) + var.put(u'Pure', var.get(u'exports').put(u'Pure', PyJs_Object_2067_)) + @Js + def PyJs_checkPath_2070_(_ref5, this, arguments, var=var): + var = Scope({u'this':this, u'_ref5':_ref5, u'checkPath':PyJs_checkPath_2070_, u'arguments':arguments}, var) + var.registers([u'node', u'_ref5']) + var.put(u'node', var.get(u'_ref5').get(u'node')) + if var.get(u't').callprop(u'isFlow', var.get(u'node')): + return var.get(u'true') + else: + if var.get(u't').callprop(u'isImportDeclaration', var.get(u'node')): + return (PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'type')) or PyJsStrictEq(var.get(u'node').get(u'importKind'),Js(u'typeof'))) + else: + if var.get(u't').callprop(u'isExportDeclaration', var.get(u'node')): + return PyJsStrictEq(var.get(u'node').get(u'exportKind'),Js(u'type')) + else: + return Js(False) + PyJs_checkPath_2070_._set_name(u'checkPath') + PyJs_Object_2069_ = Js({u'types':Js([Js(u'Flow'), Js(u'ImportDeclaration'), Js(u'ExportDeclaration')]),u'checkPath':PyJs_checkPath_2070_}) + var.put(u'Flow', var.get(u'exports').put(u'Flow', PyJs_Object_2069_)) +PyJs_anonymous_2040_._set_name(u'anonymous') +PyJs_Object_2071_ = Js({u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2072_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_hoister', u'updateSiblingKeys', u'_verifyNodeList', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'_maybePopFromStatements', u'_typeof2', u'_typeof3', u'_interopRequireWildcard', u'unshiftContainer', u'insertAfter', u'exports', u'pushContainer', u'insertBefore', u'_babelTypes', u'hoist', u'module', u'_index2', u'_index', u'require', u'_containerInsert', u'_containerInsertBefore', u't', u'_containerInsertAfter', u'_hoister2']) + @Js + def PyJsHoisted_pushContainer_(listKey, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'listKey':listKey, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'path', u'listKey', u'container', u'nodes']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + var.put(u'container', var.get(u"this").get(u'node').get(var.get(u'listKey'))) + PyJs_Object_2078_ = Js({u'parentPath':var.get(u"this"),u'parent':var.get(u"this").get(u'node'),u'container':var.get(u'container'),u'listKey':var.get(u'listKey'),u'key':var.get(u'container').get(u'length')}) + var.put(u'path', var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_2078_)) + return var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'nodes')) + PyJsHoisted_pushContainer_.func_name = u'pushContainer' + var.put(u'pushContainer', PyJsHoisted_pushContainer_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2073_ = Js({}) + var.put(u'newObj', PyJs_Object_2073_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_insertBefore_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + if (var.get(u"this").get(u'parentPath').callprop(u'isExpressionStatement') or var.get(u"this").get(u'parentPath').callprop(u'isLabeledStatement')): + return var.get(u"this").get(u'parentPath').callprop(u'insertBefore', var.get(u'nodes')) + else: + if (var.get(u"this").callprop(u'isNodeType', Js(u'Expression')) or (var.get(u"this").get(u'parentPath').callprop(u'isForStatement') and PyJsStrictEq(var.get(u"this").get(u'key'),Js(u'init')))): + if var.get(u"this").get(u'node'): + var.get(u'nodes').callprop(u'push', var.get(u"this").get(u'node')) + var.get(u"this").callprop(u'replaceExpressionWithStatements', var.get(u'nodes')) + else: + var.get(u"this").callprop(u'_maybePopFromStatements', var.get(u'nodes')) + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + return var.get(u"this").callprop(u'_containerInsertBefore', var.get(u'nodes')) + else: + if var.get(u"this").callprop(u'isStatementOrBlock'): + if var.get(u"this").get(u'node'): + var.get(u'nodes').callprop(u'push', var.get(u"this").get(u'node')) + var.get(u"this").callprop(u'_replaceWith', var.get(u't').callprop(u'blockStatement', var.get(u'nodes'))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We don't know what to do with this node type. We were previously a Statement but we can't fit in here?"))) + raise PyJsTempException + return Js([var.get(u"this")]) + PyJsHoisted_insertBefore_.func_name = u'insertBefore' + var.put(u'insertBefore', PyJsHoisted_insertBefore_) + @Js + def PyJsHoisted__containerInsert_(PyJsArg_66726f6d_, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'from':PyJsArg_66726f6d_, u'arguments':arguments}, var) + var.registers([u'node', u'paths', u'_isArray', u'context', u'_iterator', u'_isArray2', u'to', u'i', u'_i2', u'_ref2', u'contexts', u'from', u'_i', u'path', u'_ref', u'_iterator2', u'nodes', u'_path']) + var.get(u"this").callprop(u'updateSiblingKeys', var.get(u'from'), var.get(u'nodes').get(u'length')) + var.put(u'paths', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'_path', var.get(u'_ref')) + var.get(u'_path').callprop(u'setScope') + @Js + def PyJs_anonymous_2076_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(u'Inserted.') + PyJs_anonymous_2076_._set_name(u'anonymous') + var.get(u'_path').callprop(u'debug', PyJs_anonymous_2076_) + #for JS loop + var.put(u'_iterator2', var.get(u'contexts')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'context', var.get(u'_ref2')) + var.get(u'context').callprop(u'maybeQueue', var.get(u'_path'), var.get(u'true')) + + + return var.get(u'paths') + PyJsHoisted__containerInsert_.func_name = u'_containerInsert' + var.put(u'_containerInsert', PyJsHoisted__containerInsert_) + @Js + def PyJsHoisted_unshiftContainer_(listKey, nodes, this, arguments, var=var): + var = Scope({u'this':this, u'listKey':listKey, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'path', u'listKey', u'nodes']) + var.get(u"this").callprop(u'_assertUnremoved') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + PyJs_Object_2077_ = Js({u'parentPath':var.get(u"this"),u'parent':var.get(u"this").get(u'node'),u'container':var.get(u"this").get(u'node').get(var.get(u'listKey')),u'listKey':var.get(u'listKey'),u'key':Js(0.0)}) + var.put(u'path', var.get(u'_index2').get(u'default').callprop(u'get', PyJs_Object_2077_)) + return var.get(u'path').callprop(u'insertBefore', var.get(u'nodes')) + PyJsHoisted_unshiftContainer_.func_name = u'unshiftContainer' + var.put(u'unshiftContainer', PyJsHoisted_unshiftContainer_) + @Js + def PyJsHoisted__containerInsertBefore_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + return var.get(u"this").callprop(u'_containerInsert', var.get(u"this").get(u'key'), var.get(u'nodes')) + PyJsHoisted__containerInsertBefore_.func_name = u'_containerInsertBefore' + var.put(u'_containerInsertBefore', PyJsHoisted__containerInsertBefore_) + @Js + def PyJsHoisted_updateSiblingKeys_(fromIndex, incrementBy, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fromIndex':fromIndex, u'incrementBy':incrementBy}, var) + var.registers([u'i', u'paths', u'incrementBy', u'fromIndex', u'path']) + if var.get(u"this").get(u'parent').neg(): + return var.get('undefined') + var.put(u'paths', var.get(u'_cache').get(u'path').callprop(u'get', var.get(u"this").get(u'parent'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'fromIndex')): + var.get(u'path').put(u'key', var.get(u'incrementBy'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + PyJsHoisted_updateSiblingKeys_.func_name = u'updateSiblingKeys' + var.put(u'updateSiblingKeys', PyJsHoisted_updateSiblingKeys_) + @Js + def PyJsHoisted__verifyNodeList_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'nodes', u'type', u'msg']) + if var.get(u'nodes').neg(): + return Js([]) + if PyJsStrictNeq(var.get(u'nodes').get(u'constructor'),var.get(u'Array')): + var.put(u'nodes', Js([var.get(u'nodes')])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else var.get(u"this").get(u'scope'))) + var.put(u'hoister', var.get(u'_hoister2').get(u'default').create(var.get(u"this"), var.get(u'scope'))) + return var.get(u'hoister').callprop(u'run') + PyJsHoisted_hoist_.func_name = u'hoist' + var.put(u'hoist', PyJsHoisted_hoist_) + @Js + def PyJsHoisted__containerInsertAfter_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + return var.get(u"this").callprop(u'_containerInsert', (var.get(u"this").get(u'key')+Js(1.0)), var.get(u'nodes')) + PyJsHoisted__containerInsertAfter_.func_name = u'_containerInsertAfter' + var.put(u'_containerInsertAfter', PyJsHoisted__containerInsertAfter_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2074_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2074_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__maybePopFromStatements_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes', u'last', u'isIdentifier']) + var.put(u'last', var.get(u'nodes').get((var.get(u'nodes').get(u'length')-Js(1.0)))) + var.put(u'isIdentifier', (var.get(u't').callprop(u'isIdentifier', var.get(u'last')) or (var.get(u't').callprop(u'isExpressionStatement', var.get(u'last')) and var.get(u't').callprop(u'isIdentifier', var.get(u'last').get(u'expression'))))) + if (var.get(u'isIdentifier') and var.get(u"this").callprop(u'isCompletionRecord').neg()): + var.get(u'nodes').callprop(u'pop') + PyJsHoisted__maybePopFromStatements_.func_name = u'_maybePopFromStatements' + var.put(u'_maybePopFromStatements', PyJsHoisted__maybePopFromStatements_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_typeof2', var.get(u'require')(Js(u'babel-runtime/helpers/typeof'))) + var.put(u'_typeof3', var.get(u'_interopRequireDefault')(var.get(u'_typeof2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'insertBefore', var.get(u'insertBefore')) + var.get(u'exports').put(u'_containerInsert', var.get(u'_containerInsert')) + var.get(u'exports').put(u'_containerInsertBefore', var.get(u'_containerInsertBefore')) + var.get(u'exports').put(u'_containerInsertAfter', var.get(u'_containerInsertAfter')) + var.get(u'exports').put(u'_maybePopFromStatements', var.get(u'_maybePopFromStatements')) + var.get(u'exports').put(u'insertAfter', var.get(u'insertAfter')) + var.get(u'exports').put(u'updateSiblingKeys', var.get(u'updateSiblingKeys')) + var.get(u'exports').put(u'_verifyNodeList', var.get(u'_verifyNodeList')) + var.get(u'exports').put(u'unshiftContainer', var.get(u'unshiftContainer')) + var.get(u'exports').put(u'pushContainer', var.get(u'pushContainer')) + var.get(u'exports').put(u'hoist', var.get(u'hoist')) + var.put(u'_cache', var.get(u'require')(Js(u'../cache'))) + var.put(u'_hoister', var.get(u'require')(Js(u'./lib/hoister'))) + var.put(u'_hoister2', var.get(u'_interopRequireDefault')(var.get(u'_hoister'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2072_._set_name(u'anonymous') +PyJs_Object_2079_ = Js({u'../cache':Js(222.0),u'./index':Js(232.0),u'./lib/hoister':Js(237.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/helpers/typeof':Js(114.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2080_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_assertUnremoved', u'exports', u'require', u'remove', u'_remove', u'_markRemoved', u'module', u'_removalHooks', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'_callRemovalHooks']) + @Js + def PyJsHoisted__assertUnremoved_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'removed'): + PyJsTempException = JsToPyException(var.get(u"this").callprop(u'buildCodeFrameError', Js(u'NodePath has been removed so is read-only.'))) + raise PyJsTempException + PyJsHoisted__assertUnremoved_.func_name = u'_assertUnremoved' + var.put(u'_assertUnremoved', PyJsHoisted__assertUnremoved_) + @Js + def PyJsHoisted_remove_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'_assertUnremoved') + var.get(u"this").callprop(u'resync') + if var.get(u"this").callprop(u'_callRemovalHooks'): + var.get(u"this").callprop(u'_markRemoved') + return var.get('undefined') + var.get(u"this").callprop(u'shareCommentsWithSiblings') + var.get(u"this").callprop(u'_remove') + var.get(u"this").callprop(u'_markRemoved') + PyJsHoisted_remove_.func_name = u'remove' + var.put(u'remove', PyJsHoisted_remove_) + @Js + def PyJsHoisted__remove_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + var.get(u"this").get(u'container').callprop(u'splice', var.get(u"this").get(u'key'), Js(1.0)) + var.get(u"this").callprop(u'updateSiblingKeys', var.get(u"this").get(u'key'), (-Js(1.0))) + else: + var.get(u"this").callprop(u'_replaceWith', var.get(u"null")) + PyJsHoisted__remove_.func_name = u'_remove' + var.put(u'_remove', PyJsHoisted__remove_) + @Js + def PyJsHoisted__markRemoved_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'shouldSkip', var.get(u'true')) + var.get(u"this").put(u'removed', var.get(u'true')) + var.get(u"this").put(u'node', var.get(u"null")) + PyJsHoisted__markRemoved_.func_name = u'_markRemoved' + var.put(u'_markRemoved', PyJsHoisted__markRemoved_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2081_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2081_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__callRemovalHooks_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'fn', u'_isArray', u'_iterator', u'_ref', u'_i']) + #for JS loop + var.put(u'_iterator', var.get(u'_removalHooks').get(u'hooks')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'fn', var.get(u'_ref')) + if var.get(u'fn')(var.get(u"this"), var.get(u"this").get(u'parentPath')): + return var.get(u'true') + + PyJsHoisted__callRemovalHooks_.func_name = u'_callRemovalHooks' + var.put(u'_callRemovalHooks', PyJsHoisted__callRemovalHooks_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'remove', var.get(u'remove')) + var.get(u'exports').put(u'_callRemovalHooks', var.get(u'_callRemovalHooks')) + var.get(u'exports').put(u'_remove', var.get(u'_remove')) + var.get(u'exports').put(u'_markRemoved', var.get(u'_markRemoved')) + var.get(u'exports').put(u'_assertUnremoved', var.get(u'_assertUnremoved')) + var.put(u'_removalHooks', var.get(u'require')(Js(u'./lib/removal-hooks'))) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2080_._set_name(u'anonymous') +PyJs_Object_2082_ = Js({u'./lib/removal-hooks':Js(238.0),u'babel-runtime/core-js/get-iterator':Js(96.0)}) +@Js +def PyJs_anonymous_2083_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'replaceExpressionWithStatements', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'replaceInline', u'replaceWithSourceString', u'_babelCodeFrame2', u'_replaceWith', u'_babylon', u'hoistVariablesVisitor', u'exports', u'_babelTypes', u'_interopRequireWildcard', u'replaceWith', u'_babelCodeFrame', u'_index4', u'_index2', u'_index3', u'_index', u'require', u't', u'replaceWithMultiple']) + @Js + def PyJsHoisted_replaceExpressionWithStatements_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'container', u'_isArray2', u'toSequenceExpression', u'completionRecords', u'_i2', u'_ref2', u'exprs', u'uid', u'path', u'nodes', u'callee', u'loop', u'_iterator2']) + var.get(u"this").callprop(u'resync') + var.put(u'toSequenceExpression', var.get(u't').callprop(u'toSequenceExpression', var.get(u'nodes'), var.get(u"this").get(u'scope'))) + if var.get(u't').callprop(u'isSequenceExpression', var.get(u'toSequenceExpression')): + var.put(u'exprs', var.get(u'toSequenceExpression').get(u'expressions')) + if ((var.get(u'exprs').get(u'length')>=Js(2.0)) and var.get(u"this").get(u'parentPath').callprop(u'isExpressionStatement')): + var.get(u"this").callprop(u'_maybePopFromStatements', var.get(u'exprs')) + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(1.0)): + var.get(u"this").callprop(u'replaceWith', var.get(u'exprs').get(u'0')) + else: + var.get(u"this").callprop(u'replaceWith', var.get(u'toSequenceExpression')) + else: + if var.get(u'toSequenceExpression'): + var.get(u"this").callprop(u'replaceWith', var.get(u'toSequenceExpression')) + else: + var.put(u'container', var.get(u't').callprop(u'functionExpression', var.get(u"null"), Js([]), var.get(u't').callprop(u'blockStatement', var.get(u'nodes')))) + var.get(u'container').put(u'shadow', var.get(u'true')) + var.get(u"this").callprop(u'replaceWith', var.get(u't').callprop(u'callExpression', var.get(u'container'), Js([]))) + var.get(u"this").callprop(u'traverse', var.get(u'hoistVariablesVisitor')) + var.put(u'completionRecords', var.get(u"this").callprop(u'get', Js(u'callee')).callprop(u'getCompletionRecords')) + #for JS loop + var.put(u'_iterator2', var.get(u'completionRecords')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'path', var.get(u'_ref2')) + if var.get(u'path').callprop(u'isExpressionStatement').neg(): + continue + @Js + def PyJs_anonymous_2091_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return var.get(u'path').callprop(u'isLoop') + PyJs_anonymous_2091_._set_name(u'anonymous') + var.put(u'loop', var.get(u'path').callprop(u'findParent', PyJs_anonymous_2091_)) + if var.get(u'loop'): + var.put(u'callee', var.get(u"this").callprop(u'get', Js(u'callee'))) + var.put(u'uid', var.get(u'callee').get(u'scope').callprop(u'generateDeclaredUidIdentifier', Js(u'ret'))) + var.get(u'callee').callprop(u'get', Js(u'body')).callprop(u'pushContainer', Js(u'body'), var.get(u't').callprop(u'returnStatement', var.get(u'uid'))) + var.get(u'path').callprop(u'get', Js(u'expression')).callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'uid'), var.get(u'path').get(u'node').get(u'expression'))) + else: + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'returnStatement', var.get(u'path').get(u'node').get(u'expression'))) + + return var.get(u"this").get(u'node') + PyJsHoisted_replaceExpressionWithStatements_.func_name = u'replaceExpressionWithStatements' + var.put(u'replaceExpressionWithStatements', PyJsHoisted_replaceExpressionWithStatements_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2084_ = Js({}) + var.put(u'newObj', PyJs_Object_2084_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_replaceWith_(replacement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replacement':replacement}, var) + var.registers([u'oldNode', u'replacement']) + var.get(u"this").callprop(u'resync') + if var.get(u"this").get(u'removed'): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"You can't replace this node, we've already removed it"))) + raise PyJsTempException + if var.get(u'replacement').instanceof(var.get(u'_index4').get(u'default')): + var.put(u'replacement', var.get(u'replacement').get(u'node')) + if var.get(u'replacement').neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'You passed `path.replaceWith()` a falsy node, use `path.remove()` instead'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u"this").get(u'node'),var.get(u'replacement')): + return var.get('undefined') + if (var.get(u"this").callprop(u'isProgram') and var.get(u't').callprop(u'isProgram', var.get(u'replacement')).neg()): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'You can only replace a Program root node with another Program node'))) + raise PyJsTempException + if var.get(u'Array').callprop(u'isArray', var.get(u'replacement')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`"))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'replacement',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`"))) + raise PyJsTempException + if (var.get(u"this").callprop(u'isNodeType', Js(u'Statement')) and var.get(u't').callprop(u'isExpression', var.get(u'replacement'))): + if (var.get(u"this").callprop(u'canHaveVariableDeclarationOrExpression').neg() and var.get(u"this").callprop(u'canSwapBetweenExpressionAndStatement', var.get(u'replacement')).neg()): + var.put(u'replacement', var.get(u't').callprop(u'expressionStatement', var.get(u'replacement'))) + if (var.get(u"this").callprop(u'isNodeType', Js(u'Expression')) and var.get(u't').callprop(u'isStatement', var.get(u'replacement'))): + if (var.get(u"this").callprop(u'canHaveVariableDeclarationOrExpression').neg() and var.get(u"this").callprop(u'canSwapBetweenExpressionAndStatement', var.get(u'replacement')).neg()): + return var.get(u"this").callprop(u'replaceExpressionWithStatements', Js([var.get(u'replacement')])) + var.put(u'oldNode', var.get(u"this").get(u'node')) + if var.get(u'oldNode'): + var.get(u't').callprop(u'inheritsComments', var.get(u'replacement'), var.get(u'oldNode')) + var.get(u't').callprop(u'removeComments', var.get(u'oldNode')) + var.get(u"this").callprop(u'_replaceWith', var.get(u'replacement')) + var.get(u"this").put(u'type', var.get(u'replacement').get(u'type')) + var.get(u"this").callprop(u'setScope') + var.get(u"this").callprop(u'requeue') + PyJsHoisted_replaceWith_.func_name = u'replaceWith' + var.put(u'replaceWith', PyJsHoisted_replaceWith_) + @Js + def PyJsHoisted__replaceWith_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'container').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u'Container is falsy'))) + raise PyJsTempException + if var.get(u"this").get(u'inList'): + var.get(u't').callprop(u'validate', var.get(u"this").get(u'parent'), var.get(u"this").get(u'key'), Js([var.get(u'node')])) + else: + var.get(u't').callprop(u'validate', var.get(u"this").get(u'parent'), var.get(u"this").get(u'key'), var.get(u'node')) + @Js + def PyJs_anonymous_2090_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (Js(u'Replace with ')+(var.get(u'node') and var.get(u'node').get(u'type'))) + PyJs_anonymous_2090_._set_name(u'anonymous') + var.get(u"this").callprop(u'debug', PyJs_anonymous_2090_) + var.get(u"this").put(u'node', var.get(u"this").get(u'container').put(var.get(u"this").get(u'key'), var.get(u'node'))) + PyJsHoisted__replaceWith_.func_name = u'_replaceWith' + var.put(u'_replaceWith', PyJsHoisted__replaceWith_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2085_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2085_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_replaceInline_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + var.get(u"this").callprop(u'resync') + if var.get(u'Array').callprop(u'isArray', var.get(u'nodes')): + if var.get(u'Array').callprop(u'isArray', var.get(u"this").get(u'container')): + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + var.get(u"this").callprop(u'_containerInsertAfter', var.get(u'nodes')) + return var.get(u"this").callprop(u'remove') + else: + return var.get(u"this").callprop(u'replaceWithMultiple', var.get(u'nodes')) + else: + return var.get(u"this").callprop(u'replaceWith', var.get(u'nodes')) + PyJsHoisted_replaceInline_.func_name = u'replaceInline' + var.put(u'replaceInline', PyJsHoisted_replaceInline_) + @Js + def PyJsHoisted_replaceWithMultiple_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'nodes']) + var.get(u"this").callprop(u'resync') + var.put(u'nodes', var.get(u"this").callprop(u'_verifyNodeList', var.get(u'nodes'))) + var.get(u't').callprop(u'inheritLeadingComments', var.get(u'nodes').get(u'0'), var.get(u"this").get(u'node')) + var.get(u't').callprop(u'inheritTrailingComments', var.get(u'nodes').get((var.get(u'nodes').get(u'length')-Js(1.0))), var.get(u"this").get(u'node')) + var.get(u"this").put(u'node', var.get(u"this").get(u'container').put(var.get(u"this").get(u'key'), var.get(u"null"))) + var.get(u"this").callprop(u'insertAfter', var.get(u'nodes')) + if var.get(u"this").get(u'node'): + var.get(u"this").callprop(u'requeue') + else: + var.get(u"this").callprop(u'remove') + PyJsHoisted_replaceWithMultiple_.func_name = u'replaceWithMultiple' + var.put(u'replaceWithMultiple', PyJsHoisted_replaceWithMultiple_) + @Js + def PyJsHoisted_replaceWithSourceString_(replacement, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'replacement':replacement}, var) + var.registers([u'loc', u'replacement']) + var.get(u"this").callprop(u'resync') + try: + var.put(u'replacement', ((Js(u'(')+var.get(u'replacement'))+Js(u')'))) + var.put(u'replacement', PyJsComma(Js(0.0),var.get(u'_babylon').get(u'parse'))(var.get(u'replacement'))) + except PyJsException as PyJsTempException: + PyJsHolder_657272_62521723 = var.own.get(u'err') + var.force_own_put(u'err', PyExceptionToJs(PyJsTempException)) + try: + var.put(u'loc', var.get(u'err').get(u'loc')) + if var.get(u'loc'): + var.get(u'err').put(u'message', Js(u' - make sure this is an expression.'), u'+') + var.get(u'err').put(u'message', (Js(u'\n')+PyJsComma(Js(0.0),var.get(u'_babelCodeFrame2').get(u'default'))(var.get(u'replacement'), var.get(u'loc').get(u'line'), (var.get(u'loc').get(u'column')+Js(1.0)))), u'+') + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + finally: + if PyJsHolder_657272_62521723 is not None: + var.own[u'err'] = PyJsHolder_657272_62521723 + else: + del var.own[u'err'] + del PyJsHolder_657272_62521723 + var.put(u'replacement', var.get(u'replacement').get(u'program').get(u'body').get(u'0').get(u'expression')) + var.get(u'_index2').get(u'default').callprop(u'removeProperties', var.get(u'replacement')) + return var.get(u"this").callprop(u'replaceWith', var.get(u'replacement')) + PyJsHoisted_replaceWithSourceString_.func_name = u'replaceWithSourceString' + var.put(u'replaceWithSourceString', PyJsHoisted_replaceWithSourceString_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'replaceWithMultiple', var.get(u'replaceWithMultiple')) + var.get(u'exports').put(u'replaceWithSourceString', var.get(u'replaceWithSourceString')) + var.get(u'exports').put(u'replaceWith', var.get(u'replaceWith')) + var.get(u'exports').put(u'_replaceWith', var.get(u'_replaceWith')) + var.get(u'exports').put(u'replaceExpressionWithStatements', var.get(u'replaceExpressionWithStatements')) + var.get(u'exports').put(u'replaceInline', var.get(u'replaceInline')) + var.put(u'_babelCodeFrame', var.get(u'require')(Js(u'babel-code-frame'))) + var.put(u'_babelCodeFrame2', var.get(u'_interopRequireDefault')(var.get(u'_babelCodeFrame'))) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_index3', var.get(u'require')(Js(u'./index'))) + var.put(u'_index4', var.get(u'_interopRequireDefault')(var.get(u'_index3'))) + var.put(u'_babylon', var.get(u'require')(Js(u'babylon'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_Function_2087_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'Function':PyJs_Function_2087_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').callprop(u'skip') + PyJs_Function_2087_._set_name(u'Function') + @Js + def PyJs_VariableDeclaration_2088_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'VariableDeclaration':PyJs_VariableDeclaration_2088_}, var) + var.registers([u'_isArray', u'_iterator', u'key', u'exprs', u'declar', u'_i', u'path', u'bindings', u'_ref']) + if PyJsStrictNeq(var.get(u'path').get(u'node').get(u'kind'),Js(u'var')): + return var.get('undefined') + var.put(u'bindings', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'bindings'): + var.put(u'key', PyJsTemp) + PyJs_Object_2089_ = Js({u'id':var.get(u'bindings').get(var.get(u'key'))}) + var.get(u'path').get(u'scope').callprop(u'push', PyJs_Object_2089_) + var.put(u'exprs', Js([])) + #for JS loop + var.put(u'_iterator', var.get(u'path').get(u'node').get(u'declarations')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'declar', var.get(u'_ref')) + if var.get(u'declar').get(u'init'): + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'expressionStatement', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'id'), var.get(u'declar').get(u'init')))) + + var.get(u'path').callprop(u'replaceWithMultiple', var.get(u'exprs')) + PyJs_VariableDeclaration_2088_._set_name(u'VariableDeclaration') + PyJs_Object_2086_ = Js({u'Function':PyJs_Function_2087_,u'VariableDeclaration':PyJs_VariableDeclaration_2088_}) + var.put(u'hoistVariablesVisitor', PyJs_Object_2086_) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2083_._set_name(u'anonymous') +PyJs_Object_2092_ = Js({u'../index':Js(225.0),u'./index':Js(232.0),u'babel-code-frame':Js(4.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-types':Js(258.0),u'babylon':Js(262.0)}) +@Js +def PyJs_anonymous_2093_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'Binding', u'module', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2094_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2094_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + pass + @Js + def PyJs_anonymous_2095_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Binding']) + @Js + def PyJsHoisted_Binding_(_ref, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'arguments':arguments}, var) + var.registers([u'kind', u'existing', u'path', u'scope', u'_ref', u'identifier']) + var.put(u'existing', var.get(u'_ref').get(u'existing')) + var.put(u'identifier', var.get(u'_ref').get(u'identifier')) + var.put(u'scope', var.get(u'_ref').get(u'scope')) + var.put(u'path', var.get(u'_ref').get(u'path')) + var.put(u'kind', var.get(u'_ref').get(u'kind')) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Binding')) + var.get(u"this").put(u'identifier', var.get(u'identifier')) + var.get(u"this").put(u'scope', var.get(u'scope')) + var.get(u"this").put(u'path', var.get(u'path')) + var.get(u"this").put(u'kind', var.get(u'kind')) + var.get(u"this").put(u'constantViolations', Js([])) + var.get(u"this").put(u'constant', var.get(u'true')) + var.get(u"this").put(u'referencePaths', Js([])) + var.get(u"this").put(u'referenced', Js(False)) + var.get(u"this").put(u'references', Js(0.0)) + var.get(u"this").callprop(u'clearValue') + if var.get(u'existing'): + var.get(u"this").put(u'constantViolations', Js([]).callprop(u'concat', var.get(u'existing').get(u'path'), var.get(u'existing').get(u'constantViolations'), var.get(u"this").get(u'constantViolations'))) + PyJsHoisted_Binding_.func_name = u'Binding' + var.put(u'Binding', PyJsHoisted_Binding_) + pass + @Js + def PyJs_deoptValue_2096_(this, arguments, var=var): + var = Scope({u'this':this, u'deoptValue':PyJs_deoptValue_2096_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").callprop(u'clearValue') + var.get(u"this").put(u'hasDeoptedValue', var.get(u'true')) + PyJs_deoptValue_2096_._set_name(u'deoptValue') + var.get(u'Binding').get(u'prototype').put(u'deoptValue', PyJs_deoptValue_2096_) + @Js + def PyJs_setValue_2097_(value, this, arguments, var=var): + var = Scope({u'this':this, u'setValue':PyJs_setValue_2097_, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if var.get(u"this").get(u'hasDeoptedValue'): + return var.get('undefined') + var.get(u"this").put(u'hasValue', var.get(u'true')) + var.get(u"this").put(u'value', var.get(u'value')) + PyJs_setValue_2097_._set_name(u'setValue') + var.get(u'Binding').get(u'prototype').put(u'setValue', PyJs_setValue_2097_) + @Js + def PyJs_clearValue_2098_(this, arguments, var=var): + var = Scope({u'this':this, u'clearValue':PyJs_clearValue_2098_, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'hasDeoptedValue', Js(False)) + var.get(u"this").put(u'hasValue', Js(False)) + var.get(u"this").put(u'value', var.get(u"null")) + PyJs_clearValue_2098_._set_name(u'clearValue') + var.get(u'Binding').get(u'prototype').put(u'clearValue', PyJs_clearValue_2098_) + @Js + def PyJs_reassign_2099_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'reassign':PyJs_reassign_2099_}, var) + var.registers([u'path']) + var.get(u"this").put(u'constant', Js(False)) + if PyJsStrictNeq(var.get(u"this").get(u'constantViolations').callprop(u'indexOf', var.get(u'path')),(-Js(1.0))): + return var.get('undefined') + var.get(u"this").get(u'constantViolations').callprop(u'push', var.get(u'path')) + PyJs_reassign_2099_._set_name(u'reassign') + var.get(u'Binding').get(u'prototype').put(u'reassign', PyJs_reassign_2099_) + @Js + def PyJs_reference_2100_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'reference':PyJs_reference_2100_}, var) + var.registers([u'path']) + if PyJsStrictNeq(var.get(u"this").get(u'referencePaths').callprop(u'indexOf', var.get(u'path')),(-Js(1.0))): + return var.get('undefined') + var.get(u"this").put(u'referenced', var.get(u'true')) + (var.get(u"this").put(u'references',Js(var.get(u"this").get(u'references').to_number())+Js(1))-Js(1)) + var.get(u"this").get(u'referencePaths').callprop(u'push', var.get(u'path')) + PyJs_reference_2100_._set_name(u'reference') + var.get(u'Binding').get(u'prototype').put(u'reference', PyJs_reference_2100_) + @Js + def PyJs_dereference_2101_(this, arguments, var=var): + var = Scope({u'this':this, u'dereference':PyJs_dereference_2101_, u'arguments':arguments}, var) + var.registers([]) + (var.get(u"this").put(u'references',Js(var.get(u"this").get(u'references').to_number())-Js(1))+Js(1)) + var.get(u"this").put(u'referenced', var.get(u"this").get(u'references').neg().neg()) + PyJs_dereference_2101_._set_name(u'dereference') + var.get(u'Binding').get(u'prototype').put(u'dereference', PyJs_dereference_2101_) + return var.get(u'Binding') + PyJs_anonymous_2095_._set_name(u'anonymous') + var.put(u'Binding', PyJs_anonymous_2095_()) + var.get(u'exports').put(u'default', var.get(u'Binding')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2093_._set_name(u'anonymous') +PyJs_Object_2102_ = Js({u'babel-runtime/helpers/classCallCheck':Js(110.0)}) +@Js +def PyJs_anonymous_2103_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_binding3', u'_binding2', u'uid', u'_defaults', u'module', u'Scope', u'_interopRequireDefault', u'_cache', u'_getIterator2', u'_getIterator3', u'_renamer2', u'_create2', u'_keys', u'_globals2', u't', u'_classCallCheck3', u'_classCallCheck2', u'_babelMessages', u'_create', u'_renamer', u'exports', u'_interopRequireWildcard', u'_babelTypes', u'_includes2', u'_globals', u'_keys2', u'collectorVisitor', u'_index2', u'_defaults2', u'_repeat2', u'getCache', u'_map2', u'_map', u'_crawlCallsCount', u'require', u'_index', u'messages', u'_repeat', u'_includes']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2105_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2105_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_getCache_(path, parentScope, self, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'self':self, u'arguments':arguments, u'parentScope':parentScope}, var) + var.registers([u'scopes', u'_isArray', u'_iterator', u'self', u'parentScope', u'_i', u'path', u'scope', u'_ref']) + var.put(u'scopes', (var.get(u'_cache').get(u'scope').callprop(u'get', var.get(u'path').get(u'node')) or Js([]))) + #for JS loop + var.put(u'_iterator', var.get(u'scopes')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'scope', var.get(u'_ref')) + if (PyJsStrictEq(var.get(u'scope').get(u'parent'),var.get(u'parentScope')) and PyJsStrictEq(var.get(u'scope').get(u'path'),var.get(u'path'))): + return var.get(u'scope') + + var.get(u'scopes').callprop(u'push', var.get(u'self')) + if var.get(u'_cache').get(u'scope').callprop(u'has', var.get(u'path').get(u'node')).neg(): + var.get(u'_cache').get(u'scope').callprop(u'set', var.get(u'path').get(u'node'), var.get(u'scopes')) + PyJsHoisted_getCache_.func_name = u'getCache' + var.put(u'getCache', PyJsHoisted_getCache_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2104_ = Js({}) + var.put(u'newObj', PyJs_Object_2104_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_create', var.get(u'require')(Js(u'babel-runtime/core-js/object/create'))) + var.put(u'_create2', var.get(u'_interopRequireDefault')(var.get(u'_create'))) + var.put(u'_map', var.get(u'require')(Js(u'babel-runtime/core-js/map'))) + var.put(u'_map2', var.get(u'_interopRequireDefault')(var.get(u'_map'))) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_includes', var.get(u'require')(Js(u'lodash/includes'))) + var.put(u'_includes2', var.get(u'_interopRequireDefault')(var.get(u'_includes'))) + var.put(u'_repeat', var.get(u'require')(Js(u'lodash/repeat'))) + var.put(u'_repeat2', var.get(u'_interopRequireDefault')(var.get(u'_repeat'))) + var.put(u'_renamer', var.get(u'require')(Js(u'./lib/renamer'))) + var.put(u'_renamer2', var.get(u'_interopRequireDefault')(var.get(u'_renamer'))) + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + var.put(u'_defaults', var.get(u'require')(Js(u'lodash/defaults'))) + var.put(u'_defaults2', var.get(u'_interopRequireDefault')(var.get(u'_defaults'))) + var.put(u'_babelMessages', var.get(u'require')(Js(u'babel-messages'))) + var.put(u'messages', var.get(u'_interopRequireWildcard')(var.get(u'_babelMessages'))) + var.put(u'_binding2', var.get(u'require')(Js(u'./binding'))) + var.put(u'_binding3', var.get(u'_interopRequireDefault')(var.get(u'_binding2'))) + var.put(u'_globals', var.get(u'require')(Js(u'globals'))) + var.put(u'_globals2', var.get(u'_interopRequireDefault')(var.get(u'_globals'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + var.put(u'_cache', var.get(u'require')(Js(u'../cache'))) + pass + pass + var.put(u'_crawlCallsCount', Js(0.0)) + pass + @Js + def PyJs_For_2107_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'For':PyJs_For_2107_}, var) + var.registers([u'_isArray2', u'_i2', u'_ref2', u'declar', u'key', u'path', u'_iterator2']) + #for JS loop + var.put(u'_iterator2', var.get(u't').get(u'FOR_INIT_KEYS')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'key', var.get(u'_ref2')) + var.put(u'declar', var.get(u'path').callprop(u'get', var.get(u'key'))) + if var.get(u'declar').callprop(u'isVar'): + var.get(u'path').get(u'scope').callprop(u'getFunctionParent').callprop(u'registerBinding', Js(u'var'), var.get(u'declar')) + + PyJs_For_2107_._set_name(u'For') + @Js + def PyJs_Declaration_2108_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Declaration':PyJs_Declaration_2108_}, var) + var.registers([u'path']) + if var.get(u'path').callprop(u'isBlockScoped'): + return var.get('undefined') + if (var.get(u'path').callprop(u'isExportDeclaration') and var.get(u'path').callprop(u'get', Js(u'declaration')).callprop(u'isDeclaration')): + return var.get('undefined') + var.get(u'path').get(u'scope').callprop(u'getFunctionParent').callprop(u'registerDeclaration', var.get(u'path')) + PyJs_Declaration_2108_._set_name(u'Declaration') + @Js + def PyJs_ReferencedIdentifier_2109_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2109_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + var.get(u'state').get(u'references').callprop(u'push', var.get(u'path')) + PyJs_ReferencedIdentifier_2109_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_ForXStatement_2110_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'ForXStatement':PyJs_ForXStatement_2110_}, var) + var.registers([u'path', u'state', u'left']) + var.put(u'left', var.get(u'path').callprop(u'get', Js(u'left'))) + if (var.get(u'left').callprop(u'isPattern') or var.get(u'left').callprop(u'isIdentifier')): + var.get(u'state').get(u'constantViolations').callprop(u'push', var.get(u'left')) + PyJs_ForXStatement_2110_._set_name(u'ForXStatement') + @Js + def PyJs_exit_2112_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'exit':PyJs_exit_2112_, u'arguments':arguments}, var) + var.registers([u'node', u'decl', u'_isArray3', u'name', u'_i3', u'binding', u'ids', u'declar', u'_binding', u'path', u'scope', u'_id', u'_ref3', u'_iterator3']) + var.put(u'node', var.get(u'path').get(u'node')) + var.put(u'scope', var.get(u'path').get(u'scope')) + var.put(u'declar', var.get(u'node').get(u'declaration')) + if (var.get(u't').callprop(u'isClassDeclaration', var.get(u'declar')) or var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'declar'))): + var.put(u'_id', var.get(u'declar').get(u'id')) + if var.get(u'_id').neg(): + return var.get('undefined') + var.put(u'binding', var.get(u'scope').callprop(u'getBinding', var.get(u'_id').get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').callprop(u'reference', var.get(u'path')) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'declar')): + #for JS loop + var.put(u'_iterator3', var.get(u'declar').get(u'declarations')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'decl', var.get(u'_ref3')) + var.put(u'ids', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'decl'))) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + var.put(u'_binding', var.get(u'scope').callprop(u'getBinding', var.get(u'name'))) + if var.get(u'_binding'): + var.get(u'_binding').callprop(u'reference', var.get(u'path')) + + PyJs_exit_2112_._set_name(u'exit') + PyJs_Object_2111_ = Js({u'exit':PyJs_exit_2112_}) + @Js + def PyJs_LabeledStatement_2113_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'LabeledStatement':PyJs_LabeledStatement_2113_, u'arguments':arguments}, var) + var.registers([u'path']) + var.get(u'path').get(u'scope').callprop(u'getProgramParent').callprop(u'addGlobal', var.get(u'path').get(u'node')) + var.get(u'path').get(u'scope').callprop(u'getBlockParent').callprop(u'registerDeclaration', var.get(u'path')) + PyJs_LabeledStatement_2113_._set_name(u'LabeledStatement') + @Js + def PyJs_AssignmentExpression_2114_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'AssignmentExpression':PyJs_AssignmentExpression_2114_}, var) + var.registers([u'path', u'state']) + var.get(u'state').get(u'assignments').callprop(u'push', var.get(u'path')) + PyJs_AssignmentExpression_2114_._set_name(u'AssignmentExpression') + @Js + def PyJs_UpdateExpression_2115_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'UpdateExpression':PyJs_UpdateExpression_2115_}, var) + var.registers([u'path', u'state']) + var.get(u'state').get(u'constantViolations').callprop(u'push', var.get(u'path').callprop(u'get', Js(u'argument'))) + PyJs_UpdateExpression_2115_._set_name(u'UpdateExpression') + @Js + def PyJs_UnaryExpression_2116_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'UnaryExpression':PyJs_UnaryExpression_2116_, u'arguments':arguments}, var) + var.registers([u'path', u'state']) + if PyJsStrictEq(var.get(u'path').get(u'node').get(u'operator'),Js(u'delete')): + var.get(u'state').get(u'constantViolations').callprop(u'push', var.get(u'path').callprop(u'get', Js(u'argument'))) + PyJs_UnaryExpression_2116_._set_name(u'UnaryExpression') + @Js + def PyJs_BlockScoped_2117_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'BlockScoped':PyJs_BlockScoped_2117_}, var) + var.registers([u'scope', u'path']) + var.put(u'scope', var.get(u'path').get(u'scope')) + if PyJsStrictEq(var.get(u'scope').get(u'path'),var.get(u'path')): + var.put(u'scope', var.get(u'scope').get(u'parent')) + var.get(u'scope').callprop(u'getBlockParent').callprop(u'registerDeclaration', var.get(u'path')) + PyJs_BlockScoped_2117_._set_name(u'BlockScoped') + @Js + def PyJs_ClassDeclaration_2118_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'ClassDeclaration':PyJs_ClassDeclaration_2118_, u'arguments':arguments}, var) + var.registers([u'path', u'id', u'name']) + var.put(u'id', var.get(u'path').get(u'node').get(u'id')) + if var.get(u'id').neg(): + return var.get('undefined') + var.put(u'name', var.get(u'id').get(u'name')) + var.get(u'path').get(u'scope').get(u'bindings').put(var.get(u'name'), var.get(u'path').get(u'scope').callprop(u'getBinding', var.get(u'name'))) + PyJs_ClassDeclaration_2118_._set_name(u'ClassDeclaration') + @Js + def PyJs_Block_2119_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'Block':PyJs_Block_2119_}, var) + var.registers([u'paths', u'_isArray4', u'bodyPath', u'_ref4', u'_i4', u'path', u'_iterator4']) + var.put(u'paths', var.get(u'path').callprop(u'get', Js(u'body'))) + #for JS loop + var.put(u'_iterator4', var.get(u'paths')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'bodyPath', var.get(u'_ref4')) + if var.get(u'bodyPath').callprop(u'isFunctionDeclaration'): + var.get(u'path').get(u'scope').callprop(u'getBlockParent').callprop(u'registerDeclaration', var.get(u'bodyPath')) + + PyJs_Block_2119_._set_name(u'Block') + PyJs_Object_2106_ = Js({u'For':PyJs_For_2107_,u'Declaration':PyJs_Declaration_2108_,u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2109_,u'ForXStatement':PyJs_ForXStatement_2110_,u'ExportDeclaration':PyJs_Object_2111_,u'LabeledStatement':PyJs_LabeledStatement_2113_,u'AssignmentExpression':PyJs_AssignmentExpression_2114_,u'UpdateExpression':PyJs_UpdateExpression_2115_,u'UnaryExpression':PyJs_UnaryExpression_2116_,u'BlockScoped':PyJs_BlockScoped_2117_,u'ClassDeclaration':PyJs_ClassDeclaration_2118_,u'Block':PyJs_Block_2119_}) + var.put(u'collectorVisitor', PyJs_Object_2106_) + var.put(u'uid', Js(0.0)) + @Js + def PyJs_anonymous_2120_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Scope']) + @Js + def PyJsHoisted_Scope_(path, parentScope, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'parentScope':parentScope}, var) + var.registers([u'cached', u'path', u'parentScope']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Scope')) + if (var.get(u'parentScope') and PyJsStrictEq(var.get(u'parentScope').get(u'block'),var.get(u'path').get(u'node'))): + return var.get(u'parentScope') + var.put(u'cached', var.get(u'getCache')(var.get(u'path'), var.get(u'parentScope'), var.get(u"this"))) + if var.get(u'cached'): + return var.get(u'cached') + var.get(u"this").put(u'uid', (var.put(u'uid',Js(var.get(u'uid').to_number())+Js(1))-Js(1))) + var.get(u"this").put(u'parent', var.get(u'parentScope')) + var.get(u"this").put(u'hub', var.get(u'path').get(u'hub')) + var.get(u"this").put(u'parentBlock', var.get(u'path').get(u'parent')) + var.get(u"this").put(u'block', var.get(u'path').get(u'node')) + var.get(u"this").put(u'path', var.get(u'path')) + var.get(u"this").put(u'labels', var.get(u'_map2').get(u'default').create()) + PyJsHoisted_Scope_.func_name = u'Scope' + var.put(u'Scope', PyJsHoisted_Scope_) + pass + @Js + def PyJs_traverse_2121_(node, opts, state, this, arguments, var=var): + var = Scope({u'node':node, u'traverse':PyJs_traverse_2121_, u'this':this, u'state':state, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'state', u'opts']) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(var.get(u'node'), var.get(u'opts'), var.get(u"this"), var.get(u'state'), var.get(u"this").get(u'path')) + PyJs_traverse_2121_._set_name(u'traverse') + var.get(u'Scope').get(u'prototype').put(u'traverse', PyJs_traverse_2121_) + @Js + def PyJs_generateDeclaredUidIdentifier_2122_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generateDeclaredUidIdentifier':PyJs_generateDeclaredUidIdentifier_2122_}, var) + var.registers([u'name', u'id']) + var.put(u'name', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(u'temp'))) + var.put(u'id', var.get(u"this").callprop(u'generateUidIdentifier', var.get(u'name'))) + PyJs_Object_2123_ = Js({u'id':var.get(u'id')}) + var.get(u"this").callprop(u'push', PyJs_Object_2123_) + return var.get(u'id') + PyJs_generateDeclaredUidIdentifier_2122_._set_name(u'generateDeclaredUidIdentifier') + var.get(u'Scope').get(u'prototype').put(u'generateDeclaredUidIdentifier', PyJs_generateDeclaredUidIdentifier_2122_) + @Js + def PyJs_generateUidIdentifier_2124_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'generateUidIdentifier':PyJs_generateUidIdentifier_2124_}, var) + var.registers([u'name']) + var.put(u'name', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(u'temp'))) + return var.get(u't').callprop(u'identifier', var.get(u"this").callprop(u'generateUid', var.get(u'name'))) + PyJs_generateUidIdentifier_2124_._set_name(u'generateUidIdentifier') + var.get(u'Scope').get(u'prototype').put(u'generateUidIdentifier', PyJs_generateUidIdentifier_2124_) + @Js + def PyJs_generateUid_2125_(this, arguments, var=var): + var = Scope({u'this':this, u'generateUid':PyJs_generateUid_2125_, u'arguments':arguments}, var) + var.registers([u'i', u'program', u'name', u'uid']) + var.put(u'name', (var.get(u'arguments').get(u'0') if ((var.get(u'arguments').get(u'length')>Js(0.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'0'),var.get(u'undefined'))) else Js(u'temp'))) + var.put(u'name', var.get(u't').callprop(u'toIdentifier', var.get(u'name')).callprop(u'replace', JsRegExp(u'/^_+/'), Js(u'')).callprop(u'replace', JsRegExp(u'/[0-9]+$/g'), Js(u''))) + var.put(u'uid', PyJsComma(Js(0.0), Js(None))) + var.put(u'i', Js(0.0)) + while 1: + var.put(u'uid', var.get(u"this").callprop(u'_generateUid', var.get(u'name'), var.get(u'i'))) + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + if not (((var.get(u"this").callprop(u'hasLabel', var.get(u'uid')) or var.get(u"this").callprop(u'hasBinding', var.get(u'uid'))) or var.get(u"this").callprop(u'hasGlobal', var.get(u'uid'))) or var.get(u"this").callprop(u'hasReference', var.get(u'uid'))): + break + var.put(u'program', var.get(u"this").callprop(u'getProgramParent')) + var.get(u'program').get(u'references').put(var.get(u'uid'), var.get(u'true')) + var.get(u'program').get(u'uids').put(var.get(u'uid'), var.get(u'true')) + return var.get(u'uid') + PyJs_generateUid_2125_._set_name(u'generateUid') + var.get(u'Scope').get(u'prototype').put(u'generateUid', PyJs_generateUid_2125_) + @Js + def PyJs__generateUid_2126_(name, i, this, arguments, var=var): + var = Scope({u'i':i, u'this':this, u'_generateUid':PyJs__generateUid_2126_, u'name':name, u'arguments':arguments}, var) + var.registers([u'i', u'id', u'name']) + var.put(u'id', var.get(u'name')) + if (var.get(u'i')>Js(1.0)): + var.put(u'id', var.get(u'i'), u'+') + return (Js(u'_')+var.get(u'id')) + PyJs__generateUid_2126_._set_name(u'_generateUid') + var.get(u'Scope').get(u'prototype').put(u'_generateUid', PyJs__generateUid_2126_) + @Js + def PyJs_generateUidIdentifierBasedOnNode_2127_(parent, defaultName, this, arguments, var=var): + var = Scope({u'this':this, u'defaultName':defaultName, u'generateUidIdentifierBasedOnNode':PyJs_generateUidIdentifierBasedOnNode_2127_, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent', u'defaultName', u'add', u'parts', u'id']) + var.put(u'node', var.get(u'parent')) + if var.get(u't').callprop(u'isAssignmentExpression', var.get(u'parent')): + var.put(u'node', var.get(u'parent').get(u'left')) + else: + if var.get(u't').callprop(u'isVariableDeclarator', var.get(u'parent')): + var.put(u'node', var.get(u'parent').get(u'id')) + else: + if (var.get(u't').callprop(u'isObjectProperty', var.get(u'node')) or var.get(u't').callprop(u'isObjectMethod', var.get(u'node'))): + var.put(u'node', var.get(u'node').get(u'key')) + var.put(u'parts', Js([])) + @Js + def PyJs_add_2128_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'add':PyJs_add_2128_, u'arguments':arguments}, var) + var.registers([u'node', u'specifier', u'_isArray5', u'_isArray6', u'_i6', u'_ref5', u'prop', u'_ref6', u'_iterator5', u'_iterator6', u'_i5']) + if var.get(u't').callprop(u'isModuleDeclaration', var.get(u'node')): + if var.get(u'node').get(u'source'): + var.get(u'add')(var.get(u'node').get(u'source')) + else: + if (var.get(u'node').get(u'specifiers') and var.get(u'node').get(u'specifiers').get(u'length')): + #for JS loop + var.put(u'_iterator5', var.get(u'node').get(u'specifiers')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'specifier', var.get(u'_ref5')) + var.get(u'add')(var.get(u'specifier')) + + else: + if var.get(u'node').get(u'declaration'): + var.get(u'add')(var.get(u'node').get(u'declaration')) + else: + if var.get(u't').callprop(u'isModuleSpecifier', var.get(u'node')): + var.get(u'add')(var.get(u'node').get(u'local')) + else: + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + var.get(u'add')(var.get(u'node').get(u'object')) + var.get(u'add')(var.get(u'node').get(u'property')) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.get(u'parts').callprop(u'push', var.get(u'node').get(u'name')) + else: + if var.get(u't').callprop(u'isLiteral', var.get(u'node')): + var.get(u'parts').callprop(u'push', var.get(u'node').get(u'value')) + else: + if var.get(u't').callprop(u'isCallExpression', var.get(u'node')): + var.get(u'add')(var.get(u'node').get(u'callee')) + else: + if (var.get(u't').callprop(u'isObjectExpression', var.get(u'node')) or var.get(u't').callprop(u'isObjectPattern', var.get(u'node'))): + #for JS loop + var.put(u'_iterator6', var.get(u'node').get(u'properties')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i6').get(u'value')) + var.put(u'prop', var.get(u'_ref6')) + var.get(u'add')((var.get(u'prop').get(u'key') or var.get(u'prop').get(u'argument'))) + + PyJs_add_2128_._set_name(u'add') + var.put(u'add', PyJs_add_2128_) + var.get(u'add')(var.get(u'node')) + var.put(u'id', var.get(u'parts').callprop(u'join', Js(u'$'))) + var.put(u'id', ((var.get(u'id').callprop(u'replace', JsRegExp(u'/^_/'), Js(u'')) or var.get(u'defaultName')) or Js(u'ref'))) + return var.get(u"this").callprop(u'generateUidIdentifier', var.get(u'id').callprop(u'slice', Js(0.0), Js(20.0))) + PyJs_generateUidIdentifierBasedOnNode_2127_._set_name(u'generateUidIdentifierBasedOnNode') + var.get(u'Scope').get(u'prototype').put(u'generateUidIdentifierBasedOnNode', PyJs_generateUidIdentifierBasedOnNode_2127_) + @Js + def PyJs_isStatic_2129_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isStatic':PyJs_isStatic_2129_, u'arguments':arguments}, var) + var.registers([u'node', u'binding']) + if (var.get(u't').callprop(u'isThisExpression', var.get(u'node')) or var.get(u't').callprop(u'isSuper', var.get(u'node'))): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'node').get(u'name'))) + if var.get(u'binding'): + return var.get(u'binding').get(u'constant') + else: + return var.get(u"this").callprop(u'hasBinding', var.get(u'node').get(u'name')) + return Js(False) + PyJs_isStatic_2129_._set_name(u'isStatic') + var.get(u'Scope').get(u'prototype').put(u'isStatic', PyJs_isStatic_2129_) + @Js + def PyJs_maybeGenerateMemoised_2130_(node, dontPush, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'maybeGenerateMemoised':PyJs_maybeGenerateMemoised_2130_, u'dontPush':dontPush, u'arguments':arguments}, var) + var.registers([u'node', u'dontPush', u'_id2']) + if var.get(u"this").callprop(u'isStatic', var.get(u'node')): + return var.get(u"null") + else: + var.put(u'_id2', var.get(u"this").callprop(u'generateUidIdentifierBasedOnNode', var.get(u'node'))) + if var.get(u'dontPush').neg(): + PyJs_Object_2131_ = Js({u'id':var.get(u'_id2')}) + var.get(u"this").callprop(u'push', PyJs_Object_2131_) + return var.get(u'_id2') + PyJs_maybeGenerateMemoised_2130_._set_name(u'maybeGenerateMemoised') + var.get(u'Scope').get(u'prototype').put(u'maybeGenerateMemoised', PyJs_maybeGenerateMemoised_2130_) + @Js + def PyJs_checkBlockScopedCollisions_2132_(local, kind, name, id, this, arguments, var=var): + var = Scope({u'kind':kind, u'name':name, u'this':this, u'checkBlockScopedCollisions':PyJs_checkBlockScopedCollisions_2132_, u'local':local, u'id':id, u'arguments':arguments}, var) + var.registers([u'id', u'duplicate', u'local', u'kind', u'name']) + if PyJsStrictEq(var.get(u'kind'),Js(u'param')): + return var.get('undefined') + if (PyJsStrictEq(var.get(u'kind'),Js(u'hoisted')) and PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'let'))): + return var.get('undefined') + var.put(u'duplicate', Js(False)) + if var.get(u'duplicate').neg(): + var.put(u'duplicate', (((PyJsStrictEq(var.get(u'kind'),Js(u'let')) or PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'let'))) or PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'const'))) or PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'module')))) + if var.get(u'duplicate').neg(): + var.put(u'duplicate', (PyJsStrictEq(var.get(u'local').get(u'kind'),Js(u'param')) and (PyJsStrictEq(var.get(u'kind'),Js(u'let')) or PyJsStrictEq(var.get(u'kind'),Js(u'const'))))) + if var.get(u'duplicate'): + PyJsTempException = JsToPyException(var.get(u"this").get(u'hub').get(u'file').callprop(u'buildCodeFrameError', var.get(u'id'), var.get(u'messages').callprop(u'get', Js(u'scopeDuplicateDeclaration'), var.get(u'name')), var.get(u'TypeError'))) + raise PyJsTempException + PyJs_checkBlockScopedCollisions_2132_._set_name(u'checkBlockScopedCollisions') + var.get(u'Scope').get(u'prototype').put(u'checkBlockScopedCollisions', PyJs_checkBlockScopedCollisions_2132_) + @Js + def PyJs_rename_2133_(oldName, newName, block, this, arguments, var=var): + var = Scope({u'rename':PyJs_rename_2133_, u'newName':newName, u'this':this, u'oldName':oldName, u'block':block, u'arguments':arguments}, var) + var.registers([u'newName', u'binding', u'oldName', u'block']) + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'oldName'))) + if var.get(u'binding'): + var.put(u'newName', (var.get(u'newName') or var.get(u"this").callprop(u'generateUidIdentifier', var.get(u'oldName')).get(u'name'))) + return var.get(u'_renamer2').get(u'default').create(var.get(u'binding'), var.get(u'oldName'), var.get(u'newName')).callprop(u'rename', var.get(u'block')) + PyJs_rename_2133_._set_name(u'rename') + var.get(u'Scope').get(u'prototype').put(u'rename', PyJs_rename_2133_) + @Js + def PyJs__renameFromMap_2134_(map, oldName, newName, value, this, arguments, var=var): + var = Scope({u'map':map, u'_renameFromMap':PyJs__renameFromMap_2134_, u'oldName':oldName, u'newName':newName, u'this':this, u'value':value, u'arguments':arguments}, var) + var.registers([u'newName', u'map', u'oldName', u'value']) + if var.get(u'map').get(var.get(u'oldName')): + var.get(u'map').put(var.get(u'newName'), var.get(u'value')) + var.get(u'map').put(var.get(u'oldName'), var.get(u"null")) + PyJs__renameFromMap_2134_._set_name(u'_renameFromMap') + var.get(u'Scope').get(u'prototype').put(u'_renameFromMap', PyJs__renameFromMap_2134_) + @Js + def PyJs_dump_2135_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'dump':PyJs_dump_2135_}, var) + var.registers([u'scope', u'binding', u'name', u'sep']) + var.put(u'sep', PyJsComma(Js(0.0),var.get(u'_repeat2').get(u'default'))(Js(u'-'), Js(60.0))) + var.get(u'console').callprop(u'log', var.get(u'sep')) + var.put(u'scope', var.get(u"this")) + while 1: + var.get(u'console').callprop(u'log', Js(u'#'), var.get(u'scope').get(u'block').get(u'type')) + for PyJsTemp in var.get(u'scope').get(u'bindings'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u'scope').get(u'bindings').get(var.get(u'name'))) + PyJs_Object_2136_ = Js({u'constant':var.get(u'binding').get(u'constant'),u'references':var.get(u'binding').get(u'references'),u'violations':var.get(u'binding').get(u'constantViolations').get(u'length'),u'kind':var.get(u'binding').get(u'kind')}) + var.get(u'console').callprop(u'log', Js(u' -'), var.get(u'name'), PyJs_Object_2136_) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + var.get(u'console').callprop(u'log', var.get(u'sep')) + PyJs_dump_2135_._set_name(u'dump') + var.get(u'Scope').get(u'prototype').put(u'dump', PyJs_dump_2135_) + @Js + def PyJs_toArray_2137_(node, i, this, arguments, var=var): + var = Scope({u'node':node, u'i':i, u'this':this, u'arguments':arguments, u'toArray':PyJs_toArray_2137_}, var) + var.registers([u'node', u'helperName', u'i', u'args', u'binding', u'file']) + var.put(u'file', var.get(u"this").get(u'hub').get(u'file')) + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'node').get(u'name'))) + if ((var.get(u'binding') and var.get(u'binding').get(u'constant')) and var.get(u'binding').get(u'path').callprop(u'isGenericType', Js(u'Array'))): + return var.get(u'node') + if var.get(u't').callprop(u'isArrayExpression', var.get(u'node')): + return var.get(u'node') + PyJs_Object_2138_ = Js({u'name':Js(u'arguments')}) + if var.get(u't').callprop(u'isIdentifier', var.get(u'node'), PyJs_Object_2138_): + def PyJs_LONG_2139_(var=var): + return var.get(u't').callprop(u'callExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'memberExpression', var.get(u't').callprop(u'identifier', Js(u'Array')), var.get(u't').callprop(u'identifier', Js(u'prototype'))), var.get(u't').callprop(u'identifier', Js(u'slice'))), var.get(u't').callprop(u'identifier', Js(u'call'))), Js([var.get(u'node')])) + return PyJs_LONG_2139_() + var.put(u'helperName', Js(u'toArray')) + var.put(u'args', Js([var.get(u'node')])) + if PyJsStrictEq(var.get(u'i'),var.get(u'true')): + var.put(u'helperName', Js(u'toConsumableArray')) + else: + if var.get(u'i'): + var.get(u'args').callprop(u'push', var.get(u't').callprop(u'numericLiteral', var.get(u'i'))) + var.put(u'helperName', Js(u'slicedToArray')) + return var.get(u't').callprop(u'callExpression', var.get(u'file').callprop(u'addHelper', var.get(u'helperName')), var.get(u'args')) + PyJs_toArray_2137_._set_name(u'toArray') + var.get(u'Scope').get(u'prototype').put(u'toArray', PyJs_toArray_2137_) + @Js + def PyJs_hasLabel_2140_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasLabel':PyJs_hasLabel_2140_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").callprop(u'getLabel', var.get(u'name')).neg().neg() + PyJs_hasLabel_2140_._set_name(u'hasLabel') + var.get(u'Scope').get(u'prototype').put(u'hasLabel', PyJs_hasLabel_2140_) + @Js + def PyJs_getLabel_2141_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'getLabel':PyJs_getLabel_2141_, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").get(u'labels').callprop(u'get', var.get(u'name')) + PyJs_getLabel_2141_._set_name(u'getLabel') + var.get(u'Scope').get(u'prototype').put(u'getLabel', PyJs_getLabel_2141_) + @Js + def PyJs_registerLabel_2142_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'registerLabel':PyJs_registerLabel_2142_}, var) + var.registers([u'path']) + var.get(u"this").get(u'labels').callprop(u'set', var.get(u'path').get(u'node').get(u'label').get(u'name'), var.get(u'path')) + PyJs_registerLabel_2142_._set_name(u'registerLabel') + var.get(u'Scope').get(u'prototype').put(u'registerLabel', PyJs_registerLabel_2142_) + @Js + def PyJs_registerDeclaration_2143_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'registerDeclaration':PyJs_registerDeclaration_2143_}, var) + var.registers([u'_isArray7', u'specifiers', u'_ref8', u'_i8', u'_i7', u'declarations', u'_isArray8', u'_ref7', u'declar', u'_iterator8', u'path', u'specifier', u'_declar', u'_iterator7']) + if var.get(u'path').callprop(u'isLabeledStatement'): + var.get(u"this").callprop(u'registerLabel', var.get(u'path')) + else: + if var.get(u'path').callprop(u'isFunctionDeclaration'): + var.get(u"this").callprop(u'registerBinding', Js(u'hoisted'), var.get(u'path').callprop(u'get', Js(u'id')), var.get(u'path')) + else: + if var.get(u'path').callprop(u'isVariableDeclaration'): + var.put(u'declarations', var.get(u'path').callprop(u'get', Js(u'declarations'))) + #for JS loop + var.put(u'_iterator7', var.get(u'declarations')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i7').get(u'value')) + var.put(u'declar', var.get(u'_ref7')) + var.get(u"this").callprop(u'registerBinding', var.get(u'path').get(u'node').get(u'kind'), var.get(u'declar')) + + else: + if var.get(u'path').callprop(u'isClassDeclaration'): + var.get(u"this").callprop(u'registerBinding', Js(u'let'), var.get(u'path')) + else: + if var.get(u'path').callprop(u'isImportDeclaration'): + var.put(u'specifiers', var.get(u'path').callprop(u'get', Js(u'specifiers'))) + #for JS loop + var.put(u'_iterator8', var.get(u'specifiers')) + var.put(u'_isArray8', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator8'))) + var.put(u'_i8', Js(0.0)) + var.put(u'_iterator8', (var.get(u'_iterator8') if var.get(u'_isArray8') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator8')))) + while 1: + pass + if var.get(u'_isArray8'): + if (var.get(u'_i8')>=var.get(u'_iterator8').get(u'length')): + break + var.put(u'_ref8', var.get(u'_iterator8').get((var.put(u'_i8',Js(var.get(u'_i8').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i8', var.get(u'_iterator8').callprop(u'next')) + if var.get(u'_i8').get(u'done'): + break + var.put(u'_ref8', var.get(u'_i8').get(u'value')) + var.put(u'specifier', var.get(u'_ref8')) + var.get(u"this").callprop(u'registerBinding', Js(u'module'), var.get(u'specifier')) + + else: + if var.get(u'path').callprop(u'isExportDeclaration'): + var.put(u'_declar', var.get(u'path').callprop(u'get', Js(u'declaration'))) + if ((var.get(u'_declar').callprop(u'isClassDeclaration') or var.get(u'_declar').callprop(u'isFunctionDeclaration')) or var.get(u'_declar').callprop(u'isVariableDeclaration')): + var.get(u"this").callprop(u'registerDeclaration', var.get(u'_declar')) + else: + var.get(u"this").callprop(u'registerBinding', Js(u'unknown'), var.get(u'path')) + PyJs_registerDeclaration_2143_._set_name(u'registerDeclaration') + var.get(u'Scope').get(u'prototype').put(u'registerDeclaration', PyJs_registerDeclaration_2143_) + @Js + def PyJs_buildUndefinedNode_2144_(this, arguments, var=var): + var = Scope({u'this':this, u'buildUndefinedNode':PyJs_buildUndefinedNode_2144_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").callprop(u'hasBinding', Js(u'undefined')): + return var.get(u't').callprop(u'unaryExpression', Js(u'void'), var.get(u't').callprop(u'numericLiteral', Js(0.0)), var.get(u'true')) + else: + return var.get(u't').callprop(u'identifier', Js(u'undefined')) + PyJs_buildUndefinedNode_2144_._set_name(u'buildUndefinedNode') + var.get(u'Scope').get(u'prototype').put(u'buildUndefinedNode', PyJs_buildUndefinedNode_2144_) + @Js + def PyJs_registerConstantViolation_2145_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'registerConstantViolation':PyJs_registerConstantViolation_2145_}, var) + var.registers([u'path', u'binding', u'ids', u'name']) + var.put(u'ids', var.get(u'path').callprop(u'getBindingIdentifiers')) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').callprop(u'reassign', var.get(u'path')) + PyJs_registerConstantViolation_2145_._set_name(u'registerConstantViolation') + var.get(u'Scope').get(u'prototype').put(u'registerConstantViolation', PyJs_registerConstantViolation_2145_) + @Js + def PyJs_registerBinding_2146_(kind, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'kind':kind, u'arguments':arguments, u'registerBinding':PyJs_registerBinding_2146_}, var) + var.registers([u'parent', u'kind', u'_i10', u'_i9', u'_ref9', u'name', u'_ref10', u'ids', u'_isArray9', u'declarators', u'declar', u'_iterator9', u'_isArray10', u'_iterator10', u'path', u'_id3', u'local', u'bindingPath']) + var.put(u'bindingPath', (var.get(u'arguments').get(u'2') if ((var.get(u'arguments').get(u'length')>Js(2.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'2'),var.get(u'undefined'))) else var.get(u'path'))) + if var.get(u'kind').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u'no `kind`'))) + raise PyJsTempException + if var.get(u'path').callprop(u'isVariableDeclaration'): + var.put(u'declarators', var.get(u'path').callprop(u'get', Js(u'declarations'))) + #for JS loop + var.put(u'_iterator9', var.get(u'declarators')) + var.put(u'_isArray9', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator9'))) + var.put(u'_i9', Js(0.0)) + var.put(u'_iterator9', (var.get(u'_iterator9') if var.get(u'_isArray9') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator9')))) + while 1: + pass + if var.get(u'_isArray9'): + if (var.get(u'_i9')>=var.get(u'_iterator9').get(u'length')): + break + var.put(u'_ref9', var.get(u'_iterator9').get((var.put(u'_i9',Js(var.get(u'_i9').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i9', var.get(u'_iterator9').callprop(u'next')) + if var.get(u'_i9').get(u'done'): + break + var.put(u'_ref9', var.get(u'_i9').get(u'value')) + var.put(u'declar', var.get(u'_ref9')) + var.get(u"this").callprop(u'registerBinding', var.get(u'kind'), var.get(u'declar')) + + return var.get('undefined') + var.put(u'parent', var.get(u"this").callprop(u'getProgramParent')) + var.put(u'ids', var.get(u'path').callprop(u'getBindingIdentifiers', var.get(u'true'))) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + #for JS loop + var.put(u'_iterator10', var.get(u'ids').get(var.get(u'name'))) + var.put(u'_isArray10', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator10'))) + var.put(u'_i10', Js(0.0)) + var.put(u'_iterator10', (var.get(u'_iterator10') if var.get(u'_isArray10') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator10')))) + while 1: + pass + if var.get(u'_isArray10'): + if (var.get(u'_i10')>=var.get(u'_iterator10').get(u'length')): + break + var.put(u'_ref10', var.get(u'_iterator10').get((var.put(u'_i10',Js(var.get(u'_i10').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i10', var.get(u'_iterator10').callprop(u'next')) + if var.get(u'_i10').get(u'done'): + break + var.put(u'_ref10', var.get(u'_i10').get(u'value')) + var.put(u'_id3', var.get(u'_ref10')) + var.put(u'local', var.get(u"this").callprop(u'getOwnBinding', var.get(u'name'))) + if var.get(u'local'): + if PyJsStrictEq(var.get(u'local').get(u'identifier'),var.get(u'_id3')): + continue + var.get(u"this").callprop(u'checkBlockScopedCollisions', var.get(u'local'), var.get(u'kind'), var.get(u'name'), var.get(u'_id3')) + if (var.get(u'local') and var.get(u'local').get(u'path').callprop(u'isFlow')): + var.put(u'local', var.get(u"null")) + var.get(u'parent').get(u'references').put(var.get(u'name'), var.get(u'true')) + PyJs_Object_2147_ = Js({u'identifier':var.get(u'_id3'),u'existing':var.get(u'local'),u'scope':var.get(u"this"),u'path':var.get(u'bindingPath'),u'kind':var.get(u'kind')}) + var.get(u"this").get(u'bindings').put(var.get(u'name'), var.get(u'_binding3').get(u'default').create(PyJs_Object_2147_)) + + PyJs_registerBinding_2146_._set_name(u'registerBinding') + var.get(u'Scope').get(u'prototype').put(u'registerBinding', PyJs_registerBinding_2146_) + @Js + def PyJs_addGlobal_2148_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'addGlobal':PyJs_addGlobal_2148_}, var) + var.registers([u'node']) + var.get(u"this").get(u'globals').put(var.get(u'node').get(u'name'), var.get(u'node')) + PyJs_addGlobal_2148_._set_name(u'addGlobal') + var.get(u'Scope').get(u'prototype').put(u'addGlobal', PyJs_addGlobal_2148_) + @Js + def PyJs_hasUid_2149_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasUid':PyJs_hasUid_2149_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'uids').get(var.get(u'name')): + return var.get(u'true') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + return Js(False) + PyJs_hasUid_2149_._set_name(u'hasUid') + var.get(u'Scope').get(u'prototype').put(u'hasUid', PyJs_hasUid_2149_) + @Js + def PyJs_hasGlobal_2150_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasGlobal':PyJs_hasGlobal_2150_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'globals').get(var.get(u'name')): + return var.get(u'true') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + return Js(False) + PyJs_hasGlobal_2150_._set_name(u'hasGlobal') + var.get(u'Scope').get(u'prototype').put(u'hasGlobal', PyJs_hasGlobal_2150_) + @Js + def PyJs_hasReference_2151_(name, this, arguments, var=var): + var = Scope({u'this':this, u'hasReference':PyJs_hasReference_2151_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'references').get(var.get(u'name')): + return var.get(u'true') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + return Js(False) + PyJs_hasReference_2151_._set_name(u'hasReference') + var.get(u'Scope').get(u'prototype').put(u'hasReference', PyJs_hasReference_2151_) + @Js + def PyJs_isPure_2152_(node, constantsOnly, this, arguments, var=var): + var = Scope({u'node':node, u'constantsOnly':constantsOnly, u'this':this, u'arguments':arguments, u'isPure':PyJs_isPure_2152_}, var) + var.registers([u'node', u'constantsOnly', u'_isArray11', u'binding', u'elem', u'prop', u'_i13', u'_i12', u'_i11', u'_isArray13', u'_isArray12', u'_ref11', u'_iterator11', u'_ref13', u'_iterator13', u'_iterator12', u'method', u'_ref12']) + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + var.put(u'binding', var.get(u"this").callprop(u'getBinding', var.get(u'node').get(u'name'))) + if var.get(u'binding').neg(): + return Js(False) + if var.get(u'constantsOnly'): + return var.get(u'binding').get(u'constant') + return var.get(u'true') + else: + if var.get(u't').callprop(u'isClass', var.get(u'node')): + if (var.get(u'node').get(u'superClass') and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'superClass'), var.get(u'constantsOnly')).neg()): + return Js(False) + return var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'body'), var.get(u'constantsOnly')) + else: + if var.get(u't').callprop(u'isClassBody', var.get(u'node')): + #for JS loop + var.put(u'_iterator11', var.get(u'node').get(u'body')) + var.put(u'_isArray11', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator11'))) + var.put(u'_i11', Js(0.0)) + var.put(u'_iterator11', (var.get(u'_iterator11') if var.get(u'_isArray11') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator11')))) + while 1: + pass + if var.get(u'_isArray11'): + if (var.get(u'_i11')>=var.get(u'_iterator11').get(u'length')): + break + var.put(u'_ref11', var.get(u'_iterator11').get((var.put(u'_i11',Js(var.get(u'_i11').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i11', var.get(u'_iterator11').callprop(u'next')) + if var.get(u'_i11').get(u'done'): + break + var.put(u'_ref11', var.get(u'_i11').get(u'value')) + var.put(u'method', var.get(u'_ref11')) + if var.get(u"this").callprop(u'isPure', var.get(u'method'), var.get(u'constantsOnly')).neg(): + return Js(False) + + return var.get(u'true') + else: + if var.get(u't').callprop(u'isBinary', var.get(u'node')): + return (var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'left'), var.get(u'constantsOnly')) and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'right'), var.get(u'constantsOnly'))) + else: + if var.get(u't').callprop(u'isArrayExpression', var.get(u'node')): + #for JS loop + var.put(u'_iterator12', var.get(u'node').get(u'elements')) + var.put(u'_isArray12', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator12'))) + var.put(u'_i12', Js(0.0)) + var.put(u'_iterator12', (var.get(u'_iterator12') if var.get(u'_isArray12') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator12')))) + while 1: + pass + if var.get(u'_isArray12'): + if (var.get(u'_i12')>=var.get(u'_iterator12').get(u'length')): + break + var.put(u'_ref12', var.get(u'_iterator12').get((var.put(u'_i12',Js(var.get(u'_i12').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i12', var.get(u'_iterator12').callprop(u'next')) + if var.get(u'_i12').get(u'done'): + break + var.put(u'_ref12', var.get(u'_i12').get(u'value')) + var.put(u'elem', var.get(u'_ref12')) + if var.get(u"this").callprop(u'isPure', var.get(u'elem'), var.get(u'constantsOnly')).neg(): + return Js(False) + + return var.get(u'true') + else: + if var.get(u't').callprop(u'isObjectExpression', var.get(u'node')): + #for JS loop + var.put(u'_iterator13', var.get(u'node').get(u'properties')) + var.put(u'_isArray13', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator13'))) + var.put(u'_i13', Js(0.0)) + var.put(u'_iterator13', (var.get(u'_iterator13') if var.get(u'_isArray13') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator13')))) + while 1: + pass + if var.get(u'_isArray13'): + if (var.get(u'_i13')>=var.get(u'_iterator13').get(u'length')): + break + var.put(u'_ref13', var.get(u'_iterator13').get((var.put(u'_i13',Js(var.get(u'_i13').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i13', var.get(u'_iterator13').callprop(u'next')) + if var.get(u'_i13').get(u'done'): + break + var.put(u'_ref13', var.get(u'_i13').get(u'value')) + var.put(u'prop', var.get(u'_ref13')) + if var.get(u"this").callprop(u'isPure', var.get(u'prop'), var.get(u'constantsOnly')).neg(): + return Js(False) + + return var.get(u'true') + else: + if var.get(u't').callprop(u'isClassMethod', var.get(u'node')): + if (var.get(u'node').get(u'computed') and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'key'), var.get(u'constantsOnly')).neg()): + return Js(False) + if (PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'set'))): + return Js(False) + return var.get(u'true') + else: + if (var.get(u't').callprop(u'isClassProperty', var.get(u'node')) or var.get(u't').callprop(u'isObjectProperty', var.get(u'node'))): + if (var.get(u'node').get(u'computed') and var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'key'), var.get(u'constantsOnly')).neg()): + return Js(False) + return var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'value'), var.get(u'constantsOnly')) + else: + if var.get(u't').callprop(u'isUnaryExpression', var.get(u'node')): + return var.get(u"this").callprop(u'isPure', var.get(u'node').get(u'argument'), var.get(u'constantsOnly')) + else: + return var.get(u't').callprop(u'isPureish', var.get(u'node')) + PyJs_isPure_2152_._set_name(u'isPure') + var.get(u'Scope').get(u'prototype').put(u'isPure', PyJs_isPure_2152_) + @Js + def PyJs_setData_2153_(key, val, this, arguments, var=var): + var = Scope({u'this':this, u'setData':PyJs_setData_2153_, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'val', u'key']) + return var.get(u"this").get(u'data').put(var.get(u'key'), var.get(u'val')) + PyJs_setData_2153_._set_name(u'setData') + var.get(u'Scope').get(u'prototype').put(u'setData', PyJs_setData_2153_) + @Js + def PyJs_getData_2154_(key, this, arguments, var=var): + var = Scope({u'this':this, u'getData':PyJs_getData_2154_, u'arguments':arguments, u'key':key}, var) + var.registers([u'scope', u'data', u'key']) + var.put(u'scope', var.get(u"this")) + while 1: + var.put(u'data', var.get(u'scope').get(u'data').get(var.get(u'key'))) + if (var.get(u'data')!=var.get(u"null")): + return var.get(u'data') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_getData_2154_._set_name(u'getData') + var.get(u'Scope').get(u'prototype').put(u'getData', PyJs_getData_2154_) + @Js + def PyJs_removeData_2155_(key, this, arguments, var=var): + var = Scope({u'this':this, u'removeData':PyJs_removeData_2155_, u'arguments':arguments, u'key':key}, var) + var.registers([u'scope', u'data', u'key']) + var.put(u'scope', var.get(u"this")) + while 1: + var.put(u'data', var.get(u'scope').get(u'data').get(var.get(u'key'))) + if (var.get(u'data')!=var.get(u"null")): + var.get(u'scope').get(u'data').put(var.get(u'key'), var.get(u"null")) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_removeData_2155_._set_name(u'removeData') + var.get(u'Scope').get(u'prototype').put(u'removeData', PyJs_removeData_2155_) + @Js + def PyJs_init_2156_(this, arguments, var=var): + var = Scope({u'this':this, u'init':PyJs_init_2156_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'references').neg(): + var.get(u"this").callprop(u'crawl') + PyJs_init_2156_._set_name(u'init') + var.get(u'Scope').get(u'prototype').put(u'init', PyJs_init_2156_) + @Js + def PyJs_crawl_2157_(this, arguments, var=var): + var = Scope({u'this':this, u'crawl':PyJs_crawl_2157_, u'arguments':arguments}, var) + var.registers([]) + (var.put(u'_crawlCallsCount',Js(var.get(u'_crawlCallsCount').to_number())+Js(1))-Js(1)) + var.get(u"this").callprop(u'_crawl') + (var.put(u'_crawlCallsCount',Js(var.get(u'_crawlCallsCount').to_number())-Js(1))+Js(1)) + PyJs_crawl_2157_._set_name(u'crawl') + var.get(u'Scope').get(u'prototype').put(u'crawl', PyJs_crawl_2157_) + @Js + def PyJs__crawl_2158_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'_crawl':PyJs__crawl_2158_}, var) + var.registers([u'binding', u'_ref15', u'param', u'_ref17', u'_ref16', u'state', u'_ref14', u'params', u'_isArray18', u'ref', u'_ref18', u'node', u'parent', u'_isArray17', u'_isArray16', u'_isArray15', u'_isArray14', u'key', u'path', u'_path2', u'_iterator15', u'_iterator14', u'_iterator17', u'_iterator16', u'name', u'_iterator18', u'ids', u'programParent', u'_i17', u'_i16', u'_i15', u'_i14', u'_i18', u'_path']) + var.put(u'path', var.get(u"this").get(u'path')) + var.get(u"this").put(u'references', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'bindings', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'globals', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'uids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.get(u"this").put(u'data', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + if var.get(u'path').callprop(u'isLoop'): + #for JS loop + var.put(u'_iterator14', var.get(u't').get(u'FOR_INIT_KEYS')) + var.put(u'_isArray14', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator14'))) + var.put(u'_i14', Js(0.0)) + var.put(u'_iterator14', (var.get(u'_iterator14') if var.get(u'_isArray14') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator14')))) + while 1: + pass + if var.get(u'_isArray14'): + if (var.get(u'_i14')>=var.get(u'_iterator14').get(u'length')): + break + var.put(u'_ref14', var.get(u'_iterator14').get((var.put(u'_i14',Js(var.get(u'_i14').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i14', var.get(u'_iterator14').callprop(u'next')) + if var.get(u'_i14').get(u'done'): + break + var.put(u'_ref14', var.get(u'_i14').get(u'value')) + var.put(u'key', var.get(u'_ref14')) + var.put(u'node', var.get(u'path').callprop(u'get', var.get(u'key'))) + if var.get(u'node').callprop(u'isBlockScoped'): + var.get(u"this").callprop(u'registerBinding', var.get(u'node').get(u'node').get(u'kind'), var.get(u'node')) + + if (var.get(u'path').callprop(u'isFunctionExpression') and var.get(u'path').callprop(u'has', Js(u'id'))): + if var.get(u'path').callprop(u'get', Js(u'id')).get(u'node').get(var.get(u't').get(u'NOT_LOCAL_BINDING')).neg(): + var.get(u"this").callprop(u'registerBinding', Js(u'local'), var.get(u'path').callprop(u'get', Js(u'id')), var.get(u'path')) + if (var.get(u'path').callprop(u'isClassExpression') and var.get(u'path').callprop(u'has', Js(u'id'))): + if var.get(u'path').callprop(u'get', Js(u'id')).get(u'node').get(var.get(u't').get(u'NOT_LOCAL_BINDING')).neg(): + var.get(u"this").callprop(u'registerBinding', Js(u'local'), var.get(u'path')) + if var.get(u'path').callprop(u'isFunction'): + var.put(u'params', var.get(u'path').callprop(u'get', Js(u'params'))) + #for JS loop + var.put(u'_iterator15', var.get(u'params')) + var.put(u'_isArray15', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator15'))) + var.put(u'_i15', Js(0.0)) + var.put(u'_iterator15', (var.get(u'_iterator15') if var.get(u'_isArray15') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator15')))) + while 1: + pass + if var.get(u'_isArray15'): + if (var.get(u'_i15')>=var.get(u'_iterator15').get(u'length')): + break + var.put(u'_ref15', var.get(u'_iterator15').get((var.put(u'_i15',Js(var.get(u'_i15').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i15', var.get(u'_iterator15').callprop(u'next')) + if var.get(u'_i15').get(u'done'): + break + var.put(u'_ref15', var.get(u'_i15').get(u'value')) + var.put(u'param', var.get(u'_ref15')) + var.get(u"this").callprop(u'registerBinding', Js(u'param'), var.get(u'param')) + + if var.get(u'path').callprop(u'isCatchClause'): + var.get(u"this").callprop(u'registerBinding', Js(u'let'), var.get(u'path')) + var.put(u'parent', var.get(u"this").callprop(u'getProgramParent')) + if var.get(u'parent').get(u'crawling'): + return var.get('undefined') + PyJs_Object_2159_ = Js({u'references':Js([]),u'constantViolations':Js([]),u'assignments':Js([])}) + var.put(u'state', PyJs_Object_2159_) + var.get(u"this").put(u'crawling', var.get(u'true')) + var.get(u'path').callprop(u'traverse', var.get(u'collectorVisitor'), var.get(u'state')) + var.get(u"this").put(u'crawling', Js(False)) + #for JS loop + var.put(u'_iterator16', var.get(u'state').get(u'assignments')) + var.put(u'_isArray16', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator16'))) + var.put(u'_i16', Js(0.0)) + var.put(u'_iterator16', (var.get(u'_iterator16') if var.get(u'_isArray16') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator16')))) + while 1: + pass + if var.get(u'_isArray16'): + if (var.get(u'_i16')>=var.get(u'_iterator16').get(u'length')): + break + var.put(u'_ref16', var.get(u'_iterator16').get((var.put(u'_i16',Js(var.get(u'_i16').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i16', var.get(u'_iterator16').callprop(u'next')) + if var.get(u'_i16').get(u'done'): + break + var.put(u'_ref16', var.get(u'_i16').get(u'value')) + var.put(u'_path', var.get(u'_ref16')) + var.put(u'ids', var.get(u'_path').callprop(u'getBindingIdentifiers')) + var.put(u'programParent', PyJsComma(Js(0.0), Js(None))) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + if var.get(u'_path').get(u'scope').callprop(u'getBinding', var.get(u'name')): + continue + var.put(u'programParent', (var.get(u'programParent') or var.get(u'_path').get(u'scope').callprop(u'getProgramParent'))) + var.get(u'programParent').callprop(u'addGlobal', var.get(u'ids').get(var.get(u'name'))) + var.get(u'_path').get(u'scope').callprop(u'registerConstantViolation', var.get(u'_path')) + + #for JS loop + var.put(u'_iterator17', var.get(u'state').get(u'references')) + var.put(u'_isArray17', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator17'))) + var.put(u'_i17', Js(0.0)) + var.put(u'_iterator17', (var.get(u'_iterator17') if var.get(u'_isArray17') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator17')))) + while 1: + pass + if var.get(u'_isArray17'): + if (var.get(u'_i17')>=var.get(u'_iterator17').get(u'length')): + break + var.put(u'_ref17', var.get(u'_iterator17').get((var.put(u'_i17',Js(var.get(u'_i17').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i17', var.get(u'_iterator17').callprop(u'next')) + if var.get(u'_i17').get(u'done'): + break + var.put(u'_ref17', var.get(u'_i17').get(u'value')) + var.put(u'ref', var.get(u'_ref17')) + var.put(u'binding', var.get(u'ref').get(u'scope').callprop(u'getBinding', var.get(u'ref').get(u'node').get(u'name'))) + if var.get(u'binding'): + var.get(u'binding').callprop(u'reference', var.get(u'ref')) + else: + var.get(u'ref').get(u'scope').callprop(u'getProgramParent').callprop(u'addGlobal', var.get(u'ref').get(u'node')) + + #for JS loop + var.put(u'_iterator18', var.get(u'state').get(u'constantViolations')) + var.put(u'_isArray18', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator18'))) + var.put(u'_i18', Js(0.0)) + var.put(u'_iterator18', (var.get(u'_iterator18') if var.get(u'_isArray18') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator18')))) + while 1: + pass + if var.get(u'_isArray18'): + if (var.get(u'_i18')>=var.get(u'_iterator18').get(u'length')): + break + var.put(u'_ref18', var.get(u'_iterator18').get((var.put(u'_i18',Js(var.get(u'_i18').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i18', var.get(u'_iterator18').callprop(u'next')) + if var.get(u'_i18').get(u'done'): + break + var.put(u'_ref18', var.get(u'_i18').get(u'value')) + var.put(u'_path2', var.get(u'_ref18')) + var.get(u'_path2').get(u'scope').callprop(u'registerConstantViolation', var.get(u'_path2')) + + PyJs__crawl_2158_._set_name(u'_crawl') + var.get(u'Scope').get(u'prototype').put(u'_crawl', PyJs__crawl_2158_) + @Js + def PyJs_push_2160_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'push':PyJs_push_2160_, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'kind', u'blockHoist', u'_path$unshiftContaine', u'declarPath', u'declar', u'declarator', u'path', u'dataKey', u'unique', u'opts']) + var.put(u'path', var.get(u"this").get(u'path')) + if (var.get(u'path').callprop(u'isBlockStatement').neg() and var.get(u'path').callprop(u'isProgram').neg()): + var.put(u'path', var.get(u"this").callprop(u'getBlockParent').get(u'path')) + if var.get(u'path').callprop(u'isSwitchStatement'): + var.put(u'path', var.get(u"this").callprop(u'getFunctionParent').get(u'path')) + if ((var.get(u'path').callprop(u'isLoop') or var.get(u'path').callprop(u'isCatchClause')) or var.get(u'path').callprop(u'isFunction')): + var.get(u't').callprop(u'ensureBlock', var.get(u'path').get(u'node')) + var.put(u'path', var.get(u'path').callprop(u'get', Js(u'body'))) + var.put(u'unique', var.get(u'opts').get(u'unique')) + var.put(u'kind', (var.get(u'opts').get(u'kind') or Js(u'var'))) + var.put(u'blockHoist', (Js(2.0) if (var.get(u'opts').get(u'_blockHoist')==var.get(u"null")) else var.get(u'opts').get(u'_blockHoist'))) + var.put(u'dataKey', (((Js(u'declaration:')+var.get(u'kind'))+Js(u':'))+var.get(u'blockHoist'))) + var.put(u'declarPath', (var.get(u'unique').neg() and var.get(u'path').callprop(u'getData', var.get(u'dataKey')))) + if var.get(u'declarPath').neg(): + var.put(u'declar', var.get(u't').callprop(u'variableDeclaration', var.get(u'kind'), Js([]))) + var.get(u'declar').put(u'_generated', var.get(u'true')) + var.get(u'declar').put(u'_blockHoist', var.get(u'blockHoist')) + var.put(u'_path$unshiftContaine', var.get(u'path').callprop(u'unshiftContainer', Js(u'body'), Js([var.get(u'declar')]))) + var.put(u'declarPath', var.get(u'_path$unshiftContaine').get(u'0')) + if var.get(u'unique').neg(): + var.get(u'path').callprop(u'setData', var.get(u'dataKey'), var.get(u'declarPath')) + var.put(u'declarator', var.get(u't').callprop(u'variableDeclarator', var.get(u'opts').get(u'id'), var.get(u'opts').get(u'init'))) + var.get(u'declarPath').get(u'node').get(u'declarations').callprop(u'push', var.get(u'declarator')) + var.get(u"this").callprop(u'registerBinding', var.get(u'kind'), var.get(u'declarPath').callprop(u'get', Js(u'declarations')).callprop(u'pop')) + PyJs_push_2160_._set_name(u'push') + var.get(u'Scope').get(u'prototype').put(u'push', PyJs_push_2160_) + @Js + def PyJs_getProgramParent_2161_(this, arguments, var=var): + var = Scope({u'this':this, u'getProgramParent':PyJs_getProgramParent_2161_, u'arguments':arguments}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'path').callprop(u'isProgram'): + return var.get(u'scope') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We couldn't find a Function or Program..."))) + raise PyJsTempException + PyJs_getProgramParent_2161_._set_name(u'getProgramParent') + var.get(u'Scope').get(u'prototype').put(u'getProgramParent', PyJs_getProgramParent_2161_) + @Js + def PyJs_getFunctionParent_2162_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getFunctionParent':PyJs_getFunctionParent_2162_}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'path').callprop(u'isFunctionParent'): + return var.get(u'scope') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We couldn't find a Function or Program..."))) + raise PyJsTempException + PyJs_getFunctionParent_2162_._set_name(u'getFunctionParent') + var.get(u'Scope').get(u'prototype').put(u'getFunctionParent', PyJs_getFunctionParent_2162_) + @Js + def PyJs_getBlockParent_2163_(this, arguments, var=var): + var = Scope({u'this':this, u'getBlockParent':PyJs_getBlockParent_2163_, u'arguments':arguments}, var) + var.registers([u'scope']) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'path').callprop(u'isBlockParent'): + return var.get(u'scope') + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"We couldn't find a BlockStatement, For, Switch, Function, Loop or Program..."))) + raise PyJsTempException + PyJs_getBlockParent_2163_._set_name(u'getBlockParent') + var.get(u'Scope').get(u'prototype').put(u'getBlockParent', PyJs_getBlockParent_2163_) + @Js + def PyJs_getAllBindings_2164_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAllBindings':PyJs_getAllBindings_2164_}, var) + var.registers([u'scope', u'ids']) + var.put(u'ids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + var.put(u'scope', var.get(u"this")) + while 1: + PyJsComma(Js(0.0),var.get(u'_defaults2').get(u'default'))(var.get(u'ids'), var.get(u'scope').get(u'bindings')) + var.put(u'scope', var.get(u'scope').get(u'parent')) + if not var.get(u'scope'): + break + return var.get(u'ids') + PyJs_getAllBindings_2164_._set_name(u'getAllBindings') + var.get(u'Scope').get(u'prototype').put(u'getAllBindings', PyJs_getAllBindings_2164_) + @Js + def PyJs_getAllBindingsOfKind_2165_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'getAllBindingsOfKind':PyJs_getAllBindingsOfKind_2165_}, var) + var.registers([u'kind', u'name', u'binding', u'ids', u'_iterator19', u'_ref19', u'scope', u'_i19', u'_isArray19']) + var.put(u'ids', PyJsComma(Js(0.0),var.get(u'_create2').get(u'default'))(var.get(u"null"))) + #for JS loop + var.put(u'_iterator19', var.get(u'arguments')) + var.put(u'_isArray19', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator19'))) + var.put(u'_i19', Js(0.0)) + var.put(u'_iterator19', (var.get(u'_iterator19') if var.get(u'_isArray19') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator19')))) + while 1: + pass + if var.get(u'_isArray19'): + if (var.get(u'_i19')>=var.get(u'_iterator19').get(u'length')): + break + var.put(u'_ref19', var.get(u'_iterator19').get((var.put(u'_i19',Js(var.get(u'_i19').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i19', var.get(u'_iterator19').callprop(u'next')) + if var.get(u'_i19').get(u'done'): + break + var.put(u'_ref19', var.get(u'_i19').get(u'value')) + var.put(u'kind', var.get(u'_ref19')) + var.put(u'scope', var.get(u"this")) + while 1: + for PyJsTemp in var.get(u'scope').get(u'bindings'): + var.put(u'name', PyJsTemp) + var.put(u'binding', var.get(u'scope').get(u'bindings').get(var.get(u'name'))) + if PyJsStrictEq(var.get(u'binding').get(u'kind'),var.get(u'kind')): + var.get(u'ids').put(var.get(u'name'), var.get(u'binding')) + var.put(u'scope', var.get(u'scope').get(u'parent')) + if not var.get(u'scope'): + break + + return var.get(u'ids') + PyJs_getAllBindingsOfKind_2165_._set_name(u'getAllBindingsOfKind') + var.get(u'Scope').get(u'prototype').put(u'getAllBindingsOfKind', PyJs_getAllBindingsOfKind_2165_) + @Js + def PyJs_bindingIdentifierEquals_2166_(name, node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'bindingIdentifierEquals':PyJs_bindingIdentifierEquals_2166_, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'name']) + return PyJsStrictEq(var.get(u"this").callprop(u'getBindingIdentifier', var.get(u'name')),var.get(u'node')) + PyJs_bindingIdentifierEquals_2166_._set_name(u'bindingIdentifierEquals') + var.get(u'Scope').get(u'prototype').put(u'bindingIdentifierEquals', PyJs_bindingIdentifierEquals_2166_) + @Js + def PyJs_warnOnFlowBinding_2167_(binding, this, arguments, var=var): + var = Scope({u'this':this, u'binding':binding, u'arguments':arguments, u'warnOnFlowBinding':PyJs_warnOnFlowBinding_2167_}, var) + var.registers([u'binding']) + if ((PyJsStrictEq(var.get(u'_crawlCallsCount'),Js(0.0)) and var.get(u'binding')) and var.get(u'binding').get(u'path').callprop(u'isFlow')): + var.get(u'console').callprop(u'warn', Js(u'\n You or one of the Babel plugins you are using are using Flow declarations as bindings.\n Support for this will be removed in version 6.8. To find out the caller, grep for this\n message and change it to a `console.trace()`.\n ')) + return var.get(u'binding') + PyJs_warnOnFlowBinding_2167_._set_name(u'warnOnFlowBinding') + var.get(u'Scope').get(u'prototype').put(u'warnOnFlowBinding', PyJs_warnOnFlowBinding_2167_) + @Js + def PyJs_getBinding_2168_(name, this, arguments, var=var): + var = Scope({u'this':this, u'getBinding':PyJs_getBinding_2168_, u'name':name, u'arguments':arguments}, var) + var.registers([u'scope', u'binding', u'name']) + var.put(u'scope', var.get(u"this")) + while 1: + var.put(u'binding', var.get(u'scope').callprop(u'getOwnBinding', var.get(u'name'))) + if var.get(u'binding'): + return var.get(u"this").callprop(u'warnOnFlowBinding', var.get(u'binding')) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_getBinding_2168_._set_name(u'getBinding') + var.get(u'Scope').get(u'prototype').put(u'getBinding', PyJs_getBinding_2168_) + @Js + def PyJs_getOwnBinding_2169_(name, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnBinding':PyJs_getOwnBinding_2169_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").callprop(u'warnOnFlowBinding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + PyJs_getOwnBinding_2169_._set_name(u'getOwnBinding') + var.get(u'Scope').get(u'prototype').put(u'getOwnBinding', PyJs_getOwnBinding_2169_) + @Js + def PyJs_getBindingIdentifier_2170_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'getBindingIdentifier':PyJs_getBindingIdentifier_2170_, u'arguments':arguments}, var) + var.registers([u'info', u'name']) + var.put(u'info', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + return (var.get(u'info') and var.get(u'info').get(u'identifier')) + PyJs_getBindingIdentifier_2170_._set_name(u'getBindingIdentifier') + var.get(u'Scope').get(u'prototype').put(u'getBindingIdentifier', PyJs_getBindingIdentifier_2170_) + @Js + def PyJs_getOwnBindingIdentifier_2171_(name, this, arguments, var=var): + var = Scope({u'this':this, u'getOwnBindingIdentifier':PyJs_getOwnBindingIdentifier_2171_, u'name':name, u'arguments':arguments}, var) + var.registers([u'binding', u'name']) + var.put(u'binding', var.get(u"this").get(u'bindings').get(var.get(u'name'))) + return (var.get(u'binding') and var.get(u'binding').get(u'identifier')) + PyJs_getOwnBindingIdentifier_2171_._set_name(u'getOwnBindingIdentifier') + var.get(u'Scope').get(u'prototype').put(u'getOwnBindingIdentifier', PyJs_getOwnBindingIdentifier_2171_) + @Js + def PyJs_hasOwnBinding_2172_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'hasOwnBinding':PyJs_hasOwnBinding_2172_, u'arguments':arguments}, var) + var.registers([u'name']) + return var.get(u"this").callprop(u'getOwnBinding', var.get(u'name')).neg().neg() + PyJs_hasOwnBinding_2172_._set_name(u'hasOwnBinding') + var.get(u'Scope').get(u'prototype').put(u'hasOwnBinding', PyJs_hasOwnBinding_2172_) + @Js + def PyJs_hasBinding_2173_(name, noGlobals, this, arguments, var=var): + var = Scope({u'this':this, u'hasBinding':PyJs_hasBinding_2173_, u'name':name, u'noGlobals':noGlobals, u'arguments':arguments}, var) + var.registers([u'name', u'noGlobals']) + if var.get(u'name').neg(): + return Js(False) + if var.get(u"this").callprop(u'hasOwnBinding', var.get(u'name')): + return var.get(u'true') + if var.get(u"this").callprop(u'parentHasBinding', var.get(u'name'), var.get(u'noGlobals')): + return var.get(u'true') + if var.get(u"this").callprop(u'hasUid', var.get(u'name')): + return var.get(u'true') + if (var.get(u'noGlobals').neg() and PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'Scope').get(u'globals'), var.get(u'name'))): + return var.get(u'true') + if (var.get(u'noGlobals').neg() and PyJsComma(Js(0.0),var.get(u'_includes2').get(u'default'))(var.get(u'Scope').get(u'contextVariables'), var.get(u'name'))): + return var.get(u'true') + return Js(False) + PyJs_hasBinding_2173_._set_name(u'hasBinding') + var.get(u'Scope').get(u'prototype').put(u'hasBinding', PyJs_hasBinding_2173_) + @Js + def PyJs_parentHasBinding_2174_(name, noGlobals, this, arguments, var=var): + var = Scope({u'this':this, u'parentHasBinding':PyJs_parentHasBinding_2174_, u'name':name, u'noGlobals':noGlobals, u'arguments':arguments}, var) + var.registers([u'name', u'noGlobals']) + return (var.get(u"this").get(u'parent') and var.get(u"this").get(u'parent').callprop(u'hasBinding', var.get(u'name'), var.get(u'noGlobals'))) + PyJs_parentHasBinding_2174_._set_name(u'parentHasBinding') + var.get(u'Scope').get(u'prototype').put(u'parentHasBinding', PyJs_parentHasBinding_2174_) + @Js + def PyJs_moveBindingTo_2175_(name, scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'moveBindingTo':PyJs_moveBindingTo_2175_, u'name':name, u'arguments':arguments}, var) + var.registers([u'info', u'scope', u'name']) + var.put(u'info', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + if var.get(u'info'): + var.get(u'info').get(u'scope').callprop(u'removeOwnBinding', var.get(u'name')) + var.get(u'info').put(u'scope', var.get(u'scope')) + var.get(u'scope').get(u'bindings').put(var.get(u'name'), var.get(u'info')) + PyJs_moveBindingTo_2175_._set_name(u'moveBindingTo') + var.get(u'Scope').get(u'prototype').put(u'moveBindingTo', PyJs_moveBindingTo_2175_) + @Js + def PyJs_removeOwnBinding_2176_(name, this, arguments, var=var): + var = Scope({u'this':this, u'removeOwnBinding':PyJs_removeOwnBinding_2176_, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + var.get(u"this").get(u'bindings').delete(var.get(u'name')) + PyJs_removeOwnBinding_2176_._set_name(u'removeOwnBinding') + var.get(u'Scope').get(u'prototype').put(u'removeOwnBinding', PyJs_removeOwnBinding_2176_) + @Js + def PyJs_removeBinding_2177_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'removeBinding':PyJs_removeBinding_2177_, u'arguments':arguments}, var) + var.registers([u'info', u'scope', u'name']) + var.put(u'info', var.get(u"this").callprop(u'getBinding', var.get(u'name'))) + if var.get(u'info'): + var.get(u'info').get(u'scope').callprop(u'removeOwnBinding', var.get(u'name')) + var.put(u'scope', var.get(u"this")) + while 1: + if var.get(u'scope').get(u'uids').get(var.get(u'name')): + var.get(u'scope').get(u'uids').put(var.get(u'name'), Js(False)) + if not var.put(u'scope', var.get(u'scope').get(u'parent')): + break + PyJs_removeBinding_2177_._set_name(u'removeBinding') + var.get(u'Scope').get(u'prototype').put(u'removeBinding', PyJs_removeBinding_2177_) + return var.get(u'Scope') + PyJs_anonymous_2120_._set_name(u'anonymous') + var.put(u'Scope', PyJs_anonymous_2120_()) + var.get(u'Scope').put(u'globals', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'_globals2').get(u'default').get(u'builtin'))) + var.get(u'Scope').put(u'contextVariables', Js([Js(u'arguments'), Js(u'undefined'), Js(u'Infinity'), Js(u'NaN')])) + var.get(u'exports').put(u'default', var.get(u'Scope')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2103_._set_name(u'anonymous') +PyJs_Object_2178_ = Js({u'../cache':Js(222.0),u'../index':Js(225.0),u'./binding':Js(243.0),u'./lib/renamer':Js(245.0),u'babel-messages':Js(57.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/map':Js(98.0),u'babel-runtime/core-js/object/create':Js(101.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0),u'globals':Js(278.0),u'lodash/defaults':Js(442.0),u'lodash/includes':Js(456.0),u'lodash/repeat':Js(483.0)}) +@Js +def PyJs_anonymous_2179_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'_binding2', u'exports', u'_interopRequireWildcard', u'Renamer', u'require', u'_babelTypes', u'renameVisitor', u'module', u't', u'_binding', u'_interopRequireDefault', u'_classCallCheck3', u'_classCallCheck2']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2181_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2181_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2180_ = Js({}) + var.put(u'newObj', PyJs_Object_2180_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_classCallCheck2', var.get(u'require')(Js(u'babel-runtime/helpers/classCallCheck'))) + var.put(u'_classCallCheck3', var.get(u'_interopRequireDefault')(var.get(u'_classCallCheck2'))) + var.put(u'_binding', var.get(u'require')(Js(u'../binding'))) + var.put(u'_binding2', var.get(u'_interopRequireDefault')(var.get(u'_binding'))) + var.put(u'_babelTypes', var.get(u'require')(Js(u'babel-types'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_babelTypes'))) + pass + pass + @Js + def PyJs_ReferencedIdentifier_2183_(_ref, state, this, arguments, var=var): + var = Scope({u'this':this, u'_ref':_ref, u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2183_, u'state':state, u'arguments':arguments}, var) + var.registers([u'node', u'_ref', u'state']) + var.put(u'node', var.get(u'_ref').get(u'node')) + if PyJsStrictEq(var.get(u'node').get(u'name'),var.get(u'state').get(u'oldName')): + var.get(u'node').put(u'name', var.get(u'state').get(u'newName')) + PyJs_ReferencedIdentifier_2183_._set_name(u'ReferencedIdentifier') + @Js + def PyJs_Scope_2184_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'arguments':arguments, u'Scope':PyJs_Scope_2184_}, var) + var.registers([u'path', u'state']) + if var.get(u'path').get(u'scope').callprop(u'bindingIdentifierEquals', var.get(u'state').get(u'oldName'), var.get(u'state').get(u'binding').get(u'identifier')).neg(): + var.get(u'path').callprop(u'skip') + PyJs_Scope_2184_._set_name(u'Scope') + @Js + def PyJs_AssignmentExpressionDeclaration_2185_(path, state, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'state':state, u'AssignmentExpressionDeclaration':PyJs_AssignmentExpressionDeclaration_2185_, u'arguments':arguments}, var) + var.registers([u'path', u'state', u'ids', u'name']) + var.put(u'ids', var.get(u'path').callprop(u'getOuterBindingIdentifiers')) + for PyJsTemp in var.get(u'ids'): + var.put(u'name', PyJsTemp) + if PyJsStrictEq(var.get(u'name'),var.get(u'state').get(u'oldName')): + var.get(u'ids').get(var.get(u'name')).put(u'name', var.get(u'state').get(u'newName')) + PyJs_AssignmentExpressionDeclaration_2185_._set_name(u'AssignmentExpressionDeclaration') + PyJs_Object_2182_ = Js({u'ReferencedIdentifier':PyJs_ReferencedIdentifier_2183_,u'Scope':PyJs_Scope_2184_,u'AssignmentExpression|Declaration':PyJs_AssignmentExpressionDeclaration_2185_}) + var.put(u'renameVisitor', PyJs_Object_2182_) + @Js + def PyJs_anonymous_2186_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Renamer']) + @Js + def PyJsHoisted_Renamer_(binding, oldName, newName, this, arguments, var=var): + var = Scope({u'newName':newName, u'this':this, u'binding':binding, u'oldName':oldName, u'arguments':arguments}, var) + var.registers([u'newName', u'binding', u'oldName']) + PyJsComma(Js(0.0),var.get(u'_classCallCheck3').get(u'default'))(var.get(u"this"), var.get(u'Renamer')) + var.get(u"this").put(u'newName', var.get(u'newName')) + var.get(u"this").put(u'oldName', var.get(u'oldName')) + var.get(u"this").put(u'binding', var.get(u'binding')) + PyJsHoisted_Renamer_.func_name = u'Renamer' + var.put(u'Renamer', PyJsHoisted_Renamer_) + pass + @Js + def PyJs_maybeConvertFromExportDeclaration_2187_(parentDeclar, this, arguments, var=var): + var = Scope({u'this':this, u'parentDeclar':parentDeclar, u'maybeConvertFromExportDeclaration':PyJs_maybeConvertFromExportDeclaration_2187_, u'arguments':arguments}, var) + var.registers([u'specifiers', u'exportDeclar', u'name', u'bindingIdentifiers', u'exportedName', u'parentDeclar', u'localName', u'aliasDeclar', u'isDefault']) + var.put(u'exportDeclar', (var.get(u'parentDeclar').get(u'parentPath').callprop(u'isExportDeclaration') and var.get(u'parentDeclar').get(u'parentPath'))) + if var.get(u'exportDeclar').neg(): + return var.get('undefined') + var.put(u'isDefault', var.get(u'exportDeclar').callprop(u'isExportDefaultDeclaration')) + if ((var.get(u'isDefault') and (var.get(u'parentDeclar').callprop(u'isFunctionDeclaration') or var.get(u'parentDeclar').callprop(u'isClassDeclaration'))) and var.get(u'parentDeclar').get(u'node').get(u'id').neg()): + var.get(u'parentDeclar').get(u'node').put(u'id', var.get(u'parentDeclar').get(u'scope').callprop(u'generateUidIdentifier', Js(u'default'))) + var.put(u'bindingIdentifiers', var.get(u'parentDeclar').callprop(u'getOuterBindingIdentifiers')) + var.put(u'specifiers', Js([])) + for PyJsTemp in var.get(u'bindingIdentifiers'): + var.put(u'name', PyJsTemp) + var.put(u'localName', (var.get(u"this").get(u'newName') if PyJsStrictEq(var.get(u'name'),var.get(u"this").get(u'oldName')) else var.get(u'name'))) + var.put(u'exportedName', (Js(u'default') if var.get(u'isDefault') else var.get(u'name'))) + var.get(u'specifiers').callprop(u'push', var.get(u't').callprop(u'exportSpecifier', var.get(u't').callprop(u'identifier', var.get(u'localName')), var.get(u't').callprop(u'identifier', var.get(u'exportedName')))) + if var.get(u'specifiers').get(u'length'): + var.put(u'aliasDeclar', var.get(u't').callprop(u'exportNamedDeclaration', var.get(u"null"), var.get(u'specifiers'))) + if var.get(u'parentDeclar').callprop(u'isFunctionDeclaration'): + var.get(u'aliasDeclar').put(u'_blockHoist', Js(3.0)) + var.get(u'exportDeclar').callprop(u'insertAfter', var.get(u'aliasDeclar')) + var.get(u'exportDeclar').callprop(u'replaceWith', var.get(u'parentDeclar').get(u'node')) + PyJs_maybeConvertFromExportDeclaration_2187_._set_name(u'maybeConvertFromExportDeclaration') + var.get(u'Renamer').get(u'prototype').put(u'maybeConvertFromExportDeclaration', PyJs_maybeConvertFromExportDeclaration_2187_) + @Js + def PyJs_maybeConvertFromClassFunctionDeclaration_2188_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'maybeConvertFromClassFunctionDeclaration':PyJs_maybeConvertFromClassFunctionDeclaration_2188_}, var) + var.registers([u'path']) + return var.get('undefined') + if (var.get(u'path').callprop(u'isFunctionDeclaration').neg() and var.get(u'path').callprop(u'isClassDeclaration').neg()): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'binding').get(u'kind'),Js(u'hoisted')): + return var.get('undefined') + var.get(u'path').get(u'node').put(u'id', var.get(u't').callprop(u'identifier', var.get(u"this").get(u'oldName'))) + var.get(u'path').get(u'node').put(u'_blockHoist', Js(3.0)) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'variableDeclaration', Js(u'let'), Js([var.get(u't').callprop(u'variableDeclarator', var.get(u't').callprop(u'identifier', var.get(u"this").get(u'newName')), var.get(u't').callprop(u'toExpression', var.get(u'path').get(u'node')))]))) + PyJs_maybeConvertFromClassFunctionDeclaration_2188_._set_name(u'maybeConvertFromClassFunctionDeclaration') + var.get(u'Renamer').get(u'prototype').put(u'maybeConvertFromClassFunctionDeclaration', PyJs_maybeConvertFromClassFunctionDeclaration_2188_) + @Js + def PyJs_maybeConvertFromClassFunctionExpression_2189_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'maybeConvertFromClassFunctionExpression':PyJs_maybeConvertFromClassFunctionExpression_2189_}, var) + var.registers([u'path']) + return var.get('undefined') + if (var.get(u'path').callprop(u'isFunctionExpression').neg() and var.get(u'path').callprop(u'isClassExpression').neg()): + return var.get('undefined') + if PyJsStrictNeq(var.get(u"this").get(u'binding').get(u'kind'),Js(u'local')): + return var.get('undefined') + var.get(u'path').get(u'node').put(u'id', var.get(u't').callprop(u'identifier', var.get(u"this").get(u'oldName'))) + PyJs_Object_2190_ = Js({u'id':var.get(u't').callprop(u'identifier', var.get(u"this").get(u'newName'))}) + var.get(u"this").get(u'binding').get(u'scope').get(u'parent').callprop(u'push', PyJs_Object_2190_) + var.get(u'path').callprop(u'replaceWith', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u't').callprop(u'identifier', var.get(u"this").get(u'newName')), var.get(u'path').get(u'node'))) + PyJs_maybeConvertFromClassFunctionExpression_2189_._set_name(u'maybeConvertFromClassFunctionExpression') + var.get(u'Renamer').get(u'prototype').put(u'maybeConvertFromClassFunctionExpression', PyJs_maybeConvertFromClassFunctionExpression_2189_) + @Js + def PyJs_rename_2191_(block, this, arguments, var=var): + var = Scope({u'this':this, u'rename':PyJs_rename_2191_, u'arguments':arguments, u'block':block}, var) + var.registers([u'newName', u'binding', u'oldName', u'parentDeclar', u'scope', u'path', u'block']) + var.put(u'binding', var.get(u"this").get(u'binding')) + var.put(u'oldName', var.get(u"this").get(u'oldName')) + var.put(u'newName', var.get(u"this").get(u'newName')) + var.put(u'scope', var.get(u'binding').get(u'scope')) + var.put(u'path', var.get(u'binding').get(u'path')) + @Js + def PyJs_anonymous_2192_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return (var.get(u'path').callprop(u'isDeclaration') or var.get(u'path').callprop(u'isFunctionExpression')) + PyJs_anonymous_2192_._set_name(u'anonymous') + var.put(u'parentDeclar', var.get(u'path').callprop(u'find', PyJs_anonymous_2192_)) + if var.get(u'parentDeclar'): + var.get(u"this").callprop(u'maybeConvertFromExportDeclaration', var.get(u'parentDeclar')) + var.get(u'scope').callprop(u'traverse', (var.get(u'block') or var.get(u'scope').get(u'block')), var.get(u'renameVisitor'), var.get(u"this")) + if var.get(u'block').neg(): + var.get(u'scope').callprop(u'removeOwnBinding', var.get(u'oldName')) + var.get(u'scope').get(u'bindings').put(var.get(u'newName'), var.get(u'binding')) + var.get(u"this").get(u'binding').get(u'identifier').put(u'name', var.get(u'newName')) + if PyJsStrictEq(var.get(u'binding').get(u'type'),Js(u'hoisted')): + pass + if var.get(u'parentDeclar'): + var.get(u"this").callprop(u'maybeConvertFromClassFunctionDeclaration', var.get(u'parentDeclar')) + var.get(u"this").callprop(u'maybeConvertFromClassFunctionExpression', var.get(u'parentDeclar')) + PyJs_rename_2191_._set_name(u'rename') + var.get(u'Renamer').get(u'prototype').put(u'rename', PyJs_rename_2191_) + return var.get(u'Renamer') + PyJs_anonymous_2186_._set_name(u'anonymous') + var.put(u'Renamer', PyJs_anonymous_2186_()) + var.get(u'exports').put(u'default', var.get(u'Renamer')) + var.get(u'module').put(u'exports', var.get(u'exports').get(u'default')) +PyJs_anonymous_2179_._set_name(u'anonymous') +PyJs_Object_2193_ = Js({u'../binding':Js(243.0),u'babel-runtime/helpers/classCallCheck':Js(110.0),u'babel-types':Js(258.0)}) +@Js +def PyJs_anonymous_2194_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'module', u'_clone', u'_virtualTypes', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'virtualTypes', u'_typeof2', u'_typeof3', u'shouldIgnoreKey', u'validateVisitorMethods', u'verify', u'_keys', u'wrapWithStateOrWrapper', u'_babelMessages', u'exports', u'_interopRequireWildcard', u'mergePair', u'_babelTypes', u'_keys2', u'ensureCallbackArrays', u'ensureEntranceObjects', u'require', u'messages', u'wrapCheck', u'_clone2', u'explode', u'merge', u't']) + @Js + def PyJsHoisted_mergePair_(dest, src, this, arguments, var=var): + var = Scope({u'dest':dest, u'src':src, u'this':this, u'arguments':arguments}, var) + var.registers([u'dest', u'src', u'key']) + for PyJsTemp in var.get(u'src'): + var.put(u'key', PyJsTemp) + var.get(u'dest').put(var.get(u'key'), Js([]).callprop(u'concat', (var.get(u'dest').get(var.get(u'key')) or Js([])), var.get(u'src').get(var.get(u'key')))) + PyJsHoisted_mergePair_.func_name = u'mergePair' + var.put(u'mergePair', PyJsHoisted_mergePair_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2195_ = Js({}) + var.put(u'newObj', PyJs_Object_2195_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_shouldIgnoreKey_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'key'),Js(u'enter')) or PyJsStrictEq(var.get(u'key'),Js(u'exit'))) or PyJsStrictEq(var.get(u'key'),Js(u'shouldSkip'))): + return var.get(u'true') + if ((PyJsStrictEq(var.get(u'key'),Js(u'blacklist')) or PyJsStrictEq(var.get(u'key'),Js(u'noScope'))) or PyJsStrictEq(var.get(u'key'),Js(u'skipKeys'))): + return var.get(u'true') + return Js(False) + PyJsHoisted_shouldIgnoreKey_.func_name = u'shouldIgnoreKey' + var.put(u'shouldIgnoreKey', PyJsHoisted_shouldIgnoreKey_) + @Js + def PyJsHoisted_validateVisitorMethods_(path, val, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments, u'val':val}, var) + var.registers([u'_isArray5', u'fns', u'val', u'_ref5', u'_iterator5', u'path', u'_i5', u'fn']) + var.put(u'fns', Js([]).callprop(u'concat', var.get(u'val'))) + #for JS loop + var.put(u'_iterator5', var.get(u'fns')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator5')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'fn', var.get(u'_ref5')) + if PyJsStrictNeq(var.get(u'fn',throw=False).typeof(),Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((Js(u'Non-function found defined in ')+var.get(u'path'))+Js(u' with type '))+(Js(u'undefined') if PyJsStrictEq(var.get(u'fn',throw=False).typeof(),Js(u'undefined')) else PyJsComma(Js(0.0),var.get(u'_typeof3').get(u'default'))(var.get(u'fn')))))) + raise PyJsTempException + + PyJsHoisted_validateVisitorMethods_.func_name = u'validateVisitorMethods' + var.put(u'validateVisitorMethods', PyJsHoisted_validateVisitorMethods_) + @Js + def PyJsHoisted_verify_(visitor, this, arguments, var=var): + var = Scope({u'this':this, u'visitor':visitor, u'arguments':arguments}, var) + var.registers([u'visitors', u'nodeType', u'visitor', u'visitorKey']) + if var.get(u'visitor').get(u'_verified'): + return var.get('undefined') + if PyJsStrictEq(var.get(u'visitor',throw=False).typeof(),Js(u'function')): + PyJsTempException = JsToPyException(var.get(u'Error').create(var.get(u'messages').callprop(u'get', Js(u'traverseVerifyRootFunction')))) + raise PyJsTempException + for PyJsTemp in var.get(u'visitor'): + var.put(u'nodeType', PyJsTemp) + if (PyJsStrictEq(var.get(u'nodeType'),Js(u'enter')) or PyJsStrictEq(var.get(u'nodeType'),Js(u'exit'))): + var.get(u'validateVisitorMethods')(var.get(u'nodeType'), var.get(u'visitor').get(var.get(u'nodeType'))) + if var.get(u'shouldIgnoreKey')(var.get(u'nodeType')): + continue + if (var.get(u't').get(u'TYPES').callprop(u'indexOf', var.get(u'nodeType'))=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'part', var.get(u'_ref')) + var.get(u'visitor').put(var.get(u'part'), var.get(u'fns')) + + var.get(u'verify')(var.get(u'visitor')) + var.get(u'visitor').delete(u'__esModule') + var.get(u'ensureEntranceObjects')(var.get(u'visitor')) + var.get(u'ensureCallbackArrays')(var.get(u'visitor')) + #for JS loop + var.put(u'_iterator2', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'visitor'))) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_nodeType3', var.get(u'_ref2')) + if var.get(u'shouldIgnoreKey')(var.get(u'_nodeType3')): + continue + var.put(u'wrapper', var.get(u'virtualTypes').get(var.get(u'_nodeType3'))) + if var.get(u'wrapper').neg(): + continue + var.put(u'_fns2', var.get(u'visitor').get(var.get(u'_nodeType3'))) + for PyJsTemp in var.get(u'_fns2'): + var.put(u'type', PyJsTemp) + var.get(u'_fns2').put(var.get(u'type'), var.get(u'wrapCheck')(var.get(u'wrapper'), var.get(u'_fns2').get(var.get(u'type')))) + var.get(u'visitor').delete(var.get(u'_nodeType3')) + if var.get(u'wrapper').get(u'types'): + #for JS loop + var.put(u'_iterator4', var.get(u'wrapper').get(u'types')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'_type', var.get(u'_ref4')) + if var.get(u'visitor').get(var.get(u'_type')): + var.get(u'mergePair')(var.get(u'visitor').get(var.get(u'_type')), var.get(u'_fns2')) + else: + var.get(u'visitor').put(var.get(u'_type'), var.get(u'_fns2')) + + else: + var.get(u'mergePair')(var.get(u'visitor'), var.get(u'_fns2')) + + for PyJsTemp in var.get(u'visitor'): + var.put(u'_nodeType', PyJsTemp) + if var.get(u'shouldIgnoreKey')(var.get(u'_nodeType')): + continue + var.put(u'_fns', var.get(u'visitor').get(var.get(u'_nodeType'))) + var.put(u'aliases', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'_nodeType'))) + var.put(u'deprecratedKey', var.get(u't').get(u'DEPRECATED_KEYS').get(var.get(u'_nodeType'))) + if var.get(u'deprecratedKey'): + var.get(u'console').callprop(u'trace', (((Js(u'Visitor defined for ')+var.get(u'_nodeType'))+Js(u' but it has been renamed to '))+var.get(u'deprecratedKey'))) + var.put(u'aliases', Js([var.get(u'deprecratedKey')])) + if var.get(u'aliases').neg(): + continue + var.get(u'visitor').delete(var.get(u'_nodeType')) + #for JS loop + var.put(u'_iterator3', var.get(u'aliases')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'alias', var.get(u'_ref3')) + var.put(u'existing', var.get(u'visitor').get(var.get(u'alias'))) + if var.get(u'existing'): + var.get(u'mergePair')(var.get(u'existing'), var.get(u'_fns')) + else: + var.get(u'visitor').put(var.get(u'alias'), PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'_fns'))) + + for PyJsTemp in var.get(u'visitor'): + var.put(u'_nodeType2', PyJsTemp) + if var.get(u'shouldIgnoreKey')(var.get(u'_nodeType2')): + continue + var.get(u'ensureCallbackArrays')(var.get(u'visitor').get(var.get(u'_nodeType2'))) + return var.get(u'visitor') + PyJsHoisted_explode_.func_name = u'explode' + var.put(u'explode', PyJsHoisted_explode_) + @Js + def PyJsHoisted_merge_(visitors, this, arguments, var=var): + var = Scope({u'this':this, u'visitors':visitors, u'arguments':arguments}, var) + var.registers([u'visitorType', u'i', u'visitor', u'rootVisitor', u'wrapper', u'states', u'visitors', u'state', u'nodeVisitor', u'type']) + var.put(u'states', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js([]))) + var.put(u'wrapper', var.get(u'arguments').get(u'2')) + PyJs_Object_2197_ = Js({}) + var.put(u'rootVisitor', PyJs_Object_2197_) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')'), Js(u'<'), Js(u'>='), Js(u'<=')]))) + var.put(u'EQUALITY_BINARY_OPERATORS', var.get(u'exports').put(u'EQUALITY_BINARY_OPERATORS', Js([Js(u'=='), Js(u'==='), Js(u'!='), Js(u'!==')]))) + var.put(u'COMPARISON_BINARY_OPERATORS', var.get(u'exports').put(u'COMPARISON_BINARY_OPERATORS', Js([]).callprop(u'concat', var.get(u'EQUALITY_BINARY_OPERATORS'), Js([Js(u'in'), Js(u'instanceof')])))) + var.put(u'BOOLEAN_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_BINARY_OPERATORS', Js([]).callprop(u'concat', var.get(u'COMPARISON_BINARY_OPERATORS'), var.get(u'BOOLEAN_NUMBER_BINARY_OPERATORS')))) + var.put(u'NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'NUMBER_BINARY_OPERATORS', Js([Js(u'-'), Js(u'/'), Js(u'%'), Js(u'*'), Js(u'**'), Js(u'&'), Js(u'|'), Js(u'>>'), Js(u'>>>'), Js(u'<<'), Js(u'^')]))) + var.put(u'BINARY_OPERATORS', var.get(u'exports').put(u'BINARY_OPERATORS', Js([Js(u'+')]).callprop(u'concat', var.get(u'NUMBER_BINARY_OPERATORS'), var.get(u'BOOLEAN_BINARY_OPERATORS')))) + var.put(u'BOOLEAN_UNARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_UNARY_OPERATORS', Js([Js(u'delete'), Js(u'!')]))) + var.put(u'NUMBER_UNARY_OPERATORS', var.get(u'exports').put(u'NUMBER_UNARY_OPERATORS', Js([Js(u'+'), Js(u'-'), Js(u'++'), Js(u'--'), Js(u'~')]))) + var.put(u'STRING_UNARY_OPERATORS', var.get(u'exports').put(u'STRING_UNARY_OPERATORS', Js([Js(u'typeof')]))) + var.put(u'UNARY_OPERATORS', var.get(u'exports').put(u'UNARY_OPERATORS', Js([Js(u'void')]).callprop(u'concat', var.get(u'BOOLEAN_UNARY_OPERATORS'), var.get(u'NUMBER_UNARY_OPERATORS'), var.get(u'STRING_UNARY_OPERATORS')))) + PyJs_Object_2211_ = Js({u'optional':Js([Js(u'typeAnnotation'), Js(u'typeParameters'), Js(u'returnType')]),u'force':Js([Js(u'start'), Js(u'loc'), Js(u'end')])}) + var.put(u'INHERIT_KEYS', var.get(u'exports').put(u'INHERIT_KEYS', PyJs_Object_2211_)) + var.put(u'BLOCK_SCOPED_SYMBOL', var.get(u'exports').put(u'BLOCK_SCOPED_SYMBOL', PyJsComma(Js(0.0),var.get(u'_for2').get(u'default'))(Js(u'var used to be block scoped')))) + var.put(u'NOT_LOCAL_BINDING', var.get(u'exports').put(u'NOT_LOCAL_BINDING', PyJsComma(Js(0.0),var.get(u'_for2').get(u'default'))(Js(u'should not be considered a local binding')))) +PyJs_anonymous_2207_._set_name(u'anonymous') +PyJs_Object_2212_ = Js({u'babel-runtime/core-js/symbol/for':Js(106.0)}) +@Js +def PyJs_anonymous_2213_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toComputedKey', u'toBindingIdentifierName', u'module', u'_isString2', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'toKeyAlias', u'_isNumber', u'toSequenceExpression', u'_isRegExp2', u'_isRegExp', u'toIdentifier', u't', u'_isNumber2', u'exports', u'_stringify2', u'_interopRequireWildcard', u'toExpression', u'_maxSafeInteger2', u'_isPlainObject2', u'_index', u'_isString', u'require', u'toBlock', u'toStatement', u'_stringify', u'_maxSafeInteger', u'_isPlainObject', u'valueToNode']) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2214_ = Js({}) + var.put(u'newObj', PyJs_Object_2214_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_toSequenceExpression_(nodes, scope, this, arguments, var=var): + var = Scope({u'this':this, u'scope':scope, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'convert', u'bailed', u'i', u'declars', u'result', u'scope', u'nodes']) + @Js + def PyJsHoisted_convert_(nodes, this, arguments, var=var): + var = Scope({u'this':this, u'nodes':nodes, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'_isArray2', u'ensureLastUndefined', u'alternate', u'nodes', u'_i2', u'_ref2', u'key', u'exprs', u'declar', u'_i', u'_ref', u'consequent', u'bindings', u'_iterator2']) + var.put(u'ensureLastUndefined', Js(False)) + var.put(u'exprs', Js([])) + #for JS loop + var.put(u'_iterator', var.get(u'nodes')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'node', var.get(u'_ref')) + if var.get(u't').callprop(u'isExpression', var.get(u'node')): + var.get(u'exprs').callprop(u'push', var.get(u'node')) + else: + if var.get(u't').callprop(u'isExpressionStatement', var.get(u'node')): + var.get(u'exprs').callprop(u'push', var.get(u'node').get(u'expression')) + else: + if var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')): + if PyJsStrictNeq(var.get(u'node').get(u'kind'),Js(u'var')): + return var.put(u'bailed', var.get(u'true')) + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'declarations')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'declar', var.get(u'_ref2')) + var.put(u'bindings', var.get(u't').callprop(u'getBindingIdentifiers', var.get(u'declar'))) + for PyJsTemp in var.get(u'bindings'): + var.put(u'key', PyJsTemp) + PyJs_Object_2216_ = Js({u'kind':var.get(u'node').get(u'kind'),u'id':var.get(u'bindings').get(var.get(u'key'))}) + var.get(u'declars').callprop(u'push', PyJs_Object_2216_) + if var.get(u'declar').get(u'init'): + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'assignmentExpression', Js(u'='), var.get(u'declar').get(u'id'), var.get(u'declar').get(u'init'))) + + var.put(u'ensureLastUndefined', var.get(u'true')) + continue + else: + if var.get(u't').callprop(u'isIfStatement', var.get(u'node')): + var.put(u'consequent', (var.get(u'convert')(Js([var.get(u'node').get(u'consequent')])) if var.get(u'node').get(u'consequent') else var.get(u'scope').callprop(u'buildUndefinedNode'))) + var.put(u'alternate', (var.get(u'convert')(Js([var.get(u'node').get(u'alternate')])) if var.get(u'node').get(u'alternate') else var.get(u'scope').callprop(u'buildUndefinedNode'))) + if (var.get(u'consequent').neg() or var.get(u'alternate').neg()): + return var.put(u'bailed', var.get(u'true')) + var.get(u'exprs').callprop(u'push', var.get(u't').callprop(u'conditionalExpression', var.get(u'node').get(u'test'), var.get(u'consequent'), var.get(u'alternate'))) + else: + if var.get(u't').callprop(u'isBlockStatement', var.get(u'node')): + var.get(u'exprs').callprop(u'push', var.get(u'convert')(var.get(u'node').get(u'body'))) + else: + if var.get(u't').callprop(u'isEmptyStatement', var.get(u'node')): + var.put(u'ensureLastUndefined', var.get(u'true')) + continue + else: + return var.put(u'bailed', var.get(u'true')) + var.put(u'ensureLastUndefined', Js(False)) + + if (var.get(u'ensureLastUndefined') or PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(0.0))): + var.get(u'exprs').callprop(u'push', var.get(u'scope').callprop(u'buildUndefinedNode')) + if PyJsStrictEq(var.get(u'exprs').get(u'length'),Js(1.0)): + return var.get(u'exprs').get(u'0') + else: + return var.get(u't').callprop(u'sequenceExpression', var.get(u'exprs')) + PyJsHoisted_convert_.func_name = u'convert' + var.put(u'convert', PyJsHoisted_convert_) + if (var.get(u'nodes').neg() or var.get(u'nodes').get(u'length').neg()): + return var.get('undefined') + var.put(u'declars', Js([])) + var.put(u'bailed', Js(False)) + var.put(u'result', var.get(u'convert')(var.get(u'nodes'))) + if var.get(u'bailed'): + return var.get('undefined') + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else (var.get(u'node').get(u'key') or var.get(u'node').get(u'property')))) + if var.get(u'node').get(u'computed').neg(): + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + var.put(u'key', var.get(u't').callprop(u'stringLiteral', var.get(u'key').get(u'name'))) + return var.get(u'key') + PyJsHoisted_toComputedKey_.func_name = u'toComputedKey' + var.put(u'toComputedKey', PyJsHoisted_toComputedKey_) + @Js + def PyJsHoisted_toBindingIdentifierName_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + var.put(u'name', var.get(u'toIdentifier')(var.get(u'name'))) + if (PyJsStrictEq(var.get(u'name'),Js(u'eval')) or PyJsStrictEq(var.get(u'name'),Js(u'arguments'))): + var.put(u'name', (Js(u'_')+var.get(u'name'))) + return var.get(u'name') + PyJsHoisted_toBindingIdentifierName_.func_name = u'toBindingIdentifierName' + var.put(u'toBindingIdentifierName', PyJsHoisted_toBindingIdentifierName_) + @Js + def PyJsHoisted_toBlock_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'parent']) + if var.get(u't').callprop(u'isBlockStatement', var.get(u'node')): + return var.get(u'node') + if var.get(u't').callprop(u'isEmptyStatement', var.get(u'node')): + var.put(u'node', Js([])) + if var.get(u'Array').callprop(u'isArray', var.get(u'node')).neg(): + if var.get(u't').callprop(u'isStatement', var.get(u'node')).neg(): + if var.get(u't').callprop(u'isFunction', var.get(u'parent')): + var.put(u'node', var.get(u't').callprop(u'returnStatement', var.get(u'node'))) + else: + var.put(u'node', var.get(u't').callprop(u'expressionStatement', var.get(u'node'))) + var.put(u'node', Js([var.get(u'node')])) + return var.get(u't').callprop(u'blockStatement', var.get(u'node')) + PyJsHoisted_toBlock_.func_name = u'toBlock' + var.put(u'toBlock', PyJsHoisted_toBlock_) + @Js + def PyJsHoisted_toStatement_(node, ignore, this, arguments, var=var): + var = Scope({u'node':node, u'ignore':ignore, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'ignore', u'mustHaveId', u'newType']) + if var.get(u't').callprop(u'isStatement', var.get(u'node')): + return var.get(u'node') + var.put(u'mustHaveId', Js(False)) + var.put(u'newType', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isClass', var.get(u'node')): + var.put(u'mustHaveId', var.get(u'true')) + var.put(u'newType', Js(u'ClassDeclaration')) + else: + if var.get(u't').callprop(u'isFunction', var.get(u'node')): + var.put(u'mustHaveId', var.get(u'true')) + var.put(u'newType', Js(u'FunctionDeclaration')) + else: + if var.get(u't').callprop(u'isAssignmentExpression', var.get(u'node')): + return var.get(u't').callprop(u'expressionStatement', var.get(u'node')) + if (var.get(u'mustHaveId') and var.get(u'node').get(u'id').neg()): + var.put(u'newType', Js(False)) + if var.get(u'newType').neg(): + if var.get(u'ignore'): + return Js(False) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'cannot turn ')+var.get(u'node').get(u'type'))+Js(u' to a statement')))) + raise PyJsTempException + var.get(u'node').put(u'type', var.get(u'newType')) + return var.get(u'node') + PyJsHoisted_toStatement_.func_name = u'toStatement' + var.put(u'toStatement', PyJsHoisted_toStatement_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2215_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2215_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_toIdentifier_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + var.put(u'name', (var.get(u'name')+Js(u''))) + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u'/[^a-zA-Z0-9$_]/g'), Js(u'-'))) + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u'/^[-0-9]+/'), Js(u''))) + @Js + def PyJs_anonymous_2218_(match, c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments, u'match':match}, var) + var.registers([u'c', u'match']) + return (var.get(u'c').callprop(u'toUpperCase') if var.get(u'c') else Js(u'')) + PyJs_anonymous_2218_._set_name(u'anonymous') + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u'/[-\\s]+(.)?/g'), PyJs_anonymous_2218_)) + if var.get(u't').callprop(u'isValidIdentifier', var.get(u'name')).neg(): + var.put(u'name', (Js(u'_')+var.get(u'name'))) + return (var.get(u'name') or Js(u'_')) + PyJsHoisted_toIdentifier_.func_name = u'toIdentifier' + var.put(u'toIdentifier', PyJsHoisted_toIdentifier_) + @Js + def PyJsHoisted_toKeyAlias_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'alias', u'key']) + var.put(u'key', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else var.get(u'node').get(u'key'))) + var.put(u'alias', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'node').get(u'kind'),Js(u'method')): + return (var.get(u'toKeyAlias').callprop(u'increment')+Js(u'')) + else: + if var.get(u't').callprop(u'isIdentifier', var.get(u'key')): + var.put(u'alias', var.get(u'key').get(u'name')) + else: + if var.get(u't').callprop(u'isStringLiteral', var.get(u'key')): + var.put(u'alias', PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'key').get(u'value'))) + else: + var.put(u'alias', PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u't').callprop(u'removePropertiesDeep', var.get(u't').callprop(u'cloneDeep', var.get(u'key'))))) + if var.get(u'node').get(u'computed'): + var.put(u'alias', ((Js(u'[')+var.get(u'alias'))+Js(u']'))) + if var.get(u'node').get(u'static'): + var.put(u'alias', (Js(u'static:')+var.get(u'alias'))) + return var.get(u'alias') + PyJsHoisted_toKeyAlias_.func_name = u'toKeyAlias' + var.put(u'toKeyAlias', PyJsHoisted_toKeyAlias_) + @Js + def PyJsHoisted_valueToNode_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'pattern', u'value', u'flags', u'nodeKey', u'key', u'props']) + if PyJsStrictEq(var.get(u'value'),var.get(u'undefined')): + return var.get(u't').callprop(u'identifier', Js(u'undefined')) + if (PyJsStrictEq(var.get(u'value'),var.get(u'true')) or PyJsStrictEq(var.get(u'value'),Js(False))): + return var.get(u't').callprop(u'booleanLiteral', var.get(u'value')) + if PyJsStrictEq(var.get(u'value'),var.get(u"null")): + return var.get(u't').callprop(u'nullLiteral') + if PyJsComma(Js(0.0),var.get(u'_isString2').get(u'default'))(var.get(u'value')): + return var.get(u't').callprop(u'stringLiteral', var.get(u'value')) + if PyJsComma(Js(0.0),var.get(u'_isNumber2').get(u'default'))(var.get(u'value')): + return var.get(u't').callprop(u'numericLiteral', var.get(u'value')) + if PyJsComma(Js(0.0),var.get(u'_isRegExp2').get(u'default'))(var.get(u'value')): + var.put(u'pattern', var.get(u'value').get(u'source')) + var.put(u'flags', var.get(u'value').callprop(u'toString').callprop(u'match', JsRegExp(u'/\\/([a-z]+|)$/')).get(u'1')) + return var.get(u't').callprop(u'regExpLiteral', var.get(u'pattern'), var.get(u'flags')) + if var.get(u'Array').callprop(u'isArray', var.get(u'value')): + return var.get(u't').callprop(u'arrayExpression', var.get(u'value').callprop(u'map', var.get(u't').get(u'valueToNode'))) + if PyJsComma(Js(0.0),var.get(u'_isPlainObject2').get(u'default'))(var.get(u'value')): + var.put(u'props', Js([])) + for PyJsTemp in var.get(u'value'): + var.put(u'key', PyJsTemp) + var.put(u'nodeKey', PyJsComma(Js(0.0), Js(None))) + if var.get(u't').callprop(u'isValidIdentifier', var.get(u'key')): + var.put(u'nodeKey', var.get(u't').callprop(u'identifier', var.get(u'key'))) + else: + var.put(u'nodeKey', var.get(u't').callprop(u'stringLiteral', var.get(u'key'))) + var.get(u'props').callprop(u'push', var.get(u't').callprop(u'objectProperty', var.get(u'nodeKey'), var.get(u't').callprop(u'valueToNode', var.get(u'value').get(var.get(u'key'))))) + return var.get(u't').callprop(u'objectExpression', var.get(u'props')) + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u"don't know how to turn this value into a node"))) + raise PyJsTempException + PyJsHoisted_valueToNode_.func_name = u'valueToNode' + var.put(u'valueToNode', PyJsHoisted_valueToNode_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_maxSafeInteger', var.get(u'require')(Js(u'babel-runtime/core-js/number/max-safe-integer'))) + var.put(u'_maxSafeInteger2', var.get(u'_interopRequireDefault')(var.get(u'_maxSafeInteger'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'toComputedKey', var.get(u'toComputedKey')) + var.get(u'exports').put(u'toSequenceExpression', var.get(u'toSequenceExpression')) + var.get(u'exports').put(u'toKeyAlias', var.get(u'toKeyAlias')) + var.get(u'exports').put(u'toIdentifier', var.get(u'toIdentifier')) + var.get(u'exports').put(u'toBindingIdentifierName', var.get(u'toBindingIdentifierName')) + var.get(u'exports').put(u'toStatement', var.get(u'toStatement')) + var.get(u'exports').put(u'toExpression', var.get(u'toExpression')) + var.get(u'exports').put(u'toBlock', var.get(u'toBlock')) + var.get(u'exports').put(u'valueToNode', var.get(u'valueToNode')) + var.put(u'_isPlainObject', var.get(u'require')(Js(u'lodash/isPlainObject'))) + var.put(u'_isPlainObject2', var.get(u'_interopRequireDefault')(var.get(u'_isPlainObject'))) + var.put(u'_isNumber', var.get(u'require')(Js(u'lodash/isNumber'))) + var.put(u'_isNumber2', var.get(u'_interopRequireDefault')(var.get(u'_isNumber'))) + var.put(u'_isRegExp', var.get(u'require')(Js(u'lodash/isRegExp'))) + var.put(u'_isRegExp2', var.get(u'_interopRequireDefault')(var.get(u'_isRegExp'))) + var.put(u'_isString', var.get(u'require')(Js(u'lodash/isString'))) + var.put(u'_isString2', var.get(u'_interopRequireDefault')(var.get(u'_isString'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + pass + pass + pass + pass + pass + var.get(u'toKeyAlias').put(u'uid', Js(0.0)) + @Js + def PyJs_anonymous_2217_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (var.get(u'toKeyAlias').get(u'uid')>=var.get(u'_maxSafeInteger2').get(u'default')): + return var.get(u'toKeyAlias').put(u'uid', Js(0.0)) + else: + return (var.get(u'toKeyAlias').put(u'uid',Js(var.get(u'toKeyAlias').get(u'uid').to_number())+Js(1))-Js(1)) + PyJs_anonymous_2217_._set_name(u'anonymous') + var.get(u'toKeyAlias').put(u'increment', PyJs_anonymous_2217_) + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2213_._set_name(u'anonymous') +PyJs_Object_2219_ = Js({u'./index':Js(258.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/number/max-safe-integer':Js(99.0),u'lodash/isNumber':Js(466.0),u'lodash/isPlainObject':Js(469.0),u'lodash/isRegExp':Js(470.0),u'lodash/isString':Js(471.0)}) +@Js +def PyJs_anonymous_2220_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_constants', u'_interopRequireWildcard', u'_index', u'require', u'module', u't', u'_index2', u'_index3', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2221_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2221_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2222_ = Js({}) + var.put(u'newObj', PyJs_Object_2222_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'../index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + var.put(u'_constants', var.get(u'require')(Js(u'../constants'))) + var.put(u'_index2', var.get(u'require')(Js(u'./index'))) + var.put(u'_index3', var.get(u'_interopRequireDefault')(var.get(u'_index2'))) + pass + pass + PyJs_Object_2225_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeOrValueType'))(Js(u'null'), Js(u'Expression'), Js(u'SpreadElement')))),u'default':Js([])}) + PyJs_Object_2224_ = Js({u'elements':PyJs_Object_2225_}) + PyJs_Object_2223_ = Js({u'fields':PyJs_Object_2224_,u'visitor':Js([Js(u'elements')]),u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ArrayExpression'), PyJs_Object_2223_) + PyJs_Object_2228_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2229_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2230_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2227_ = Js({u'operator':PyJs_Object_2228_,u'left':PyJs_Object_2229_,u'right':PyJs_Object_2230_}) + PyJs_Object_2226_ = Js({u'fields':PyJs_Object_2227_,u'builder':Js([Js(u'operator'), Js(u'left'), Js(u'right')]),u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'AssignmentExpression'), PyJs_Object_2226_) + PyJs_Object_2233_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'BINARY_OPERATORS'))}) + PyJs_Object_2234_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2235_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2232_ = Js({u'operator':PyJs_Object_2233_,u'left':PyJs_Object_2234_,u'right':PyJs_Object_2235_}) + PyJs_Object_2231_ = Js({u'builder':Js([Js(u'operator'), Js(u'left'), Js(u'right')]),u'fields':PyJs_Object_2232_,u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Binary'), Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BinaryExpression'), PyJs_Object_2231_) + PyJs_Object_2238_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'DirectiveLiteral'))}) + PyJs_Object_2237_ = Js({u'value':PyJs_Object_2238_}) + PyJs_Object_2236_ = Js({u'visitor':Js([Js(u'value')]),u'fields':PyJs_Object_2237_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'Directive'), PyJs_Object_2236_) + PyJs_Object_2241_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2240_ = Js({u'value':PyJs_Object_2241_}) + PyJs_Object_2239_ = Js({u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2240_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'DirectiveLiteral'), PyJs_Object_2239_) + PyJs_Object_2244_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Directive')))),u'default':Js([])}) + PyJs_Object_2245_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))))}) + PyJs_Object_2243_ = Js({u'directives':PyJs_Object_2244_,u'body':PyJs_Object_2245_}) + PyJs_Object_2242_ = Js({u'builder':Js([Js(u'body'), Js(u'directives')]),u'visitor':Js([Js(u'directives'), Js(u'body')]),u'fields':PyJs_Object_2243_,u'aliases':Js([Js(u'Scopable'), Js(u'BlockParent'), Js(u'Block'), Js(u'Statement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BlockStatement'), PyJs_Object_2242_) + PyJs_Object_2248_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier')),u'optional':var.get(u'true')}) + PyJs_Object_2247_ = Js({u'label':PyJs_Object_2248_}) + PyJs_Object_2246_ = Js({u'visitor':Js([Js(u'label')]),u'fields':PyJs_Object_2247_,u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BreakStatement'), PyJs_Object_2246_) + PyJs_Object_2251_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2252_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'), Js(u'SpreadElement'))))}) + PyJs_Object_2250_ = Js({u'callee':PyJs_Object_2251_,u'arguments':PyJs_Object_2252_}) + PyJs_Object_2249_ = Js({u'visitor':Js([Js(u'callee'), Js(u'arguments')]),u'fields':PyJs_Object_2250_,u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'CallExpression'), PyJs_Object_2249_) + PyJs_Object_2255_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2256_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2254_ = Js({u'param':PyJs_Object_2255_,u'body':PyJs_Object_2256_}) + PyJs_Object_2253_ = Js({u'visitor':Js([Js(u'param'), Js(u'body')]),u'fields':PyJs_Object_2254_,u'aliases':Js([Js(u'Scopable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'CatchClause'), PyJs_Object_2253_) + PyJs_Object_2259_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2260_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2261_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2258_ = Js({u'test':PyJs_Object_2259_,u'consequent':PyJs_Object_2260_,u'alternate':PyJs_Object_2261_}) + PyJs_Object_2257_ = Js({u'visitor':Js([Js(u'test'), Js(u'consequent'), Js(u'alternate')]),u'fields':PyJs_Object_2258_,u'aliases':Js([Js(u'Expression'), Js(u'Conditional')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ConditionalExpression'), PyJs_Object_2257_) + PyJs_Object_2264_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier')),u'optional':var.get(u'true')}) + PyJs_Object_2263_ = Js({u'label':PyJs_Object_2264_}) + PyJs_Object_2262_ = Js({u'visitor':Js([Js(u'label')]),u'fields':PyJs_Object_2263_,u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ContinueStatement'), PyJs_Object_2262_) + PyJs_Object_2265_ = Js({u'aliases':Js([Js(u'Statement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'DebuggerStatement'), PyJs_Object_2265_) + PyJs_Object_2268_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2269_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2267_ = Js({u'test':PyJs_Object_2268_,u'body':PyJs_Object_2269_}) + PyJs_Object_2266_ = Js({u'visitor':Js([Js(u'test'), Js(u'body')]),u'fields':PyJs_Object_2267_,u'aliases':Js([Js(u'Statement'), Js(u'BlockParent'), Js(u'Loop'), Js(u'While'), Js(u'Scopable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'DoWhileStatement'), PyJs_Object_2266_) + PyJs_Object_2270_ = Js({u'aliases':Js([Js(u'Statement')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'EmptyStatement'), PyJs_Object_2270_) + PyJs_Object_2273_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2272_ = Js({u'expression':PyJs_Object_2273_}) + PyJs_Object_2271_ = Js({u'visitor':Js([Js(u'expression')]),u'fields':PyJs_Object_2272_,u'aliases':Js([Js(u'Statement'), Js(u'ExpressionWrapper')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ExpressionStatement'), PyJs_Object_2271_) + PyJs_Object_2276_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Program'))}) + PyJs_Object_2275_ = Js({u'program':PyJs_Object_2276_}) + PyJs_Object_2274_ = Js({u'builder':Js([Js(u'program'), Js(u'comments'), Js(u'tokens')]),u'visitor':Js([Js(u'program')]),u'fields':PyJs_Object_2275_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'File'), PyJs_Object_2274_) + PyJs_Object_2279_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'LVal'))}) + PyJs_Object_2280_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2281_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2278_ = Js({u'left':PyJs_Object_2279_,u'right':PyJs_Object_2280_,u'body':PyJs_Object_2281_}) + PyJs_Object_2277_ = Js({u'visitor':Js([Js(u'left'), Js(u'right'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop'), Js(u'ForXStatement')]),u'fields':PyJs_Object_2278_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ForInStatement'), PyJs_Object_2277_) + PyJs_Object_2284_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2285_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2286_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2287_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2283_ = Js({u'init':PyJs_Object_2284_,u'test':PyJs_Object_2285_,u'update':PyJs_Object_2286_,u'body':PyJs_Object_2287_}) + PyJs_Object_2282_ = Js({u'visitor':Js([Js(u'init'), Js(u'test'), Js(u'update'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop')]),u'fields':PyJs_Object_2283_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ForStatement'), PyJs_Object_2282_) + PyJs_Object_2290_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2291_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2292_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2293_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2294_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2289_ = Js({u'id':PyJs_Object_2290_,u'params':PyJs_Object_2291_,u'body':PyJs_Object_2292_,u'generator':PyJs_Object_2293_,u'async':PyJs_Object_2294_}) + PyJs_Object_2288_ = Js({u'builder':Js([Js(u'id'), Js(u'params'), Js(u'body'), Js(u'generator'), Js(u'async')]),u'visitor':Js([Js(u'id'), Js(u'params'), Js(u'body'), Js(u'returnType'), Js(u'typeParameters')]),u'fields':PyJs_Object_2289_,u'aliases':Js([Js(u'Scopable'), Js(u'Function'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Statement'), Js(u'Pureish'), Js(u'Declaration')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'FunctionDeclaration'), PyJs_Object_2288_) + PyJs_Object_2297_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier')),u'optional':var.get(u'true')}) + PyJs_Object_2298_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2299_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2300_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2301_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2296_ = Js({u'id':PyJs_Object_2297_,u'params':PyJs_Object_2298_,u'body':PyJs_Object_2299_,u'generator':PyJs_Object_2300_,u'async':PyJs_Object_2301_}) + PyJs_Object_2295_ = Js({u'inherits':Js(u'FunctionDeclaration'),u'aliases':Js([Js(u'Scopable'), Js(u'Function'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Expression'), Js(u'Pureish')]),u'fields':PyJs_Object_2296_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'FunctionExpression'), PyJs_Object_2295_) + @Js + def PyJs_validate_2305_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2305_}, var) + var.registers([u'node', u'val', u'key']) + if var.get(u't').callprop(u'isValidIdentifier', var.get(u'val')).neg(): + pass + PyJs_validate_2305_._set_name(u'validate') + PyJs_Object_2304_ = Js({u'validate':PyJs_validate_2305_}) + PyJs_Object_2306_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2303_ = Js({u'name':PyJs_Object_2304_,u'decorators':PyJs_Object_2306_}) + PyJs_Object_2302_ = Js({u'builder':Js([Js(u'name')]),u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Expression'), Js(u'LVal')]),u'fields':PyJs_Object_2303_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'Identifier'), PyJs_Object_2302_) + PyJs_Object_2309_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2310_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2311_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2308_ = Js({u'test':PyJs_Object_2309_,u'consequent':PyJs_Object_2310_,u'alternate':PyJs_Object_2311_}) + PyJs_Object_2307_ = Js({u'visitor':Js([Js(u'test'), Js(u'consequent'), Js(u'alternate')]),u'aliases':Js([Js(u'Statement'), Js(u'Conditional')]),u'fields':PyJs_Object_2308_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'IfStatement'), PyJs_Object_2307_) + PyJs_Object_2314_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2315_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2313_ = Js({u'label':PyJs_Object_2314_,u'body':PyJs_Object_2315_}) + PyJs_Object_2312_ = Js({u'visitor':Js([Js(u'label'), Js(u'body')]),u'aliases':Js([Js(u'Statement')]),u'fields':PyJs_Object_2313_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'LabeledStatement'), PyJs_Object_2312_) + PyJs_Object_2318_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2317_ = Js({u'value':PyJs_Object_2318_}) + PyJs_Object_2316_ = Js({u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2317_,u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'StringLiteral'), PyJs_Object_2316_) + PyJs_Object_2321_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'number'))}) + PyJs_Object_2320_ = Js({u'value':PyJs_Object_2321_}) + PyJs_Object_2319_ = Js({u'builder':Js([Js(u'value')]),u'deprecatedAlias':Js(u'NumberLiteral'),u'fields':PyJs_Object_2320_,u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'NumericLiteral'), PyJs_Object_2319_) + PyJs_Object_2322_ = Js({u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'NullLiteral'), PyJs_Object_2322_) + PyJs_Object_2325_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2324_ = Js({u'value':PyJs_Object_2325_}) + PyJs_Object_2323_ = Js({u'builder':Js([Js(u'value')]),u'fields':PyJs_Object_2324_,u'aliases':Js([Js(u'Expression'), Js(u'Pureish'), Js(u'Literal'), Js(u'Immutable')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'BooleanLiteral'), PyJs_Object_2323_) + PyJs_Object_2328_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2329_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string')),u'default':Js(u'')}) + PyJs_Object_2327_ = Js({u'pattern':PyJs_Object_2328_,u'flags':PyJs_Object_2329_}) + PyJs_Object_2326_ = Js({u'builder':Js([Js(u'pattern'), Js(u'flags')]),u'deprecatedAlias':Js(u'RegexLiteral'),u'aliases':Js([Js(u'Expression'), Js(u'Literal')]),u'fields':PyJs_Object_2327_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'RegExpLiteral'), PyJs_Object_2326_) + PyJs_Object_2332_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'LOGICAL_OPERATORS'))}) + PyJs_Object_2333_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2334_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2331_ = Js({u'operator':PyJs_Object_2332_,u'left':PyJs_Object_2333_,u'right':PyJs_Object_2334_}) + PyJs_Object_2330_ = Js({u'builder':Js([Js(u'operator'), Js(u'left'), Js(u'right')]),u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Binary'), Js(u'Expression')]),u'fields':PyJs_Object_2331_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'LogicalExpression'), PyJs_Object_2330_) + PyJs_Object_2337_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + @Js + def PyJs_validate_2339_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2339_}, var) + var.registers([u'node', u'expectedType', u'val', u'key']) + var.put(u'expectedType', (Js(u'Expression') if var.get(u'node').get(u'computed') else Js(u'Identifier'))) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(var.get(u'expectedType'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2339_._set_name(u'validate') + PyJs_Object_2338_ = Js({u'validate':PyJs_validate_2339_}) + PyJs_Object_2340_ = Js({u'default':Js(False)}) + PyJs_Object_2336_ = Js({u'object':PyJs_Object_2337_,u'property':PyJs_Object_2338_,u'computed':PyJs_Object_2340_}) + PyJs_Object_2335_ = Js({u'builder':Js([Js(u'object'), Js(u'property'), Js(u'computed')]),u'visitor':Js([Js(u'object'), Js(u'property')]),u'aliases':Js([Js(u'Expression'), Js(u'LVal')]),u'fields':PyJs_Object_2336_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'MemberExpression'), PyJs_Object_2335_) + PyJs_Object_2343_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2344_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'), Js(u'SpreadElement'))))}) + PyJs_Object_2342_ = Js({u'callee':PyJs_Object_2343_,u'arguments':PyJs_Object_2344_}) + PyJs_Object_2341_ = Js({u'visitor':Js([Js(u'callee'), Js(u'arguments')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2342_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'NewExpression'), PyJs_Object_2341_) + PyJs_Object_2347_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Directive')))),u'default':Js([])}) + PyJs_Object_2348_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))))}) + PyJs_Object_2346_ = Js({u'directives':PyJs_Object_2347_,u'body':PyJs_Object_2348_}) + PyJs_Object_2345_ = Js({u'visitor':Js([Js(u'directives'), Js(u'body')]),u'builder':Js([Js(u'body'), Js(u'directives')]),u'fields':PyJs_Object_2346_,u'aliases':Js([Js(u'Scopable'), Js(u'BlockParent'), Js(u'Block'), Js(u'FunctionParent')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'Program'), PyJs_Object_2345_) + PyJs_Object_2351_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'ObjectMethod'), Js(u'ObjectProperty'), Js(u'SpreadProperty'))))}) + PyJs_Object_2350_ = Js({u'properties':PyJs_Object_2351_}) + PyJs_Object_2349_ = Js({u'visitor':Js([Js(u'properties')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2350_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ObjectExpression'), PyJs_Object_2349_) + PyJs_Object_2354_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertOneOf'))(Js(u'method'), Js(u'get'), Js(u'set'))),u'default':Js(u'method')}) + PyJs_Object_2355_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + @Js + def PyJs_validate_2357_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2357_}, var) + var.registers([u'node', u'val', u'key', u'expectedTypes']) + var.put(u'expectedTypes', (Js([Js(u'Expression')]) if var.get(u'node').get(u'computed') else Js([Js(u'Identifier'), Js(u'StringLiteral'), Js(u'NumericLiteral')]))) + var.get(u'_index2').get(u'assertNodeType').callprop(u'apply', var.get(u'undefined'), var.get(u'expectedTypes'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2357_._set_name(u'validate') + PyJs_Object_2356_ = Js({u'validate':PyJs_validate_2357_}) + PyJs_Object_2358_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2359_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2360_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2361_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2353_ = Js({u'kind':PyJs_Object_2354_,u'computed':PyJs_Object_2355_,u'key':PyJs_Object_2356_,u'decorators':PyJs_Object_2358_,u'body':PyJs_Object_2359_,u'generator':PyJs_Object_2360_,u'async':PyJs_Object_2361_}) + PyJs_Object_2352_ = Js({u'builder':Js([Js(u'kind'), Js(u'key'), Js(u'params'), Js(u'body'), Js(u'computed')]),u'fields':PyJs_Object_2353_,u'visitor':Js([Js(u'key'), Js(u'params'), Js(u'body'), Js(u'decorators'), Js(u'returnType'), Js(u'typeParameters')]),u'aliases':Js([Js(u'UserWhitespacable'), Js(u'Function'), Js(u'Scopable'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Method'), Js(u'ObjectMember')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ObjectMethod'), PyJs_Object_2352_) + PyJs_Object_2364_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + @Js + def PyJs_validate_2366_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2366_}, var) + var.registers([u'node', u'val', u'key', u'expectedTypes']) + var.put(u'expectedTypes', (Js([Js(u'Expression')]) if var.get(u'node').get(u'computed') else Js([Js(u'Identifier'), Js(u'StringLiteral'), Js(u'NumericLiteral')]))) + var.get(u'_index2').get(u'assertNodeType').callprop(u'apply', var.get(u'undefined'), var.get(u'expectedTypes'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2366_._set_name(u'validate') + PyJs_Object_2365_ = Js({u'validate':PyJs_validate_2366_}) + PyJs_Object_2367_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2368_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2369_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator')))),u'optional':var.get(u'true')}) + PyJs_Object_2363_ = Js({u'computed':PyJs_Object_2364_,u'key':PyJs_Object_2365_,u'value':PyJs_Object_2367_,u'shorthand':PyJs_Object_2368_,u'decorators':PyJs_Object_2369_}) + PyJs_Object_2362_ = Js({u'builder':Js([Js(u'key'), Js(u'value'), Js(u'computed'), Js(u'shorthand'), Js(u'decorators')]),u'fields':PyJs_Object_2363_,u'visitor':Js([Js(u'key'), Js(u'value'), Js(u'decorators')]),u'aliases':Js([Js(u'UserWhitespacable'), Js(u'Property'), Js(u'ObjectMember')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ObjectProperty'), PyJs_Object_2362_) + PyJs_Object_2372_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2373_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2371_ = Js({u'argument':PyJs_Object_2372_,u'decorators':PyJs_Object_2373_}) + PyJs_Object_2370_ = Js({u'visitor':Js([Js(u'argument'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'LVal')]),u'fields':PyJs_Object_2371_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'RestElement'), PyJs_Object_2370_) + PyJs_Object_2376_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2375_ = Js({u'argument':PyJs_Object_2376_}) + PyJs_Object_2374_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')]),u'fields':PyJs_Object_2375_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ReturnStatement'), PyJs_Object_2374_) + PyJs_Object_2379_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))))}) + PyJs_Object_2378_ = Js({u'expressions':PyJs_Object_2379_}) + PyJs_Object_2377_ = Js({u'visitor':Js([Js(u'expressions')]),u'fields':PyJs_Object_2378_,u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'SequenceExpression'), PyJs_Object_2377_) + PyJs_Object_2382_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression')),u'optional':var.get(u'true')}) + PyJs_Object_2383_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Statement'))))}) + PyJs_Object_2381_ = Js({u'test':PyJs_Object_2382_,u'consequent':PyJs_Object_2383_}) + PyJs_Object_2380_ = Js({u'visitor':Js([Js(u'test'), Js(u'consequent')]),u'fields':PyJs_Object_2381_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'SwitchCase'), PyJs_Object_2380_) + PyJs_Object_2386_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2387_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'SwitchCase'))))}) + PyJs_Object_2385_ = Js({u'discriminant':PyJs_Object_2386_,u'cases':PyJs_Object_2387_}) + PyJs_Object_2384_ = Js({u'visitor':Js([Js(u'discriminant'), Js(u'cases')]),u'aliases':Js([Js(u'Statement'), Js(u'BlockParent'), Js(u'Scopable')]),u'fields':PyJs_Object_2385_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'SwitchStatement'), PyJs_Object_2384_) + PyJs_Object_2388_ = Js({u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ThisExpression'), PyJs_Object_2388_) + PyJs_Object_2391_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2390_ = Js({u'argument':PyJs_Object_2391_}) + PyJs_Object_2389_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Statement'), Js(u'Terminatorless'), Js(u'CompletionStatement')]),u'fields':PyJs_Object_2390_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'ThrowStatement'), PyJs_Object_2389_) + PyJs_Object_2394_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2395_ = Js({u'optional':var.get(u'true'),u'handler':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2396_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2393_ = Js({u'body':PyJs_Object_2394_,u'handler':PyJs_Object_2395_,u'finalizer':PyJs_Object_2396_}) + PyJs_Object_2392_ = Js({u'visitor':Js([Js(u'block'), Js(u'handler'), Js(u'finalizer')]),u'aliases':Js([Js(u'Statement')]),u'fields':PyJs_Object_2393_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'TryStatement'), PyJs_Object_2392_) + PyJs_Object_2399_ = Js({u'default':var.get(u'true')}) + PyJs_Object_2400_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2401_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'UNARY_OPERATORS'))}) + PyJs_Object_2398_ = Js({u'prefix':PyJs_Object_2399_,u'argument':PyJs_Object_2400_,u'operator':PyJs_Object_2401_}) + PyJs_Object_2397_ = Js({u'builder':Js([Js(u'operator'), Js(u'argument'), Js(u'prefix')]),u'fields':PyJs_Object_2398_,u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike'), Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'UnaryExpression'), PyJs_Object_2397_) + PyJs_Object_2404_ = Js({u'default':Js(False)}) + PyJs_Object_2405_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2406_ = Js({u'validate':var.get(u'_index2').get(u'assertOneOf').callprop(u'apply', var.get(u'undefined'), var.get(u'_constants').get(u'UPDATE_OPERATORS'))}) + PyJs_Object_2403_ = Js({u'prefix':PyJs_Object_2404_,u'argument':PyJs_Object_2405_,u'operator':PyJs_Object_2406_}) + PyJs_Object_2402_ = Js({u'builder':Js([Js(u'operator'), Js(u'argument'), Js(u'prefix')]),u'fields':PyJs_Object_2403_,u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'UpdateExpression'), PyJs_Object_2402_) + PyJs_Object_2409_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'string')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertOneOf'))(Js(u'var'), Js(u'let'), Js(u'const')))}) + PyJs_Object_2410_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'VariableDeclarator'))))}) + PyJs_Object_2408_ = Js({u'kind':PyJs_Object_2409_,u'declarations':PyJs_Object_2410_}) + PyJs_Object_2407_ = Js({u'builder':Js([Js(u'kind'), Js(u'declarations')]),u'visitor':Js([Js(u'declarations')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2408_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'VariableDeclaration'), PyJs_Object_2407_) + PyJs_Object_2413_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2414_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2412_ = Js({u'id':PyJs_Object_2413_,u'init':PyJs_Object_2414_}) + PyJs_Object_2411_ = Js({u'visitor':Js([Js(u'id'), Js(u'init')]),u'fields':PyJs_Object_2412_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'VariableDeclarator'), PyJs_Object_2411_) + PyJs_Object_2417_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2418_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'), Js(u'Statement'))}) + PyJs_Object_2416_ = Js({u'test':PyJs_Object_2417_,u'body':PyJs_Object_2418_}) + PyJs_Object_2415_ = Js({u'visitor':Js([Js(u'test'), Js(u'body')]),u'aliases':Js([Js(u'Statement'), Js(u'BlockParent'), Js(u'Loop'), Js(u'While'), Js(u'Scopable')]),u'fields':PyJs_Object_2416_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'WhileStatement'), PyJs_Object_2415_) + PyJs_Object_2421_ = Js({u'object':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2422_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index2').get(u'assertNodeType'))(Js(u'BlockStatement'), Js(u'Statement'))}) + PyJs_Object_2420_ = Js({u'object':PyJs_Object_2421_,u'body':PyJs_Object_2422_}) + PyJs_Object_2419_ = Js({u'visitor':Js([Js(u'object'), Js(u'body')]),u'aliases':Js([Js(u'Statement')]),u'fields':PyJs_Object_2420_}) + PyJsComma(Js(0.0),var.get(u'_index3').get(u'default'))(Js(u'WithStatement'), PyJs_Object_2419_) +PyJs_anonymous_2220_._set_name(u'anonymous') +PyJs_Object_2423_ = Js({u'../constants':Js(247.0),u'../index':Js(258.0),u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2424_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2425_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2425_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2428_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2429_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2430_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2427_ = Js({u'left':PyJs_Object_2428_,u'right':PyJs_Object_2429_,u'decorators':PyJs_Object_2430_}) + PyJs_Object_2426_ = Js({u'visitor':Js([Js(u'left'), Js(u'right')]),u'aliases':Js([Js(u'Pattern'), Js(u'LVal')]),u'fields':PyJs_Object_2427_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'AssignmentPattern'), PyJs_Object_2426_) + PyJs_Object_2433_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))))}) + PyJs_Object_2434_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2432_ = Js({u'elements':PyJs_Object_2433_,u'decorators':PyJs_Object_2434_}) + PyJs_Object_2431_ = Js({u'visitor':Js([Js(u'elements'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Pattern'), Js(u'LVal')]),u'fields':PyJs_Object_2432_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ArrayPattern'), PyJs_Object_2431_) + PyJs_Object_2437_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2438_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'BlockStatement'), Js(u'Expression'))}) + PyJs_Object_2439_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2436_ = Js({u'params':PyJs_Object_2437_,u'body':PyJs_Object_2438_,u'async':PyJs_Object_2439_}) + PyJs_Object_2435_ = Js({u'builder':Js([Js(u'params'), Js(u'body'), Js(u'async')]),u'visitor':Js([Js(u'params'), Js(u'body'), Js(u'returnType'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Scopable'), Js(u'Function'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Expression'), Js(u'Pureish')]),u'fields':PyJs_Object_2436_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ArrowFunctionExpression'), PyJs_Object_2435_) + PyJs_Object_2442_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ClassMethod'), Js(u'ClassProperty'))))}) + PyJs_Object_2441_ = Js({u'body':PyJs_Object_2442_}) + PyJs_Object_2440_ = Js({u'visitor':Js([Js(u'body')]),u'fields':PyJs_Object_2441_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassBody'), PyJs_Object_2440_) + PyJs_Object_2445_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2446_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ClassBody'))}) + PyJs_Object_2447_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2448_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2444_ = Js({u'id':PyJs_Object_2445_,u'body':PyJs_Object_2446_,u'superClass':PyJs_Object_2447_,u'decorators':PyJs_Object_2448_}) + PyJs_Object_2443_ = Js({u'builder':Js([Js(u'id'), Js(u'superClass'), Js(u'body'), Js(u'decorators')]),u'visitor':Js([Js(u'id'), Js(u'body'), Js(u'superClass'), Js(u'mixins'), Js(u'typeParameters'), Js(u'superTypeParameters'), Js(u'implements'), Js(u'decorators')]),u'aliases':Js([Js(u'Scopable'), Js(u'Class'), Js(u'Statement'), Js(u'Declaration'), Js(u'Pureish')]),u'fields':PyJs_Object_2444_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassDeclaration'), PyJs_Object_2443_) + PyJs_Object_2451_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2452_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ClassBody'))}) + PyJs_Object_2453_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2454_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2450_ = Js({u'id':PyJs_Object_2451_,u'body':PyJs_Object_2452_,u'superClass':PyJs_Object_2453_,u'decorators':PyJs_Object_2454_}) + PyJs_Object_2449_ = Js({u'inherits':Js(u'ClassDeclaration'),u'aliases':Js([Js(u'Scopable'), Js(u'Class'), Js(u'Expression'), Js(u'Pureish')]),u'fields':PyJs_Object_2450_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassExpression'), PyJs_Object_2449_) + PyJs_Object_2457_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'StringLiteral'))}) + PyJs_Object_2456_ = Js({u'source':PyJs_Object_2457_}) + PyJs_Object_2455_ = Js({u'visitor':Js([Js(u'source')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration'), Js(u'ExportDeclaration')]),u'fields':PyJs_Object_2456_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportAllDeclaration'), PyJs_Object_2455_) + PyJs_Object_2460_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'FunctionDeclaration'), Js(u'ClassDeclaration'), Js(u'Expression'))}) + PyJs_Object_2459_ = Js({u'declaration':PyJs_Object_2460_}) + PyJs_Object_2458_ = Js({u'visitor':Js([Js(u'declaration')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration'), Js(u'ExportDeclaration')]),u'fields':PyJs_Object_2459_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportDefaultDeclaration'), PyJs_Object_2458_) + PyJs_Object_2463_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Declaration')),u'optional':var.get(u'true')}) + PyJs_Object_2464_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ExportSpecifier'))))}) + PyJs_Object_2465_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'StringLiteral')),u'optional':var.get(u'true')}) + PyJs_Object_2462_ = Js({u'declaration':PyJs_Object_2463_,u'specifiers':PyJs_Object_2464_,u'source':PyJs_Object_2465_}) + PyJs_Object_2461_ = Js({u'visitor':Js([Js(u'declaration'), Js(u'specifiers'), Js(u'source')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration'), Js(u'ExportDeclaration')]),u'fields':PyJs_Object_2462_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportNamedDeclaration'), PyJs_Object_2461_) + PyJs_Object_2468_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2469_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2467_ = Js({u'local':PyJs_Object_2468_,u'exported':PyJs_Object_2469_}) + PyJs_Object_2466_ = Js({u'visitor':Js([Js(u'local'), Js(u'exported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2467_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportSpecifier'), PyJs_Object_2466_) + PyJs_Object_2472_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'LVal'))}) + PyJs_Object_2473_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2474_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2471_ = Js({u'left':PyJs_Object_2472_,u'right':PyJs_Object_2473_,u'body':PyJs_Object_2474_}) + PyJs_Object_2470_ = Js({u'visitor':Js([Js(u'left'), Js(u'right'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop'), Js(u'ForXStatement')]),u'fields':PyJs_Object_2471_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ForOfStatement'), PyJs_Object_2470_) + PyJs_Object_2477_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'ImportSpecifier'), Js(u'ImportDefaultSpecifier'), Js(u'ImportNamespaceSpecifier'))))}) + PyJs_Object_2478_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'StringLiteral'))}) + PyJs_Object_2476_ = Js({u'specifiers':PyJs_Object_2477_,u'source':PyJs_Object_2478_}) + PyJs_Object_2475_ = Js({u'visitor':Js([Js(u'specifiers'), Js(u'source')]),u'aliases':Js([Js(u'Statement'), Js(u'Declaration'), Js(u'ModuleDeclaration')]),u'fields':PyJs_Object_2476_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportDeclaration'), PyJs_Object_2475_) + PyJs_Object_2481_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2480_ = Js({u'local':PyJs_Object_2481_}) + PyJs_Object_2479_ = Js({u'visitor':Js([Js(u'local')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2480_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportDefaultSpecifier'), PyJs_Object_2479_) + PyJs_Object_2484_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2483_ = Js({u'local':PyJs_Object_2484_}) + PyJs_Object_2482_ = Js({u'visitor':Js([Js(u'local')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2483_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportNamespaceSpecifier'), PyJs_Object_2482_) + PyJs_Object_2487_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2488_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2486_ = Js({u'local':PyJs_Object_2487_,u'imported':PyJs_Object_2488_}) + PyJs_Object_2485_ = Js({u'visitor':Js([Js(u'local'), Js(u'imported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2486_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ImportSpecifier'), PyJs_Object_2485_) + PyJs_Object_2491_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2492_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string'))}) + PyJs_Object_2490_ = Js({u'meta':PyJs_Object_2491_,u'property':PyJs_Object_2492_}) + PyJs_Object_2489_ = Js({u'visitor':Js([Js(u'meta'), Js(u'property')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2490_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'MetaProperty'), PyJs_Object_2489_) + PyJs_Object_2495_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'string')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertOneOf'))(Js(u'get'), Js(u'set'), Js(u'method'), Js(u'constructor'))),u'default':Js(u'method')}) + PyJs_Object_2496_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2497_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + @Js + def PyJs_validate_2499_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'val':val, u'this':this, u'arguments':arguments, u'key':key, u'validate':PyJs_validate_2499_}, var) + var.registers([u'node', u'val', u'key', u'expectedTypes']) + var.put(u'expectedTypes', (Js([Js(u'Expression')]) if var.get(u'node').get(u'computed') else Js([Js(u'Identifier'), Js(u'StringLiteral'), Js(u'NumericLiteral')]))) + var.get(u'_index').get(u'assertNodeType').callprop(u'apply', var.get(u'undefined'), var.get(u'expectedTypes'))(var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJs_validate_2499_._set_name(u'validate') + PyJs_Object_2498_ = Js({u'validate':PyJs_validate_2499_}) + PyJs_Object_2500_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'LVal'))))}) + PyJs_Object_2501_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2502_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2503_ = Js({u'default':Js(False),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean'))}) + PyJs_Object_2494_ = Js({u'kind':PyJs_Object_2495_,u'computed':PyJs_Object_2496_,u'static':PyJs_Object_2497_,u'key':PyJs_Object_2498_,u'params':PyJs_Object_2500_,u'body':PyJs_Object_2501_,u'generator':PyJs_Object_2502_,u'async':PyJs_Object_2503_}) + PyJs_Object_2493_ = Js({u'aliases':Js([Js(u'Function'), Js(u'Scopable'), Js(u'BlockParent'), Js(u'FunctionParent'), Js(u'Method')]),u'builder':Js([Js(u'kind'), Js(u'key'), Js(u'params'), Js(u'body'), Js(u'computed'), Js(u'static')]),u'visitor':Js([Js(u'key'), Js(u'params'), Js(u'body'), Js(u'decorators'), Js(u'returnType'), Js(u'typeParameters')]),u'fields':PyJs_Object_2494_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassMethod'), PyJs_Object_2493_) + PyJs_Object_2506_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'RestProperty'), Js(u'Property'))))}) + PyJs_Object_2507_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Decorator'))))}) + PyJs_Object_2505_ = Js({u'properties':PyJs_Object_2506_,u'decorators':PyJs_Object_2507_}) + PyJs_Object_2504_ = Js({u'visitor':Js([Js(u'properties'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Pattern'), Js(u'LVal')]),u'fields':PyJs_Object_2505_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectPattern'), PyJs_Object_2504_) + PyJs_Object_2510_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2509_ = Js({u'argument':PyJs_Object_2510_}) + PyJs_Object_2508_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike')]),u'fields':PyJs_Object_2509_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'SpreadElement'), PyJs_Object_2508_) + PyJs_Object_2511_ = Js({u'aliases':Js([Js(u'Expression')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'Super'), PyJs_Object_2511_) + PyJs_Object_2514_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2515_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'TemplateLiteral'))}) + PyJs_Object_2513_ = Js({u'tag':PyJs_Object_2514_,u'quasi':PyJs_Object_2515_}) + PyJs_Object_2512_ = Js({u'visitor':Js([Js(u'tag'), Js(u'quasi')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2513_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TaggedTemplateExpression'), PyJs_Object_2512_) + PyJs_Object_2518_ = Js({}) + PyJs_Object_2519_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2517_ = Js({u'value':PyJs_Object_2518_,u'tail':PyJs_Object_2519_}) + PyJs_Object_2516_ = Js({u'builder':Js([Js(u'value'), Js(u'tail')]),u'fields':PyJs_Object_2517_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TemplateElement'), PyJs_Object_2516_) + PyJs_Object_2522_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'TemplateElement'))))}) + PyJs_Object_2523_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'chain'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'array')), PyJsComma(Js(0.0),var.get(u'_index').get(u'assertEach'))(PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))))}) + PyJs_Object_2521_ = Js({u'quasis':PyJs_Object_2522_,u'expressions':PyJs_Object_2523_}) + PyJs_Object_2520_ = Js({u'visitor':Js([Js(u'quasis'), Js(u'expressions')]),u'aliases':Js([Js(u'Expression'), Js(u'Literal')]),u'fields':PyJs_Object_2521_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TemplateLiteral'), PyJs_Object_2520_) + PyJs_Object_2526_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2527_ = Js({u'optional':var.get(u'true'),u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2525_ = Js({u'delegate':PyJs_Object_2526_,u'argument':PyJs_Object_2527_}) + PyJs_Object_2524_ = Js({u'builder':Js([Js(u'argument'), Js(u'delegate')]),u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Expression'), Js(u'Terminatorless')]),u'fields':PyJs_Object_2525_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'YieldExpression'), PyJs_Object_2524_) +PyJs_anonymous_2424_._set_name(u'anonymous') +PyJs_Object_2528_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2529_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2530_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2530_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2533_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2532_ = Js({u'argument':PyJs_Object_2533_}) + PyJs_Object_2531_ = Js({u'builder':Js([Js(u'argument')]),u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Expression'), Js(u'Terminatorless')]),u'fields':PyJs_Object_2532_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'AwaitExpression'), PyJs_Object_2531_) + PyJs_Object_2536_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'VariableDeclaration'), Js(u'LVal'))}) + PyJs_Object_2537_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2538_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Statement'))}) + PyJs_Object_2535_ = Js({u'left':PyJs_Object_2536_,u'right':PyJs_Object_2537_,u'body':PyJs_Object_2538_}) + PyJs_Object_2534_ = Js({u'visitor':Js([Js(u'left'), Js(u'right'), Js(u'body')]),u'aliases':Js([Js(u'Scopable'), Js(u'Statement'), Js(u'For'), Js(u'BlockParent'), Js(u'Loop'), Js(u'ForXStatement')]),u'fields':PyJs_Object_2535_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ForAwaitStatement'), PyJs_Object_2534_) + PyJs_Object_2540_ = Js({}) + PyJs_Object_2539_ = Js({u'visitor':Js([Js(u'object'), Js(u'callee')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2540_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'BindExpression'), PyJs_Object_2539_) + PyJs_Object_2543_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2542_ = Js({u'expression':PyJs_Object_2543_}) + PyJs_Object_2541_ = Js({u'visitor':Js([Js(u'expression')]),u'fields':PyJs_Object_2542_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'Decorator'), PyJs_Object_2541_) + PyJs_Object_2546_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'BlockStatement'))}) + PyJs_Object_2545_ = Js({u'body':PyJs_Object_2546_}) + PyJs_Object_2544_ = Js({u'visitor':Js([Js(u'body')]),u'aliases':Js([Js(u'Expression')]),u'fields':PyJs_Object_2545_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DoExpression'), PyJs_Object_2544_) + PyJs_Object_2549_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2548_ = Js({u'exported':PyJs_Object_2549_}) + PyJs_Object_2547_ = Js({u'visitor':Js([Js(u'exported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2548_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportDefaultSpecifier'), PyJs_Object_2547_) + PyJs_Object_2552_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Identifier'))}) + PyJs_Object_2551_ = Js({u'exported':PyJs_Object_2552_}) + PyJs_Object_2550_ = Js({u'visitor':Js([Js(u'exported')]),u'aliases':Js([Js(u'ModuleSpecifier')]),u'fields':PyJs_Object_2551_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExportNamespaceSpecifier'), PyJs_Object_2550_) + PyJs_Object_2555_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'LVal'))}) + PyJs_Object_2554_ = Js({u'argument':PyJs_Object_2555_}) + PyJs_Object_2553_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike')]),u'fields':PyJs_Object_2554_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'RestProperty'), PyJs_Object_2553_) + PyJs_Object_2558_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertNodeType'))(Js(u'Expression'))}) + PyJs_Object_2557_ = Js({u'argument':PyJs_Object_2558_}) + PyJs_Object_2556_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'UnaryLike')]),u'fields':PyJs_Object_2557_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'SpreadProperty'), PyJs_Object_2556_) +PyJs_anonymous_2529_._set_name(u'anonymous') +PyJs_Object_2559_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2560_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_index', u'require', u'module', u'_index2', u'_interopRequireDefault']) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2561_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2561_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + Js(u'use strict') + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u'_index2', var.get(u'_interopRequireDefault')(var.get(u'_index'))) + pass + PyJs_Object_2563_ = Js({}) + PyJs_Object_2562_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2563_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'AnyTypeAnnotation'), PyJs_Object_2562_) + PyJs_Object_2565_ = Js({}) + PyJs_Object_2564_ = Js({u'visitor':Js([Js(u'elementType')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2565_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ArrayTypeAnnotation'), PyJs_Object_2564_) + PyJs_Object_2567_ = Js({}) + PyJs_Object_2566_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2567_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'BooleanTypeAnnotation'), PyJs_Object_2566_) + PyJs_Object_2569_ = Js({}) + PyJs_Object_2568_ = Js({u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2569_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'BooleanLiteralTypeAnnotation'), PyJs_Object_2568_) + PyJs_Object_2571_ = Js({}) + PyJs_Object_2570_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2571_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NullLiteralTypeAnnotation'), PyJs_Object_2570_) + PyJs_Object_2573_ = Js({}) + PyJs_Object_2572_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2573_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassImplements'), PyJs_Object_2572_) + PyJs_Object_2576_ = Js({u'validate':PyJsComma(Js(0.0),var.get(u'_index').get(u'assertValueType'))(Js(u'boolean')),u'default':Js(False)}) + PyJs_Object_2575_ = Js({u'computed':PyJs_Object_2576_}) + PyJs_Object_2574_ = Js({u'visitor':Js([Js(u'key'), Js(u'value'), Js(u'typeAnnotation'), Js(u'decorators')]),u'builder':Js([Js(u'key'), Js(u'value'), Js(u'typeAnnotation'), Js(u'decorators'), Js(u'computed')]),u'aliases':Js([Js(u'Property')]),u'fields':PyJs_Object_2575_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ClassProperty'), PyJs_Object_2574_) + PyJs_Object_2578_ = Js({}) + PyJs_Object_2577_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'extends'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2578_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareClass'), PyJs_Object_2577_) + PyJs_Object_2580_ = Js({}) + PyJs_Object_2579_ = Js({u'visitor':Js([Js(u'id')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2580_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareFunction'), PyJs_Object_2579_) + PyJs_Object_2582_ = Js({}) + PyJs_Object_2581_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'extends'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2582_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareInterface'), PyJs_Object_2581_) + PyJs_Object_2584_ = Js({}) + PyJs_Object_2583_ = Js({u'visitor':Js([Js(u'id'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2584_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareModule'), PyJs_Object_2583_) + PyJs_Object_2586_ = Js({}) + PyJs_Object_2585_ = Js({u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2586_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareModuleExports'), PyJs_Object_2585_) + PyJs_Object_2588_ = Js({}) + PyJs_Object_2587_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'right')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2588_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareTypeAlias'), PyJs_Object_2587_) + PyJs_Object_2590_ = Js({}) + PyJs_Object_2589_ = Js({u'visitor':Js([Js(u'id')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2590_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'DeclareVariable'), PyJs_Object_2589_) + PyJs_Object_2591_ = Js({u'aliases':Js([Js(u'Flow')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ExistentialTypeParam'), PyJs_Object_2591_) + PyJs_Object_2593_ = Js({}) + PyJs_Object_2592_ = Js({u'visitor':Js([Js(u'typeParameters'), Js(u'params'), Js(u'rest'), Js(u'returnType')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2593_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'FunctionTypeAnnotation'), PyJs_Object_2592_) + PyJs_Object_2595_ = Js({}) + PyJs_Object_2594_ = Js({u'visitor':Js([Js(u'name'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2595_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'FunctionTypeParam'), PyJs_Object_2594_) + PyJs_Object_2597_ = Js({}) + PyJs_Object_2596_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2597_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'GenericTypeAnnotation'), PyJs_Object_2596_) + PyJs_Object_2599_ = Js({}) + PyJs_Object_2598_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2599_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'InterfaceExtends'), PyJs_Object_2598_) + PyJs_Object_2601_ = Js({}) + PyJs_Object_2600_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'extends'), Js(u'body')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2601_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'InterfaceDeclaration'), PyJs_Object_2600_) + PyJs_Object_2603_ = Js({}) + PyJs_Object_2602_ = Js({u'visitor':Js([Js(u'types')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2603_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'IntersectionTypeAnnotation'), PyJs_Object_2602_) + PyJs_Object_2604_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'MixedTypeAnnotation'), PyJs_Object_2604_) + PyJs_Object_2605_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')])}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'EmptyTypeAnnotation'), PyJs_Object_2605_) + PyJs_Object_2607_ = Js({}) + PyJs_Object_2606_ = Js({u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2607_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NullableTypeAnnotation'), PyJs_Object_2606_) + PyJs_Object_2609_ = Js({}) + PyJs_Object_2608_ = Js({u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2609_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NumericLiteralTypeAnnotation'), PyJs_Object_2608_) + PyJs_Object_2611_ = Js({}) + PyJs_Object_2610_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2611_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'NumberTypeAnnotation'), PyJs_Object_2610_) + PyJs_Object_2613_ = Js({}) + PyJs_Object_2612_ = Js({u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2613_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'StringLiteralTypeAnnotation'), PyJs_Object_2612_) + PyJs_Object_2615_ = Js({}) + PyJs_Object_2614_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2615_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'StringTypeAnnotation'), PyJs_Object_2614_) + PyJs_Object_2617_ = Js({}) + PyJs_Object_2616_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2617_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ThisTypeAnnotation'), PyJs_Object_2616_) + PyJs_Object_2619_ = Js({}) + PyJs_Object_2618_ = Js({u'visitor':Js([Js(u'types')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2619_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TupleTypeAnnotation'), PyJs_Object_2618_) + PyJs_Object_2621_ = Js({}) + PyJs_Object_2620_ = Js({u'visitor':Js([Js(u'argument')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2621_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeofTypeAnnotation'), PyJs_Object_2620_) + PyJs_Object_2623_ = Js({}) + PyJs_Object_2622_ = Js({u'visitor':Js([Js(u'id'), Js(u'typeParameters'), Js(u'right')]),u'aliases':Js([Js(u'Flow'), Js(u'FlowDeclaration'), Js(u'Statement'), Js(u'Declaration')]),u'fields':PyJs_Object_2623_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeAlias'), PyJs_Object_2622_) + PyJs_Object_2625_ = Js({}) + PyJs_Object_2624_ = Js({u'visitor':Js([Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2625_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeAnnotation'), PyJs_Object_2624_) + PyJs_Object_2627_ = Js({}) + PyJs_Object_2626_ = Js({u'visitor':Js([Js(u'expression'), Js(u'typeAnnotation')]),u'aliases':Js([Js(u'Flow'), Js(u'ExpressionWrapper'), Js(u'Expression')]),u'fields':PyJs_Object_2627_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeCastExpression'), PyJs_Object_2626_) + PyJs_Object_2629_ = Js({}) + PyJs_Object_2628_ = Js({u'visitor':Js([Js(u'bound')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2629_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeParameter'), PyJs_Object_2628_) + PyJs_Object_2631_ = Js({}) + PyJs_Object_2630_ = Js({u'visitor':Js([Js(u'params')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2631_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeParameterDeclaration'), PyJs_Object_2630_) + PyJs_Object_2633_ = Js({}) + PyJs_Object_2632_ = Js({u'visitor':Js([Js(u'params')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2633_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'TypeParameterInstantiation'), PyJs_Object_2632_) + PyJs_Object_2635_ = Js({}) + PyJs_Object_2634_ = Js({u'visitor':Js([Js(u'properties'), Js(u'indexers'), Js(u'callProperties')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2635_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeAnnotation'), PyJs_Object_2634_) + PyJs_Object_2637_ = Js({}) + PyJs_Object_2636_ = Js({u'visitor':Js([Js(u'value')]),u'aliases':Js([Js(u'Flow'), Js(u'UserWhitespacable')]),u'fields':PyJs_Object_2637_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeCallProperty'), PyJs_Object_2636_) + PyJs_Object_2639_ = Js({}) + PyJs_Object_2638_ = Js({u'visitor':Js([Js(u'id'), Js(u'key'), Js(u'value')]),u'aliases':Js([Js(u'Flow'), Js(u'UserWhitespacable')]),u'fields':PyJs_Object_2639_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeIndexer'), PyJs_Object_2638_) + PyJs_Object_2641_ = Js({}) + PyJs_Object_2640_ = Js({u'visitor':Js([Js(u'key'), Js(u'value')]),u'aliases':Js([Js(u'Flow'), Js(u'UserWhitespacable')]),u'fields':PyJs_Object_2641_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'ObjectTypeProperty'), PyJs_Object_2640_) + PyJs_Object_2643_ = Js({}) + PyJs_Object_2642_ = Js({u'visitor':Js([Js(u'id'), Js(u'qualification')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2643_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'QualifiedTypeIdentifier'), PyJs_Object_2642_) + PyJs_Object_2645_ = Js({}) + PyJs_Object_2644_ = Js({u'visitor':Js([Js(u'types')]),u'aliases':Js([Js(u'Flow')]),u'fields':PyJs_Object_2645_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'UnionTypeAnnotation'), PyJs_Object_2644_) + PyJs_Object_2647_ = Js({}) + PyJs_Object_2646_ = Js({u'aliases':Js([Js(u'Flow'), Js(u'FlowBaseAnnotation')]),u'fields':PyJs_Object_2647_}) + PyJsComma(Js(0.0),var.get(u'_index2').get(u'default'))(Js(u'VoidTypeAnnotation'), PyJs_Object_2646_) +PyJs_anonymous_2560_._set_name(u'anonymous') +PyJs_Object_2648_ = Js({u'./index':Js(253.0)}) +@Js +def PyJs_anonymous_2649_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'chain', u'BUILDER_KEYS', u'defineType', u'assertNodeOrValueType', u'module', u'_interopRequireDefault', u'_getIterator2', u'_getIterator3', u'assertEach', u'_typeof2', u'_typeof3', u'VISITOR_KEYS', u'NODE_FIELDS', u'assertOneOf', u'store', u'DEPRECATED_KEYS', u'exports', u'_stringify2', u'assertNodeType', u'_interopRequireWildcard', u'ALIAS_KEYS', u'getType', u'_index', u'require', u'assertValueType', u'_stringify', u't']) + @Js + def PyJsHoisted_assertNodeType_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'validate', u'_len2', u'types', u'_key2']) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'key', u'val', u'valid', u'_i', u'_ref', u'type']) + var.put(u'valid', Js(False)) + #for JS loop + var.put(u'_iterator', var.get(u'types')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'type', var.get(u'_ref')) + if var.get(u't').callprop(u'is', var.get(u'type'), var.get(u'val')): + var.put(u'valid', var.get(u'true')) + break + + if var.get(u'valid').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((((((Js(u'Property ')+var.get(u'key'))+Js(u' of '))+var.get(u'node').get(u'type'))+Js(u' expected node to be of a type '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'types')))+Js(u' '))+(Js(u'but instead got ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))((var.get(u'val') and var.get(u'val').get(u'type'))))))) + raise PyJsTempException + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len2', var.get(u'arguments').get(u'length')) + var.put(u'types', var.get(u'Array')(var.get(u'_len2'))) + var.put(u'_key2', Js(0.0)) + while (var.get(u'_key2')=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'fn', var.get(u'_ref3')) + var.get(u'fn').callprop(u'apply', var.get(u'undefined'), var.get(u'arguments')) + + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len4', var.get(u'arguments').get(u'length')) + var.put(u'fns', var.get(u'Array')(var.get(u'_len4'))) + var.put(u'_key4', Js(0.0)) + while (var.get(u'_key4')=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'type', var.get(u'_ref2')) + if (PyJsStrictEq(var.get(u'getType')(var.get(u'val')),var.get(u'type')) or var.get(u't').callprop(u'is', var.get(u'type'), var.get(u'val'))): + var.put(u'valid', var.get(u'true')) + break + + if var.get(u'valid').neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((((((((Js(u'Property ')+var.get(u'key'))+Js(u' of '))+var.get(u'node').get(u'type'))+Js(u' expected node to be of a type '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'types')))+Js(u' '))+(Js(u'but instead got ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))((var.get(u'val') and var.get(u'val').get(u'type'))))))) + raise PyJsTempException + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + #for JS loop + var.put(u'_len3', var.get(u'arguments').get(u'length')) + var.put(u'types', var.get(u'Array')(var.get(u'_len3'))) + var.put(u'_key3', Js(0.0)) + while (var.get(u'_key3')Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_2657_)) + PyJs_Object_2658_ = Js({}) + var.put(u'inherits', ((var.get(u'opts').get(u'inherits') and var.get(u'store').get(var.get(u'opts').get(u'inherits'))) or PyJs_Object_2658_)) + PyJs_Object_2659_ = Js({}) + var.get(u'opts').put(u'fields', ((var.get(u'opts').get(u'fields') or var.get(u'inherits').get(u'fields')) or PyJs_Object_2659_)) + var.get(u'opts').put(u'visitor', ((var.get(u'opts').get(u'visitor') or var.get(u'inherits').get(u'visitor')) or Js([]))) + var.get(u'opts').put(u'aliases', ((var.get(u'opts').get(u'aliases') or var.get(u'inherits').get(u'aliases')) or Js([]))) + var.get(u'opts').put(u'builder', (((var.get(u'opts').get(u'builder') or var.get(u'inherits').get(u'builder')) or var.get(u'opts').get(u'visitor')) or Js([]))) + if var.get(u'opts').get(u'deprecatedAlias'): + var.get(u'DEPRECATED_KEYS').put(var.get(u'opts').get(u'deprecatedAlias'), var.get(u'type')) + #for JS loop + var.put(u'_iterator4', var.get(u'opts').get(u'visitor').callprop(u'concat', var.get(u'opts').get(u'builder'))) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'_key5', var.get(u'_ref4')) + PyJs_Object_2660_ = Js({}) + var.get(u'opts').get(u'fields').put(var.get(u'_key5'), (var.get(u'opts').get(u'fields').get(var.get(u'_key5')) or PyJs_Object_2660_)) + + for PyJsTemp in var.get(u'opts').get(u'fields'): + var.put(u'key', PyJsTemp) + var.put(u'field', var.get(u'opts').get(u'fields').get(var.get(u'key'))) + if PyJsStrictEq(var.get(u'opts').get(u'builder').callprop(u'indexOf', var.get(u'key')),(-Js(1.0))): + var.get(u'field').put(u'optional', var.get(u'true')) + if PyJsStrictEq(var.get(u'field').get(u'default'),var.get(u'undefined')): + var.get(u'field').put(u'default', var.get(u"null")) + else: + if var.get(u'field').get(u'validate').neg(): + var.get(u'field').put(u'validate', var.get(u'assertValueType')(var.get(u'getType')(var.get(u'field').get(u'default')))) + var.get(u'VISITOR_KEYS').put(var.get(u'type'), var.get(u'opts').get(u'visitor')) + var.get(u'BUILDER_KEYS').put(var.get(u'type'), var.get(u'opts').get(u'builder')) + var.get(u'NODE_FIELDS').put(var.get(u'type'), var.get(u'opts').get(u'fields')) + var.get(u'ALIAS_KEYS').put(var.get(u'type'), var.get(u'opts').get(u'aliases')) + var.get(u'store').put(var.get(u'type'), var.get(u'opts')) + PyJsHoisted_defineType_.func_name = u'defineType' + var.put(u'defineType', PyJsHoisted_defineType_) + @Js + def PyJsHoisted_assertEach_(callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'arguments':arguments}, var) + var.registers([u'callback', u'validator']) + @Js + def PyJsHoisted_validator_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'val', u'key']) + if var.get(u'Array').callprop(u'isArray', var.get(u'val')).neg(): + return var.get('undefined') + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0)): + continue + if var.get(u't').callprop(u'isAnyTypeAnnotation', var.get(u'node')): + return Js([var.get(u'node')]) + if var.get(u't').callprop(u'isFlowBaseAnnotation', var.get(u'node')): + var.get(u'bases').put(var.get(u'node').get(u'type'), var.get(u'node')) + continue + if var.get(u't').callprop(u'isUnionTypeAnnotation', var.get(u'node')): + if (var.get(u'typeGroups').callprop(u'indexOf', var.get(u'node').get(u'types'))=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'_key2', var.get(u'_ref5')) + if (var.get(u'child').get(var.get(u'_key2'))==var.get(u"null")): + var.get(u'child').put(var.get(u'_key2'), var.get(u'parent').get(var.get(u'_key2'))) + + for PyJsTemp in var.get(u'parent'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + var.get(u'child').put(var.get(u'key'), var.get(u'parent').get(var.get(u'key'))) + #for JS loop + var.put(u'_iterator6', var.get(u't').get(u'INHERIT_KEYS').get(u'force')) + var.put(u'_isArray6', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator6'))) + var.put(u'_i6', Js(0.0)) + var.put(u'_iterator6', (var.get(u'_iterator6') if var.get(u'_isArray6') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator6')))) + while 1: + pass + if var.get(u'_isArray6'): + if (var.get(u'_i6')>=var.get(u'_iterator6').get(u'length')): + break + var.put(u'_ref6', var.get(u'_iterator6').get((var.put(u'_i6',Js(var.get(u'_i6').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i6', var.get(u'_iterator6').callprop(u'next')) + if var.get(u'_i6').get(u'done'): + break + var.put(u'_ref6', var.get(u'_i6').get(u'value')) + var.put(u'_key3', var.get(u'_ref6')) + var.get(u'child').put(var.get(u'_key3'), var.get(u'parent').get(var.get(u'_key3'))) + + var.get(u't').callprop(u'inheritsComments', var.get(u'child'), var.get(u'parent')) + return var.get(u'child') + PyJsHoisted_inherits_.func_name = u'inherits' + var.put(u'inherits', PyJsHoisted_inherits_) + @Js + def PyJsHoisted_buildMatchMemberExpression_(match, allowPartial, this, arguments, var=var): + var = Scope({u'this':this, u'allowPartial':allowPartial, u'match':match, u'arguments':arguments}, var) + var.registers([u'parts', u'allowPartial', u'match']) + var.put(u'parts', var.get(u'match').callprop(u'split', Js(u'.'))) + @Js + def PyJs_anonymous_2823_(member, this, arguments, var=var): + var = Scope({u'member':member, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'search', u'member']) + if var.get(u't').callprop(u'isMemberExpression', var.get(u'member')).neg(): + return Js(False) + var.put(u'search', Js([var.get(u'member')])) + var.put(u'i', Js(0.0)) + while var.get(u'search').get(u'length'): + var.put(u'node', var.get(u'search').callprop(u'shift')) + if (var.get(u'allowPartial') and PyJsStrictEq(var.get(u'i'),var.get(u'parts').get(u'length'))): + return var.get(u'true') + if var.get(u't').callprop(u'isIdentifier', var.get(u'node')): + if PyJsStrictNeq(var.get(u'parts').get(var.get(u'i')),var.get(u'node').get(u'name')): + return Js(False) + else: + if var.get(u't').callprop(u'isStringLiteral', var.get(u'node')): + if PyJsStrictNeq(var.get(u'parts').get(var.get(u'i')),var.get(u'node').get(u'value')): + return Js(False) + else: + if var.get(u't').callprop(u'isMemberExpression', var.get(u'node')): + if (var.get(u'node').get(u'computed') and var.get(u't').callprop(u'isStringLiteral', var.get(u'node').get(u'property')).neg()): + return Js(False) + else: + var.get(u'search').callprop(u'push', var.get(u'node').get(u'object')) + var.get(u'search').callprop(u'push', var.get(u'node').get(u'property')) + continue + else: + return Js(False) + if (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))>var.get(u'parts').get(u'length')): + return Js(False) + return var.get(u'true') + PyJs_anonymous_2823_._set_name(u'anonymous') + return PyJs_anonymous_2823_ + PyJsHoisted_buildMatchMemberExpression_.func_name = u'buildMatchMemberExpression' + var.put(u'buildMatchMemberExpression', PyJsHoisted_buildMatchMemberExpression_) + @Js + def PyJsHoisted_cloneDeep_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode', u'val', u'key']) + PyJs_Object_2822_ = Js({}) + var.put(u'newNode', PyJs_Object_2822_) + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + continue + var.put(u'val', var.get(u'node').get(var.get(u'key'))) + if var.get(u'val'): + if var.get(u'val').get(u'type'): + var.put(u'val', var.get(u't').callprop(u'cloneDeep', var.get(u'val'))) + else: + if var.get(u'Array').callprop(u'isArray', var.get(u'val')): + var.put(u'val', var.get(u'val').callprop(u'map', var.get(u't').get(u'cloneDeep'))) + var.get(u'newNode').put(var.get(u'key'), var.get(u'val')) + return var.get(u'newNode') + PyJsHoisted_cloneDeep_.func_name = u'cloneDeep' + var.put(u'cloneDeep', PyJsHoisted_cloneDeep_) + @Js + def PyJsHoisted_is_(type, node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'type':type, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'matches', u'node', u'type', u'opts']) + if var.get(u'node').neg(): + return Js(False) + var.put(u'matches', var.get(u'isType')(var.get(u'node').get(u'type'), var.get(u'type'))) + if var.get(u'matches').neg(): + return Js(False) + if PyJsStrictEq(var.get(u'opts',throw=False).typeof(),Js(u'undefined')): + return var.get(u'true') + else: + return var.get(u't').callprop(u'shallowEqual', var.get(u'node'), var.get(u'opts')) + PyJsHoisted_is_.func_name = u'is' + var.put(u'is', PyJsHoisted_is_) + @Js + def PyJsHoisted_inheritTrailingComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'_inheritComments')(Js(u'trailingComments'), var.get(u'child'), var.get(u'parent')) + PyJsHoisted_inheritTrailingComments_.func_name = u'inheritTrailingComments' + var.put(u'inheritTrailingComments', PyJsHoisted_inheritTrailingComments_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2809_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2809_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isType_(nodeType, targetType, this, arguments, var=var): + var = Scope({u'this':this, u'targetType':targetType, u'nodeType':nodeType, u'arguments':arguments}, var) + var.registers([u'targetType', u'_isArray', u'_iterator', u'alias', u'_i', u'nodeType', u'_ref', u'aliases']) + if PyJsStrictEq(var.get(u'nodeType'),var.get(u'targetType')): + return var.get(u'true') + if var.get(u't').get(u'ALIAS_KEYS').get(var.get(u'targetType')): + return Js(False) + var.put(u'aliases', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'targetType'))) + if var.get(u'aliases'): + if PyJsStrictEq(var.get(u'aliases').get(u'0'),var.get(u'nodeType')): + return var.get(u'true') + #for JS loop + var.put(u'_iterator', var.get(u'aliases')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'alias', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'nodeType'),var.get(u'alias')): + return var.get(u'true') + + return Js(False) + PyJsHoisted_isType_.func_name = u'isType' + var.put(u'isType', PyJsHoisted_isType_) + @Js + def PyJsHoisted_shallowEqual_(actual, expected, this, arguments, var=var): + var = Scope({u'expected':expected, u'this':this, u'actual':actual, u'arguments':arguments}, var) + var.registers([u'_isArray3', u'keys', u'_ref3', u'_i3', u'key', u'expected', u'actual', u'_iterator3']) + var.put(u'keys', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u'expected'))) + #for JS loop + var.put(u'_iterator3', var.get(u'keys')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator3')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'key', var.get(u'_ref3')) + if PyJsStrictNeq(var.get(u'actual').get(var.get(u'key')),var.get(u'expected').get(var.get(u'key'))): + return Js(False) + + return var.get(u'true') + PyJsHoisted_shallowEqual_.func_name = u'shallowEqual' + var.put(u'shallowEqual', PyJsHoisted_shallowEqual_) + @Js + def PyJsHoisted_inheritInnerComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'_inheritComments')(Js(u'innerComments'), var.get(u'child'), var.get(u'parent')) + PyJsHoisted_inheritInnerComments_.func_name = u'inheritInnerComments' + var.put(u'inheritInnerComments', PyJsHoisted_inheritInnerComments_) + @Js + def PyJsHoisted_ensureBlock_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'key']) + var.put(u'key', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'body'))) + return var.get(u'node').put(var.get(u'key'), var.get(u't').callprop(u'toBlock', var.get(u'node').get(var.get(u'key')), var.get(u'node'))) + PyJsHoisted_ensureBlock_.func_name = u'ensureBlock' + var.put(u'ensureBlock', PyJsHoisted_ensureBlock_) + @Js + def PyJsHoisted_assertNode_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u'isNode')(var.get(u'node')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Not a valid node ')+(var.get(u'node') and var.get(u'node').get(u'type'))))) + raise PyJsTempException + PyJsHoisted_assertNode_.func_name = u'assertNode' + var.put(u'assertNode', PyJsHoisted_assertNode_) + @Js + def PyJsHoisted_inheritLeadingComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'_inheritComments')(Js(u'leadingComments'), var.get(u'child'), var.get(u'parent')) + PyJsHoisted_inheritLeadingComments_.func_name = u'inheritLeadingComments' + var.put(u'inheritLeadingComments', PyJsHoisted_inheritLeadingComments_) + @Js + def PyJsHoisted__inheritComments_(key, child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'key':key, u'child':child}, var) + var.registers([u'parent', u'key', u'child']) + if (var.get(u'child') and var.get(u'parent')): + var.get(u'child').put(var.get(u'key'), PyJsComma(Js(0.0),var.get(u'_uniq2').get(u'default'))(PyJsComma(Js(0.0),var.get(u'_compact2').get(u'default'))(Js([]).callprop(u'concat', var.get(u'child').get(var.get(u'key')), var.get(u'parent').get(var.get(u'key')))))) + PyJsHoisted__inheritComments_.func_name = u'_inheritComments' + var.put(u'_inheritComments', PyJsHoisted__inheritComments_) + @Js + def PyJsHoisted_removeProperties_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'map', u'_ref9', u'_i9', u'_ref10', u'_isArray9', u'syms', u'_i10', u'_iterator9', u'_key4', u'key', u'_isArray10', u'sym', u'_iterator10', u'opts']) + PyJs_Object_2825_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_2825_)) + var.put(u'map', (var.get(u'CLEAR_KEYS') if var.get(u'opts').get(u'preserveComments') else var.get(u'CLEAR_KEYS_PLUS_COMMENTS'))) + #for JS loop + var.put(u'_iterator9', var.get(u'map')) + var.put(u'_isArray9', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator9'))) + var.put(u'_i9', Js(0.0)) + var.put(u'_iterator9', (var.get(u'_iterator9') if var.get(u'_isArray9') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator9')))) + while 1: + pass + if var.get(u'_isArray9'): + if (var.get(u'_i9')>=var.get(u'_iterator9').get(u'length')): + break + var.put(u'_ref9', var.get(u'_iterator9').get((var.put(u'_i9',Js(var.get(u'_i9').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i9', var.get(u'_iterator9').callprop(u'next')) + if var.get(u'_i9').get(u'done'): + break + var.put(u'_ref9', var.get(u'_i9').get(u'value')) + var.put(u'_key4', var.get(u'_ref9')) + if (var.get(u'node').get(var.get(u'_key4'))!=var.get(u"null")): + var.get(u'node').put(var.get(u'_key4'), var.get(u'undefined')) + + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + if (PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')) and (var.get(u'node').get(var.get(u'key'))!=var.get(u"null"))): + var.get(u'node').put(var.get(u'key'), var.get(u'undefined')) + var.put(u'syms', PyJsComma(Js(0.0),var.get(u'_getOwnPropertySymbols2').get(u'default'))(var.get(u'node'))) + #for JS loop + var.put(u'_iterator10', var.get(u'syms')) + var.put(u'_isArray10', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator10'))) + var.put(u'_i10', Js(0.0)) + var.put(u'_iterator10', (var.get(u'_iterator10') if var.get(u'_isArray10') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator10')))) + while 1: + pass + if var.get(u'_isArray10'): + if (var.get(u'_i10')>=var.get(u'_iterator10').get(u'length')): + break + var.put(u'_ref10', var.get(u'_iterator10').get((var.put(u'_i10',Js(var.get(u'_i10').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i10', var.get(u'_iterator10').callprop(u'next')) + if var.get(u'_i10').get(u'done'): + break + var.put(u'_ref10', var.get(u'_i10').get(u'value')) + var.put(u'sym', var.get(u'_ref10')) + var.get(u'node').put(var.get(u'sym'), var.get(u"null")) + + PyJsHoisted_removeProperties_.func_name = u'removeProperties' + var.put(u'removeProperties', PyJsHoisted_removeProperties_) + @Js + def PyJsHoisted_isNode_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u'node') and var.get(u'_definitions').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))).neg().neg() + PyJsHoisted_isNode_.func_name = u'isNode' + var.put(u'isNode', PyJsHoisted_isNode_) + @Js + def PyJsHoisted_inheritsComments_(child, parent, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'parent':parent, u'child':child}, var) + var.registers([u'parent', u'child']) + var.get(u'inheritTrailingComments')(var.get(u'child'), var.get(u'parent')) + var.get(u'inheritLeadingComments')(var.get(u'child'), var.get(u'parent')) + var.get(u'inheritInnerComments')(var.get(u'child'), var.get(u'parent')) + return var.get(u'child') + PyJsHoisted_inheritsComments_.func_name = u'inheritsComments' + var.put(u'inheritsComments', PyJsHoisted_inheritsComments_) + @Js + def PyJsHoisted_removeComments_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray4', u'_i4', u'key', u'_iterator4', u'_ref4']) + #for JS loop + var.put(u'_iterator4', var.get(u't').get(u'COMMENT_KEYS')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator4')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'key', var.get(u'_ref4')) + var.get(u'node').delete(var.get(u'key')) + + return var.get(u'node') + PyJsHoisted_removeComments_.func_name = u'removeComments' + var.put(u'removeComments', PyJsHoisted_removeComments_) + @Js + def PyJsHoisted__interopRequireWildcard_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj', u'key', u'newObj']) + if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')): + return var.get(u'obj') + else: + PyJs_Object_2808_ = Js({}) + var.put(u'newObj', PyJs_Object_2808_) + if (var.get(u'obj')!=var.get(u"null")): + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'newObj').put(var.get(u'key'), var.get(u'obj').get(var.get(u'key'))) + var.get(u'newObj').put(u'default', var.get(u'obj')) + return var.get(u'newObj') + PyJsHoisted__interopRequireWildcard_.func_name = u'_interopRequireWildcard' + var.put(u'_interopRequireWildcard', PyJsHoisted__interopRequireWildcard_) + @Js + def PyJsHoisted_removePropertiesDeep_(tree, opts, this, arguments, var=var): + var = Scope({u'this':this, u'tree':tree, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'tree', u'opts']) + var.get(u'traverseFast')(var.get(u'tree'), var.get(u'removeProperties'), var.get(u'opts')) + return var.get(u'tree') + PyJsHoisted_removePropertiesDeep_.func_name = u'removePropertiesDeep' + var.put(u'removePropertiesDeep', PyJsHoisted_removePropertiesDeep_) + @Js + def PyJsHoisted_clone_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode', u'key']) + PyJs_Object_2821_ = Js({}) + var.put(u'newNode', PyJs_Object_2821_) + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + if PyJsStrictEq(var.get(u'key').get(u'0'),Js(u'_')): + continue + var.get(u'newNode').put(var.get(u'key'), var.get(u'node').get(var.get(u'key'))) + return var.get(u'newNode') + PyJsHoisted_clone_.func_name = u'clone' + var.put(u'clone', PyJsHoisted_clone_) + @Js + def PyJsHoisted_appendToMemberExpression_(member, append, computed, this, arguments, var=var): + var = Scope({u'member':member, u'this':this, u'computed':computed, u'append':append, u'arguments':arguments}, var) + var.registers([u'member', u'computed', u'append']) + var.get(u'member').put(u'object', var.get(u't').callprop(u'memberExpression', var.get(u'member').get(u'object'), var.get(u'member').get(u'property'), var.get(u'member').get(u'computed'))) + var.get(u'member').put(u'property', var.get(u'append')) + var.get(u'member').put(u'computed', var.get(u'computed').neg().neg()) + return var.get(u'member') + PyJsHoisted_appendToMemberExpression_.func_name = u'appendToMemberExpression' + var.put(u'appendToMemberExpression', PyJsHoisted_appendToMemberExpression_) + @Js + def PyJsHoisted_validate_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'fields', u'val', u'key', u'field']) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'fields', var.get(u't').get(u'NODE_FIELDS').get(var.get(u'node').get(u'type'))) + if var.get(u'fields').neg(): + return var.get('undefined') + var.put(u'field', var.get(u'fields').get(var.get(u'key'))) + if (var.get(u'field').neg() or var.get(u'field').get(u'validate').neg()): + return var.get('undefined') + if (var.get(u'field').get(u'optional') and (var.get(u'val')==var.get(u"null"))): + return var.get('undefined') + var.get(u'field').callprop(u'validate', var.get(u'node'), var.get(u'key'), var.get(u'val')) + PyJsHoisted_validate_.func_name = u'validate' + var.put(u'validate', PyJsHoisted_validate_) + @Js + def PyJsHoisted_traverseFast_(node, enter, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts, u'enter':enter}, var) + var.registers([u'_isArray7', u'node', u'_ref7', u'_i8', u'keys', u'_ref8', u'_isArray8', u'_i7', u'_node', u'_iterator8', u'key', u'enter', u'_iterator7', u'subNode', u'opts']) + if var.get(u'node').neg(): + return var.get('undefined') + var.put(u'keys', var.get(u't').get(u'VISITOR_KEYS').get(var.get(u'node').get(u'type'))) + if var.get(u'keys').neg(): + return var.get('undefined') + PyJs_Object_2824_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_2824_)) + var.get(u'enter')(var.get(u'node'), var.get(u'opts')) + #for JS loop + var.put(u'_iterator7', var.get(u'keys')) + var.put(u'_isArray7', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator7'))) + var.put(u'_i7', Js(0.0)) + var.put(u'_iterator7', (var.get(u'_iterator7') if var.get(u'_isArray7') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator7')))) + while 1: + pass + if var.get(u'_isArray7'): + if (var.get(u'_i7')>=var.get(u'_iterator7').get(u'length')): + break + var.put(u'_ref7', var.get(u'_iterator7').get((var.put(u'_i7',Js(var.get(u'_i7').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i7', var.get(u'_iterator7').callprop(u'next')) + if var.get(u'_i7').get(u'done'): + break + var.put(u'_ref7', var.get(u'_i7').get(u'value')) + var.put(u'key', var.get(u'_ref7')) + var.put(u'subNode', var.get(u'node').get(var.get(u'key'))) + if var.get(u'Array').callprop(u'isArray', var.get(u'subNode')): + #for JS loop + var.put(u'_iterator8', var.get(u'subNode')) + var.put(u'_isArray8', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator8'))) + var.put(u'_i8', Js(0.0)) + var.put(u'_iterator8', (var.get(u'_iterator8') if var.get(u'_isArray8') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator8')))) + while 1: + pass + if var.get(u'_isArray8'): + if (var.get(u'_i8')>=var.get(u'_iterator8').get(u'length')): + break + var.put(u'_ref8', var.get(u'_iterator8').get((var.put(u'_i8',Js(var.get(u'_i8').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i8', var.get(u'_iterator8').callprop(u'next')) + if var.get(u'_i8').get(u'done'): + break + var.put(u'_ref8', var.get(u'_i8').get(u'value')) + var.put(u'_node', var.get(u'_ref8')) + var.get(u'traverseFast')(var.get(u'_node'), var.get(u'enter'), var.get(u'opts')) + + else: + var.get(u'traverseFast')(var.get(u'subNode'), var.get(u'enter'), var.get(u'opts')) + + PyJsHoisted_traverseFast_.func_name = u'traverseFast' + var.put(u'traverseFast', PyJsHoisted_traverseFast_) + @Js + def PyJsHoisted_prependToMemberExpression_(member, prepend, this, arguments, var=var): + var = Scope({u'member':member, u'this':this, u'arguments':arguments, u'prepend':prepend}, var) + var.registers([u'member', u'prepend']) + var.get(u'member').put(u'object', var.get(u't').callprop(u'memberExpression', var.get(u'prepend'), var.get(u'member').get(u'object'))) + return var.get(u'member') + PyJsHoisted_prependToMemberExpression_.func_name = u'prependToMemberExpression' + var.put(u'prependToMemberExpression', PyJsHoisted_prependToMemberExpression_) + @Js + def PyJsHoisted_registerType_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'is', u'type']) + var.put(u'is', var.get(u't').get((Js(u'is')+var.get(u'type')))) + if var.get(u'is').neg(): + @Js + def PyJs_anonymous_2810_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'opts']) + return var.get(u't').callprop(u'is', var.get(u'type'), var.get(u'node'), var.get(u'opts')) + PyJs_anonymous_2810_._set_name(u'anonymous') + var.put(u'is', var.get(u't').put((Js(u'is')+var.get(u'type')), PyJs_anonymous_2810_)) + @Js + def PyJs_anonymous_2811_(node, opts, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'node', u'opts']) + PyJs_Object_2812_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_2812_)) + if var.get(u'is')(var.get(u'node'), var.get(u'opts')).neg(): + PyJsTempException = JsToPyException(var.get(u'Error').create((((Js(u'Expected type ')+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'type')))+Js(u' with option '))+PyJsComma(Js(0.0),var.get(u'_stringify2').get(u'default'))(var.get(u'opts'))))) + raise PyJsTempException + PyJs_anonymous_2811_._set_name(u'anonymous') + var.get(u't').put((Js(u'assert')+var.get(u'type')), PyJs_anonymous_2811_) + PyJsHoisted_registerType_.func_name = u'registerType' + var.put(u'registerType', PyJsHoisted_registerType_) + @Js + def PyJsHoisted_cloneWithoutLoc_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'newNode']) + var.put(u'newNode', var.get(u'clone')(var.get(u'node'))) + var.get(u'newNode').delete(u'loc') + return var.get(u'newNode') + PyJsHoisted_cloneWithoutLoc_.func_name = u'cloneWithoutLoc' + var.put(u'cloneWithoutLoc', PyJsHoisted_cloneWithoutLoc_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + def PyJs_LONG_2723_(var=var): + def PyJs_LONG_2722_(var=var): + def PyJs_LONG_2721_(var=var): + def PyJs_LONG_2720_(var=var): + def PyJs_LONG_2719_(var=var): + return var.get(u'exports').put(u'EQUALITY_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'UPDATE_OPERATORS', var.get(u'exports').put(u'LOGICAL_OPERATORS', var.get(u'exports').put(u'COMMENT_KEYS', var.get(u'exports').put(u'FOR_INIT_KEYS', var.get(u'exports').put(u'FLATTENABLE_KEYS', var.get(u'exports').put(u'STATEMENT_OR_BLOCK_KEYS', var.get(u'undefined'))))))))) + return var.get(u'exports').put(u'UNARY_OPERATORS', var.get(u'exports').put(u'STRING_UNARY_OPERATORS', var.get(u'exports').put(u'NUMBER_UNARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_UNARY_OPERATORS', var.get(u'exports').put(u'BINARY_OPERATORS', var.get(u'exports').put(u'NUMBER_BINARY_OPERATORS', var.get(u'exports').put(u'BOOLEAN_BINARY_OPERATORS', var.get(u'exports').put(u'COMPARISON_BINARY_OPERATORS', PyJs_LONG_2719_())))))))) + return var.get(u'exports').put(u'TYPES', var.get(u'exports').put(u'react', var.get(u'exports').put(u'DEPRECATED_KEYS', var.get(u'exports').put(u'BUILDER_KEYS', var.get(u'exports').put(u'NODE_FIELDS', var.get(u'exports').put(u'ALIAS_KEYS', var.get(u'exports').put(u'VISITOR_KEYS', var.get(u'exports').put(u'NOT_LOCAL_BINDING', var.get(u'exports').put(u'BLOCK_SCOPED_SYMBOL', var.get(u'exports').put(u'INHERIT_KEYS', PyJs_LONG_2720_())))))))))) + return var.get(u'exports').put(u'isSpecifierDefault', var.get(u'exports').put(u'isVar', var.get(u'exports').put(u'isBlockScoped', var.get(u'exports').put(u'isLet', var.get(u'exports').put(u'isValidIdentifier', var.get(u'exports').put(u'isReferenced', var.get(u'exports').put(u'isBinding', var.get(u'exports').put(u'getOuterBindingIdentifiers', var.get(u'exports').put(u'getBindingIdentifiers', PyJs_LONG_2721_()))))))))) + return var.get(u'exports').put(u'toExpression', var.get(u'exports').put(u'toStatement', var.get(u'exports').put(u'toBindingIdentifierName', var.get(u'exports').put(u'toIdentifier', var.get(u'exports').put(u'toKeyAlias', var.get(u'exports').put(u'toSequenceExpression', var.get(u'exports').put(u'toComputedKey', var.get(u'exports').put(u'isImmutable', var.get(u'exports').put(u'isScope', PyJs_LONG_2722_()))))))))) + var.get(u'exports').put(u'createTypeAnnotationBasedOnTypeof', var.get(u'exports').put(u'removeTypeDuplicates', var.get(u'exports').put(u'createUnionTypeAnnotation', var.get(u'exports').put(u'valueToNode', var.get(u'exports').put(u'toBlock', PyJs_LONG_2723_()))))) + var.put(u'_getOwnPropertySymbols', var.get(u'require')(Js(u'babel-runtime/core-js/object/get-own-property-symbols'))) + var.put(u'_getOwnPropertySymbols2', var.get(u'_interopRequireDefault')(var.get(u'_getOwnPropertySymbols'))) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.put(u'_keys', var.get(u'require')(Js(u'babel-runtime/core-js/object/keys'))) + var.put(u'_keys2', var.get(u'_interopRequireDefault')(var.get(u'_keys'))) + var.put(u'_stringify', var.get(u'require')(Js(u'babel-runtime/core-js/json/stringify'))) + var.put(u'_stringify2', var.get(u'_interopRequireDefault')(var.get(u'_stringify'))) + var.put(u'_constants', var.get(u'require')(Js(u'./constants'))) + @Js + def PyJs_get_2725_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2725_}, var) + var.registers([]) + return var.get(u'_constants').get(u'STATEMENT_OR_BLOCK_KEYS') + PyJs_get_2725_._set_name(u'get') + PyJs_Object_2724_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2725_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'STATEMENT_OR_BLOCK_KEYS'), PyJs_Object_2724_) + @Js + def PyJs_get_2727_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2727_}, var) + var.registers([]) + return var.get(u'_constants').get(u'FLATTENABLE_KEYS') + PyJs_get_2727_._set_name(u'get') + PyJs_Object_2726_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2727_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'FLATTENABLE_KEYS'), PyJs_Object_2726_) + @Js + def PyJs_get_2729_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2729_}, var) + var.registers([]) + return var.get(u'_constants').get(u'FOR_INIT_KEYS') + PyJs_get_2729_._set_name(u'get') + PyJs_Object_2728_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2729_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'FOR_INIT_KEYS'), PyJs_Object_2728_) + @Js + def PyJs_get_2731_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2731_}, var) + var.registers([]) + return var.get(u'_constants').get(u'COMMENT_KEYS') + PyJs_get_2731_._set_name(u'get') + PyJs_Object_2730_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2731_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'COMMENT_KEYS'), PyJs_Object_2730_) + @Js + def PyJs_get_2733_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2733_}, var) + var.registers([]) + return var.get(u'_constants').get(u'LOGICAL_OPERATORS') + PyJs_get_2733_._set_name(u'get') + PyJs_Object_2732_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2733_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'LOGICAL_OPERATORS'), PyJs_Object_2732_) + @Js + def PyJs_get_2735_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2735_}, var) + var.registers([]) + return var.get(u'_constants').get(u'UPDATE_OPERATORS') + PyJs_get_2735_._set_name(u'get') + PyJs_Object_2734_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2735_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'UPDATE_OPERATORS'), PyJs_Object_2734_) + @Js + def PyJs_get_2737_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2737_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BOOLEAN_NUMBER_BINARY_OPERATORS') + PyJs_get_2737_._set_name(u'get') + PyJs_Object_2736_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2737_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BOOLEAN_NUMBER_BINARY_OPERATORS'), PyJs_Object_2736_) + @Js + def PyJs_get_2739_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2739_}, var) + var.registers([]) + return var.get(u'_constants').get(u'EQUALITY_BINARY_OPERATORS') + PyJs_get_2739_._set_name(u'get') + PyJs_Object_2738_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2739_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'EQUALITY_BINARY_OPERATORS'), PyJs_Object_2738_) + @Js + def PyJs_get_2741_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2741_}, var) + var.registers([]) + return var.get(u'_constants').get(u'COMPARISON_BINARY_OPERATORS') + PyJs_get_2741_._set_name(u'get') + PyJs_Object_2740_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2741_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'COMPARISON_BINARY_OPERATORS'), PyJs_Object_2740_) + @Js + def PyJs_get_2743_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2743_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BOOLEAN_BINARY_OPERATORS') + PyJs_get_2743_._set_name(u'get') + PyJs_Object_2742_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2743_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BOOLEAN_BINARY_OPERATORS'), PyJs_Object_2742_) + @Js + def PyJs_get_2745_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2745_}, var) + var.registers([]) + return var.get(u'_constants').get(u'NUMBER_BINARY_OPERATORS') + PyJs_get_2745_._set_name(u'get') + PyJs_Object_2744_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2745_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NUMBER_BINARY_OPERATORS'), PyJs_Object_2744_) + @Js + def PyJs_get_2747_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2747_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BINARY_OPERATORS') + PyJs_get_2747_._set_name(u'get') + PyJs_Object_2746_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2747_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BINARY_OPERATORS'), PyJs_Object_2746_) + @Js + def PyJs_get_2749_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2749_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BOOLEAN_UNARY_OPERATORS') + PyJs_get_2749_._set_name(u'get') + PyJs_Object_2748_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2749_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BOOLEAN_UNARY_OPERATORS'), PyJs_Object_2748_) + @Js + def PyJs_get_2751_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2751_}, var) + var.registers([]) + return var.get(u'_constants').get(u'NUMBER_UNARY_OPERATORS') + PyJs_get_2751_._set_name(u'get') + PyJs_Object_2750_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2751_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NUMBER_UNARY_OPERATORS'), PyJs_Object_2750_) + @Js + def PyJs_get_2753_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2753_}, var) + var.registers([]) + return var.get(u'_constants').get(u'STRING_UNARY_OPERATORS') + PyJs_get_2753_._set_name(u'get') + PyJs_Object_2752_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2753_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'STRING_UNARY_OPERATORS'), PyJs_Object_2752_) + @Js + def PyJs_get_2755_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2755_}, var) + var.registers([]) + return var.get(u'_constants').get(u'UNARY_OPERATORS') + PyJs_get_2755_._set_name(u'get') + PyJs_Object_2754_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2755_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'UNARY_OPERATORS'), PyJs_Object_2754_) + @Js + def PyJs_get_2757_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2757_}, var) + var.registers([]) + return var.get(u'_constants').get(u'INHERIT_KEYS') + PyJs_get_2757_._set_name(u'get') + PyJs_Object_2756_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2757_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'INHERIT_KEYS'), PyJs_Object_2756_) + @Js + def PyJs_get_2759_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2759_}, var) + var.registers([]) + return var.get(u'_constants').get(u'BLOCK_SCOPED_SYMBOL') + PyJs_get_2759_._set_name(u'get') + PyJs_Object_2758_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2759_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'BLOCK_SCOPED_SYMBOL'), PyJs_Object_2758_) + @Js + def PyJs_get_2761_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2761_}, var) + var.registers([]) + return var.get(u'_constants').get(u'NOT_LOCAL_BINDING') + PyJs_get_2761_._set_name(u'get') + PyJs_Object_2760_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2761_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'NOT_LOCAL_BINDING'), PyJs_Object_2760_) + var.get(u'exports').put(u'is', var.get(u'is')) + var.get(u'exports').put(u'isType', var.get(u'isType')) + var.get(u'exports').put(u'validate', var.get(u'validate')) + var.get(u'exports').put(u'shallowEqual', var.get(u'shallowEqual')) + var.get(u'exports').put(u'appendToMemberExpression', var.get(u'appendToMemberExpression')) + var.get(u'exports').put(u'prependToMemberExpression', var.get(u'prependToMemberExpression')) + var.get(u'exports').put(u'ensureBlock', var.get(u'ensureBlock')) + var.get(u'exports').put(u'clone', var.get(u'clone')) + var.get(u'exports').put(u'cloneWithoutLoc', var.get(u'cloneWithoutLoc')) + var.get(u'exports').put(u'cloneDeep', var.get(u'cloneDeep')) + var.get(u'exports').put(u'buildMatchMemberExpression', var.get(u'buildMatchMemberExpression')) + var.get(u'exports').put(u'removeComments', var.get(u'removeComments')) + var.get(u'exports').put(u'inheritsComments', var.get(u'inheritsComments')) + var.get(u'exports').put(u'inheritTrailingComments', var.get(u'inheritTrailingComments')) + var.get(u'exports').put(u'inheritLeadingComments', var.get(u'inheritLeadingComments')) + var.get(u'exports').put(u'inheritInnerComments', var.get(u'inheritInnerComments')) + var.get(u'exports').put(u'inherits', var.get(u'inherits')) + var.get(u'exports').put(u'assertNode', var.get(u'assertNode')) + var.get(u'exports').put(u'isNode', var.get(u'isNode')) + var.get(u'exports').put(u'traverseFast', var.get(u'traverseFast')) + var.get(u'exports').put(u'removeProperties', var.get(u'removeProperties')) + var.get(u'exports').put(u'removePropertiesDeep', var.get(u'removePropertiesDeep')) + var.put(u'_retrievers', var.get(u'require')(Js(u'./retrievers'))) + @Js + def PyJs_get_2763_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2763_}, var) + var.registers([]) + return var.get(u'_retrievers').get(u'getBindingIdentifiers') + PyJs_get_2763_._set_name(u'get') + PyJs_Object_2762_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2763_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'getBindingIdentifiers'), PyJs_Object_2762_) + @Js + def PyJs_get_2765_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2765_}, var) + var.registers([]) + return var.get(u'_retrievers').get(u'getOuterBindingIdentifiers') + PyJs_get_2765_._set_name(u'get') + PyJs_Object_2764_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2765_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'getOuterBindingIdentifiers'), PyJs_Object_2764_) + var.put(u'_validators', var.get(u'require')(Js(u'./validators'))) + @Js + def PyJs_get_2767_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2767_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isBinding') + PyJs_get_2767_._set_name(u'get') + PyJs_Object_2766_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2767_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isBinding'), PyJs_Object_2766_) + @Js + def PyJs_get_2769_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2769_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isReferenced') + PyJs_get_2769_._set_name(u'get') + PyJs_Object_2768_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2769_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isReferenced'), PyJs_Object_2768_) + @Js + def PyJs_get_2771_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2771_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isValidIdentifier') + PyJs_get_2771_._set_name(u'get') + PyJs_Object_2770_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2771_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isValidIdentifier'), PyJs_Object_2770_) + @Js + def PyJs_get_2773_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2773_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isLet') + PyJs_get_2773_._set_name(u'get') + PyJs_Object_2772_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2773_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isLet'), PyJs_Object_2772_) + @Js + def PyJs_get_2775_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2775_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isBlockScoped') + PyJs_get_2775_._set_name(u'get') + PyJs_Object_2774_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2775_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isBlockScoped'), PyJs_Object_2774_) + @Js + def PyJs_get_2777_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2777_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isVar') + PyJs_get_2777_._set_name(u'get') + PyJs_Object_2776_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2777_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isVar'), PyJs_Object_2776_) + @Js + def PyJs_get_2779_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2779_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isSpecifierDefault') + PyJs_get_2779_._set_name(u'get') + PyJs_Object_2778_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2779_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isSpecifierDefault'), PyJs_Object_2778_) + @Js + def PyJs_get_2781_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2781_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isScope') + PyJs_get_2781_._set_name(u'get') + PyJs_Object_2780_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2781_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isScope'), PyJs_Object_2780_) + @Js + def PyJs_get_2783_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2783_}, var) + var.registers([]) + return var.get(u'_validators').get(u'isImmutable') + PyJs_get_2783_._set_name(u'get') + PyJs_Object_2782_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2783_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'isImmutable'), PyJs_Object_2782_) + var.put(u'_converters', var.get(u'require')(Js(u'./converters'))) + @Js + def PyJs_get_2785_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2785_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toComputedKey') + PyJs_get_2785_._set_name(u'get') + PyJs_Object_2784_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2785_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toComputedKey'), PyJs_Object_2784_) + @Js + def PyJs_get_2787_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2787_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toSequenceExpression') + PyJs_get_2787_._set_name(u'get') + PyJs_Object_2786_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2787_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toSequenceExpression'), PyJs_Object_2786_) + @Js + def PyJs_get_2789_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2789_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toKeyAlias') + PyJs_get_2789_._set_name(u'get') + PyJs_Object_2788_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2789_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toKeyAlias'), PyJs_Object_2788_) + @Js + def PyJs_get_2791_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2791_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toIdentifier') + PyJs_get_2791_._set_name(u'get') + PyJs_Object_2790_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2791_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toIdentifier'), PyJs_Object_2790_) + @Js + def PyJs_get_2793_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2793_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toBindingIdentifierName') + PyJs_get_2793_._set_name(u'get') + PyJs_Object_2792_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2793_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toBindingIdentifierName'), PyJs_Object_2792_) + @Js + def PyJs_get_2795_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2795_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toStatement') + PyJs_get_2795_._set_name(u'get') + PyJs_Object_2794_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2795_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toStatement'), PyJs_Object_2794_) + @Js + def PyJs_get_2797_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2797_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toExpression') + PyJs_get_2797_._set_name(u'get') + PyJs_Object_2796_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2797_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toExpression'), PyJs_Object_2796_) + @Js + def PyJs_get_2799_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2799_}, var) + var.registers([]) + return var.get(u'_converters').get(u'toBlock') + PyJs_get_2799_._set_name(u'get') + PyJs_Object_2798_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2799_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'toBlock'), PyJs_Object_2798_) + @Js + def PyJs_get_2801_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2801_}, var) + var.registers([]) + return var.get(u'_converters').get(u'valueToNode') + PyJs_get_2801_._set_name(u'get') + PyJs_Object_2800_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2801_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'valueToNode'), PyJs_Object_2800_) + var.put(u'_flow', var.get(u'require')(Js(u'./flow'))) + @Js + def PyJs_get_2803_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2803_}, var) + var.registers([]) + return var.get(u'_flow').get(u'createUnionTypeAnnotation') + PyJs_get_2803_._set_name(u'get') + PyJs_Object_2802_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2803_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'createUnionTypeAnnotation'), PyJs_Object_2802_) + @Js + def PyJs_get_2805_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2805_}, var) + var.registers([]) + return var.get(u'_flow').get(u'removeTypeDuplicates') + PyJs_get_2805_._set_name(u'get') + PyJs_Object_2804_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2805_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'removeTypeDuplicates'), PyJs_Object_2804_) + @Js + def PyJs_get_2807_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'get':PyJs_get_2807_}, var) + var.registers([]) + return var.get(u'_flow').get(u'createTypeAnnotationBasedOnTypeof') + PyJs_get_2807_._set_name(u'get') + PyJs_Object_2806_ = Js({u'enumerable':var.get(u'true'),u'get':PyJs_get_2807_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'createTypeAnnotationBasedOnTypeof'), PyJs_Object_2806_) + var.put(u'_toFastProperties', var.get(u'require')(Js(u'to-fast-properties'))) + var.put(u'_toFastProperties2', var.get(u'_interopRequireDefault')(var.get(u'_toFastProperties'))) + var.put(u'_compact', var.get(u'require')(Js(u'lodash/compact'))) + var.put(u'_compact2', var.get(u'_interopRequireDefault')(var.get(u'_compact'))) + var.put(u'_clone', var.get(u'require')(Js(u'lodash/clone'))) + var.put(u'_clone2', var.get(u'_interopRequireDefault')(var.get(u'_clone'))) + var.put(u'_each', var.get(u'require')(Js(u'lodash/each'))) + var.put(u'_each2', var.get(u'_interopRequireDefault')(var.get(u'_each'))) + var.put(u'_uniq', var.get(u'require')(Js(u'lodash/uniq'))) + var.put(u'_uniq2', var.get(u'_interopRequireDefault')(var.get(u'_uniq'))) + var.get(u'require')(Js(u'./definitions/init')) + var.put(u'_definitions', var.get(u'require')(Js(u'./definitions'))) + var.put(u'_react2', var.get(u'require')(Js(u'./react'))) + var.put(u'_react', var.get(u'_interopRequireWildcard')(var.get(u'_react2'))) + pass + pass + var.put(u't', var.get(u'exports')) + pass + var.get(u'exports').put(u'VISITOR_KEYS', var.get(u'_definitions').get(u'VISITOR_KEYS')) + var.get(u'exports').put(u'ALIAS_KEYS', var.get(u'_definitions').get(u'ALIAS_KEYS')) + var.get(u'exports').put(u'NODE_FIELDS', var.get(u'_definitions').get(u'NODE_FIELDS')) + var.get(u'exports').put(u'BUILDER_KEYS', var.get(u'_definitions').get(u'BUILDER_KEYS')) + var.get(u'exports').put(u'DEPRECATED_KEYS', var.get(u'_definitions').get(u'DEPRECATED_KEYS')) + var.get(u'exports').put(u'react', var.get(u'_react')) + for PyJsTemp in var.get(u't').get(u'VISITOR_KEYS'): + var.put(u'type', PyJsTemp) + var.get(u'registerType')(var.get(u'type')) + PyJs_Object_2813_ = Js({}) + var.get(u't').put(u'FLIPPED_ALIAS_KEYS', PyJs_Object_2813_) + @Js + def PyJs_anonymous_2814_(aliases, type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'aliases':aliases}, var) + var.registers([u'type', u'aliases']) + @Js + def PyJs_anonymous_2815_(alias, this, arguments, var=var): + var = Scope({u'this':this, u'alias':alias, u'arguments':arguments}, var) + var.registers([u'alias', u'types']) + var.put(u'types', var.get(u't').get(u'FLIPPED_ALIAS_KEYS').put(var.get(u'alias'), (var.get(u't').get(u'FLIPPED_ALIAS_KEYS').get(var.get(u'alias')) or Js([])))) + var.get(u'types').callprop(u'push', var.get(u'type')) + PyJs_anonymous_2815_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u'aliases'), PyJs_anonymous_2815_) + PyJs_anonymous_2814_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u't').get(u'ALIAS_KEYS'), PyJs_anonymous_2814_) + @Js + def PyJs_anonymous_2816_(types, type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'types':types}, var) + var.registers([u'type', u'types']) + var.get(u't').put((var.get(u'type').callprop(u'toUpperCase')+Js(u'_TYPES')), var.get(u'types')) + var.get(u'registerType')(var.get(u'type')) + PyJs_anonymous_2816_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u't').get(u'FLIPPED_ALIAS_KEYS'), PyJs_anonymous_2816_) + var.put(u'TYPES', var.get(u'exports').put(u'TYPES', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u't').get(u'VISITOR_KEYS')).callprop(u'concat', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u't').get(u'FLIPPED_ALIAS_KEYS'))).callprop(u'concat', PyJsComma(Js(0.0),var.get(u'_keys2').get(u'default'))(var.get(u't').get(u'DEPRECATED_KEYS'))))) + pass + pass + @Js + def PyJs_anonymous_2817_(keys, type, this, arguments, var=var): + var = Scope({u'keys':keys, u'this':this, u'type':type, u'arguments':arguments}, var) + var.registers([u'keys', u'builder', u'type']) + @Js + def PyJsHoisted_builder_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray2', u'field', u'i', u'_ref2', u'_i2', u'_key', u'key', u'arg', u'_iterator2']) + if (var.get(u'arguments').get(u'length')>var.get(u'keys').get(u'length')): + PyJsTempException = JsToPyException(var.get(u'Error').create((((((Js(u't.')+var.get(u'type'))+Js(u': Too many arguments passed. Received '))+var.get(u'arguments').get(u'length'))+Js(u' but can receive '))+(Js(u'no more than ')+var.get(u'keys').get(u'length'))))) + raise PyJsTempException + PyJs_Object_2818_ = Js({}) + var.put(u'node', PyJs_Object_2818_) + var.get(u'node').put(u'type', var.get(u'type')) + var.put(u'i', Js(0.0)) + #for JS loop + var.put(u'_iterator2', var.get(u'keys')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator2')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'_key', var.get(u'_ref2')) + var.put(u'field', var.get(u't').get(u'NODE_FIELDS').get(var.get(u'type')).get(var.get(u'_key'))) + var.put(u'arg', var.get(u'arguments').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if PyJsStrictEq(var.get(u'arg'),var.get(u'undefined')): + var.put(u'arg', PyJsComma(Js(0.0),var.get(u'_clone2').get(u'default'))(var.get(u'field').get(u'default'))) + var.get(u'node').put(var.get(u'_key'), var.get(u'arg')) + + for PyJsTemp in var.get(u'node'): + var.put(u'key', PyJsTemp) + var.get(u'validate')(var.get(u'node'), var.get(u'key'), var.get(u'node').get(var.get(u'key'))) + return var.get(u'node') + PyJsHoisted_builder_.func_name = u'builder' + var.put(u'builder', PyJsHoisted_builder_) + pass + var.get(u't').put(var.get(u'type'), var.get(u'builder')) + var.get(u't').put((var.get(u'type').get(u'0').callprop(u'toLowerCase')+var.get(u'type').callprop(u'slice', Js(1.0))), var.get(u'builder')) + PyJs_anonymous_2817_._set_name(u'anonymous') + PyJsComma(Js(0.0),var.get(u'_each2').get(u'default'))(var.get(u't').get(u'BUILDER_KEYS'), PyJs_anonymous_2817_) + @Js + def PyJs__loop_2819_(_type, this, arguments, var=var): + var = Scope({u'this':this, u'_type':_type, u'_loop':PyJs__loop_2819_, u'arguments':arguments}, var) + var.registers([u'_type', u'newType', u'proxy']) + @Js + def PyJsHoisted_proxy_(fn, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fn':fn}, var) + var.registers([u'fn']) + @Js + def PyJs_anonymous_2820_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'console').callprop(u'trace', (((Js(u'The node type ')+var.get(u'_type'))+Js(u' has been renamed to '))+var.get(u'newType'))) + return var.get(u'fn').callprop(u'apply', var.get(u"this"), var.get(u'arguments')) + PyJs_anonymous_2820_._set_name(u'anonymous') + return PyJs_anonymous_2820_ + PyJsHoisted_proxy_.func_name = u'proxy' + var.put(u'proxy', PyJsHoisted_proxy_) + var.put(u'newType', var.get(u't').get(u'DEPRECATED_KEYS').get(var.get(u'_type'))) + pass + var.get(u't').put(var.get(u'_type'), var.get(u't').put((var.get(u'_type').get(u'0').callprop(u'toLowerCase')+var.get(u'_type').callprop(u'slice', Js(1.0))), var.get(u'proxy')(var.get(u't').get(var.get(u'newType'))))) + var.get(u't').put((Js(u'is')+var.get(u'_type')), var.get(u'proxy')(var.get(u't').get((Js(u'is')+var.get(u'newType'))))) + var.get(u't').put((Js(u'assert')+var.get(u'_type')), var.get(u'proxy')(var.get(u't').get((Js(u'assert')+var.get(u'newType'))))) + PyJs__loop_2819_._set_name(u'_loop') + var.put(u'_loop', PyJs__loop_2819_) + for PyJsTemp in var.get(u't').get(u'DEPRECATED_KEYS'): + var.put(u'_type', PyJsTemp) + var.get(u'_loop')(var.get(u'_type')) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + PyJsComma(Js(0.0),var.get(u'_toFastProperties2').get(u'default'))(var.get(u't')) + PyJsComma(Js(0.0),var.get(u'_toFastProperties2').get(u'default'))(var.get(u't').get(u'VISITOR_KEYS')) + pass + var.put(u'CLEAR_KEYS', Js([Js(u'tokens'), Js(u'start'), Js(u'end'), Js(u'loc'), Js(u'raw'), Js(u'rawValue')])) + var.put(u'CLEAR_KEYS_PLUS_COMMENTS', var.get(u't').get(u'COMMENT_KEYS').callprop(u'concat', Js([Js(u'comments')])).callprop(u'concat', var.get(u'CLEAR_KEYS'))) + pass + pass +PyJs_anonymous_2718_._set_name(u'anonymous') +PyJs_Object_2826_ = Js({u'./constants':Js(247.0),u'./converters':Js(248.0),u'./definitions':Js(253.0),u'./definitions/init':Js(254.0),u'./flow':Js(257.0),u'./react':Js(259.0),u'./retrievers':Js(260.0),u'./validators':Js(261.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'babel-runtime/core-js/json/stringify':Js(97.0),u'babel-runtime/core-js/object/get-own-property-symbols':Js(102.0),u'babel-runtime/core-js/object/keys':Js(103.0),u'lodash/clone':Js(438.0),u'lodash/compact':Js(441.0),u'lodash/each':Js(443.0),u'lodash/uniq':Js(495.0),u'to-fast-properties':Js(522.0)}) +@Js +def PyJs_anonymous_2827_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'_interopRequireWildcard', u'_index', u'cleanJSXElementLiteralChild', u'require', u'module', u'buildChildren', u't', u'isReactComponent', u'isCompatTag']) + @Js + def PyJsHoisted_cleanJSXElementLiteralChild_(child, args, this, arguments, var=var): + var = Scope({u'this':this, u'args':args, u'arguments':arguments, u'child':child}, var) + var.registers([u'isLastNonEmptyLine', u'str', u'i', u'isLastLine', u'args', u'lines', u'lastNonEmptyLine', u'isFirstLine', u'_i', u'child', u'line', u'trimmedLine']) + var.put(u'lines', var.get(u'child').get(u'value').callprop(u'split', JsRegExp(u'/\\r\\n|\\n|\\r/'))) + var.put(u'lastNonEmptyLine', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0)): + return var.get(u'true') + else: + if PyJsStrictEq(var.get(u'val'),var.get(u'node')): + return var.get(u'true') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return Js(False) + PyJsHoisted_isBinding_.func_name = u'isBinding' + var.put(u'isBinding', PyJsHoisted_isBinding_) + @Js + def PyJsHoisted_isReferenced_(node, parent, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'parent':parent}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'parent', u'param', u'_i', u'_ref']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'parent').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BindExpression')): + SWITCHED = True + return (PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node')) or PyJsStrictEq(var.get(u'parent').get(u'callee'),var.get(u'node'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'JSXMemberExpression')): + SWITCHED = True + if (PyJsStrictEq(var.get(u'parent').get(u'property'),var.get(u'node')) and var.get(u'parent').get(u'computed')): + return var.get(u'true') + else: + if PyJsStrictEq(var.get(u'parent').get(u'object'),var.get(u'node')): + return var.get(u'true') + else: + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MetaProperty')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectProperty')): + SWITCHED = True + if PyJsStrictEq(var.get(u'parent').get(u'key'),var.get(u'node')): + return var.get(u'parent').get(u'computed') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'VariableDeclarator')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'id'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrowFunctionExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FunctionDeclaration')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FunctionExpression')): + SWITCHED = True + #for JS loop + var.put(u'_iterator', var.get(u'parent').get(u'params')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else PyJsComma(Js(0.0),var.get(u'_getIterator3').get(u'default'))(var.get(u'_iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'param'),var.get(u'node')): + return Js(False) + + return PyJsStrictNeq(var.get(u'parent').get(u'id'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExportSpecifier')): + SWITCHED = True + if var.get(u'parent').get(u'source'): + return Js(False) + else: + return PyJsStrictEq(var.get(u'parent').get(u'local'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExportNamespaceSpecifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExportDefaultSpecifier')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'JSXAttribute')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'name'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassProperty')): + SWITCHED = True + if PyJsStrictEq(var.get(u'parent').get(u'key'),var.get(u'node')): + return var.get(u'parent').get(u'computed') + else: + return PyJsStrictEq(var.get(u'parent').get(u'value'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ImportDefaultSpecifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ImportNamespaceSpecifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ImportSpecifier')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassDeclaration')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassExpression')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'id'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ClassMethod')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectMethod')): + SWITCHED = True + return (PyJsStrictEq(var.get(u'parent').get(u'key'),var.get(u'node')) and var.get(u'parent').get(u'computed')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CatchClause')): + SWITCHED = True + return PyJsStrictNeq(var.get(u'parent').get(u'param'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'RestElement')): + SWITCHED = True + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + return PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentPattern')): + SWITCHED = True + return PyJsStrictEq(var.get(u'parent').get(u'right'),var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectPattern')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayPattern')): + SWITCHED = True + return Js(False) + SWITCHED = True + break + return var.get(u'true') + PyJsHoisted_isReferenced_.func_name = u'isReferenced' + var.put(u'isReferenced', PyJsHoisted_isReferenced_) + @Js + def PyJsHoisted_isValidIdentifier_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + if (PyJsStrictNeq(var.get(u'name',throw=False).typeof(),Js(u'string')) or var.get(u'_esutils2').get(u'default').get(u'keyword').callprop(u'isReservedWordES6', var.get(u'name'), var.get(u'true'))): + return Js(False) + else: + return var.get(u'_esutils2').get(u'default').get(u'keyword').callprop(u'isIdentifierNameES6', var.get(u'name')) + PyJsHoisted_isValidIdentifier_.func_name = u'isValidIdentifier' + var.put(u'isValidIdentifier', PyJsHoisted_isValidIdentifier_) + @Js + def PyJsHoisted_isVar_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + PyJs_Object_2838_ = Js({u'kind':Js(u'var')}) + return (var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node'), PyJs_Object_2838_) and var.get(u'node').get(var.get(u'_constants').get(u'BLOCK_SCOPED_SYMBOL')).neg()) + PyJsHoisted_isVar_.func_name = u'isVar' + var.put(u'isVar', PyJsHoisted_isVar_) + @Js + def PyJsHoisted__interopRequireDefault_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + PyJs_Object_2837_ = Js({u'default':var.get(u'obj')}) + return (var.get(u'obj') if (var.get(u'obj') and var.get(u'obj').get(u'__esModule')) else PyJs_Object_2837_) + PyJsHoisted__interopRequireDefault_.func_name = u'_interopRequireDefault' + var.put(u'_interopRequireDefault', PyJsHoisted__interopRequireDefault_) + @Js + def PyJsHoisted_isLet_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u't').callprop(u'isVariableDeclaration', var.get(u'node')) and (PyJsStrictNeq(var.get(u'node').get(u'kind'),Js(u'var')) or var.get(u'node').get(var.get(u'_constants').get(u'BLOCK_SCOPED_SYMBOL')))) + PyJsHoisted_isLet_.func_name = u'isLet' + var.put(u'isLet', PyJsHoisted_isLet_) + @Js + def PyJsHoisted_isSpecifierDefault_(specifier, this, arguments, var=var): + var = Scope({u'this':this, u'specifier':specifier, u'arguments':arguments}, var) + var.registers([u'specifier']) + PyJs_Object_2839_ = Js({u'name':Js(u'default')}) + return (var.get(u't').callprop(u'isImportDefaultSpecifier', var.get(u'specifier')) or var.get(u't').callprop(u'isIdentifier', (var.get(u'specifier').get(u'imported') or var.get(u'specifier').get(u'exported')), PyJs_Object_2839_)) + PyJsHoisted_isSpecifierDefault_.func_name = u'isSpecifierDefault' + var.put(u'isSpecifierDefault', PyJsHoisted_isSpecifierDefault_) + @Js + def PyJsHoisted_isBlockScoped_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return ((var.get(u't').callprop(u'isFunctionDeclaration', var.get(u'node')) or var.get(u't').callprop(u'isClassDeclaration', var.get(u'node'))) or var.get(u't').callprop(u'isLet', var.get(u'node'))) + PyJsHoisted_isBlockScoped_.func_name = u'isBlockScoped' + var.put(u'isBlockScoped', PyJsHoisted_isBlockScoped_) + Js(u'use strict') + var.get(u'exports').put(u'__esModule', var.get(u'true')) + var.put(u'_getIterator2', var.get(u'require')(Js(u'babel-runtime/core-js/get-iterator'))) + var.put(u'_getIterator3', var.get(u'_interopRequireDefault')(var.get(u'_getIterator2'))) + var.get(u'exports').put(u'isBinding', var.get(u'isBinding')) + var.get(u'exports').put(u'isReferenced', var.get(u'isReferenced')) + var.get(u'exports').put(u'isValidIdentifier', var.get(u'isValidIdentifier')) + var.get(u'exports').put(u'isLet', var.get(u'isLet')) + var.get(u'exports').put(u'isBlockScoped', var.get(u'isBlockScoped')) + var.get(u'exports').put(u'isVar', var.get(u'isVar')) + var.get(u'exports').put(u'isSpecifierDefault', var.get(u'isSpecifierDefault')) + var.get(u'exports').put(u'isScope', var.get(u'isScope')) + var.get(u'exports').put(u'isImmutable', var.get(u'isImmutable')) + var.put(u'_retrievers', var.get(u'require')(Js(u'./retrievers'))) + var.put(u'_esutils', var.get(u'require')(Js(u'esutils'))) + var.put(u'_esutils2', var.get(u'_interopRequireDefault')(var.get(u'_esutils'))) + var.put(u'_index', var.get(u'require')(Js(u'./index'))) + var.put(u't', var.get(u'_interopRequireWildcard')(var.get(u'_index'))) + var.put(u'_constants', var.get(u'require')(Js(u'./constants'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_2835_._set_name(u'anonymous') +PyJs_Object_2841_ = Js({u'./constants':Js(247.0),u'./index':Js(258.0),u'./retrievers':Js(260.0),u'babel-runtime/core-js/get-iterator':Js(96.0),u'esutils':Js(276.0)}) +@Js +def PyJs_anonymous_2842_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'TokContext', u'reservedWords', u'parse$1', u'pp$4', u'isKeyword$1', u'getLineInfo', u'astralIdentifierStartCodes', u'isNewLine', u'module', u'_typeof', u'isIdentifierChar', u'State', u'plugins', u'keywords', u'getOptions', u'Node', u'pp$8', u'isIdentifierStart', u'TokenType', u'types$1', u'beforeExpr', u'nonASCIIidentifierStartChars', u'DECIMAL_NUMBER', u'_inherits', u'flowPlugin', u'_possibleConstructorReturn', u'commentKeys', u'XHTMLEntities', u'isInAstralSet', u'empty', u'astralIdentifierCodes', u'exports', u'nonASCIIidentifierChars', u'binop', u'startsExpr', u'lineBreakG', u'pp', u'jsxPlugin', u'_classCallCheck$6', u'_classCallCheck$4', u'_classCallCheck$5', u'_classCallCheck$2', u'_classCallCheck$3', u'_classCallCheck$1', u'Position', u'getQualifiedJSXName', u'types', u'switchLabel', u'nonASCIIidentifier', u'lineBreak', u'HEX_NUMBER', u'last', u'loopLabel', u'Tokenizer', u'defaultOptions', u'_classCallCheck', u'require', u'Parser', u'Token', u'nonASCIIidentifierStart', u'makePredicate', u'nonASCIIwhitespace', u'kw', u'codePointToString', u'finishNodeAt', u'pp$1', u'pp$2', u'pp$3', u'SourceLocation', u'pp$5', u'pp$6', u'pp$7']) + @Js + def PyJsHoisted_codePointToString_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'code')<=Js(65535)): + return var.get(u'String').callprop(u'fromCharCode', var.get(u'code')) + else: + return var.get(u'String').callprop(u'fromCharCode', (((var.get(u'code')-Js(65536))>>Js(10.0))+Js(55296)), (((var.get(u'code')-Js(65536))&Js(1023.0))+Js(56320))) + PyJsHoisted_codePointToString_.func_name = u'codePointToString' + var.put(u'codePointToString', PyJsHoisted_codePointToString_) + @Js + def PyJsHoisted_isNewLine_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + return (((PyJsStrictEq(var.get(u'code'),Js(10.0)) or PyJsStrictEq(var.get(u'code'),Js(13.0))) or PyJsStrictEq(var.get(u'code'),Js(8232))) or PyJsStrictEq(var.get(u'code'),Js(8233))) + PyJsHoisted_isNewLine_.func_name = u'isNewLine' + var.put(u'isNewLine', PyJsHoisted_isNewLine_) + @Js + def PyJsHoisted_isIdentifierChar_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'code')=Js(170)) and var.get(u'nonASCIIidentifier').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'code')))) + return (var.get(u'isInAstralSet')(var.get(u'code'), var.get(u'astralIdentifierStartCodes')) or var.get(u'isInAstralSet')(var.get(u'code'), var.get(u'astralIdentifierCodes'))) + PyJsHoisted_isIdentifierChar_.func_name = u'isIdentifierChar' + var.put(u'isIdentifierChar', PyJsHoisted_isIdentifierChar_) + @Js + def PyJsHoisted_getOptions_(opts, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'opts':opts}, var) + var.registers([u'opts', u'options', u'key']) + PyJs_Object_2847_ = Js({}) + var.put(u'options', PyJs_Object_2847_) + for PyJsTemp in var.get(u'defaultOptions'): + var.put(u'key', PyJsTemp) + var.get(u'options').put(var.get(u'key'), (var.get(u'opts').get(var.get(u'key')) if (var.get(u'opts') and var.get(u'opts').contains(var.get(u'key'))) else var.get(u'defaultOptions').get(var.get(u'key')))) + return var.get(u'options') + PyJsHoisted_getOptions_.func_name = u'getOptions' + var.put(u'getOptions', PyJsHoisted_getOptions_) + @Js + def PyJsHoisted_isIdentifierStart_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'code')=Js(170)) and var.get(u'nonASCIIidentifierStart').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'code')))) + return var.get(u'isInAstralSet')(var.get(u'code'), var.get(u'astralIdentifierStartCodes')) + PyJsHoisted_isIdentifierStart_.func_name = u'isIdentifierStart' + var.put(u'isIdentifierStart', PyJsHoisted_isIdentifierStart_) + @Js + def PyJsHoisted__inherits_(subClass, superClass, this, arguments, var=var): + var = Scope({u'this':this, u'superClass':superClass, u'subClass':subClass, u'arguments':arguments}, var) + var.registers([u'superClass', u'subClass']) + if (PyJsStrictNeq(var.get(u'superClass',throw=False).typeof(),Js(u'function')) and PyJsStrictNeq(var.get(u'superClass'),var.get(u"null"))): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Super expression must either be null or a function, not ')+var.get(u'superClass',throw=False).typeof()))) + raise PyJsTempException + PyJs_Object_2937_ = Js({u'value':var.get(u'subClass'),u'enumerable':Js(False),u'writable':var.get(u'true'),u'configurable':var.get(u'true')}) + PyJs_Object_2936_ = Js({u'constructor':PyJs_Object_2937_}) + var.get(u'subClass').put(u'prototype', var.get(u'Object').callprop(u'create', (var.get(u'superClass') and var.get(u'superClass').get(u'prototype')), PyJs_Object_2936_)) + if var.get(u'superClass'): + (var.get(u'Object').callprop(u'setPrototypeOf', var.get(u'subClass'), var.get(u'superClass')) if var.get(u'Object').get(u'setPrototypeOf') else var.get(u'subClass').put(u'__proto__', var.get(u'superClass'))) + PyJsHoisted__inherits_.func_name = u'_inherits' + var.put(u'_inherits', PyJsHoisted__inherits_) + @Js + def PyJsHoisted__possibleConstructorReturn_(self, call, this, arguments, var=var): + var = Scope({u'this':this, u'self':self, u'call':call, u'arguments':arguments}, var) + var.registers([u'self', u'call']) + if var.get(u'self').neg(): + PyJsTempException = JsToPyException(var.get(u'ReferenceError').create(Js(u"this hasn't been initialised - super() hasn't been called"))) + raise PyJsTempException + return (var.get(u'call') if (var.get(u'call') and (PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'object')) or PyJsStrictEq(var.get(u'call',throw=False).typeof(),Js(u'function')))) else var.get(u'self')) + PyJsHoisted__possibleConstructorReturn_.func_name = u'_possibleConstructorReturn' + var.put(u'_possibleConstructorReturn', PyJsHoisted__possibleConstructorReturn_) + @Js + def PyJsHoisted_isInAstralSet_(code, set, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'set':set, u'arguments':arguments}, var) + var.registers([u'i', u'code', u'set', u'pos']) + var.put(u'pos', Js(65536)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')var.get(u'code')): + return Js(False) + var.put(u'pos', var.get(u'set').get((var.get(u'i')+Js(1.0))), u'+') + if (var.get(u'pos')>=var.get(u'code')): + return var.get(u'true') + finally: + var.put(u'i', Js(2.0), u'+') + PyJsHoisted_isInAstralSet_.func_name = u'isInAstralSet' + var.put(u'isInAstralSet', PyJsHoisted_isInAstralSet_) + @Js + def PyJsHoisted_binop_(name, prec, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'prec':prec, u'arguments':arguments}, var) + var.registers([u'name', u'prec']) + PyJs_Object_2850_ = Js({u'beforeExpr':var.get(u'true'),u'binop':var.get(u'prec')}) + return var.get(u'TokenType').create(var.get(u'name'), PyJs_Object_2850_) + PyJsHoisted_binop_.func_name = u'binop' + var.put(u'binop', PyJsHoisted_binop_) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$6' + var.put(u'_classCallCheck$6', PyJsHoistedNonPyName) + @Js + def PyJsHoisted_finishNodeAt_(node, type, pos, loc, this, arguments, var=var): + var = Scope({u'node':node, u'loc':loc, u'arguments':arguments, u'this':this, u'type':type, u'pos':pos}, var) + var.registers([u'node', u'loc', u'type', u'pos']) + var.get(u'node').put(u'type', var.get(u'type')) + var.get(u'node').put(u'end', var.get(u'pos')) + var.get(u'node').get(u'loc').put(u'end', var.get(u'loc')) + var.get(u"this").callprop(u'processComment', var.get(u'node')) + return var.get(u'node') + PyJsHoisted_finishNodeAt_.func_name = u'finishNodeAt' + var.put(u'finishNodeAt', PyJsHoisted_finishNodeAt_) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$5' + var.put(u'_classCallCheck$5', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$2' + var.put(u'_classCallCheck$2', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$3' + var.put(u'_classCallCheck$3', PyJsHoistedNonPyName) + @Js + def PyJsHoistedNonPyName(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoistedNonPyName.func_name = u'_classCallCheck$1' + var.put(u'_classCallCheck$1', PyJsHoistedNonPyName) + @Js + def PyJsHoisted_getQualifiedJSXName_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + if PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'JSXIdentifier')): + return var.get(u'object').get(u'name') + if PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'JSXNamespacedName')): + return ((var.get(u'object').get(u'namespace').get(u'name')+Js(u':'))+var.get(u'object').get(u'name').get(u'name')) + if PyJsStrictEq(var.get(u'object').get(u'type'),Js(u'JSXMemberExpression')): + return ((var.get(u'getQualifiedJSXName')(var.get(u'object').get(u'object'))+Js(u'.'))+var.get(u'getQualifiedJSXName')(var.get(u'object').get(u'property'))) + PyJsHoisted_getQualifiedJSXName_.func_name = u'getQualifiedJSXName' + var.put(u'getQualifiedJSXName', PyJsHoisted_getQualifiedJSXName_) + @Js + def PyJsHoisted_getLineInfo_(input, offset, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'input', u'line', u'cur', u'match', u'offset']) + #for JS loop + var.put(u'line', Js(1.0)) + var.put(u'cur', Js(0.0)) + while 1: + var.get(u'lineBreakG').put(u'lastIndex', var.get(u'cur')) + var.put(u'match', var.get(u'lineBreakG').callprop(u'exec', var.get(u'input'))) + if (var.get(u'match') and (var.get(u'match').get(u'index')=Js(0.0)) + PyJs_anonymous_2844_._set_name(u'anonymous') + return PyJs_anonymous_2844_ + PyJsHoisted_makePredicate_.func_name = u'makePredicate' + var.put(u'makePredicate', PyJsHoisted_makePredicate_) + @Js + def PyJsHoisted_kw_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'options', u'name']) + PyJs_Object_2866_ = Js({}) + var.put(u'options', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_2866_)) + var.get(u'options').put(u'keyword', var.get(u'name')) + var.get(u'keywords').put(var.get(u'name'), var.get(u'types').put((Js(u'_')+var.get(u'name')), var.get(u'TokenType').create(var.get(u'name'), var.get(u'options')))) + PyJsHoisted_kw_.func_name = u'kw' + var.put(u'kw', PyJsHoisted_kw_) + @Js + def PyJsHoisted__classCallCheck_(instance, Constructor, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments, u'Constructor':Constructor}, var) + var.registers([u'instance', u'Constructor']) + if var.get(u'instance').instanceof(var.get(u'Constructor')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Cannot call a class as a function'))) + raise PyJsTempException + PyJsHoisted__classCallCheck_.func_name = u'_classCallCheck' + var.put(u'_classCallCheck', PyJsHoisted__classCallCheck_) + Js(u'use strict') + PyJs_Object_2843_ = Js({u'value':var.get(u'true')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'__esModule'), PyJs_Object_2843_) + pass + PyJs_Object_2845_ = Js({u'6':var.get(u'makePredicate')(Js(u'enum await')),u'strict':var.get(u'makePredicate')(Js(u'implements interface let package private protected public static yield')),u'strictBind':var.get(u'makePredicate')(Js(u'eval arguments'))}) + var.put(u'reservedWords', PyJs_Object_2845_) + var.put(u'isKeyword$1', var.get(u'makePredicate')(Js(u'break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this let const class extends export import yield super'))) + var.put(u'nonASCIIidentifierStartChars', Js(u'\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc')) + var.put(u'nonASCIIidentifierChars', Js(u'\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f')) + var.put(u'nonASCIIidentifierStart', var.get(u'RegExp').create(((Js(u'[')+var.get(u'nonASCIIidentifierStartChars'))+Js(u']')))) + var.put(u'nonASCIIidentifier', var.get(u'RegExp').create((((Js(u'[')+var.get(u'nonASCIIidentifierStartChars'))+var.get(u'nonASCIIidentifierChars'))+Js(u']')))) + var.put(u'nonASCIIidentifierStartChars', var.put(u'nonASCIIidentifierChars', var.get(u"null"))) + var.put(u'astralIdentifierStartCodes', Js([Js(0.0), Js(11.0), Js(2.0), Js(25.0), Js(2.0), Js(18.0), Js(2.0), Js(1.0), Js(2.0), Js(14.0), Js(3.0), Js(13.0), Js(35.0), Js(122.0), Js(70.0), Js(52.0), Js(268.0), Js(28.0), Js(4.0), Js(48.0), Js(48.0), Js(31.0), Js(17.0), Js(26.0), Js(6.0), Js(37.0), Js(11.0), Js(29.0), Js(3.0), Js(35.0), Js(5.0), Js(7.0), Js(2.0), Js(4.0), Js(43.0), Js(157.0), Js(19.0), Js(35.0), Js(5.0), Js(35.0), Js(5.0), Js(39.0), Js(9.0), Js(51.0), Js(157.0), Js(310.0), Js(10.0), Js(21.0), Js(11.0), Js(7.0), Js(153.0), Js(5.0), Js(3.0), Js(0.0), Js(2.0), Js(43.0), Js(2.0), Js(1.0), Js(4.0), Js(0.0), Js(3.0), Js(22.0), Js(11.0), Js(22.0), Js(10.0), Js(30.0), Js(66.0), Js(18.0), Js(2.0), Js(1.0), Js(11.0), Js(21.0), Js(11.0), Js(25.0), Js(71.0), Js(55.0), Js(7.0), Js(1.0), Js(65.0), Js(0.0), Js(16.0), Js(3.0), Js(2.0), Js(2.0), Js(2.0), Js(26.0), Js(45.0), Js(28.0), Js(4.0), Js(28.0), Js(36.0), Js(7.0), Js(2.0), Js(27.0), Js(28.0), Js(53.0), Js(11.0), Js(21.0), Js(11.0), Js(18.0), Js(14.0), Js(17.0), Js(111.0), Js(72.0), Js(56.0), Js(50.0), Js(14.0), Js(50.0), Js(785.0), Js(52.0), Js(76.0), Js(44.0), Js(33.0), Js(24.0), Js(27.0), Js(35.0), Js(42.0), Js(34.0), Js(4.0), Js(0.0), Js(13.0), Js(47.0), Js(15.0), Js(3.0), Js(22.0), Js(0.0), Js(2.0), Js(0.0), Js(36.0), Js(17.0), Js(2.0), Js(24.0), Js(85.0), Js(6.0), Js(2.0), Js(0.0), Js(2.0), Js(3.0), Js(2.0), Js(14.0), Js(2.0), Js(9.0), Js(8.0), Js(46.0), Js(39.0), Js(7.0), Js(3.0), Js(1.0), Js(3.0), Js(21.0), Js(2.0), Js(6.0), Js(2.0), Js(1.0), Js(2.0), Js(4.0), Js(4.0), Js(0.0), Js(19.0), Js(0.0), Js(13.0), Js(4.0), Js(159.0), Js(52.0), Js(19.0), Js(3.0), Js(54.0), Js(47.0), Js(21.0), Js(1.0), Js(2.0), Js(0.0), Js(185.0), Js(46.0), Js(42.0), Js(3.0), Js(37.0), Js(47.0), Js(21.0), Js(0.0), Js(60.0), Js(42.0), Js(86.0), Js(25.0), Js(391.0), Js(63.0), Js(32.0), Js(0.0), Js(449.0), Js(56.0), Js(264.0), Js(8.0), Js(2.0), Js(36.0), Js(18.0), Js(0.0), Js(50.0), Js(29.0), Js(881.0), Js(921.0), Js(103.0), Js(110.0), Js(18.0), Js(195.0), Js(2749.0), Js(1070.0), Js(4050.0), Js(582.0), Js(8634.0), Js(568.0), Js(8.0), Js(30.0), Js(114.0), Js(29.0), Js(19.0), Js(47.0), Js(17.0), Js(3.0), Js(32.0), Js(20.0), Js(6.0), Js(18.0), Js(881.0), Js(68.0), Js(12.0), Js(0.0), Js(67.0), Js(12.0), Js(65.0), Js(0.0), Js(32.0), Js(6124.0), Js(20.0), Js(754.0), Js(9486.0), Js(1.0), Js(3071.0), Js(106.0), Js(6.0), Js(12.0), Js(4.0), Js(8.0), Js(8.0), Js(9.0), Js(5991.0), Js(84.0), Js(2.0), Js(70.0), Js(2.0), Js(1.0), Js(3.0), Js(0.0), Js(3.0), Js(1.0), Js(3.0), Js(3.0), Js(2.0), Js(11.0), Js(2.0), Js(0.0), Js(2.0), Js(6.0), Js(2.0), Js(64.0), Js(2.0), Js(3.0), Js(3.0), Js(7.0), Js(2.0), Js(6.0), Js(2.0), Js(27.0), Js(2.0), Js(3.0), Js(2.0), Js(4.0), Js(2.0), Js(0.0), Js(4.0), Js(6.0), Js(2.0), Js(339.0), Js(3.0), Js(24.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(30.0), Js(2.0), Js(24.0), Js(2.0), Js(7.0), Js(4149.0), Js(196.0), Js(60.0), Js(67.0), Js(1213.0), Js(3.0), Js(2.0), Js(26.0), Js(2.0), Js(1.0), Js(2.0), Js(0.0), Js(3.0), Js(0.0), Js(2.0), Js(9.0), Js(2.0), Js(3.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(7.0), Js(0.0), Js(5.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(2.0), Js(2.0), Js(1.0), Js(2.0), Js(0.0), Js(3.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(0.0), Js(2.0), Js(1.0), Js(2.0), Js(0.0), Js(3.0), Js(3.0), Js(2.0), Js(6.0), Js(2.0), Js(3.0), Js(2.0), Js(3.0), Js(2.0), Js(0.0), Js(2.0), Js(9.0), Js(2.0), Js(16.0), Js(6.0), Js(2.0), Js(2.0), Js(4.0), Js(2.0), Js(16.0), Js(4421.0), Js(42710.0), Js(42.0), Js(4148.0), Js(12.0), Js(221.0), Js(3.0), Js(5761.0), Js(10591.0), Js(541.0)])) + var.put(u'astralIdentifierCodes', Js([Js(509.0), Js(0.0), Js(227.0), Js(0.0), Js(150.0), Js(4.0), Js(294.0), Js(9.0), Js(1368.0), Js(2.0), Js(2.0), Js(1.0), Js(6.0), Js(3.0), Js(41.0), Js(2.0), Js(5.0), Js(0.0), Js(166.0), Js(1.0), Js(1306.0), Js(2.0), Js(54.0), Js(14.0), Js(32.0), Js(9.0), Js(16.0), Js(3.0), Js(46.0), Js(10.0), Js(54.0), Js(9.0), Js(7.0), Js(2.0), Js(37.0), Js(13.0), Js(2.0), Js(9.0), Js(52.0), Js(0.0), Js(13.0), Js(2.0), Js(49.0), Js(13.0), Js(10.0), Js(2.0), Js(4.0), Js(9.0), Js(83.0), Js(11.0), Js(7.0), Js(0.0), Js(161.0), Js(11.0), Js(6.0), Js(9.0), Js(7.0), Js(3.0), Js(57.0), Js(0.0), Js(2.0), Js(6.0), Js(3.0), Js(1.0), Js(3.0), Js(2.0), Js(10.0), Js(0.0), Js(11.0), Js(1.0), Js(3.0), Js(6.0), Js(4.0), Js(4.0), Js(193.0), Js(17.0), Js(10.0), Js(9.0), Js(87.0), Js(19.0), Js(13.0), Js(9.0), Js(214.0), Js(6.0), Js(3.0), Js(8.0), Js(28.0), Js(1.0), Js(83.0), Js(16.0), Js(16.0), Js(9.0), Js(82.0), Js(12.0), Js(9.0), Js(9.0), Js(84.0), Js(14.0), Js(5.0), Js(9.0), Js(423.0), Js(9.0), Js(838.0), Js(7.0), Js(2.0), Js(7.0), Js(17.0), Js(9.0), Js(57.0), Js(21.0), Js(2.0), Js(13.0), Js(19882.0), Js(9.0), Js(135.0), Js(4.0), Js(60.0), Js(6.0), Js(26.0), Js(9.0), Js(1016.0), Js(45.0), Js(17.0), Js(3.0), Js(19723.0), Js(1.0), Js(5319.0), Js(4.0), Js(4.0), Js(5.0), Js(9.0), Js(7.0), Js(3.0), Js(6.0), Js(31.0), Js(3.0), Js(149.0), Js(2.0), Js(1418.0), Js(49.0), Js(513.0), Js(54.0), Js(5.0), Js(49.0), Js(9.0), Js(0.0), Js(15.0), Js(0.0), Js(23.0), Js(4.0), Js(2.0), Js(14.0), Js(1361.0), Js(6.0), Js(2.0), Js(16.0), Js(3.0), Js(6.0), Js(2.0), Js(1.0), Js(2.0), Js(4.0), Js(2214.0), Js(6.0), Js(110.0), Js(6.0), Js(6.0), Js(9.0), Js(792487.0), Js(239.0)])) + pass + pass + pass + PyJs_Object_2846_ = Js({u'sourceType':Js(u'script'),u'sourceFilename':var.get(u'undefined'),u'allowReturnOutsideFunction':Js(False),u'allowImportExportEverywhere':Js(False),u'allowSuperOutsideMethod':Js(False),u'plugins':Js([]),u'strictMode':var.get(u"null")}) + var.put(u'defaultOptions', PyJs_Object_2846_) + pass + pass + @Js + def PyJs_TokenType_2848_(label, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'TokenType':PyJs_TokenType_2848_, u'label':label}, var) + var.registers([u'conf', u'label']) + PyJs_Object_2849_ = Js({}) + var.put(u'conf', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else PyJs_Object_2849_)) + var.get(u'_classCallCheck$2')(var.get(u"this"), var.get(u'TokenType')) + var.get(u"this").put(u'label', var.get(u'label')) + var.get(u"this").put(u'keyword', var.get(u'conf').get(u'keyword')) + var.get(u"this").put(u'beforeExpr', var.get(u'conf').get(u'beforeExpr').neg().neg()) + var.get(u"this").put(u'startsExpr', var.get(u'conf').get(u'startsExpr').neg().neg()) + var.get(u"this").put(u'rightAssociative', var.get(u'conf').get(u'rightAssociative').neg().neg()) + var.get(u"this").put(u'isLoop', var.get(u'conf').get(u'isLoop').neg().neg()) + var.get(u"this").put(u'isAssign', var.get(u'conf').get(u'isAssign').neg().neg()) + var.get(u"this").put(u'prefix', var.get(u'conf').get(u'prefix').neg().neg()) + var.get(u"this").put(u'postfix', var.get(u'conf').get(u'postfix').neg().neg()) + var.get(u"this").put(u'binop', (var.get(u'conf').get(u'binop') or var.get(u"null"))) + var.get(u"this").put(u'updateContext', var.get(u"null")) + PyJs_TokenType_2848_._set_name(u'TokenType') + var.put(u'TokenType', PyJs_TokenType_2848_) + pass + PyJs_Object_2851_ = Js({u'beforeExpr':var.get(u'true')}) + var.put(u'beforeExpr', PyJs_Object_2851_) + PyJs_Object_2852_ = Js({u'startsExpr':var.get(u'true')}) + var.put(u'startsExpr', PyJs_Object_2852_) + PyJs_Object_2854_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2855_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2856_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2857_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2858_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2859_ = Js({u'beforeExpr':var.get(u'true'),u'isAssign':var.get(u'true')}) + PyJs_Object_2860_ = Js({u'beforeExpr':var.get(u'true'),u'isAssign':var.get(u'true')}) + PyJs_Object_2861_ = Js({u'prefix':var.get(u'true'),u'postfix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2862_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2863_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(9.0),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + PyJs_Object_2864_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(11.0),u'rightAssociative':var.get(u'true')}) + PyJs_Object_2853_ = Js({u'num':var.get(u'TokenType').create(Js(u'num'), var.get(u'startsExpr')),u'regexp':var.get(u'TokenType').create(Js(u'regexp'), var.get(u'startsExpr')),u'string':var.get(u'TokenType').create(Js(u'string'), var.get(u'startsExpr')),u'name':var.get(u'TokenType').create(Js(u'name'), var.get(u'startsExpr')),u'eof':var.get(u'TokenType').create(Js(u'eof')),u'bracketL':var.get(u'TokenType').create(Js(u'['), PyJs_Object_2854_),u'bracketR':var.get(u'TokenType').create(Js(u']')),u'braceL':var.get(u'TokenType').create(Js(u'{'), PyJs_Object_2855_),u'braceBarL':var.get(u'TokenType').create(Js(u'{|'), PyJs_Object_2856_),u'braceR':var.get(u'TokenType').create(Js(u'}')),u'braceBarR':var.get(u'TokenType').create(Js(u'|}')),u'parenL':var.get(u'TokenType').create(Js(u'('), PyJs_Object_2857_),u'parenR':var.get(u'TokenType').create(Js(u')')),u'comma':var.get(u'TokenType').create(Js(u','), var.get(u'beforeExpr')),u'semi':var.get(u'TokenType').create(Js(u';'), var.get(u'beforeExpr')),u'colon':var.get(u'TokenType').create(Js(u':'), var.get(u'beforeExpr')),u'doubleColon':var.get(u'TokenType').create(Js(u'::'), var.get(u'beforeExpr')),u'dot':var.get(u'TokenType').create(Js(u'.')),u'question':var.get(u'TokenType').create(Js(u'?'), var.get(u'beforeExpr')),u'arrow':var.get(u'TokenType').create(Js(u'=>'), var.get(u'beforeExpr')),u'template':var.get(u'TokenType').create(Js(u'template')),u'ellipsis':var.get(u'TokenType').create(Js(u'...'), var.get(u'beforeExpr')),u'backQuote':var.get(u'TokenType').create(Js(u'`'), var.get(u'startsExpr')),u'dollarBraceL':var.get(u'TokenType').create(Js(u'${'), PyJs_Object_2858_),u'at':var.get(u'TokenType').create(Js(u'@')),u'eq':var.get(u'TokenType').create(Js(u'='), PyJs_Object_2859_),u'assign':var.get(u'TokenType').create(Js(u'_='), PyJs_Object_2860_),u'incDec':var.get(u'TokenType').create(Js(u'++/--'), PyJs_Object_2861_),u'prefix':var.get(u'TokenType').create(Js(u'prefix'), PyJs_Object_2862_),u'logicalOR':var.get(u'binop')(Js(u'||'), Js(1.0)),u'logicalAND':var.get(u'binop')(Js(u'&&'), Js(2.0)),u'bitwiseOR':var.get(u'binop')(Js(u'|'), Js(3.0)),u'bitwiseXOR':var.get(u'binop')(Js(u'^'), Js(4.0)),u'bitwiseAND':var.get(u'binop')(Js(u'&'), Js(5.0)),u'equality':var.get(u'binop')(Js(u'==/!='), Js(6.0)),u'relational':var.get(u'binop')(Js(u''), Js(7.0)),u'bitShift':var.get(u'binop')(Js(u'<>'), Js(8.0)),u'plusMin':var.get(u'TokenType').create(Js(u'+/-'), PyJs_Object_2863_),u'modulo':var.get(u'binop')(Js(u'%'), Js(10.0)),u'star':var.get(u'binop')(Js(u'*'), Js(10.0)),u'slash':var.get(u'binop')(Js(u'/'), Js(10.0)),u'exponent':var.get(u'TokenType').create(Js(u'**'), PyJs_Object_2864_)}) + var.put(u'types', PyJs_Object_2853_) + PyJs_Object_2865_ = Js({}) + var.put(u'keywords', PyJs_Object_2865_) + pass + var.get(u'kw')(Js(u'break')) + var.get(u'kw')(Js(u'case'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'catch')) + var.get(u'kw')(Js(u'continue')) + var.get(u'kw')(Js(u'debugger')) + var.get(u'kw')(Js(u'default'), var.get(u'beforeExpr')) + PyJs_Object_2867_ = Js({u'isLoop':var.get(u'true'),u'beforeExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'do'), PyJs_Object_2867_) + var.get(u'kw')(Js(u'else'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'finally')) + PyJs_Object_2868_ = Js({u'isLoop':var.get(u'true')}) + var.get(u'kw')(Js(u'for'), PyJs_Object_2868_) + var.get(u'kw')(Js(u'function'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'if')) + var.get(u'kw')(Js(u'return'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'switch')) + var.get(u'kw')(Js(u'throw'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'try')) + var.get(u'kw')(Js(u'var')) + var.get(u'kw')(Js(u'let')) + var.get(u'kw')(Js(u'const')) + PyJs_Object_2869_ = Js({u'isLoop':var.get(u'true')}) + var.get(u'kw')(Js(u'while'), PyJs_Object_2869_) + var.get(u'kw')(Js(u'with')) + PyJs_Object_2870_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'new'), PyJs_Object_2870_) + var.get(u'kw')(Js(u'this'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'super'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'class')) + var.get(u'kw')(Js(u'extends'), var.get(u'beforeExpr')) + var.get(u'kw')(Js(u'export')) + var.get(u'kw')(Js(u'import')) + PyJs_Object_2871_ = Js({u'beforeExpr':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'yield'), PyJs_Object_2871_) + var.get(u'kw')(Js(u'null'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'true'), var.get(u'startsExpr')) + var.get(u'kw')(Js(u'false'), var.get(u'startsExpr')) + PyJs_Object_2872_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(7.0)}) + var.get(u'kw')(Js(u'in'), PyJs_Object_2872_) + PyJs_Object_2873_ = Js({u'beforeExpr':var.get(u'true'),u'binop':Js(7.0)}) + var.get(u'kw')(Js(u'instanceof'), PyJs_Object_2873_) + PyJs_Object_2874_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'typeof'), PyJs_Object_2874_) + PyJs_Object_2875_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'void'), PyJs_Object_2875_) + PyJs_Object_2876_ = Js({u'beforeExpr':var.get(u'true'),u'prefix':var.get(u'true'),u'startsExpr':var.get(u'true')}) + var.get(u'kw')(Js(u'delete'), PyJs_Object_2876_) + var.put(u'lineBreak', JsRegExp(u'/\\r\\n?|\\n|\\u2028|\\u2029/')) + var.put(u'lineBreakG', var.get(u'RegExp').create(var.get(u'lineBreak').get(u'source'), Js(u'g'))) + pass + var.put(u'nonASCIIwhitespace', JsRegExp(u'/[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/')) + pass + @Js + def PyJs_TokContext_2877_(token, isExpr, preserveSpace, override, this, arguments, var=var): + var = Scope({u'TokContext':PyJs_TokContext_2877_, u'this':this, u'token':token, u'isExpr':isExpr, u'arguments':arguments, u'preserveSpace':preserveSpace, u'override':override}, var) + var.registers([u'override', u'token', u'isExpr', u'preserveSpace']) + var.get(u'_classCallCheck$3')(var.get(u"this"), var.get(u'TokContext')) + var.get(u"this").put(u'token', var.get(u'token')) + var.get(u"this").put(u'isExpr', var.get(u'isExpr').neg().neg()) + var.get(u"this").put(u'preserveSpace', var.get(u'preserveSpace').neg().neg()) + var.get(u"this").put(u'override', var.get(u'override')) + PyJs_TokContext_2877_._set_name(u'TokContext') + var.put(u'TokContext', PyJs_TokContext_2877_) + @Js + def PyJs_anonymous_2879_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').callprop(u'readTmplToken') + PyJs_anonymous_2879_._set_name(u'anonymous') + PyJs_Object_2878_ = Js({u'braceStatement':var.get(u'TokContext').create(Js(u'{'), Js(False)),u'braceExpression':var.get(u'TokContext').create(Js(u'{'), var.get(u'true')),u'templateQuasi':var.get(u'TokContext').create(Js(u'${'), var.get(u'true')),u'parenStatement':var.get(u'TokContext').create(Js(u'('), Js(False)),u'parenExpression':var.get(u'TokContext').create(Js(u'('), var.get(u'true')),u'template':var.get(u'TokContext').create(Js(u'`'), var.get(u'true'), var.get(u'true'), PyJs_anonymous_2879_),u'functionExpression':var.get(u'TokContext').create(Js(u'function'), var.get(u'true'))}) + var.put(u'types$1', PyJs_Object_2878_) + @Js + def PyJs_anonymous_2880_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'out']) + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'context').get(u'length'),Js(1.0)): + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + return var.get('undefined') + var.put(u'out', var.get(u"this").get(u'state').get(u'context').callprop(u'pop')) + if (PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'braceStatement')) and PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'functionExpression'))): + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + else: + if PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'templateQuasi')): + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + else: + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'out').get(u'isExpr').neg()) + PyJs_anonymous_2880_._set_name(u'anonymous') + var.get(u'types').get(u'parenR').put(u'updateContext', var.get(u'types').get(u'braceR').put(u'updateContext', PyJs_anonymous_2880_)) + @Js + def PyJs_anonymous_2881_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType']) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + if ((PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_let')) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_const'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_var'))): + if var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'end'))): + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2881_._set_name(u'anonymous') + var.get(u'types').get(u'name').put(u'updateContext', PyJs_anonymous_2881_) + @Js + def PyJs_anonymous_2882_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType']) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', (var.get(u'types$1').get(u'braceStatement') if var.get(u"this").callprop(u'braceIsBlock', var.get(u'prevType')) else var.get(u'types$1').get(u'braceExpression'))) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2882_._set_name(u'anonymous') + var.get(u'types').get(u'braceL').put(u'updateContext', PyJs_anonymous_2882_) + @Js + def PyJs_anonymous_2883_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'templateQuasi')) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2883_._set_name(u'anonymous') + var.get(u'types').get(u'dollarBraceL').put(u'updateContext', PyJs_anonymous_2883_) + @Js + def PyJs_anonymous_2884_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType', u'statementParens']) + var.put(u'statementParens', (((PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_if')) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_for'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_with'))) or PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'_while')))) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', (var.get(u'types$1').get(u'parenStatement') if var.get(u'statementParens') else var.get(u'types$1').get(u'parenExpression'))) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_2884_._set_name(u'anonymous') + var.get(u'types').get(u'parenL').put(u'updateContext', PyJs_anonymous_2884_) + @Js + def PyJs_anonymous_2885_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_2885_._set_name(u'anonymous') + var.get(u'types').get(u'incDec').put(u'updateContext', PyJs_anonymous_2885_) + @Js + def PyJs_anonymous_2886_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictNeq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'braceStatement')): + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'functionExpression')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + PyJs_anonymous_2886_._set_name(u'anonymous') + var.get(u'types').get(u'_function').put(u'updateContext', PyJs_anonymous_2886_) + @Js + def PyJs_anonymous_2887_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'template')): + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + else: + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'template')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + PyJs_anonymous_2887_._set_name(u'anonymous') + var.get(u'types').get(u'backQuote').put(u'updateContext', PyJs_anonymous_2887_) + pass + @Js + def PyJs_Position_2888_(line, col, this, arguments, var=var): + var = Scope({u'this':this, u'Position':PyJs_Position_2888_, u'line':line, u'col':col, u'arguments':arguments}, var) + var.registers([u'line', u'col']) + var.get(u'_classCallCheck$4')(var.get(u"this"), var.get(u'Position')) + var.get(u"this").put(u'line', var.get(u'line')) + var.get(u"this").put(u'column', var.get(u'col')) + PyJs_Position_2888_._set_name(u'Position') + var.put(u'Position', PyJs_Position_2888_) + @Js + def PyJs_SourceLocation_2889_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments, u'SourceLocation':PyJs_SourceLocation_2889_}, var) + var.registers([u'start', u'end']) + var.get(u'_classCallCheck$4')(var.get(u"this"), var.get(u'SourceLocation')) + var.get(u"this").put(u'start', var.get(u'start')) + var.get(u"this").put(u'end', var.get(u'end')) + PyJs_SourceLocation_2889_._set_name(u'SourceLocation') + var.put(u'SourceLocation', PyJs_SourceLocation_2889_) + pass + pass + @Js + def PyJs_anonymous_2890_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'State']) + @Js + def PyJsHoisted_State_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'_classCallCheck$5')(var.get(u"this"), var.get(u'State')) + PyJsHoisted_State_.func_name = u'State' + var.put(u'State', PyJsHoisted_State_) + pass + @Js + def PyJs_init_2891_(options, input, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'init':PyJs_init_2891_, u'options':options, u'arguments':arguments}, var) + var.registers([u'input', u'options']) + var.get(u"this").put(u'strict', (Js(False) if PyJsStrictEq(var.get(u'options').get(u'strictMode'),Js(False)) else PyJsStrictEq(var.get(u'options').get(u'sourceType'),Js(u'module')))) + var.get(u"this").put(u'input', var.get(u'input')) + var.get(u"this").put(u'potentialArrowAt', (-Js(1.0))) + var.get(u"this").put(u'inMethod', var.get(u"this").put(u'inFunction', var.get(u"this").put(u'inGenerator', var.get(u"this").put(u'inAsync', var.get(u"this").put(u'inType', Js(False)))))) + var.get(u"this").put(u'labels', Js([])) + var.get(u"this").put(u'decorators', Js([])) + var.get(u"this").put(u'tokens', Js([])) + var.get(u"this").put(u'comments', Js([])) + var.get(u"this").put(u'trailingComments', Js([])) + var.get(u"this").put(u'leadingComments', Js([])) + var.get(u"this").put(u'commentStack', Js([])) + var.get(u"this").put(u'pos', var.get(u"this").put(u'lineStart', Js(0.0))) + var.get(u"this").put(u'curLine', Js(1.0)) + var.get(u"this").put(u'type', var.get(u'types').get(u'eof')) + var.get(u"this").put(u'value', var.get(u"null")) + var.get(u"this").put(u'start', var.get(u"this").put(u'end', var.get(u"this").get(u'pos'))) + var.get(u"this").put(u'startLoc', var.get(u"this").put(u'endLoc', var.get(u"this").callprop(u'curPosition'))) + var.get(u"this").put(u'lastTokEndLoc', var.get(u"this").put(u'lastTokStartLoc', var.get(u"null"))) + var.get(u"this").put(u'lastTokStart', var.get(u"this").put(u'lastTokEnd', var.get(u"this").get(u'pos'))) + var.get(u"this").put(u'context', Js([var.get(u'types$1').get(u'braceStatement')])) + var.get(u"this").put(u'exprAllowed', var.get(u'true')) + var.get(u"this").put(u'containsEsc', var.get(u"this").put(u'containsOctal', Js(False))) + var.get(u"this").put(u'octalPosition', var.get(u"null")) + var.get(u"this").put(u'exportedIdentifiers', Js([])) + return var.get(u"this") + PyJs_init_2891_._set_name(u'init') + var.get(u'State').get(u'prototype').put(u'init', PyJs_init_2891_) + @Js + def PyJs_curPosition_2892_(this, arguments, var=var): + var = Scope({u'this':this, u'curPosition':PyJs_curPosition_2892_, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'Position').create(var.get(u"this").get(u'curLine'), (var.get(u"this").get(u'pos')-var.get(u"this").get(u'lineStart'))) + PyJs_curPosition_2892_._set_name(u'curPosition') + var.get(u'State').get(u'prototype').put(u'curPosition', PyJs_curPosition_2892_) + @Js + def PyJs_clone_2893_(skipArrays, this, arguments, var=var): + var = Scope({u'this':this, u'clone':PyJs_clone_2893_, u'skipArrays':skipArrays, u'arguments':arguments}, var) + var.registers([u'state', u'val', u'key', u'skipArrays']) + var.put(u'state', var.get(u'State').create()) + for PyJsTemp in var.get(u"this"): + var.put(u'key', PyJsTemp) + var.put(u'val', var.get(u"this").get(var.get(u'key'))) + if ((var.get(u'skipArrays').neg() or PyJsStrictEq(var.get(u'key'),Js(u'context'))) and var.get(u'Array').callprop(u'isArray', var.get(u'val'))): + var.put(u'val', var.get(u'val').callprop(u'slice')) + var.get(u'state').put(var.get(u'key'), var.get(u'val')) + return var.get(u'state') + PyJs_clone_2893_._set_name(u'clone') + var.get(u'State').get(u'prototype').put(u'clone', PyJs_clone_2893_) + return var.get(u'State') + PyJs_anonymous_2890_._set_name(u'anonymous') + var.put(u'State', PyJs_anonymous_2890_()) + pass + @Js + def PyJs_Token_2894_(state, this, arguments, var=var): + var = Scope({u'this':this, u'state':state, u'Token':PyJs_Token_2894_, u'arguments':arguments}, var) + var.registers([u'state']) + var.get(u'_classCallCheck$1')(var.get(u"this"), var.get(u'Token')) + var.get(u"this").put(u'type', var.get(u'state').get(u'type')) + var.get(u"this").put(u'value', var.get(u'state').get(u'value')) + var.get(u"this").put(u'start', var.get(u'state').get(u'start')) + var.get(u"this").put(u'end', var.get(u'state').get(u'end')) + var.get(u"this").put(u'loc', var.get(u'SourceLocation').create(var.get(u'state').get(u'startLoc'), var.get(u'state').get(u'endLoc'))) + PyJs_Token_2894_._set_name(u'Token') + var.put(u'Token', PyJs_Token_2894_) + pass + @Js + def PyJs_anonymous_2895_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Tokenizer']) + @Js + def PyJsHoisted_Tokenizer_(options, input, this, arguments, var=var): + var = Scope({u'this':this, u'input':input, u'options':options, u'arguments':arguments}, var) + var.registers([u'input', u'options']) + var.get(u'_classCallCheck$1')(var.get(u"this"), var.get(u'Tokenizer')) + var.get(u"this").put(u'state', var.get(u'State').create()) + var.get(u"this").get(u'state').callprop(u'init', var.get(u'options'), var.get(u'input')) + PyJsHoisted_Tokenizer_.func_name = u'Tokenizer' + var.put(u'Tokenizer', PyJsHoisted_Tokenizer_) + pass + @Js + def PyJs_next_2896_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'next':PyJs_next_2896_}, var) + var.registers([]) + if var.get(u"this").get(u'isLookahead').neg(): + var.get(u"this").get(u'state').get(u'tokens').callprop(u'push', var.get(u'Token').create(var.get(u"this").get(u'state'))) + var.get(u"this").get(u'state').put(u'lastTokEnd', var.get(u"this").get(u'state').get(u'end')) + var.get(u"this").get(u'state').put(u'lastTokStart', var.get(u"this").get(u'state').get(u'start')) + var.get(u"this").get(u'state').put(u'lastTokEndLoc', var.get(u"this").get(u'state').get(u'endLoc')) + var.get(u"this").get(u'state').put(u'lastTokStartLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'nextToken') + PyJs_next_2896_._set_name(u'next') + var.get(u'Tokenizer').get(u'prototype').put(u'next', PyJs_next_2896_) + @Js + def PyJs_eat_2897_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'eat':PyJs_eat_2897_}, var) + var.registers([u'type']) + if var.get(u"this").callprop(u'match', var.get(u'type')): + var.get(u"this").callprop(u'next') + return var.get(u'true') + else: + return Js(False) + PyJs_eat_2897_._set_name(u'eat') + var.get(u'Tokenizer').get(u'prototype').put(u'eat', PyJs_eat_2897_) + @Js + def PyJs_match_2898_(type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'match':PyJs_match_2898_}, var) + var.registers([u'type']) + return PyJsStrictEq(var.get(u"this").get(u'state').get(u'type'),var.get(u'type')) + PyJs_match_2898_._set_name(u'match') + var.get(u'Tokenizer').get(u'prototype').put(u'match', PyJs_match_2898_) + @Js + def PyJs_isKeyword_2899_(word, this, arguments, var=var): + var = Scope({u'this':this, u'isKeyword':PyJs_isKeyword_2899_, u'word':word, u'arguments':arguments}, var) + var.registers([u'word']) + return var.get(u'isKeyword$1')(var.get(u'word')) + PyJs_isKeyword_2899_._set_name(u'isKeyword') + var.get(u'Tokenizer').get(u'prototype').put(u'isKeyword', PyJs_isKeyword_2899_) + @Js + def PyJs_lookahead_2900_(this, arguments, var=var): + var = Scope({u'this':this, u'lookahead':PyJs_lookahead_2900_, u'arguments':arguments}, var) + var.registers([u'curr', u'old']) + var.put(u'old', var.get(u"this").get(u'state')) + var.get(u"this").put(u'state', var.get(u'old').callprop(u'clone', var.get(u'true'))) + var.get(u"this").put(u'isLookahead', var.get(u'true')) + var.get(u"this").callprop(u'next') + var.get(u"this").put(u'isLookahead', Js(False)) + var.put(u'curr', var.get(u"this").get(u'state').callprop(u'clone', var.get(u'true'))) + var.get(u"this").put(u'state', var.get(u'old')) + return var.get(u'curr') + PyJs_lookahead_2900_._set_name(u'lookahead') + var.get(u'Tokenizer').get(u'prototype').put(u'lookahead', PyJs_lookahead_2900_) + @Js + def PyJs_setStrict_2901_(strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'arguments':arguments, u'setStrict':PyJs_setStrict_2901_}, var) + var.registers([u'strict']) + var.get(u"this").get(u'state').put(u'strict', var.get(u'strict')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')).neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')).neg()): + return var.get('undefined') + var.get(u"this").get(u'state').put(u'pos', var.get(u"this").get(u'state').get(u'start')) + while (var.get(u"this").get(u'state').get(u'pos')=var.get(u"this").get(u'input').get(u'length')): + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'eof')) + if var.get(u'curContext').get(u'override'): + return var.get(u'curContext').callprop(u'override', var.get(u"this")) + else: + return var.get(u"this").callprop(u'readToken', var.get(u"this").callprop(u'fullCharCodeAtPos')) + PyJs_nextToken_2903_._set_name(u'nextToken') + var.get(u'Tokenizer').get(u'prototype').put(u'nextToken', PyJs_nextToken_2903_) + @Js + def PyJs_readToken_2904_(code, this, arguments, var=var): + var = Scope({u'this':this, u'readToken':PyJs_readToken_2904_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code']) + if (var.get(u'isIdentifierStart')(var.get(u'code')) or PyJsStrictEq(var.get(u'code'),Js(92.0))): + return var.get(u"this").callprop(u'readWord') + else: + return var.get(u"this").callprop(u'getTokenFromCode', var.get(u'code')) + PyJs_readToken_2904_._set_name(u'readToken') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken', PyJs_readToken_2904_) + @Js + def PyJs_fullCharCodeAtPos_2905_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'fullCharCodeAtPos':PyJs_fullCharCodeAtPos_2905_}, var) + var.registers([u'code', u'next']) + var.put(u'code', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if ((var.get(u'code')<=Js(55295)) or (var.get(u'code')>=Js(57344))): + return var.get(u'code') + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + return (((var.get(u'code')<Js(8.0)) and (var.get(u'ch')=Js(5760.0)) and var.get(u'nonASCIIwhitespace').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch'))))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + else: + raise JS_BREAK_LABEL_6c6f6f70("Breaked") + SWITCHED = True + break + except JS_CONTINUE_LABEL_6c6f6f70: + pass + except JS_BREAK_LABEL_6c6f6f70: + pass + PyJs_skipSpace_2910_._set_name(u'skipSpace') + var.get(u'Tokenizer').get(u'prototype').put(u'skipSpace', PyJs_skipSpace_2910_) + @Js + def PyJs_finishToken_2911_(type, val, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'val':val, u'finishToken':PyJs_finishToken_2911_}, var) + var.registers([u'type', u'val', u'prevType']) + var.get(u"this").get(u'state').put(u'end', var.get(u"this").get(u'state').get(u'pos')) + var.get(u"this").get(u'state').put(u'endLoc', var.get(u"this").get(u'state').callprop(u'curPosition')) + var.put(u'prevType', var.get(u"this").get(u'state').get(u'type')) + var.get(u"this").get(u'state').put(u'type', var.get(u'type')) + var.get(u"this").get(u'state').put(u'value', var.get(u'val')) + var.get(u"this").callprop(u'updateContext', var.get(u'prevType')) + PyJs_finishToken_2911_._set_name(u'finishToken') + var.get(u'Tokenizer').get(u'prototype').put(u'finishToken', PyJs_finishToken_2911_) + @Js + def PyJs_readToken_dot_2912_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'readToken_dot':PyJs_readToken_dot_2912_}, var) + var.registers([u'next2', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if ((var.get(u'next')>=Js(48.0)) and (var.get(u'next')<=Js(57.0))): + return var.get(u"this").callprop(u'readNumber', var.get(u'true')) + var.put(u'next2', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0)))) + if (PyJsStrictEq(var.get(u'next'),Js(46.0)) and PyJsStrictEq(var.get(u'next2'),Js(46.0))): + var.get(u"this").get(u'state').put(u'pos', Js(3.0), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'ellipsis')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'dot')) + PyJs_readToken_dot_2912_._set_name(u'readToken_dot') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_dot', PyJs_readToken_dot_2912_) + @Js + def PyJs_readToken_slash_2913_(this, arguments, var=var): + var = Scope({u'this':this, u'readToken_slash':PyJs_readToken_slash_2913_, u'arguments':arguments}, var) + var.registers([u'next']) + if var.get(u"this").get(u'state').get(u'exprAllowed'): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'readRegexp') + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + else: + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'slash'), Js(1.0)) + PyJs_readToken_slash_2913_._set_name(u'readToken_slash') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_slash', PyJs_readToken_slash_2913_) + @Js + def PyJs_readToken_mult_modulo_2914_(code, this, arguments, var=var): + var = Scope({u'this':this, u'readToken_mult_modulo':PyJs_readToken_mult_modulo_2914_, u'code':code, u'arguments':arguments}, var) + var.registers([u'width', u'code', u'type', u'next']) + var.put(u'type', (var.get(u'types').get(u'star') if PyJsStrictEq(var.get(u'code'),Js(42.0)) else var.get(u'types').get(u'modulo'))) + var.put(u'width', Js(1.0)) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(42.0)): + (var.put(u'width',Js(var.get(u'width').to_number())+Js(1))-Js(1)) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0)))) + var.put(u'type', var.get(u'types').get(u'exponent')) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + (var.put(u'width',Js(var.get(u'width').to_number())+Js(1))-Js(1)) + var.put(u'type', var.get(u'types').get(u'assign')) + return var.get(u"this").callprop(u'finishOp', var.get(u'type'), var.get(u'width')) + PyJs_readToken_mult_modulo_2914_._set_name(u'readToken_mult_modulo') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_mult_modulo', PyJs_readToken_mult_modulo_2914_) + @Js + def PyJs_readToken_pipe_amp_2915_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'readToken_pipe_amp':PyJs_readToken_pipe_amp_2915_}, var) + var.registers([u'code', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),var.get(u'code')): + return var.get(u"this").callprop(u'finishOp', (var.get(u'types').get(u'logicalOR') if PyJsStrictEq(var.get(u'code'),Js(124.0)) else var.get(u'types').get(u'logicalAND')), Js(2.0)) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + if ((PyJsStrictEq(var.get(u'code'),Js(124.0)) and PyJsStrictEq(var.get(u'next'),Js(125.0))) and var.get(u"this").callprop(u'hasPlugin', Js(u'flow'))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'braceBarR'), Js(2.0)) + return var.get(u"this").callprop(u'finishOp', (var.get(u'types').get(u'bitwiseOR') if PyJsStrictEq(var.get(u'code'),Js(124.0)) else var.get(u'types').get(u'bitwiseAND')), Js(1.0)) + PyJs_readToken_pipe_amp_2915_._set_name(u'readToken_pipe_amp') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_pipe_amp', PyJs_readToken_pipe_amp_2915_) + @Js + def PyJs_readToken_caret_2916_(this, arguments, var=var): + var = Scope({u'this':this, u'readToken_caret':PyJs_readToken_caret_2916_, u'arguments':arguments}, var) + var.registers([u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + else: + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'bitwiseXOR'), Js(1.0)) + PyJs_readToken_caret_2916_._set_name(u'readToken_caret') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_caret', PyJs_readToken_caret_2916_) + @Js + def PyJs_readToken_plus_min_2917_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'readToken_plus_min':PyJs_readToken_plus_min_2917_}, var) + var.registers([u'code', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),var.get(u'code')): + if ((PyJsStrictEq(var.get(u'next'),Js(45.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(62.0))) and var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'pos')))): + var.get(u"this").callprop(u'skipLineComment', Js(3.0)) + var.get(u"this").callprop(u'skipSpace') + return var.get(u"this").callprop(u'nextToken') + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'incDec'), Js(2.0)) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), Js(2.0)) + else: + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'plusMin'), Js(1.0)) + PyJs_readToken_plus_min_2917_._set_name(u'readToken_plus_min') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_plus_min', PyJs_readToken_plus_min_2917_) + @Js + def PyJs_readToken_lt_gt_2918_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments, u'readToken_lt_gt':PyJs_readToken_lt_gt_2918_}, var) + var.registers([u'code', u'size', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + var.put(u'size', Js(1.0)) + if PyJsStrictEq(var.get(u'next'),var.get(u'code')): + var.put(u'size', (Js(3.0) if (PyJsStrictEq(var.get(u'code'),Js(62.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(62.0))) else Js(2.0))) + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+var.get(u'size'))),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'assign'), (var.get(u'size')+Js(1.0))) + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'bitShift'), var.get(u'size')) + if (((PyJsStrictEq(var.get(u'next'),Js(33.0)) and PyJsStrictEq(var.get(u'code'),Js(60.0))) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(45.0))) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(3.0))),Js(45.0))): + if var.get(u"this").get(u'inModule'): + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'skipLineComment', Js(4.0)) + var.get(u"this").callprop(u'skipSpace') + return var.get(u"this").callprop(u'nextToken') + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + var.put(u'size', Js(2.0)) + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'relational'), var.get(u'size')) + PyJs_readToken_lt_gt_2918_._set_name(u'readToken_lt_gt') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_lt_gt', PyJs_readToken_lt_gt_2918_) + @Js + def PyJs_readToken_eq_excl_2919_(code, this, arguments, var=var): + var = Scope({u'this':this, u'readToken_eq_excl':PyJs_readToken_eq_excl_2919_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'next']) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if PyJsStrictEq(var.get(u'next'),Js(61.0)): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'equality'), (Js(3.0) if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(2.0))),Js(61.0)) else Js(2.0))) + if (PyJsStrictEq(var.get(u'code'),Js(61.0)) and PyJsStrictEq(var.get(u'next'),Js(62.0))): + var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'arrow')) + return var.get(u"this").callprop(u'finishOp', (var.get(u'types').get(u'eq') if PyJsStrictEq(var.get(u'code'),Js(61.0)) else var.get(u'types').get(u'prefix')), Js(1.0)) + PyJs_readToken_eq_excl_2919_._set_name(u'readToken_eq_excl') + var.get(u'Tokenizer').get(u'prototype').put(u'readToken_eq_excl', PyJs_readToken_eq_excl_2919_) + @Js + def PyJs_getTokenFromCode_2920_(code, this, arguments, var=var): + var = Scope({u'this':this, u'getTokenFromCode':PyJs_getTokenFromCode_2920_, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'next']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(46.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_dot') + if SWITCHED or PyJsStrictEq(CONDITION, Js(40.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'parenL')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(41.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'parenR')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(59.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'semi')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(44.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'comma')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(91.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'bracketL')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(93.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'bracketR')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(123.0)): + SWITCHED = True + if (var.get(u"this").callprop(u'hasPlugin', Js(u'flow')) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(124.0))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'braceBarL'), Js(2.0)) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'braceL')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(125.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'braceR')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(58.0)): + SWITCHED = True + if (var.get(u"this").callprop(u'hasPlugin', Js(u'functionBind')) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(58.0))): + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'doubleColon'), Js(2.0)) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'colon')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(63.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'question')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(64.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'at')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(96.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'backQuote')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(48.0)): + SWITCHED = True + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0)))) + if (PyJsStrictEq(var.get(u'next'),Js(120.0)) or PyJsStrictEq(var.get(u'next'),Js(88.0))): + return var.get(u"this").callprop(u'readRadixNumber', Js(16.0)) + if (PyJsStrictEq(var.get(u'next'),Js(111.0)) or PyJsStrictEq(var.get(u'next'),Js(79.0))): + return var.get(u"this").callprop(u'readRadixNumber', Js(8.0)) + if (PyJsStrictEq(var.get(u'next'),Js(98.0)) or PyJsStrictEq(var.get(u'next'),Js(66.0))): + return var.get(u"this").callprop(u'readRadixNumber', Js(2.0)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(49.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(50.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(51.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(52.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(53.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(54.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(55.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(56.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(57.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readNumber', Js(False)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(34.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(39.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readString', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(47.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_slash') + if SWITCHED or PyJsStrictEq(CONDITION, Js(37.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(42.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_mult_modulo', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(124.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(38.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_pipe_amp', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(94.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_caret') + if SWITCHED or PyJsStrictEq(CONDITION, Js(43.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(45.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_plus_min', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(60.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(62.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_lt_gt', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(61.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(33.0)): + SWITCHED = True + return var.get(u"this").callprop(u'readToken_eq_excl', var.get(u'code')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(126.0)): + SWITCHED = True + return var.get(u"this").callprop(u'finishOp', var.get(u'types').get(u'prefix'), Js(1.0)) + SWITCHED = True + break + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), ((Js(u"Unexpected character '")+var.get(u'codePointToString')(var.get(u'code')))+Js(u"'"))) + PyJs_getTokenFromCode_2920_._set_name(u'getTokenFromCode') + var.get(u'Tokenizer').get(u'prototype').put(u'getTokenFromCode', PyJs_getTokenFromCode_2920_) + @Js + def PyJs_finishOp_2921_(type, size, this, arguments, var=var): + var = Scope({u'this':this, u'finishOp':PyJs_finishOp_2921_, u'type':type, u'arguments':arguments, u'size':size}, var) + var.registers([u'type', u'str', u'size']) + var.put(u'str', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'pos'), (var.get(u"this").get(u'state').get(u'pos')+var.get(u'size')))) + var.get(u"this").get(u'state').put(u'pos', var.get(u'size'), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'type'), var.get(u'str')) + PyJs_finishOp_2921_._set_name(u'finishOp') + var.get(u'Tokenizer').get(u'prototype').put(u'finishOp', PyJs_finishOp_2921_) + @Js + def PyJs_readRegexp_2922_(this, arguments, var=var): + var = Scope({u'this':this, u'readRegexp':PyJs_readRegexp_2922_, u'arguments':arguments}, var) + var.registers([u'content', u'ch', u'inClass', u'escaped', u'start', u'mods', u'validFlags']) + var.put(u'escaped', PyJsComma(Js(0.0), Js(None))) + var.put(u'inClass', PyJsComma(Js(0.0), Js(None))) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Unterminated regular expression')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charAt', var.get(u"this").get(u'state').get(u'pos'))) + if var.get(u'lineBreak').callprop(u'test', var.get(u'ch')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Unterminated regular expression')) + if var.get(u'escaped'): + var.put(u'escaped', Js(False)) + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'[')): + var.put(u'inClass', var.get(u'true')) + else: + if (PyJsStrictEq(var.get(u'ch'),Js(u']')) and var.get(u'inClass')): + var.put(u'inClass', Js(False)) + else: + if (PyJsStrictEq(var.get(u'ch'),Js(u'/')) and var.get(u'inClass').neg()): + break + var.put(u'escaped', PyJsStrictEq(var.get(u'ch'),Js(u'\\'))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + var.put(u'content', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'mods', var.get(u"this").callprop(u'readWord1')) + if var.get(u'mods'): + var.put(u'validFlags', JsRegExp(u'/^[gmsiyu]*$/')) + if var.get(u'validFlags').callprop(u'test', var.get(u'mods')).neg(): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid regular expression flag')) + PyJs_Object_2923_ = Js({u'pattern':var.get(u'content'),u'flags':var.get(u'mods')}) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'regexp'), PyJs_Object_2923_) + PyJs_readRegexp_2922_._set_name(u'readRegexp') + var.get(u'Tokenizer').get(u'prototype').put(u'readRegexp', PyJs_readRegexp_2922_) + @Js + def PyJs_readInt_2924_(radix, len, this, arguments, var=var): + var = Scope({u'this':this, u'readInt':PyJs_readInt_2924_, u'radix':radix, u'arguments':arguments, u'len':len}, var) + var.registers([u'code', u'e', u'val', u'i', u'len', u'start', u'radix', u'total']) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'total', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'e', (var.get(u'Infinity') if (var.get(u'len')==var.get(u"null")) else var.get(u'len'))) + while (var.get(u'i')=Js(97.0)): + var.put(u'val', ((var.get(u'code')-Js(97.0))+Js(10.0))) + else: + if (var.get(u'code')>=Js(65.0)): + var.put(u'val', ((var.get(u'code')-Js(65.0))+Js(10.0))) + else: + if ((var.get(u'code')>=Js(48.0)) and (var.get(u'code')<=Js(57.0))): + var.put(u'val', (var.get(u'code')-Js(48.0))) + else: + var.put(u'val', var.get(u'Infinity')) + if (var.get(u'val')>=var.get(u'radix')): + break + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'total', ((var.get(u'total')*var.get(u'radix'))+var.get(u'val'))) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + if (PyJsStrictEq(var.get(u"this").get(u'state').get(u'pos'),var.get(u'start')) or ((var.get(u'len')!=var.get(u"null")) and PyJsStrictNeq((var.get(u"this").get(u'state').get(u'pos')-var.get(u'start')),var.get(u'len')))): + return var.get(u"null") + return var.get(u'total') + PyJs_readInt_2924_._set_name(u'readInt') + var.get(u'Tokenizer').get(u'prototype').put(u'readInt', PyJs_readInt_2924_) + @Js + def PyJs_readRadixNumber_2925_(radix, this, arguments, var=var): + var = Scope({u'this':this, u'radix':radix, u'arguments':arguments, u'readRadixNumber':PyJs_readRadixNumber_2925_}, var) + var.registers([u'radix', u'val']) + var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+') + var.put(u'val', var.get(u"this").callprop(u'readInt', var.get(u'radix'))) + if (var.get(u'val')==var.get(u"null")): + var.get(u"this").callprop(u'raise', (var.get(u"this").get(u'state').get(u'start')+Js(2.0)), (Js(u'Expected number in radix ')+var.get(u'radix'))) + if var.get(u'isIdentifierStart')(var.get(u"this").callprop(u'fullCharCodeAtPos')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), Js(u'Identifier directly after number')) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'num'), var.get(u'val')) + PyJs_readRadixNumber_2925_._set_name(u'readRadixNumber') + var.get(u'Tokenizer').get(u'prototype').put(u'readRadixNumber', PyJs_readRadixNumber_2925_) + @Js + def PyJs_readNumber_2926_(startsWithDot, this, arguments, var=var): + var = Scope({u'this':this, u'startsWithDot':startsWithDot, u'arguments':arguments, u'readNumber':PyJs_readNumber_2926_}, var) + var.registers([u'isFloat', u'val', u'next', u'start', u'str', u'octal', u'startsWithDot']) + var.put(u'start', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'isFloat', Js(False)) + var.put(u'octal', PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(48.0))) + if (var.get(u'startsWithDot').neg() and PyJsStrictEq(var.get(u"this").callprop(u'readInt', Js(10.0)),var.get(u"null"))): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid number')) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if PyJsStrictEq(var.get(u'next'),Js(46.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.get(u"this").callprop(u'readInt', Js(10.0)) + var.put(u'isFloat', var.get(u'true')) + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if (PyJsStrictEq(var.get(u'next'),Js(69.0)) or PyJsStrictEq(var.get(u'next'),Js(101.0))): + var.put(u'next', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)))) + if (PyJsStrictEq(var.get(u'next'),Js(43.0)) or PyJsStrictEq(var.get(u'next'),Js(45.0))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if PyJsStrictEq(var.get(u"this").callprop(u'readInt', Js(10.0)),var.get(u"null")): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid number')) + var.put(u'isFloat', var.get(u'true')) + if var.get(u'isIdentifierStart')(var.get(u"this").callprop(u'fullCharCodeAtPos')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'pos'), Js(u'Identifier directly after number')) + var.put(u'str', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'start'), var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + if var.get(u'isFloat'): + var.put(u'val', var.get(u'parseFloat')(var.get(u'str'))) + else: + if (var.get(u'octal').neg() or PyJsStrictEq(var.get(u'str').get(u'length'),Js(1.0))): + var.put(u'val', var.get(u'parseInt')(var.get(u'str'), Js(10.0))) + else: + if (JsRegExp(u'/[89]/').callprop(u'test', var.get(u'str')) or var.get(u"this").get(u'state').get(u'strict')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'Invalid number')) + else: + var.put(u'val', var.get(u'parseInt')(var.get(u'str'), Js(8.0))) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'num'), var.get(u'val')) + PyJs_readNumber_2926_._set_name(u'readNumber') + var.get(u'Tokenizer').get(u'prototype').put(u'readNumber', PyJs_readNumber_2926_) + @Js + def PyJs_readCodePoint_2927_(this, arguments, var=var): + var = Scope({u'this':this, u'readCodePoint':PyJs_readCodePoint_2927_, u'arguments':arguments}, var) + var.registers([u'code', u'ch', u'codePos']) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'code', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'ch'),Js(123.0)): + var.put(u'codePos', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + var.put(u'code', var.get(u"this").callprop(u'readHexChar', (var.get(u"this").get(u'input').callprop(u'indexOf', Js(u'}'), var.get(u"this").get(u'state').get(u'pos'))-var.get(u"this").get(u'state').get(u'pos')))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if (var.get(u'code')>Js(1114111)): + var.get(u"this").callprop(u'raise', var.get(u'codePos'), Js(u'Code point out of bounds')) + else: + var.put(u'code', var.get(u"this").callprop(u'readHexChar', Js(4.0))) + return var.get(u'code') + PyJs_readCodePoint_2927_._set_name(u'readCodePoint') + var.get(u'Tokenizer').get(u'prototype').put(u'readCodePoint', PyJs_readCodePoint_2927_) + @Js + def PyJs_readString_2928_(quote, this, arguments, var=var): + var = Scope({u'this':this, u'quote':quote, u'arguments':arguments, u'readString':PyJs_readString_2928_}, var) + var.registers([u'ch', u'quote', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated string constant')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if PyJsStrictEq(var.get(u'ch'),var.get(u'quote')): + break + if PyJsStrictEq(var.get(u'ch'),Js(92.0)): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'readEscapedChar', Js(False)), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + if var.get(u'isNewLine')(var.get(u'ch')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated string constant')) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), (var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))-Js(1))), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'string'), var.get(u'out')) + PyJs_readString_2928_._set_name(u'readString') + var.get(u'Tokenizer').get(u'prototype').put(u'readString', PyJs_readString_2928_) + @Js + def PyJs_readTmplToken_2929_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'readTmplToken':PyJs_readTmplToken_2929_}, var) + var.registers([u'ch', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated template')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if (PyJsStrictEq(var.get(u'ch'),Js(96.0)) or (PyJsStrictEq(var.get(u'ch'),Js(36.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', (var.get(u"this").get(u'state').get(u'pos')+Js(1.0))),Js(123.0)))): + if (PyJsStrictEq(var.get(u"this").get(u'state').get(u'pos'),var.get(u"this").get(u'state').get(u'start')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'template'))): + if PyJsStrictEq(var.get(u'ch'),Js(36.0)): + var.get(u"this").get(u'state').put(u'pos', Js(2.0), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'dollarBraceL')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'backQuote')) + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'template'), var.get(u'out')) + if PyJsStrictEq(var.get(u'ch'),Js(92.0)): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'readEscapedChar', var.get(u'true')), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + if var.get(u'isNewLine')(var.get(u'ch')): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(13.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(10.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + var.put(u'out', Js(u'\n'), u'+') + break + if True: + SWITCHED = True + var.put(u'out', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch')), u'+') + break + SWITCHED = True + break + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + PyJs_readTmplToken_2929_._set_name(u'readTmplToken') + var.get(u'Tokenizer').get(u'prototype').put(u'readTmplToken', PyJs_readTmplToken_2929_) + @Js + def PyJs_readEscapedChar_2930_(inTemplate, this, arguments, var=var): + var = Scope({u'this':this, u'readEscapedChar':PyJs_readEscapedChar_2930_, u'inTemplate':inTemplate, u'arguments':arguments}, var) + var.registers([u'octal', u'octalStr', u'ch', u'inTemplate']) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(110.0)): + SWITCHED = True + return Js(u'\n') + if SWITCHED or PyJsStrictEq(CONDITION, Js(114.0)): + SWITCHED = True + return Js(u'\r') + if SWITCHED or PyJsStrictEq(CONDITION, Js(120.0)): + SWITCHED = True + return var.get(u'String').callprop(u'fromCharCode', var.get(u"this").callprop(u'readHexChar', Js(2.0))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(117.0)): + SWITCHED = True + return var.get(u'codePointToString')(var.get(u"this").callprop(u'readCodePoint')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(116.0)): + SWITCHED = True + return Js(u'\t') + if SWITCHED or PyJsStrictEq(CONDITION, Js(98.0)): + SWITCHED = True + return Js(u'\x08') + if SWITCHED or PyJsStrictEq(CONDITION, Js(118.0)): + SWITCHED = True + return Js(u'\x0b') + if SWITCHED or PyJsStrictEq(CONDITION, Js(102.0)): + SWITCHED = True + return Js(u'\x0c') + if SWITCHED or PyJsStrictEq(CONDITION, Js(13.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(10.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + return Js(u'') + if True: + SWITCHED = True + if ((var.get(u'ch')>=Js(48.0)) and (var.get(u'ch')<=Js(55.0))): + var.put(u'octalStr', var.get(u"this").get(u'input').callprop(u'substr', (var.get(u"this").get(u'state').get(u'pos')-Js(1.0)), Js(3.0)).callprop(u'match', JsRegExp(u'/^[0-7]+/')).get(u'0')) + var.put(u'octal', var.get(u'parseInt')(var.get(u'octalStr'), Js(8.0))) + if (var.get(u'octal')>Js(255.0)): + var.put(u'octalStr', var.get(u'octalStr').callprop(u'slice', Js(0.0), (-Js(1.0)))) + var.put(u'octal', var.get(u'parseInt')(var.get(u'octalStr'), Js(8.0))) + if (var.get(u'octal')>Js(0.0)): + if var.get(u"this").get(u'state').get(u'containsOctal').neg(): + var.get(u"this").get(u'state').put(u'containsOctal', var.get(u'true')) + var.get(u"this").get(u'state').put(u'octalPosition', (var.get(u"this").get(u'state').get(u'pos')-Js(2.0))) + if (var.get(u"this").get(u'state').get(u'strict') or var.get(u'inTemplate')): + var.get(u"this").callprop(u'raise', (var.get(u"this").get(u'state').get(u'pos')-Js(2.0)), Js(u'Octal literal in strict mode')) + var.get(u"this").get(u'state').put(u'pos', (var.get(u'octalStr').get(u'length')-Js(1.0)), u'+') + return var.get(u'String').callprop(u'fromCharCode', var.get(u'octal')) + return var.get(u'String').callprop(u'fromCharCode', var.get(u'ch')) + SWITCHED = True + break + PyJs_readEscapedChar_2930_._set_name(u'readEscapedChar') + var.get(u'Tokenizer').get(u'prototype').put(u'readEscapedChar', PyJs_readEscapedChar_2930_) + @Js + def PyJs_readHexChar_2931_(len, this, arguments, var=var): + var = Scope({u'this':this, u'readHexChar':PyJs_readHexChar_2931_, u'arguments':arguments, u'len':len}, var) + var.registers([u'codePos', u'len', u'n']) + var.put(u'codePos', var.get(u"this").get(u'state').get(u'pos')) + var.put(u'n', var.get(u"this").callprop(u'readInt', Js(16.0), var.get(u'len'))) + if PyJsStrictEq(var.get(u'n'),var.get(u"null")): + var.get(u"this").callprop(u'raise', var.get(u'codePos'), Js(u'Bad character escape sequence')) + return var.get(u'n') + PyJs_readHexChar_2931_._set_name(u'readHexChar') + var.get(u'Tokenizer').get(u'prototype').put(u'readHexChar', PyJs_readHexChar_2931_) + @Js + def PyJs_readWord1_2932_(this, arguments, var=var): + var = Scope({u'this':this, u'readWord1':PyJs_readWord1_2932_, u'arguments':arguments}, var) + var.registers([u'ch', u'word', u'chunkStart', u'escStart', u'esc', u'first']) + var.get(u"this").get(u'state').put(u'containsEsc', Js(False)) + var.put(u'word', Js(u'')) + var.put(u'first', var.get(u'true')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + while (var.get(u"this").get(u'state').get(u'pos')=Js(0.0)): + @Js + def PyJs_anonymous_2944_(plugin, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'plugin':plugin}, var) + var.registers([u'plugin']) + return PyJsStrictNeq(var.get(u'plugin'),Js(u'flow')) + PyJs_anonymous_2944_._set_name(u'anonymous') + var.put(u'pluginList', var.get(u'pluginList').callprop(u'filter', PyJs_anonymous_2944_)) + var.get(u'pluginList').callprop(u'push', Js(u'flow')) + #for JS loop + var.put(u'_iterator', var.get(u'pluginList')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'name', var.get(u'_ref')) + if var.get(u'pluginMap').get(var.get(u'name')).neg(): + var.get(u'pluginMap').put(var.get(u'name'), var.get(u'true')) + var.put(u'plugin', var.get(u'plugins').get(var.get(u'name'))) + if var.get(u'plugin'): + var.get(u'plugin')(var.get(u"this")) + + return var.get(u'pluginMap') + PyJs_loadPlugins_2942_._set_name(u'loadPlugins') + var.get(u'Parser').get(u'prototype').put(u'loadPlugins', PyJs_loadPlugins_2942_) + @Js + def PyJs_parse_2945_(this, arguments, var=var): + var = Scope({u'this':this, u'parse':PyJs_parse_2945_, u'arguments':arguments}, var) + var.registers([u'program', u'file']) + var.put(u'file', var.get(u"this").callprop(u'startNode')) + var.put(u'program', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'nextToken') + return var.get(u"this").callprop(u'parseTopLevel', var.get(u'file'), var.get(u'program')) + PyJs_parse_2945_._set_name(u'parse') + var.get(u'Parser').get(u'prototype').put(u'parse', PyJs_parse_2945_) + return var.get(u'Parser') + PyJs_anonymous_2939_._set_name(u'anonymous') + var.put(u'Parser', PyJs_anonymous_2939_(var.get(u'Tokenizer'))) + @Js + def PyJs_anonymous_2946_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return var.get(u'obj',throw=False).typeof() + PyJs_anonymous_2946_._set_name(u'anonymous') + @Js + def PyJs_anonymous_2947_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return (Js(u'symbol') if (((var.get(u'obj') and PyJsStrictEq(var.get(u'Symbol',throw=False).typeof(),Js(u'function'))) and PyJsStrictEq(var.get(u'obj').get(u'constructor'),var.get(u'Symbol'))) and PyJsStrictNeq(var.get(u'obj'),var.get(u'Symbol').get(u'prototype'))) else var.get(u'obj',throw=False).typeof()) + PyJs_anonymous_2947_._set_name(u'anonymous') + var.put(u'_typeof', (PyJs_anonymous_2946_ if (PyJsStrictEq(var.get(u'Symbol',throw=False).typeof(),Js(u'function')) and PyJsStrictEq(var.get(u'Symbol').get(u'iterator').typeof(),Js(u'symbol'))) else PyJs_anonymous_2947_)) + var.put(u'pp', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_2948_(node, key, val, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'val':val, u'key':key, u'arguments':arguments}, var) + var.registers([u'node', u'val', u'key', u'extra']) + if var.get(u'node').neg(): + return var.get('undefined') + PyJs_Object_2949_ = Js({}) + var.put(u'extra', var.get(u'node').put(u'extra', (var.get(u'node').get(u'extra') or PyJs_Object_2949_))) + var.get(u'extra').put(var.get(u'key'), var.get(u'val')) + PyJs_anonymous_2948_._set_name(u'anonymous') + var.get(u'pp').put(u'addExtra', PyJs_anonymous_2948_) + @Js + def PyJs_anonymous_2950_(op, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'op':op}, var) + var.registers([u'op']) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'relational')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),var.get(u'op'))) + PyJs_anonymous_2950_._set_name(u'anonymous') + var.get(u'pp').put(u'isRelational', PyJs_anonymous_2950_) + @Js + def PyJs_anonymous_2951_(op, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'op':op}, var) + var.registers([u'op']) + if var.get(u"this").callprop(u'isRelational', var.get(u'op')): + var.get(u"this").callprop(u'next') + else: + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'types').get(u'relational')) + PyJs_anonymous_2951_._set_name(u'anonymous') + var.get(u'pp').put(u'expectRelational', PyJs_anonymous_2951_) + @Js + def PyJs_anonymous_2952_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),var.get(u'name'))) + PyJs_anonymous_2952_._set_name(u'anonymous') + var.get(u'pp').put(u'isContextual', PyJs_anonymous_2952_) + @Js + def PyJs_anonymous_2953_(name, this, arguments, var=var): + var = Scope({u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'name']) + return (PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),var.get(u'name')) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'name'))) + PyJs_anonymous_2953_._set_name(u'anonymous') + var.get(u'pp').put(u'eatContextual', PyJs_anonymous_2953_) + @Js + def PyJs_anonymous_2954_(name, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'name':name, u'arguments':arguments}, var) + var.registers([u'message', u'name']) + if var.get(u"this").callprop(u'eatContextual', var.get(u'name')).neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'message')) + PyJs_anonymous_2954_._set_name(u'anonymous') + var.get(u'pp').put(u'expectContextual', PyJs_anonymous_2954_) + @Js + def PyJs_anonymous_2955_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'eof')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR'))) or var.get(u'lineBreak').callprop(u'test', var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'lastTokEnd'), var.get(u"this").get(u'state').get(u'start')))) + PyJs_anonymous_2955_._set_name(u'anonymous') + var.get(u'pp').put(u'canInsertSemicolon', PyJs_anonymous_2955_) + @Js + def PyJs_anonymous_2956_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')) or var.get(u"this").callprop(u'canInsertSemicolon')) + PyJs_anonymous_2956_._set_name(u'anonymous') + var.get(u'pp').put(u'isLineTerminator', PyJs_anonymous_2956_) + @Js + def PyJs_anonymous_2957_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").callprop(u'isLineTerminator').neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'types').get(u'semi')) + PyJs_anonymous_2957_._set_name(u'anonymous') + var.get(u'pp').put(u'semicolon', PyJs_anonymous_2957_) + @Js + def PyJs_anonymous_2958_(type, pos, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'pos':pos, u'arguments':arguments}, var) + var.registers([u'type', u'pos']) + return (var.get(u"this").callprop(u'eat', var.get(u'type')) or var.get(u"this").callprop(u'unexpected', var.get(u'pos'), var.get(u'type'))) + PyJs_anonymous_2958_._set_name(u'anonymous') + var.get(u'pp').put(u'expect', PyJs_anonymous_2958_) + @Js + def PyJs_anonymous_2959_(pos, this, arguments, var=var): + var = Scope({u'this':this, u'pos':pos, u'arguments':arguments}, var) + var.registers([u'pos', u'messageOrType']) + var.put(u'messageOrType', (var.get(u'arguments').get(u'1') if ((var.get(u'arguments').get(u'length')>Js(1.0)) and PyJsStrictNeq(var.get(u'arguments').get(u'1'),var.get(u'undefined'))) else Js(u'Unexpected token'))) + if ((var.get(u'messageOrType') and PyJsStrictEq((Js(u'undefined') if PyJsStrictEq(var.get(u'messageOrType',throw=False).typeof(),Js(u'undefined')) else var.get(u'_typeof')(var.get(u'messageOrType'))),Js(u'object'))) and var.get(u'messageOrType').get(u'label')): + var.put(u'messageOrType', (Js(u'Unexpected token, expected ')+var.get(u'messageOrType').get(u'label'))) + var.get(u"this").callprop(u'raise', (var.get(u'pos') if (var.get(u'pos')!=var.get(u"null")) else var.get(u"this").get(u'state').get(u'start')), var.get(u'messageOrType')) + PyJs_anonymous_2959_._set_name(u'anonymous') + var.get(u'pp').put(u'unexpected', PyJs_anonymous_2959_) + var.put(u'pp$1', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_2960_(file, program, this, arguments, var=var): + var = Scope({u'this':this, u'program':program, u'arguments':arguments, u'file':file}, var) + var.registers([u'program', u'file']) + var.get(u'program').put(u'sourceType', var.get(u"this").get(u'options').get(u'sourceType')) + var.get(u"this").callprop(u'parseBlockBody', var.get(u'program'), var.get(u'true'), var.get(u'true'), var.get(u'types').get(u'eof')) + var.get(u'file').put(u'program', var.get(u"this").callprop(u'finishNode', var.get(u'program'), Js(u'Program'))) + var.get(u'file').put(u'comments', var.get(u"this").get(u'state').get(u'comments')) + var.get(u'file').put(u'tokens', var.get(u"this").get(u'state').get(u'tokens')) + return var.get(u"this").callprop(u'finishNode', var.get(u'file'), Js(u'File')) + PyJs_anonymous_2960_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseTopLevel', PyJs_anonymous_2960_) + PyJs_Object_2961_ = Js({u'kind':Js(u'loop')}) + var.put(u'loopLabel', PyJs_Object_2961_) + PyJs_Object_2962_ = Js({u'kind':Js(u'switch')}) + var.put(u'switchLabel', PyJs_Object_2962_) + @Js + def PyJs_anonymous_2963_(stmt, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'stmt':stmt}, var) + var.registers([u'directiveLiteral', u'directive', u'val', u'expr', u'stmt', u'raw']) + var.put(u'expr', var.get(u'stmt').get(u'expression')) + var.put(u'directiveLiteral', var.get(u"this").callprop(u'startNodeAt', var.get(u'expr').get(u'start'), var.get(u'expr').get(u'loc').get(u'start'))) + var.put(u'directive', var.get(u"this").callprop(u'startNodeAt', var.get(u'stmt').get(u'start'), var.get(u'stmt').get(u'loc').get(u'start'))) + var.put(u'raw', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'expr').get(u'start'), var.get(u'expr').get(u'end'))) + var.put(u'val', var.get(u'directiveLiteral').put(u'value', var.get(u'raw').callprop(u'slice', Js(1.0), (-Js(1.0))))) + var.get(u"this").callprop(u'addExtra', var.get(u'directiveLiteral'), Js(u'raw'), var.get(u'raw')) + var.get(u"this").callprop(u'addExtra', var.get(u'directiveLiteral'), Js(u'rawValue'), var.get(u'val')) + var.get(u'directive').put(u'value', var.get(u"this").callprop(u'finishNodeAt', var.get(u'directiveLiteral'), Js(u'DirectiveLiteral'), var.get(u'expr').get(u'end'), var.get(u'expr').get(u'loc').get(u'end'))) + return var.get(u"this").callprop(u'finishNodeAt', var.get(u'directive'), Js(u'Directive'), var.get(u'stmt').get(u'end'), var.get(u'stmt').get(u'loc').get(u'end')) + PyJs_anonymous_2963_._set_name(u'anonymous') + var.get(u'pp$1').put(u'stmtToDirective', PyJs_anonymous_2963_) + @Js + def PyJs_anonymous_2964_(declaration, topLevel, this, arguments, var=var): + var = Scope({u'this':this, u'topLevel':topLevel, u'arguments':arguments, u'declaration':declaration}, var) + var.registers([u'node', u'expr', u'topLevel', u'state', u'starttype', u'declaration', u'maybeName']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u"this").callprop(u'parseDecorators', var.get(u'true')) + var.put(u'starttype', var.get(u"this").get(u'state').get(u'type')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'starttype')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_break')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_continue')): + SWITCHED = True + return var.get(u"this").callprop(u'parseBreakContinueStatement', var.get(u'node'), var.get(u'starttype').get(u'keyword')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_debugger')): + SWITCHED = True + return var.get(u"this").callprop(u'parseDebuggerStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_do')): + SWITCHED = True + return var.get(u"this").callprop(u'parseDoStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_for')): + SWITCHED = True + return var.get(u"this").callprop(u'parseForStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_function')): + SWITCHED = True + if var.get(u'declaration').neg(): + var.get(u"this").callprop(u'unexpected') + return var.get(u"this").callprop(u'parseFunctionStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_class')): + SWITCHED = True + if var.get(u'declaration').neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'takeDecorators', var.get(u'node')) + return var.get(u"this").callprop(u'parseClass', var.get(u'node'), var.get(u'true')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_if')): + SWITCHED = True + return var.get(u"this").callprop(u'parseIfStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_return')): + SWITCHED = True + return var.get(u"this").callprop(u'parseReturnStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_switch')): + SWITCHED = True + return var.get(u"this").callprop(u'parseSwitchStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_throw')): + SWITCHED = True + return var.get(u"this").callprop(u'parseThrowStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_try')): + SWITCHED = True + return var.get(u"this").callprop(u'parseTryStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_let')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_const')): + SWITCHED = True + if var.get(u'declaration').neg(): + var.get(u"this").callprop(u'unexpected') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_var')): + SWITCHED = True + return var.get(u"this").callprop(u'parseVarStatement', var.get(u'node'), var.get(u'starttype')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_while')): + SWITCHED = True + return var.get(u"this").callprop(u'parseWhileStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_with')): + SWITCHED = True + return var.get(u"this").callprop(u'parseWithStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseBlock') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'semi')): + SWITCHED = True + return var.get(u"this").callprop(u'parseEmptyStatement', var.get(u'node')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_export')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_import')): + SWITCHED = True + if (var.get(u"this").callprop(u'hasPlugin', Js(u'dynamicImport')) and PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'parenL'))): + break + if var.get(u"this").get(u'options').get(u'allowImportExportEverywhere').neg(): + if var.get(u'topLevel').neg(): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'import' and 'export' may only appear at the top level")) + if var.get(u"this").get(u'inModule').neg(): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'import' and 'export' may appear only with 'sourceType: module'")) + return (var.get(u"this").callprop(u'parseImport', var.get(u'node')) if PyJsStrictEq(var.get(u'starttype'),var.get(u'types').get(u'_import')) else var.get(u"this").callprop(u'parseExport', var.get(u'node'))) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'name')): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'async')): + var.put(u'state', var.get(u"this").get(u'state').callprop(u'clone')) + var.get(u"this").callprop(u'next') + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function')) and var.get(u"this").callprop(u'canInsertSemicolon').neg()): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'_function')) + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), var.get(u'true'), Js(False), var.get(u'true')) + else: + var.get(u"this").put(u'state', var.get(u'state')) + SWITCHED = True + break + var.put(u'maybeName', var.get(u"this").get(u'state').get(u'value')) + var.put(u'expr', var.get(u"this").callprop(u'parseExpression')) + if ((PyJsStrictEq(var.get(u'starttype'),var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'Identifier'))) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'colon'))): + return var.get(u"this").callprop(u'parseLabeledStatement', var.get(u'node'), var.get(u'maybeName'), var.get(u'expr')) + else: + return var.get(u"this").callprop(u'parseExpressionStatement', var.get(u'node'), var.get(u'expr')) + PyJs_anonymous_2964_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseStatement', PyJs_anonymous_2964_) + @Js + def PyJs_anonymous_2965_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'state').get(u'decorators').get(u'length'): + var.get(u'node').put(u'decorators', var.get(u"this").get(u'state').get(u'decorators')) + var.get(u"this").get(u'state').put(u'decorators', Js([])) + PyJs_anonymous_2965_._set_name(u'anonymous') + var.get(u'pp$1').put(u'takeDecorators', PyJs_anonymous_2965_) + @Js + def PyJs_anonymous_2966_(allowExport, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'allowExport':allowExport}, var) + var.registers([u'allowExport']) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u"this").get(u'state').get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + if (var.get(u'allowExport') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'_export'))): + return var.get('undefined') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')).neg(): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Leading decorators must be attached to a class declaration')) + PyJs_anonymous_2966_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseDecorators', PyJs_anonymous_2966_) + @Js + def PyJs_anonymous_2967_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'hasPlugin', Js(u'decorators')).neg(): + var.get(u"this").callprop(u'unexpected') + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'expression', var.get(u"this").callprop(u'parseMaybeAssign')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Decorator')) + PyJs_anonymous_2967_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseDecorator', PyJs_anonymous_2967_) + @Js + def PyJs_anonymous_2968_(node, keyword, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'keyword':keyword}, var) + var.registers([u'i', u'node', u'isBreak', u'keyword', u'lab']) + var.put(u'isBreak', PyJsStrictEq(var.get(u'keyword'),Js(u'break'))) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'isLineTerminator'): + var.get(u'node').put(u'label', var.get(u"null")) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')).neg(): + var.get(u"this").callprop(u'unexpected') + else: + var.get(u'node').put(u'label', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u"this").callprop(u'semicolon') + var.put(u'i', PyJsComma(Js(0.0), Js(None))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'_label', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'_label').get(u'name'),var.get(u'maybeName')): + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), ((Js(u"Label '")+var.get(u'maybeName'))+Js(u"' is already declared"))) + + var.put(u'kind', (Js(u'loop') if var.get(u"this").get(u'state').get(u'type').get(u'isLoop') else (Js(u'switch') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_switch')) else var.get(u"null")))) + #for JS loop + var.put(u'i', (var.get(u"this").get(u'state').get(u'labels').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'label', var.get(u"this").get(u'state').get(u'labels').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'label').get(u'statementStart'),var.get(u'node').get(u'start')): + var.get(u'label').put(u'statementStart', var.get(u"this").get(u'state').get(u'start')) + var.get(u'label').put(u'kind', var.get(u'kind')) + else: + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + PyJs_Object_2984_ = Js({u'name':var.get(u'maybeName'),u'kind':var.get(u'kind'),u'statementStart':var.get(u"this").get(u'state').get(u'start')}) + var.get(u"this").get(u'state').get(u'labels').callprop(u'push', PyJs_Object_2984_) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', var.get(u'true'))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + var.get(u'node').put(u'label', var.get(u'expr')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'LabeledStatement')) + PyJs_anonymous_2983_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseLabeledStatement', PyJs_anonymous_2983_) + @Js + def PyJs_anonymous_2985_(node, expr, this, arguments, var=var): + var = Scope({u'node':node, u'expr':expr, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'expr']) + var.get(u'node').put(u'expression', var.get(u'expr')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExpressionStatement')) + PyJs_anonymous_2985_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExpressionStatement', PyJs_anonymous_2985_) + @Js + def PyJs_anonymous_2986_(allowDirectives, this, arguments, var=var): + var = Scope({u'this':this, u'allowDirectives':allowDirectives, u'arguments':arguments}, var) + var.registers([u'node', u'allowDirectives']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + var.get(u"this").callprop(u'parseBlockBody', var.get(u'node'), var.get(u'allowDirectives'), Js(False), var.get(u'types').get(u'braceR')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BlockStatement')) + PyJs_anonymous_2986_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseBlock', PyJs_anonymous_2986_) + @Js + def PyJs_anonymous_2987_(node, allowDirectives, topLevel, end, this, arguments, var=var): + var = Scope({u'node':node, u'topLevel':topLevel, u'allowDirectives':allowDirectives, u'end':end, u'arguments':arguments, u'this':this}, var) + var.registers([u'node', u'allowDirectives', u'end', u'parsedNonDirective', u'directive', u'topLevel', u'stmt', u'octalPosition', u'oldStrict']) + var.get(u'node').put(u'body', Js([])) + var.get(u'node').put(u'directives', Js([])) + var.put(u'parsedNonDirective', Js(False)) + var.put(u'oldStrict', PyJsComma(Js(0.0), Js(None))) + var.put(u'octalPosition', PyJsComma(Js(0.0), Js(None))) + while var.get(u"this").callprop(u'eat', var.get(u'end')).neg(): + if ((var.get(u'parsedNonDirective').neg() and var.get(u"this").get(u'state').get(u'containsOctal')) and var.get(u'octalPosition').neg()): + var.put(u'octalPosition', var.get(u"this").get(u'state').get(u'octalPosition')) + var.put(u'stmt', var.get(u"this").callprop(u'parseStatement', var.get(u'true'), var.get(u'topLevel'))) + if ((((var.get(u'allowDirectives') and var.get(u'parsedNonDirective').neg()) and PyJsStrictEq(var.get(u'stmt').get(u'type'),Js(u'ExpressionStatement'))) and PyJsStrictEq(var.get(u'stmt').get(u'expression').get(u'type'),Js(u'StringLiteral'))) and var.get(u'stmt').get(u'expression').get(u'extra').get(u'parenthesized').neg()): + var.put(u'directive', var.get(u"this").callprop(u'stmtToDirective', var.get(u'stmt'))) + var.get(u'node').get(u'directives').callprop(u'push', var.get(u'directive')) + if (PyJsStrictEq(var.get(u'oldStrict'),var.get(u'undefined')) and PyJsStrictEq(var.get(u'directive').get(u'value').get(u'value'),Js(u'use strict'))): + var.put(u'oldStrict', var.get(u"this").get(u'state').get(u'strict')) + var.get(u"this").callprop(u'setStrict', var.get(u'true')) + if var.get(u'octalPosition'): + var.get(u"this").callprop(u'raise', var.get(u'octalPosition'), Js(u'Octal literal in strict mode')) + continue + var.put(u'parsedNonDirective', var.get(u'true')) + var.get(u'node').get(u'body').callprop(u'push', var.get(u'stmt')) + if PyJsStrictEq(var.get(u'oldStrict'),Js(False)): + var.get(u"this").callprop(u'setStrict', Js(False)) + PyJs_anonymous_2987_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseBlockBody', PyJs_anonymous_2987_) + @Js + def PyJs_anonymous_2988_(node, init, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'init':init, u'arguments':arguments}, var) + var.registers([u'node', u'init']) + var.get(u'node').put(u'init', var.get(u'init')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'semi')) + var.get(u'node').put(u'test', (var.get(u"null") if var.get(u"this").callprop(u'match', var.get(u'types').get(u'semi')) else var.get(u"this").callprop(u'parseExpression'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'semi')) + var.get(u'node').put(u'update', (var.get(u"null") if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')) else var.get(u"this").callprop(u'parseExpression'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ForStatement')) + PyJs_anonymous_2988_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFor', PyJs_anonymous_2988_) + @Js + def PyJs_anonymous_2989_(node, init, forAwait, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'init':init, u'forAwait':forAwait, u'arguments':arguments}, var) + var.registers([u'node', u'init', u'type', u'forAwait']) + var.put(u'type', PyJsComma(Js(0.0), Js(None))) + if var.get(u'forAwait'): + var.get(u"this").callprop(u'eatContextual', Js(u'of')) + var.put(u'type', Js(u'ForAwaitStatement')) + else: + var.put(u'type', (Js(u'ForInStatement') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) else Js(u'ForOfStatement'))) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'left', var.get(u'init')) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseStatement', Js(False))) + var.get(u"this").get(u'state').get(u'labels').callprop(u'pop') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), var.get(u'type')) + PyJs_anonymous_2989_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseForIn', PyJs_anonymous_2989_) + @Js + def PyJs_anonymous_2990_(node, isFor, kind, this, arguments, var=var): + var = Scope({u'node':node, u'isFor':isFor, u'kind':kind, u'this':this, u'arguments':arguments}, var) + var.registers([u'decl', u'node', u'kind', u'isFor']) + var.get(u'node').put(u'declarations', Js([])) + var.get(u'node').put(u'kind', var.get(u'kind').get(u'keyword')) + #for JS loop + + while 1: + var.put(u'decl', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'parseVarHead', var.get(u'decl')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'eq')): + var.get(u'decl').put(u'init', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'isFor'))) + else: + if (PyJsStrictEq(var.get(u'kind'),var.get(u'types').get(u'_const')) and (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) or var.get(u"this").callprop(u'isContextual', Js(u'of'))).neg()): + var.get(u"this").callprop(u'unexpected') + else: + if (PyJsStrictNeq(var.get(u'decl').get(u'id').get(u'type'),Js(u'Identifier')) and (var.get(u'isFor') and (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')) or var.get(u"this").callprop(u'isContextual', Js(u'of')))).neg()): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'lastTokEnd'), Js(u'Complex binding patterns require an initialization value')) + else: + var.get(u'decl').put(u'init', var.get(u"null")) + var.get(u'node').get(u'declarations').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'decl'), Js(u'VariableDeclarator'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')).neg(): + break + + return var.get(u'node') + PyJs_anonymous_2990_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseVar', PyJs_anonymous_2990_) + @Js + def PyJs_anonymous_2991_(decl, this, arguments, var=var): + var = Scope({u'decl':decl, u'this':this, u'arguments':arguments}, var) + var.registers([u'decl']) + var.get(u'decl').put(u'id', var.get(u"this").callprop(u'parseBindingAtom')) + var.get(u"this").callprop(u'checkLVal', var.get(u'decl').get(u'id'), var.get(u'true'), var.get(u'undefined'), Js(u'variable declaration')) + PyJs_anonymous_2991_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseVarHead', PyJs_anonymous_2991_) + @Js + def PyJs_anonymous_2992_(node, isStatement, allowExpressionBody, isAsync, optionalId, this, arguments, var=var): + var = Scope({u'node':node, u'optionalId':optionalId, u'isAsync':isAsync, u'arguments':arguments, u'this':this, u'isStatement':isStatement, u'allowExpressionBody':allowExpressionBody}, var) + var.registers([u'node', u'optionalId', u'isAsync', u'oldInMethod', u'isStatement', u'allowExpressionBody']) + var.put(u'oldInMethod', var.get(u"this").get(u'state').get(u'inMethod')) + var.get(u"this").get(u'state').put(u'inMethod', Js(False)) + var.get(u"this").callprop(u'initFunction', var.get(u'node'), var.get(u'isAsync')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + if (var.get(u'node').get(u'async') and var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')).neg()): + var.get(u"this").callprop(u'unexpected') + else: + var.get(u'node').put(u'generator', var.get(u'true')) + var.get(u"this").callprop(u'next') + if (((var.get(u'isStatement') and var.get(u'optionalId').neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield')).neg()): + var.get(u"this").callprop(u'unexpected') + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield'))): + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseBindingIdentifier')) + var.get(u"this").callprop(u'parseFunctionParams', var.get(u'node')) + var.get(u"this").callprop(u'parseFunctionBody', var.get(u'node'), var.get(u'allowExpressionBody')) + var.get(u"this").get(u'state').put(u'inMethod', var.get(u'oldInMethod')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'FunctionDeclaration') if var.get(u'isStatement') else Js(u'FunctionExpression'))) + PyJs_anonymous_2992_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFunction', PyJs_anonymous_2992_) + @Js + def PyJs_anonymous_2993_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.get(u'node').put(u'params', var.get(u"this").callprop(u'parseBindingList', var.get(u'types').get(u'parenR'))) + PyJs_anonymous_2993_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseFunctionParams', PyJs_anonymous_2993_) + @Js + def PyJs_anonymous_2994_(node, isStatement, optionalId, this, arguments, var=var): + var = Scope({u'node':node, u'optionalId':optionalId, u'this':this, u'isStatement':isStatement, u'arguments':arguments}, var) + var.registers([u'node', u'optionalId', u'isStatement']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'parseClassId', var.get(u'node'), var.get(u'isStatement'), var.get(u'optionalId')) + var.get(u"this").callprop(u'parseClassSuper', var.get(u'node')) + var.get(u"this").callprop(u'parseClassBody', var.get(u'node')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'ClassDeclaration') if var.get(u'isStatement') else Js(u'ClassExpression'))) + PyJs_anonymous_2994_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClass', PyJs_anonymous_2994_) + @Js + def PyJs_anonymous_2995_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')) or var.get(u"this").callprop(u'isLineTerminator')) + PyJs_anonymous_2995_._set_name(u'anonymous') + var.get(u'pp$1').put(u'isClassProperty', PyJs_anonymous_2995_) + @Js + def PyJs_anonymous_2996_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJs_anonymous_2996_._set_name(u'anonymous') + var.get(u'pp$1').put(u'isClassMutatorStarter', PyJs_anonymous_2996_) + @Js + def PyJs_anonymous_2997_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'isStaticPrototype', u'hadConstructor', u'isConstructorCall', u'isGetSet', u'isGenerator', u'start', u'paramCount', u'isMaybeStatic', u'classBody', u'key', u'isConstructor', u'isAsync', u'isAsyncMethod', u'hadConstructorCall', u'decorators', u'method', u'oldStrict']) + var.put(u'oldStrict', var.get(u"this").get(u'state').get(u'strict')) + var.get(u"this").get(u'state').put(u'strict', var.get(u'true')) + var.put(u'hadConstructorCall', Js(False)) + var.put(u'hadConstructor', Js(False)) + var.put(u'decorators', Js([])) + var.put(u'classBody', var.get(u"this").callprop(u'startNode')) + var.get(u'classBody').put(u'body', Js([])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')): + continue + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + continue + var.put(u'method', var.get(u"this").callprop(u'startNode')) + if var.get(u'decorators').get(u'length'): + var.get(u'method').put(u'decorators', var.get(u'decorators')) + var.put(u'decorators', Js([])) + var.put(u'isConstructorCall', Js(False)) + var.put(u'isMaybeStatic', (var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'static')))) + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.put(u'isGetSet', Js(False)) + var.put(u'isAsync', Js(False)) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + var.get(u'method').put(u'static', (var.get(u'isMaybeStatic') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg())) + if var.get(u'method').get(u'static'): + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + if var.get(u'isGenerator').neg(): + if var.get(u"this").callprop(u'isClassProperty'): + var.get(u'classBody').get(u'body').callprop(u'push', var.get(u"this").callprop(u'parseClassProperty', var.get(u'method'))) + continue + def PyJs_LONG_2998_(var=var): + return (((((PyJsStrictEq(var.get(u'method').get(u'key').get(u'type'),Js(u'Identifier')) and var.get(u'method').get(u'computed').neg()) and var.get(u"this").callprop(u'hasPlugin', Js(u'classConstructorCall'))) and PyJsStrictEq(var.get(u'method').get(u'key').get(u'name'),Js(u'call'))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'constructor'))) + if PyJs_LONG_2998_(): + var.put(u'isConstructorCall', var.get(u'true')) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + var.put(u'isAsyncMethod', (((var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg() and var.get(u'method').get(u'computed').neg()) and PyJsStrictEq(var.get(u'method').get(u'key').get(u'type'),Js(u'Identifier'))) and PyJsStrictEq(var.get(u'method').get(u'key').get(u'name'),Js(u'async')))) + if var.get(u'isAsyncMethod'): + if (var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))): + var.put(u'isGenerator', var.get(u'true')) + var.put(u'isAsync', var.get(u'true')) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'method')) + var.get(u'method').put(u'kind', Js(u'method')) + if var.get(u'method').get(u'computed').neg(): + var.put(u'key', var.get(u'method').get(u'key')) + if (((((var.get(u'isAsync').neg() and var.get(u'isGenerator').neg()) and var.get(u"this").callprop(u'isClassMutatorStarter').neg()) and PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'Identifier'))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg()) and (PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'get')) or PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'set')))): + var.put(u'isGetSet', var.get(u'true')) + var.get(u'method').put(u'kind', var.get(u'key').get(u'name')) + var.put(u'key', var.get(u"this").callprop(u'parsePropertyName', var.get(u'method'))) + var.put(u'isConstructor', ((var.get(u'isConstructorCall').neg() and var.get(u'method').get(u'static').neg()) and ((PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'Identifier')) and PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'constructor'))) or (PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'StringLiteral')) and PyJsStrictEq(var.get(u'key').get(u'value'),Js(u'constructor')))))) + if var.get(u'isConstructor'): + if var.get(u'hadConstructor'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u'Duplicate constructor in the same class')) + if var.get(u'isGetSet'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u"Constructor can't have get/set modifier")) + if var.get(u'isGenerator'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u"Constructor can't be a generator")) + if var.get(u'isAsync'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u"Constructor can't be an async function")) + var.get(u'method').put(u'kind', Js(u'constructor')) + var.put(u'hadConstructor', var.get(u'true')) + var.put(u'isStaticPrototype', (var.get(u'method').get(u'static') and ((PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'Identifier')) and PyJsStrictEq(var.get(u'key').get(u'name'),Js(u'prototype'))) or (PyJsStrictEq(var.get(u'key').get(u'type'),Js(u'StringLiteral')) and PyJsStrictEq(var.get(u'key').get(u'value'),Js(u'prototype')))))) + if var.get(u'isStaticPrototype'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u'Classes may not have static property named prototype')) + if var.get(u'isConstructorCall'): + if var.get(u'hadConstructorCall'): + var.get(u"this").callprop(u'raise', var.get(u'method').get(u'start'), Js(u'Duplicate constructor call in the same class')) + var.get(u'method').put(u'kind', Js(u'constructorCall')) + var.put(u'hadConstructorCall', var.get(u'true')) + if ((PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'constructor')) or PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'constructorCall'))) and var.get(u'method').get(u'decorators')): + var.get(u"this").callprop(u'raise', var.get(u'method').get(u'start'), Js(u"You can't attach decorators to a class constructor")) + var.get(u"this").callprop(u'parseClassMethod', var.get(u'classBody'), var.get(u'method'), var.get(u'isGenerator'), var.get(u'isAsync')) + if var.get(u'isGetSet'): + var.put(u'paramCount', (Js(0.0) if PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'get')) else Js(1.0))) + if PyJsStrictNeq(var.get(u'method').get(u'params').get(u'length'),var.get(u'paramCount')): + var.put(u'start', var.get(u'method').get(u'start')) + if PyJsStrictEq(var.get(u'method').get(u'kind'),Js(u'get')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'getter should have no params')) + else: + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'setter should have exactly one param')) + if var.get(u'decorators').get(u'length'): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'You have trailing decorators with no method')) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'finishNode', var.get(u'classBody'), Js(u'ClassBody'))) + var.get(u"this").get(u'state').put(u'strict', var.get(u'oldStrict')) + PyJs_anonymous_2997_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassBody', PyJs_anonymous_2997_) + @Js + def PyJs_anonymous_2999_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')): + if var.get(u"this").callprop(u'hasPlugin', Js(u'classProperties')).neg(): + var.get(u"this").callprop(u'unexpected') + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'value', var.get(u"this").callprop(u'parseMaybeAssign')) + else: + var.get(u'node').put(u'value', var.get(u"null")) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ClassProperty')) + PyJs_anonymous_2999_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassProperty', PyJs_anonymous_2999_) + @Js + def PyJs_anonymous_3000_(classBody, method, isGenerator, isAsync, this, arguments, var=var): + var = Scope({u'isAsync':isAsync, u'classBody':classBody, u'this':this, u'isGenerator':isGenerator, u'method':method, u'arguments':arguments}, var) + var.registers([u'isAsync', u'isGenerator', u'classBody', u'method']) + var.get(u"this").callprop(u'parseMethod', var.get(u'method'), var.get(u'isGenerator'), var.get(u'isAsync')) + var.get(u'classBody').get(u'body').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'method'), Js(u'ClassMethod'))) + PyJs_anonymous_3000_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassMethod', PyJs_anonymous_3000_) + @Js + def PyJs_anonymous_3001_(node, isStatement, optionalId, this, arguments, var=var): + var = Scope({u'node':node, u'optionalId':optionalId, u'this':this, u'isStatement':isStatement, u'arguments':arguments}, var) + var.registers([u'node', u'optionalId', u'isStatement']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + else: + if (var.get(u'optionalId') or var.get(u'isStatement').neg()): + var.get(u'node').put(u'id', var.get(u"null")) + else: + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3001_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassId', PyJs_anonymous_3001_) + @Js + def PyJs_anonymous_3002_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'superClass', (var.get(u"this").callprop(u'parseExprSubscripts') if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_extends')) else var.get(u"null"))) + PyJs_anonymous_3002_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseClassSuper', PyJs_anonymous_3002_) + @Js + def PyJs_anonymous_3003_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifier', u'expr', u'_specifier', u'_specifier2', u'needsSemi']) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + var.put(u'specifier', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if (var.get(u"this").callprop(u'hasPlugin', Js(u'exportExtensions')) and var.get(u"this").callprop(u'eatContextual', Js(u'as'))): + var.get(u'specifier').put(u'exported', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u'node').put(u'specifiers', Js([var.get(u"this").callprop(u'finishNode', var.get(u'specifier'), Js(u'ExportNamespaceSpecifier'))])) + var.get(u"this").callprop(u'parseExportSpecifiersMaybe', var.get(u'node')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node'), var.get(u'true')) + else: + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportAllDeclaration')) + else: + if (var.get(u"this").callprop(u'hasPlugin', Js(u'exportExtensions')) and var.get(u"this").callprop(u'isExportDefaultSpecifier')): + var.put(u'_specifier', var.get(u"this").callprop(u'startNode')) + var.get(u'_specifier').put(u'exported', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + var.get(u'node').put(u'specifiers', Js([var.get(u"this").callprop(u'finishNode', var.get(u'_specifier'), Js(u'ExportDefaultSpecifier'))])) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')) and PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'star'))): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + var.put(u'_specifier2', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'star')) + var.get(u"this").callprop(u'expectContextual', Js(u'as')) + var.get(u'_specifier2').put(u'exported', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'_specifier2'), Js(u'ExportNamespaceSpecifier'))) + else: + var.get(u"this").callprop(u'parseExportSpecifiersMaybe', var.get(u'node')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node'), var.get(u'true')) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_default')): + var.put(u'expr', var.get(u"this").callprop(u'startNode')) + var.put(u'needsSemi', Js(False)) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_function')): + var.put(u'expr', var.get(u"this").callprop(u'parseFunction', var.get(u'expr'), var.get(u'true'), Js(False), Js(False), var.get(u'true'))) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')): + var.put(u'expr', var.get(u"this").callprop(u'parseClass', var.get(u'expr'), var.get(u'true'), var.get(u'true'))) + else: + var.put(u'needsSemi', var.get(u'true')) + var.put(u'expr', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u'node').put(u'declaration', var.get(u'expr')) + if var.get(u'needsSemi'): + var.get(u"this").callprop(u'semicolon') + var.get(u"this").callprop(u'checkExport', var.get(u'node'), var.get(u'true'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportDefaultDeclaration')) + else: + if (var.get(u"this").get(u'state').get(u'type').get(u'keyword') or var.get(u"this").callprop(u'shouldParseExportDeclaration')): + var.get(u'node').put(u'specifiers', Js([])) + var.get(u'node').put(u'source', var.get(u"null")) + var.get(u'node').put(u'declaration', var.get(u"this").callprop(u'parseExportDeclaration', var.get(u'node'))) + else: + var.get(u'node').put(u'declaration', var.get(u"null")) + var.get(u'node').put(u'specifiers', var.get(u"this").callprop(u'parseExportSpecifiers')) + var.get(u"this").callprop(u'parseExportFrom', var.get(u'node')) + var.get(u"this").callprop(u'checkExport', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportNamedDeclaration')) + PyJs_anonymous_3003_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExport', PyJs_anonymous_3003_) + @Js + def PyJs_anonymous_3004_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'parseStatement', var.get(u'true')) + PyJs_anonymous_3004_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportDeclaration', PyJs_anonymous_3004_) + @Js + def PyJs_anonymous_3005_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'lookahead']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + return ((PyJsStrictNeq(var.get(u"this").get(u'state').get(u'value'),Js(u'type')) and PyJsStrictNeq(var.get(u"this").get(u'state').get(u'value'),Js(u'async'))) and PyJsStrictNeq(var.get(u"this").get(u'state').get(u'value'),Js(u'interface'))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_default')).neg(): + return Js(False) + var.put(u'lookahead', var.get(u"this").callprop(u'lookahead')) + return (PyJsStrictEq(var.get(u'lookahead').get(u'type'),var.get(u'types').get(u'comma')) or (PyJsStrictEq(var.get(u'lookahead').get(u'type'),var.get(u'types').get(u'name')) and PyJsStrictEq(var.get(u'lookahead').get(u'value'),Js(u'from')))) + PyJs_anonymous_3005_._set_name(u'anonymous') + var.get(u'pp$1').put(u'isExportDefaultSpecifier', PyJs_anonymous_3005_) + @Js + def PyJs_anonymous_3006_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + var.get(u'node').put(u'specifiers', var.get(u'node').get(u'specifiers').callprop(u'concat', var.get(u"this").callprop(u'parseExportSpecifiers'))) + PyJs_anonymous_3006_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportSpecifiersMaybe', PyJs_anonymous_3006_) + @Js + def PyJs_anonymous_3007_(node, expect, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'expect':expect, u'arguments':arguments}, var) + var.registers([u'node', u'expect']) + if var.get(u"this").callprop(u'eatContextual', Js(u'from')): + var.get(u'node').put(u'source', (var.get(u"this").callprop(u'parseExprAtom') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')) else var.get(u"this").callprop(u'unexpected'))) + var.get(u"this").callprop(u'checkExport', var.get(u'node')) + else: + if var.get(u'expect'): + var.get(u"this").callprop(u'unexpected') + else: + var.get(u'node').put(u'source', var.get(u"null")) + var.get(u"this").callprop(u'semicolon') + PyJs_anonymous_3007_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportFrom', PyJs_anonymous_3007_) + @Js + def PyJs_anonymous_3008_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'isContextual', Js(u'async')) + PyJs_anonymous_3008_._set_name(u'anonymous') + var.get(u'pp$1').put(u'shouldParseExportDeclaration', PyJs_anonymous_3008_) + @Js + def PyJs_anonymous_3009_(node, checkNames, isDefault, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'checkNames':checkNames, u'arguments':arguments, u'isDefault':isDefault}, var) + var.registers([u'node', u'specifier', u'_isArray3', u'_isArray2', u'isClass', u'_ref3', u'_i3', u'_i2', u'_ref2', u'checkNames', u'isDefault', u'declaration', u'_iterator3', u'_iterator2']) + if var.get(u'checkNames'): + if var.get(u'isDefault'): + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'node'), Js(u'default')) + else: + if (var.get(u'node').get(u'specifiers') and var.get(u'node').get(u'specifiers').get(u'length')): + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'specifiers')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else var.get(u'_iterator2').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'specifier', var.get(u'_ref2')) + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'specifier'), var.get(u'specifier').get(u'exported').get(u'name')) + + else: + if var.get(u'node').get(u'declaration'): + if (PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'FunctionDeclaration')) or PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'ClassDeclaration'))): + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'node'), var.get(u'node').get(u'declaration').get(u'id').get(u'name')) + else: + if PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'VariableDeclaration')): + #for JS loop + var.put(u'_iterator3', var.get(u'node').get(u'declaration').get(u'declarations')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else var.get(u'_iterator3').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'declaration', var.get(u'_ref3')) + var.get(u"this").callprop(u'checkDeclaration', var.get(u'declaration').get(u'id')) + + if var.get(u"this").get(u'state').get(u'decorators').get(u'length'): + var.put(u'isClass', (var.get(u'node').get(u'declaration') and (PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'ClassDeclaration')) or PyJsStrictEq(var.get(u'node').get(u'declaration').get(u'type'),Js(u'ClassExpression'))))) + if (var.get(u'node').get(u'declaration').neg() or var.get(u'isClass').neg()): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'You can only use decorators on an export when exporting a class')) + var.get(u"this").callprop(u'takeDecorators', var.get(u'node').get(u'declaration')) + PyJs_anonymous_3009_._set_name(u'anonymous') + var.get(u'pp$1').put(u'checkExport', PyJs_anonymous_3009_) + @Js + def PyJs_anonymous_3010_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray5', u'_isArray4', u'_i5', u'_i4', u'elem', u'prop', u'_iterator5', u'_iterator4', u'_ref5', u'_ref4']) + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ObjectPattern')): + #for JS loop + var.put(u'_iterator4', var.get(u'node').get(u'properties')) + var.put(u'_isArray4', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator4'))) + var.put(u'_i4', Js(0.0)) + var.put(u'_iterator4', (var.get(u'_iterator4') if var.get(u'_isArray4') else var.get(u'_iterator4').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray4'): + if (var.get(u'_i4')>=var.get(u'_iterator4').get(u'length')): + break + var.put(u'_ref4', var.get(u'_iterator4').get((var.put(u'_i4',Js(var.get(u'_i4').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i4', var.get(u'_iterator4').callprop(u'next')) + if var.get(u'_i4').get(u'done'): + break + var.put(u'_ref4', var.get(u'_i4').get(u'value')) + var.put(u'prop', var.get(u'_ref4')) + var.get(u"this").callprop(u'checkDeclaration', var.get(u'prop')) + + else: + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ArrayPattern')): + #for JS loop + var.put(u'_iterator5', var.get(u'node').get(u'elements')) + var.put(u'_isArray5', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator5'))) + var.put(u'_i5', Js(0.0)) + var.put(u'_iterator5', (var.get(u'_iterator5') if var.get(u'_isArray5') else var.get(u'_iterator5').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray5'): + if (var.get(u'_i5')>=var.get(u'_iterator5').get(u'length')): + break + var.put(u'_ref5', var.get(u'_iterator5').get((var.put(u'_i5',Js(var.get(u'_i5').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i5', var.get(u'_iterator5').callprop(u'next')) + if var.get(u'_i5').get(u'done'): + break + var.put(u'_ref5', var.get(u'_i5').get(u'value')) + var.put(u'elem', var.get(u'_ref5')) + if var.get(u'elem'): + var.get(u"this").callprop(u'checkDeclaration', var.get(u'elem')) + + else: + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'ObjectProperty')): + var.get(u"this").callprop(u'checkDeclaration', var.get(u'node').get(u'value')) + else: + if (PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'RestElement')) or PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'RestProperty'))): + var.get(u"this").callprop(u'checkDeclaration', var.get(u'node').get(u'argument')) + else: + if PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'Identifier')): + var.get(u"this").callprop(u'checkDuplicateExports', var.get(u'node'), var.get(u'node').get(u'name')) + PyJs_anonymous_3010_._set_name(u'anonymous') + var.get(u'pp$1').put(u'checkDeclaration', PyJs_anonymous_3010_) + @Js + def PyJs_anonymous_3011_(node, name, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'name']) + if (var.get(u"this").get(u'state').get(u'exportedIdentifiers').callprop(u'indexOf', var.get(u'name'))>(-Js(1.0))): + var.get(u"this").callprop(u'raiseDuplicateExportError', var.get(u'node'), var.get(u'name')) + var.get(u"this").get(u'state').get(u'exportedIdentifiers').callprop(u'push', var.get(u'name')) + PyJs_anonymous_3011_._set_name(u'anonymous') + var.get(u'pp$1').put(u'checkDuplicateExports', PyJs_anonymous_3011_) + @Js + def PyJs_anonymous_3012_(node, name, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'name':name, u'arguments':arguments}, var) + var.registers([u'node', u'name']) + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), (Js(u'Only one default export allowed per module.') if PyJsStrictEq(var.get(u'name'),Js(u'default')) else ((Js(u'`')+var.get(u'name'))+Js(u'` has already been exported. Exported identifiers must be unique.')))) + PyJs_anonymous_3012_._set_name(u'anonymous') + var.get(u'pp$1').put(u'raiseDuplicateExportError', PyJs_anonymous_3012_) + @Js + def PyJs_anonymous_3013_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'nodes', u'isDefault', u'needsFrom', u'first']) + var.put(u'nodes', Js([])) + var.put(u'first', var.get(u'true')) + var.put(u'needsFrom', PyJsComma(Js(0.0), Js(None))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + var.put(u'isDefault', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_default'))) + if (var.get(u'isDefault') and var.get(u'needsFrom').neg()): + var.put(u'needsFrom', var.get(u'true')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'local', var.get(u"this").callprop(u'parseIdentifier', var.get(u'isDefault'))) + var.get(u'node').put(u'exported', (var.get(u"this").callprop(u'parseIdentifier', var.get(u'true')) if var.get(u"this").callprop(u'eatContextual', Js(u'as')) else var.get(u'node').get(u'local').callprop(u'__clone'))) + var.get(u'nodes').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ExportSpecifier'))) + if (var.get(u'needsFrom') and var.get(u"this").callprop(u'isContextual', Js(u'from')).neg()): + var.get(u"this").callprop(u'unexpected') + return var.get(u'nodes') + PyJs_anonymous_3013_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseExportSpecifiers', PyJs_anonymous_3013_) + @Js + def PyJs_anonymous_3014_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')): + var.get(u'node').put(u'specifiers', Js([])) + var.get(u'node').put(u'source', var.get(u"this").callprop(u'parseExprAtom')) + else: + var.get(u'node').put(u'specifiers', Js([])) + var.get(u"this").callprop(u'parseImportSpecifiers', var.get(u'node')) + var.get(u"this").callprop(u'expectContextual', Js(u'from')) + var.get(u'node').put(u'source', (var.get(u"this").callprop(u'parseExprAtom') if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')) else var.get(u"this").callprop(u'unexpected'))) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ImportDeclaration')) + PyJs_anonymous_3014_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseImport', PyJs_anonymous_3014_) + @Js + def PyJs_anonymous_3015_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'specifier', u'startLoc', u'_specifier3', u'startPos', u'first']) + var.put(u'first', var.get(u'true')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'parseImportSpecifierDefault', var.get(u"this").callprop(u'parseIdentifier'), var.get(u'startPos'), var.get(u'startLoc'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')).neg(): + return var.get('undefined') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + var.put(u'specifier', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'expectContextual', Js(u'as')) + var.get(u'specifier').put(u'local', var.get(u"this").callprop(u'parseIdentifier')) + var.get(u"this").callprop(u'checkLVal', var.get(u'specifier').get(u'local'), var.get(u'true'), var.get(u'undefined'), Js(u'import namespace specifier')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'specifier'), Js(u'ImportNamespaceSpecifier'))) + return var.get('undefined') + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + var.put(u'_specifier3', var.get(u"this").callprop(u'startNode')) + var.get(u'_specifier3').put(u'imported', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + var.get(u'_specifier3').put(u'local', (var.get(u"this").callprop(u'parseIdentifier') if var.get(u"this").callprop(u'eatContextual', Js(u'as')) else var.get(u'_specifier3').get(u'imported').callprop(u'__clone'))) + var.get(u"this").callprop(u'checkLVal', var.get(u'_specifier3').get(u'local'), var.get(u'true'), var.get(u'undefined'), Js(u'import specifier')) + var.get(u'node').get(u'specifiers').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'_specifier3'), Js(u'ImportSpecifier'))) + PyJs_anonymous_3015_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseImportSpecifiers', PyJs_anonymous_3015_) + @Js + def PyJs_anonymous_3016_(id, startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'id':id, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'id', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'local', var.get(u'id')) + var.get(u"this").callprop(u'checkLVal', var.get(u'node').get(u'local'), var.get(u'true'), var.get(u'undefined'), Js(u'default import specifier')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ImportDefaultSpecifier')) + PyJs_anonymous_3016_._set_name(u'anonymous') + var.get(u'pp$1').put(u'parseImportSpecifierDefault', PyJs_anonymous_3016_) + var.put(u'pp$2', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3017_(node, isBinding, contextDescription, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isBinding':isBinding, u'arguments':arguments, u'contextDescription':contextDescription}, var) + var.registers([u'node', u'_isArray', u'_iterator', u'isBinding', u'prop', u'_i', u'message', u'contextDescription', u'_ref']) + if var.get(u'node'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectPattern')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayPattern')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentPattern')): + SWITCHED = True + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectExpression')): + SWITCHED = True + var.get(u'node').put(u'type', Js(u'ObjectPattern')) + #for JS loop + var.put(u'_iterator', var.get(u'node').get(u'properties')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'prop', var.get(u'_ref')) + if PyJsStrictEq(var.get(u'prop').get(u'type'),Js(u'ObjectMethod')): + if (PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'set'))): + var.get(u"this").callprop(u'raise', var.get(u'prop').get(u'key').get(u'start'), Js(u"Object pattern can't contain getter or setter")) + else: + var.get(u"this").callprop(u'raise', var.get(u'prop').get(u'key').get(u'start'), Js(u"Object pattern can't contain methods")) + else: + var.get(u"this").callprop(u'toAssignable', var.get(u'prop'), var.get(u'isBinding'), Js(u'object destructuring pattern')) + + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectProperty')): + SWITCHED = True + var.get(u"this").callprop(u'toAssignable', var.get(u'node').get(u'value'), var.get(u'isBinding'), var.get(u'contextDescription')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SpreadProperty')): + SWITCHED = True + var.get(u'node').put(u'type', Js(u'RestProperty')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayExpression')): + SWITCHED = True + var.get(u'node').put(u'type', Js(u'ArrayPattern')) + var.get(u"this").callprop(u'toAssignableList', var.get(u'node').get(u'elements'), var.get(u'isBinding'), var.get(u'contextDescription')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + if PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'=')): + var.get(u'node').put(u'type', Js(u'AssignmentPattern')) + var.get(u'node').delete(u'operator') + else: + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'left').get(u'end'), Js(u"Only '=' operator can be used for specifying default value.")) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + if var.get(u'isBinding').neg(): + break + if True: + SWITCHED = True + var.put(u'message', (Js(u'Invalid left-hand side')+((Js(u' in ')+var.get(u'contextDescription')) if var.get(u'contextDescription') else Js(u'expression')))) + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), var.get(u'message')) + SWITCHED = True + break + return var.get(u'node') + PyJs_anonymous_3017_._set_name(u'anonymous') + var.get(u'pp$2').put(u'toAssignable', PyJs_anonymous_3017_) + @Js + def PyJs_anonymous_3018_(exprList, isBinding, contextDescription, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'isBinding':isBinding, u'exprList':exprList, u'contextDescription':contextDescription}, var) + var.registers([u'last', u'i', u'isBinding', u'contextDescription', u'arg', u'end', u'exprList', u'elt']) + var.put(u'end', var.get(u'exprList').get(u'length')) + if var.get(u'end'): + var.put(u'last', var.get(u'exprList').get((var.get(u'end')-Js(1.0)))) + if (var.get(u'last') and PyJsStrictEq(var.get(u'last').get(u'type'),Js(u'RestElement'))): + var.put(u'end',Js(var.get(u'end').to_number())-Js(1)) + else: + if (var.get(u'last') and PyJsStrictEq(var.get(u'last').get(u'type'),Js(u'SpreadElement'))): + var.get(u'last').put(u'type', Js(u'RestElement')) + var.put(u'arg', var.get(u'last').get(u'argument')) + var.get(u"this").callprop(u'toAssignable', var.get(u'arg'), var.get(u'isBinding'), var.get(u'contextDescription')) + if ((PyJsStrictNeq(var.get(u'arg').get(u'type'),Js(u'Identifier')) and PyJsStrictNeq(var.get(u'arg').get(u'type'),Js(u'MemberExpression'))) and PyJsStrictNeq(var.get(u'arg').get(u'type'),Js(u'ArrayPattern'))): + var.get(u"this").callprop(u'unexpected', var.get(u'arg').get(u'start')) + var.put(u'end',Js(var.get(u'end').to_number())-Js(1)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'prop', var.get(u'_ref2')) + if PyJsStrictEq(var.get(u'prop').get(u'type'),Js(u'ObjectProperty')): + var.put(u'prop', var.get(u'prop').get(u'value')) + var.get(u"this").callprop(u'checkLVal', var.get(u'prop'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'object destructuring pattern')) + + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayPattern')): + SWITCHED = True + #for JS loop + var.put(u'_iterator3', var.get(u'expr').get(u'elements')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else var.get(u'_iterator3').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'elem', var.get(u'_ref3')) + if var.get(u'elem'): + var.get(u"this").callprop(u'checkLVal', var.get(u'elem'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'array destructuring pattern')) + + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentPattern')): + SWITCHED = True + var.get(u"this").callprop(u'checkLVal', var.get(u'expr').get(u'left'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'assignment pattern')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'RestProperty')): + SWITCHED = True + var.get(u"this").callprop(u'checkLVal', var.get(u'expr').get(u'argument'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'rest property')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'RestElement')): + SWITCHED = True + var.get(u"this").callprop(u'checkLVal', var.get(u'expr').get(u'argument'), var.get(u'isBinding'), var.get(u'checkClashes'), Js(u'rest element')) + break + if True: + SWITCHED = True + var.put(u'message', (((Js(u'Binding invalid') if var.get(u'isBinding') else Js(u'Invalid'))+Js(u' left-hand side'))+((Js(u' in ')+var.get(u'contextDescription')) if var.get(u'contextDescription') else Js(u'expression')))) + var.get(u"this").callprop(u'raise', var.get(u'expr').get(u'start'), var.get(u'message')) + SWITCHED = True + break + PyJs_anonymous_3028_._set_name(u'anonymous') + var.get(u'pp$2').put(u'checkLVal', PyJs_anonymous_3028_) + var.put(u'pp$3', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3029_(prop, propHash, this, arguments, var=var): + var = Scope({u'this':this, u'propHash':propHash, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'propHash', u'name', u'key', u'prop']) + if var.get(u'prop').get(u'computed'): + return var.get('undefined') + var.put(u'key', var.get(u'prop').get(u'key')) + var.put(u'name', PyJsComma(Js(0.0), Js(None))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'key').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + var.put(u'name', var.get(u'key').get(u'name')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'StringLiteral')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'NumericLiteral')): + SWITCHED = True + var.put(u'name', var.get(u'String')(var.get(u'key').get(u'value'))) + break + if True: + SWITCHED = True + return var.get('undefined') + SWITCHED = True + break + if (PyJsStrictEq(var.get(u'name'),Js(u'__proto__')) and var.get(u'prop').get(u'kind').neg()): + if var.get(u'propHash').get(u'proto'): + var.get(u"this").callprop(u'raise', var.get(u'key').get(u'start'), Js(u'Redefinition of __proto__ property')) + var.get(u'propHash').put(u'proto', var.get(u'true')) + PyJs_anonymous_3029_._set_name(u'anonymous') + var.get(u'pp$3').put(u'checkPropClash', PyJs_anonymous_3029_) + @Js + def PyJs_anonymous_3030_(noIn, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'noIn':noIn, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'expr', u'refShorthandDefaultPos', u'startLoc', u'noIn', u'startPos']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'expressions', Js([var.get(u'expr')])) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + var.get(u'node').get(u'expressions').callprop(u'push', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'))) + var.get(u"this").callprop(u'toReferencedList', var.get(u'node').get(u'expressions')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'SequenceExpression')) + return var.get(u'expr') + PyJs_anonymous_3030_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExpression', PyJs_anonymous_3030_) + @Js + def PyJs_anonymous_3031_(noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos, this, arguments, var=var): + var = Scope({u'afterLeftParse':afterLeftParse, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'noIn':noIn, u'arguments':arguments, u'refNeedsArrowPos':refNeedsArrowPos}, var) + var.registers([u'node', u'afterLeftParse', u'startLoc', u'errorMsg', u'refNeedsArrowPos', u'refShorthandDefaultPos', u'failOnShorthandAssign', u'noIn', u'startPos', u'_left', u'left']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'_yield')) and var.get(u"this").get(u'state').get(u'inGenerator')): + var.put(u'_left', var.get(u"this").callprop(u'parseYield')) + if var.get(u'afterLeftParse'): + var.put(u'_left', var.get(u'afterLeftParse').callprop(u'call', var.get(u"this"), var.get(u'_left'), var.get(u'startPos'), var.get(u'startLoc'))) + return var.get(u'_left') + var.put(u'failOnShorthandAssign', PyJsComma(Js(0.0), Js(None))) + if var.get(u'refShorthandDefaultPos'): + var.put(u'failOnShorthandAssign', Js(False)) + else: + PyJs_Object_3032_ = Js({u'start':Js(0.0)}) + var.put(u'refShorthandDefaultPos', PyJs_Object_3032_) + var.put(u'failOnShorthandAssign', var.get(u'true')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))): + var.get(u"this").get(u'state').put(u'potentialArrowAt', var.get(u"this").get(u'state').get(u'start')) + var.put(u'left', var.get(u"this").callprop(u'parseMaybeConditional', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'), var.get(u'refNeedsArrowPos'))) + if var.get(u'afterLeftParse'): + var.put(u'left', var.get(u'afterLeftParse').callprop(u'call', var.get(u"this"), var.get(u'left'), var.get(u'startPos'), var.get(u'startLoc'))) + if var.get(u"this").get(u'state').get(u'type').get(u'isAssign'): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + var.get(u'node').put(u'left', (var.get(u"this").callprop(u'toAssignable', var.get(u'left'), var.get(u'undefined'), Js(u'assignment expression')) if var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')) else var.get(u'left'))) + var.get(u'refShorthandDefaultPos').put(u'start', Js(0.0)) + var.get(u"this").callprop(u'checkLVal', var.get(u'left'), var.get(u'undefined'), var.get(u'undefined'), Js(u'assignment expression')) + if (var.get(u'left').get(u'extra') and var.get(u'left').get(u'extra').get(u'parenthesized')): + var.put(u'errorMsg', PyJsComma(Js(0.0), Js(None))) + if PyJsStrictEq(var.get(u'left').get(u'type'),Js(u'ObjectPattern')): + var.put(u'errorMsg', Js(u'`({a}) = 0` use `({a} = 0)`')) + else: + if PyJsStrictEq(var.get(u'left').get(u'type'),Js(u'ArrayPattern')): + var.put(u'errorMsg', Js(u'`([a]) = 0` use `([a] = 0)`')) + if var.get(u'errorMsg'): + var.get(u"this").callprop(u'raise', var.get(u'left').get(u'start'), (Js(u"You're trying to assign to a parenthesized expression, eg. instead of ")+var.get(u'errorMsg'))) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'AssignmentExpression')) + else: + if (var.get(u'failOnShorthandAssign') and var.get(u'refShorthandDefaultPos').get(u'start')): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + return var.get(u'left') + PyJs_anonymous_3031_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMaybeAssign', PyJs_anonymous_3031_) + @Js + def PyJs_anonymous_3033_(noIn, refShorthandDefaultPos, refNeedsArrowPos, this, arguments, var=var): + var = Scope({u'noIn':noIn, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments, u'refNeedsArrowPos':refNeedsArrowPos}, var) + var.registers([u'expr', u'refShorthandDefaultPos', u'startLoc', u'noIn', u'startPos', u'refNeedsArrowPos']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseExprOps', var.get(u'noIn'), var.get(u'refShorthandDefaultPos'))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + return var.get(u"this").callprop(u'parseConditional', var.get(u'expr'), var.get(u'noIn'), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'refNeedsArrowPos')) + PyJs_anonymous_3033_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMaybeConditional', PyJs_anonymous_3033_) + @Js + def PyJs_anonymous_3034_(expr, noIn, startPos, startLoc, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'startLoc':startLoc, u'noIn':noIn, u'expr':expr, u'startPos':startPos}, var) + var.registers([u'node', u'expr', u'startPos', u'noIn', u'startLoc']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'test', var.get(u'expr')) + var.get(u'node').put(u'consequent', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'colon')) + var.get(u'node').put(u'alternate', var.get(u"this").callprop(u'parseMaybeAssign', var.get(u'noIn'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ConditionalExpression')) + return var.get(u'expr') + PyJs_anonymous_3034_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseConditional', PyJs_anonymous_3034_) + @Js + def PyJs_anonymous_3035_(noIn, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'noIn':noIn, u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'noIn', u'expr', u'startPos', u'refShorthandDefaultPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseMaybeUnary', var.get(u'refShorthandDefaultPos'))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + else: + return var.get(u"this").callprop(u'parseExprOp', var.get(u'expr'), var.get(u'startPos'), var.get(u'startLoc'), (-Js(1.0)), var.get(u'noIn')) + PyJs_anonymous_3035_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprOps', PyJs_anonymous_3035_) + @Js + def PyJs_anonymous_3036_(left, leftStartPos, leftStartLoc, minPrec, noIn, this, arguments, var=var): + var = Scope({u'minPrec':minPrec, u'arguments':arguments, u'noIn':noIn, u'leftStartLoc':leftStartLoc, u'this':this, u'leftStartPos':leftStartPos, u'left':left}, var) + var.registers([u'node', u'minPrec', u'leftStartPos', u'prec', u'startLoc', u'noIn', u'leftStartLoc', u'startPos', u'op', u'left']) + var.put(u'prec', var.get(u"this").get(u'state').get(u'type').get(u'binop')) + if ((var.get(u'prec')!=var.get(u"null")) and (var.get(u'noIn').neg() or var.get(u"this").callprop(u'match', var.get(u'types').get(u'_in')).neg())): + if (var.get(u'prec')>var.get(u'minPrec')): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'leftStartPos'), var.get(u'leftStartLoc'))) + var.get(u'node').put(u'left', var.get(u'left')) + var.get(u'node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + if ((((PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'**')) and PyJsStrictEq(var.get(u'left').get(u'type'),Js(u'UnaryExpression'))) and var.get(u'left').get(u'extra')) and var.get(u'left').get(u'extra').get(u'parenthesizedArgument').neg()) and var.get(u'left').get(u'extra').get(u'parenthesized').neg()): + var.get(u"this").callprop(u'raise', var.get(u'left').get(u'argument').get(u'start'), Js(u'Illegal expression. Wrap left hand side or entire exponentiation in parentheses.')) + var.put(u'op', var.get(u"this").get(u'state').get(u'type')) + var.get(u"this").callprop(u'next') + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'parseExprOp', var.get(u"this").callprop(u'parseMaybeUnary'), var.get(u'startPos'), var.get(u'startLoc'), ((var.get(u'prec')-Js(1.0)) if var.get(u'op').get(u'rightAssociative') else var.get(u'prec')), var.get(u'noIn'))) + var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'LogicalExpression') if (PyJsStrictEq(var.get(u'op'),var.get(u'types').get(u'logicalOR')) or PyJsStrictEq(var.get(u'op'),var.get(u'types').get(u'logicalAND'))) else Js(u'BinaryExpression'))) + return var.get(u"this").callprop(u'parseExprOp', var.get(u'node'), var.get(u'leftStartPos'), var.get(u'leftStartLoc'), var.get(u'minPrec'), var.get(u'noIn')) + return var.get(u'left') + PyJs_anonymous_3036_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprOp', PyJs_anonymous_3036_) + @Js + def PyJs_anonymous_3037_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'expr', u'update', u'_node', u'refShorthandDefaultPos', u'startLoc', u'startPos', u'argType']) + if var.get(u"this").get(u'state').get(u'type').get(u'prefix'): + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'update', var.get(u"this").callprop(u'match', var.get(u'types').get(u'incDec'))) + var.get(u'node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + var.get(u'node').put(u'prefix', var.get(u'true')) + var.get(u"this").callprop(u'next') + var.put(u'argType', var.get(u"this").get(u'state').get(u'type')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeUnary')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'parenthesizedArgument'), (PyJsStrictEq(var.get(u'argType'),var.get(u'types').get(u'parenL')) and (var.get(u'node').get(u'argument').get(u'extra').neg() or var.get(u'node').get(u'argument').get(u'extra').get(u'parenthesized').neg()))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + if var.get(u'update'): + var.get(u"this").callprop(u'checkLVal', var.get(u'node').get(u'argument'), var.get(u'undefined'), var.get(u'undefined'), Js(u'prefix operation')) + else: + if ((var.get(u"this").get(u'state').get(u'strict') and PyJsStrictEq(var.get(u'node').get(u'operator'),Js(u'delete'))) and PyJsStrictEq(var.get(u'node').get(u'argument').get(u'type'),Js(u'Identifier'))): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'Deleting local variable in strict mode')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'UpdateExpression') if var.get(u'update') else Js(u'UnaryExpression'))) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'expr', var.get(u"this").callprop(u'parseExprSubscripts', var.get(u'refShorthandDefaultPos'))) + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + while (var.get(u"this").get(u'state').get(u'type').get(u'postfix') and var.get(u"this").callprop(u'canInsertSemicolon').neg()): + var.put(u'_node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node').put(u'operator', var.get(u"this").get(u'state').get(u'value')) + var.get(u'_node').put(u'prefix', Js(False)) + var.get(u'_node').put(u'argument', var.get(u'expr')) + var.get(u"this").callprop(u'checkLVal', var.get(u'expr'), var.get(u'undefined'), var.get(u'undefined'), Js(u'postfix operation')) + var.get(u"this").callprop(u'next') + var.put(u'expr', var.get(u"this").callprop(u'finishNode', var.get(u'_node'), Js(u'UpdateExpression'))) + return var.get(u'expr') + PyJs_anonymous_3037_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMaybeUnary', PyJs_anonymous_3037_) + @Js + def PyJs_anonymous_3038_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'expr', u'startPos', u'potentialArrowAt', u'startLoc', u'refShorthandDefaultPos']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'potentialArrowAt', var.get(u"this").get(u'state').get(u'potentialArrowAt')) + var.put(u'expr', var.get(u"this").callprop(u'parseExprAtom', var.get(u'refShorthandDefaultPos'))) + if (PyJsStrictEq(var.get(u'expr').get(u'type'),Js(u'ArrowFunctionExpression')) and PyJsStrictEq(var.get(u'expr').get(u'start'),var.get(u'potentialArrowAt'))): + return var.get(u'expr') + if (var.get(u'refShorthandDefaultPos') and var.get(u'refShorthandDefaultPos').get(u'start')): + return var.get(u'expr') + return var.get(u"this").callprop(u'parseSubscripts', var.get(u'expr'), var.get(u'startPos'), var.get(u'startLoc')) + PyJs_anonymous_3038_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprSubscripts', PyJs_anonymous_3038_) + @Js + def PyJs_anonymous_3039_(base, startPos, startLoc, noCalls, this, arguments, var=var): + var = Scope({u'base':base, u'arguments':arguments, u'startLoc':startLoc, u'this':this, u'startPos':startPos, u'noCalls':noCalls}, var) + var.registers([u'node', u'startLoc', u'possibleAsync', u'_node3', u'_node2', u'base', u'_node5', u'_node4', u'startPos', u'noCalls']) + #for JS loop + + while 1: + if (var.get(u'noCalls').neg() and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'doubleColon'))): + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'object', var.get(u'base')) + var.get(u'node').put(u'callee', var.get(u"this").callprop(u'parseNoCallExpr')) + return var.get(u"this").callprop(u'parseSubscripts', var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BindExpression')), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'noCalls')) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + var.put(u'_node2', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node2').put(u'object', var.get(u'base')) + var.get(u'_node2').put(u'property', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + var.get(u'_node2').put(u'computed', Js(False)) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node2'), Js(u'MemberExpression'))) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'bracketL')): + var.put(u'_node3', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node3').put(u'object', var.get(u'base')) + var.get(u'_node3').put(u'property', var.get(u"this").callprop(u'parseExpression')) + var.get(u'_node3').put(u'computed', var.get(u'true')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node3'), Js(u'MemberExpression'))) + else: + if (var.get(u'noCalls').neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))): + var.put(u'possibleAsync', (((PyJsStrictEq(var.get(u"this").get(u'state').get(u'potentialArrowAt'),var.get(u'base').get(u'start')) and PyJsStrictEq(var.get(u'base').get(u'type'),Js(u'Identifier'))) and PyJsStrictEq(var.get(u'base').get(u'name'),Js(u'async'))) and var.get(u"this").callprop(u'canInsertSemicolon').neg())) + var.get(u"this").callprop(u'next') + var.put(u'_node4', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node4').put(u'callee', var.get(u'base')) + var.get(u'_node4').put(u'arguments', var.get(u"this").callprop(u'parseCallExpressionArguments', var.get(u'types').get(u'parenR'), var.get(u'possibleAsync'))) + if (PyJsStrictEq(var.get(u'_node4').get(u'callee').get(u'type'),Js(u'Import')) and PyJsStrictNeq(var.get(u'_node4').get(u'arguments').get(u'length'),Js(1.0))): + var.get(u"this").callprop(u'raise', var.get(u'_node4').get(u'start'), Js(u'import() requires exactly one argument')) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node4'), Js(u'CallExpression'))) + if (var.get(u'possibleAsync') and var.get(u"this").callprop(u'shouldParseAsyncArrow')): + return var.get(u"this").callprop(u'parseAsyncArrowFromCallExpression', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc')), var.get(u'_node4')) + else: + var.get(u"this").callprop(u'toReferencedList', var.get(u'_node4').get(u'arguments')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'backQuote')): + var.put(u'_node5', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'_node5').put(u'tag', var.get(u'base')) + var.get(u'_node5').put(u'quasi', var.get(u"this").callprop(u'parseTemplate')) + var.put(u'base', var.get(u"this").callprop(u'finishNode', var.get(u'_node5'), Js(u'TaggedTemplateExpression'))) + else: + return var.get(u'base') + + PyJs_anonymous_3039_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseSubscripts', PyJs_anonymous_3039_) + @Js + def PyJs_anonymous_3040_(close, possibleAsyncArrow, this, arguments, var=var): + var = Scope({u'this':this, u'close':close, u'possibleAsyncArrow':possibleAsyncArrow, u'arguments':arguments}, var) + var.registers([u'elts', u'close', u'first', u'possibleAsyncArrow', u'innerParenStart']) + var.put(u'innerParenStart', PyJsComma(Js(0.0), Js(None))) + var.put(u'elts', Js([])) + var.put(u'first', var.get(u'true')) + while var.get(u"this").callprop(u'eat', var.get(u'close')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'close')): + break + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) and var.get(u'innerParenStart').neg()): + var.put(u'innerParenStart', var.get(u"this").get(u'state').get(u'start')) + PyJs_Object_3041_ = Js({u'start':Js(0.0)}) + var.get(u'elts').callprop(u'push', var.get(u"this").callprop(u'parseExprListItem', var.get(u'undefined'), (PyJs_Object_3041_ if var.get(u'possibleAsyncArrow') else var.get(u'undefined')))) + if ((var.get(u'possibleAsyncArrow') and var.get(u'innerParenStart')) and var.get(u"this").callprop(u'shouldParseAsyncArrow')): + var.get(u"this").callprop(u'unexpected') + return var.get(u'elts') + PyJs_anonymous_3040_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseCallExpressionArguments', PyJs_anonymous_3040_) + @Js + def PyJs_anonymous_3042_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'match', var.get(u'types').get(u'arrow')) + PyJs_anonymous_3042_._set_name(u'anonymous') + var.get(u'pp$3').put(u'shouldParseAsyncArrow', PyJs_anonymous_3042_) + @Js + def PyJs_anonymous_3043_(node, call, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'call':call, u'arguments':arguments}, var) + var.registers([u'node', u'call']) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'arrow')) + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'node'), var.get(u'call').get(u'arguments'), var.get(u'true')) + PyJs_anonymous_3043_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseAsyncArrowFromCallExpression', PyJs_anonymous_3043_) + @Js + def PyJs_anonymous_3044_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'startPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + return var.get(u"this").callprop(u'parseSubscripts', var.get(u"this").callprop(u'parseExprAtom'), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'true')) + PyJs_anonymous_3044_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseNoCallExpr', PyJs_anonymous_3044_) + @Js + def PyJs_anonymous_3045_(refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'oldLabels', u'allowAwait', u'oldInFunction', u'allowYield', u'value', u'params', u'_node6', u'callee', u'id', u'canBeArrow', u'refShorthandDefaultPos']) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + var.put(u'canBeArrow', PyJsStrictEq(var.get(u"this").get(u'state').get(u'potentialArrowAt'),var.get(u"this").get(u'state').get(u'start'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u"this").get(u'state').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_super')): + SWITCHED = True + if (var.get(u"this").get(u'state').get(u'inMethod').neg() and var.get(u"this").get(u'options').get(u'allowSuperOutsideMethod').neg()): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u"'super' outside of function or class")) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg() and var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketL')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'dot')).neg()): + var.get(u"this").callprop(u'unexpected') + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) and PyJsStrictNeq(var.get(u"this").get(u'state').get(u'inMethod'),Js(u'constructor'))) and var.get(u"this").get(u'options').get(u'allowSuperOutsideMethod').neg()): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'super() outside of class constructor')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Super')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_import')): + SWITCHED = True + if var.get(u"this").callprop(u'hasPlugin', Js(u'dynamicImport')).neg(): + var.get(u"this").callprop(u'unexpected') + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')).neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"null"), var.get(u'types').get(u'parenL')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Import')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_this')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ThisExpression')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_yield')): + SWITCHED = True + if var.get(u"this").get(u'state').get(u'inGenerator'): + var.get(u"this").callprop(u'unexpected') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'name')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'allowAwait', (PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'await')) and var.get(u"this").get(u'state').get(u'inAsync'))) + var.put(u'allowYield', var.get(u"this").callprop(u'shouldAllowYieldIdentifier')) + var.put(u'id', var.get(u"this").callprop(u'parseIdentifier', (var.get(u'allowAwait') or var.get(u'allowYield')))) + if PyJsStrictEq(var.get(u'id').get(u'name'),Js(u'await')): + if (var.get(u"this").get(u'state').get(u'inAsync') or var.get(u"this").get(u'inModule')): + return var.get(u"this").callprop(u'parseAwait', var.get(u'node')) + else: + if ((PyJsStrictEq(var.get(u'id').get(u'name'),Js(u'async')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function'))) and var.get(u"this").callprop(u'canInsertSemicolon').neg()): + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), Js(False), Js(False), var.get(u'true')) + else: + if ((var.get(u'canBeArrow') and PyJsStrictEq(var.get(u'id').get(u'name'),Js(u'async'))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'name'))): + var.put(u'params', Js([var.get(u"this").callprop(u'parseIdentifier')])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'arrow')) + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'node'), var.get(u'params'), var.get(u'true')) + if ((var.get(u'canBeArrow') and var.get(u"this").callprop(u'canInsertSemicolon').neg()) and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'arrow'))): + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'node'), Js([var.get(u'id')])) + return var.get(u'id') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_do')): + SWITCHED = True + if var.get(u"this").callprop(u'hasPlugin', Js(u'doExpressions')): + var.put(u'_node6', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.put(u'oldInFunction', var.get(u"this").get(u'state').get(u'inFunction')) + var.put(u'oldLabels', var.get(u"this").get(u'state').get(u'labels')) + var.get(u"this").get(u'state').put(u'labels', Js([])) + var.get(u"this").get(u'state').put(u'inFunction', Js(False)) + var.get(u'_node6').put(u'body', var.get(u"this").callprop(u'parseBlock', Js(False), var.get(u'true'))) + var.get(u"this").get(u'state').put(u'inFunction', var.get(u'oldInFunction')) + var.get(u"this").get(u'state').put(u'labels', var.get(u'oldLabels')) + return var.get(u"this").callprop(u'finishNode', var.get(u'_node6'), Js(u'DoExpression')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'regexp')): + SWITCHED = True + var.put(u'value', var.get(u"this").get(u'state').get(u'value')) + var.put(u'node', var.get(u"this").callprop(u'parseLiteral', var.get(u'value').get(u'value'), Js(u'RegExpLiteral'))) + var.get(u'node').put(u'pattern', var.get(u'value').get(u'pattern')) + var.get(u'node').put(u'flags', var.get(u'value').get(u'flags')) + return var.get(u'node') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'num')): + SWITCHED = True + return var.get(u"this").callprop(u'parseLiteral', var.get(u"this").get(u'state').get(u'value'), Js(u'NumericLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'string')): + SWITCHED = True + return var.get(u"this").callprop(u'parseLiteral', var.get(u"this").get(u'state').get(u'value'), Js(u'StringLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_null')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NullLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_true')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_false')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'match', var.get(u'types').get(u'_true'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BooleanLiteral')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'parenL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseParenAndDistinguishExpression', var.get(u"null"), var.get(u"null"), var.get(u'canBeArrow')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'bracketL')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'elements', var.get(u"this").callprop(u'parseExprList', var.get(u'types').get(u'bracketR'), var.get(u'true'), var.get(u'refShorthandDefaultPos'))) + var.get(u"this").callprop(u'toReferencedList', var.get(u'node').get(u'elements')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ArrayExpression')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'braceL')): + SWITCHED = True + return var.get(u"this").callprop(u'parseObj', Js(False), var.get(u'refShorthandDefaultPos')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_function')): + SWITCHED = True + return var.get(u"this").callprop(u'parseFunctionExpression') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'at')): + SWITCHED = True + var.get(u"this").callprop(u'parseDecorators') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_class')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'takeDecorators', var.get(u'node')) + return var.get(u"this").callprop(u'parseClass', var.get(u'node'), Js(False)) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'_new')): + SWITCHED = True + return var.get(u"this").callprop(u'parseNew') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'backQuote')): + SWITCHED = True + return var.get(u"this").callprop(u'parseTemplate') + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'types').get(u'doubleColon')): + SWITCHED = True + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'object', var.get(u"null")) + var.put(u'callee', var.get(u'node').put(u'callee', var.get(u"this").callprop(u'parseNoCallExpr'))) + if PyJsStrictEq(var.get(u'callee').get(u'type'),Js(u'MemberExpression')): + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'BindExpression')) + else: + var.get(u"this").callprop(u'raise', var.get(u'callee').get(u'start'), Js(u'Binding should be performed on object property.')) + if True: + SWITCHED = True + var.get(u"this").callprop(u'unexpected') + SWITCHED = True + break + PyJs_anonymous_3045_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprAtom', PyJs_anonymous_3045_) + @Js + def PyJs_anonymous_3046_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'meta']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'meta', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + if ((var.get(u"this").get(u'state').get(u'inGenerator') and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot'))) and var.get(u"this").callprop(u'hasPlugin', Js(u'functionSent'))): + return var.get(u"this").callprop(u'parseMetaProperty', var.get(u'node'), var.get(u'meta'), Js(u'sent')) + else: + return var.get(u"this").callprop(u'parseFunction', var.get(u'node'), Js(False)) + PyJs_anonymous_3046_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseFunctionExpression', PyJs_anonymous_3046_) + @Js + def PyJs_anonymous_3047_(node, meta, propertyName, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'propertyName':propertyName, u'meta':meta, u'arguments':arguments}, var) + var.registers([u'node', u'propertyName', u'meta']) + var.get(u'node').put(u'meta', var.get(u'meta')) + var.get(u'node').put(u'property', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + if PyJsStrictNeq(var.get(u'node').get(u'property').get(u'name'),var.get(u'propertyName')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'property').get(u'start'), (((Js(u'The only valid meta property for new is ')+var.get(u'meta').get(u'name'))+Js(u'.'))+var.get(u'propertyName'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'MetaProperty')) + PyJs_anonymous_3047_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMetaProperty', PyJs_anonymous_3047_) + @Js + def PyJs_anonymous_3048_(value, type, this, arguments, var=var): + var = Scope({u'this':this, u'type':type, u'arguments':arguments, u'value':value}, var) + var.registers([u'node', u'type', u'value']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'rawValue'), var.get(u'value')) + var.get(u"this").callprop(u'addExtra', var.get(u'node'), Js(u'raw'), var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end'))) + var.get(u'node').put(u'value', var.get(u'value')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), var.get(u'type')) + PyJs_anonymous_3048_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseLiteral', PyJs_anonymous_3048_) + @Js + def PyJs_anonymous_3049_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'val']) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'val', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + return var.get(u'val') + PyJs_anonymous_3049_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseParenExpression', PyJs_anonymous_3049_) + @Js + def PyJs_anonymous_3050_(startPos, startLoc, canBeArrow, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'canBeArrow':canBeArrow, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'innerStartLoc', u'optionalCommaStart', u'_ref', u'startPos', u'arrowNode', u'_iterator', u'val', u'param', u'innerStartPos', u'spreadNodeStartPos', u'refShorthandDefaultPos', u'_i', u'spreadStart', u'exprList', u'canBeArrow', u'innerEndPos', u'spreadNodeStartLoc', u'refNeedsArrowPos', u'_isArray', u'innerEndLoc', u'startLoc', u'first']) + var.put(u'startPos', (var.get(u'startPos') or var.get(u"this").get(u'state').get(u'start'))) + var.put(u'startLoc', (var.get(u'startLoc') or var.get(u"this").get(u'state').get(u'startLoc'))) + var.put(u'val', PyJsComma(Js(0.0), Js(None))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'innerStartPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'innerStartLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'exprList', Js([])) + var.put(u'first', var.get(u'true')) + PyJs_Object_3051_ = Js({u'start':Js(0.0)}) + var.put(u'refShorthandDefaultPos', PyJs_Object_3051_) + var.put(u'spreadStart', PyJsComma(Js(0.0), Js(None))) + var.put(u'optionalCommaStart', PyJsComma(Js(0.0), Js(None))) + PyJs_Object_3052_ = Js({u'start':Js(0.0)}) + var.put(u'refNeedsArrowPos', PyJs_Object_3052_) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma'), (var.get(u'refNeedsArrowPos').get(u'start') or var.get(u"null"))) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')): + var.put(u'optionalCommaStart', var.get(u"this").get(u'state').get(u'start')) + break + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis')): + var.put(u'spreadNodeStartPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'spreadNodeStartLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'spreadStart', var.get(u"this").get(u'state').get(u'start')) + var.get(u'exprList').callprop(u'push', var.get(u"this").callprop(u'parseParenItem', var.get(u"this").callprop(u'parseRest'), var.get(u'spreadNodeStartLoc'), var.get(u'spreadNodeStartPos'))) + break + else: + var.get(u'exprList').callprop(u'push', var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos'), var.get(u"this").get(u'parseParenItem'), var.get(u'refNeedsArrowPos'))) + var.put(u'innerEndPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'innerEndLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.put(u'arrowNode', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + if ((var.get(u'canBeArrow') and var.get(u"this").callprop(u'shouldParseArrow')) and var.put(u'arrowNode', var.get(u"this").callprop(u'parseArrow', var.get(u'arrowNode')))): + #for JS loop + var.put(u'_iterator', var.get(u'exprList')) + var.put(u'_isArray', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator'))) + var.put(u'_i', Js(0.0)) + var.put(u'_iterator', (var.get(u'_iterator') if var.get(u'_isArray') else var.get(u'_iterator').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray'): + if (var.get(u'_i')>=var.get(u'_iterator').get(u'length')): + break + var.put(u'_ref', var.get(u'_iterator').get((var.put(u'_i',Js(var.get(u'_i').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i', var.get(u'_iterator').callprop(u'next')) + if var.get(u'_i').get(u'done'): + break + var.put(u'_ref', var.get(u'_i').get(u'value')) + var.put(u'param', var.get(u'_ref')) + if (var.get(u'param').get(u'extra') and var.get(u'param').get(u'extra').get(u'parenthesized')): + var.get(u"this").callprop(u'unexpected', var.get(u'param').get(u'extra').get(u'parenStart')) + + return var.get(u"this").callprop(u'parseArrowExpression', var.get(u'arrowNode'), var.get(u'exprList')) + if var.get(u'exprList').get(u'length').neg(): + var.get(u"this").callprop(u'unexpected', var.get(u"this").get(u'state').get(u'lastTokStart')) + if var.get(u'optionalCommaStart'): + var.get(u"this").callprop(u'unexpected', var.get(u'optionalCommaStart')) + if var.get(u'spreadStart'): + var.get(u"this").callprop(u'unexpected', var.get(u'spreadStart')) + if var.get(u'refShorthandDefaultPos').get(u'start'): + var.get(u"this").callprop(u'unexpected', var.get(u'refShorthandDefaultPos').get(u'start')) + if var.get(u'refNeedsArrowPos').get(u'start'): + var.get(u"this").callprop(u'unexpected', var.get(u'refNeedsArrowPos').get(u'start')) + if (var.get(u'exprList').get(u'length')>Js(1.0)): + var.put(u'val', var.get(u"this").callprop(u'startNodeAt', var.get(u'innerStartPos'), var.get(u'innerStartLoc'))) + var.get(u'val').put(u'expressions', var.get(u'exprList')) + var.get(u"this").callprop(u'toReferencedList', var.get(u'val').get(u'expressions')) + var.get(u"this").callprop(u'finishNodeAt', var.get(u'val'), Js(u'SequenceExpression'), var.get(u'innerEndPos'), var.get(u'innerEndLoc')) + else: + var.put(u'val', var.get(u'exprList').get(u'0')) + var.get(u"this").callprop(u'addExtra', var.get(u'val'), Js(u'parenthesized'), var.get(u'true')) + var.get(u"this").callprop(u'addExtra', var.get(u'val'), Js(u'parenStart'), var.get(u'startPos')) + return var.get(u'val') + PyJs_anonymous_3050_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseParenAndDistinguishExpression', PyJs_anonymous_3050_) + @Js + def PyJs_anonymous_3053_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u"this").callprop(u'canInsertSemicolon').neg() + PyJs_anonymous_3053_._set_name(u'anonymous') + var.get(u'pp$3').put(u'shouldParseArrow', PyJs_anonymous_3053_) + @Js + def PyJs_anonymous_3054_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'arrow')): + return var.get(u'node') + PyJs_anonymous_3054_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseArrow', PyJs_anonymous_3054_) + @Js + def PyJs_anonymous_3055_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return var.get(u'node') + PyJs_anonymous_3055_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseParenItem', PyJs_anonymous_3055_) + @Js + def PyJs_anonymous_3056_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'meta']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'meta', var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + return var.get(u"this").callprop(u'parseMetaProperty', var.get(u'node'), var.get(u'meta'), Js(u'target')) + var.get(u'node').put(u'callee', var.get(u"this").callprop(u'parseNoCallExpr')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'parenL')): + var.get(u'node').put(u'arguments', var.get(u"this").callprop(u'parseExprList', var.get(u'types').get(u'parenR'))) + var.get(u"this").callprop(u'toReferencedList', var.get(u'node').get(u'arguments')) + else: + var.get(u'node').put(u'arguments', Js([])) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'NewExpression')) + PyJs_anonymous_3056_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseNew', PyJs_anonymous_3056_) + @Js + def PyJs_anonymous_3057_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'elem']) + var.put(u'elem', var.get(u"this").callprop(u'startNode')) + PyJs_Object_3058_ = Js({u'raw':var.get(u"this").get(u'input').callprop(u'slice', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'end')).callprop(u'replace', JsRegExp(u'/\\r\\n?/g'), Js(u'\n')),u'cooked':var.get(u"this").get(u'state').get(u'value')}) + var.get(u'elem').put(u'value', PyJs_Object_3058_) + var.get(u"this").callprop(u'next') + var.get(u'elem').put(u'tail', var.get(u"this").callprop(u'match', var.get(u'types').get(u'backQuote'))) + return var.get(u"this").callprop(u'finishNode', var.get(u'elem'), Js(u'TemplateElement')) + PyJs_anonymous_3057_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseTemplateElement', PyJs_anonymous_3057_) + @Js + def PyJs_anonymous_3059_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'curElt']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'expressions', Js([])) + var.put(u'curElt', var.get(u"this").callprop(u'parseTemplateElement')) + var.get(u'node').put(u'quasis', Js([var.get(u'curElt')])) + while var.get(u'curElt').get(u'tail').neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'dollarBraceL')) + var.get(u'node').get(u'expressions').callprop(u'push', var.get(u"this").callprop(u'parseExpression')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + var.get(u'node').get(u'quasis').callprop(u'push', var.put(u'curElt', var.get(u"this").callprop(u'parseTemplateElement'))) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TemplateLiteral')) + PyJs_anonymous_3059_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseTemplate', PyJs_anonymous_3059_) + @Js + def PyJs_anonymous_3060_(isPattern, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'refShorthandDefaultPos':refShorthandDefaultPos, u'isPattern':isPattern}, var) + var.registers([u'node', u'firstRestLocation', u'isGenerator', u'prop', u'isAsync', u'asyncId', u'refShorthandDefaultPos', u'startLoc', u'propHash', u'position', u'startPos', u'isPattern', u'decorators', u'first']) + var.put(u'decorators', Js([])) + var.put(u'propHash', var.get(u'Object').callprop(u'create', var.get(u"null"))) + var.put(u'first', var.get(u'true')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'properties', Js([])) + var.get(u"this").callprop(u'next') + var.put(u'firstRestLocation', var.get(u"null")) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'at')): + var.get(u'decorators').callprop(u'push', var.get(u"this").callprop(u'parseDecorator')) + var.put(u'prop', var.get(u"this").callprop(u'startNode')) + var.put(u'isGenerator', Js(False)) + var.put(u'isAsync', Js(False)) + var.put(u'startPos', PyJsComma(Js(0.0), Js(None))) + var.put(u'startLoc', PyJsComma(Js(0.0), Js(None))) + if var.get(u'decorators').get(u'length'): + var.get(u'prop').put(u'decorators', var.get(u'decorators')) + var.put(u'decorators', Js([])) + if (var.get(u"this").callprop(u'hasPlugin', Js(u'objectRestSpread')) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis'))): + var.put(u'prop', var.get(u"this").callprop(u'parseSpread')) + var.get(u'prop').put(u'type', (Js(u'RestProperty') if var.get(u'isPattern') else Js(u'SpreadProperty'))) + var.get(u'node').get(u'properties').callprop(u'push', var.get(u'prop')) + if var.get(u'isPattern'): + var.put(u'position', var.get(u"this").get(u'state').get(u'start')) + if PyJsStrictNeq(var.get(u'firstRestLocation'),var.get(u"null")): + var.get(u"this").callprop(u'unexpected', var.get(u'firstRestLocation'), Js(u'Cannot have multiple rest elements when destructuring')) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'braceR')): + break + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')) and PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'braceR'))): + continue + else: + var.put(u'firstRestLocation', var.get(u'position')) + continue + else: + continue + var.get(u'prop').put(u'method', Js(False)) + var.get(u'prop').put(u'shorthand', Js(False)) + if (var.get(u'isPattern') or var.get(u'refShorthandDefaultPos')): + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + if var.get(u'isPattern').neg(): + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + if (var.get(u'isPattern').neg() and var.get(u"this").callprop(u'isContextual', Js(u'async'))): + if var.get(u'isGenerator'): + var.get(u"this").callprop(u'unexpected') + var.put(u'asyncId', var.get(u"this").callprop(u'parseIdentifier')) + if ((((var.get(u"this").callprop(u'match', var.get(u'types').get(u'colon')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq'))) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma'))): + var.get(u'prop').put(u'key', var.get(u'asyncId')) + else: + var.put(u'isAsync', var.get(u'true')) + if var.get(u"this").callprop(u'hasPlugin', Js(u'asyncGenerators')): + var.put(u'isGenerator', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'prop')) + else: + var.get(u"this").callprop(u'parsePropertyName', var.get(u'prop')) + var.get(u"this").callprop(u'parseObjPropValue', var.get(u'prop'), var.get(u'startPos'), var.get(u'startLoc'), var.get(u'isGenerator'), var.get(u'isAsync'), var.get(u'isPattern'), var.get(u'refShorthandDefaultPos')) + var.get(u"this").callprop(u'checkPropClash', var.get(u'prop'), var.get(u'propHash')) + if var.get(u'prop').get(u'shorthand'): + var.get(u"this").callprop(u'addExtra', var.get(u'prop'), Js(u'shorthand'), var.get(u'true')) + var.get(u'node').get(u'properties').callprop(u'push', var.get(u'prop')) + if PyJsStrictNeq(var.get(u'firstRestLocation'),var.get(u"null")): + var.get(u"this").callprop(u'unexpected', var.get(u'firstRestLocation'), Js(u'The rest element has to be the last element when destructuring')) + if var.get(u'decorators').get(u'length'): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'You have trailing decorators with no property')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), (Js(u'ObjectPattern') if var.get(u'isPattern') else Js(u'ObjectExpression'))) + PyJs_anonymous_3060_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseObj', PyJs_anonymous_3060_) + @Js + def PyJs_anonymous_3061_(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'isGenerator':isGenerator, u'prop':prop, u'isAsync':isAsync, u'refShorthandDefaultPos':refShorthandDefaultPos, u'startLoc':startLoc, u'startPos':startPos, u'isPattern':isPattern}, var) + var.registers([u'isGenerator', u'prop', u'start', u'paramCount', u'illegalBinding', u'refShorthandDefaultPos', u'startLoc', u'isAsync', u'startPos', u'isPattern']) + if ((var.get(u'isAsync') or var.get(u'isGenerator')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))): + if var.get(u'isPattern'): + var.get(u"this").callprop(u'unexpected') + var.get(u'prop').put(u'kind', Js(u'method')) + var.get(u'prop').put(u'method', var.get(u'true')) + var.get(u"this").callprop(u'parseMethod', var.get(u'prop'), var.get(u'isGenerator'), var.get(u'isAsync')) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectMethod')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'colon')): + var.get(u'prop').put(u'value', (var.get(u"this").callprop(u'parseMaybeDefault', var.get(u"this").get(u'state').get(u'start'), var.get(u"this").get(u'state').get(u'startLoc')) if var.get(u'isPattern') else var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos')))) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectProperty')) + def PyJs_LONG_3062_(var=var): + return (((((var.get(u'isPattern').neg() and var.get(u'prop').get(u'computed').neg()) and PyJsStrictEq(var.get(u'prop').get(u'key').get(u'type'),Js(u'Identifier'))) and (PyJsStrictEq(var.get(u'prop').get(u'key').get(u'name'),Js(u'get')) or PyJsStrictEq(var.get(u'prop').get(u'key').get(u'name'),Js(u'set')))) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg()) + if PyJs_LONG_3062_(): + if (var.get(u'isGenerator') or var.get(u'isAsync')): + var.get(u"this").callprop(u'unexpected') + var.get(u'prop').put(u'kind', var.get(u'prop').get(u'key').get(u'name')) + var.get(u"this").callprop(u'parsePropertyName', var.get(u'prop')) + var.get(u"this").callprop(u'parseMethod', var.get(u'prop'), Js(False)) + var.put(u'paramCount', (Js(0.0) if PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')) else Js(1.0))) + if PyJsStrictNeq(var.get(u'prop').get(u'params').get(u'length'),var.get(u'paramCount')): + var.put(u'start', var.get(u'prop').get(u'start')) + if PyJsStrictEq(var.get(u'prop').get(u'kind'),Js(u'get')): + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'getter should have no params')) + else: + var.get(u"this").callprop(u'raise', var.get(u'start'), Js(u'setter should have exactly one param')) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectMethod')) + if (var.get(u'prop').get(u'computed').neg() and PyJsStrictEq(var.get(u'prop').get(u'key').get(u'type'),Js(u'Identifier'))): + if var.get(u'isPattern'): + var.put(u'illegalBinding', var.get(u"this").callprop(u'isKeyword', var.get(u'prop').get(u'key').get(u'name'))) + if (var.get(u'illegalBinding').neg() and var.get(u"this").get(u'state').get(u'strict')): + var.put(u'illegalBinding', (var.get(u'reservedWords').callprop(u'strictBind', var.get(u'prop').get(u'key').get(u'name')) or var.get(u'reservedWords').callprop(u'strict', var.get(u'prop').get(u'key').get(u'name')))) + if var.get(u'illegalBinding'): + var.get(u"this").callprop(u'raise', var.get(u'prop').get(u'key').get(u'start'), (Js(u'Binding ')+var.get(u'prop').get(u'key').get(u'name'))) + var.get(u'prop').put(u'value', var.get(u"this").callprop(u'parseMaybeDefault', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'prop').get(u'key').callprop(u'__clone'))) + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')) and var.get(u'refShorthandDefaultPos')): + if var.get(u'refShorthandDefaultPos').get(u'start').neg(): + var.get(u'refShorthandDefaultPos').put(u'start', var.get(u"this").get(u'state').get(u'start')) + var.get(u'prop').put(u'value', var.get(u"this").callprop(u'parseMaybeDefault', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'prop').get(u'key').callprop(u'__clone'))) + else: + var.get(u'prop').put(u'value', var.get(u'prop').get(u'key').callprop(u'__clone')) + var.get(u'prop').put(u'shorthand', var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'prop'), Js(u'ObjectProperty')) + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3061_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseObjPropValue', PyJs_anonymous_3061_) + @Js + def PyJs_anonymous_3063_(prop, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'prop']) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'bracketL')): + var.get(u'prop').put(u'computed', var.get(u'true')) + var.get(u'prop').put(u'key', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + return var.get(u'prop').get(u'key') + else: + var.get(u'prop').put(u'computed', Js(False)) + return var.get(u'prop').put(u'key', (var.get(u"this").callprop(u'parseExprAtom') if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'string'))) else var.get(u"this").callprop(u'parseIdentifier', var.get(u'true')))) + PyJs_anonymous_3063_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parsePropertyName', PyJs_anonymous_3063_) + @Js + def PyJs_anonymous_3064_(node, isAsync, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isAsync':isAsync, u'arguments':arguments}, var) + var.registers([u'node', u'isAsync']) + var.get(u'node').put(u'id', var.get(u"null")) + var.get(u'node').put(u'generator', Js(False)) + var.get(u'node').put(u'expression', Js(False)) + var.get(u'node').put(u'async', var.get(u'isAsync').neg().neg()) + PyJs_anonymous_3064_._set_name(u'anonymous') + var.get(u'pp$3').put(u'initFunction', PyJs_anonymous_3064_) + @Js + def PyJs_anonymous_3065_(node, isGenerator, isAsync, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isAsync':isAsync, u'isGenerator':isGenerator, u'arguments':arguments}, var) + var.registers([u'node', u'oldInMethod', u'isAsync', u'isGenerator']) + var.put(u'oldInMethod', var.get(u"this").get(u'state').get(u'inMethod')) + var.get(u"this").get(u'state').put(u'inMethod', (var.get(u'node').get(u'kind') or var.get(u'true'))) + var.get(u"this").callprop(u'initFunction', var.get(u'node'), var.get(u'isAsync')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.get(u'node').put(u'params', var.get(u"this").callprop(u'parseBindingList', var.get(u'types').get(u'parenR'))) + var.get(u'node').put(u'generator', var.get(u'isGenerator')) + var.get(u"this").callprop(u'parseFunctionBody', var.get(u'node')) + var.get(u"this").get(u'state').put(u'inMethod', var.get(u'oldInMethod')) + return var.get(u'node') + PyJs_anonymous_3065_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseMethod', PyJs_anonymous_3065_) + @Js + def PyJs_anonymous_3066_(node, params, isAsync, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isAsync':isAsync, u'params':params, u'arguments':arguments}, var) + var.registers([u'node', u'isAsync', u'params']) + var.get(u"this").callprop(u'initFunction', var.get(u'node'), var.get(u'isAsync')) + var.get(u'node').put(u'params', var.get(u"this").callprop(u'toAssignableList', var.get(u'params'), var.get(u'true'), Js(u'arrow function parameters'))) + var.get(u"this").callprop(u'parseFunctionBody', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ArrowFunctionExpression')) + PyJs_anonymous_3066_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseArrowExpression', PyJs_anonymous_3066_) + @Js + def PyJs_anonymous_3067_(node, allowExpression, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'allowExpression':allowExpression, u'arguments':arguments}, var) + var.registers([u'node', u'_isArray3', u'_isArray2', u'directive', u'oldLabels', u'checkLVal', u'oldInAsync', u'allowExpression', u'isStrict', u'_i3', u'_i2', u'param', u'_ref2', u'oldInFunc', u'isExpression', u'oldStrict', u'nameHash', u'oldInGen', u'_ref3', u'_iterator3', u'_iterator2']) + var.put(u'isExpression', (var.get(u'allowExpression') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceL')).neg())) + var.put(u'oldInAsync', var.get(u"this").get(u'state').get(u'inAsync')) + var.get(u"this").get(u'state').put(u'inAsync', var.get(u'node').get(u'async')) + if var.get(u'isExpression'): + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseMaybeAssign')) + var.get(u'node').put(u'expression', var.get(u'true')) + else: + var.put(u'oldInFunc', var.get(u"this").get(u'state').get(u'inFunction')) + var.put(u'oldInGen', var.get(u"this").get(u'state').get(u'inGenerator')) + var.put(u'oldLabels', var.get(u"this").get(u'state').get(u'labels')) + var.get(u"this").get(u'state').put(u'inFunction', var.get(u'true')) + var.get(u"this").get(u'state').put(u'inGenerator', var.get(u'node').get(u'generator')) + var.get(u"this").get(u'state').put(u'labels', Js([])) + var.get(u'node').put(u'body', var.get(u"this").callprop(u'parseBlock', var.get(u'true'))) + var.get(u'node').put(u'expression', Js(False)) + var.get(u"this").get(u'state').put(u'inFunction', var.get(u'oldInFunc')) + var.get(u"this").get(u'state').put(u'inGenerator', var.get(u'oldInGen')) + var.get(u"this").get(u'state').put(u'labels', var.get(u'oldLabels')) + var.get(u"this").get(u'state').put(u'inAsync', var.get(u'oldInAsync')) + var.put(u'checkLVal', var.get(u"this").get(u'state').get(u'strict')) + var.put(u'isStrict', Js(False)) + if var.get(u'allowExpression'): + var.put(u'checkLVal', var.get(u'true')) + if (var.get(u'isExpression').neg() and var.get(u'node').get(u'body').get(u'directives').get(u'length')): + #for JS loop + var.put(u'_iterator2', var.get(u'node').get(u'body').get(u'directives')) + var.put(u'_isArray2', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator2'))) + var.put(u'_i2', Js(0.0)) + var.put(u'_iterator2', (var.get(u'_iterator2') if var.get(u'_isArray2') else var.get(u'_iterator2').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray2'): + if (var.get(u'_i2')>=var.get(u'_iterator2').get(u'length')): + break + var.put(u'_ref2', var.get(u'_iterator2').get((var.put(u'_i2',Js(var.get(u'_i2').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i2', var.get(u'_iterator2').callprop(u'next')) + if var.get(u'_i2').get(u'done'): + break + var.put(u'_ref2', var.get(u'_i2').get(u'value')) + var.put(u'directive', var.get(u'_ref2')) + if PyJsStrictEq(var.get(u'directive').get(u'value').get(u'value'),Js(u'use strict')): + var.put(u'isStrict', var.get(u'true')) + var.put(u'checkLVal', var.get(u'true')) + break + + if (((var.get(u'isStrict') and var.get(u'node').get(u'id')) and PyJsStrictEq(var.get(u'node').get(u'id').get(u'type'),Js(u'Identifier'))) and PyJsStrictEq(var.get(u'node').get(u'id').get(u'name'),Js(u'yield'))): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'id').get(u'start'), Js(u'Binding yield in strict mode')) + if var.get(u'checkLVal'): + var.put(u'nameHash', var.get(u'Object').callprop(u'create', var.get(u"null"))) + var.put(u'oldStrict', var.get(u"this").get(u'state').get(u'strict')) + if var.get(u'isStrict'): + var.get(u"this").get(u'state').put(u'strict', var.get(u'true')) + if var.get(u'node').get(u'id'): + var.get(u"this").callprop(u'checkLVal', var.get(u'node').get(u'id'), var.get(u'true'), var.get(u'undefined'), Js(u'function name')) + #for JS loop + var.put(u'_iterator3', var.get(u'node').get(u'params')) + var.put(u'_isArray3', var.get(u'Array').callprop(u'isArray', var.get(u'_iterator3'))) + var.put(u'_i3', Js(0.0)) + var.put(u'_iterator3', (var.get(u'_iterator3') if var.get(u'_isArray3') else var.get(u'_iterator3').callprop(var.get(u'Symbol').get(u'iterator')))) + while 1: + pass + if var.get(u'_isArray3'): + if (var.get(u'_i3')>=var.get(u'_iterator3').get(u'length')): + break + var.put(u'_ref3', var.get(u'_iterator3').get((var.put(u'_i3',Js(var.get(u'_i3').to_number())+Js(1))-Js(1)))) + else: + var.put(u'_i3', var.get(u'_iterator3').callprop(u'next')) + if var.get(u'_i3').get(u'done'): + break + var.put(u'_ref3', var.get(u'_i3').get(u'value')) + var.put(u'param', var.get(u'_ref3')) + if (var.get(u'isStrict') and PyJsStrictNeq(var.get(u'param').get(u'type'),Js(u'Identifier'))): + var.get(u"this").callprop(u'raise', var.get(u'param').get(u'start'), Js(u'Non-simple parameter in strict mode')) + var.get(u"this").callprop(u'checkLVal', var.get(u'param'), var.get(u'true'), var.get(u'nameHash'), Js(u'function parameter list')) + + var.get(u"this").get(u'state').put(u'strict', var.get(u'oldStrict')) + PyJs_anonymous_3067_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseFunctionBody', PyJs_anonymous_3067_) + @Js + def PyJs_anonymous_3068_(close, allowEmpty, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'close':close, u'allowEmpty':allowEmpty, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'elts', u'close', u'allowEmpty', u'refShorthandDefaultPos', u'first']) + var.put(u'elts', Js([])) + var.put(u'first', var.get(u'true')) + while var.get(u"this").callprop(u'eat', var.get(u'close')).neg(): + if var.get(u'first'): + var.put(u'first', Js(False)) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'close')): + break + var.get(u'elts').callprop(u'push', var.get(u"this").callprop(u'parseExprListItem', var.get(u'allowEmpty'), var.get(u'refShorthandDefaultPos'))) + return var.get(u'elts') + PyJs_anonymous_3068_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprList', PyJs_anonymous_3068_) + @Js + def PyJs_anonymous_3069_(allowEmpty, refShorthandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'allowEmpty':allowEmpty, u'refShorthandDefaultPos':refShorthandDefaultPos, u'arguments':arguments}, var) + var.registers([u'allowEmpty', u'refShorthandDefaultPos', u'elt']) + var.put(u'elt', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'allowEmpty') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'comma'))): + var.put(u'elt', var.get(u"null")) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'ellipsis')): + var.put(u'elt', var.get(u"this").callprop(u'parseSpread', var.get(u'refShorthandDefaultPos'))) + else: + var.put(u'elt', var.get(u"this").callprop(u'parseMaybeAssign', Js(False), var.get(u'refShorthandDefaultPos'), var.get(u"this").get(u'parseParenItem'))) + return var.get(u'elt') + PyJs_anonymous_3069_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseExprListItem', PyJs_anonymous_3069_) + @Js + def PyJs_anonymous_3070_(liberal, this, arguments, var=var): + var = Scope({u'this':this, u'liberal':liberal, u'arguments':arguments}, var) + var.registers([u'node', u'liberal']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + if ((var.get(u'liberal').neg() and var.get(u"this").get(u'state').get(u'strict')) and var.get(u'reservedWords').callprop(u'strict', var.get(u"this").get(u'state').get(u'value'))): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), ((Js(u"The keyword '")+var.get(u"this").get(u'state').get(u'value'))+Js(u"' is reserved"))) + var.get(u'node').put(u'name', var.get(u"this").get(u'state').get(u'value')) + else: + if (var.get(u'liberal') and var.get(u"this").get(u'state').get(u'type').get(u'keyword')): + var.get(u'node').put(u'name', var.get(u"this").get(u'state').get(u'type').get(u'keyword')) + else: + var.get(u"this").callprop(u'unexpected') + if ((var.get(u'liberal').neg() and PyJsStrictEq(var.get(u'node').get(u'name'),Js(u'await'))) and var.get(u"this").get(u'state').get(u'inAsync')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'invalid use of await inside of an async function')) + var.get(u'node').get(u'loc').put(u'identifierName', var.get(u'node').get(u'name')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'Identifier')) + PyJs_anonymous_3070_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseIdentifier', PyJs_anonymous_3070_) + @Js + def PyJs_anonymous_3071_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").get(u'state').get(u'inAsync').neg(): + var.get(u"this").callprop(u'unexpected') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')): + var.get(u"this").callprop(u'raise', var.get(u'node').get(u'start'), Js(u'await* has been removed from the async functions proposal. Use Promise.all() instead.')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeUnary')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'AwaitExpression')) + PyJs_anonymous_3071_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseAwait', PyJs_anonymous_3071_) + @Js + def PyJs_anonymous_3072_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'next') + if ((var.get(u"this").callprop(u'match', var.get(u'types').get(u'semi')) or var.get(u"this").callprop(u'canInsertSemicolon')) or (var.get(u"this").callprop(u'match', var.get(u'types').get(u'star')).neg() and var.get(u"this").get(u'state').get(u'type').get(u'startsExpr').neg())): + var.get(u'node').put(u'delegate', Js(False)) + var.get(u'node').put(u'argument', var.get(u"null")) + else: + var.get(u'node').put(u'delegate', var.get(u"this").callprop(u'eat', var.get(u'types').get(u'star'))) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'parseMaybeAssign')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'YieldExpression')) + PyJs_anonymous_3072_._set_name(u'anonymous') + var.get(u'pp$3').put(u'parseYield', PyJs_anonymous_3072_) + pass + var.put(u'pp$4', var.get(u'Parser').get(u'prototype')) + var.put(u'commentKeys', Js([Js(u'leadingComments'), Js(u'trailingComments'), Js(u'innerComments')])) + @Js + def PyJs_anonymous_3073_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'Node']) + @Js + def PyJsHoisted_Node_(pos, loc, filename, this, arguments, var=var): + var = Scope({u'this':this, u'loc':loc, u'pos':pos, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'loc', u'pos', u'filename']) + var.get(u'_classCallCheck$6')(var.get(u"this"), var.get(u'Node')) + var.get(u"this").put(u'type', Js(u'')) + var.get(u"this").put(u'start', var.get(u'pos')) + var.get(u"this").put(u'end', Js(0.0)) + var.get(u"this").put(u'loc', var.get(u'SourceLocation').create(var.get(u'loc'))) + if var.get(u'filename'): + var.get(u"this").get(u'loc').put(u'filename', var.get(u'filename')) + PyJsHoisted_Node_.func_name = u'Node' + var.put(u'Node', PyJsHoisted_Node_) + pass + @Js + def PyJs___clone_3074_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'__clone':PyJs___clone_3074_}, var) + var.registers([u'node2', u'key']) + var.put(u'node2', var.get(u'Node').create()) + for PyJsTemp in var.get(u"this"): + var.put(u'key', PyJsTemp) + if (var.get(u'commentKeys').callprop(u'indexOf', var.get(u'key'))Js(0.0))): + return var.get('undefined') + var.put(u'stack', var.get(u"this").get(u'state').get(u'commentStack')) + var.put(u'lastChild', PyJsComma(Js(0.0), Js(None))) + var.put(u'trailingComments', PyJsComma(Js(0.0), Js(None))) + var.put(u'i', PyJsComma(Js(0.0), Js(None))) + var.put(u'j', PyJsComma(Js(0.0), Js(None))) + if (var.get(u"this").get(u'state').get(u'trailingComments').get(u'length')>Js(0.0)): + if (var.get(u"this").get(u'state').get(u'trailingComments').get(u'0').get(u'start')>=var.get(u'node').get(u'end')): + var.put(u'trailingComments', var.get(u"this").get(u'state').get(u'trailingComments')) + var.get(u"this").get(u'state').put(u'trailingComments', Js([])) + else: + var.get(u"this").get(u'state').get(u'trailingComments').put(u'length', Js(0.0)) + else: + var.put(u'lastInStack', var.get(u'last')(var.get(u'stack'))) + if (((var.get(u'stack').get(u'length')>Js(0.0)) and var.get(u'lastInStack').get(u'trailingComments')) and (var.get(u'lastInStack').get(u'trailingComments').get(u'0').get(u'start')>=var.get(u'node').get(u'end'))): + var.put(u'trailingComments', var.get(u'lastInStack').get(u'trailingComments')) + var.get(u'lastInStack').put(u'trailingComments', var.get(u"null")) + while ((var.get(u'stack').get(u'length')>Js(0.0)) and (var.get(u'last')(var.get(u'stack')).get(u'start')>=var.get(u'node').get(u'start'))): + var.put(u'lastChild', var.get(u'stack').callprop(u'pop')) + if var.get(u'lastChild'): + if var.get(u'lastChild').get(u'leadingComments'): + if (PyJsStrictNeq(var.get(u'lastChild'),var.get(u'node')) and (var.get(u'last')(var.get(u'lastChild').get(u'leadingComments')).get(u'end')<=var.get(u'node').get(u'start'))): + var.get(u'node').put(u'leadingComments', var.get(u'lastChild').get(u'leadingComments')) + var.get(u'lastChild').put(u'leadingComments', var.get(u"null")) + else: + #for JS loop + var.put(u'i', (var.get(u'lastChild').get(u'leadingComments').get(u'length')-Js(2.0))) + while (var.get(u'i')>=Js(0.0)): + try: + if (var.get(u'lastChild').get(u'leadingComments').get(var.get(u'i')).get(u'end')<=var.get(u'node').get(u'start')): + var.get(u'node').put(u'leadingComments', var.get(u'lastChild').get(u'leadingComments').callprop(u'splice', Js(0.0), (var.get(u'i')+Js(1.0)))) + break + finally: + var.put(u'i',Js(var.get(u'i').to_number())-Js(1)) + else: + if (var.get(u"this").get(u'state').get(u'leadingComments').get(u'length')>Js(0.0)): + if (var.get(u'last')(var.get(u"this").get(u'state').get(u'leadingComments')).get(u'end')<=var.get(u'node').get(u'start')): + if var.get(u"this").get(u'state').get(u'commentPreviousNode'): + #for JS loop + var.put(u'j', Js(0.0)) + while (var.get(u'j')Js(0.0)): + var.get(u'node').put(u'leadingComments', var.get(u"this").get(u'state').get(u'leadingComments')) + var.get(u"this").get(u'state').put(u'leadingComments', Js([])) + else: + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')var.get(u'node').get(u'start')): + break + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'node').put(u'leadingComments', var.get(u"this").get(u'state').get(u'leadingComments').callprop(u'slice', Js(0.0), var.get(u'i'))) + if PyJsStrictEq(var.get(u'node').get(u'leadingComments').get(u'length'),Js(0.0)): + var.get(u'node').put(u'leadingComments', var.get(u"null")) + var.put(u'trailingComments', var.get(u"this").get(u'state').get(u'leadingComments').callprop(u'slice', var.get(u'i'))) + if PyJsStrictEq(var.get(u'trailingComments').get(u'length'),Js(0.0)): + var.put(u'trailingComments', var.get(u"null")) + var.get(u"this").get(u'state').put(u'commentPreviousNode', var.get(u'node')) + if var.get(u'trailingComments'): + if ((var.get(u'trailingComments').get(u'length') and (var.get(u'trailingComments').get(u'0').get(u'start')>=var.get(u'node').get(u'start'))) and (var.get(u'last')(var.get(u'trailingComments')).get(u'end')<=var.get(u'node').get(u'end'))): + var.get(u'node').put(u'innerComments', var.get(u'trailingComments')) + else: + var.get(u'node').put(u'trailingComments', var.get(u'trailingComments')) + var.get(u'stack').callprop(u'push', var.get(u'node')) + PyJs_anonymous_3081_._set_name(u'anonymous') + var.get(u'pp$6').put(u'processComment', PyJs_anonymous_3081_) + var.put(u'pp$7', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3082_(tok, allowLeadingPipeOrAnd, this, arguments, var=var): + var = Scope({u'this':this, u'tok':tok, u'arguments':arguments, u'allowLeadingPipeOrAnd':allowLeadingPipeOrAnd}, var) + var.registers([u'tok', u'oldInType', u'type', u'allowLeadingPipeOrAnd']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.get(u"this").callprop(u'expect', (var.get(u'tok') or var.get(u'types').get(u'colon'))) + if var.get(u'allowLeadingPipeOrAnd'): + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'bitwiseAND')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'bitwiseOR'))): + var.get(u"this").callprop(u'next') + var.put(u'type', var.get(u"this").callprop(u'flowParseType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u'type') + PyJs_anonymous_3082_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeInitialiser', PyJs_anonymous_3082_) + @Js + def PyJs_anonymous_3083_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'flowParseInterfaceish', var.get(u'node'), var.get(u'true')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareClass')) + PyJs_anonymous_3083_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareClass', PyJs_anonymous_3083_) + @Js + def PyJs_anonymous_3084_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'typeContainer', u'tmp', u'typeNode', u'id', u'node']) + var.get(u"this").callprop(u'next') + var.put(u'id', var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier'))) + var.put(u'typeNode', var.get(u"this").callprop(u'startNode')) + var.put(u'typeContainer', var.get(u"this").callprop(u'startNode')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'typeNode').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + else: + var.get(u'typeNode').put(u'typeParameters', var.get(u"null")) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + var.put(u'tmp', var.get(u"this").callprop(u'flowParseFunctionTypeParams')) + var.get(u'typeNode').put(u'params', var.get(u'tmp').get(u'params')) + var.get(u'typeNode').put(u'rest', var.get(u'tmp').get(u'rest')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'typeNode').put(u'returnType', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u'typeContainer').put(u'typeAnnotation', var.get(u"this").callprop(u'finishNode', var.get(u'typeNode'), Js(u'FunctionTypeAnnotation'))) + var.get(u'id').put(u'typeAnnotation', var.get(u"this").callprop(u'finishNode', var.get(u'typeContainer'), Js(u'TypeAnnotation'))) + var.get(u"this").callprop(u'finishNode', var.get(u'id'), var.get(u'id').get(u'type')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareFunction')) + PyJs_anonymous_3084_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareFunction', PyJs_anonymous_3084_) + @Js + def PyJs_anonymous_3085_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_class')): + return var.get(u"this").callprop(u'flowParseDeclareClass', var.get(u'node')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_function')): + return var.get(u"this").callprop(u'flowParseDeclareFunction', var.get(u'node')) + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'_var')): + return var.get(u"this").callprop(u'flowParseDeclareVariable', var.get(u'node')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'module')): + if PyJsStrictEq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'dot')): + return var.get(u"this").callprop(u'flowParseDeclareModuleExports', var.get(u'node')) + else: + return var.get(u"this").callprop(u'flowParseDeclareModule', var.get(u'node')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'type')): + return var.get(u"this").callprop(u'flowParseDeclareTypeAlias', var.get(u'node')) + else: + if var.get(u"this").callprop(u'isContextual', Js(u'interface')): + return var.get(u"this").callprop(u'flowParseDeclareInterface', var.get(u'node')) + else: + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3085_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclare', PyJs_anonymous_3085_) + @Js + def PyJs_anonymous_3086_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseTypeAnnotatableIdentifier')) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareVariable')) + PyJs_anonymous_3086_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareVariable', PyJs_anonymous_3086_) + @Js + def PyJs_anonymous_3087_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'bodyNode', u'body', u'node2', u'node']) + var.get(u"this").callprop(u'next') + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'string')): + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseExprAtom')) + else: + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + var.put(u'bodyNode', var.get(u'node').put(u'body', var.get(u"this").callprop(u'startNode'))) + var.put(u'body', var.get(u'bodyNode').put(u'body', Js([]))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg(): + var.put(u'node2', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expectContextual', Js(u'declare'), Js(u'Unexpected token. Only declares are allowed inside declare module')) + var.get(u'body').callprop(u'push', var.get(u"this").callprop(u'flowParseDeclare', var.get(u'node2'))) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceR')) + var.get(u"this").callprop(u'finishNode', var.get(u'bodyNode'), Js(u'BlockStatement')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareModule')) + PyJs_anonymous_3087_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareModule', PyJs_anonymous_3087_) + @Js + def PyJs_anonymous_3088_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'expectContextual', Js(u'module')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'dot')) + var.get(u"this").callprop(u'expectContextual', Js(u'exports')) + var.get(u'node').put(u'typeAnnotation', var.get(u"this").callprop(u'flowParseTypeAnnotation')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareModuleExports')) + PyJs_anonymous_3088_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareModuleExports', PyJs_anonymous_3088_) + @Js + def PyJs_anonymous_3089_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'flowParseTypeAlias', var.get(u'node')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareTypeAlias')) + PyJs_anonymous_3089_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareTypeAlias', PyJs_anonymous_3089_) + @Js + def PyJs_anonymous_3090_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'next') + var.get(u"this").callprop(u'flowParseInterfaceish', var.get(u'node')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'DeclareInterface')) + PyJs_anonymous_3090_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseDeclareInterface', PyJs_anonymous_3090_) + @Js + def PyJs_anonymous_3091_(node, allowStatic, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments, u'allowStatic':allowStatic}, var) + var.registers([u'node', u'allowStatic']) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + else: + var.get(u'node').put(u'typeParameters', var.get(u"null")) + var.get(u'node').put(u'extends', Js([])) + var.get(u'node').put(u'mixins', Js([])) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'_extends')): + while 1: + var.get(u'node').get(u'extends').callprop(u'push', var.get(u"this").callprop(u'flowParseInterfaceExtends')) + if not var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + break + if var.get(u"this").callprop(u'isContextual', Js(u'mixins')): + var.get(u"this").callprop(u'next') + while 1: + var.get(u'node').get(u'mixins').callprop(u'push', var.get(u"this").callprop(u'flowParseInterfaceExtends')) + if not var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')): + break + var.get(u'node').put(u'body', var.get(u"this").callprop(u'flowParseObjectType', var.get(u'allowStatic'))) + PyJs_anonymous_3091_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseInterfaceish', PyJs_anonymous_3091_) + @Js + def PyJs_anonymous_3092_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseQualifiedTypeIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterInstantiation')) + else: + var.get(u'node').put(u'typeParameters', var.get(u"null")) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'InterfaceExtends')) + PyJs_anonymous_3092_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseInterfaceExtends', PyJs_anonymous_3092_) + @Js + def PyJs_anonymous_3093_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u"this").callprop(u'flowParseInterfaceish', var.get(u'node'), Js(False)) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'InterfaceDeclaration')) + PyJs_anonymous_3093_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseInterface', PyJs_anonymous_3093_) + @Js + def PyJs_anonymous_3094_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + else: + var.get(u'node').put(u'typeParameters', var.get(u"null")) + var.get(u'node').put(u'right', var.get(u"this").callprop(u'flowParseTypeInitialiser', var.get(u'types').get(u'eq'), var.get(u'true'))) + var.get(u"this").callprop(u'semicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeAlias')) + PyJs_anonymous_3094_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeAlias', PyJs_anonymous_3094_) + @Js + def PyJs_anonymous_3095_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'variance', u'ident']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'variance', var.get(u"this").callprop(u'flowParseVariance')) + var.put(u'ident', var.get(u"this").callprop(u'flowParseTypeAnnotatableIdentifier')) + var.get(u'node').put(u'name', var.get(u'ident').get(u'name')) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u'node').put(u'bound', var.get(u'ident').get(u'typeAnnotation')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'eq')): + var.get(u"this").callprop(u'eat', var.get(u'types').get(u'eq')) + var.get(u'node').put(u'default', var.get(u"this").callprop(u'flowParseType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeParameter')) + PyJs_anonymous_3095_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeParameter', PyJs_anonymous_3095_) + @Js + def PyJs_anonymous_3096_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'oldInType']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'params', Js([])) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + if (var.get(u"this").callprop(u'isRelational', Js(u'<')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxTagStart'))): + var.get(u"this").callprop(u'next') + else: + var.get(u"this").callprop(u'unexpected') + while 1: + var.get(u'node').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseTypeParameter')) + if var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if not var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + break + var.get(u"this").callprop(u'expectRelational', Js(u'>')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeParameterDeclaration')) + PyJs_anonymous_3096_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeParameterDeclaration', PyJs_anonymous_3096_) + @Js + def PyJs_anonymous_3097_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'oldInType']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u'node').put(u'params', Js([])) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.get(u"this").callprop(u'expectRelational', Js(u'<')) + while var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + var.get(u'node').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseType')) + if var.get(u"this").callprop(u'isRelational', Js(u'>')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + var.get(u"this").callprop(u'expectRelational', Js(u'>')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeParameterInstantiation')) + PyJs_anonymous_3097_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeParameterInstantiation', PyJs_anonymous_3097_) + @Js + def PyJs_anonymous_3098_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return (var.get(u"this").callprop(u'parseExprAtom') if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'num')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'string'))) else var.get(u"this").callprop(u'parseIdentifier', var.get(u'true'))) + PyJs_anonymous_3098_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectPropertyKey', PyJs_anonymous_3098_) + @Js + def PyJs_anonymous_3099_(node, isStatic, variance, this, arguments, var=var): + var = Scope({u'node':node, u'variance':variance, u'isStatic':isStatic, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'variance', u'isStatic']) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketL')) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseObjectPropertyKey')) + var.get(u'node').put(u'key', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketR')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeIndexer')) + PyJs_anonymous_3099_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeIndexer', PyJs_anonymous_3099_) + @Js + def PyJs_anonymous_3100_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'params', Js([])) + var.get(u'node').put(u'rest', var.get(u"null")) + var.get(u'node').put(u'typeParameters', var.get(u"null")) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterDeclaration')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenL')) + while var.get(u"this").callprop(u'match', var.get(u'types').get(u'name')): + var.get(u'node').get(u'params').callprop(u'push', var.get(u"this").callprop(u'flowParseFunctionTypeParam')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenR')).neg(): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'comma')) + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'ellipsis')): + var.get(u'node').put(u'rest', var.get(u"this").callprop(u'flowParseFunctionTypeParam')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'parenR')) + var.get(u'node').put(u'returnType', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'FunctionTypeAnnotation')) + PyJs_anonymous_3100_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeMethodish', PyJs_anonymous_3100_) + @Js + def PyJs_anonymous_3101_(startPos, startLoc, isStatic, key, this, arguments, var=var): + var = Scope({u'isStatic':isStatic, u'startLoc':startLoc, u'key':key, u'this':this, u'startPos':startPos, u'arguments':arguments}, var) + var.registers([u'node', u'key', u'startPos', u'isStatic', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseObjectTypeMethodish', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc')))) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u'node').put(u'key', var.get(u'key')) + var.get(u'node').put(u'optional', Js(False)) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeProperty')) + PyJs_anonymous_3101_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeMethod', PyJs_anonymous_3101_) + @Js + def PyJs_anonymous_3102_(node, isStatic, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'isStatic':isStatic, u'arguments':arguments}, var) + var.registers([u'node', u'valueNode', u'isStatic']) + var.put(u'valueNode', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseObjectTypeMethodish', var.get(u'valueNode'))) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeCallProperty')) + PyJs_anonymous_3102_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectTypeCallProperty', PyJs_anonymous_3102_) + @Js + def PyJs_anonymous_3103_(allowStatic, allowExact, this, arguments, var=var): + var = Scope({u'this':this, u'allowExact':allowExact, u'arguments':arguments, u'allowStatic':allowStatic}, var) + var.registers([u'node', u'isStatic', u'nodeStart', u'variancePos', u'propertyKey', u'endDelim', u'oldInType', u'optional', u'startLoc', u'variance', u'startPos', u'exact', u'allowExact', u'allowStatic', u'out']) + var.put(u'oldInType', var.get(u"this").get(u'state').get(u'inType')) + var.get(u"this").get(u'state').put(u'inType', var.get(u'true')) + var.put(u'nodeStart', var.get(u"this").callprop(u'startNode')) + var.put(u'node', PyJsComma(Js(0.0), Js(None))) + var.put(u'propertyKey', PyJsComma(Js(0.0), Js(None))) + var.put(u'isStatic', Js(False)) + var.get(u'nodeStart').put(u'callProperties', Js([])) + var.get(u'nodeStart').put(u'properties', Js([])) + var.get(u'nodeStart').put(u'indexers', Js([])) + var.put(u'endDelim', PyJsComma(Js(0.0), Js(None))) + var.put(u'exact', PyJsComma(Js(0.0), Js(None))) + if (var.get(u'allowExact') and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceBarL'))): + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceBarL')) + var.put(u'endDelim', var.get(u'types').get(u'braceBarR')) + var.put(u'exact', var.get(u'true')) + else: + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'braceL')) + var.put(u'endDelim', var.get(u'types').get(u'braceR')) + var.put(u'exact', Js(False)) + var.get(u'nodeStart').put(u'exact', var.get(u'exact')) + while var.get(u"this").callprop(u'match', var.get(u'endDelim')).neg(): + var.put(u'optional', Js(False)) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + if ((var.get(u'allowStatic') and var.get(u"this").callprop(u'isContextual', Js(u'static'))) and PyJsStrictNeq(var.get(u"this").callprop(u'lookahead').get(u'type'),var.get(u'types').get(u'colon'))): + var.get(u"this").callprop(u'next') + var.put(u'isStatic', var.get(u'true')) + var.put(u'variancePos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'variance', var.get(u"this").callprop(u'flowParseVariance')) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'bracketL')): + var.get(u'nodeStart').get(u'indexers').callprop(u'push', var.get(u"this").callprop(u'flowParseObjectTypeIndexer', var.get(u'node'), var.get(u'isStatic'), var.get(u'variance'))) + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL')) or var.get(u"this").callprop(u'isRelational', Js(u'<'))): + if var.get(u'variance'): + var.get(u"this").callprop(u'unexpected', var.get(u'variancePos')) + var.get(u'nodeStart').get(u'callProperties').callprop(u'push', var.get(u"this").callprop(u'flowParseObjectTypeCallProperty', var.get(u'node'), var.get(u'allowStatic'))) + else: + var.put(u'propertyKey', var.get(u"this").callprop(u'flowParseObjectPropertyKey')) + if (var.get(u"this").callprop(u'isRelational', Js(u'<')) or var.get(u"this").callprop(u'match', var.get(u'types').get(u'parenL'))): + if var.get(u'variance'): + var.get(u"this").callprop(u'unexpected', var.get(u'variancePos')) + var.get(u'nodeStart').get(u'properties').callprop(u'push', var.get(u"this").callprop(u'flowParseObjectTypeMethod', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'isStatic'), var.get(u'propertyKey'))) + else: + if var.get(u"this").callprop(u'eat', var.get(u'types').get(u'question')): + var.put(u'optional', var.get(u'true')) + var.get(u'node').put(u'key', var.get(u'propertyKey')) + var.get(u'node').put(u'value', var.get(u"this").callprop(u'flowParseTypeInitialiser')) + var.get(u'node').put(u'optional', var.get(u'optional')) + var.get(u'node').put(u'static', var.get(u'isStatic')) + var.get(u'node').put(u'variance', var.get(u'variance')) + var.get(u"this").callprop(u'flowObjectTypeSemicolon') + var.get(u'nodeStart').get(u'properties').callprop(u'push', var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'ObjectTypeProperty'))) + var.put(u'isStatic', Js(False)) + var.get(u"this").callprop(u'expect', var.get(u'endDelim')) + var.put(u'out', var.get(u"this").callprop(u'finishNode', var.get(u'nodeStart'), Js(u'ObjectTypeAnnotation'))) + var.get(u"this").get(u'state').put(u'inType', var.get(u'oldInType')) + return var.get(u'out') + PyJs_anonymous_3103_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseObjectType', PyJs_anonymous_3103_) + @Js + def PyJs_anonymous_3104_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if (((var.get(u"this").callprop(u'eat', var.get(u'types').get(u'semi')).neg() and var.get(u"this").callprop(u'eat', var.get(u'types').get(u'comma')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceR')).neg()) and var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceBarR')).neg()): + var.get(u"this").callprop(u'unexpected') + PyJs_anonymous_3104_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowObjectTypeSemicolon', PyJs_anonymous_3104_) + @Js + def PyJs_anonymous_3105_(startPos, startLoc, id, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'id':id, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'node2', u'id', u'startLoc']) + var.put(u'startPos', (var.get(u'startPos') or var.get(u"this").get(u'state').get(u'start'))) + var.put(u'startLoc', (var.get(u'startLoc') or var.get(u"this").get(u'state').get(u'startLoc'))) + var.put(u'node', (var.get(u'id') or var.get(u"this").callprop(u'parseIdentifier'))) + while var.get(u"this").callprop(u'eat', var.get(u'types').get(u'dot')): + var.put(u'node2', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node2').put(u'qualification', var.get(u'node')) + var.get(u'node2').put(u'id', var.get(u"this").callprop(u'parseIdentifier')) + var.put(u'node', var.get(u"this").callprop(u'finishNode', var.get(u'node2'), Js(u'QualifiedTypeIdentifier'))) + return var.get(u'node') + PyJs_anonymous_3105_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseQualifiedTypeIdentifier', PyJs_anonymous_3105_) + @Js + def PyJs_anonymous_3106_(startPos, startLoc, id, this, arguments, var=var): + var = Scope({u'this':this, u'startPos':startPos, u'id':id, u'startLoc':startLoc, u'arguments':arguments}, var) + var.registers([u'node', u'startPos', u'id', u'startLoc']) + var.put(u'node', var.get(u"this").callprop(u'startNodeAt', var.get(u'startPos'), var.get(u'startLoc'))) + var.get(u'node').put(u'typeParameters', var.get(u"null")) + var.get(u'node').put(u'id', var.get(u"this").callprop(u'flowParseQualifiedTypeIdentifier', var.get(u'startPos'), var.get(u'startLoc'), var.get(u'id'))) + if var.get(u"this").callprop(u'isRelational', Js(u'<')): + var.get(u'node').put(u'typeParameters', var.get(u"this").callprop(u'flowParseTypeParameterInstantiation')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'GenericTypeAnnotation')) + PyJs_anonymous_3106_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseGenericType', PyJs_anonymous_3106_) + @Js + def PyJs_anonymous_3107_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'_typeof')) + var.get(u'node').put(u'argument', var.get(u"this").callprop(u'flowParsePrimaryType')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'TypeofTypeAnnotation')) + PyJs_anonymous_3107_._set_name(u'anonymous') + var.get(u'pp$7').put(u'flowParseTypeofType', PyJs_anonymous_3107_) + @Js + def PyJs_anonymous_3108_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.put(u'node', var.get(u"this").callprop(u'startNode')) + var.get(u'node').put(u'types', Js([])) + var.get(u"this").callprop(u'expect', var.get(u'types').get(u'bracketL')) + while ((var.get(u"this").get(u'state').get(u'pos')'),u'nbsp':Js(u'\xa0'),u'iexcl':Js(u'\xa1'),u'cent':Js(u'\xa2'),u'pound':Js(u'\xa3'),u'curren':Js(u'\xa4'),u'yen':Js(u'\xa5'),u'brvbar':Js(u'\xa6'),u'sect':Js(u'\xa7'),u'uml':Js(u'\xa8'),u'copy':Js(u'\xa9'),u'ordf':Js(u'\xaa'),u'laquo':Js(u'\xab'),u'not':Js(u'\xac'),u'shy':Js(u'\xad'),u'reg':Js(u'\xae'),u'macr':Js(u'\xaf'),u'deg':Js(u'\xb0'),u'plusmn':Js(u'\xb1'),u'sup2':Js(u'\xb2'),u'sup3':Js(u'\xb3'),u'acute':Js(u'\xb4'),u'micro':Js(u'\xb5'),u'para':Js(u'\xb6'),u'middot':Js(u'\xb7'),u'cedil':Js(u'\xb8'),u'sup1':Js(u'\xb9'),u'ordm':Js(u'\xba'),u'raquo':Js(u'\xbb'),u'frac14':Js(u'\xbc'),u'frac12':Js(u'\xbd'),u'frac34':Js(u'\xbe'),u'iquest':Js(u'\xbf'),u'Agrave':Js(u'\xc0'),u'Aacute':Js(u'\xc1'),u'Acirc':Js(u'\xc2'),u'Atilde':Js(u'\xc3'),u'Auml':Js(u'\xc4'),u'Aring':Js(u'\xc5'),u'AElig':Js(u'\xc6'),u'Ccedil':Js(u'\xc7'),u'Egrave':Js(u'\xc8'),u'Eacute':Js(u'\xc9'),u'Ecirc':Js(u'\xca'),u'Euml':Js(u'\xcb'),u'Igrave':Js(u'\xcc'),u'Iacute':Js(u'\xcd'),u'Icirc':Js(u'\xce'),u'Iuml':Js(u'\xcf'),u'ETH':Js(u'\xd0'),u'Ntilde':Js(u'\xd1'),u'Ograve':Js(u'\xd2'),u'Oacute':Js(u'\xd3'),u'Ocirc':Js(u'\xd4'),u'Otilde':Js(u'\xd5'),u'Ouml':Js(u'\xd6'),u'times':Js(u'\xd7'),u'Oslash':Js(u'\xd8'),u'Ugrave':Js(u'\xd9'),u'Uacute':Js(u'\xda'),u'Ucirc':Js(u'\xdb'),u'Uuml':Js(u'\xdc'),u'Yacute':Js(u'\xdd'),u'THORN':Js(u'\xde'),u'szlig':Js(u'\xdf'),u'agrave':Js(u'\xe0'),u'aacute':Js(u'\xe1'),u'acirc':Js(u'\xe2'),u'atilde':Js(u'\xe3'),u'auml':Js(u'\xe4'),u'aring':Js(u'\xe5'),u'aelig':Js(u'\xe6'),u'ccedil':Js(u'\xe7'),u'egrave':Js(u'\xe8'),u'eacute':Js(u'\xe9'),u'ecirc':Js(u'\xea'),u'euml':Js(u'\xeb'),u'igrave':Js(u'\xec'),u'iacute':Js(u'\xed'),u'icirc':Js(u'\xee'),u'iuml':Js(u'\xef'),u'eth':Js(u'\xf0'),u'ntilde':Js(u'\xf1'),u'ograve':Js(u'\xf2'),u'oacute':Js(u'\xf3'),u'ocirc':Js(u'\xf4'),u'otilde':Js(u'\xf5'),u'ouml':Js(u'\xf6'),u'divide':Js(u'\xf7'),u'oslash':Js(u'\xf8'),u'ugrave':Js(u'\xf9'),u'uacute':Js(u'\xfa'),u'ucirc':Js(u'\xfb'),u'uuml':Js(u'\xfc'),u'yacute':Js(u'\xfd'),u'thorn':Js(u'\xfe'),u'yuml':Js(u'\xff'),u'OElig':Js(u'\u0152'),u'oelig':Js(u'\u0153'),u'Scaron':Js(u'\u0160'),u'scaron':Js(u'\u0161'),u'Yuml':Js(u'\u0178'),u'fnof':Js(u'\u0192'),u'circ':Js(u'\u02c6'),u'tilde':Js(u'\u02dc'),u'Alpha':Js(u'\u0391'),u'Beta':Js(u'\u0392'),u'Gamma':Js(u'\u0393'),u'Delta':Js(u'\u0394'),u'Epsilon':Js(u'\u0395'),u'Zeta':Js(u'\u0396'),u'Eta':Js(u'\u0397'),u'Theta':Js(u'\u0398'),u'Iota':Js(u'\u0399'),u'Kappa':Js(u'\u039a'),u'Lambda':Js(u'\u039b'),u'Mu':Js(u'\u039c'),u'Nu':Js(u'\u039d'),u'Xi':Js(u'\u039e'),u'Omicron':Js(u'\u039f'),u'Pi':Js(u'\u03a0'),u'Rho':Js(u'\u03a1'),u'Sigma':Js(u'\u03a3'),u'Tau':Js(u'\u03a4'),u'Upsilon':Js(u'\u03a5'),u'Phi':Js(u'\u03a6'),u'Chi':Js(u'\u03a7'),u'Psi':Js(u'\u03a8'),u'Omega':Js(u'\u03a9'),u'alpha':Js(u'\u03b1'),u'beta':Js(u'\u03b2'),u'gamma':Js(u'\u03b3'),u'delta':Js(u'\u03b4'),u'epsilon':Js(u'\u03b5'),u'zeta':Js(u'\u03b6'),u'eta':Js(u'\u03b7'),u'theta':Js(u'\u03b8'),u'iota':Js(u'\u03b9'),u'kappa':Js(u'\u03ba'),u'lambda':Js(u'\u03bb'),u'mu':Js(u'\u03bc'),u'nu':Js(u'\u03bd'),u'xi':Js(u'\u03be'),u'omicron':Js(u'\u03bf'),u'pi':Js(u'\u03c0'),u'rho':Js(u'\u03c1'),u'sigmaf':Js(u'\u03c2'),u'sigma':Js(u'\u03c3'),u'tau':Js(u'\u03c4'),u'upsilon':Js(u'\u03c5'),u'phi':Js(u'\u03c6'),u'chi':Js(u'\u03c7'),u'psi':Js(u'\u03c8'),u'omega':Js(u'\u03c9'),u'thetasym':Js(u'\u03d1'),u'upsih':Js(u'\u03d2'),u'piv':Js(u'\u03d6'),u'ensp':Js(u'\u2002'),u'emsp':Js(u'\u2003'),u'thinsp':Js(u'\u2009'),u'zwnj':Js(u'\u200c'),u'zwj':Js(u'\u200d'),u'lrm':Js(u'\u200e'),u'rlm':Js(u'\u200f'),u'ndash':Js(u'\u2013'),u'mdash':Js(u'\u2014'),u'lsquo':Js(u'\u2018'),u'rsquo':Js(u'\u2019'),u'sbquo':Js(u'\u201a'),u'ldquo':Js(u'\u201c'),u'rdquo':Js(u'\u201d'),u'bdquo':Js(u'\u201e'),u'dagger':Js(u'\u2020'),u'Dagger':Js(u'\u2021'),u'bull':Js(u'\u2022'),u'hellip':Js(u'\u2026'),u'permil':Js(u'\u2030'),u'prime':Js(u'\u2032'),u'Prime':Js(u'\u2033'),u'lsaquo':Js(u'\u2039'),u'rsaquo':Js(u'\u203a'),u'oline':Js(u'\u203e'),u'frasl':Js(u'\u2044'),u'euro':Js(u'\u20ac'),u'image':Js(u'\u2111'),u'weierp':Js(u'\u2118'),u'real':Js(u'\u211c'),u'trade':Js(u'\u2122'),u'alefsym':Js(u'\u2135'),u'larr':Js(u'\u2190'),u'uarr':Js(u'\u2191'),u'rarr':Js(u'\u2192'),u'darr':Js(u'\u2193'),u'harr':Js(u'\u2194'),u'crarr':Js(u'\u21b5'),u'lArr':Js(u'\u21d0'),u'uArr':Js(u'\u21d1'),u'rArr':Js(u'\u21d2'),u'dArr':Js(u'\u21d3'),u'hArr':Js(u'\u21d4'),u'forall':Js(u'\u2200'),u'part':Js(u'\u2202'),u'exist':Js(u'\u2203'),u'empty':Js(u'\u2205'),u'nabla':Js(u'\u2207'),u'isin':Js(u'\u2208'),u'notin':Js(u'\u2209'),u'ni':Js(u'\u220b'),u'prod':Js(u'\u220f'),u'sum':Js(u'\u2211'),u'minus':Js(u'\u2212'),u'lowast':Js(u'\u2217'),u'radic':Js(u'\u221a'),u'prop':Js(u'\u221d'),u'infin':Js(u'\u221e'),u'ang':Js(u'\u2220'),u'and':Js(u'\u2227'),u'or':Js(u'\u2228'),u'cap':Js(u'\u2229'),u'cup':Js(u'\u222a'),u'int':Js(u'\u222b'),u'there4':Js(u'\u2234'),u'sim':Js(u'\u223c'),u'cong':Js(u'\u2245'),u'asymp':Js(u'\u2248'),u'ne':Js(u'\u2260'),u'equiv':Js(u'\u2261'),u'le':Js(u'\u2264'),u'ge':Js(u'\u2265'),u'sub':Js(u'\u2282'),u'sup':Js(u'\u2283'),u'nsub':Js(u'\u2284'),u'sube':Js(u'\u2286'),u'supe':Js(u'\u2287'),u'oplus':Js(u'\u2295'),u'otimes':Js(u'\u2297'),u'perp':Js(u'\u22a5'),u'sdot':Js(u'\u22c5'),u'lceil':Js(u'\u2308'),u'rceil':Js(u'\u2309'),u'lfloor':Js(u'\u230a'),u'rfloor':Js(u'\u230b'),u'lang':Js(u'\u2329'),u'rang':Js(u'\u232a'),u'loz':Js(u'\u25ca'),u'spades':Js(u'\u2660'),u'clubs':Js(u'\u2663'),u'hearts':Js(u'\u2665'),u'diams':Js(u'\u2666')}) + var.put(u'XHTMLEntities', PyJs_Object_3194_) + var.put(u'HEX_NUMBER', JsRegExp(u'/^[\\da-fA-F]+$/')) + var.put(u'DECIMAL_NUMBER', JsRegExp(u'/^\\d+$/')) + var.get(u'types$1').put(u'j_oTag', var.get(u'TokContext').create(Js(u'...'), var.get(u'true'), var.get(u'true'))) + var.get(u'types').put(u'jsxName', var.get(u'TokenType').create(Js(u'jsxName'))) + PyJs_Object_3195_ = Js({u'beforeExpr':var.get(u'true')}) + var.get(u'types').put(u'jsxText', var.get(u'TokenType').create(Js(u'jsxText'), PyJs_Object_3195_)) + PyJs_Object_3196_ = Js({u'startsExpr':var.get(u'true')}) + var.get(u'types').put(u'jsxTagStart', var.get(u'TokenType').create(Js(u'jsxTagStart'), PyJs_Object_3196_)) + var.get(u'types').put(u'jsxTagEnd', var.get(u'TokenType').create(Js(u'jsxTagEnd'))) + @Js + def PyJs_anonymous_3197_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'j_expr')) + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'j_oTag')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + PyJs_anonymous_3197_._set_name(u'anonymous') + var.get(u'types').get(u'jsxTagStart').put(u'updateContext', PyJs_anonymous_3197_) + @Js + def PyJs_anonymous_3198_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'prevType', u'out']) + var.put(u'out', var.get(u"this").get(u'state').get(u'context').callprop(u'pop')) + if ((PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'j_oTag')) and PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'slash'))) or PyJsStrictEq(var.get(u'out'),var.get(u'types$1').get(u'j_cTag'))): + var.get(u"this").get(u'state').get(u'context').callprop(u'pop') + var.get(u"this").get(u'state').put(u'exprAllowed', PyJsStrictEq(var.get(u"this").callprop(u'curContext'),var.get(u'types$1').get(u'j_expr'))) + else: + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + PyJs_anonymous_3198_._set_name(u'anonymous') + var.get(u'types').get(u'jsxTagEnd').put(u'updateContext', PyJs_anonymous_3198_) + var.put(u'pp$8', var.get(u'Parser').get(u'prototype')) + @Js + def PyJs_anonymous_3199_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'ch', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated JSX contents')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(60.0)): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(123.0)): + SWITCHED = True + if PyJsStrictEq(var.get(u"this").get(u'state').get(u'pos'),var.get(u"this").get(u'state').get(u'start')): + if (PyJsStrictEq(var.get(u'ch'),Js(60.0)) and var.get(u"this").get(u'state').get(u'exprAllowed')): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxTagStart')) + return var.get(u"this").callprop(u'getTokenFromCode', var.get(u'ch')) + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxText'), var.get(u'out')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(38.0)): + SWITCHED = True + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadEntity'), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + break + if True: + SWITCHED = True + if var.get(u'isNewLine')(var.get(u'ch')): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadNewLine', var.get(u'true')), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + SWITCHED = True + break + + PyJs_anonymous_3199_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadToken', PyJs_anonymous_3199_) + @Js + def PyJs_anonymous_3200_(normalizeCRLF, this, arguments, var=var): + var = Scope({u'this':this, u'normalizeCRLF':normalizeCRLF, u'arguments':arguments}, var) + var.registers([u'ch', u'normalizeCRLF', u'out']) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'out', PyJsComma(Js(0.0), Js(None))) + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + if (PyJsStrictEq(var.get(u'ch'),Js(13.0)) and PyJsStrictEq(var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos')),Js(10.0))): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + var.put(u'out', (Js(u'\n') if var.get(u'normalizeCRLF') else Js(u'\r\n'))) + else: + var.put(u'out', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch'))) + var.get(u"this").get(u'state').put(u'curLine',Js(var.get(u"this").get(u'state').get(u'curLine').to_number())+Js(1)) + var.get(u"this").get(u'state').put(u'lineStart', var.get(u"this").get(u'state').get(u'pos')) + return var.get(u'out') + PyJs_anonymous_3200_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadNewLine', PyJs_anonymous_3200_) + @Js + def PyJs_anonymous_3201_(quote, this, arguments, var=var): + var = Scope({u'this':this, u'quote':quote, u'arguments':arguments}, var) + var.registers([u'ch', u'quote', u'chunkStart', u'out']) + var.put(u'out', Js(u'')) + var.put(u'chunkStart', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + #for JS loop + + while 1: + if (var.get(u"this").get(u'state').get(u'pos')>=var.get(u"this").get(u'input').get(u'length')): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Unterminated string constant')) + var.put(u'ch', var.get(u"this").get(u'input').callprop(u'charCodeAt', var.get(u"this").get(u'state').get(u'pos'))) + if PyJsStrictEq(var.get(u'ch'),var.get(u'quote')): + break + if PyJsStrictEq(var.get(u'ch'),Js(38.0)): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadEntity'), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + if var.get(u'isNewLine')(var.get(u'ch')): + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), var.get(u"this").get(u'state').get(u'pos')), u'+') + var.put(u'out', var.get(u"this").callprop(u'jsxReadNewLine', Js(False)), u'+') + var.put(u'chunkStart', var.get(u"this").get(u'state').get(u'pos')) + else: + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + + var.put(u'out', var.get(u"this").get(u'input').callprop(u'slice', var.get(u'chunkStart'), (var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))-Js(1))), u'+') + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'string'), var.get(u'out')) + PyJs_anonymous_3201_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxReadString', PyJs_anonymous_3201_) + @Js + def PyJs_anonymous_3202_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'count', u'startPos', u'ch', u'str', u'entity']) + var.put(u'str', Js(u'')) + var.put(u'count', Js(0.0)) + var.put(u'entity', PyJsComma(Js(0.0), Js(None))) + var.put(u'ch', var.get(u"this").get(u'input').get(var.get(u"this").get(u'state').get(u'pos'))) + var.put(u'startPos', var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1))) + while ((var.get(u"this").get(u'state').get(u'pos')'))) + var.get(u'node').put(u'openingElement', var.get(u'openingElement')) + var.get(u'node').put(u'closingElement', var.get(u'closingElement')) + var.get(u'node').put(u'children', var.get(u'children')) + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'relational')) and PyJsStrictEq(var.get(u"this").get(u'state').get(u'value'),Js(u'<'))): + var.get(u"this").callprop(u'raise', var.get(u"this").get(u'state').get(u'start'), Js(u'Adjacent JSX elements must be wrapped in an enclosing tag')) + return var.get(u"this").callprop(u'finishNode', var.get(u'node'), Js(u'JSXElement')) + PyJs_anonymous_3214_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseElementAt', PyJs_anonymous_3214_) + @Js + def PyJs_anonymous_3215_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'startPos', u'startLoc']) + var.put(u'startPos', var.get(u"this").get(u'state').get(u'start')) + var.put(u'startLoc', var.get(u"this").get(u'state').get(u'startLoc')) + var.get(u"this").callprop(u'next') + return var.get(u"this").callprop(u'jsxParseElementAt', var.get(u'startPos'), var.get(u'startLoc')) + PyJs_anonymous_3215_._set_name(u'anonymous') + var.get(u'pp$8').put(u'jsxParseElement', PyJs_anonymous_3215_) + @Js + def PyJs_anonymous_3216_(instance, this, arguments, var=var): + var = Scope({u'this':this, u'instance':instance, u'arguments':arguments}, var) + var.registers([u'instance']) + @Js + def PyJs_anonymous_3217_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3218_(refShortHandDefaultPos, this, arguments, var=var): + var = Scope({u'this':this, u'refShortHandDefaultPos':refShortHandDefaultPos, u'arguments':arguments}, var) + var.registers([u'node', u'refShortHandDefaultPos']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxText')): + var.put(u'node', var.get(u"this").callprop(u'parseLiteral', var.get(u"this").get(u'state').get(u'value'), Js(u'JSXText'))) + var.get(u'node').put(u'extra', var.get(u"null")) + return var.get(u'node') + else: + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'jsxTagStart')): + return var.get(u"this").callprop(u'jsxParseElement') + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'refShortHandDefaultPos')) + PyJs_anonymous_3218_._set_name(u'anonymous') + return PyJs_anonymous_3218_ + PyJs_anonymous_3217_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'parseExprAtom'), PyJs_anonymous_3217_) + @Js + def PyJs_anonymous_3219_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3220_(code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'arguments':arguments}, var) + var.registers([u'code', u'context']) + var.put(u'context', var.get(u"this").callprop(u'curContext')) + if PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_expr')): + return var.get(u"this").callprop(u'jsxReadToken') + if (PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_oTag')) or PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_cTag'))): + if var.get(u'isIdentifierStart')(var.get(u'code')): + return var.get(u"this").callprop(u'jsxReadWord') + if PyJsStrictEq(var.get(u'code'),Js(62.0)): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxTagEnd')) + if ((PyJsStrictEq(var.get(u'code'),Js(34.0)) or PyJsStrictEq(var.get(u'code'),Js(39.0))) and PyJsStrictEq(var.get(u'context'),var.get(u'types$1').get(u'j_oTag'))): + return var.get(u"this").callprop(u'jsxReadString', var.get(u'code')) + if (PyJsStrictEq(var.get(u'code'),Js(60.0)) and var.get(u"this").get(u'state').get(u'exprAllowed')): + var.get(u"this").get(u'state').put(u'pos',Js(var.get(u"this").get(u'state').get(u'pos').to_number())+Js(1)) + return var.get(u"this").callprop(u'finishToken', var.get(u'types').get(u'jsxTagStart')) + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'code')) + PyJs_anonymous_3220_._set_name(u'anonymous') + return PyJs_anonymous_3220_ + PyJs_anonymous_3219_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'readToken'), PyJs_anonymous_3219_) + @Js + def PyJs_anonymous_3221_(inner, this, arguments, var=var): + var = Scope({u'this':this, u'inner':inner, u'arguments':arguments}, var) + var.registers([u'inner']) + @Js + def PyJs_anonymous_3222_(prevType, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'prevType':prevType}, var) + var.registers([u'curContext', u'prevType']) + if var.get(u"this").callprop(u'match', var.get(u'types').get(u'braceL')): + var.put(u'curContext', var.get(u"this").callprop(u'curContext')) + if PyJsStrictEq(var.get(u'curContext'),var.get(u'types$1').get(u'j_oTag')): + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'braceExpression')) + else: + if PyJsStrictEq(var.get(u'curContext'),var.get(u'types$1').get(u'j_expr')): + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'templateQuasi')) + else: + var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'prevType')) + var.get(u"this").get(u'state').put(u'exprAllowed', var.get(u'true')) + else: + if (var.get(u"this").callprop(u'match', var.get(u'types').get(u'slash')) and PyJsStrictEq(var.get(u'prevType'),var.get(u'types').get(u'jsxTagStart'))): + var.get(u"this").get(u'state').get(u'context').put(u'length', Js(2.0), u'-') + var.get(u"this").get(u'state').get(u'context').callprop(u'push', var.get(u'types$1').get(u'j_cTag')) + var.get(u"this").get(u'state').put(u'exprAllowed', Js(False)) + else: + return var.get(u'inner').callprop(u'call', var.get(u"this"), var.get(u'prevType')) + PyJs_anonymous_3222_._set_name(u'anonymous') + return PyJs_anonymous_3222_ + PyJs_anonymous_3221_._set_name(u'anonymous') + var.get(u'instance').callprop(u'extend', Js(u'updateContext'), PyJs_anonymous_3221_) + PyJs_anonymous_3216_._set_name(u'anonymous') + var.put(u'jsxPlugin', PyJs_anonymous_3216_) + var.get(u'plugins').put(u'flow', var.get(u'flowPlugin')) + var.get(u'plugins').put(u'jsx', var.get(u'jsxPlugin')) + pass + var.get(u'exports').put(u'parse', var.get(u'parse$1')) + var.get(u'exports').put(u'tokTypes', var.get(u'types')) +PyJs_anonymous_2842_._set_name(u'anonymous') +PyJs_Object_3223_ = Js({}) +@Js +def PyJs_anonymous_3224_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'maybeMatch', u'require', u'module', u'range', u'balanced']) + @Js + def PyJsHoisted_balanced_(a, b, str, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments, u'str':str}, var) + var.registers([u'a', u'r', u'b', u'str']) + if var.get(u'a').instanceof(var.get(u'RegExp')): + var.put(u'a', var.get(u'maybeMatch')(var.get(u'a'), var.get(u'str'))) + if var.get(u'b').instanceof(var.get(u'RegExp')): + var.put(u'b', var.get(u'maybeMatch')(var.get(u'b'), var.get(u'str'))) + var.put(u'r', var.get(u'range')(var.get(u'a'), var.get(u'b'), var.get(u'str'))) + PyJs_Object_3225_ = Js({u'start':var.get(u'r').get(u'0'),u'end':var.get(u'r').get(u'1'),u'pre':var.get(u'str').callprop(u'slice', Js(0.0), var.get(u'r').get(u'0')),u'body':var.get(u'str').callprop(u'slice', (var.get(u'r').get(u'0')+var.get(u'a').get(u'length')), var.get(u'r').get(u'1')),u'post':var.get(u'str').callprop(u'slice', (var.get(u'r').get(u'1')+var.get(u'b').get(u'length')))}) + return (var.get(u'r') and PyJs_Object_3225_) + PyJsHoisted_balanced_.func_name = u'balanced' + var.put(u'balanced', PyJsHoisted_balanced_) + @Js + def PyJsHoisted_range_(a, b, str, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'b':b, u'arguments':arguments, u'str':str}, var) + var.registers([u'a', u'right', u'ai', u'beg', u'bi', u'i', u'b', u'result', u'str', u'begs', u'left']) + pass + var.put(u'ai', var.get(u'str').callprop(u'indexOf', var.get(u'a'))) + var.put(u'bi', var.get(u'str').callprop(u'indexOf', var.get(u'b'), (var.get(u'ai')+Js(1.0)))) + var.put(u'i', var.get(u'ai')) + if ((var.get(u'ai')>=Js(0.0)) and (var.get(u'bi')>Js(0.0))): + var.put(u'begs', Js([])) + var.put(u'left', var.get(u'str').get(u'length')) + while ((var.get(u'i')>=Js(0.0)) and var.get(u'result').neg()): + if (var.get(u'i')==var.get(u'ai')): + var.get(u'begs').callprop(u'push', var.get(u'i')) + var.put(u'ai', var.get(u'str').callprop(u'indexOf', var.get(u'a'), (var.get(u'i')+Js(1.0)))) + else: + if (var.get(u'begs').get(u'length')==Js(1.0)): + var.put(u'result', Js([var.get(u'begs').callprop(u'pop'), var.get(u'bi')])) + else: + var.put(u'beg', var.get(u'begs').callprop(u'pop')) + if (var.get(u'beg')=Js(0.0))) else var.get(u'bi'))) + if var.get(u'begs').get(u'length'): + var.put(u'result', Js([var.get(u'left'), var.get(u'right')])) + return var.get(u'result') + PyJsHoisted_range_.func_name = u'range' + var.put(u'range', PyJsHoisted_range_) + @Js + def PyJsHoisted_maybeMatch_(reg, str, this, arguments, var=var): + var = Scope({u'this':this, u'reg':reg, u'str':str, u'arguments':arguments}, var) + var.registers([u'm', u'reg', u'str']) + var.put(u'm', var.get(u'str').callprop(u'match', var.get(u'reg'))) + return (var.get(u'm').get(u'0') if var.get(u'm') else var.get(u"null")) + PyJsHoisted_maybeMatch_.func_name = u'maybeMatch' + var.put(u'maybeMatch', PyJsHoisted_maybeMatch_) + var.get(u'module').put(u'exports', var.get(u'balanced')) + pass + pass + var.get(u'balanced').put(u'range', var.get(u'range')) + pass +PyJs_anonymous_3224_._set_name(u'anonymous') +PyJs_Object_3226_ = Js({}) +@Js +def PyJs_anonymous_3227_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'escComma', u'escapeBraces', u'exports', u'escOpen', u'escPeriod', u'module', u'expandTop', u'escClose', u'isPadded', u'numeric', u'lte', u'unescapeBraces', u'concatMap', u'embrace', u'expand', u'escSlash', u'balanced', u'parseCommaParts', u'require', u'identity', u'gte']) + @Js + def PyJsHoisted_escapeBraces_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'str').callprop(u'split', Js(u'\\\\')).callprop(u'join', var.get(u'escSlash')).callprop(u'split', Js(u'\\{')).callprop(u'join', var.get(u'escOpen')).callprop(u'split', Js(u'\\}')).callprop(u'join', var.get(u'escClose')).callprop(u'split', Js(u'\\,')).callprop(u'join', var.get(u'escComma')).callprop(u'split', Js(u'\\.')).callprop(u'join', var.get(u'escPeriod')) + PyJsHoisted_escapeBraces_.func_name = u'escapeBraces' + var.put(u'escapeBraces', PyJsHoisted_escapeBraces_) + @Js + def PyJsHoisted_lte_(i, y, this, arguments, var=var): + var = Scope({u'i':i, u'y':y, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'y']) + return (var.get(u'i')<=var.get(u'y')) + PyJsHoisted_lte_.func_name = u'lte' + var.put(u'lte', PyJsHoisted_lte_) + @Js + def PyJsHoisted_expandTop_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if var.get(u'str').neg(): + return Js([]) + return var.get(u'expand')(var.get(u'escapeBraces')(var.get(u'str')), var.get(u'true')).callprop(u'map', var.get(u'unescapeBraces')) + PyJsHoisted_expandTop_.func_name = u'expandTop' + var.put(u'expandTop', PyJsHoisted_expandTop_) + @Js + def PyJsHoisted_numeric_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return (var.get(u'parseInt')(var.get(u'str'), Js(10.0)) if (var.get(u'parseInt')(var.get(u'str'), Js(10.0))==var.get(u'str')) else var.get(u'str').callprop(u'charCodeAt', Js(0.0))) + PyJsHoisted_numeric_.func_name = u'numeric' + var.put(u'numeric', PyJsHoisted_numeric_) + @Js + def PyJsHoisted_unescapeBraces_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return var.get(u'str').callprop(u'split', var.get(u'escSlash')).callprop(u'join', Js(u'\\')).callprop(u'split', var.get(u'escOpen')).callprop(u'join', Js(u'{')).callprop(u'split', var.get(u'escClose')).callprop(u'join', Js(u'}')).callprop(u'split', var.get(u'escComma')).callprop(u'join', Js(u',')).callprop(u'split', var.get(u'escPeriod')).callprop(u'join', Js(u'.')) + PyJsHoisted_unescapeBraces_.func_name = u'unescapeBraces' + var.put(u'unescapeBraces', PyJsHoisted_unescapeBraces_) + @Js + def PyJsHoisted_embrace_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return ((Js(u'{')+var.get(u'str'))+Js(u'}')) + PyJsHoisted_embrace_.func_name = u'embrace' + var.put(u'embrace', PyJsHoisted_embrace_) + @Js + def PyJsHoisted_expand_(str, isTop, this, arguments, var=var): + var = Scope({u'this':this, u'isTop':isTop, u'arguments':arguments, u'str':str}, var) + var.registers([u'pre', u'm', u'isTop', u'need', u'incr', u'width', u'pad', u'test', u'isAlphaSequence', u'isSequence', u'expansion', u'N', u'post', u'c', u'isOptions', u'reverse', u'i', u'k', u'j', u'expansions', u'n', u'str', u'isNumericSequence', u'y', u'x', u'z']) + var.put(u'expansions', Js([])) + var.put(u'm', var.get(u'balanced')(Js(u'{'), Js(u'}'), var.get(u'str'))) + if (var.get(u'm').neg() or JsRegExp(u'/\\$$/').callprop(u'test', var.get(u'm').get(u'pre'))): + return Js([var.get(u'str')]) + var.put(u'isNumericSequence', JsRegExp(u'/^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/').callprop(u'test', var.get(u'm').get(u'body'))) + var.put(u'isAlphaSequence', JsRegExp(u'/^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/').callprop(u'test', var.get(u'm').get(u'body'))) + var.put(u'isSequence', (var.get(u'isNumericSequence') or var.get(u'isAlphaSequence'))) + var.put(u'isOptions', JsRegExp(u'/^(.*,)+(.+)?$/').callprop(u'test', var.get(u'm').get(u'body'))) + if (var.get(u'isSequence').neg() and var.get(u'isOptions').neg()): + if var.get(u'm').get(u'post').callprop(u'match', JsRegExp(u'/,.*\\}/')): + var.put(u'str', ((((var.get(u'm').get(u'pre')+Js(u'{'))+var.get(u'm').get(u'body'))+var.get(u'escClose'))+var.get(u'm').get(u'post'))) + return var.get(u'expand')(var.get(u'str')) + return Js([var.get(u'str')]) + pass + if var.get(u'isSequence'): + var.put(u'n', var.get(u'm').get(u'body').callprop(u'split', JsRegExp(u'/\\.\\./'))) + else: + var.put(u'n', var.get(u'parseCommaParts')(var.get(u'm').get(u'body'))) + if PyJsStrictEq(var.get(u'n').get(u'length'),Js(1.0)): + var.put(u'n', var.get(u'expand')(var.get(u'n').get(u'0'), Js(False)).callprop(u'map', var.get(u'embrace'))) + if PyJsStrictEq(var.get(u'n').get(u'length'),Js(1.0)): + var.put(u'post', (var.get(u'expand')(var.get(u'm').get(u'post'), Js(False)) if var.get(u'm').get(u'post').get(u'length') else Js([Js(u'')]))) + @Js + def PyJs_anonymous_3228_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return ((var.get(u'm').get(u'pre')+var.get(u'n').get(u'0'))+var.get(u'p')) + PyJs_anonymous_3228_._set_name(u'anonymous') + return var.get(u'post').callprop(u'map', PyJs_anonymous_3228_) + var.put(u'pre', var.get(u'm').get(u'pre')) + var.put(u'post', (var.get(u'expand')(var.get(u'm').get(u'post'), Js(False)) if var.get(u'm').get(u'post').get(u'length') else Js([Js(u'')]))) + pass + if var.get(u'isSequence'): + var.put(u'x', var.get(u'numeric')(var.get(u'n').get(u'0'))) + var.put(u'y', var.get(u'numeric')(var.get(u'n').get(u'1'))) + var.put(u'width', var.get(u'Math').callprop(u'max', var.get(u'n').get(u'0').get(u'length'), var.get(u'n').get(u'1').get(u'length'))) + var.put(u'incr', (var.get(u'Math').callprop(u'abs', var.get(u'numeric')(var.get(u'n').get(u'2'))) if (var.get(u'n').get(u'length')==Js(3.0)) else Js(1.0))) + var.put(u'test', var.get(u'lte')) + var.put(u'reverse', (var.get(u'y')Js(0.0)): + var.put(u'z', var.get(u'Array').create((var.get(u'need')+Js(1.0))).callprop(u'join', Js(u'0'))) + if (var.get(u'i')=var.get(u'y')) + PyJsHoisted_gte_.func_name = u'gte' + var.put(u'gte', PyJsHoisted_gte_) + var.put(u'concatMap', var.get(u'require')(Js(u'concat-map'))) + var.put(u'balanced', var.get(u'require')(Js(u'balanced-match'))) + var.get(u'module').put(u'exports', var.get(u'expandTop')) + var.put(u'escSlash', ((Js(u'\x00SLASH')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escOpen', ((Js(u'\x00OPEN')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escClose', ((Js(u'\x00CLOSE')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escComma', ((Js(u'\x00COMMA')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + var.put(u'escPeriod', ((Js(u'\x00PERIOD')+var.get(u'Math').callprop(u'random'))+Js(u'\x00'))) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass +PyJs_anonymous_3227_._set_name(u'anonymous') +PyJs_Object_3230_ = Js({u'balanced-match':Js(263.0),u'concat-map':Js(266.0)}) +@Js +def PyJs_anonymous_3231_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3232_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'styles', u'escapeStringRegexp', u'proto', u'process', u'applyStyle', u'hasAnsi', u'isSimpleWindowsTerm', u'Chalk', u'init', u'build', u'stripAnsi', u'ansiStyles', u'supportsColor', u'defineProps']) + @Js + def PyJsHoisted_Chalk_(options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'arguments':arguments}, var) + var.registers([u'options']) + var.get(u"this").put(u'enabled', (var.get(u'supportsColor') if (var.get(u'options').neg() or PyJsStrictEq(var.get(u'options').get(u'enabled'),var.get(u'undefined'))) else var.get(u'options').get(u'enabled'))) + PyJsHoisted_Chalk_.func_name = u'Chalk' + var.put(u'Chalk', PyJsHoisted_Chalk_) + @Js + def PyJsHoisted_applyStyle_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'a', u'nestedStyles', u'i', u'args', u'originalDim', u'code', u'str', u'argsLen']) + var.put(u'args', var.get(u'arguments')) + var.put(u'argsLen', var.get(u'args').get(u'length')) + var.put(u'str', (PyJsStrictNeq(var.get(u'argsLen'),Js(0.0)) and var.get(u'String')(var.get(u'arguments').get(u'0')))) + if (var.get(u'argsLen')>Js(1.0)): + #for JS loop + var.put(u'a', Js(1.0)) + while (var.get(u'a')Js(0.0)): + try: + var.put(u'line', var.get(u'lines').get(var.get(u'i'))) + if (~var.get(u'line').callprop(u'indexOf', Js(u'sourceMappingURL=data:'))): + return var.get(u'exports').callprop(u'fromComment', var.get(u'line')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + PyJsHoisted_convertFromLargeSource_.func_name = u'convertFromLargeSource' + var.put(u'convertFromLargeSource', PyJsHoisted_convertFromLargeSource_) + @Js + def PyJsHoisted_Converter_(sm, opts, this, arguments, var=var): + var = Scope({u'this':this, u'opts':opts, u'sm':sm, u'arguments':arguments}, var) + var.registers([u'opts', u'sm']) + PyJs_Object_3251_ = Js({}) + var.put(u'opts', (var.get(u'opts') or PyJs_Object_3251_)) + if var.get(u'opts').get(u'isFileComment'): + var.put(u'sm', var.get(u'readFromFileMap')(var.get(u'sm'), var.get(u'opts').get(u'commentFileDir'))) + if var.get(u'opts').get(u'hasComment'): + var.put(u'sm', var.get(u'stripComment')(var.get(u'sm'))) + if var.get(u'opts').get(u'isEncoded'): + var.put(u'sm', var.get(u'decodeBase64')(var.get(u'sm'))) + if (var.get(u'opts').get(u'isJSON') or var.get(u'opts').get(u'isEncoded')): + var.put(u'sm', var.get(u'JSON').callprop(u'parse', var.get(u'sm'))) + var.get(u"this").put(u'sourcemap', var.get(u'sm')) + PyJsHoisted_Converter_.func_name = u'Converter' + var.put(u'Converter', PyJsHoisted_Converter_) + Js(u'use strict') + var.put(u'fs', var.get(u'require')(Js(u'fs'))) + var.put(u'path', var.get(u'require')(Js(u'path'))) + var.put(u'commentRx', JsRegExp(u'/^\\s*\\/(?:\\/|\\*)[@#]\\s+sourceMappingURL=data:(?:application|text)\\/json;(?:charset[:=]\\S+;)?base64,(.*)$/mg')) + var.put(u'mapFileCommentRx', JsRegExp(u'/(?:\\/\\/[@#][ \\t]+sourceMappingURL=([^\\s\'"]+?)[ \\t]*$)|(?:\\/\\*[@#][ \\t]+sourceMappingURL=([^\\*]+?)[ \\t]*(?:\\*\\/){1}[ \\t]*$)/mg')) + pass + pass + pass + pass + pass + @Js + def PyJs_anonymous_3252_(space, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'space':space}, var) + var.registers([u'space']) + return var.get(u'JSON').callprop(u'stringify', var.get(u"this").get(u'sourcemap'), var.get(u"null"), var.get(u'space')) + PyJs_anonymous_3252_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toJSON', PyJs_anonymous_3252_) + @Js + def PyJs_anonymous_3253_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'json']) + var.put(u'json', var.get(u"this").callprop(u'toJSON')) + return var.get(u'Buffer').create(var.get(u'json')).callprop(u'toString', Js(u'base64')) + PyJs_anonymous_3253_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toBase64', PyJs_anonymous_3253_) + @Js + def PyJs_anonymous_3254_(options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'arguments':arguments}, var) + var.registers([u'base64', u'data', u'options']) + var.put(u'base64', var.get(u"this").callprop(u'toBase64')) + var.put(u'data', (Js(u'sourceMappingURL=data:application/json;base64,')+var.get(u'base64'))) + return (((Js(u'/*# ')+var.get(u'data'))+Js(u' */')) if (var.get(u'options') and var.get(u'options').get(u'multiline')) else (Js(u'//# ')+var.get(u'data'))) + PyJs_anonymous_3254_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toComment', PyJs_anonymous_3254_) + @Js + def PyJs_anonymous_3255_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'JSON').callprop(u'parse', var.get(u"this").callprop(u'toJSON')) + PyJs_anonymous_3255_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'toObject', PyJs_anonymous_3255_) + @Js + def PyJs_anonymous_3256_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + if var.get(u"this").get(u'sourcemap').callprop(u'hasOwnProperty', var.get(u'key')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'property %s already exists on the sourcemap, use set property instead'))) + raise PyJsTempException + return var.get(u"this").callprop(u'setProperty', var.get(u'key'), var.get(u'value')) + PyJs_anonymous_3256_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'addProperty', PyJs_anonymous_3256_) + @Js + def PyJs_anonymous_3257_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + var.get(u"this").get(u'sourcemap').put(var.get(u'key'), var.get(u'value')) + return var.get(u"this") + PyJs_anonymous_3257_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'setProperty', PyJs_anonymous_3257_) + @Js + def PyJs_anonymous_3258_(key, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'key':key}, var) + var.registers([u'key']) + return var.get(u"this").get(u'sourcemap').get(var.get(u'key')) + PyJs_anonymous_3258_._set_name(u'anonymous') + var.get(u'Converter').get(u'prototype').put(u'getProperty', PyJs_anonymous_3258_) + @Js + def PyJs_anonymous_3259_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return var.get(u'Converter').create(var.get(u'obj')) + PyJs_anonymous_3259_._set_name(u'anonymous') + var.get(u'exports').put(u'fromObject', PyJs_anonymous_3259_) + @Js + def PyJs_anonymous_3260_(json, this, arguments, var=var): + var = Scope({u'this':this, u'json':json, u'arguments':arguments}, var) + var.registers([u'json']) + PyJs_Object_3261_ = Js({u'isJSON':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'json'), PyJs_Object_3261_) + PyJs_anonymous_3260_._set_name(u'anonymous') + var.get(u'exports').put(u'fromJSON', PyJs_anonymous_3260_) + @Js + def PyJs_anonymous_3262_(base64, this, arguments, var=var): + var = Scope({u'this':this, u'base64':base64, u'arguments':arguments}, var) + var.registers([u'base64']) + PyJs_Object_3263_ = Js({u'isEncoded':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'base64'), PyJs_Object_3263_) + PyJs_anonymous_3262_._set_name(u'anonymous') + var.get(u'exports').put(u'fromBase64', PyJs_anonymous_3262_) + @Js + def PyJs_anonymous_3264_(comment, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments}, var) + var.registers([u'comment']) + var.put(u'comment', var.get(u'comment').callprop(u'replace', JsRegExp(u'/^\\/\\*/g'), Js(u'//')).callprop(u'replace', JsRegExp(u'/\\*\\/$/g'), Js(u''))) + PyJs_Object_3265_ = Js({u'isEncoded':var.get(u'true'),u'hasComment':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'comment'), PyJs_Object_3265_) + PyJs_anonymous_3264_._set_name(u'anonymous') + var.get(u'exports').put(u'fromComment', PyJs_anonymous_3264_) + @Js + def PyJs_anonymous_3266_(comment, dir, this, arguments, var=var): + var = Scope({u'comment':comment, u'this':this, u'arguments':arguments, u'dir':dir}, var) + var.registers([u'comment', u'dir']) + PyJs_Object_3267_ = Js({u'commentFileDir':var.get(u'dir'),u'isFileComment':var.get(u'true'),u'isJSON':var.get(u'true')}) + return var.get(u'Converter').create(var.get(u'comment'), PyJs_Object_3267_) + PyJs_anonymous_3266_._set_name(u'anonymous') + var.get(u'exports').put(u'fromMapFileComment', PyJs_anonymous_3266_) + @Js + def PyJs_anonymous_3268_(content, largeSource, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'largeSource':largeSource, u'arguments':arguments}, var) + var.registers([u'content', u'res', u'm', u'largeSource']) + if var.get(u'largeSource'): + var.put(u'res', var.get(u'convertFromLargeSource')(var.get(u'content'))) + return (var.get(u'res') if var.get(u'res') else var.get(u"null")) + var.put(u'm', var.get(u'content').callprop(u'match', var.get(u'commentRx'))) + var.get(u'commentRx').put(u'lastIndex', Js(0.0)) + return (var.get(u'exports').callprop(u'fromComment', var.get(u'm').callprop(u'pop')) if var.get(u'm') else var.get(u"null")) + PyJs_anonymous_3268_._set_name(u'anonymous') + var.get(u'exports').put(u'fromSource', PyJs_anonymous_3268_) + @Js + def PyJs_anonymous_3269_(content, dir, this, arguments, var=var): + var = Scope({u'content':content, u'this':this, u'arguments':arguments, u'dir':dir}, var) + var.registers([u'content', u'm', u'dir']) + var.put(u'm', var.get(u'content').callprop(u'match', var.get(u'mapFileCommentRx'))) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + return (var.get(u'exports').callprop(u'fromMapFileComment', var.get(u'm').callprop(u'pop'), var.get(u'dir')) if var.get(u'm') else var.get(u"null")) + PyJs_anonymous_3269_._set_name(u'anonymous') + var.get(u'exports').put(u'fromMapFileSource', PyJs_anonymous_3269_) + @Js + def PyJs_anonymous_3270_(src, this, arguments, var=var): + var = Scope({u'this':this, u'src':src, u'arguments':arguments}, var) + var.registers([u'src']) + var.get(u'commentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'src').callprop(u'replace', var.get(u'commentRx'), Js(u'')) + PyJs_anonymous_3270_._set_name(u'anonymous') + var.get(u'exports').put(u'removeComments', PyJs_anonymous_3270_) + @Js + def PyJs_anonymous_3271_(src, this, arguments, var=var): + var = Scope({u'this':this, u'src':src, u'arguments':arguments}, var) + var.registers([u'src']) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'src').callprop(u'replace', var.get(u'mapFileCommentRx'), Js(u'')) + PyJs_anonymous_3271_._set_name(u'anonymous') + var.get(u'exports').put(u'removeMapFileComments', PyJs_anonymous_3271_) + @Js + def PyJs_anonymous_3272_(file, options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'file':file, u'arguments':arguments}, var) + var.registers([u'data', u'options', u'file']) + var.put(u'data', (Js(u'sourceMappingURL=')+var.get(u'file'))) + return (((Js(u'/*# ')+var.get(u'data'))+Js(u' */')) if (var.get(u'options') and var.get(u'options').get(u'multiline')) else (Js(u'//# ')+var.get(u'data'))) + PyJs_anonymous_3272_._set_name(u'anonymous') + var.get(u'exports').put(u'generateMapFileComment', PyJs_anonymous_3272_) + @Js + def PyJs_getCommentRegex_3274_(this, arguments, var=var): + var = Scope({u'this':this, u'getCommentRegex':PyJs_getCommentRegex_3274_, u'arguments':arguments}, var) + var.registers([]) + var.get(u'commentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'commentRx') + PyJs_getCommentRegex_3274_._set_name(u'getCommentRegex') + PyJs_Object_3273_ = Js({u'get':PyJs_getCommentRegex_3274_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'commentRegex'), PyJs_Object_3273_) + @Js + def PyJs_getMapFileCommentRegex_3276_(this, arguments, var=var): + var = Scope({u'this':this, u'getMapFileCommentRegex':PyJs_getMapFileCommentRegex_3276_, u'arguments':arguments}, var) + var.registers([]) + var.get(u'mapFileCommentRx').put(u'lastIndex', Js(0.0)) + return var.get(u'mapFileCommentRx') + PyJs_getMapFileCommentRegex_3276_._set_name(u'getMapFileCommentRegex') + PyJs_Object_3275_ = Js({u'get':PyJs_getMapFileCommentRegex_3276_}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'exports'), Js(u'mapFileCommentRegex'), PyJs_Object_3275_) + PyJs_anonymous_3250_._set_name(u'anonymous') + PyJs_anonymous_3250_.callprop(u'call', var.get(u"this"), var.get(u'require')(Js(u'buffer')).get(u'Buffer')) +PyJs_anonymous_3249_._set_name(u'anonymous') +PyJs_Object_3277_ = Js({u'buffer':Js(525.0),u'fs':Js(523.0),u'path':Js(530.0)}) +@Js +def PyJs_anonymous_3278_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'load', u'exports', u'log', u'formatArgs', u'require', u'module', u'localstorage', u'useColors', u'save']) + @Js + def PyJsHoisted_load_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'r']) + pass + try: + var.put(u'r', var.get(u'exports').get(u'storage').get(u'debug')) + except PyJsException as PyJsTempException: + PyJsHolder_65_27913289 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_27913289 is not None: + var.own[u'e'] = PyJsHolder_65_27913289 + else: + del var.own[u'e'] + del PyJsHolder_65_27913289 + return var.get(u'r') + PyJsHoisted_load_.func_name = u'load' + var.put(u'load', PyJsHoisted_load_) + @Js + def PyJsHoisted_log_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return ((PyJsStrictEq(Js(u'object'),var.get(u'console',throw=False).typeof()) and var.get(u'console').get(u'log')) and var.get(u'Function').get(u'prototype').get(u'apply').callprop(u'call', var.get(u'console').get(u'log'), var.get(u'console'), var.get(u'arguments'))) + PyJsHoisted_log_.func_name = u'log' + var.put(u'log', PyJsHoisted_log_) + @Js + def PyJsHoisted_formatArgs_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'useColors', u'index', u'c', u'args', u'lastC']) + var.put(u'args', var.get(u'arguments')) + var.put(u'useColors', var.get(u"this").get(u'useColors')) + var.get(u'args').put(u'0', (((((((Js(u'%c') if var.get(u'useColors') else Js(u''))+var.get(u"this").get(u'namespace'))+(Js(u' %c') if var.get(u'useColors') else Js(u' ')))+var.get(u'args').get(u'0'))+(Js(u'%c ') if var.get(u'useColors') else Js(u' ')))+Js(u'+'))+var.get(u'exports').callprop(u'humanize', var.get(u"this").get(u'diff')))) + if var.get(u'useColors').neg(): + return var.get(u'args') + var.put(u'c', (Js(u'color: ')+var.get(u"this").get(u'color'))) + var.put(u'args', Js([var.get(u'args').get(u'0'), var.get(u'c'), Js(u'color: inherit')]).callprop(u'concat', var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', var.get(u'args'), Js(1.0)))) + var.put(u'index', Js(0.0)) + var.put(u'lastC', Js(0.0)) + @Js + def PyJs_anonymous_3281_(match, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'match':match}, var) + var.registers([u'match']) + if PyJsStrictEq(Js(u'%%'),var.get(u'match')): + return var.get('undefined') + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + if PyJsStrictEq(Js(u'%c'),var.get(u'match')): + var.put(u'lastC', var.get(u'index')) + PyJs_anonymous_3281_._set_name(u'anonymous') + var.get(u'args').get(u'0').callprop(u'replace', JsRegExp(u'/%[a-z%]/g'), PyJs_anonymous_3281_) + var.get(u'args').callprop(u'splice', var.get(u'lastC'), Js(0.0), var.get(u'c')) + return var.get(u'args') + PyJsHoisted_formatArgs_.func_name = u'formatArgs' + var.put(u'formatArgs', PyJsHoisted_formatArgs_) + @Js + def PyJsHoisted_localstorage_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + try: + return var.get(u'window').get(u'localStorage') + except PyJsException as PyJsTempException: + PyJsHolder_65_8009014 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_8009014 is not None: + var.own[u'e'] = PyJsHolder_65_8009014 + else: + del var.own[u'e'] + del PyJsHolder_65_8009014 + PyJsHoisted_localstorage_.func_name = u'localstorage' + var.put(u'localstorage', PyJsHoisted_localstorage_) + @Js + def PyJsHoisted_useColors_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + def PyJs_LONG_3279_(var=var): + return ((var.get(u'document').get(u'documentElement').get(u'style').contains(Js(u'WebkitAppearance')) or (var.get(u'window').get(u'console') and (var.get(u'console').get(u'firebug') or (var.get(u'console').get(u'exception') and var.get(u'console').get(u'table'))))) or (var.get(u'navigator').get(u'userAgent').callprop(u'toLowerCase').callprop(u'match', JsRegExp(u'/firefox\\/(\\d+)/')) and (var.get(u'parseInt')(var.get(u'RegExp').get(u'$1'), Js(10.0))>=Js(31.0)))) + return PyJs_LONG_3279_() + PyJsHoisted_useColors_.func_name = u'useColors' + var.put(u'useColors', PyJsHoisted_useColors_) + @Js + def PyJsHoisted_save_(namespaces, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'namespaces':namespaces}, var) + var.registers([u'namespaces']) + try: + if (var.get(u"null")==var.get(u'namespaces')): + var.get(u'exports').get(u'storage').callprop(u'removeItem', Js(u'debug')) + else: + var.get(u'exports').get(u'storage').put(u'debug', var.get(u'namespaces')) + except PyJsException as PyJsTempException: + PyJsHolder_65_85910939 = var.own.get(u'e') + var.force_own_put(u'e', PyExceptionToJs(PyJsTempException)) + try: + pass + finally: + if PyJsHolder_65_85910939 is not None: + var.own[u'e'] = PyJsHolder_65_85910939 + else: + del var.own[u'e'] + del PyJsHolder_65_85910939 + PyJsHoisted_save_.func_name = u'save' + var.put(u'save', PyJsHoisted_save_) + var.put(u'exports', var.get(u'module').put(u'exports', var.get(u'require')(Js(u'./debug')))) + var.get(u'exports').put(u'log', var.get(u'log')) + var.get(u'exports').put(u'formatArgs', var.get(u'formatArgs')) + var.get(u'exports').put(u'save', var.get(u'save')) + var.get(u'exports').put(u'load', var.get(u'load')) + var.get(u'exports').put(u'useColors', var.get(u'useColors')) + var.get(u'exports').put(u'storage', (var.get(u'chrome').get(u'storage').get(u'local') if ((Js(u'undefined')!=var.get(u'chrome',throw=False).typeof()) and (Js(u'undefined')!=var.get(u'chrome').get(u'storage').typeof())) else var.get(u'localstorage')())) + var.get(u'exports').put(u'colors', Js([Js(u'lightseagreen'), Js(u'forestgreen'), Js(u'goldenrod'), Js(u'dodgerblue'), Js(u'darkorchid'), Js(u'crimson')])) + pass + @Js + def PyJs_anonymous_3280_(v, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'v':v}, var) + var.registers([u'v']) + return var.get(u'JSON').callprop(u'stringify', var.get(u'v')) + PyJs_anonymous_3280_._set_name(u'anonymous') + var.get(u'exports').get(u'formatters').put(u'j', PyJs_anonymous_3280_) + pass + pass + pass + pass + var.get(u'exports').callprop(u'enable', var.get(u'load')()) + pass +PyJs_anonymous_3278_._set_name(u'anonymous') +PyJs_Object_3282_ = Js({u'./debug':Js(269.0)}) +@Js +def PyJs_anonymous_3283_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'enable', u'require', u'enabled', u'selectColor', u'coerce', u'disable', u'module', u'debug', u'prevColor', u'prevTime']) + @Js + def PyJsHoisted_enable_(namespaces, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'namespaces':namespaces}, var) + var.registers([u'i', u'namespaces', u'split', u'len']) + var.get(u'exports').callprop(u'save', var.get(u'namespaces')) + var.put(u'split', (var.get(u'namespaces') or Js(u'')).callprop(u'split', JsRegExp(u'/[\\s,]+/'))) + var.put(u'len', var.get(u'split').get(u'length')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')var.get(u'maxUsed')) or (PyJsStrictEq(var.get(u'u'),var.get(u'maxUsed')) and (var.get(u'w')>var.get(u'maxWeight')))): + var.put(u'maxUsed', var.get(u'u')) + var.put(u'maxWeight', var.get(u'w')) + var.put(u'result', var.get(u'Number')(var.get(u'n'))) + return var.get(u'result') + PyJsHoisted_getMostUsed_.func_name = u'getMostUsed' + var.put(u'getMostUsed', PyJsHoisted_getMostUsed_) + Js(u'use strict') + var.put(u'repeating', var.get(u'require')(Js(u'repeating'))) + var.put(u'INDENT_RE', JsRegExp(u'/^(?:( )+|\\t+)/')) + pass + @Js + def PyJs_anonymous_3297_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'actual', u'tabs', u'amount', u'isIndent', u'current', u'indents', u'spaces', u'str', u'prev', u'type']) + if PyJsStrictNeq(var.get(u'str',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Expected a string'))) + raise PyJsTempException + var.put(u'tabs', Js(0.0)) + var.put(u'spaces', Js(0.0)) + var.put(u'prev', Js(0.0)) + PyJs_Object_3298_ = Js({}) + var.put(u'indents', PyJs_Object_3298_) + pass + pass + @Js + def PyJs_anonymous_3299_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'matches', u'diff', u'line', u'indent']) + if var.get(u'line').neg(): + return var.get('undefined') + pass + var.put(u'matches', var.get(u'line').callprop(u'match', var.get(u'INDENT_RE'))) + if var.get(u'matches').neg(): + var.put(u'indent', Js(0.0)) + else: + var.put(u'indent', var.get(u'matches').get(u'0').get(u'length')) + if var.get(u'matches').get(u'1'): + (var.put(u'spaces',Js(var.get(u'spaces').to_number())+Js(1))-Js(1)) + else: + (var.put(u'tabs',Js(var.get(u'tabs').to_number())+Js(1))-Js(1)) + var.put(u'diff', (var.get(u'indent')-var.get(u'prev'))) + var.put(u'prev', var.get(u'indent')) + if var.get(u'diff'): + var.put(u'isIndent', (var.get(u'diff')>Js(0.0))) + var.put(u'current', var.get(u'indents').get((var.get(u'diff') if var.get(u'isIndent') else (-var.get(u'diff'))))) + if var.get(u'current'): + (var.get(u'current').put(u'0',Js(var.get(u'current').get(u'0').to_number())+Js(1))-Js(1)) + else: + var.put(u'current', var.get(u'indents').put(var.get(u'diff'), Js([Js(1.0), Js(0.0)]))) + else: + if var.get(u'current'): + var.get(u'current').put(u'1', var.get(u'Number')(var.get(u'isIndent')), u'+') + PyJs_anonymous_3299_._set_name(u'anonymous') + var.get(u'str').callprop(u'split', JsRegExp(u'/\\n/g')).callprop(u'forEach', PyJs_anonymous_3299_) + var.put(u'amount', var.get(u'getMostUsed')(var.get(u'indents'))) + pass + pass + if var.get(u'amount').neg(): + var.put(u'type', var.get(u"null")) + var.put(u'actual', Js(u'')) + else: + if (var.get(u'spaces')>=var.get(u'tabs')): + var.put(u'type', Js(u'space')) + var.put(u'actual', var.get(u'repeating')(Js(u' '), var.get(u'amount'))) + else: + var.put(u'type', Js(u'tab')) + var.put(u'actual', var.get(u'repeating')(Js(u'\t'), var.get(u'amount'))) + PyJs_Object_3300_ = Js({u'amount':var.get(u'amount'),u'type':var.get(u'type'),u'indent':var.get(u'actual')}) + return PyJs_Object_3300_ + PyJs_anonymous_3297_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_3297_) +PyJs_anonymous_3296_._set_name(u'anonymous') +PyJs_Object_3301_ = Js({u'repeating':Js(507.0)}) +@Js +def PyJs_anonymous_3302_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'matchOperatorsRe', u'require', u'exports', u'module']) + Js(u'use strict') + var.put(u'matchOperatorsRe', JsRegExp(u'/[|\\\\{}()[\\]^$+*?.]/g')) + @Js + def PyJs_anonymous_3303_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if PyJsStrictNeq(var.get(u'str',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Expected a string'))) + raise PyJsTempException + return var.get(u'str').callprop(u'replace', var.get(u'matchOperatorsRe'), Js(u'\\$&')) + PyJs_anonymous_3303_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_3303_) +PyJs_anonymous_3302_._set_name(u'anonymous') +PyJs_Object_3304_ = Js({}) +@Js +def PyJs_anonymous_3305_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3306_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'isIterationStatement', u'isProblematicIfStatement', u'trailingStatement', u'isExpression', u'isSourceElement', u'isStatement']) + @Js + def PyJsHoisted_isIterationStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u'node')==var.get(u"null")): + return Js(False) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DoWhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + return var.get(u'true') + SWITCHED = True + break + return Js(False) + PyJsHoisted_isIterationStatement_.func_name = u'isIterationStatement' + var.put(u'isIterationStatement', PyJsHoisted_isIterationStatement_) + @Js + def PyJsHoisted_isProblematicIfStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'current', u'node']) + pass + if PyJsStrictNeq(var.get(u'node').get(u'type'),Js(u'IfStatement')): + return Js(False) + if (var.get(u'node').get(u'alternate')==var.get(u"null")): + return Js(False) + var.put(u'current', var.get(u'node').get(u'consequent')) + while 1: + if PyJsStrictEq(var.get(u'current').get(u'type'),Js(u'IfStatement')): + if (var.get(u'current').get(u'alternate')==var.get(u"null")): + return var.get(u'true') + var.put(u'current', var.get(u'trailingStatement')(var.get(u'current'))) + if not var.get(u'current'): + break + return Js(False) + PyJsHoisted_isProblematicIfStatement_.func_name = u'isProblematicIfStatement' + var.put(u'isProblematicIfStatement', PyJsHoisted_isProblematicIfStatement_) + @Js + def PyJsHoisted_trailingStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'IfStatement')): + SWITCHED = True + if (var.get(u'node').get(u'alternate')!=var.get(u"null")): + return var.get(u'node').get(u'alternate') + return var.get(u'node').get(u'consequent') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WithStatement')): + SWITCHED = True + return var.get(u'node').get(u'body') + SWITCHED = True + break + return var.get(u"null") + PyJsHoisted_trailingStatement_.func_name = u'trailingStatement' + var.put(u'trailingStatement', PyJsHoisted_trailingStatement_) + @Js + def PyJsHoisted_isExpression_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u'node')==var.get(u"null")): + return Js(False) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ArrayExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'AssignmentExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BinaryExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'CallExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ConditionalExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'FunctionExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Identifier')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'Literal')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LogicalExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'MemberExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'NewExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ObjectExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SequenceExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ThisExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UnaryExpression')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'UpdateExpression')): + SWITCHED = True + return var.get(u'true') + SWITCHED = True + break + return Js(False) + PyJsHoisted_isExpression_.func_name = u'isExpression' + var.put(u'isExpression', PyJsHoisted_isExpression_) + @Js + def PyJsHoisted_isSourceElement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + return (var.get(u'isStatement')(var.get(u'node')) or ((var.get(u'node')!=var.get(u"null")) and PyJsStrictEq(var.get(u'node').get(u'type'),Js(u'FunctionDeclaration')))) + PyJsHoisted_isSourceElement_.func_name = u'isSourceElement' + var.put(u'isSourceElement', PyJsHoisted_isSourceElement_) + @Js + def PyJsHoisted_isStatement_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + if (var.get(u'node')==var.get(u"null")): + return Js(False) + while 1: + SWITCHED = False + CONDITION = (var.get(u'node').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BlockStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'BreakStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ContinueStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DebuggerStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'DoWhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'EmptyStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ExpressionStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForInStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ForStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'IfStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'LabeledStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ReturnStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'SwitchStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ThrowStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'TryStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'VariableDeclaration')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WhileStatement')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'WithStatement')): + SWITCHED = True + return var.get(u'true') + SWITCHED = True + break + return Js(False) + PyJsHoisted_isStatement_.func_name = u'isStatement' + var.put(u'isStatement', PyJsHoisted_isStatement_) + Js(u'use strict') + pass + pass + pass + pass + pass + pass + PyJs_Object_3307_ = Js({u'isExpression':var.get(u'isExpression'),u'isStatement':var.get(u'isStatement'),u'isIterationStatement':var.get(u'isIterationStatement'),u'isSourceElement':var.get(u'isSourceElement'),u'isProblematicIfStatement':var.get(u'isProblematicIfStatement'),u'trailingStatement':var.get(u'trailingStatement')}) + var.get(u'module').put(u'exports', PyJs_Object_3307_) + PyJs_anonymous_3306_._set_name(u'anonymous') + PyJs_anonymous_3306_() +PyJs_anonymous_3305_._set_name(u'anonymous') +PyJs_Object_3308_ = Js({}) +@Js +def PyJs_anonymous_3309_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3310_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'isIdentifierPartES6', u'NON_ASCII_WHITESPACES', u'isIdentifierStartES5', u'fromCodePoint', u'IDENTIFIER_START', u'ES6Regex', u'ES5Regex', u'isHexDigit', u'ch', u'IDENTIFIER_PART', u'isLineTerminator', u'isDecimalDigit', u'isIdentifierStartES6', u'isIdentifierPartES5', u'isOctalDigit', u'isWhiteSpace']) + @Js + def PyJsHoisted_isIdentifierPartES6_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (var.get(u'IDENTIFIER_PART').get(var.get(u'ch')) if (var.get(u'ch')=Js(48)) and (var.get(u'ch')<=Js(55))) + PyJsHoisted_isOctalDigit_.func_name = u'isOctalDigit' + var.put(u'isOctalDigit', PyJsHoisted_isOctalDigit_) + @Js + def PyJsHoisted_isLineTerminator_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (((PyJsStrictEq(var.get(u'ch'),Js(10)) or PyJsStrictEq(var.get(u'ch'),Js(13))) or PyJsStrictEq(var.get(u'ch'),Js(8232))) or PyJsStrictEq(var.get(u'ch'),Js(8233))) + PyJsHoisted_isLineTerminator_.func_name = u'isLineTerminator' + var.put(u'isLineTerminator', PyJsHoisted_isLineTerminator_) + @Js + def PyJsHoisted_isDecimalDigit_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return ((Js(48)<=var.get(u'ch')) and (var.get(u'ch')<=Js(57))) + PyJsHoisted_isDecimalDigit_.func_name = u'isDecimalDigit' + var.put(u'isDecimalDigit', PyJsHoisted_isDecimalDigit_) + @Js + def PyJsHoisted_isIdentifierStartES6_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch']) + return (var.get(u'IDENTIFIER_START').get(var.get(u'ch')) if (var.get(u'ch')=Js(5760)) and (var.get(u'NON_ASCII_WHITESPACES').callprop(u'indexOf', var.get(u'ch'))>=Js(0.0)))) + PyJsHoisted_isWhiteSpace_.func_name = u'isWhiteSpace' + var.put(u'isWhiteSpace', PyJsHoisted_isWhiteSpace_) + Js(u'use strict') + pass + PyJs_Object_3311_ = Js({u'NonAsciiIdentifierStart':JsRegExp(u'/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/'),u'NonAsciiIdentifierPart':JsRegExp(u'/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/')}) + var.put(u'ES5Regex', PyJs_Object_3311_) + PyJs_Object_3312_ = Js({u'NonAsciiIdentifierStart':JsRegExp(u'/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]/'),u'NonAsciiIdentifierPart':JsRegExp(u'/[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDD0-\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF01-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/')}) + var.put(u'ES6Regex', PyJs_Object_3312_) + pass + pass + pass + var.put(u'NON_ASCII_WHITESPACES', Js([Js(5760), Js(6158), Js(8192), Js(8193), Js(8194), Js(8195), Js(8196), Js(8197), Js(8198), Js(8199), Js(8200), Js(8201), Js(8202), Js(8239), Js(8287), Js(12288), Js(65279)])) + pass + pass + pass + var.put(u'IDENTIFIER_START', var.get(u'Array').create(Js(128))) + #for JS loop + var.put(u'ch', Js(0.0)) + while (var.get(u'ch')=Js(97)) and (var.get(u'ch')<=Js(122))) or ((var.get(u'ch')>=Js(65)) and (var.get(u'ch')<=Js(90)))) or PyJsStrictEq(var.get(u'ch'),Js(36))) or PyJsStrictEq(var.get(u'ch'),Js(95)))) + finally: + var.put(u'ch',Js(var.get(u'ch').to_number())+Js(1)) + var.put(u'IDENTIFIER_PART', var.get(u'Array').create(Js(128))) + #for JS loop + var.put(u'ch', Js(0.0)) + while (var.get(u'ch')=Js(97)) and (var.get(u'ch')<=Js(122))) or ((var.get(u'ch')>=Js(65)) and (var.get(u'ch')<=Js(90)))) or ((var.get(u'ch')>=Js(48)) and (var.get(u'ch')<=Js(57)))) or PyJsStrictEq(var.get(u'ch'),Js(36))) or PyJsStrictEq(var.get(u'ch'),Js(95)))) + finally: + var.put(u'ch',Js(var.get(u'ch').to_number())+Js(1)) + pass + pass + pass + pass + PyJs_Object_3313_ = Js({u'isDecimalDigit':var.get(u'isDecimalDigit'),u'isHexDigit':var.get(u'isHexDigit'),u'isOctalDigit':var.get(u'isOctalDigit'),u'isWhiteSpace':var.get(u'isWhiteSpace'),u'isLineTerminator':var.get(u'isLineTerminator'),u'isIdentifierStartES5':var.get(u'isIdentifierStartES5'),u'isIdentifierPartES5':var.get(u'isIdentifierPartES5'),u'isIdentifierStartES6':var.get(u'isIdentifierStartES6'),u'isIdentifierPartES6':var.get(u'isIdentifierPartES6')}) + var.get(u'module').put(u'exports', PyJs_Object_3313_) + PyJs_anonymous_3310_._set_name(u'anonymous') + PyJs_anonymous_3310_() +PyJs_anonymous_3309_._set_name(u'anonymous') +PyJs_Object_3314_ = Js({}) +@Js +def PyJs_anonymous_3315_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_3316_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'isKeywordES6', u'isKeywordES5', u'code', u'isIdentifierNameES6', u'decodeUtf16', u'isIdentifierNameES5', u'isIdentifierES5', u'isIdentifierES6', u'isReservedWordES5', u'isReservedWordES6', u'isRestrictedWord', u'isStrictModeReservedWordES6']) + @Js + def PyJsHoisted_isKeywordES6_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + if (var.get(u'strict') and var.get(u'isStrictModeReservedWordES6')(var.get(u'id'))): + return var.get(u'true') + while 1: + SWITCHED = False + CONDITION = (var.get(u'id').get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(2.0)): + SWITCHED = True + return ((PyJsStrictEq(var.get(u'id'),Js(u'if')) or PyJsStrictEq(var.get(u'id'),Js(u'in'))) or PyJsStrictEq(var.get(u'id'),Js(u'do'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + return (((PyJsStrictEq(var.get(u'id'),Js(u'var')) or PyJsStrictEq(var.get(u'id'),Js(u'for'))) or PyJsStrictEq(var.get(u'id'),Js(u'new'))) or PyJsStrictEq(var.get(u'id'),Js(u'try'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(4.0)): + SWITCHED = True + return (((((PyJsStrictEq(var.get(u'id'),Js(u'this')) or PyJsStrictEq(var.get(u'id'),Js(u'else'))) or PyJsStrictEq(var.get(u'id'),Js(u'case'))) or PyJsStrictEq(var.get(u'id'),Js(u'void'))) or PyJsStrictEq(var.get(u'id'),Js(u'with'))) or PyJsStrictEq(var.get(u'id'),Js(u'enum'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(5.0)): + SWITCHED = True + return (((((((PyJsStrictEq(var.get(u'id'),Js(u'while')) or PyJsStrictEq(var.get(u'id'),Js(u'break'))) or PyJsStrictEq(var.get(u'id'),Js(u'catch'))) or PyJsStrictEq(var.get(u'id'),Js(u'throw'))) or PyJsStrictEq(var.get(u'id'),Js(u'const'))) or PyJsStrictEq(var.get(u'id'),Js(u'yield'))) or PyJsStrictEq(var.get(u'id'),Js(u'class'))) or PyJsStrictEq(var.get(u'id'),Js(u'super'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(6.0)): + SWITCHED = True + return (((((PyJsStrictEq(var.get(u'id'),Js(u'return')) or PyJsStrictEq(var.get(u'id'),Js(u'typeof'))) or PyJsStrictEq(var.get(u'id'),Js(u'delete'))) or PyJsStrictEq(var.get(u'id'),Js(u'switch'))) or PyJsStrictEq(var.get(u'id'),Js(u'export'))) or PyJsStrictEq(var.get(u'id'),Js(u'import'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(7.0)): + SWITCHED = True + return ((PyJsStrictEq(var.get(u'id'),Js(u'default')) or PyJsStrictEq(var.get(u'id'),Js(u'finally'))) or PyJsStrictEq(var.get(u'id'),Js(u'extends'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(8.0)): + SWITCHED = True + return ((PyJsStrictEq(var.get(u'id'),Js(u'function')) or PyJsStrictEq(var.get(u'id'),Js(u'continue'))) or PyJsStrictEq(var.get(u'id'),Js(u'debugger'))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + return PyJsStrictEq(var.get(u'id'),Js(u'instanceof')) + if True: + SWITCHED = True + return Js(False) + SWITCHED = True + break + PyJsHoisted_isKeywordES6_.func_name = u'isKeywordES6' + var.put(u'isKeywordES6', PyJsHoisted_isKeywordES6_) + @Js + def PyJsHoisted_isKeywordES5_(id, strict, this, arguments, var=var): + var = Scope({u'this':this, u'strict':strict, u'id':id, u'arguments':arguments}, var) + var.registers([u'strict', u'id']) + if (var.get(u'strict').neg() and PyJsStrictEq(var.get(u'id'),Js(u'yield'))): + return Js(False) + return var.get(u'isKeywordES6')(var.get(u'id'), var.get(u'strict')) + PyJsHoisted_isKeywordES5_.func_name = u'isKeywordES5' + var.put(u'isKeywordES5', PyJsHoisted_isKeywordES5_) + @Js + def PyJsHoisted_isIdentifierNameES6_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'ch', u'i', u'lowCh', u'id', u'iz', u'check']) + pass + if PyJsStrictEq(var.get(u'id').get(u'length'),Js(0.0)): + return Js(False) + var.put(u'check', var.get(u'code').get(u'isIdentifierStartES6')) + #for JS loop + PyJsComma(var.put(u'i', Js(0.0)),var.put(u'iz', var.get(u'id').get(u'length'))) + while (var.get(u'i')=var.get(u'iz')): + return Js(False) + var.put(u'lowCh', var.get(u'id').callprop(u'charCodeAt', var.get(u'i'))) + if ((Js(56320)<=var.get(u'lowCh')) and (var.get(u'lowCh')<=Js(57343))).neg(): + return Js(False) + var.put(u'ch', var.get(u'decodeUtf16')(var.get(u'ch'), var.get(u'lowCh'))) + if var.get(u'check')(var.get(u'ch')).neg(): + return Js(False) + var.put(u'check', var.get(u'code').get(u'isIdentifierPartES6')) + finally: + var.put(u'i',Js(var.get(u'i').to_number())+Js(1)) + return var.get(u'true') + PyJsHoisted_isIdentifierNameES6_.func_name = u'isIdentifierNameES6' + var.put(u'isIdentifierNameES6', PyJsHoisted_isIdentifierNameES6_) + @Js + def PyJsHoisted_decodeUtf16_(lead, trail, this, arguments, var=var): + var = Scope({u'this':this, u'trail':trail, u'arguments':arguments, u'lead':lead}, var) + var.registers([u'trail', u'lead']) + return ((((var.get(u'lead')-Js(55296))*Js(1024))+(var.get(u'trail')-Js(56320)))+Js(65536)) + PyJsHoisted_decodeUtf16_.func_name = u'decodeUtf16' + var.put(u'decodeUtf16', PyJsHoisted_decodeUtf16_) + @Js + def PyJsHoisted_isIdentifierNameES5_(id, this, arguments, var=var): + var = Scope({u'this':this, u'id':id, u'arguments':arguments}, var) + var.registers([u'i', u'ch', u'iz', u'id']) + pass + if PyJsStrictEq(var.get(u'id').get(u'length'),Js(0.0)): + return Js(False) + var.put(u'ch', var.get(u'id').callprop(u'charCodeAt', Js(0.0))) + if var.get(u'code').callprop(u'isIdentifierStartES5', var.get(u'ch')).neg(): + return Js(False) + #for JS loop + PyJsComma(var.put(u'i', Js(1.0)),var.put(u'iz', var.get(u'id').get(u'length'))) + while (var.get(u'i')!=?({]|\\/(?![\\/*])))))|(0[xX][\\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?)|((?!\\d)(?:(?!\\s)[$\\w\\u0080-\\uFFFF]|\\\\u[\\da-fA-F]{4}|\\\\u\\{[\\da-fA-F]{1,6}\\})+)|(--|\\+\\+|&&|\\|\\||=>|\\.{3}|(?:[+\\-\\/%&|^]|\\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\\](){}])|(\\s+)|(^$|[\\s\\S])/g')) + PyJs_LONG_3369_() + @Js + def PyJs_anonymous_3370_(match, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'match':match}, var) + var.registers([u'token', u'match']) + PyJs_Object_3371_ = Js({u'type':Js(u'invalid'),u'value':var.get(u'match').get(u'0')}) + var.put(u'token', PyJs_Object_3371_) + if var.get(u'match').get(u'1'): + PyJsComma(var.get(u'token').put(u'type', Js(u'string')),var.get(u'token').put(u'closed', (var.get(u'match').get(u'3') or var.get(u'match').get(u'4')).neg().neg())) + else: + if var.get(u'match').get(u'5'): + var.get(u'token').put(u'type', Js(u'comment')) + else: + if var.get(u'match').get(u'6'): + PyJsComma(var.get(u'token').put(u'type', Js(u'comment')),var.get(u'token').put(u'closed', var.get(u'match').get(u'7').neg().neg())) + else: + if var.get(u'match').get(u'8'): + var.get(u'token').put(u'type', Js(u'regex')) + else: + if var.get(u'match').get(u'9'): + var.get(u'token').put(u'type', Js(u'number')) + else: + if var.get(u'match').get(u'10'): + var.get(u'token').put(u'type', Js(u'name')) + else: + if var.get(u'match').get(u'11'): + var.get(u'token').put(u'type', Js(u'punctuator')) + else: + if var.get(u'match').get(u'12'): + var.get(u'token').put(u'type', Js(u'whitespace')) + return var.get(u'token') + PyJs_anonymous_3370_._set_name(u'anonymous') + var.get(u'module').get(u'exports').put(u'matchToToken', PyJs_anonymous_3370_) +PyJs_anonymous_3368_._set_name(u'anonymous') +PyJs_Object_3372_ = Js({}) +@Js +def PyJs_anonymous_3373_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3374_ = Js({}) + @Js + def PyJs_anonymous_3375_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'global']) + pass + @Js + def PyJs_anonymous_3376_(root, this, arguments, var=var): + var = Scope({u'this':this, u'root':root, u'arguments':arguments}, var) + var.registers([u'singleEscapes', u'freeModule', u'freeGlobal', u'freeExports', u'isFunction', u'forOwn', u'toString', u'regexSingleEscape', u'jsesc', u'isSet', u'isArray', u'extend', u'object', u'hasOwnProperty', u'isNumber', u'isObject', u'regexDigit', u'isString', u'isMap', u'root', u'regexWhitelist', u'forEach']) + var.put(u'freeExports', ((var.get(u'exports',throw=False).typeof()==Js(u'object')) and var.get(u'exports'))) + var.put(u'freeModule', ((((var.get(u'module',throw=False).typeof()==Js(u'object')) and var.get(u'module')) and (var.get(u'module').get(u'exports')==var.get(u'freeExports'))) and var.get(u'module'))) + var.put(u'freeGlobal', ((var.get(u'global',throw=False).typeof()==Js(u'object')) and var.get(u'global'))) + if (PyJsStrictEq(var.get(u'freeGlobal').get(u'global'),var.get(u'freeGlobal')) or PyJsStrictEq(var.get(u'freeGlobal').get(u'window'),var.get(u'freeGlobal'))): + var.put(u'root', var.get(u'freeGlobal')) + PyJs_Object_3377_ = Js({}) + var.put(u'object', PyJs_Object_3377_) + var.put(u'hasOwnProperty', var.get(u'object').get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_3378_(object, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'object':object, u'arguments':arguments}, var) + var.registers([u'callback', u'object', u'key']) + pass + for PyJsTemp in var.get(u'object'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'key')): + var.get(u'callback')(var.get(u'key'), var.get(u'object').get(var.get(u'key'))) + PyJs_anonymous_3378_._set_name(u'anonymous') + var.put(u'forOwn', PyJs_anonymous_3378_) + @Js + def PyJs_anonymous_3379_(destination, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'destination':destination, u'arguments':arguments}, var) + var.registers([u'source', u'destination']) + if var.get(u'source').neg(): + return var.get(u'destination') + @Js + def PyJs_anonymous_3380_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'value', u'key']) + var.get(u'destination').put(var.get(u'key'), var.get(u'value')) + PyJs_anonymous_3380_._set_name(u'anonymous') + var.get(u'forOwn')(var.get(u'source'), PyJs_anonymous_3380_) + return var.get(u'destination') + PyJs_anonymous_3379_._set_name(u'anonymous') + var.put(u'extend', PyJs_anonymous_3379_) + @Js + def PyJs_anonymous_3381_(array, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'callback']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'index', (-Js(1.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))=Js(55296)) and (var.get(u'first')<=Js(56319))) and (var.get(u'length')>(var.get(u'index')+Js(1.0)))): + var.put(u'second', var.get(u'string').callprop(u'charCodeAt', (var.get(u'index')+Js(1.0)))) + if ((var.get(u'second')>=Js(56320)) and (var.get(u'second')<=Js(57343))): + var.put(u'codePoint', (((((var.get(u'first')-Js(55296))*Js(1024))+var.get(u'second'))-Js(56320))+Js(65536))) + var.put(u'hexadecimal', var.get(u'codePoint').callprop(u'toString', Js(16.0))) + if var.get(u'lowercaseHex').neg(): + var.put(u'hexadecimal', var.get(u'hexadecimal').callprop(u'toUpperCase')) + var.put(u'result', ((Js(u'\\u{')+var.get(u'hexadecimal'))+Js(u'}')), u'+') + (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))-Js(1)) + continue + if var.get(u'options').get(u'escapeEverything').neg(): + if var.get(u'regexWhitelist').callprop(u'test', var.get(u'character')): + var.put(u'result', var.get(u'character'), u'+') + continue + if (var.get(u'character')==Js(u'"')): + var.put(u'result', (Js(u'\\"') if (var.get(u'quote')==var.get(u'character')) else var.get(u'character')), u'+') + continue + if (var.get(u'character')==Js(u"'")): + var.put(u'result', (Js(u"\\'") if (var.get(u'quote')==var.get(u'character')) else var.get(u'character')), u'+') + continue + if (((var.get(u'character')==Js(u'\x00')) and var.get(u'json').neg()) and var.get(u'regexDigit').callprop(u'test', var.get(u'string').callprop(u'charAt', (var.get(u'index')+Js(1.0)))).neg()): + var.put(u'result', Js(u'\\0'), u'+') + continue + if var.get(u'regexSingleEscape').callprop(u'test', var.get(u'character')): + var.put(u'result', var.get(u'singleEscapes').get(var.get(u'character')), u'+') + continue + var.put(u'charCode', var.get(u'character').callprop(u'charCodeAt', Js(0.0))) + var.put(u'hexadecimal', var.get(u'charCode').callprop(u'toString', Js(16.0))) + if var.get(u'lowercaseHex').neg(): + var.put(u'hexadecimal', var.get(u'hexadecimal').callprop(u'toUpperCase')) + var.put(u'longhand', ((var.get(u'hexadecimal').get(u'length')>Js(2.0)) or var.get(u'json'))) + var.put(u'escaped', ((Js(u'\\')+(Js(u'u') if var.get(u'longhand') else Js(u'x')))+(Js(u'0000')+var.get(u'hexadecimal')).callprop(u'slice', ((-Js(4.0)) if var.get(u'longhand') else (-Js(2.0)))))) + var.put(u'result', var.get(u'escaped'), u'+') + continue + if var.get(u'options').get(u'wrap'): + var.put(u'result', ((var.get(u'quote')+var.get(u'result'))+var.get(u'quote'))) + if var.get(u'options').get(u'escapeEtago'): + return var.get(u'result').callprop(u'replace', JsRegExp(u'/<\\/(script|style)/gi'), Js(u'<\\/$1')) + return var.get(u'result') + PyJs_anonymous_3390_._set_name(u'anonymous') + var.put(u'jsesc', PyJs_anonymous_3390_) + var.get(u'jsesc').put(u'version', Js(u'1.3.0')) + if (((var.get(u'define',throw=False).typeof()==Js(u'function')) and (var.get(u'define').get(u'amd').typeof()==Js(u'object'))) and var.get(u'define').get(u'amd')): + @Js + def PyJs_anonymous_3394_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'jsesc') + PyJs_anonymous_3394_._set_name(u'anonymous') + var.get(u'define')(PyJs_anonymous_3394_) + else: + if (var.get(u'freeExports') and var.get(u'freeExports').get(u'nodeType').neg()): + if var.get(u'freeModule'): + var.get(u'freeModule').put(u'exports', var.get(u'jsesc')) + else: + var.get(u'freeExports').put(u'jsesc', var.get(u'jsesc')) + else: + var.get(u'root').put(u'jsesc', var.get(u'jsesc')) + PyJs_anonymous_3376_._set_name(u'anonymous') + PyJs_anonymous_3376_(var.get(u"this")) + PyJs_anonymous_3375_._set_name(u'anonymous') + PyJs_anonymous_3375_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_3374_)))) +PyJs_anonymous_3373_._set_name(u'anonymous') +PyJs_Object_3395_ = Js({}) +@Js +def PyJs_anonymous_3396_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'JSON5', u'exports', u'require', u'module']) + PyJs_Object_3397_ = Js({}) + var.put(u'JSON5', (var.get(u'exports') if PyJsStrictEq(var.get(u'exports',throw=False).typeof(),Js(u'object')) else PyJs_Object_3397_)) + @Js + def PyJs_anonymous_3398_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'comment', u'ch', u'text', u'number', u'escapee', u'at', u'array', u'inlineComment', u'next', u'white', u'peek', u'string', u'blockComment', u'object', u'ws', u'lineNumber', u'columnNumber', u'word', u'value', u'error', u'identifier', u'renderChar']) + Js(u'use strict') + PyJs_Object_3399_ = Js({u"'":Js(u"'"),u'"':Js(u'"'),u'\\':Js(u'\\'),u'/':Js(u'/'),u'\n':Js(u''),u'b':Js(u'\x08'),u'f':Js(u'\x0c'),u'n':Js(u'\n'),u'r':Js(u'\r'),u't':Js(u'\t')}) + var.put(u'escapee', PyJs_Object_3399_) + var.put(u'ws', Js([Js(u' '), Js(u'\t'), Js(u'\r'), Js(u'\n'), Js(u'\x0b'), Js(u'\x0c'), Js(u'\xa0'), Js(u'\ufeff')])) + @Js + def PyJs_anonymous_3400_(chr, this, arguments, var=var): + var = Scope({u'this':this, u'chr':chr, u'arguments':arguments}, var) + var.registers([u'chr']) + return (Js(u'EOF') if PyJsStrictEq(var.get(u'chr'),Js(u'')) else ((Js(u"'")+var.get(u'chr'))+Js(u"'"))) + PyJs_anonymous_3400_._set_name(u'anonymous') + var.put(u'renderChar', PyJs_anonymous_3400_) + @Js + def PyJs_anonymous_3401_(m, this, arguments, var=var): + var = Scope({u'this':this, u'm':m, u'arguments':arguments}, var) + var.registers([u'm', u'error']) + var.put(u'error', var.get(u'SyntaxError').create()) + var.get(u'error').put(u'message', ((((((var.get(u'm')+Js(u' at line '))+var.get(u'lineNumber'))+Js(u' column '))+var.get(u'columnNumber'))+Js(u' of the JSON5 data. Still to read: '))+var.get(u'JSON').callprop(u'stringify', var.get(u'text').callprop(u'substring', (var.get(u'at')-Js(1.0)), (var.get(u'at')+Js(19.0)))))) + var.get(u'error').put(u'at', var.get(u'at')) + var.get(u'error').put(u'lineNumber', var.get(u'lineNumber')) + var.get(u'error').put(u'columnNumber', var.get(u'columnNumber')) + PyJsTempException = JsToPyException(var.get(u'error')) + raise PyJsTempException + PyJs_anonymous_3401_._set_name(u'anonymous') + var.put(u'error', PyJs_anonymous_3401_) + @Js + def PyJs_anonymous_3402_(c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments}, var) + var.registers([u'c']) + if (var.get(u'c') and PyJsStrictNeq(var.get(u'c'),var.get(u'ch'))): + var.get(u'error')((((Js(u'Expected ')+var.get(u'renderChar')(var.get(u'c')))+Js(u' instead of '))+var.get(u'renderChar')(var.get(u'ch')))) + var.put(u'ch', var.get(u'text').callprop(u'charAt', var.get(u'at'))) + (var.put(u'at',Js(var.get(u'at').to_number())+Js(1))-Js(1)) + (var.put(u'columnNumber',Js(var.get(u'columnNumber').to_number())+Js(1))-Js(1)) + if (PyJsStrictEq(var.get(u'ch'),Js(u'\n')) or (PyJsStrictEq(var.get(u'ch'),Js(u'\r')) and PyJsStrictNeq(var.get(u'peek')(),Js(u'\n')))): + (var.put(u'lineNumber',Js(var.get(u'lineNumber').to_number())+Js(1))-Js(1)) + var.put(u'columnNumber', Js(0.0)) + return var.get(u'ch') + PyJs_anonymous_3402_._set_name(u'anonymous') + var.put(u'next', PyJs_anonymous_3402_) + @Js + def PyJs_anonymous_3403_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'text').callprop(u'charAt', var.get(u'at')) + PyJs_anonymous_3403_._set_name(u'anonymous') + var.put(u'peek', PyJs_anonymous_3403_) + @Js + def PyJs_anonymous_3404_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'key']) + var.put(u'key', var.get(u'ch')) + if (((PyJsStrictNeq(var.get(u'ch'),Js(u'_')) and PyJsStrictNeq(var.get(u'ch'),Js(u'$'))) and ((var.get(u'ch')Js(u'z')))) and ((var.get(u'ch')Js(u'Z')))): + var.get(u'error')(Js(u'Bad identifier as unquoted key')) + while (var.get(u'next')() and ((((PyJsStrictEq(var.get(u'ch'),Js(u'_')) or PyJsStrictEq(var.get(u'ch'),Js(u'$'))) or ((var.get(u'ch')>=Js(u'a')) and (var.get(u'ch')<=Js(u'z')))) or ((var.get(u'ch')>=Js(u'A')) and (var.get(u'ch')<=Js(u'Z')))) or ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))))): + var.put(u'key', var.get(u'ch'), u'+') + return var.get(u'key') + PyJs_anonymous_3404_._set_name(u'anonymous') + var.put(u'identifier', PyJs_anonymous_3404_) + @Js + def PyJs_anonymous_3405_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'base', u'number', u'string', u'sign']) + var.put(u'sign', Js(u'')) + var.put(u'string', Js(u'')) + var.put(u'base', Js(10.0)) + if (PyJsStrictEq(var.get(u'ch'),Js(u'-')) or PyJsStrictEq(var.get(u'ch'),Js(u'+'))): + var.put(u'sign', var.get(u'ch')) + var.get(u'next')(var.get(u'ch')) + if PyJsStrictEq(var.get(u'ch'),Js(u'I')): + var.put(u'number', var.get(u'word')()) + if (PyJsStrictNeq(var.get(u'number',throw=False).typeof(),Js(u'number')) or var.get(u'isNaN')(var.get(u'number'))): + var.get(u'error')(Js(u'Unexpected word for number')) + return ((-var.get(u'number')) if PyJsStrictEq(var.get(u'sign'),Js(u'-')) else var.get(u'number')) + if PyJsStrictEq(var.get(u'ch'),Js(u'N')): + var.put(u'number', var.get(u'word')()) + if var.get(u'isNaN')(var.get(u'number')).neg(): + var.get(u'error')(Js(u'expected word to be NaN')) + return var.get(u'number') + if PyJsStrictEq(var.get(u'ch'),Js(u'0')): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + if (PyJsStrictEq(var.get(u'ch'),Js(u'x')) or PyJsStrictEq(var.get(u'ch'),Js(u'X'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + var.put(u'base', Js(16.0)) + else: + if ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))): + var.get(u'error')(Js(u'Octal literal')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'base')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(10.0)): + SWITCHED = True + while ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + if PyJsStrictEq(var.get(u'ch'),Js(u'.')): + var.put(u'string', Js(u'.'), u'+') + while ((var.get(u'next')() and (var.get(u'ch')>=Js(u'0'))) and (var.get(u'ch')<=Js(u'9'))): + var.put(u'string', var.get(u'ch'), u'+') + if (PyJsStrictEq(var.get(u'ch'),Js(u'e')) or PyJsStrictEq(var.get(u'ch'),Js(u'E'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + if (PyJsStrictEq(var.get(u'ch'),Js(u'-')) or PyJsStrictEq(var.get(u'ch'),Js(u'+'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + while ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(16.0)): + SWITCHED = True + while ((((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))) or ((var.get(u'ch')>=Js(u'A')) and (var.get(u'ch')<=Js(u'F')))) or ((var.get(u'ch')>=Js(u'a')) and (var.get(u'ch')<=Js(u'f')))): + var.put(u'string', var.get(u'ch'), u'+') + var.get(u'next')() + break + SWITCHED = True + break + if PyJsStrictEq(var.get(u'sign'),Js(u'-')): + var.put(u'number', (-var.get(u'string'))) + else: + var.put(u'number', (+var.get(u'string'))) + if var.get(u'isFinite')(var.get(u'number')).neg(): + var.get(u'error')(Js(u'Bad number')) + else: + return var.get(u'number') + PyJs_anonymous_3405_._set_name(u'anonymous') + var.put(u'number', PyJs_anonymous_3405_) + @Js + def PyJs_anonymous_3406_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'delim', u'uffff', u'hex', u'string']) + var.put(u'string', Js(u'')) + if (PyJsStrictEq(var.get(u'ch'),Js(u'"')) or PyJsStrictEq(var.get(u'ch'),Js(u"'"))): + var.put(u'delim', var.get(u'ch')) + while var.get(u'next')(): + if PyJsStrictEq(var.get(u'ch'),var.get(u'delim')): + var.get(u'next')() + return var.get(u'string') + else: + if PyJsStrictEq(var.get(u'ch'),Js(u'\\')): + var.get(u'next')() + if PyJsStrictEq(var.get(u'ch'),Js(u'u')): + var.put(u'uffff', Js(0.0)) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0)): + var.get(u'next')() + else: + return var.get('undefined') + PyJs_anonymous_3410_._set_name(u'anonymous') + var.put(u'white', PyJs_anonymous_3410_) + @Js + def PyJs_anonymous_3411_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u't')): + SWITCHED = True + var.get(u'next')(Js(u't')) + var.get(u'next')(Js(u'r')) + var.get(u'next')(Js(u'u')) + var.get(u'next')(Js(u'e')) + return var.get(u'true') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'f')): + SWITCHED = True + var.get(u'next')(Js(u'f')) + var.get(u'next')(Js(u'a')) + var.get(u'next')(Js(u'l')) + var.get(u'next')(Js(u's')) + var.get(u'next')(Js(u'e')) + return Js(False) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'n')): + SWITCHED = True + var.get(u'next')(Js(u'n')) + var.get(u'next')(Js(u'u')) + var.get(u'next')(Js(u'l')) + var.get(u'next')(Js(u'l')) + return var.get(u"null") + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'I')): + SWITCHED = True + var.get(u'next')(Js(u'I')) + var.get(u'next')(Js(u'n')) + var.get(u'next')(Js(u'f')) + var.get(u'next')(Js(u'i')) + var.get(u'next')(Js(u'n')) + var.get(u'next')(Js(u'i')) + var.get(u'next')(Js(u't')) + var.get(u'next')(Js(u'y')) + return var.get(u'Infinity') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'N')): + SWITCHED = True + var.get(u'next')(Js(u'N')) + var.get(u'next')(Js(u'a')) + var.get(u'next')(Js(u'N')) + return var.get(u'NaN') + SWITCHED = True + break + var.get(u'error')((Js(u'Unexpected ')+var.get(u'renderChar')(var.get(u'ch')))) + PyJs_anonymous_3411_._set_name(u'anonymous') + var.put(u'word', PyJs_anonymous_3411_) + @Js + def PyJs_anonymous_3412_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'array']) + var.put(u'array', Js([])) + if PyJsStrictEq(var.get(u'ch'),Js(u'[')): + var.get(u'next')(Js(u'[')) + var.get(u'white')() + while var.get(u'ch'): + if PyJsStrictEq(var.get(u'ch'),Js(u']')): + var.get(u'next')(Js(u']')) + return var.get(u'array') + if PyJsStrictEq(var.get(u'ch'),Js(u',')): + var.get(u'error')(Js(u'Missing array element')) + else: + var.get(u'array').callprop(u'push', var.get(u'value')()) + var.get(u'white')() + if PyJsStrictNeq(var.get(u'ch'),Js(u',')): + var.get(u'next')(Js(u']')) + return var.get(u'array') + var.get(u'next')(Js(u',')) + var.get(u'white')() + var.get(u'error')(Js(u'Bad array')) + PyJs_anonymous_3412_._set_name(u'anonymous') + var.put(u'array', PyJs_anonymous_3412_) + @Js + def PyJs_anonymous_3413_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'object', u'key']) + PyJs_Object_3414_ = Js({}) + var.put(u'object', PyJs_Object_3414_) + if PyJsStrictEq(var.get(u'ch'),Js(u'{')): + var.get(u'next')(Js(u'{')) + var.get(u'white')() + while var.get(u'ch'): + if PyJsStrictEq(var.get(u'ch'),Js(u'}')): + var.get(u'next')(Js(u'}')) + return var.get(u'object') + if (PyJsStrictEq(var.get(u'ch'),Js(u'"')) or PyJsStrictEq(var.get(u'ch'),Js(u"'"))): + var.put(u'key', var.get(u'string')()) + else: + var.put(u'key', var.get(u'identifier')()) + var.get(u'white')() + var.get(u'next')(Js(u':')) + var.get(u'object').put(var.get(u'key'), var.get(u'value')()) + var.get(u'white')() + if PyJsStrictNeq(var.get(u'ch'),Js(u',')): + var.get(u'next')(Js(u'}')) + return var.get(u'object') + var.get(u'next')(Js(u',')) + var.get(u'white')() + var.get(u'error')(Js(u'Bad object')) + PyJs_anonymous_3413_._set_name(u'anonymous') + var.put(u'object', PyJs_anonymous_3413_) + @Js + def PyJs_anonymous_3415_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u'white')() + while 1: + SWITCHED = False + CONDITION = (var.get(u'ch')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'{')): + SWITCHED = True + return var.get(u'object')() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'[')): + SWITCHED = True + return var.get(u'array')() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'"')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u"'")): + SWITCHED = True + return var.get(u'string')() + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'-')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'+')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'.')): + SWITCHED = True + return var.get(u'number')() + if True: + SWITCHED = True + return (var.get(u'number')() if ((var.get(u'ch')>=Js(u'0')) and (var.get(u'ch')<=Js(u'9'))) else var.get(u'word')()) + SWITCHED = True + break + PyJs_anonymous_3415_._set_name(u'anonymous') + var.put(u'value', PyJs_anonymous_3415_) + @Js + def PyJs_anonymous_3416_(source, reviver, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'reviver':reviver, u'arguments':arguments}, var) + var.registers([u'source', u'reviver', u'result']) + pass + var.put(u'text', var.get(u'String')(var.get(u'source'))) + var.put(u'at', Js(0.0)) + var.put(u'lineNumber', Js(1.0)) + var.put(u'columnNumber', Js(1.0)) + var.put(u'ch', Js(u' ')) + var.put(u'result', var.get(u'value')()) + var.get(u'white')() + if var.get(u'ch'): + var.get(u'error')(Js(u'Syntax error')) + PyJs_Object_3417_ = Js({u'':var.get(u'result')}) + @Js + def PyJs_walk_3418_(holder, key, this, arguments, var=var): + var = Scope({u'this':this, u'holder':holder, u'arguments':arguments, u'key':key, u'walk':PyJs_walk_3418_}, var) + var.registers([u'k', u'holder', u'key', u'value', u'v']) + var.put(u'value', var.get(u'holder').get(var.get(u'key'))) + if (var.get(u'value') and PyJsStrictEq(var.get(u'value',throw=False).typeof(),Js(u'object'))): + for PyJsTemp in var.get(u'value'): + var.put(u'k', PyJsTemp) + if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'value'), var.get(u'k')): + var.put(u'v', var.get(u'walk')(var.get(u'value'), var.get(u'k'))) + if PyJsStrictNeq(var.get(u'v'),var.get(u'undefined')): + var.get(u'value').put(var.get(u'k'), var.get(u'v')) + else: + var.get(u'value').delete(var.get(u'k')) + return var.get(u'reviver').callprop(u'call', var.get(u'holder'), var.get(u'key'), var.get(u'value')) + PyJs_walk_3418_._set_name(u'walk') + return (PyJs_walk_3418_(PyJs_Object_3417_, Js(u'')) if PyJsStrictEq(var.get(u'reviver',throw=False).typeof(),Js(u'function')) else var.get(u'result')) + PyJs_anonymous_3416_._set_name(u'anonymous') + return PyJs_anonymous_3416_ + PyJs_anonymous_3398_._set_name(u'anonymous') + var.get(u'JSON5').put(u'parse', PyJs_anonymous_3398_()) + @Js + def PyJs_anonymous_3419_(obj, replacer, space, this, arguments, var=var): + var = Scope({u'this':this, u'replacer':replacer, u'obj':obj, u'arguments':arguments, u'space':space}, var) + var.registers([u'isArray', u'topLevelHolder', u'isDate', u'escapeString', u'space', u'internalStringify', u'objStack', u'replacer', u'escapable', u'cx', u'meta', u'checkForCircular', u'isWordChar', u'isWordStart', u'obj', u'makeIndent', u'indentStr', u'isWord', u'getReplacedValueOrUndefined']) + @Js + def PyJsHoisted_isArray_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + if var.get(u'Array').get(u'isArray'): + return var.get(u'Array').callprop(u'isArray', var.get(u'obj')) + else: + return PyJsStrictEq(var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'obj')),Js(u'[object Array]')) + PyJsHoisted_isArray_.func_name = u'isArray' + var.put(u'isArray', PyJsHoisted_isArray_) + @Js + def PyJsHoisted_isDate_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return PyJsStrictEq(var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'obj')),Js(u'[object Date]')) + PyJsHoisted_isDate_.func_name = u'isDate' + var.put(u'isDate', PyJsHoisted_isDate_) + @Js + def PyJsHoisted_escapeString_(string, this, arguments, var=var): + var = Scope({u'this':this, u'string':string, u'arguments':arguments}, var) + var.registers([u'string']) + var.get(u'escapable').put(u'lastIndex', Js(0.0)) + @Js + def PyJs_anonymous_3422_(a, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'arguments':arguments}, var) + var.registers([u'a', u'c']) + var.put(u'c', var.get(u'meta').get(var.get(u'a'))) + return (var.get(u'c') if PyJsStrictEq(var.get(u'c',throw=False).typeof(),Js(u'string')) else (Js(u'\\u')+(Js(u'0000')+var.get(u'a').callprop(u'charCodeAt', Js(0.0)).callprop(u'toString', Js(16.0))).callprop(u'slice', (-Js(4.0))))) + PyJs_anonymous_3422_._set_name(u'anonymous') + return (((Js(u'"')+var.get(u'string').callprop(u'replace', var.get(u'escapable'), PyJs_anonymous_3422_))+Js(u'"')) if var.get(u'escapable').callprop(u'test', var.get(u'string')) else ((Js(u'"')+var.get(u'string'))+Js(u'"'))) + PyJsHoisted_escapeString_.func_name = u'escapeString' + var.put(u'escapeString', PyJsHoisted_escapeString_) + @Js + def PyJsHoisted_internalStringify_(holder, key, isTopLevel, this, arguments, var=var): + var = Scope({u'this':this, u'isTopLevel':isTopLevel, u'holder':holder, u'arguments':arguments, u'key':key}, var) + var.registers([u'i', u'buffer', u'res', u'value', u'prop', u'nonEmpty', u'key', u'isTopLevel', u'holder', u'obj_part']) + pass + var.put(u'obj_part', var.get(u'getReplacedValueOrUndefined')(var.get(u'holder'), var.get(u'key'), var.get(u'isTopLevel'))) + if (var.get(u'obj_part') and var.get(u'isDate')(var.get(u'obj_part')).neg()): + var.put(u'obj_part', var.get(u'obj_part').callprop(u'valueOf')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'obj_part',throw=False).typeof()) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'boolean')): + SWITCHED = True + return var.get(u'obj_part').callprop(u'toString') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'number')): + SWITCHED = True + if (var.get(u'isNaN')(var.get(u'obj_part')) or var.get(u'isFinite')(var.get(u'obj_part')).neg()): + return Js(u'null') + return var.get(u'obj_part').callprop(u'toString') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'string')): + SWITCHED = True + return var.get(u'escapeString')(var.get(u'obj_part').callprop(u'toString')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'object')): + SWITCHED = True + if PyJsStrictEq(var.get(u'obj_part'),var.get(u"null")): + return Js(u'null') + else: + if var.get(u'isArray')(var.get(u'obj_part')): + var.get(u'checkForCircular')(var.get(u'obj_part')) + var.put(u'buffer', Js(u'[')) + var.get(u'objStack').callprop(u'push', var.get(u'obj_part')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(u'a')) and (var.get(u'c')<=Js(u'z'))) or ((var.get(u'c')>=Js(u'A')) and (var.get(u'c')<=Js(u'Z')))) or ((var.get(u'c')>=Js(u'0')) and (var.get(u'c')<=Js(u'9')))) or PyJsStrictEq(var.get(u'c'),Js(u'_'))) or PyJsStrictEq(var.get(u'c'),Js(u'$'))) + PyJsHoisted_isWordChar_.func_name = u'isWordChar' + var.put(u'isWordChar', PyJsHoisted_isWordChar_) + @Js + def PyJsHoisted_isWordStart_(c, this, arguments, var=var): + var = Scope({u'this':this, u'c':c, u'arguments':arguments}, var) + var.registers([u'c']) + return (((((var.get(u'c')>=Js(u'a')) and (var.get(u'c')<=Js(u'z'))) or ((var.get(u'c')>=Js(u'A')) and (var.get(u'c')<=Js(u'Z')))) or PyJsStrictEq(var.get(u'c'),Js(u'_'))) or PyJsStrictEq(var.get(u'c'),Js(u'$'))) + PyJsHoisted_isWordStart_.func_name = u'isWordStart' + var.put(u'isWordStart', PyJsHoisted_isWordStart_) + @Js + def PyJsHoisted_makeIndent_(str, num, noNewLine, this, arguments, var=var): + var = Scope({u'this':this, u'num':num, u'noNewLine':noNewLine, u'str':str, u'arguments':arguments}, var) + var.registers([u'i', u'num', u'indent', u'noNewLine', u'str']) + if var.get(u'str').neg(): + return Js(u'') + if (var.get(u'str').get(u'length')>Js(10.0)): + var.put(u'str', var.get(u'str').callprop(u'substring', Js(0.0), Js(10.0))) + var.put(u'indent', (Js(u'') if var.get(u'noNewLine') else Js(u'\n'))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0))): + return var.get(u'value') + else: + return var.get(u'undefined') + else: + return var.get(u'value') + PyJs_anonymous_3420_._set_name(u'anonymous') + var.put(u'getReplacedValueOrUndefined', PyJs_anonymous_3420_) + pass + pass + pass + var.get(u'JSON5').put(u'isWord', var.get(u'isWord')) + pass + pass + var.put(u'objStack', Js([])) + pass + pass + pass + if var.get(u'space'): + if PyJsStrictEq(var.get(u'space',throw=False).typeof(),Js(u'string')): + var.put(u'indentStr', var.get(u'space')) + else: + if (PyJsStrictEq(var.get(u'space',throw=False).typeof(),Js(u'number')) and (var.get(u'space')>=Js(0.0))): + var.put(u'indentStr', var.get(u'makeIndent')(Js(u' '), var.get(u'space'), var.get(u'true'))) + else: + pass + var.put(u'cx', JsRegExp(u'/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g')) + var.put(u'escapable', JsRegExp(u'/[\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g')) + PyJs_Object_3421_ = Js({u'\x08':Js(u'\\b'),u'\t':Js(u'\\t'),u'\n':Js(u'\\n'),u'\x0c':Js(u'\\f'),u'\r':Js(u'\\r'),u'"':Js(u'\\"'),u'\\':Js(u'\\\\')}) + var.put(u'meta', PyJs_Object_3421_) + pass + pass + PyJs_Object_3423_ = Js({u'':var.get(u'obj')}) + var.put(u'topLevelHolder', PyJs_Object_3423_) + if PyJsStrictEq(var.get(u'obj'),var.get(u'undefined')): + return var.get(u'getReplacedValueOrUndefined')(var.get(u'topLevelHolder'), Js(u''), var.get(u'true')) + return var.get(u'internalStringify')(var.get(u'topLevelHolder'), Js(u''), var.get(u'true')) + PyJs_anonymous_3419_._set_name(u'anonymous') + var.get(u'JSON5').put(u'stringify', PyJs_anonymous_3419_) +PyJs_anonymous_3396_._set_name(u'anonymous') +PyJs_Object_3424_ = Js({}) +@Js +def PyJs_anonymous_3425_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'DataView', u'module', u'getNative', u'root']) + var.put(u'getNative', var.get(u'require')(Js(u'./_getNative'))) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'DataView', var.get(u'getNative')(var.get(u'root'), Js(u'DataView'))) + var.get(u'module').put(u'exports', var.get(u'DataView')) +PyJs_anonymous_3425_._set_name(u'anonymous') +PyJs_Object_3426_ = Js({u'./_getNative':Js(382.0),u'./_root':Js(422.0)}) +@Js +def PyJs_anonymous_3427_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'hashGet', u'Hash', u'hashClear', u'hashSet', u'require', u'module', u'hashDelete', u'hashHas']) + @Js + def PyJsHoisted_Hash_(entries, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'entries':entries}, var) + var.registers([u'index', u'length', u'entries', u'entry']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'entries').get(u'length') if var.get(u'entries') else Js(0.0))) + var.get(u"this").callprop(u'clear') + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))(-Js(1.0)))) + PyJsHoisted_arrayIncludes_.func_name = u'arrayIncludes' + var.put(u'arrayIncludes', PyJsHoisted_arrayIncludes_) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'arrayIncludes')) +PyJs_anonymous_3459_._set_name(u'anonymous') +PyJs_Object_3460_ = Js({u'./_baseIndexOf':Js(325.0)}) +@Js +def PyJs_anonymous_3461_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'arrayIncludesWith', u'module']) + @Js + def PyJsHoisted_arrayIncludesWith_(array, value, comparator, this, arguments, var=var): + var = Scope({u'this':this, u'array':array, u'comparator':comparator, u'value':value, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'value', u'comparator']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', (var.get(u'array').get(u'length') if var.get(u'array') else Js(0.0))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))=var.get(u'lower')) else var.get(u'lower'))) + return var.get(u'number') + PyJsHoisted_baseClamp_.func_name = u'baseClamp' + var.put(u'baseClamp', PyJsHoisted_baseClamp_) + pass + var.get(u'module').put(u'exports', var.get(u'baseClamp')) +PyJs_anonymous_3481_._set_name(u'anonymous') +PyJs_Object_3482_ = Js({}) +@Js +def PyJs_anonymous_3483_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'genTag', u'arrayTag', u'initCloneObject', u'uint32Tag', u'arrayBufferTag', u'objectTag', u'dataViewTag', u'regexpTag', u'copyArray', u'int8Tag', u'uint16Tag', u'errorTag', u'float64Tag', u'isBuffer', u'baseClone', u'assignValue', u'mapTag', u'cloneableTags', u'boolTag', u'arrayEach', u'initCloneByTag', u'funcTag', u'getAllKeys', u'float32Tag', u'cloneBuffer', u'Stack', u'argsTag', u'isArray', u'exports', u'dateTag', u'int16Tag', u'copySymbols', u'keys', u'stringTag', u'numberTag', u'module', u'getTag', u'isObject', u'uint8Tag', u'initCloneArray', u'isHostObject', u'require', u'baseAssign', u'uint8ClampedTag', u'weakMapTag', u'setTag', u'int32Tag', u'symbolTag']) + @Js + def PyJsHoisted_baseClone_(value, isDeep, isFull, customizer, key, object, stack, this, arguments, var=var): + var = Scope({u'this':this, u'isFull':isFull, u'object':object, u'value':value, u'isDeep':isDeep, u'arguments':arguments, u'key':key, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'stacked', u'isFull', u'object', u'isFunc', u'value', u'tag', u'isDeep', u'result', u'key', u'props', u'customizer', u'isArr', u'stack']) + pass + if var.get(u'customizer'): + var.put(u'result', (var.get(u'customizer')(var.get(u'value'), var.get(u'key'), var.get(u'object'), var.get(u'stack')) if var.get(u'object') else var.get(u'customizer')(var.get(u'value')))) + if PyJsStrictNeq(var.get(u'result'),var.get(u'undefined')): + return var.get(u'result') + if var.get(u'isObject')(var.get(u'value')).neg(): + return var.get(u'value') + var.put(u'isArr', var.get(u'isArray')(var.get(u'value'))) + if var.get(u'isArr'): + var.put(u'result', var.get(u'initCloneArray')(var.get(u'value'))) + if var.get(u'isDeep').neg(): + return var.get(u'copyArray')(var.get(u'value'), var.get(u'result')) + else: + var.put(u'tag', var.get(u'getTag')(var.get(u'value'))) + var.put(u'isFunc', ((var.get(u'tag')==var.get(u'funcTag')) or (var.get(u'tag')==var.get(u'genTag')))) + if var.get(u'isBuffer')(var.get(u'value')): + return var.get(u'cloneBuffer')(var.get(u'value'), var.get(u'isDeep')) + if (((var.get(u'tag')==var.get(u'objectTag')) or (var.get(u'tag')==var.get(u'argsTag'))) or (var.get(u'isFunc') and var.get(u'object').neg())): + if var.get(u'isHostObject')(var.get(u'value')): + PyJs_Object_3487_ = Js({}) + return (var.get(u'value') if var.get(u'object') else PyJs_Object_3487_) + PyJs_Object_3488_ = Js({}) + var.put(u'result', var.get(u'initCloneObject')((PyJs_Object_3488_ if var.get(u'isFunc') else var.get(u'value')))) + if var.get(u'isDeep').neg(): + return var.get(u'copySymbols')(var.get(u'value'), var.get(u'baseAssign')(var.get(u'result'), var.get(u'value'))) + else: + if var.get(u'cloneableTags').get(var.get(u'tag')).neg(): + PyJs_Object_3489_ = Js({}) + return (var.get(u'value') if var.get(u'object') else PyJs_Object_3489_) + var.put(u'result', var.get(u'initCloneByTag')(var.get(u'value'), var.get(u'tag'), var.get(u'baseClone'), var.get(u'isDeep'))) + (var.get(u'stack') or var.put(u'stack', var.get(u'Stack').create())) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'value'))) + if var.get(u'stacked'): + return var.get(u'stacked') + var.get(u'stack').callprop(u'set', var.get(u'value'), var.get(u'result')) + if var.get(u'isArr').neg(): + var.put(u'props', (var.get(u'getAllKeys')(var.get(u'value')) if var.get(u'isFull') else var.get(u'keys')(var.get(u'value')))) + @Js + def PyJs_anonymous_3490_(subValue, key, this, arguments, var=var): + var = Scope({u'this':this, u'subValue':subValue, u'arguments':arguments, u'key':key}, var) + var.registers([u'subValue', u'key']) + if var.get(u'props'): + var.put(u'key', var.get(u'subValue')) + var.put(u'subValue', var.get(u'value').get(var.get(u'key'))) + var.get(u'assignValue')(var.get(u'result'), var.get(u'key'), var.get(u'baseClone')(var.get(u'subValue'), var.get(u'isDeep'), var.get(u'isFull'), var.get(u'customizer'), var.get(u'key'), var.get(u'value'), var.get(u'stack'))) + PyJs_anonymous_3490_._set_name(u'anonymous') + var.get(u'arrayEach')((var.get(u'props') or var.get(u'value')), PyJs_anonymous_3490_) + return var.get(u'result') + PyJsHoisted_baseClone_.func_name = u'baseClone' + var.put(u'baseClone', PyJsHoisted_baseClone_) + var.put(u'Stack', var.get(u'require')(Js(u'./_Stack'))) + var.put(u'arrayEach', var.get(u'require')(Js(u'./_arrayEach'))) + var.put(u'assignValue', var.get(u'require')(Js(u'./_assignValue'))) + var.put(u'baseAssign', var.get(u'require')(Js(u'./_baseAssign'))) + var.put(u'cloneBuffer', var.get(u'require')(Js(u'./_cloneBuffer'))) + var.put(u'copyArray', var.get(u'require')(Js(u'./_copyArray'))) + var.put(u'copySymbols', var.get(u'require')(Js(u'./_copySymbols'))) + var.put(u'getAllKeys', var.get(u'require')(Js(u'./_getAllKeys'))) + var.put(u'getTag', var.get(u'require')(Js(u'./_getTag'))) + var.put(u'initCloneArray', var.get(u'require')(Js(u'./_initCloneArray'))) + var.put(u'initCloneByTag', var.get(u'require')(Js(u'./_initCloneByTag'))) + var.put(u'initCloneObject', var.get(u'require')(Js(u'./_initCloneObject'))) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isBuffer', var.get(u'require')(Js(u'./isBuffer'))) + var.put(u'isHostObject', var.get(u'require')(Js(u'./_isHostObject'))) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'arrayTag', Js(u'[object Array]')) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'dateTag', Js(u'[object Date]')) + var.put(u'errorTag', Js(u'[object Error]')) + var.put(u'funcTag', Js(u'[object Function]')) + var.put(u'genTag', Js(u'[object GeneratorFunction]')) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'symbolTag', Js(u'[object Symbol]')) + var.put(u'weakMapTag', Js(u'[object WeakMap]')) + var.put(u'arrayBufferTag', Js(u'[object ArrayBuffer]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'float32Tag', Js(u'[object Float32Array]')) + var.put(u'float64Tag', Js(u'[object Float64Array]')) + var.put(u'int8Tag', Js(u'[object Int8Array]')) + var.put(u'int16Tag', Js(u'[object Int16Array]')) + var.put(u'int32Tag', Js(u'[object Int32Array]')) + var.put(u'uint8Tag', Js(u'[object Uint8Array]')) + var.put(u'uint8ClampedTag', Js(u'[object Uint8ClampedArray]')) + var.put(u'uint16Tag', Js(u'[object Uint16Array]')) + var.put(u'uint32Tag', Js(u'[object Uint32Array]')) + PyJs_Object_3484_ = Js({}) + var.put(u'cloneableTags', PyJs_Object_3484_) + def PyJs_LONG_3486_(var=var): + def PyJs_LONG_3485_(var=var): + return var.get(u'cloneableTags').put(var.get(u'regexpTag'), var.get(u'cloneableTags').put(var.get(u'setTag'), var.get(u'cloneableTags').put(var.get(u'stringTag'), var.get(u'cloneableTags').put(var.get(u'symbolTag'), var.get(u'cloneableTags').put(var.get(u'uint8Tag'), var.get(u'cloneableTags').put(var.get(u'uint8ClampedTag'), var.get(u'cloneableTags').put(var.get(u'uint16Tag'), var.get(u'cloneableTags').put(var.get(u'uint32Tag'), var.get(u'true'))))))))) + return var.get(u'cloneableTags').put(var.get(u'float32Tag'), var.get(u'cloneableTags').put(var.get(u'float64Tag'), var.get(u'cloneableTags').put(var.get(u'int8Tag'), var.get(u'cloneableTags').put(var.get(u'int16Tag'), var.get(u'cloneableTags').put(var.get(u'int32Tag'), var.get(u'cloneableTags').put(var.get(u'mapTag'), var.get(u'cloneableTags').put(var.get(u'numberTag'), var.get(u'cloneableTags').put(var.get(u'objectTag'), PyJs_LONG_3485_())))))))) + var.get(u'cloneableTags').put(var.get(u'argsTag'), var.get(u'cloneableTags').put(var.get(u'arrayTag'), var.get(u'cloneableTags').put(var.get(u'arrayBufferTag'), var.get(u'cloneableTags').put(var.get(u'dataViewTag'), var.get(u'cloneableTags').put(var.get(u'boolTag'), var.get(u'cloneableTags').put(var.get(u'dateTag'), PyJs_LONG_3486_())))))) + var.get(u'cloneableTags').put(var.get(u'errorTag'), var.get(u'cloneableTags').put(var.get(u'funcTag'), var.get(u'cloneableTags').put(var.get(u'weakMapTag'), Js(False)))) + pass + var.get(u'module').put(u'exports', var.get(u'baseClone')) +PyJs_anonymous_3483_._set_name(u'anonymous') +PyJs_Object_3491_ = Js({u'./_Stack':Js(294.0),u'./_arrayEach':Js(301.0),u'./_assignValue':Js(310.0),u'./_baseAssign':Js(312.0),u'./_cloneBuffer':Js(357.0),u'./_copyArray':Js(366.0),u'./_copySymbols':Js(368.0),u'./_getAllKeys':Js(378.0),u'./_getTag':Js(385.0),u'./_initCloneArray':Js(395.0),u'./_initCloneByTag':Js(396.0),u'./_initCloneObject':Js(397.0),u'./_isHostObject':Js(400.0),u'./isArray':Js(458.0),u'./isBuffer':Js(462.0),u'./isObject':Js(467.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3492_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'objectCreate', u'require', u'module', u'baseCreate', u'isObject']) + @Js + def PyJsHoisted_baseCreate_(proto, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'proto':proto}, var) + var.registers([u'proto']) + PyJs_Object_3493_ = Js({}) + return (var.get(u'objectCreate')(var.get(u'proto')) if var.get(u'isObject')(var.get(u'proto')) else PyJs_Object_3493_) + PyJsHoisted_baseCreate_.func_name = u'baseCreate' + var.put(u'baseCreate', PyJsHoisted_baseCreate_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'objectCreate', var.get(u'Object').get(u'create')) + pass + var.get(u'module').put(u'exports', var.get(u'baseCreate')) +PyJs_anonymous_3492_._set_name(u'anonymous') +PyJs_Object_3494_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3495_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseEach', u'exports', u'baseForOwn', u'module', u'createBaseEach', u'require']) + var.put(u'baseForOwn', var.get(u'require')(Js(u'./_baseForOwn'))) + var.put(u'createBaseEach', var.get(u'require')(Js(u'./_createBaseEach'))) + var.put(u'baseEach', var.get(u'createBaseEach')(var.get(u'baseForOwn'))) + var.get(u'module').put(u'exports', var.get(u'baseEach')) +PyJs_anonymous_3495_._set_name(u'anonymous') +PyJs_Object_3496_ = Js({u'./_baseForOwn':Js(320.0),u'./_createBaseEach':Js(371.0)}) +@Js +def PyJs_anonymous_3497_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'baseFindIndex']) + @Js + def PyJsHoisted_baseFindIndex_(array, predicate, fromIndex, fromRight, this, arguments, var=var): + var = Scope({u'predicate':predicate, u'arguments':arguments, u'this':this, u'array':array, u'fromIndex':fromIndex, u'fromRight':fromRight}, var) + var.registers([u'index', u'predicate', u'fromIndex', u'fromRight', u'length', u'array']) + var.put(u'length', var.get(u'array').get(u'length')) + var.put(u'index', (var.get(u'fromIndex')+(Js(1.0) if var.get(u'fromRight') else (-Js(1.0))))) + while ((var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) if var.get(u'fromRight') else (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))Js(0.0)) and var.get(u'predicate')(var.get(u'value'))): + if (var.get(u'depth')>Js(1.0)): + var.get(u'baseFlatten')(var.get(u'value'), (var.get(u'depth')-Js(1.0)), var.get(u'predicate'), var.get(u'isStrict'), var.get(u'result')) + else: + var.get(u'arrayPush')(var.get(u'result'), var.get(u'value')) + else: + if var.get(u'isStrict').neg(): + var.get(u'result').put(var.get(u'result').get(u'length'), var.get(u'value')) + return var.get(u'result') + PyJsHoisted_baseFlatten_.func_name = u'baseFlatten' + var.put(u'baseFlatten', PyJsHoisted_baseFlatten_) + var.put(u'arrayPush', var.get(u'require')(Js(u'./_arrayPush'))) + var.put(u'isFlattenable', var.get(u'require')(Js(u'./_isFlattenable'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseFlatten')) +PyJs_anonymous_3499_._set_name(u'anonymous') +PyJs_Object_3500_ = Js({u'./_arrayPush':Js(305.0),u'./_isFlattenable':Js(398.0)}) +@Js +def PyJs_anonymous_3501_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'createBaseFor', u'require', u'exports', u'module', u'baseFor']) + var.put(u'createBaseFor', var.get(u'require')(Js(u'./_createBaseFor'))) + var.put(u'baseFor', var.get(u'createBaseFor')()) + var.get(u'module').put(u'exports', var.get(u'baseFor')) +PyJs_anonymous_3501_._set_name(u'anonymous') +PyJs_Object_3502_ = Js({u'./_createBaseFor':Js(372.0)}) +@Js +def PyJs_anonymous_3503_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'baseFor', u'keys', u'baseForOwn', u'module', u'require']) + @Js + def PyJsHoisted_baseForOwn_(object, iteratee, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments, u'iteratee':iteratee}, var) + var.registers([u'object', u'iteratee']) + return (var.get(u'object') and var.get(u'baseFor')(var.get(u'object'), var.get(u'iteratee'), var.get(u'keys'))) + PyJsHoisted_baseForOwn_.func_name = u'baseForOwn' + var.put(u'baseForOwn', PyJsHoisted_baseForOwn_) + var.put(u'baseFor', var.get(u'require')(Js(u'./_baseFor'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'baseForOwn')) +PyJs_anonymous_3503_._set_name(u'anonymous') +PyJs_Object_3504_ = Js({u'./_baseFor':Js(319.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3505_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'toKey', u'isKey', u'require', u'module', u'castPath', u'baseGet']) + @Js + def PyJsHoisted_baseGet_(object, path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'object':object, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'object', u'path']) + var.put(u'path', (Js([var.get(u'path')]) if var.get(u'isKey')(var.get(u'path'), var.get(u'object')) else var.get(u'castPath')(var.get(u'path')))) + var.put(u'index', Js(0.0)) + var.put(u'length', var.get(u'path').get(u'length')) + while ((var.get(u'object')!=var.get(u"null")) and (var.get(u'index')(-Js(1.0))): + if PyJsStrictNeq(var.get(u'seen'),var.get(u'array')): + var.get(u'splice').callprop(u'call', var.get(u'seen'), var.get(u'fromIndex'), Js(1.0)) + var.get(u'splice').callprop(u'call', var.get(u'array'), var.get(u'fromIndex'), Js(1.0)) + return var.get(u'array') + PyJsHoisted_basePullAll_.func_name = u'basePullAll' + var.put(u'basePullAll', PyJsHoisted_basePullAll_) + var.put(u'arrayMap', var.get(u'require')(Js(u'./_arrayMap'))) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + var.put(u'baseIndexOfWith', var.get(u'require')(Js(u'./_baseIndexOfWith'))) + var.put(u'baseUnary', var.get(u'require')(Js(u'./_baseUnary'))) + var.put(u'copyArray', var.get(u'require')(Js(u'./_copyArray'))) + var.put(u'arrayProto', var.get(u'Array').get(u'prototype')) + var.put(u'splice', var.get(u'arrayProto').get(u'splice')) + pass + var.get(u'module').put(u'exports', var.get(u'basePullAll')) +PyJs_anonymous_3559_._set_name(u'anonymous') +PyJs_Object_3560_ = Js({u'./_arrayMap':Js(304.0),u'./_baseIndexOf':Js(325.0),u'./_baseIndexOfWith':Js(326.0),u'./_baseUnary':Js(348.0),u'./_copyArray':Js(366.0)}) +@Js +def PyJs_anonymous_3561_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'MAX_SAFE_INTEGER', u'exports', u'baseRepeat', u'require', u'module', u'nativeFloor']) + @Js + def PyJsHoisted_baseRepeat_(string, n, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'string':string, u'n':n}, var) + var.registers([u'n', u'result', u'string']) + var.put(u'result', Js(u'')) + if ((var.get(u'string').neg() or (var.get(u'n')var.get(u'MAX_SAFE_INTEGER'))): + return var.get(u'result') + while 1: + if (var.get(u'n')%Js(2.0)): + var.put(u'result', var.get(u'string'), u'+') + var.put(u'n', var.get(u'nativeFloor')((var.get(u'n')/Js(2.0)))) + if var.get(u'n'): + var.put(u'string', var.get(u'string'), u'+') + if not var.get(u'n'): + break + return var.get(u'result') + PyJsHoisted_baseRepeat_.func_name = u'baseRepeat' + var.put(u'baseRepeat', PyJsHoisted_baseRepeat_) + var.put(u'MAX_SAFE_INTEGER', Js(9007199254740991.0)) + var.put(u'nativeFloor', var.get(u'Math').get(u'floor')) + pass + var.get(u'module').put(u'exports', var.get(u'baseRepeat')) +PyJs_anonymous_3561_._set_name(u'anonymous') +PyJs_Object_3562_ = Js({}) +@Js +def PyJs_anonymous_3563_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseSlice', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_baseSlice_(array, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'array':array, u'end':end, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'start', u'length', u'result', u'array']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + if (var.get(u'start')var.get(u'length')) else (var.get(u'length')+var.get(u'start')))) + var.put(u'end', (var.get(u'length') if (var.get(u'end')>var.get(u'length')) else var.get(u'end'))) + if (var.get(u'end')var.get(u'end')) else PyJsBshift((var.get(u'end')-var.get(u'start')),Js(0.0)))) + var.put(u'start', Js(0.0), u'>>>') + var.put(u'result', var.get(u'Array')(var.get(u'length'))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))=var.get(u'LARGE_ARRAY_SIZE')): + var.put(u'set', (var.get(u"null") if var.get(u'iteratee') else var.get(u'createSet')(var.get(u'array')))) + if var.get(u'set'): + return var.get(u'setToArray')(var.get(u'set')) + var.put(u'isCommon', Js(False)) + var.put(u'includes', var.get(u'cacheHas')) + var.put(u'seen', var.get(u'SetCache').create()) + else: + var.put(u'seen', (Js([]) if var.get(u'iteratee') else var.get(u'result'))) + class JS_CONTINUE_LABEL_6f75746572(Exception): pass + class JS_BREAK_LABEL_6f75746572(Exception): pass + try: + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))=var.get(u'length'))) else var.get(u'baseSlice')(var.get(u'array'), var.get(u'start'), var.get(u'end'))) + PyJsHoisted_castSlice_.func_name = u'castSlice' + var.put(u'castSlice', PyJsHoisted_castSlice_) + var.put(u'baseSlice', var.get(u'require')(Js(u'./_baseSlice'))) + pass + var.get(u'module').put(u'exports', var.get(u'castSlice')) +PyJs_anonymous_3583_._set_name(u'anonymous') +PyJs_Object_3584_ = Js({u'./_baseSlice':Js(344.0)}) +@Js +def PyJs_anonymous_3585_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'baseIndexOf', u'require', u'exports', u'module', u'charsEndIndex']) + @Js + def PyJsHoisted_charsEndIndex_(strSymbols, chrSymbols, this, arguments, var=var): + var = Scope({u'this':this, u'chrSymbols':chrSymbols, u'arguments':arguments, u'strSymbols':strSymbols}, var) + var.registers([u'index', u'chrSymbols', u'strSymbols']) + var.put(u'index', var.get(u'strSymbols').get(u'length')) + while ((var.put(u'index',Js(var.get(u'index').to_number())-Js(1))+Js(1)) and (var.get(u'baseIndexOf')(var.get(u'chrSymbols'), var.get(u'strSymbols').get(var.get(u'index')), Js(0.0))>(-Js(1.0)))): + pass + return var.get(u'index') + PyJsHoisted_charsEndIndex_.func_name = u'charsEndIndex' + var.put(u'charsEndIndex', PyJsHoisted_charsEndIndex_) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'charsEndIndex')) +PyJs_anonymous_3585_._set_name(u'anonymous') +PyJs_Object_3586_ = Js({u'./_baseIndexOf':Js(325.0)}) +@Js +def PyJs_anonymous_3587_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module', u'checkGlobal']) + @Js + def PyJsHoisted_checkGlobal_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'value') if (var.get(u'value') and PyJsStrictEq(var.get(u'value').get(u'Object'),var.get(u'Object'))) else var.get(u"null")) + PyJsHoisted_checkGlobal_.func_name = u'checkGlobal' + var.put(u'checkGlobal', PyJsHoisted_checkGlobal_) + pass + var.get(u'module').put(u'exports', var.get(u'checkGlobal')) +PyJs_anonymous_3587_._set_name(u'anonymous') +PyJs_Object_3588_ = Js({}) +@Js +def PyJs_anonymous_3589_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneArrayBuffer', u'require', u'exports', u'Uint8Array', u'module']) + @Js + def PyJsHoisted_cloneArrayBuffer_(arrayBuffer, this, arguments, var=var): + var = Scope({u'this':this, u'arrayBuffer':arrayBuffer, u'arguments':arguments}, var) + var.registers([u'arrayBuffer', u'result']) + var.put(u'result', var.get(u'arrayBuffer').get(u'constructor').create(var.get(u'arrayBuffer').get(u'byteLength'))) + var.get(u'Uint8Array').create(var.get(u'result')).callprop(u'set', var.get(u'Uint8Array').create(var.get(u'arrayBuffer'))) + return var.get(u'result') + PyJsHoisted_cloneArrayBuffer_.func_name = u'cloneArrayBuffer' + var.put(u'cloneArrayBuffer', PyJsHoisted_cloneArrayBuffer_) + var.put(u'Uint8Array', var.get(u'require')(Js(u'./_Uint8Array'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneArrayBuffer')) +PyJs_anonymous_3589_._set_name(u'anonymous') +PyJs_Object_3590_ = Js({u'./_Uint8Array':Js(296.0)}) +@Js +def PyJs_anonymous_3591_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneBuffer', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_cloneBuffer_(buffer, isDeep, this, arguments, var=var): + var = Scope({u'buffer':buffer, u'this':this, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'buffer', u'isDeep', u'result']) + if var.get(u'isDeep'): + return var.get(u'buffer').callprop(u'slice') + var.put(u'result', var.get(u'buffer').get(u'constructor').create(var.get(u'buffer').get(u'length'))) + var.get(u'buffer').callprop(u'copy', var.get(u'result')) + return var.get(u'result') + PyJsHoisted_cloneBuffer_.func_name = u'cloneBuffer' + var.put(u'cloneBuffer', PyJsHoisted_cloneBuffer_) + pass + var.get(u'module').put(u'exports', var.get(u'cloneBuffer')) +PyJs_anonymous_3591_._set_name(u'anonymous') +PyJs_Object_3592_ = Js({}) +@Js +def PyJs_anonymous_3593_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneArrayBuffer', u'require', u'exports', u'cloneDataView', u'module']) + @Js + def PyJsHoisted_cloneDataView_(dataView, isDeep, this, arguments, var=var): + var = Scope({u'this':this, u'dataView':dataView, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'buffer', u'dataView', u'isDeep']) + var.put(u'buffer', (var.get(u'cloneArrayBuffer')(var.get(u'dataView').get(u'buffer')) if var.get(u'isDeep') else var.get(u'dataView').get(u'buffer'))) + return var.get(u'dataView').get(u'constructor').create(var.get(u'buffer'), var.get(u'dataView').get(u'byteOffset'), var.get(u'dataView').get(u'byteLength')) + PyJsHoisted_cloneDataView_.func_name = u'cloneDataView' + var.put(u'cloneDataView', PyJsHoisted_cloneDataView_) + var.put(u'cloneArrayBuffer', var.get(u'require')(Js(u'./_cloneArrayBuffer'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneDataView')) +PyJs_anonymous_3593_._set_name(u'anonymous') +PyJs_Object_3594_ = Js({u'./_cloneArrayBuffer':Js(356.0)}) +@Js +def PyJs_anonymous_3595_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'addMapEntry', u'require', u'module', u'arrayReduce', u'mapToArray', u'cloneMap']) + @Js + def PyJsHoisted_cloneMap_(map, isDeep, cloneFunc, this, arguments, var=var): + var = Scope({u'this':this, u'map':map, u'isDeep':isDeep, u'arguments':arguments, u'cloneFunc':cloneFunc}, var) + var.registers([u'map', u'array', u'isDeep', u'cloneFunc']) + var.put(u'array', (var.get(u'cloneFunc')(var.get(u'mapToArray')(var.get(u'map')), var.get(u'true')) if var.get(u'isDeep') else var.get(u'mapToArray')(var.get(u'map')))) + return var.get(u'arrayReduce')(var.get(u'array'), var.get(u'addMapEntry'), var.get(u'map').get(u'constructor').create()) + PyJsHoisted_cloneMap_.func_name = u'cloneMap' + var.put(u'cloneMap', PyJsHoisted_cloneMap_) + var.put(u'addMapEntry', var.get(u'require')(Js(u'./_addMapEntry'))) + var.put(u'arrayReduce', var.get(u'require')(Js(u'./_arrayReduce'))) + var.put(u'mapToArray', var.get(u'require')(Js(u'./_mapToArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneMap')) +PyJs_anonymous_3595_._set_name(u'anonymous') +PyJs_Object_3596_ = Js({u'./_addMapEntry':Js(298.0),u'./_arrayReduce':Js(306.0),u'./_mapToArray':Js(419.0)}) +@Js +def PyJs_anonymous_3597_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'cloneRegExp', u'exports', u'module', u'reFlags']) + @Js + def PyJsHoisted_cloneRegExp_(regexp, this, arguments, var=var): + var = Scope({u'this':this, u'regexp':regexp, u'arguments':arguments}, var) + var.registers([u'regexp', u'result']) + var.put(u'result', var.get(u'regexp').get(u'constructor').create(var.get(u'regexp').get(u'source'), var.get(u'reFlags').callprop(u'exec', var.get(u'regexp')))) + var.get(u'result').put(u'lastIndex', var.get(u'regexp').get(u'lastIndex')) + return var.get(u'result') + PyJsHoisted_cloneRegExp_.func_name = u'cloneRegExp' + var.put(u'cloneRegExp', PyJsHoisted_cloneRegExp_) + var.put(u'reFlags', JsRegExp(u'/\\w*$/')) + pass + var.get(u'module').put(u'exports', var.get(u'cloneRegExp')) +PyJs_anonymous_3597_._set_name(u'anonymous') +PyJs_Object_3598_ = Js({}) +@Js +def PyJs_anonymous_3599_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneSet', u'exports', u'require', u'setToArray', u'addSetEntry', u'module', u'arrayReduce']) + @Js + def PyJsHoisted_cloneSet_(set, isDeep, cloneFunc, this, arguments, var=var): + var = Scope({u'this':this, u'cloneFunc':cloneFunc, u'set':set, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'cloneFunc', u'array', u'set', u'isDeep']) + var.put(u'array', (var.get(u'cloneFunc')(var.get(u'setToArray')(var.get(u'set')), var.get(u'true')) if var.get(u'isDeep') else var.get(u'setToArray')(var.get(u'set')))) + return var.get(u'arrayReduce')(var.get(u'array'), var.get(u'addSetEntry'), var.get(u'set').get(u'constructor').create()) + PyJsHoisted_cloneSet_.func_name = u'cloneSet' + var.put(u'cloneSet', PyJsHoisted_cloneSet_) + var.put(u'addSetEntry', var.get(u'require')(Js(u'./_addSetEntry'))) + var.put(u'arrayReduce', var.get(u'require')(Js(u'./_arrayReduce'))) + var.put(u'setToArray', var.get(u'require')(Js(u'./_setToArray'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneSet')) +PyJs_anonymous_3599_._set_name(u'anonymous') +PyJs_Object_3600_ = Js({u'./_addSetEntry':Js(299.0),u'./_arrayReduce':Js(306.0),u'./_setToArray':Js(425.0)}) +@Js +def PyJs_anonymous_3601_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'cloneSymbol', u'Symbol', u'symbolValueOf', u'module', u'symbolProto', u'require']) + @Js + def PyJsHoisted_cloneSymbol_(symbol, this, arguments, var=var): + var = Scope({u'this':this, u'symbol':symbol, u'arguments':arguments}, var) + var.registers([u'symbol']) + PyJs_Object_3602_ = Js({}) + return (var.get(u'Object')(var.get(u'symbolValueOf').callprop(u'call', var.get(u'symbol'))) if var.get(u'symbolValueOf') else PyJs_Object_3602_) + PyJsHoisted_cloneSymbol_.func_name = u'cloneSymbol' + var.put(u'cloneSymbol', PyJsHoisted_cloneSymbol_) + var.put(u'Symbol', var.get(u'require')(Js(u'./_Symbol'))) + var.put(u'symbolProto', (var.get(u'Symbol').get(u'prototype') if var.get(u'Symbol') else var.get(u'undefined'))) + var.put(u'symbolValueOf', (var.get(u'symbolProto').get(u'valueOf') if var.get(u'symbolProto') else var.get(u'undefined'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneSymbol')) +PyJs_anonymous_3601_._set_name(u'anonymous') +PyJs_Object_3603_ = Js({u'./_Symbol':Js(295.0)}) +@Js +def PyJs_anonymous_3604_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'cloneArrayBuffer', u'require', u'exports', u'module', u'cloneTypedArray']) + @Js + def PyJsHoisted_cloneTypedArray_(typedArray, isDeep, this, arguments, var=var): + var = Scope({u'this':this, u'typedArray':typedArray, u'isDeep':isDeep, u'arguments':arguments}, var) + var.registers([u'buffer', u'typedArray', u'isDeep']) + var.put(u'buffer', (var.get(u'cloneArrayBuffer')(var.get(u'typedArray').get(u'buffer')) if var.get(u'isDeep') else var.get(u'typedArray').get(u'buffer'))) + return var.get(u'typedArray').get(u'constructor').create(var.get(u'buffer'), var.get(u'typedArray').get(u'byteOffset'), var.get(u'typedArray').get(u'length')) + PyJsHoisted_cloneTypedArray_.func_name = u'cloneTypedArray' + var.put(u'cloneTypedArray', PyJsHoisted_cloneTypedArray_) + var.put(u'cloneArrayBuffer', var.get(u'require')(Js(u'./_cloneArrayBuffer'))) + pass + var.get(u'module').put(u'exports', var.get(u'cloneTypedArray')) +PyJs_anonymous_3604_._set_name(u'anonymous') +PyJs_Object_3605_ = Js({u'./_cloneArrayBuffer':Js(356.0)}) +@Js +def PyJs_anonymous_3606_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'compareAscending', u'require', u'isSymbol', u'exports', u'module']) + @Js + def PyJsHoisted_compareAscending_(value, other, this, arguments, var=var): + var = Scope({u'this':this, u'other':other, u'arguments':arguments, u'value':value}, var) + var.registers([u'valIsSymbol', u'valIsNull', u'value', u'valIsDefined', u'othIsNull', u'othIsReflexive', u'othIsSymbol', u'othIsDefined', u'other', u'valIsReflexive']) + if PyJsStrictNeq(var.get(u'value'),var.get(u'other')): + var.put(u'valIsDefined', PyJsStrictNeq(var.get(u'value'),var.get(u'undefined'))) + var.put(u'valIsNull', PyJsStrictEq(var.get(u'value'),var.get(u"null"))) + var.put(u'valIsReflexive', PyJsStrictEq(var.get(u'value'),var.get(u'value'))) + var.put(u'valIsSymbol', var.get(u'isSymbol')(var.get(u'value'))) + var.put(u'othIsDefined', PyJsStrictNeq(var.get(u'other'),var.get(u'undefined'))) + var.put(u'othIsNull', PyJsStrictEq(var.get(u'other'),var.get(u"null"))) + var.put(u'othIsReflexive', PyJsStrictEq(var.get(u'other'),var.get(u'other'))) + var.put(u'othIsSymbol', var.get(u'isSymbol')(var.get(u'other'))) + def PyJs_LONG_3607_(var=var): + return ((((((var.get(u'othIsNull').neg() and var.get(u'othIsSymbol').neg()) and var.get(u'valIsSymbol').neg()) and (var.get(u'value')>var.get(u'other'))) or ((((var.get(u'valIsSymbol') and var.get(u'othIsDefined')) and var.get(u'othIsReflexive')) and var.get(u'othIsNull').neg()) and var.get(u'othIsSymbol').neg())) or ((var.get(u'valIsNull') and var.get(u'othIsDefined')) and var.get(u'othIsReflexive'))) or (var.get(u'valIsDefined').neg() and var.get(u'othIsReflexive'))) + if (PyJs_LONG_3607_() or var.get(u'valIsReflexive').neg()): + return Js(1.0) + def PyJs_LONG_3608_(var=var): + return ((((((var.get(u'valIsNull').neg() and var.get(u'valIsSymbol').neg()) and var.get(u'othIsSymbol').neg()) and (var.get(u'value')=var.get(u'ordersLength')): + return var.get(u'result') + var.put(u'order', var.get(u'orders').get(var.get(u'index'))) + return (var.get(u'result')*((-Js(1.0)) if (var.get(u'order')==Js(u'desc')) else Js(1.0))) + return (var.get(u'object').get(u'index')-var.get(u'other').get(u'index')) + PyJsHoisted_compareMultiple_.func_name = u'compareMultiple' + var.put(u'compareMultiple', PyJsHoisted_compareMultiple_) + var.put(u'compareAscending', var.get(u'require')(Js(u'./_compareAscending'))) + pass + var.get(u'module').put(u'exports', var.get(u'compareMultiple')) +PyJs_anonymous_3610_._set_name(u'anonymous') +PyJs_Object_3611_ = Js({u'./_compareAscending':Js(364.0)}) +@Js +def PyJs_anonymous_3612_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'copyArray', u'exports', u'module']) + @Js + def PyJsHoisted_copyArray_(source, array, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'source']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'source').get(u'length')) + (var.get(u'array') or var.put(u'array', var.get(u'Array')(var.get(u'length')))) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))Js(1.0)) else var.get(u'undefined'))) + var.put(u'guard', (var.get(u'sources').get(u'2') if (var.get(u'length')>Js(2.0)) else var.get(u'undefined'))) + var.put(u'customizer', (PyJsComma((var.put(u'length',Js(var.get(u'length').to_number())-Js(1))+Js(1)),var.get(u'customizer')) if ((var.get(u'assigner').get(u'length')>Js(3.0)) and (var.get(u'customizer',throw=False).typeof()==Js(u'function'))) else var.get(u'undefined'))) + if (var.get(u'guard') and var.get(u'isIterateeCall')(var.get(u'sources').get(u'0'), var.get(u'sources').get(u'1'), var.get(u'guard'))): + var.put(u'customizer', (var.get(u'undefined') if (var.get(u'length')(-Js(1.0))) else var.get(u'undefined')) + PyJs_anonymous_3631_._set_name(u'anonymous') + return PyJs_anonymous_3631_ + PyJsHoisted_createFind_.func_name = u'createFind' + var.put(u'createFind', PyJsHoisted_createFind_) + var.put(u'baseIteratee', var.get(u'require')(Js(u'./_baseIteratee'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'keys', var.get(u'require')(Js(u'./keys'))) + pass + var.get(u'module').put(u'exports', var.get(u'createFind')) +PyJs_anonymous_3630_._set_name(u'anonymous') +PyJs_Object_3633_ = Js({u'./_baseIteratee':Js(331.0),u'./isArrayLike':Js(459.0),u'./keys':Js(474.0)}) +@Js +def PyJs_anonymous_3634_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'Set', u'INFINITY', u'require', u'setToArray', u'module', u'noop', u'createSet']) + var.put(u'Set', var.get(u'require')(Js(u'./_Set'))) + var.put(u'noop', var.get(u'require')(Js(u'./noop'))) + var.put(u'setToArray', var.get(u'require')(Js(u'./_setToArray'))) + var.put(u'INFINITY', (Js(1.0)/Js(0.0))) + @Js + def PyJs_anonymous_3635_(values, this, arguments, var=var): + var = Scope({u'this':this, u'values':values, u'arguments':arguments}, var) + var.registers([u'values']) + return var.get(u'Set').create(var.get(u'values')) + PyJs_anonymous_3635_._set_name(u'anonymous') + var.put(u'createSet', (var.get(u'noop') if (var.get(u'Set') and ((Js(1.0)/var.get(u'setToArray')(var.get(u'Set').create(Js([None, (-Js(0.0))]))).get(u'1'))==var.get(u'INFINITY'))).neg() else PyJs_anonymous_3635_)) + var.get(u'module').put(u'exports', var.get(u'createSet')) +PyJs_anonymous_3634_._set_name(u'anonymous') +PyJs_Object_3636_ = Js({u'./_Set':Js(292.0),u'./_setToArray':Js(425.0),u'./noop':Js(479.0)}) +@Js +def PyJs_anonymous_3637_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'PARTIAL_COMPARE_FLAG', u'exports', u'SetCache', u'arraySome', u'UNORDERED_COMPARE_FLAG', u'equalArrays', u'module', u'require']) + @Js + def PyJsHoisted_equalArrays_(array, other, equalFunc, customizer, bitmask, stack, this, arguments, var=var): + var = Scope({u'equalFunc':equalFunc, u'this':this, u'bitmask':bitmask, u'other':other, u'arguments':arguments, u'array':array, u'customizer':customizer, u'stack':stack}, var) + var.registers([u'index', u'compared', u'stacked', u'arrValue', u'equalFunc', u'othLength', u'stack', u'arrLength', u'isPartial', u'other', u'result', u'bitmask', u'seen', u'othValue', u'customizer', u'array']) + var.put(u'isPartial', (var.get(u'bitmask')&var.get(u'PARTIAL_COMPARE_FLAG'))) + var.put(u'arrLength', var.get(u'array').get(u'length')) + var.put(u'othLength', var.get(u'other').get(u'length')) + if ((var.get(u'arrLength')!=var.get(u'othLength')) and (var.get(u'isPartial') and (var.get(u'othLength')>var.get(u'arrLength'))).neg()): + return Js(False) + var.put(u'stacked', var.get(u'stack').callprop(u'get', var.get(u'array'))) + if var.get(u'stacked'): + return (var.get(u'stacked')==var.get(u'other')) + var.put(u'index', (-Js(1.0))) + var.put(u'result', var.get(u'true')) + var.put(u'seen', (var.get(u'SetCache').create() if (var.get(u'bitmask')&var.get(u'UNORDERED_COMPARE_FLAG')) else var.get(u'undefined'))) + var.get(u'stack').callprop(u'set', var.get(u'array'), var.get(u'other')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))(-Js(1.0))) and ((var.get(u'value')%Js(1.0))==Js(0.0))) and (var.get(u'value')(-Js(1.0))) + PyJsHoisted_listCacheHas_.func_name = u'listCacheHas' + var.put(u'listCacheHas', PyJsHoisted_listCacheHas_) + var.put(u'assocIndexOf', var.get(u'require')(Js(u'./_assocIndexOf'))) + pass + var.get(u'module').put(u'exports', var.get(u'listCacheHas')) +PyJs_anonymous_3718_._set_name(u'anonymous') +PyJs_Object_3719_ = Js({u'./_assocIndexOf':Js(311.0)}) +@Js +def PyJs_anonymous_3720_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'assocIndexOf', u'listCacheSet', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_listCacheSet_(key, value, this, arguments, var=var): + var = Scope({u'this':this, u'value':value, u'key':key, u'arguments':arguments}, var) + var.registers([u'index', u'data', u'value', u'key']) + var.put(u'data', var.get(u"this").get(u'__data__')) + var.put(u'index', var.get(u'assocIndexOf')(var.get(u'data'), var.get(u'key'))) + if (var.get(u'index')(-Js(1.0)))) if var.get(u'isString')(var.get(u'collection')) else (var.get(u'length').neg().neg() and (var.get(u'baseIndexOf')(var.get(u'collection'), var.get(u'value'), var.get(u'fromIndex'))>(-Js(1.0))))) + PyJsHoisted_includes_.func_name = u'includes' + var.put(u'includes', PyJsHoisted_includes_) + var.put(u'baseIndexOf', var.get(u'require')(Js(u'./_baseIndexOf'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isString', var.get(u'require')(Js(u'./isString'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'values', var.get(u'require')(Js(u'./values'))) + var.put(u'nativeMax', var.get(u'Math').get(u'max')) + pass + var.get(u'module').put(u'exports', var.get(u'includes')) +PyJs_anonymous_3820_._set_name(u'anonymous') +PyJs_Object_3821_ = Js({u'./_baseIndexOf':Js(325.0),u'./isArrayLike':Js(459.0),u'./isString':Js(471.0),u'./toInteger':Js(490.0),u'./values':Js(496.0)}) +@Js +def PyJs_anonymous_3822_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'propertyIsEnumerable', u'exports', u'objectToString', u'require', u'module', u'hasOwnProperty', u'isArrayLikeObject', u'objectProto', u'argsTag', u'isArguments']) + @Js + def PyJsHoisted_isArguments_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'isArrayLikeObject')(var.get(u'value')) and var.get(u'hasOwnProperty').callprop(u'call', var.get(u'value'), Js(u'callee'))) and (var.get(u'propertyIsEnumerable').callprop(u'call', var.get(u'value'), Js(u'callee')).neg() or (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'argsTag')))) + PyJsHoisted_isArguments_.func_name = u'isArguments' + var.put(u'isArguments', PyJsHoisted_isArguments_) + var.put(u'isArrayLikeObject', var.get(u'require')(Js(u'./isArrayLikeObject'))) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + var.put(u'propertyIsEnumerable', var.get(u'objectProto').get(u'propertyIsEnumerable')) + pass + var.get(u'module').put(u'exports', var.get(u'isArguments')) +PyJs_anonymous_3822_._set_name(u'anonymous') +PyJs_Object_3823_ = Js({u'./isArrayLikeObject':Js(460.0)}) +@Js +def PyJs_anonymous_3824_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'require', u'exports', u'module']) + var.put(u'isArray', var.get(u'Array').get(u'isArray')) + var.get(u'module').put(u'exports', var.get(u'isArray')) +PyJs_anonymous_3824_._set_name(u'anonymous') +PyJs_Object_3825_ = Js({}) +@Js +def PyJs_anonymous_3826_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isLength', u'getLength', u'require', u'module', u'isArrayLike', u'isFunction']) + @Js + def PyJsHoisted_isArrayLike_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (((var.get(u'value')!=var.get(u"null")) and var.get(u'isLength')(var.get(u'getLength')(var.get(u'value')))) and var.get(u'isFunction')(var.get(u'value')).neg()) + PyJsHoisted_isArrayLike_.func_name = u'isArrayLike' + var.put(u'isArrayLike', PyJsHoisted_isArrayLike_) + var.put(u'getLength', var.get(u'require')(Js(u'./_getLength'))) + var.put(u'isFunction', var.get(u'require')(Js(u'./isFunction'))) + var.put(u'isLength', var.get(u'require')(Js(u'./isLength'))) + pass + var.get(u'module').put(u'exports', var.get(u'isArrayLike')) +PyJs_anonymous_3826_._set_name(u'anonymous') +PyJs_Object_3827_ = Js({u'./_getLength':Js(379.0),u'./isFunction':Js(463.0),u'./isLength':Js(465.0)}) +@Js +def PyJs_anonymous_3828_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isArrayLike', u'require', u'module', u'isArrayLikeObject', u'isObjectLike']) + @Js + def PyJsHoisted_isArrayLikeObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'isObjectLike')(var.get(u'value')) and var.get(u'isArrayLike')(var.get(u'value'))) + PyJsHoisted_isArrayLikeObject_.func_name = u'isArrayLikeObject' + var.put(u'isArrayLikeObject', PyJsHoisted_isArrayLikeObject_) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + pass + var.get(u'module').put(u'exports', var.get(u'isArrayLikeObject')) +PyJs_anonymous_3828_._set_name(u'anonymous') +PyJs_Object_3829_ = Js({u'./isArrayLike':Js(459.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3830_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isBoolean', u'objectToString', u'require', u'boolTag', u'module', u'isObjectLike', u'objectProto']) + @Js + def PyJsHoisted_isBoolean_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((PyJsStrictEq(var.get(u'value'),var.get(u'true')) or PyJsStrictEq(var.get(u'value'),Js(False))) or (var.get(u'isObjectLike')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'boolTag')))) + PyJsHoisted_isBoolean_.func_name = u'isBoolean' + var.put(u'isBoolean', PyJsHoisted_isBoolean_) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isBoolean')) +PyJs_anonymous_3830_._set_name(u'anonymous') +PyJs_Object_3831_ = Js({u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3832_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'freeModule', u'Buffer', u'root', u'require', u'freeExports', u'module', u'moduleExports', u'stubFalse', u'isBuffer']) + var.put(u'root', var.get(u'require')(Js(u'./_root'))) + var.put(u'stubFalse', var.get(u'require')(Js(u'./stubFalse'))) + var.put(u'freeExports', ((var.get(u'exports',throw=False).typeof()==Js(u'object')) and var.get(u'exports'))) + var.put(u'freeModule', ((var.get(u'freeExports') and (var.get(u'module',throw=False).typeof()==Js(u'object'))) and var.get(u'module'))) + var.put(u'moduleExports', (var.get(u'freeModule') and PyJsStrictEq(var.get(u'freeModule').get(u'exports'),var.get(u'freeExports')))) + var.put(u'Buffer', (var.get(u'root').get(u'Buffer') if var.get(u'moduleExports') else var.get(u'undefined'))) + @Js + def PyJs_anonymous_3833_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return var.get(u'value').instanceof(var.get(u'Buffer')) + PyJs_anonymous_3833_._set_name(u'anonymous') + var.put(u'isBuffer', (var.get(u'stubFalse') if var.get(u'Buffer').neg() else PyJs_anonymous_3833_)) + var.get(u'module').put(u'exports', var.get(u'isBuffer')) +PyJs_anonymous_3832_._set_name(u'anonymous') +PyJs_Object_3834_ = Js({u'./_root':Js(422.0),u'./stubFalse':Js(488.0)}) +@Js +def PyJs_anonymous_3835_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'genTag', u'exports', u'module', u'objectToString', u'require', u'isFunction', u'funcTag', u'objectProto', u'isObject']) + @Js + def PyJsHoisted_isFunction_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'tag', u'value']) + var.put(u'tag', (var.get(u'objectToString').callprop(u'call', var.get(u'value')) if var.get(u'isObject')(var.get(u'value')) else Js(u''))) + return ((var.get(u'tag')==var.get(u'funcTag')) or (var.get(u'tag')==var.get(u'genTag'))) + PyJsHoisted_isFunction_.func_name = u'isFunction' + var.put(u'isFunction', PyJsHoisted_isFunction_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'funcTag', Js(u'[object Function]')) + var.put(u'genTag', Js(u'[object GeneratorFunction]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isFunction')) +PyJs_anonymous_3835_._set_name(u'anonymous') +PyJs_Object_3836_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3837_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'toInteger', u'exports', u'require', u'module', u'isInteger']) + @Js + def PyJsHoisted_isInteger_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'number')) and (var.get(u'value')==var.get(u'toInteger')(var.get(u'value')))) + PyJsHoisted_isInteger_.func_name = u'isInteger' + var.put(u'isInteger', PyJsHoisted_isInteger_) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + pass + var.get(u'module').put(u'exports', var.get(u'isInteger')) +PyJs_anonymous_3837_._set_name(u'anonymous') +PyJs_Object_3838_ = Js({u'./toInteger':Js(490.0)}) +@Js +def PyJs_anonymous_3839_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'MAX_SAFE_INTEGER', u'require', u'isLength', u'exports', u'module']) + @Js + def PyJsHoisted_isLength_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((((var.get(u'value',throw=False).typeof()==Js(u'number')) and (var.get(u'value')>(-Js(1.0)))) and ((var.get(u'value')%Js(1.0))==Js(0.0))) and (var.get(u'value')<=var.get(u'MAX_SAFE_INTEGER'))) + PyJsHoisted_isLength_.func_name = u'isLength' + var.put(u'isLength', PyJsHoisted_isLength_) + var.put(u'MAX_SAFE_INTEGER', Js(9007199254740991.0)) + pass + var.get(u'module').put(u'exports', var.get(u'isLength')) +PyJs_anonymous_3839_._set_name(u'anonymous') +PyJs_Object_3840_ = Js({}) +@Js +def PyJs_anonymous_3841_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'objectToString', u'require', u'module', u'numberTag', u'isObjectLike', u'objectProto', u'isNumber']) + @Js + def PyJsHoisted_isNumber_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'number')) or (var.get(u'isObjectLike')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'numberTag')))) + PyJsHoisted_isNumber_.func_name = u'isNumber' + var.put(u'isNumber', PyJsHoisted_isNumber_) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isNumber')) +PyJs_anonymous_3841_._set_name(u'anonymous') +PyJs_Object_3842_ = Js({u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3843_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'isObject', u'module']) + @Js + def PyJsHoisted_isObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'type', u'value']) + var.put(u'type', var.get(u'value',throw=False).typeof()) + return (var.get(u'value').neg().neg() and ((var.get(u'type')==Js(u'object')) or (var.get(u'type')==Js(u'function')))) + PyJsHoisted_isObject_.func_name = u'isObject' + var.put(u'isObject', PyJsHoisted_isObject_) + pass + var.get(u'module').put(u'exports', var.get(u'isObject')) +PyJs_anonymous_3843_._set_name(u'anonymous') +PyJs_Object_3844_ = Js({}) +@Js +def PyJs_anonymous_3845_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isObjectLike', u'require', u'exports', u'module']) + @Js + def PyJsHoisted_isObjectLike_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'value').neg().neg() and (var.get(u'value',throw=False).typeof()==Js(u'object'))) + PyJsHoisted_isObjectLike_.func_name = u'isObjectLike' + var.put(u'isObjectLike', PyJsHoisted_isObjectLike_) + pass + var.get(u'module').put(u'exports', var.get(u'isObjectLike')) +PyJs_anonymous_3845_._set_name(u'anonymous') +PyJs_Object_3846_ = Js({}) +@Js +def PyJs_anonymous_3847_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'isPlainObject', u'objectTag', u'funcToString', u'isHostObject', u'objectCtorString', u'require', u'objectToString', u'module', u'hasOwnProperty', u'isObjectLike', u'getPrototype', u'objectProto']) + @Js + def PyJsHoisted_isPlainObject_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value', u'Ctor', u'proto']) + if ((var.get(u'isObjectLike')(var.get(u'value')).neg() or (var.get(u'objectToString').callprop(u'call', var.get(u'value'))!=var.get(u'objectTag'))) or var.get(u'isHostObject')(var.get(u'value'))): + return Js(False) + var.put(u'proto', var.get(u'getPrototype')(var.get(u'value'))) + if PyJsStrictEq(var.get(u'proto'),var.get(u"null")): + return var.get(u'true') + var.put(u'Ctor', (var.get(u'hasOwnProperty').callprop(u'call', var.get(u'proto'), Js(u'constructor')) and var.get(u'proto').get(u'constructor'))) + return (((var.get(u'Ctor',throw=False).typeof()==Js(u'function')) and var.get(u'Ctor').instanceof(var.get(u'Ctor'))) and (var.get(u'funcToString').callprop(u'call', var.get(u'Ctor'))==var.get(u'objectCtorString'))) + PyJsHoisted_isPlainObject_.func_name = u'isPlainObject' + var.put(u'isPlainObject', PyJsHoisted_isPlainObject_) + var.put(u'getPrototype', var.get(u'require')(Js(u'./_getPrototype'))) + var.put(u'isHostObject', var.get(u'require')(Js(u'./_isHostObject'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'funcToString', var.get(u'Function').get(u'prototype').get(u'toString')) + var.put(u'hasOwnProperty', var.get(u'objectProto').get(u'hasOwnProperty')) + var.put(u'objectCtorString', var.get(u'funcToString').callprop(u'call', var.get(u'Object'))) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isPlainObject')) +PyJs_anonymous_3847_._set_name(u'anonymous') +PyJs_Object_3848_ = Js({u'./_getPrototype':Js(383.0),u'./_isHostObject':Js(400.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3849_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'regexpTag', u'exports', u'objectToString', u'require', u'module', u'objectProto', u'isObject', u'isRegExp']) + @Js + def PyJsHoisted_isRegExp_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return (var.get(u'isObject')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'regexpTag'))) + PyJsHoisted_isRegExp_.func_name = u'isRegExp' + var.put(u'isRegExp', PyJsHoisted_isRegExp_) + var.put(u'isObject', var.get(u'require')(Js(u'./isObject'))) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isRegExp')) +PyJs_anonymous_3849_._set_name(u'anonymous') +PyJs_Object_3850_ = Js({u'./isObject':Js(467.0)}) +@Js +def PyJs_anonymous_3851_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'isArray', u'exports', u'isString', u'objectToString', u'require', u'stringTag', u'module', u'isObjectLike', u'objectProto']) + @Js + def PyJsHoisted_isString_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'string')) or ((var.get(u'isArray')(var.get(u'value')).neg() and var.get(u'isObjectLike')(var.get(u'value'))) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'stringTag')))) + PyJsHoisted_isString_.func_name = u'isString' + var.put(u'isString', PyJsHoisted_isString_) + var.put(u'isArray', var.get(u'require')(Js(u'./isArray'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isString')) +PyJs_anonymous_3851_._set_name(u'anonymous') +PyJs_Object_3852_ = Js({u'./isArray':Js(458.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3853_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'objectToString', u'require', u'module', u'isObjectLike', u'objectProto', u'isSymbol', u'symbolTag']) + @Js + def PyJsHoisted_isSymbol_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'value',throw=False).typeof()==Js(u'symbol')) or (var.get(u'isObjectLike')(var.get(u'value')) and (var.get(u'objectToString').callprop(u'call', var.get(u'value'))==var.get(u'symbolTag')))) + PyJsHoisted_isSymbol_.func_name = u'isSymbol' + var.put(u'isSymbol', PyJsHoisted_isSymbol_) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'symbolTag', Js(u'[object Symbol]')) + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isSymbol')) +PyJs_anonymous_3853_._set_name(u'anonymous') +PyJs_Object_3854_ = Js({u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3855_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'arrayTag', u'typedArrayTags', u'uint32Tag', u'arrayBufferTag', u'objectTag', u'dataViewTag', u'int8Tag', u'isObjectLike', u'errorTag', u'float64Tag', u'isLength', u'boolTag', u'funcTag', u'isTypedArray', u'float32Tag', u'argsTag', u'regexpTag', u'exports', u'dateTag', u'setTag', u'stringTag', u'int32Tag', u'module', u'mapTag', u'uint8Tag', u'require', u'objectToString', u'uint16Tag', u'weakMapTag', u'int16Tag', u'numberTag', u'objectProto', u'uint8ClampedTag']) + @Js + def PyJsHoisted_isTypedArray_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((var.get(u'isObjectLike')(var.get(u'value')) and var.get(u'isLength')(var.get(u'value').get(u'length'))) and var.get(u'typedArrayTags').get(var.get(u'objectToString').callprop(u'call', var.get(u'value'))).neg().neg()) + PyJsHoisted_isTypedArray_.func_name = u'isTypedArray' + var.put(u'isTypedArray', PyJsHoisted_isTypedArray_) + var.put(u'isLength', var.get(u'require')(Js(u'./isLength'))) + var.put(u'isObjectLike', var.get(u'require')(Js(u'./isObjectLike'))) + var.put(u'argsTag', Js(u'[object Arguments]')) + var.put(u'arrayTag', Js(u'[object Array]')) + var.put(u'boolTag', Js(u'[object Boolean]')) + var.put(u'dateTag', Js(u'[object Date]')) + var.put(u'errorTag', Js(u'[object Error]')) + var.put(u'funcTag', Js(u'[object Function]')) + var.put(u'mapTag', Js(u'[object Map]')) + var.put(u'numberTag', Js(u'[object Number]')) + var.put(u'objectTag', Js(u'[object Object]')) + var.put(u'regexpTag', Js(u'[object RegExp]')) + var.put(u'setTag', Js(u'[object Set]')) + var.put(u'stringTag', Js(u'[object String]')) + var.put(u'weakMapTag', Js(u'[object WeakMap]')) + var.put(u'arrayBufferTag', Js(u'[object ArrayBuffer]')) + var.put(u'dataViewTag', Js(u'[object DataView]')) + var.put(u'float32Tag', Js(u'[object Float32Array]')) + var.put(u'float64Tag', Js(u'[object Float64Array]')) + var.put(u'int8Tag', Js(u'[object Int8Array]')) + var.put(u'int16Tag', Js(u'[object Int16Array]')) + var.put(u'int32Tag', Js(u'[object Int32Array]')) + var.put(u'uint8Tag', Js(u'[object Uint8Array]')) + var.put(u'uint8ClampedTag', Js(u'[object Uint8ClampedArray]')) + var.put(u'uint16Tag', Js(u'[object Uint16Array]')) + var.put(u'uint32Tag', Js(u'[object Uint32Array]')) + PyJs_Object_3856_ = Js({}) + var.put(u'typedArrayTags', PyJs_Object_3856_) + def PyJs_LONG_3857_(var=var): + return var.get(u'typedArrayTags').put(var.get(u'int8Tag'), var.get(u'typedArrayTags').put(var.get(u'int16Tag'), var.get(u'typedArrayTags').put(var.get(u'int32Tag'), var.get(u'typedArrayTags').put(var.get(u'uint8Tag'), var.get(u'typedArrayTags').put(var.get(u'uint8ClampedTag'), var.get(u'typedArrayTags').put(var.get(u'uint16Tag'), var.get(u'typedArrayTags').put(var.get(u'uint32Tag'), var.get(u'true')))))))) + var.get(u'typedArrayTags').put(var.get(u'float32Tag'), var.get(u'typedArrayTags').put(var.get(u'float64Tag'), PyJs_LONG_3857_())) + def PyJs_LONG_3859_(var=var): + def PyJs_LONG_3858_(var=var): + return var.get(u'typedArrayTags').put(var.get(u'funcTag'), var.get(u'typedArrayTags').put(var.get(u'mapTag'), var.get(u'typedArrayTags').put(var.get(u'numberTag'), var.get(u'typedArrayTags').put(var.get(u'objectTag'), var.get(u'typedArrayTags').put(var.get(u'regexpTag'), var.get(u'typedArrayTags').put(var.get(u'setTag'), var.get(u'typedArrayTags').put(var.get(u'stringTag'), var.get(u'typedArrayTags').put(var.get(u'weakMapTag'), Js(False))))))))) + return var.get(u'typedArrayTags').put(var.get(u'argsTag'), var.get(u'typedArrayTags').put(var.get(u'arrayTag'), var.get(u'typedArrayTags').put(var.get(u'arrayBufferTag'), var.get(u'typedArrayTags').put(var.get(u'boolTag'), var.get(u'typedArrayTags').put(var.get(u'dataViewTag'), var.get(u'typedArrayTags').put(var.get(u'dateTag'), var.get(u'typedArrayTags').put(var.get(u'errorTag'), PyJs_LONG_3858_()))))))) + PyJs_LONG_3859_() + var.put(u'objectProto', var.get(u'Object').get(u'prototype')) + var.put(u'objectToString', var.get(u'objectProto').get(u'toString')) + pass + var.get(u'module').put(u'exports', var.get(u'isTypedArray')) +PyJs_anonymous_3855_._set_name(u'anonymous') +PyJs_Object_3860_ = Js({u'./isLength':Js(465.0),u'./isObjectLike':Js(468.0)}) +@Js +def PyJs_anonymous_3861_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'indexKeys', u'exports', u'baseHas', u'baseKeys', u'keys', u'isArrayLike', u'require', u'isIndex', u'module', u'isPrototype']) + @Js + def PyJsHoisted_keys_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'skipIndexes', u'object', u'indexes', u'length', u'result', u'key', u'isProto']) + var.put(u'isProto', var.get(u'isPrototype')(var.get(u'object'))) + if (var.get(u'isProto') or var.get(u'isArrayLike')(var.get(u'object'))).neg(): + return var.get(u'baseKeys')(var.get(u'object')) + var.put(u'indexes', var.get(u'indexKeys')(var.get(u'object'))) + var.put(u'skipIndexes', var.get(u'indexes').neg().neg()) + var.put(u'result', (var.get(u'indexes') or Js([]))) + var.put(u'length', var.get(u'result').get(u'length')) + for PyJsTemp in var.get(u'object'): + var.put(u'key', PyJsTemp) + if ((var.get(u'baseHas')(var.get(u'object'), var.get(u'key')) and (var.get(u'skipIndexes') and ((var.get(u'key')==Js(u'length')) or var.get(u'isIndex')(var.get(u'key'), var.get(u'length')))).neg()) and (var.get(u'isProto') and (var.get(u'key')==Js(u'constructor'))).neg()): + var.get(u'result').callprop(u'push', var.get(u'key')) + return var.get(u'result') + PyJsHoisted_keys_.func_name = u'keys' + var.put(u'keys', PyJsHoisted_keys_) + var.put(u'baseHas', var.get(u'require')(Js(u'./_baseHas'))) + var.put(u'baseKeys', var.get(u'require')(Js(u'./_baseKeys'))) + var.put(u'indexKeys', var.get(u'require')(Js(u'./_indexKeys'))) + var.put(u'isArrayLike', var.get(u'require')(Js(u'./isArrayLike'))) + var.put(u'isIndex', var.get(u'require')(Js(u'./_isIndex'))) + var.put(u'isPrototype', var.get(u'require')(Js(u'./_isPrototype'))) + pass + var.get(u'module').put(u'exports', var.get(u'keys')) +PyJs_anonymous_3861_._set_name(u'anonymous') +PyJs_Object_3862_ = Js({u'./_baseHas':Js(323.0),u'./_baseKeys':Js(332.0),u'./_indexKeys':Js(393.0),u'./_isIndex':Js(401.0),u'./_isPrototype':Js(406.0),u'./isArrayLike':Js(459.0)}) +@Js +def PyJs_anonymous_3863_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'indexKeys', u'exports', u'baseKeysIn', u'require', u'isIndex', u'module', u'keysIn', u'isPrototype', u'hasOwnProperty', u'objectProto']) + @Js + def PyJsHoisted_keysIn_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'skipIndexes', u'index', u'object', u'indexes', u'length', u'result', u'key', u'props', u'isProto', u'propsLength']) + var.put(u'index', (-Js(1.0))) + var.put(u'isProto', var.get(u'isPrototype')(var.get(u'object'))) + var.put(u'props', var.get(u'baseKeysIn')(var.get(u'object'))) + var.put(u'propsLength', var.get(u'props').get(u'length')) + var.put(u'indexes', var.get(u'indexKeys')(var.get(u'object'))) + var.put(u'skipIndexes', var.get(u'indexes').neg().neg()) + var.put(u'result', (var.get(u'indexes') or Js([]))) + var.put(u'length', var.get(u'result').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))Js(1.0)) and var.get(u'isIterateeCall')(var.get(u'collection'), var.get(u'iteratees').get(u'0'), var.get(u'iteratees').get(u'1'))): + var.put(u'iteratees', Js([])) + else: + if ((var.get(u'length')>Js(2.0)) and var.get(u'isIterateeCall')(var.get(u'iteratees').get(u'0'), var.get(u'iteratees').get(u'1'), var.get(u'iteratees').get(u'2'))): + var.put(u'iteratees', Js([var.get(u'iteratees').get(u'0')])) + var.put(u'iteratees', (var.get(u'iteratees').get(u'0') if ((var.get(u'iteratees').get(u'length')==Js(1.0)) and var.get(u'isArray')(var.get(u'iteratees').get(u'0'))) else var.get(u'baseFlatten')(var.get(u'iteratees'), Js(1.0), var.get(u'isFlattenableIteratee')))) + return var.get(u'baseOrderBy')(var.get(u'collection'), var.get(u'iteratees'), Js([])) + PyJs_anonymous_3887_._set_name(u'anonymous') + var.put(u'sortBy', var.get(u'rest')(PyJs_anonymous_3887_)) + var.get(u'module').put(u'exports', var.get(u'sortBy')) +PyJs_anonymous_3886_._set_name(u'anonymous') +PyJs_Object_3888_ = Js({u'./_baseFlatten':Js(318.0),u'./_baseOrderBy':Js(339.0),u'./_isFlattenableIteratee':Js(399.0),u'./_isIterateeCall':Js(402.0),u'./isArray':Js(458.0),u'./rest':Js(484.0)}) +@Js +def PyJs_anonymous_3889_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'startsWith', u'exports', u'toInteger', u'baseToString', u'baseClamp', u'module', u'toString', u'require']) + @Js + def PyJsHoisted_startsWith_(string, target, position, this, arguments, var=var): + var = Scope({u'this':this, u'position':position, u'string':string, u'arguments':arguments, u'target':target}, var) + var.registers([u'position', u'string', u'target']) + var.put(u'string', var.get(u'toString')(var.get(u'string'))) + var.put(u'position', var.get(u'baseClamp')(var.get(u'toInteger')(var.get(u'position')), Js(0.0), var.get(u'string').get(u'length'))) + return (var.get(u'string').callprop(u'lastIndexOf', var.get(u'baseToString')(var.get(u'target')), var.get(u'position'))==var.get(u'position')) + PyJsHoisted_startsWith_.func_name = u'startsWith' + var.put(u'startsWith', PyJsHoisted_startsWith_) + var.put(u'baseClamp', var.get(u'require')(Js(u'./_baseClamp'))) + var.put(u'baseToString', var.get(u'require')(Js(u'./_baseToString'))) + var.put(u'toInteger', var.get(u'require')(Js(u'./toInteger'))) + var.put(u'toString', var.get(u'require')(Js(u'./toString'))) + pass + var.get(u'module').put(u'exports', var.get(u'startsWith')) +PyJs_anonymous_3889_._set_name(u'anonymous') +PyJs_Object_3890_ = Js({u'./_baseClamp':Js(313.0),u'./_baseToString':Js(347.0),u'./toInteger':Js(490.0),u'./toString':Js(493.0)}) +@Js +def PyJs_anonymous_3891_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'stubArray', u'exports', u'require', u'module']) + @Js + def PyJsHoisted_stubArray_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js([]) + PyJsHoisted_stubArray_.func_name = u'stubArray' + var.put(u'stubArray', PyJsHoisted_stubArray_) + pass + var.get(u'module').put(u'exports', var.get(u'stubArray')) +PyJs_anonymous_3891_._set_name(u'anonymous') +PyJs_Object_3892_ = Js({}) +@Js +def PyJs_anonymous_3893_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'stubFalse', u'exports', u'module']) + @Js + def PyJsHoisted_stubFalse_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return Js(False) + PyJsHoisted_stubFalse_.func_name = u'stubFalse' + var.put(u'stubFalse', PyJsHoisted_stubFalse_) + pass + var.get(u'module').put(u'exports', var.get(u'stubFalse')) +PyJs_anonymous_3893_._set_name(u'anonymous') +PyJs_Object_3894_ = Js({}) +@Js +def PyJs_anonymous_3895_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'INFINITY', u'MAX_INTEGER', u'module', u'toNumber', u'toFinite', u'require']) + @Js + def PyJsHoisted_toFinite_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value', u'sign']) + if var.get(u'value').neg(): + return (var.get(u'value') if PyJsStrictEq(var.get(u'value'),Js(0.0)) else Js(0.0)) + var.put(u'value', var.get(u'toNumber')(var.get(u'value'))) + if (PyJsStrictEq(var.get(u'value'),var.get(u'INFINITY')) or PyJsStrictEq(var.get(u'value'),(-var.get(u'INFINITY')))): + var.put(u'sign', ((-Js(1.0)) if (var.get(u'value')Js(10000.0)): + return var.get('undefined') + var.put(u'match', JsRegExp(u'/^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i').callprop(u'exec', var.get(u'str'))) + if var.get(u'match').neg(): + return var.get('undefined') + var.put(u'n', var.get(u'parseFloat')(var.get(u'match').get(u'1'))) + var.put(u'type', (var.get(u'match').get(u'2') or Js(u'ms')).callprop(u'toLowerCase')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'years')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'year')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'yrs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'yr')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'y')): + SWITCHED = True + return (var.get(u'n')*var.get(u'y')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'days')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'day')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'd')): + SWITCHED = True + return (var.get(u'n')*var.get(u'd')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hours')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hour')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hrs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hr')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'h')): + SWITCHED = True + return (var.get(u'n')*var.get(u'h')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'minutes')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'minute')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'mins')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'min')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'm')): + SWITCHED = True + return (var.get(u'n')*var.get(u'm')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'seconds')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'second')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'secs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'sec')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u's')): + SWITCHED = True + return (var.get(u'n')*var.get(u's')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'milliseconds')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'millisecond')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'msecs')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'msec')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ms')): + SWITCHED = True + return var.get(u'n') + SWITCHED = True + break + PyJsHoisted_parse_.func_name = u'parse' + var.put(u'parse', PyJsHoisted_parse_) + @Js + def PyJsHoisted_short_(ms, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'ms':ms}, var) + var.registers([u'ms']) + if (var.get(u'ms')>=var.get(u'd')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u'd')))+Js(u'd')) + if (var.get(u'ms')>=var.get(u'h')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u'h')))+Js(u'h')) + if (var.get(u'ms')>=var.get(u'm')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u'm')))+Js(u'm')) + if (var.get(u'ms')>=var.get(u's')): + return (var.get(u'Math').callprop(u'round', (var.get(u'ms')/var.get(u's')))+Js(u's')) + return (var.get(u'ms')+Js(u'ms')) + PyJsHoisted_short_.func_name = u'short' + var.put(u'short', PyJsHoisted_short_) + @Js + def PyJsHoisted_plural_(ms, n, name, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'name':name, u'ms':ms, u'n':n}, var) + var.registers([u'name', u'ms', u'n']) + if (var.get(u'ms')var.get(u'dst')): + var.get(u'names').put(var.get(u'dst'), var.get(u'names').get(var.get(u'src'))) + var.put(u'dst',Js(var.get(u'dst').to_number())+Js(1)) + finally: + var.put(u'src',Js(var.get(u'src').to_number())+Js(1)) + var.get(u'names').put(u'length', var.get(u'dst')) + return var.get(u'names') + PyJs_getOwnPropertyNames_3925_._set_name(u'getOwnPropertyNames') + var.get(u'Object').put(u'getOwnPropertyNames', PyJs_getOwnPropertyNames_3925_) + pass + pass + var.get(u'defProp')(var.get(u'exports'), Js(u'makeAccessor'), var.get(u'makeAccessor')) +PyJs_anonymous_3921_._set_name(u'anonymous') +PyJs_Object_3927_ = Js({}) +@Js +def PyJs_anonymous_3928_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3929_ = Js({}) + @Js + def PyJs_anonymous_3930_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'global']) + pass + @Js + def PyJs_anonymous_3931_(root, this, arguments, var=var): + var = Scope({u'this':this, u'root':root, u'arguments':arguments}, var) + var.registers([u'dataIsEmpty', u'zeroes', u'codePointToString', u'freeModule', u'HIGH_SURROGATE_MIN', u'dataRemove', u'freeExports', u'splitAtBMP', u'dataIntersection', u'lowSurrogate', u'dataContains', u'dataFromCodePoints', u'dataAddData', u'createBMPCharacterClasses', u'createSurrogateCharacterClasses', u'createUnicodeCharacterClasses', u'ERRORS', u'dataToArray', u'floor', u'regenerate', u'hex', u'surrogateSet', u'optimizeByLowSurrogates', u'stringFromCharCode', u'toString', u'dataRemoveData', u'freeGlobal', u'pad', u'LOW_SURROGATE_MAX', u'isArray', u'HIGH_SURROGATE_MAX', u'extend', u'symbolToCodePoint', u'object', u'createCharacterClassesFromData', u'LOW_SURROGATE_MIN', u'slice', u'hasOwnProperty', u'dataRemoveRange', u'isNumber', u'dataAdd', u'highSurrogate', u'codePointToStringUnicode', u'proto', u'dataAddRange', u'regexNull', u'dataIsSingleton', u'root', u'optimizeSurrogateMappings', u'forEach']) + var.put(u'freeExports', ((var.get(u'exports',throw=False).typeof()==Js(u'object')) and var.get(u'exports'))) + var.put(u'freeModule', ((((var.get(u'module',throw=False).typeof()==Js(u'object')) and var.get(u'module')) and (var.get(u'module').get(u'exports')==var.get(u'freeExports'))) and var.get(u'module'))) + var.put(u'freeGlobal', ((var.get(u'global',throw=False).typeof()==Js(u'object')) and var.get(u'global'))) + if (PyJsStrictEq(var.get(u'freeGlobal').get(u'global'),var.get(u'freeGlobal')) or PyJsStrictEq(var.get(u'freeGlobal').get(u'window'),var.get(u'freeGlobal'))): + var.put(u'root', var.get(u'freeGlobal')) + PyJs_Object_3932_ = Js({u'rangeOrder':(Js(u'A range\u2019s `stop` value must be greater than or equal ')+Js(u'to the `start` value.')),u'codePointRange':(Js(u'Invalid code point value. Code points range from ')+Js(u'U+000000 to U+10FFFF.'))}) + var.put(u'ERRORS', PyJs_Object_3932_) + var.put(u'HIGH_SURROGATE_MIN', Js(55296)) + var.put(u'HIGH_SURROGATE_MAX', Js(56319)) + var.put(u'LOW_SURROGATE_MIN', Js(56320)) + var.put(u'LOW_SURROGATE_MAX', Js(57343)) + var.put(u'regexNull', JsRegExp(u'/\\\\x00([^0123456789]|$)/g')) + PyJs_Object_3933_ = Js({}) + var.put(u'object', PyJs_Object_3933_) + var.put(u'hasOwnProperty', var.get(u'object').get(u'hasOwnProperty')) + @Js + def PyJs_anonymous_3934_(destination, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'destination':destination, u'arguments':arguments}, var) + var.registers([u'source', u'destination', u'key']) + pass + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwnProperty').callprop(u'call', var.get(u'source'), var.get(u'key')): + var.get(u'destination').put(var.get(u'key'), var.get(u'source').get(var.get(u'key'))) + return var.get(u'destination') + PyJs_anonymous_3934_._set_name(u'anonymous') + var.put(u'extend', PyJs_anonymous_3934_) + @Js + def PyJs_anonymous_3935_(array, callback, this, arguments, var=var): + var = Scope({u'this':this, u'callback':callback, u'array':array, u'arguments':arguments}, var) + var.registers([u'index', u'length', u'array', u'callback']) + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'array').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))=var.get(u'start')) and (var.get(u'codePoint')var.get(u'rangeEnd')): + return var.get(u'data') + if ((var.get(u'rangeStart')<=var.get(u'start')) and (var.get(u'rangeEnd')>=var.get(u'end'))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0)) + continue + if ((var.get(u'rangeStart')>=var.get(u'start')) and (var.get(u'rangeEnd')=var.get(u'start')) and (var.get(u'rangeStart')<=var.get(u'end'))): + var.get(u'data').put((var.get(u'index')+Js(1.0)), var.get(u'rangeStart')) + else: + if ((var.get(u'rangeEnd')>=var.get(u'start')) and (var.get(u'rangeEnd')<=var.get(u'end'))): + var.get(u'data').put(var.get(u'index'), (var.get(u'rangeEnd')+Js(1.0))) + return var.get(u'data') + var.put(u'index', Js(2.0), u'+') + return var.get(u'data') + PyJs_anonymous_3942_._set_name(u'anonymous') + var.put(u'dataRemoveRange', PyJs_anonymous_3942_) + @Js + def PyJs_anonymous_3943_(data, codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'end', u'lastIndex', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'lastIndex', var.get(u"null")) + var.put(u'length', var.get(u'data').get(u'length')) + if ((var.get(u'codePoint')Js(1114111))): + PyJsTempException = JsToPyException(var.get(u'RangeError')(var.get(u'ERRORS').get(u'codePointRange'))) + raise PyJsTempException + while (var.get(u'index')=var.get(u'start')) and (var.get(u'codePoint')var.get(u'codePoint')): + var.get(u'data').callprop(u'splice', ((var.get(u'lastIndex')+Js(2.0)) if (var.get(u'lastIndex')!=var.get(u"null")) else Js(0.0)), Js(0.0), var.get(u'codePoint'), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + if (var.get(u'codePoint')==var.get(u'end')): + if ((var.get(u'codePoint')+Js(1.0))==var.get(u'data').get((var.get(u'index')+Js(2.0)))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(4.0), var.get(u'start'), var.get(u'data').get((var.get(u'index')+Js(3.0)))) + return var.get(u'data') + var.get(u'data').put((var.get(u'index')+Js(1.0)), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + var.put(u'lastIndex', var.get(u'index')) + var.put(u'index', Js(2.0), u'+') + var.get(u'data').callprop(u'push', var.get(u'codePoint'), (var.get(u'codePoint')+Js(1.0))) + return var.get(u'data') + PyJs_anonymous_3943_._set_name(u'anonymous') + var.put(u'dataAdd', PyJs_anonymous_3943_) + @Js + def PyJs_anonymous_3944_(dataA, dataB, this, arguments, var=var): + var = Scope({u'this':this, u'dataA':dataA, u'arguments':arguments, u'dataB':dataB}, var) + var.registers([u'index', u'end', u'dataA', u'dataB', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'data', var.get(u'dataA').callprop(u'slice')) + var.put(u'length', var.get(u'dataB').get(u'length')) + while (var.get(u'index')Js(1114111))) or (var.get(u'rangeEnd')Js(1114111))): + PyJsTempException = JsToPyException(var.get(u'RangeError')(var.get(u'ERRORS').get(u'codePointRange'))) + raise PyJsTempException + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'added', Js(False)) + var.put(u'length', var.get(u'data').get(u'length')) + while (var.get(u'index')var.get(u'rangeEnd')): + return var.get(u'data') + if ((var.get(u'start')>=var.get(u'rangeStart')) and (var.get(u'start')<=var.get(u'rangeEnd'))): + if ((var.get(u'end')>var.get(u'rangeStart')) and ((var.get(u'end')-Js(1.0))<=var.get(u'rangeEnd'))): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(2.0)) + var.put(u'index', Js(2.0), u'-') + else: + var.get(u'data').callprop(u'splice', (var.get(u'index')-Js(1.0)), Js(2.0)) + var.put(u'index', Js(2.0), u'-') + else: + if (var.get(u'start')==(var.get(u'rangeEnd')+Js(1.0))): + var.get(u'data').put(var.get(u'index'), var.get(u'rangeStart')) + return var.get(u'data') + else: + if (var.get(u'start')>var.get(u'rangeEnd')): + var.get(u'data').callprop(u'splice', var.get(u'index'), Js(0.0), var.get(u'rangeStart'), (var.get(u'rangeEnd')+Js(1.0))) + return var.get(u'data') + else: + if (((var.get(u'rangeStart')>=var.get(u'start')) and (var.get(u'rangeStart')=var.get(u'start')) and (var.get(u'rangeStart')=var.get(u'end'))): + var.get(u'data').put(var.get(u'index'), var.get(u'rangeStart')) + var.get(u'data').put((var.get(u'index')+Js(1.0)), (var.get(u'rangeEnd')+Js(1.0))) + var.put(u'added', var.get(u'true')) + var.put(u'index', Js(2.0), u'+') + if var.get(u'added').neg(): + var.get(u'data').callprop(u'push', var.get(u'rangeStart'), (var.get(u'rangeEnd')+Js(1.0))) + return var.get(u'data') + PyJs_anonymous_3946_._set_name(u'anonymous') + var.put(u'dataAddRange', PyJs_anonymous_3946_) + @Js + def PyJs_anonymous_3947_(data, codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'codePoint', u'end', u'start', u'length', u'data']) + var.put(u'index', Js(0.0)) + var.put(u'length', var.get(u'data').get(u'length')) + var.put(u'start', var.get(u'data').get(var.get(u'index'))) + var.put(u'end', var.get(u'data').get((var.get(u'length')-Js(1.0)))) + if (var.get(u'length')>=Js(2.0)): + if ((var.get(u'codePoint')var.get(u'end'))): + return Js(False) + while (var.get(u'index')=var.get(u'start')) and (var.get(u'codePoint')=Js(40)) and (var.get(u'codePoint')<=Js(43)))) or (var.get(u'codePoint')==Js(45))) or (var.get(u'codePoint')==Js(46))) or (var.get(u'codePoint')==Js(63))) or ((var.get(u'codePoint')>=Js(91)) and (var.get(u'codePoint')<=Js(94)))) or ((var.get(u'codePoint')>=Js(123)) and (var.get(u'codePoint')<=Js(125)))): + var.put(u'string', (Js(u'\\')+var.get(u'stringFromCharCode')(var.get(u'codePoint')))) + else: + if ((var.get(u'codePoint')>=Js(32)) and (var.get(u'codePoint')<=Js(126))): + var.put(u'string', var.get(u'stringFromCharCode')(var.get(u'codePoint'))) + else: + if (var.get(u'codePoint')<=Js(255)): + var.put(u'string', (Js(u'\\x')+var.get(u'pad')(var.get(u'hex')(var.get(u'codePoint')), Js(2.0)))) + else: + var.put(u'string', (Js(u'\\u')+var.get(u'pad')(var.get(u'hex')(var.get(u'codePoint')), Js(4.0)))) + return var.get(u'string') + PyJs_anonymous_3954_._set_name(u'anonymous') + var.put(u'codePointToString', PyJs_anonymous_3954_) + @Js + def PyJs_anonymous_3955_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + if (var.get(u'codePoint')<=Js(65535)): + return var.get(u'codePointToString')(var.get(u'codePoint')) + return ((Js(u'\\u{')+var.get(u'codePoint').callprop(u'toString', Js(16.0)).callprop(u'toUpperCase'))+Js(u'}')) + PyJs_anonymous_3955_._set_name(u'anonymous') + var.put(u'codePointToStringUnicode', PyJs_anonymous_3955_) + @Js + def PyJs_anonymous_3956_(symbol, this, arguments, var=var): + var = Scope({u'this':this, u'symbol':symbol, u'arguments':arguments}, var) + var.registers([u'symbol', u'length', u'second', u'first']) + var.put(u'length', var.get(u'symbol').get(u'length')) + var.put(u'first', var.get(u'symbol').callprop(u'charCodeAt', Js(0.0))) + pass + if (((var.get(u'first')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'first')<=var.get(u'HIGH_SURROGATE_MAX'))) and (var.get(u'length')>Js(1.0))): + var.put(u'second', var.get(u'symbol').callprop(u'charCodeAt', Js(1.0))) + return (((((var.get(u'first')-var.get(u'HIGH_SURROGATE_MIN'))*Js(1024))+var.get(u'second'))-var.get(u'LOW_SURROGATE_MIN'))+Js(65536)) + return var.get(u'first') + PyJs_anonymous_3956_._set_name(u'anonymous') + var.put(u'symbolToCodePoint', PyJs_anonymous_3956_) + @Js + def PyJs_anonymous_3957_(data, this, arguments, var=var): + var = Scope({u'this':this, u'data':data, u'arguments':arguments}, var) + var.registers([u'index', u'end', u'start', u'length', u'result', u'data']) + var.put(u'result', Js(u'')) + var.put(u'index', Js(0.0)) + pass + pass + var.put(u'length', var.get(u'data').get(u'length')) + if var.get(u'dataIsSingleton')(var.get(u'data')): + return var.get(u'codePointToString')(var.get(u'data').get(u'0')) + while (var.get(u'index')=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'HIGH_SURROGATE_MAX'))): + var.get(u'bmp').callprop(u'push', var.get(u'start'), var.get(u'HIGH_SURROGATE_MIN')) + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'HIGH_SURROGATE_MIN'), (var.get(u'end')+Js(1.0))) + if ((var.get(u'end')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'LOW_SURROGATE_MAX'))): + var.get(u'bmp').callprop(u'push', var.get(u'start'), var.get(u'HIGH_SURROGATE_MIN')) + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'HIGH_SURROGATE_MIN'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'end')+Js(1.0))) + if (var.get(u'end')>var.get(u'LOW_SURROGATE_MAX')): + var.get(u'bmp').callprop(u'push', var.get(u'start'), var.get(u'HIGH_SURROGATE_MIN')) + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'HIGH_SURROGATE_MIN'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))) + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + if ((var.get(u'start')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'start')<=var.get(u'HIGH_SURROGATE_MAX'))): + if ((var.get(u'end')>=var.get(u'HIGH_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'HIGH_SURROGATE_MAX'))): + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + if ((var.get(u'end')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'LOW_SURROGATE_MAX'))): + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'end')+Js(1.0))) + if (var.get(u'end')>var.get(u'LOW_SURROGATE_MAX')): + var.get(u'loneHighSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'HIGH_SURROGATE_MAX')+Js(1.0))) + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'LOW_SURROGATE_MIN'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))) + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + if ((var.get(u'start')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'start')<=var.get(u'LOW_SURROGATE_MAX'))): + if ((var.get(u'end')>=var.get(u'LOW_SURROGATE_MIN')) and (var.get(u'end')<=var.get(u'LOW_SURROGATE_MAX'))): + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + if (var.get(u'end')>var.get(u'LOW_SURROGATE_MAX')): + var.get(u'loneLowSurrogates').callprop(u'push', var.get(u'start'), (var.get(u'LOW_SURROGATE_MAX')+Js(1.0))) + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', (var.get(u'LOW_SURROGATE_MAX')+Js(1.0)), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + if ((var.get(u'start')>var.get(u'LOW_SURROGATE_MAX')) and (var.get(u'start')<=Js(65535))): + if (var.get(u'end')<=Js(65535)): + var.get(u'bmp').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + else: + var.get(u'bmp').callprop(u'push', var.get(u'start'), (Js(65535)+Js(1.0))) + var.get(u'astral').callprop(u'push', (Js(65535)+Js(1.0)), (var.get(u'end')+Js(1.0))) + else: + var.get(u'astral').callprop(u'push', var.get(u'start'), (var.get(u'end')+Js(1.0))) + var.put(u'index', Js(2.0), u'+') + PyJs_Object_3960_ = Js({u'loneHighSurrogates':var.get(u'loneHighSurrogates'),u'loneLowSurrogates':var.get(u'loneLowSurrogates'),u'bmp':var.get(u'bmp'),u'astral':var.get(u'astral')}) + return PyJs_Object_3960_ + PyJs_anonymous_3959_._set_name(u'anonymous') + var.put(u'splitAtBMP', PyJs_anonymous_3959_) + @Js + def PyJs_anonymous_3961_(surrogateMappings, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'surrogateMappings':surrogateMappings}, var) + var.registers([u'nextMapping', u'index', u'lowSurrogates', u'addLow', u'highSurrogates', u'mapping', u'tmpLow', u'length', u'result', u'nextLowSurrogates', u'nextHighSurrogates', u'surrogateMappings']) + var.put(u'result', Js([])) + var.put(u'tmpLow', Js([])) + var.put(u'addLow', Js(False)) + pass + pass + pass + pass + pass + pass + var.put(u'index', (-Js(1.0))) + var.put(u'length', var.get(u'surrogateMappings').get(u'length')) + while (var.put(u'index',Js(var.get(u'index').to_number())+Js(1))Js(1.0)): + var.put(u'value', var.get(u'slice').callprop(u'call', var.get(u'arguments'))) + if var.get(u"this").instanceof(var.get(u'regenerate')): + var.get(u"this").put(u'data', Js([])) + return (var.get(u"this").callprop(u'add', var.get(u'value')) if var.get(u'value') else var.get(u"this")) + return var.get(u'regenerate').create().callprop(u'add', var.get(u'value')) + PyJs_anonymous_3967_._set_name(u'anonymous') + var.put(u'regenerate', PyJs_anonymous_3967_) + var.get(u'regenerate').put(u'version', Js(u'1.3.2')) + var.put(u'proto', var.get(u'regenerate').get(u'prototype')) + @Js + def PyJs_anonymous_3969_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'$this', u'value']) + var.put(u'$this', var.get(u"this")) + if (var.get(u'value')==var.get(u"null")): + return var.get(u'$this') + if var.get(u'value').instanceof(var.get(u'regenerate')): + var.get(u'$this').put(u'data', var.get(u'dataAddData')(var.get(u'$this').get(u'data'), var.get(u'value').get(u'data'))) + return var.get(u'$this') + if (var.get(u'arguments').get(u'length')>Js(1.0)): + var.put(u'value', var.get(u'slice').callprop(u'call', var.get(u'arguments'))) + if var.get(u'isArray')(var.get(u'value')): + @Js + def PyJs_anonymous_3970_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'item']) + var.get(u'$this').callprop(u'add', var.get(u'item')) + PyJs_anonymous_3970_._set_name(u'anonymous') + var.get(u'forEach')(var.get(u'value'), PyJs_anonymous_3970_) + return var.get(u'$this') + var.get(u'$this').put(u'data', var.get(u'dataAdd')(var.get(u'$this').get(u'data'), (var.get(u'value') if var.get(u'isNumber')(var.get(u'value')) else var.get(u'symbolToCodePoint')(var.get(u'value'))))) + return var.get(u'$this') + PyJs_anonymous_3969_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3971_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'$this', u'value']) + var.put(u'$this', var.get(u"this")) + if (var.get(u'value')==var.get(u"null")): + return var.get(u'$this') + if var.get(u'value').instanceof(var.get(u'regenerate')): + var.get(u'$this').put(u'data', var.get(u'dataRemoveData')(var.get(u'$this').get(u'data'), var.get(u'value').get(u'data'))) + return var.get(u'$this') + if (var.get(u'arguments').get(u'length')>Js(1.0)): + var.put(u'value', var.get(u'slice').callprop(u'call', var.get(u'arguments'))) + if var.get(u'isArray')(var.get(u'value')): + @Js + def PyJs_anonymous_3972_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'item']) + var.get(u'$this').callprop(u'remove', var.get(u'item')) + PyJs_anonymous_3972_._set_name(u'anonymous') + var.get(u'forEach')(var.get(u'value'), PyJs_anonymous_3972_) + return var.get(u'$this') + var.get(u'$this').put(u'data', var.get(u'dataRemove')(var.get(u'$this').get(u'data'), (var.get(u'value') if var.get(u'isNumber')(var.get(u'value')) else var.get(u'symbolToCodePoint')(var.get(u'value'))))) + return var.get(u'$this') + PyJs_anonymous_3971_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3973_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments}, var) + var.registers([u'start', u'end', u'$this']) + var.put(u'$this', var.get(u"this")) + var.get(u'$this').put(u'data', var.get(u'dataAddRange')(var.get(u'$this').get(u'data'), (var.get(u'start') if var.get(u'isNumber')(var.get(u'start')) else var.get(u'symbolToCodePoint')(var.get(u'start'))), (var.get(u'end') if var.get(u'isNumber')(var.get(u'end')) else var.get(u'symbolToCodePoint')(var.get(u'end'))))) + return var.get(u'$this') + PyJs_anonymous_3973_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3974_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'arguments':arguments}, var) + var.registers([u'startCodePoint', u'endCodePoint', u'end', u'$this', u'start']) + var.put(u'$this', var.get(u"this")) + var.put(u'startCodePoint', (var.get(u'start') if var.get(u'isNumber')(var.get(u'start')) else var.get(u'symbolToCodePoint')(var.get(u'start')))) + var.put(u'endCodePoint', (var.get(u'end') if var.get(u'isNumber')(var.get(u'end')) else var.get(u'symbolToCodePoint')(var.get(u'end')))) + var.get(u'$this').put(u'data', var.get(u'dataRemoveRange')(var.get(u'$this').get(u'data'), var.get(u'startCodePoint'), var.get(u'endCodePoint'))) + return var.get(u'$this') + PyJs_anonymous_3974_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3975_(argument, this, arguments, var=var): + var = Scope({u'this':this, u'argument':argument, u'arguments':arguments}, var) + var.registers([u'array', u'$this', u'argument']) + var.put(u'$this', var.get(u"this")) + var.put(u'array', (var.get(u'dataToArray')(var.get(u'argument').get(u'data')) if var.get(u'argument').instanceof(var.get(u'regenerate')) else var.get(u'argument'))) + var.get(u'$this').put(u'data', var.get(u'dataIntersection')(var.get(u'$this').get(u'data'), var.get(u'array'))) + return var.get(u'$this') + PyJs_anonymous_3975_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3976_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + return var.get(u'dataContains')(var.get(u"this").get(u'data'), (var.get(u'codePoint') if var.get(u'isNumber')(var.get(u'codePoint')) else var.get(u'symbolToCodePoint')(var.get(u'codePoint')))) + PyJs_anonymous_3976_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3977_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'set']) + var.put(u'set', var.get(u'regenerate').create()) + var.get(u'set').put(u'data', var.get(u"this").get(u'data').callprop(u'slice', Js(0.0))) + return var.get(u'set') + PyJs_anonymous_3977_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3978_(options, this, arguments, var=var): + var = Scope({u'this':this, u'options':options, u'arguments':arguments}, var) + var.registers([u'result', u'options']) + var.put(u'result', var.get(u'createCharacterClassesFromData')(var.get(u"this").get(u'data'), (var.get(u'options').get(u'bmpOnly') if var.get(u'options') else Js(False)), (var.get(u'options').get(u'hasUnicodeFlag') if var.get(u'options') else Js(False)))) + if var.get(u'result').neg(): + return Js(u'[]') + return var.get(u'result').callprop(u'replace', var.get(u'regexNull'), Js(u'\\0$1')) + PyJs_anonymous_3978_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3979_(flags, this, arguments, var=var): + var = Scope({u'this':this, u'flags':flags, u'arguments':arguments}, var) + var.registers([u'pattern', u'flags']) + PyJs_Object_3980_ = Js({u'hasUnicodeFlag':var.get(u'true')}) + var.put(u'pattern', var.get(u"this").callprop(u'toString', (PyJs_Object_3980_ if (var.get(u'flags') and (var.get(u'flags').callprop(u'indexOf', Js(u'u'))!=(-Js(1.0)))) else var.get(u"null")))) + return var.get(u'RegExp')(var.get(u'pattern'), (var.get(u'flags') or Js(u''))) + PyJs_anonymous_3979_._set_name(u'anonymous') + @Js + def PyJs_anonymous_3981_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'dataToArray')(var.get(u"this").get(u'data')) + PyJs_anonymous_3981_._set_name(u'anonymous') + PyJs_Object_3968_ = Js({u'add':PyJs_anonymous_3969_,u'remove':PyJs_anonymous_3971_,u'addRange':PyJs_anonymous_3973_,u'removeRange':PyJs_anonymous_3974_,u'intersection':PyJs_anonymous_3975_,u'contains':PyJs_anonymous_3976_,u'clone':PyJs_anonymous_3977_,u'toString':PyJs_anonymous_3978_,u'toRegExp':PyJs_anonymous_3979_,u'valueOf':PyJs_anonymous_3981_}) + var.get(u'extend')(var.get(u'proto'), PyJs_Object_3968_) + var.get(u'proto').put(u'toArray', var.get(u'proto').get(u'valueOf')) + if (((var.get(u'define',throw=False).typeof()==Js(u'function')) and (var.get(u'define').get(u'amd').typeof()==Js(u'object'))) and var.get(u'define').get(u'amd')): + @Js + def PyJs_anonymous_3982_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'regenerate') + PyJs_anonymous_3982_._set_name(u'anonymous') + var.get(u'define')(PyJs_anonymous_3982_) + else: + if (var.get(u'freeExports') and var.get(u'freeExports').get(u'nodeType').neg()): + if var.get(u'freeModule'): + var.get(u'freeModule').put(u'exports', var.get(u'regenerate')) + else: + var.get(u'freeExports').put(u'regenerate', var.get(u'regenerate')) + else: + var.get(u'root').put(u'regenerate', var.get(u'regenerate')) + PyJs_anonymous_3931_._set_name(u'anonymous') + PyJs_anonymous_3931_(var.get(u"this")) + PyJs_anonymous_3930_._set_name(u'anonymous') + PyJs_anonymous_3930_.callprop(u'call', var.get(u"this"), (var.get(u'global') if PyJsStrictNeq(var.get(u'global',throw=False).typeof(),Js(u'undefined')) else (var.get(u'self') if PyJsStrictNeq(var.get(u'self',throw=False).typeof(),Js(u'undefined')) else (var.get(u'window') if PyJsStrictNeq(var.get(u'window',throw=False).typeof(),Js(u'undefined')) else PyJs_Object_3929_)))) +PyJs_anonymous_3928_._set_name(u'anonymous') +PyJs_Object_3983_ = Js({}) +@Js +def PyJs_anonymous_3984_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'regenerate', u'require', u'exports', u'module']) + var.put(u'regenerate', var.get(u'require')(Js(u'regenerate'))) + def PyJs_LONG_3986_(var=var): + return var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(8)).callprop(u'addRange', Js(14), Js(31)).callprop(u'addRange', Js(33), Js(159)).callprop(u'addRange', Js(161), Js(5759)).callprop(u'addRange', Js(5761), Js(8191)).callprop(u'addRange', Js(8203), Js(8231)).callprop(u'addRange', Js(8234), Js(8238)).callprop(u'addRange', Js(8240), Js(8286)).callprop(u'addRange', Js(8288), Js(12287)).callprop(u'addRange', Js(12289), Js(65278)) + PyJs_Object_3985_ = Js({u'd':var.get(u'regenerate')().callprop(u'addRange', Js(48), Js(57)),u'D':var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(65535)),u's':var.get(u'regenerate')(Js(32), Js(160), Js(5760), Js(8239), Js(8287), Js(12288), Js(65279)).callprop(u'addRange', Js(9), Js(13)).callprop(u'addRange', Js(8192), Js(8202)).callprop(u'addRange', Js(8232), Js(8233)),u'S':PyJs_LONG_3986_().callprop(u'addRange', Js(65280), Js(65535)),u'w':var.get(u'regenerate')(Js(95)).callprop(u'addRange', Js(48), Js(57)).callprop(u'addRange', Js(65), Js(90)).callprop(u'addRange', Js(97), Js(122)),u'W':var.get(u'regenerate')(Js(96)).callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(64)).callprop(u'addRange', Js(91), Js(94)).callprop(u'addRange', Js(123), Js(65535))}) + var.get(u'exports').put(u'REGULAR', PyJs_Object_3985_) + def PyJs_LONG_3988_(var=var): + return var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(8)).callprop(u'addRange', Js(14), Js(31)).callprop(u'addRange', Js(33), Js(159)).callprop(u'addRange', Js(161), Js(5759)).callprop(u'addRange', Js(5761), Js(8191)).callprop(u'addRange', Js(8203), Js(8231)).callprop(u'addRange', Js(8234), Js(8238)).callprop(u'addRange', Js(8240), Js(8286)).callprop(u'addRange', Js(8288), Js(12287)).callprop(u'addRange', Js(12289), Js(65278)) + PyJs_Object_3987_ = Js({u'd':var.get(u'regenerate')().callprop(u'addRange', Js(48), Js(57)),u'D':var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(1114111)),u's':var.get(u'regenerate')(Js(32), Js(160), Js(5760), Js(8239), Js(8287), Js(12288), Js(65279)).callprop(u'addRange', Js(9), Js(13)).callprop(u'addRange', Js(8192), Js(8202)).callprop(u'addRange', Js(8232), Js(8233)),u'S':PyJs_LONG_3988_().callprop(u'addRange', Js(65280), Js(1114111)),u'w':var.get(u'regenerate')(Js(95)).callprop(u'addRange', Js(48), Js(57)).callprop(u'addRange', Js(65), Js(90)).callprop(u'addRange', Js(97), Js(122)),u'W':var.get(u'regenerate')(Js(96)).callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(64)).callprop(u'addRange', Js(91), Js(94)).callprop(u'addRange', Js(123), Js(1114111))}) + var.get(u'exports').put(u'UNICODE', PyJs_Object_3987_) + def PyJs_LONG_3990_(var=var): + return var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(8)).callprop(u'addRange', Js(14), Js(31)).callprop(u'addRange', Js(33), Js(159)).callprop(u'addRange', Js(161), Js(5759)).callprop(u'addRange', Js(5761), Js(8191)).callprop(u'addRange', Js(8203), Js(8231)).callprop(u'addRange', Js(8234), Js(8238)).callprop(u'addRange', Js(8240), Js(8286)).callprop(u'addRange', Js(8288), Js(12287)).callprop(u'addRange', Js(12289), Js(65278)) + PyJs_Object_3989_ = Js({u'd':var.get(u'regenerate')().callprop(u'addRange', Js(48), Js(57)),u'D':var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(1114111)),u's':var.get(u'regenerate')(Js(32), Js(160), Js(5760), Js(8239), Js(8287), Js(12288), Js(65279)).callprop(u'addRange', Js(9), Js(13)).callprop(u'addRange', Js(8192), Js(8202)).callprop(u'addRange', Js(8232), Js(8233)),u'S':PyJs_LONG_3990_().callprop(u'addRange', Js(65280), Js(1114111)),u'w':var.get(u'regenerate')(Js(95), Js(383), Js(8490)).callprop(u'addRange', Js(48), Js(57)).callprop(u'addRange', Js(65), Js(90)).callprop(u'addRange', Js(97), Js(122)),u'W':var.get(u'regenerate')(Js(75), Js(83), Js(96)).callprop(u'addRange', Js(0), Js(47)).callprop(u'addRange', Js(58), Js(64)).callprop(u'addRange', Js(91), Js(94)).callprop(u'addRange', Js(123), Js(1114111))}) + var.get(u'exports').put(u'UNICODE_IGNORE_CASE', PyJs_Object_3989_) +PyJs_anonymous_3984_._set_name(u'anonymous') +PyJs_Object_3991_ = Js({u'regenerate':Js(501.0)}) +@Js +def PyJs_anonymous_3992_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_3993_ = Js({u'75':Js(8490.0),u'83':Js(383.0),u'107':Js(8490.0),u'115':Js(383.0),u'181':Js(924.0),u'197':Js(8491.0),u'383':Js(83.0),u'452':Js(453.0),u'453':Js(452.0),u'455':Js(456.0),u'456':Js(455.0),u'458':Js(459.0),u'459':Js(458.0),u'497':Js(498.0),u'498':Js(497.0),u'837':Js(8126.0),u'914':Js(976.0),u'917':Js(1013.0),u'920':Js(1012.0),u'921':Js(8126.0),u'922':Js(1008.0),u'924':Js(181.0),u'928':Js(982.0),u'929':Js(1009.0),u'931':Js(962.0),u'934':Js(981.0),u'937':Js(8486.0),u'962':Js(931.0),u'976':Js(914.0),u'977':Js(1012.0),u'981':Js(934.0),u'982':Js(928.0),u'1008':Js(922.0),u'1009':Js(929.0),u'1012':Js([Js(920.0), Js(977.0)]),u'1013':Js(917.0),u'7776':Js(7835.0),u'7835':Js(7776.0),u'8126':Js([Js(837.0), Js(921.0)]),u'8486':Js(937.0),u'8490':Js(75.0),u'8491':Js(197.0),u'66560':Js(66600.0),u'66561':Js(66601.0),u'66562':Js(66602.0),u'66563':Js(66603.0),u'66564':Js(66604.0),u'66565':Js(66605.0),u'66566':Js(66606.0),u'66567':Js(66607.0),u'66568':Js(66608.0),u'66569':Js(66609.0),u'66570':Js(66610.0),u'66571':Js(66611.0),u'66572':Js(66612.0),u'66573':Js(66613.0),u'66574':Js(66614.0),u'66575':Js(66615.0),u'66576':Js(66616.0),u'66577':Js(66617.0),u'66578':Js(66618.0),u'66579':Js(66619.0),u'66580':Js(66620.0),u'66581':Js(66621.0),u'66582':Js(66622.0),u'66583':Js(66623.0),u'66584':Js(66624.0),u'66585':Js(66625.0),u'66586':Js(66626.0),u'66587':Js(66627.0),u'66588':Js(66628.0),u'66589':Js(66629.0),u'66590':Js(66630.0),u'66591':Js(66631.0),u'66592':Js(66632.0),u'66593':Js(66633.0),u'66594':Js(66634.0),u'66595':Js(66635.0),u'66596':Js(66636.0),u'66597':Js(66637.0),u'66598':Js(66638.0),u'66599':Js(66639.0),u'66600':Js(66560.0),u'66601':Js(66561.0),u'66602':Js(66562.0),u'66603':Js(66563.0),u'66604':Js(66564.0),u'66605':Js(66565.0),u'66606':Js(66566.0),u'66607':Js(66567.0),u'66608':Js(66568.0),u'66609':Js(66569.0),u'66610':Js(66570.0),u'66611':Js(66571.0),u'66612':Js(66572.0),u'66613':Js(66573.0),u'66614':Js(66574.0),u'66615':Js(66575.0),u'66616':Js(66576.0),u'66617':Js(66577.0),u'66618':Js(66578.0),u'66619':Js(66579.0),u'66620':Js(66580.0),u'66621':Js(66581.0),u'66622':Js(66582.0),u'66623':Js(66583.0),u'66624':Js(66584.0),u'66625':Js(66585.0),u'66626':Js(66586.0),u'66627':Js(66587.0),u'66628':Js(66588.0),u'66629':Js(66589.0),u'66630':Js(66590.0),u'66631':Js(66591.0),u'66632':Js(66592.0),u'66633':Js(66593.0),u'66634':Js(66594.0),u'66635':Js(66595.0),u'66636':Js(66596.0),u'66637':Js(66597.0),u'66638':Js(66598.0),u'66639':Js(66599.0),u'68736':Js(68800.0),u'68737':Js(68801.0),u'68738':Js(68802.0),u'68739':Js(68803.0),u'68740':Js(68804.0),u'68741':Js(68805.0),u'68742':Js(68806.0),u'68743':Js(68807.0),u'68744':Js(68808.0),u'68745':Js(68809.0),u'68746':Js(68810.0),u'68747':Js(68811.0),u'68748':Js(68812.0),u'68749':Js(68813.0),u'68750':Js(68814.0),u'68751':Js(68815.0),u'68752':Js(68816.0),u'68753':Js(68817.0),u'68754':Js(68818.0),u'68755':Js(68819.0),u'68756':Js(68820.0),u'68757':Js(68821.0),u'68758':Js(68822.0),u'68759':Js(68823.0),u'68760':Js(68824.0),u'68761':Js(68825.0),u'68762':Js(68826.0),u'68763':Js(68827.0),u'68764':Js(68828.0),u'68765':Js(68829.0),u'68766':Js(68830.0),u'68767':Js(68831.0),u'68768':Js(68832.0),u'68769':Js(68833.0),u'68770':Js(68834.0),u'68771':Js(68835.0),u'68772':Js(68836.0),u'68773':Js(68837.0),u'68774':Js(68838.0),u'68775':Js(68839.0),u'68776':Js(68840.0),u'68777':Js(68841.0),u'68778':Js(68842.0),u'68779':Js(68843.0),u'68780':Js(68844.0),u'68781':Js(68845.0),u'68782':Js(68846.0),u'68783':Js(68847.0),u'68784':Js(68848.0),u'68785':Js(68849.0),u'68786':Js(68850.0),u'68800':Js(68736.0),u'68801':Js(68737.0),u'68802':Js(68738.0),u'68803':Js(68739.0),u'68804':Js(68740.0),u'68805':Js(68741.0),u'68806':Js(68742.0),u'68807':Js(68743.0),u'68808':Js(68744.0),u'68809':Js(68745.0),u'68810':Js(68746.0),u'68811':Js(68747.0),u'68812':Js(68748.0),u'68813':Js(68749.0),u'68814':Js(68750.0),u'68815':Js(68751.0),u'68816':Js(68752.0),u'68817':Js(68753.0),u'68818':Js(68754.0),u'68819':Js(68755.0),u'68820':Js(68756.0),u'68821':Js(68757.0),u'68822':Js(68758.0),u'68823':Js(68759.0),u'68824':Js(68760.0),u'68825':Js(68761.0),u'68826':Js(68762.0),u'68827':Js(68763.0),u'68828':Js(68764.0),u'68829':Js(68765.0),u'68830':Js(68766.0),u'68831':Js(68767.0),u'68832':Js(68768.0),u'68833':Js(68769.0),u'68834':Js(68770.0),u'68835':Js(68771.0),u'68836':Js(68772.0),u'68837':Js(68773.0),u'68838':Js(68774.0),u'68839':Js(68775.0),u'68840':Js(68776.0),u'68841':Js(68777.0),u'68842':Js(68778.0),u'68843':Js(68779.0),u'68844':Js(68780.0),u'68845':Js(68781.0),u'68846':Js(68782.0),u'68847':Js(68783.0),u'68848':Js(68784.0),u'68849':Js(68785.0),u'68850':Js(68786.0),u'71840':Js(71872.0),u'71841':Js(71873.0),u'71842':Js(71874.0),u'71843':Js(71875.0),u'71844':Js(71876.0),u'71845':Js(71877.0),u'71846':Js(71878.0),u'71847':Js(71879.0),u'71848':Js(71880.0),u'71849':Js(71881.0),u'71850':Js(71882.0),u'71851':Js(71883.0),u'71852':Js(71884.0),u'71853':Js(71885.0),u'71854':Js(71886.0),u'71855':Js(71887.0),u'71856':Js(71888.0),u'71857':Js(71889.0),u'71858':Js(71890.0),u'71859':Js(71891.0),u'71860':Js(71892.0),u'71861':Js(71893.0),u'71862':Js(71894.0),u'71863':Js(71895.0),u'71864':Js(71896.0),u'71865':Js(71897.0),u'71866':Js(71898.0),u'71867':Js(71899.0),u'71868':Js(71900.0),u'71869':Js(71901.0),u'71870':Js(71902.0),u'71871':Js(71903.0),u'71872':Js(71840.0),u'71873':Js(71841.0),u'71874':Js(71842.0),u'71875':Js(71843.0),u'71876':Js(71844.0),u'71877':Js(71845.0),u'71878':Js(71846.0),u'71879':Js(71847.0),u'71880':Js(71848.0),u'71881':Js(71849.0),u'71882':Js(71850.0),u'71883':Js(71851.0),u'71884':Js(71852.0),u'71885':Js(71853.0),u'71886':Js(71854.0),u'71887':Js(71855.0),u'71888':Js(71856.0),u'71889':Js(71857.0),u'71890':Js(71858.0),u'71891':Js(71859.0),u'71892':Js(71860.0),u'71893':Js(71861.0),u'71894':Js(71862.0),u'71895':Js(71863.0),u'71896':Js(71864.0),u'71897':Js(71865.0),u'71898':Js(71866.0),u'71899':Js(71867.0),u'71900':Js(71868.0),u'71901':Js(71869.0),u'71902':Js(71870.0),u'71903':Js(71871.0)}) + var.get(u'module').put(u'exports', PyJs_Object_3993_) +PyJs_anonymous_3992_._set_name(u'anonymous') +PyJs_Object_3994_ = Js({}) +@Js +def PyJs_anonymous_3995_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'iuMappings', u'module', u'parse', u'unicode', u'wrap', u'hasOwnProperty', u'regenerate', u'ignoreCase', u'caseFold', u'has', u'DOT_SET', u'getCharacterClassEscapeSet', u'exports', u'object', u'update', u'processCharacterClass', u'generate', u'ESCAPE_SETS', u'require', u'processTerm', u'BMP_SET', u'UNICODE_SET', u'assign', u'DOT_SET_UNICODE']) + @Js + def PyJsHoisted_getCharacterClassEscapeSet_(character, this, arguments, var=var): + var = Scope({u'this':this, u'character':character, u'arguments':arguments}, var) + var.registers([u'character']) + if var.get(u'unicode'): + if var.get(u'ignoreCase'): + return var.get(u'ESCAPE_SETS').get(u'UNICODE_IGNORE_CASE').get(var.get(u'character')) + return var.get(u'ESCAPE_SETS').get(u'UNICODE').get(var.get(u'character')) + return var.get(u'ESCAPE_SETS').get(u'REGULAR').get(var.get(u'character')) + PyJsHoisted_getCharacterClassEscapeSet_.func_name = u'getCharacterClassEscapeSet' + var.put(u'getCharacterClassEscapeSet', PyJsHoisted_getCharacterClassEscapeSet_) + @Js + def PyJsHoisted_update_(item, pattern, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments, u'pattern':pattern}, var) + var.registers([u'item', u'tree', u'pattern']) + if var.get(u'pattern').neg(): + return var.get('undefined') + var.put(u'tree', var.get(u'parse')(var.get(u'pattern'), Js(u''))) + while 1: + SWITCHED = False + CONDITION = (var.get(u'tree').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClass')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'group')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'value')): + SWITCHED = True + break + if True: + SWITCHED = True + var.put(u'tree', var.get(u'wrap')(var.get(u'tree'), var.get(u'pattern'))) + SWITCHED = True + break + var.get(u'assign')(var.get(u'item'), var.get(u'tree')) + PyJsHoisted_update_.func_name = u'update' + var.put(u'update', PyJsHoisted_update_) + @Js + def PyJsHoisted_processTerm_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'item', u'codePoint', u'set', u'folded']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'item').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'dot')): + SWITCHED = True + var.get(u'update')(var.get(u'item'), (var.get(u'DOT_SET_UNICODE') if var.get(u'unicode') else var.get(u'DOT_SET')).callprop(u'toString')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClass')): + SWITCHED = True + var.put(u'item', var.get(u'processCharacterClass')(var.get(u'item'))) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClassEscape')): + SWITCHED = True + var.get(u'update')(var.get(u'item'), var.get(u'getCharacterClassEscapeSet')(var.get(u'item').get(u'value')).callprop(u'toString')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'alternative')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'disjunction')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'group')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'quantifier')): + SWITCHED = True + var.get(u'item').put(u'body', var.get(u'item').get(u'body').callprop(u'map', var.get(u'processTerm'))) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'value')): + SWITCHED = True + var.put(u'codePoint', var.get(u'item').get(u'codePoint')) + var.put(u'set', var.get(u'regenerate')(var.get(u'codePoint'))) + if (var.get(u'ignoreCase') and var.get(u'unicode')): + var.put(u'folded', var.get(u'caseFold')(var.get(u'codePoint'))) + if var.get(u'folded'): + var.get(u'set').callprop(u'add', var.get(u'folded')) + var.get(u'update')(var.get(u'item'), var.get(u'set').callprop(u'toString')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'anchor')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'empty')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'group')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'reference')): + SWITCHED = True + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Unknown term type: ')+var.get(u'item').get(u'type')))) + raise PyJsTempException + SWITCHED = True + break + return var.get(u'item') + PyJsHoisted_processTerm_.func_name = u'processTerm' + var.put(u'processTerm', PyJsHoisted_processTerm_) + @Js + def PyJsHoisted_caseFold_(codePoint, this, arguments, var=var): + var = Scope({u'this':this, u'codePoint':codePoint, u'arguments':arguments}, var) + var.registers([u'codePoint']) + return (var.get(u'iuMappings').get(var.get(u'codePoint')) if var.get(u'has')(var.get(u'iuMappings'), var.get(u'codePoint')) else Js(False)) + PyJsHoisted_caseFold_.func_name = u'caseFold' + var.put(u'caseFold', PyJsHoisted_caseFold_) + @Js + def PyJsHoisted_processCharacterClass_(characterClassItem, this, arguments, var=var): + var = Scope({u'this':this, u'characterClassItem':characterClassItem, u'arguments':arguments}, var) + var.registers([u'body', u'set', u'characterClassItem']) + var.put(u'set', var.get(u'regenerate')()) + @Js + def PyJs_anonymous_3999_(item, this, arguments, var=var): + var = Scope({u'this':this, u'item':item, u'arguments':arguments}, var) + var.registers([u'max', u'folded', u'item', u'min']) + while 1: + SWITCHED = False + CONDITION = (var.get(u'item').get(u'type')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'value')): + SWITCHED = True + var.get(u'set').callprop(u'add', var.get(u'item').get(u'codePoint')) + if (var.get(u'ignoreCase') and var.get(u'unicode')): + var.put(u'folded', var.get(u'caseFold')(var.get(u'item').get(u'codePoint'))) + if var.get(u'folded'): + var.get(u'set').callprop(u'add', var.get(u'folded')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClassRange')): + SWITCHED = True + var.put(u'min', var.get(u'item').get(u'min').get(u'codePoint')) + var.put(u'max', var.get(u'item').get(u'max').get(u'codePoint')) + var.get(u'set').callprop(u'addRange', var.get(u'min'), var.get(u'max')) + if (var.get(u'ignoreCase') and var.get(u'unicode')): + var.get(u'set').callprop(u'iuAddRange', var.get(u'min'), var.get(u'max')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'characterClassEscape')): + SWITCHED = True + var.get(u'set').callprop(u'add', var.get(u'getCharacterClassEscapeSet')(var.get(u'item').get(u'value'))) + break + if True: + SWITCHED = True + PyJsTempException = JsToPyException(var.get(u'Error')((Js(u'Unknown term type: ')+var.get(u'item').get(u'type')))) + raise PyJsTempException + SWITCHED = True + break + PyJs_anonymous_3999_._set_name(u'anonymous') + var.put(u'body', var.get(u'characterClassItem').get(u'body').callprop(u'forEach', PyJs_anonymous_3999_)) + if var.get(u'characterClassItem').get(u'negative'): + var.put(u'set', (var.get(u'UNICODE_SET') if var.get(u'unicode') else var.get(u'BMP_SET')).callprop(u'clone').callprop(u'remove', var.get(u'set'))) + var.get(u'update')(var.get(u'characterClassItem'), var.get(u'set').callprop(u'toString')) + return var.get(u'characterClassItem') + PyJsHoisted_processCharacterClass_.func_name = u'processCharacterClass' + var.put(u'processCharacterClass', PyJsHoisted_processCharacterClass_) + @Js + def PyJsHoisted_wrap_(tree, pattern, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'tree':tree, u'arguments':arguments}, var) + var.registers([u'pattern', u'tree']) + PyJs_Object_3998_ = Js({u'type':Js(u'group'),u'behavior':Js(u'ignore'),u'body':Js([var.get(u'tree')]),u'raw':((Js(u'(?:')+var.get(u'pattern'))+Js(u')'))}) + return PyJs_Object_3998_ + PyJsHoisted_wrap_.func_name = u'wrap' + var.put(u'wrap', PyJsHoisted_wrap_) + @Js + def PyJsHoisted_has_(object, property, this, arguments, var=var): + var = Scope({u'this':this, u'property':property, u'object':object, u'arguments':arguments}, var) + var.registers([u'property', u'object']) + return var.get(u'hasOwnProperty').callprop(u'call', var.get(u'object'), var.get(u'property')) + PyJsHoisted_has_.func_name = u'has' + var.put(u'has', PyJsHoisted_has_) + @Js + def PyJsHoisted_assign_(target, source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'target':target, u'arguments':arguments}, var) + var.registers([u'source', u'target', u'key']) + for PyJsTemp in var.get(u'source'): + var.put(u'key', PyJsTemp) + var.get(u'target').put(var.get(u'key'), var.get(u'source').get(var.get(u'key'))) + PyJsHoisted_assign_.func_name = u'assign' + var.put(u'assign', PyJsHoisted_assign_) + var.put(u'generate', var.get(u'require')(Js(u'regjsgen')).get(u'generate')) + var.put(u'parse', var.get(u'require')(Js(u'regjsparser')).get(u'parse')) + var.put(u'regenerate', var.get(u'require')(Js(u'regenerate'))) + var.put(u'iuMappings', var.get(u'require')(Js(u'./data/iu-mappings.json'))) + var.put(u'ESCAPE_SETS', var.get(u'require')(Js(u'./data/character-class-escape-sets.js'))) + pass + PyJs_Object_3996_ = Js({}) + var.put(u'object', PyJs_Object_3996_) + var.put(u'hasOwnProperty', var.get(u'object').get(u'hasOwnProperty')) + pass + var.put(u'UNICODE_SET', var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(1114111))) + var.put(u'BMP_SET', var.get(u'regenerate')().callprop(u'addRange', Js(0), Js(65535))) + var.put(u'DOT_SET_UNICODE', var.get(u'UNICODE_SET').callprop(u'clone').callprop(u'remove', Js(10), Js(13), Js(8232), Js(8233))) + var.put(u'DOT_SET', var.get(u'DOT_SET_UNICODE').callprop(u'clone').callprop(u'intersection', var.get(u'BMP_SET'))) + @Js + def PyJs_anonymous_3997_(min, max, this, arguments, var=var): + var = Scope({u'this':this, u'max':max, u'arguments':arguments, u'min':min}, var) + var.registers([u'max', u'folded', u'$this', u'min']) + var.put(u'$this', var.get(u"this")) + while 1: + var.put(u'folded', var.get(u'caseFold')(var.get(u'min'))) + if var.get(u'folded'): + var.get(u'$this').callprop(u'add', var.get(u'folded')) + if not (var.put(u'min',Js(var.get(u'min').to_number())+Js(1))<=var.get(u'max')): + break + return var.get(u'$this') + PyJs_anonymous_3997_._set_name(u'anonymous') + var.get(u'regenerate').get(u'prototype').put(u'iuAddRange', PyJs_anonymous_3997_) + pass + pass + pass + pass + var.put(u'ignoreCase', Js(False)) + var.put(u'unicode', Js(False)) + pass + pass + pass + @Js + def PyJs_anonymous_4000_(pattern, flags, this, arguments, var=var): + var = Scope({u'this':this, u'pattern':pattern, u'flags':flags, u'arguments':arguments}, var) + var.registers([u'pattern', u'tree', u'flags']) + var.put(u'tree', var.get(u'parse')(var.get(u'pattern'), var.get(u'flags'))) + var.put(u'ignoreCase', ((var.get(u'flags').callprop(u'indexOf', Js(u'i'))>(-Js(1.0))) if var.get(u'flags') else Js(False))) + var.put(u'unicode', ((var.get(u'flags').callprop(u'indexOf', Js(u'u'))>(-Js(1.0))) if var.get(u'flags') else Js(False))) + var.get(u'assign')(var.get(u'tree'), var.get(u'processTerm')(var.get(u'tree'))) + return var.get(u'generate')(var.get(u'tree')) + PyJs_anonymous_4000_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4000_) +PyJs_anonymous_3995_._set_name(u'anonymous') +PyJs_Object_4001_ = Js({u'./data/character-class-escape-sets.js':Js(502.0),u'./data/iu-mappings.json':Js(503.0),u'regenerate':Js(501.0),u'regjsgen':Js(505.0),u'regjsparser':Js(506.0)}) +@Js +def PyJs_anonymous_4002_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_4003_ = Js({}) + @Js + def PyJs_anonymous_4004_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'global']) + pass + @Js + def PyJs_anonymous_4005_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'freeModule', u'objectTypes', u'freeGlobal', u'generateCharacterClassRange', u'freeExports', u'generateCharacterClassEscape', u'assertType', u'generateReference', u'generateCharacterClass', u'generateAlternative', u'generateClassAtom', u'floor', u'generateDisjunction', u'stringFromCharCode', u'generate', u'generateQuantifier', u'generateDot', u'fromCodePoint', u'generateValue', u'generateAnchor', u'generateAtom', u'oldRoot', u'generateTerm', u'root', u'generateGroup']) + @Js + def PyJsHoisted_generateQuantifier_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'max', u'quantifier', u'min']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'quantifier')) + var.put(u'quantifier', Js(u'')) + var.put(u'min', var.get(u'node').get(u'min')) + var.put(u'max', var.get(u'node').get(u'max')) + while 1: + SWITCHED = False + CONDITION = (var.get(u'max')) + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u'undefined')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, var.get(u"null")): + SWITCHED = True + while 1: + SWITCHED = False + CONDITION = (var.get(u'min')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(0.0)): + SWITCHED = True + var.put(u'quantifier', Js(u'*')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + var.put(u'quantifier', Js(u'+')) + break + if True: + SWITCHED = True + var.put(u'quantifier', ((Js(u'{')+var.get(u'min'))+Js(u',}'))) + break + SWITCHED = True + break + break + if True: + SWITCHED = True + if (var.get(u'min')==var.get(u'max')): + var.put(u'quantifier', ((Js(u'{')+var.get(u'min'))+Js(u'}'))) + else: + if ((var.get(u'min')==Js(0.0)) and (var.get(u'max')==Js(1.0))): + var.put(u'quantifier', Js(u'?')) + else: + var.put(u'quantifier', ((((Js(u'{')+var.get(u'min'))+Js(u','))+var.get(u'max'))+Js(u'}'))) + break + SWITCHED = True + break + if var.get(u'node').get(u'greedy').neg(): + var.put(u'quantifier', Js(u'?'), u'+') + return (var.get(u'generateAtom')(var.get(u'node').get(u'body').get(u'0'))+var.get(u'quantifier')) + PyJsHoisted_generateQuantifier_.func_name = u'generateQuantifier' + var.put(u'generateQuantifier', PyJsHoisted_generateQuantifier_) + @Js + def PyJsHoisted_generateTerm_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'anchor|characterClass|characterClassEscape|empty|group|quantifier|reference|value')) + return var.get(u'generate')(var.get(u'node')) + PyJsHoisted_generateTerm_.func_name = u'generateTerm' + var.put(u'generateTerm', PyJsHoisted_generateTerm_) + @Js + def PyJsHoisted_generateCharacterClass_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'node', u'length', u'classRanges', u'result']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'characterClass')) + var.put(u'classRanges', var.get(u'node').get(u'body')) + var.put(u'length', (var.get(u'classRanges').get(u'length') if var.get(u'classRanges') else Js(0.0))) + var.put(u'i', (-Js(1.0))) + var.put(u'result', Js(u'[')) + if var.get(u'node').get(u'negative'): + var.put(u'result', Js(u'^'), u'+') + while (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))Js(1114111))) or (var.get(u'floor')(var.get(u'codePoint'))!=var.get(u'codePoint'))): + PyJsTempException = JsToPyException(var.get(u'RangeError')((Js(u'Invalid code point: ')+var.get(u'codePoint')))) + raise PyJsTempException + if (var.get(u'codePoint')<=Js(65535)): + var.get(u'codeUnits').callprop(u'push', var.get(u'codePoint')) + else: + var.put(u'codePoint', Js(65536), u'-') + var.put(u'highSurrogate', ((var.get(u'codePoint')>>Js(10.0))+Js(55296))) + var.put(u'lowSurrogate', ((var.get(u'codePoint')%Js(1024))+Js(56320))) + var.get(u'codeUnits').callprop(u'push', var.get(u'highSurrogate'), var.get(u'lowSurrogate')) + if (((var.get(u'index')+Js(1.0))==var.get(u'length')) or (var.get(u'codeUnits').get(u'length')>var.get(u'MAX_SIZE'))): + var.put(u'result', var.get(u'stringFromCharCode').callprop(u'apply', var.get(u"null"), var.get(u'codeUnits')), u'+') + var.get(u'codeUnits').put(u'length', Js(0.0)) + return var.get(u'result') + PyJsHoisted_fromCodePoint_.func_name = u'fromCodePoint' + var.put(u'fromCodePoint', PyJsHoisted_fromCodePoint_) + @Js + def PyJsHoisted_generateDisjunction_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'body', u'i', u'length', u'node', u'result']) + var.get(u'assertType')(var.get(u'node').get(u'type'), Js(u'disjunction')) + var.put(u'body', var.get(u'node').get(u'body')) + var.put(u'length', (var.get(u'body').get(u'length') if var.get(u'body') else Js(0.0))) + if (var.get(u'length')==Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error')(Js(u'No body'))) + raise PyJsTempException + else: + if (var.get(u'length')==Js(1.0)): + return var.get(u'generate')(var.get(u'body').get(u'0')) + else: + var.put(u'i', (-Js(1.0))) + var.put(u'result', Js(u'')) + while (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))var.get(u'max')): + var.get(u'bail')(Js(u'numbers out of order in {} quantifier'), Js(u''), var.get(u'from'), var.get(u'pos')) + var.put(u'quantifier', var.get(u'createQuantifier')(var.get(u'min'), var.get(u'max'), var.get(u'res').get(u'range').get(u'0'), var.get(u'res').get(u'range').get(u'1'))) + if var.get(u'quantifier'): + if var.get(u'match')(Js(u'?')): + var.get(u'quantifier').put(u'greedy', Js(False)) + var.get(u'quantifier').get(u'range').put(u'1', Js(1.0), u'+') + return var.get(u'quantifier') + PyJsHoisted_parseQuantifier_.func_name = u'parseQuantifier' + var.put(u'parseQuantifier', PyJsHoisted_parseQuantifier_) + @Js + def PyJsHoisted_parseDisjunction_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'from']) + var.put(u'res', Js([])) + var.put(u'from', var.get(u'pos')) + var.get(u'res').callprop(u'push', var.get(u'parseAlternative')()) + while var.get(u'match')(Js(u'|')): + var.get(u'res').callprop(u'push', var.get(u'parseAlternative')()) + if PyJsStrictEq(var.get(u'res').get(u'length'),Js(1.0)): + return var.get(u'res').get(u'0') + return var.get(u'createDisjunction')(var.get(u'res'), var.get(u'from'), var.get(u'pos')) + PyJsHoisted_parseDisjunction_.func_name = u'parseDisjunction' + var.put(u'parseDisjunction', PyJsHoisted_parseDisjunction_) + @Js + def PyJsHoisted_flattenBody_(body, this, arguments, var=var): + var = Scope({u'body':body, u'this':this, u'arguments':arguments}, var) + var.registers([u'body']) + if PyJsStrictEq(var.get(u'body').get(u'type'),Js(u'alternative')): + return var.get(u'body').get(u'body') + else: + return Js([var.get(u'body')]) + PyJsHoisted_flattenBody_.func_name = u'flattenBody' + var.put(u'flattenBody', PyJsHoisted_flattenBody_) + @Js + def PyJsHoisted_skip_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if var.get(u'match')(var.get(u'value')).neg(): + var.get(u'bail')(Js(u'character'), var.get(u'value')) + PyJsHoisted_skip_.func_name = u'skip' + var.put(u'skip', PyJsHoisted_skip_) + @Js + def PyJsHoisted_matchReg_(regExp, this, arguments, var=var): + var = Scope({u'this':this, u'regExp':regExp, u'arguments':arguments}, var) + var.registers([u'subStr', u'regExp', u'res']) + var.put(u'subStr', var.get(u'str').callprop(u'substring', var.get(u'pos'))) + var.put(u'res', var.get(u'subStr').callprop(u'match', var.get(u'regExp'))) + if var.get(u'res'): + var.get(u'res').put(u'range', Js([])) + var.get(u'res').get(u'range').put(u'0', var.get(u'pos')) + var.get(u'incr')(var.get(u'res').get(u'0').get(u'length')) + var.get(u'res').get(u'range').put(u'1', var.get(u'pos')) + return var.get(u'res') + PyJsHoisted_matchReg_.func_name = u'matchReg' + var.put(u'matchReg', PyJsHoisted_matchReg_) + @Js + def PyJsHoisted_addRaw_(node, this, arguments, var=var): + var = Scope({u'node':node, u'this':this, u'arguments':arguments}, var) + var.registers([u'node']) + var.get(u'node').put(u'raw', var.get(u'str').callprop(u'substring', var.get(u'node').get(u'range').get(u'0'), var.get(u'node').get(u'range').get(u'1'))) + return var.get(u'node') + PyJsHoisted_addRaw_.func_name = u'addRaw' + var.put(u'addRaw', PyJsHoisted_addRaw_) + @Js + def PyJsHoisted_parseNonemptyClassRanges_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'atom']) + var.put(u'atom', var.get(u'parseClassAtom')()) + if var.get(u'atom').neg(): + var.get(u'bail')(Js(u'classAtom')) + if var.get(u'current')(Js(u']')): + return Js([var.get(u'atom')]) + return var.get(u'parseHelperClassRanges')(var.get(u'atom')) + PyJsHoisted_parseNonemptyClassRanges_.func_name = u'parseNonemptyClassRanges' + var.put(u'parseNonemptyClassRanges', PyJsHoisted_parseNonemptyClassRanges_) + @Js + def PyJsHoisted_parseHelperClassRanges_(atom, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'atom':atom}, var) + var.registers([u'to', u'atom', u'from', u'classRanges', u'res']) + pass + if (var.get(u'current')(Js(u'-')) and var.get(u'next')(Js(u']')).neg()): + var.get(u'skip')(Js(u'-')) + var.put(u'res', var.get(u'parseClassAtom')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'classAtom')) + var.put(u'to', var.get(u'pos')) + var.put(u'classRanges', var.get(u'parseClassRanges')()) + if var.get(u'classRanges').neg(): + var.get(u'bail')(Js(u'classRanges')) + var.put(u'from', var.get(u'atom').get(u'range').get(u'0')) + if PyJsStrictEq(var.get(u'classRanges').get(u'type'),Js(u'empty')): + return Js([var.get(u'createClassRange')(var.get(u'atom'), var.get(u'res'), var.get(u'from'), var.get(u'to'))]) + return Js([var.get(u'createClassRange')(var.get(u'atom'), var.get(u'res'), var.get(u'from'), var.get(u'to'))]).callprop(u'concat', var.get(u'classRanges')) + var.put(u'res', var.get(u'parseNonemptyClassRangesNoDash')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'nonEmptyClassRangesNoDash')) + return Js([var.get(u'atom')]).callprop(u'concat', var.get(u'res')) + PyJsHoisted_parseHelperClassRanges_.func_name = u'parseHelperClassRanges' + var.put(u'parseHelperClassRanges', PyJsHoisted_parseHelperClassRanges_) + @Js + def PyJsHoisted_bail_(message, details, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'details':details, u'this':this, u'message':message, u'arguments':arguments}, var) + var.registers([u'from', u'contextEnd', u'to', u'details', u'context', u'contextStart', u'message', u'pointer']) + var.put(u'from', (var.get(u'pos') if (var.get(u'from')==var.get(u"null")) else var.get(u'from'))) + var.put(u'to', (var.get(u'from') if (var.get(u'to')==var.get(u"null")) else var.get(u'to'))) + var.put(u'contextStart', var.get(u'Math').callprop(u'max', Js(0.0), (var.get(u'from')-Js(10.0)))) + var.put(u'contextEnd', var.get(u'Math').callprop(u'min', (var.get(u'to')+Js(10.0)), var.get(u'str').get(u'length'))) + var.put(u'context', (Js(u' ')+var.get(u'str').callprop(u'substring', var.get(u'contextStart'), var.get(u'contextEnd')))) + var.put(u'pointer', ((Js(u' ')+var.get(u'Array').create(((var.get(u'from')-var.get(u'contextStart'))+Js(1.0))).callprop(u'join', Js(u' ')))+Js(u'^'))) + PyJsTempException = JsToPyException(var.get(u'SyntaxError')((((((((var.get(u'message')+Js(u' at position '))+var.get(u'from'))+((Js(u': ')+var.get(u'details')) if var.get(u'details') else Js(u'')))+Js(u'\n'))+var.get(u'context'))+Js(u'\n'))+var.get(u'pointer')))) + raise PyJsTempException + PyJsHoisted_bail_.func_name = u'bail' + var.put(u'bail', PyJsHoisted_bail_) + @Js + def PyJsHoisted_parseIdentityEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'tmp', u'ZWNJ', u'ZWJ']) + var.put(u'ZWJ', Js(u'\u200c')) + var.put(u'ZWNJ', Js(u'\u200d')) + pass + if var.get(u'isIdentifierPart')(var.get(u'lookahead')()).neg(): + var.put(u'tmp', var.get(u'incr')()) + return var.get(u'createEscaped')(Js(u'identifier'), var.get(u'tmp').callprop(u'charCodeAt', Js(0.0)), var.get(u'tmp'), Js(1.0)) + if var.get(u'match')(var.get(u'ZWJ')): + return var.get(u'createEscaped')(Js(u'identifier'), Js(8204), var.get(u'ZWJ')) + else: + if var.get(u'match')(var.get(u'ZWNJ')): + return var.get(u'createEscaped')(Js(u'identifier'), Js(8205), var.get(u'ZWNJ')) + return var.get(u"null") + PyJsHoisted_parseIdentityEscape_.func_name = u'parseIdentityEscape' + var.put(u'parseIdentityEscape', PyJsHoisted_parseIdentityEscape_) + @Js + def PyJsHoisted_createDot_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_4016_ = Js({u'type':Js(u'dot'),u'range':Js([(var.get(u'pos')-Js(1.0)), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4016_) + PyJsHoisted_createDot_.func_name = u'createDot' + var.put(u'createDot', PyJsHoisted_createDot_) + @Js + def PyJsHoisted_incr_(amount, this, arguments, var=var): + var = Scope({u'this':this, u'amount':amount, u'arguments':arguments}, var) + var.registers([u'res', u'amount']) + var.put(u'amount', (var.get(u'amount') or Js(1.0))) + var.put(u'res', var.get(u'str').callprop(u'substring', var.get(u'pos'), (var.get(u'pos')+var.get(u'amount')))) + var.put(u'pos', (var.get(u'amount') or Js(1.0)), u'+') + return var.get(u'res') + PyJsHoisted_incr_.func_name = u'incr' + var.put(u'incr', PyJsHoisted_incr_) + @Js + def PyJsHoisted_parseAnchor_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'from']) + var.put(u'from', var.get(u'pos')) + if var.get(u'match')(Js(u'^')): + return var.get(u'createAnchor')(Js(u'start'), Js(1.0)) + else: + if var.get(u'match')(Js(u'$')): + return var.get(u'createAnchor')(Js(u'end'), Js(1.0)) + else: + if var.get(u'match')(Js(u'\\b')): + return var.get(u'createAnchor')(Js(u'boundary'), Js(2.0)) + else: + if var.get(u'match')(Js(u'\\B')): + return var.get(u'createAnchor')(Js(u'not-boundary'), Js(2.0)) + else: + return var.get(u'parseGroup')(Js(u'(?='), Js(u'lookahead'), Js(u'(?!'), Js(u'negativeLookahead')) + PyJsHoisted_parseAnchor_.func_name = u'parseAnchor' + var.put(u'parseAnchor', PyJsHoisted_parseAnchor_) + @Js + def PyJsHoisted_parseAtom_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[^^$\\\\.*+?(){[|]/'))): + return var.get(u'createCharacter')(var.get(u'res')) + else: + if var.get(u'match')(Js(u'.')): + return var.get(u'createDot')() + else: + if var.get(u'match')(Js(u'\\')): + var.put(u'res', var.get(u'parseAtomEscape')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'atomEscape')) + return var.get(u'res') + else: + if var.put(u'res', var.get(u'parseCharacterClass')()): + return var.get(u'res') + else: + return var.get(u'parseGroup')(Js(u'(?:'), Js(u'ignore'), Js(u'('), Js(u'normal')) + PyJsHoisted_parseAtom_.func_name = u'parseAtom' + var.put(u'parseAtom', PyJsHoisted_parseAtom_) + @Js + def PyJsHoisted_parseAtomEscape_(insideCharacterClass, this, arguments, var=var): + var = Scope({u'this':this, u'insideCharacterClass':insideCharacterClass, u'arguments':arguments}, var) + var.registers([u'res', u'insideCharacterClass', u'from']) + var.put(u'from', var.get(u'pos')) + var.put(u'res', var.get(u'parseDecimalEscape')()) + if var.get(u'res'): + return var.get(u'res') + if var.get(u'insideCharacterClass'): + if var.get(u'match')(Js(u'b')): + return var.get(u'createEscaped')(Js(u'singleEscape'), Js(8), Js(u'\\b')) + else: + if var.get(u'match')(Js(u'B')): + var.get(u'bail')(Js(u'\\B not possible inside of CharacterClass'), Js(u''), var.get(u'from')) + var.put(u'res', var.get(u'parseCharacterEscape')()) + return var.get(u'res') + PyJsHoisted_parseAtomEscape_.func_name = u'parseAtomEscape' + var.put(u'parseAtomEscape', PyJsHoisted_parseAtomEscape_) + @Js + def PyJsHoisted_next_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return PyJsStrictEq(var.get(u'str').get((var.get(u'pos')+Js(1.0))),var.get(u'value')) + PyJsHoisted_next_.func_name = u'next' + var.put(u'next', PyJsHoisted_next_) + @Js + def PyJsHoisted_current_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return PyJsStrictEq(var.get(u'str').callprop(u'indexOf', var.get(u'value'), var.get(u'pos')),var.get(u'pos')) + PyJsHoisted_current_.func_name = u'current' + var.put(u'current', PyJsHoisted_current_) + @Js + def PyJsHoisted_updateRawStart_(node, start, this, arguments, var=var): + var = Scope({u'node':node, u'start':start, u'this':this, u'arguments':arguments}, var) + var.registers([u'node', u'start']) + var.get(u'node').get(u'range').put(u'0', var.get(u'start')) + return var.get(u'addRaw')(var.get(u'node')) + PyJsHoisted_updateRawStart_.func_name = u'updateRawStart' + var.put(u'updateRawStart', PyJsHoisted_updateRawStart_) + @Js + def PyJsHoisted_isEmpty_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'obj']) + return PyJsStrictEq(var.get(u'obj').get(u'type'),Js(u'empty')) + PyJsHoisted_isEmpty_.func_name = u'isEmpty' + var.put(u'isEmpty', PyJsHoisted_isEmpty_) + @Js + def PyJsHoisted_createDisjunction_(alternatives, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'this':this, u'from':PyJsArg_66726f6d_, u'alternatives':alternatives, u'arguments':arguments, u'to':to}, var) + var.registers([u'from', u'alternatives', u'to']) + PyJs_Object_4015_ = Js({u'type':Js(u'disjunction'),u'body':var.get(u'alternatives'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4015_) + PyJsHoisted_createDisjunction_.func_name = u'createDisjunction' + var.put(u'createDisjunction', PyJsHoisted_createDisjunction_) + @Js + def PyJsHoisted_parseClassEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'parseAtomEscape')(var.get(u'true')) + PyJsHoisted_parseClassEscape_.func_name = u'parseClassEscape' + var.put(u'parseClassEscape', PyJsHoisted_parseClassEscape_) + @Js + def PyJsHoisted_parseCharacterEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'codePoint']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[fnrtv]/'))): + var.put(u'codePoint', Js(0.0)) + while 1: + SWITCHED = False + CONDITION = (var.get(u'res').get(u'0')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u't')): + SWITCHED = True + var.put(u'codePoint', Js(9)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'n')): + SWITCHED = True + var.put(u'codePoint', Js(10)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'v')): + SWITCHED = True + var.put(u'codePoint', Js(11)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'f')): + SWITCHED = True + var.put(u'codePoint', Js(12)) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'r')): + SWITCHED = True + var.put(u'codePoint', Js(13)) + break + SWITCHED = True + break + return var.get(u'createEscaped')(Js(u'singleEscape'), var.get(u'codePoint'), (Js(u'\\')+var.get(u'res').get(u'0'))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^c([a-zA-Z])/'))): + return var.get(u'createEscaped')(Js(u'controlLetter'), (var.get(u'res').get(u'1').callprop(u'charCodeAt', Js(0.0))%Js(32.0)), var.get(u'res').get(u'1'), Js(2.0)) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^x([0-9a-fA-F]{2})/'))): + return var.get(u'createEscaped')(Js(u'hexadecimalEscape'), var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(16.0)), var.get(u'res').get(u'1'), Js(2.0)) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^u([0-9a-fA-F]{4})/'))): + return var.get(u'parseUnicodeSurrogatePairEscape')(var.get(u'createEscaped')(Js(u'unicodeEscape'), var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(16.0)), var.get(u'res').get(u'1'), Js(2.0))) + else: + if (var.get(u'hasUnicodeFlag') and var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^u\\{([0-9a-fA-F]+)\\}/')))): + return var.get(u'createEscaped')(Js(u'unicodeCodePointEscape'), var.get(u'parseInt')(var.get(u'res').get(u'1'), Js(16.0)), var.get(u'res').get(u'1'), Js(4.0)) + else: + return var.get(u'parseIdentityEscape')() + PyJsHoisted_parseCharacterEscape_.func_name = u'parseCharacterEscape' + var.put(u'parseCharacterEscape', PyJsHoisted_parseCharacterEscape_) + @Js + def PyJsHoisted_parseGroup_(matchA, typeA, matchB, typeB, this, arguments, var=var): + var = Scope({u'matchB':matchB, u'matchA':matchA, u'this':this, u'arguments':arguments, u'typeA':typeA, u'typeB':typeB}, var) + var.registers([u'body', u'from', u'typeA', u'typeB', u'matchB', u'matchA', u'group', u'type']) + var.put(u'type', var.get(u"null")) + var.put(u'from', var.get(u'pos')) + if var.get(u'match')(var.get(u'matchA')): + var.put(u'type', var.get(u'typeA')) + else: + if var.get(u'match')(var.get(u'matchB')): + var.put(u'type', var.get(u'typeB')) + else: + return Js(False) + var.put(u'body', var.get(u'parseDisjunction')()) + if var.get(u'body').neg(): + var.get(u'bail')(Js(u'Expected disjunction')) + var.get(u'skip')(Js(u')')) + var.put(u'group', var.get(u'createGroup')(var.get(u'type'), var.get(u'flattenBody')(var.get(u'body')), var.get(u'from'), var.get(u'pos'))) + if (var.get(u'type')==Js(u'normal')): + if var.get(u'firstIteration'): + (var.put(u'closedCaptureCounter',Js(var.get(u'closedCaptureCounter').to_number())+Js(1))-Js(1)) + return var.get(u'group') + PyJsHoisted_parseGroup_.func_name = u'parseGroup' + var.put(u'parseGroup', PyJsHoisted_parseGroup_) + @Js + def PyJsHoisted_parseClassAtomNoDash_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[^\\\\\\]-]/'))): + return var.get(u'createCharacter')(var.get(u'res').get(u'0')) + else: + if var.get(u'match')(Js(u'\\')): + var.put(u'res', var.get(u'parseClassEscape')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'classEscape')) + return var.get(u'parseUnicodeSurrogatePairEscape')(var.get(u'res')) + PyJsHoisted_parseClassAtomNoDash_.func_name = u'parseClassAtomNoDash' + var.put(u'parseClassAtomNoDash', PyJsHoisted_parseClassAtomNoDash_) + @Js + def PyJsHoisted_createAnchor_(kind, rawLength, this, arguments, var=var): + var = Scope({u'this':this, u'kind':kind, u'arguments':arguments, u'rawLength':rawLength}, var) + var.registers([u'kind', u'rawLength']) + PyJs_Object_4013_ = Js({u'type':Js(u'anchor'),u'kind':var.get(u'kind'),u'range':Js([(var.get(u'pos')-var.get(u'rawLength')), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4013_) + PyJsHoisted_createAnchor_.func_name = u'createAnchor' + var.put(u'createAnchor', PyJsHoisted_createAnchor_) + @Js + def PyJsHoisted_match_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + if PyJsStrictEq(var.get(u'str').callprop(u'indexOf', var.get(u'value'), var.get(u'pos')),var.get(u'pos')): + return var.get(u'incr')(var.get(u'value').get(u'length')) + PyJsHoisted_match_.func_name = u'match' + var.put(u'match', PyJsHoisted_match_) + @Js + def PyJsHoisted_parseCharacterClass_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'from']) + var.put(u'from', var.get(u'pos')) + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^\\[\\^/'))): + var.put(u'res', var.get(u'parseClassRanges')()) + var.get(u'skip')(Js(u']')) + return var.get(u'createCharacterClass')(var.get(u'res'), var.get(u'true'), var.get(u'from'), var.get(u'pos')) + else: + if var.get(u'match')(Js(u'[')): + var.put(u'res', var.get(u'parseClassRanges')()) + var.get(u'skip')(Js(u']')) + return var.get(u'createCharacterClass')(var.get(u'res'), Js(False), var.get(u'from'), var.get(u'pos')) + return var.get(u"null") + PyJsHoisted_parseCharacterClass_.func_name = u'parseCharacterClass' + var.put(u'parseCharacterClass', PyJsHoisted_parseCharacterClass_) + @Js + def PyJsHoisted_createValue_(kind, codePoint, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'kind':kind, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'this':this, u'codePoint':codePoint}, var) + var.registers([u'to', u'kind', u'from', u'codePoint']) + PyJs_Object_4014_ = Js({u'type':Js(u'value'),u'kind':var.get(u'kind'),u'codePoint':var.get(u'codePoint'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4014_) + PyJsHoisted_createValue_.func_name = u'createValue' + var.put(u'createValue', PyJsHoisted_createValue_) + @Js + def PyJsHoisted_createReference_(matchIndex, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'matchIndex':matchIndex}, var) + var.registers([u'matchIndex']) + PyJs_Object_4018_ = Js({u'type':Js(u'reference'),u'matchIndex':var.get(u'parseInt')(var.get(u'matchIndex'), Js(10.0)),u'range':Js([((var.get(u'pos')-Js(1.0))-var.get(u'matchIndex').get(u'length')), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4018_) + PyJsHoisted_createReference_.func_name = u'createReference' + var.put(u'createReference', PyJsHoisted_createReference_) + @Js + def PyJsHoisted_parseNonemptyClassRangesNoDash_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + var.put(u'res', var.get(u'parseClassAtom')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'classAtom')) + if var.get(u'current')(Js(u']')): + return var.get(u'res') + return var.get(u'parseHelperClassRanges')(var.get(u'res')) + PyJsHoisted_parseNonemptyClassRangesNoDash_.func_name = u'parseNonemptyClassRangesNoDash' + var.put(u'parseNonemptyClassRangesNoDash', PyJsHoisted_parseNonemptyClassRangesNoDash_) + @Js + def PyJsHoisted_createCharacterClassEscape_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + PyJs_Object_4017_ = Js({u'type':Js(u'characterClassEscape'),u'value':var.get(u'value'),u'range':Js([(var.get(u'pos')-Js(2.0)), var.get(u'pos')])}) + return var.get(u'addRaw')(PyJs_Object_4017_) + PyJsHoisted_createCharacterClassEscape_.func_name = u'createCharacterClassEscape' + var.put(u'createCharacterClassEscape', PyJsHoisted_createCharacterClassEscape_) + @Js + def PyJsHoisted_parseAlternative_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'term', u'from']) + var.put(u'res', Js([])) + var.put(u'from', var.get(u'pos')) + pass + while var.put(u'term', var.get(u'parseTerm')()): + var.get(u'res').callprop(u'push', var.get(u'term')) + if PyJsStrictEq(var.get(u'res').get(u'length'),Js(1.0)): + return var.get(u'res').get(u'0') + return var.get(u'createAlternative')(var.get(u'res'), var.get(u'from'), var.get(u'pos')) + PyJsHoisted_parseAlternative_.func_name = u'parseAlternative' + var.put(u'parseAlternative', PyJsHoisted_parseAlternative_) + @Js + def PyJsHoisted_isIdentifierPart_(ch, this, arguments, var=var): + var = Scope({u'this':this, u'ch':ch, u'arguments':arguments}, var) + var.registers([u'ch', u'NonAsciiIdentifierPart']) + def PyJs_LONG_4024_(var=var): + return var.get(u'RegExp').create(Js(u'[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0-\u08b2\u08e4-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1cf8\u1cf9\u1d00-\u1df5\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua69d\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua7ad\ua7b0\ua7b1\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab5f\uab64\uab65\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe2d\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]')) + var.put(u'NonAsciiIdentifierPart', PyJs_LONG_4024_()) + def PyJs_LONG_4025_(var=var): + return ((((((PyJsStrictEq(var.get(u'ch'),Js(36.0)) or PyJsStrictEq(var.get(u'ch'),Js(95.0))) or ((var.get(u'ch')>=Js(65.0)) and (var.get(u'ch')<=Js(90.0)))) or ((var.get(u'ch')>=Js(97.0)) and (var.get(u'ch')<=Js(122.0)))) or ((var.get(u'ch')>=Js(48.0)) and (var.get(u'ch')<=Js(57.0)))) or PyJsStrictEq(var.get(u'ch'),Js(92.0))) or ((var.get(u'ch')>=Js(128)) and var.get(u'NonAsciiIdentifierPart').callprop(u'test', var.get(u'String').callprop(u'fromCharCode', var.get(u'ch'))))) + return PyJs_LONG_4025_() + PyJsHoisted_isIdentifierPart_.func_name = u'isIdentifierPart' + var.put(u'isIdentifierPart', PyJsHoisted_isIdentifierPart_) + @Js + def PyJsHoisted_createQuantifier_(min, max, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'min':min, u'this':this, u'max':max}, var) + var.registers([u'max', u'from', u'to', u'min']) + if (var.get(u'to')==var.get(u"null")): + var.put(u'from', (var.get(u'pos')-Js(1.0))) + var.put(u'to', var.get(u'pos')) + PyJs_Object_4020_ = Js({u'type':Js(u'quantifier'),u'min':var.get(u'min'),u'max':var.get(u'max'),u'greedy':var.get(u'true'),u'body':var.get(u"null"),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4020_) + PyJsHoisted_createQuantifier_.func_name = u'createQuantifier' + var.put(u'createQuantifier', PyJsHoisted_createQuantifier_) + @Js + def PyJsHoisted_createCharacter_(matches, this, arguments, var=var): + var = Scope({u'matches':matches, u'this':this, u'arguments':arguments}, var) + var.registers([u'matches', u'_char', u'second', u'first']) + var.put(u'_char', var.get(u'matches').get(u'0')) + var.put(u'first', var.get(u'_char').callprop(u'charCodeAt', Js(0.0))) + if var.get(u'hasUnicodeFlag'): + pass + if ((PyJsStrictEq(var.get(u'_char').get(u'length'),Js(1.0)) and (var.get(u'first')>=Js(55296))) and (var.get(u'first')<=Js(56319))): + var.put(u'second', var.get(u'lookahead')().callprop(u'charCodeAt', Js(0.0))) + if ((var.get(u'second')>=Js(56320)) and (var.get(u'second')<=Js(57343))): + (var.put(u'pos',Js(var.get(u'pos').to_number())+Js(1))-Js(1)) + return var.get(u'createValue')(Js(u'symbol'), (((((var.get(u'first')-Js(55296))*Js(1024))+var.get(u'second'))-Js(56320))+Js(65536)), (var.get(u'pos')-Js(2.0)), var.get(u'pos')) + return var.get(u'createValue')(Js(u'symbol'), var.get(u'first'), (var.get(u'pos')-Js(1.0)), var.get(u'pos')) + PyJsHoisted_createCharacter_.func_name = u'createCharacter' + var.put(u'createCharacter', PyJsHoisted_createCharacter_) + @Js + def PyJsHoisted_lookahead_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + return var.get(u'str').get(var.get(u'pos')) + PyJsHoisted_lookahead_.func_name = u'lookahead' + var.put(u'lookahead', PyJsHoisted_lookahead_) + @Js + def PyJsHoisted_createClassRange_(min, max, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'min':min, u'this':this, u'max':max}, var) + var.registers([u'max', u'from', u'to', u'min']) + if (var.get(u'min').get(u'codePoint')>var.get(u'max').get(u'codePoint')): + var.get(u'bail')(Js(u'invalid range in character class'), ((var.get(u'min').get(u'raw')+Js(u'-'))+var.get(u'max').get(u'raw')), var.get(u'from'), var.get(u'to')) + PyJs_Object_4023_ = Js({u'type':Js(u'characterClassRange'),u'min':var.get(u'min'),u'max':var.get(u'max'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4023_) + PyJsHoisted_createClassRange_.func_name = u'createClassRange' + var.put(u'createClassRange', PyJsHoisted_createClassRange_) + @Js + def PyJsHoisted_createAlternative_(terms, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'this':this, u'from':PyJsArg_66726f6d_, u'terms':terms, u'arguments':arguments, u'to':to}, var) + var.registers([u'from', u'terms', u'to']) + PyJs_Object_4021_ = Js({u'type':Js(u'alternative'),u'body':var.get(u'terms'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4021_) + PyJsHoisted_createAlternative_.func_name = u'createAlternative' + var.put(u'createAlternative', PyJsHoisted_createAlternative_) + @Js + def PyJsHoisted_parseClassRanges_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res']) + pass + if var.get(u'current')(Js(u']')): + return Js([]) + else: + var.put(u'res', var.get(u'parseNonemptyClassRanges')()) + if var.get(u'res').neg(): + var.get(u'bail')(Js(u'nonEmptyClassRanges')) + return var.get(u'res') + PyJsHoisted_parseClassRanges_.func_name = u'parseClassRanges' + var.put(u'parseClassRanges', PyJsHoisted_parseClassRanges_) + @Js + def PyJsHoisted_createEscaped_(kind, codePoint, value, fromOffset, this, arguments, var=var): + var = Scope({u'kind':kind, u'arguments':arguments, u'this':this, u'fromOffset':fromOffset, u'codePoint':codePoint, u'value':value}, var) + var.registers([u'kind', u'fromOffset', u'codePoint', u'value']) + var.put(u'fromOffset', (var.get(u'fromOffset') or Js(0.0))) + return var.get(u'createValue')(var.get(u'kind'), var.get(u'codePoint'), (var.get(u'pos')-(var.get(u'value').get(u'length')+var.get(u'fromOffset'))), var.get(u'pos')) + PyJsHoisted_createEscaped_.func_name = u'createEscaped' + var.put(u'createEscaped', PyJsHoisted_createEscaped_) + @Js + def PyJsHoisted_parseUnicodeSurrogatePairEscape_(firstEscape, this, arguments, var=var): + var = Scope({u'firstEscape':firstEscape, u'this':this, u'arguments':arguments}, var) + var.registers([u'firstEscape', u'secondEscape', u'second', u'prevPos', u'first']) + if var.get(u'hasUnicodeFlag'): + pass + if (((((var.get(u'firstEscape').get(u'kind')==Js(u'unicodeEscape')) and (var.put(u'first', var.get(u'firstEscape').get(u'codePoint'))>=Js(55296))) and (var.get(u'first')<=Js(56319))) and var.get(u'current')(Js(u'\\'))) and var.get(u'next')(Js(u'u'))): + var.put(u'prevPos', var.get(u'pos')) + (var.put(u'pos',Js(var.get(u'pos').to_number())+Js(1))-Js(1)) + var.put(u'secondEscape', var.get(u'parseClassEscape')()) + if (((var.get(u'secondEscape').get(u'kind')==Js(u'unicodeEscape')) and (var.put(u'second', var.get(u'secondEscape').get(u'codePoint'))>=Js(56320))) and (var.get(u'second')<=Js(57343))): + var.get(u'firstEscape').get(u'range').put(u'1', var.get(u'secondEscape').get(u'range').get(u'1')) + var.get(u'firstEscape').put(u'codePoint', (((((var.get(u'first')-Js(55296))*Js(1024))+var.get(u'second'))-Js(56320))+Js(65536))) + var.get(u'firstEscape').put(u'type', Js(u'value')) + var.get(u'firstEscape').put(u'kind', Js(u'unicodeCodePointEscape')) + var.get(u'addRaw')(var.get(u'firstEscape')) + else: + var.put(u'pos', var.get(u'prevPos')) + return var.get(u'firstEscape') + PyJsHoisted_parseUnicodeSurrogatePairEscape_.func_name = u'parseUnicodeSurrogatePairEscape' + var.put(u'parseUnicodeSurrogatePairEscape', PyJsHoisted_parseUnicodeSurrogatePairEscape_) + @Js + def PyJsHoisted_parseTerm_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'quantifier', u'anchor', u'atom']) + if (((var.get(u'pos')>=var.get(u'str').get(u'length')) or var.get(u'current')(Js(u'|'))) or var.get(u'current')(Js(u')'))): + return var.get(u"null") + var.put(u'anchor', var.get(u'parseAnchor')()) + if var.get(u'anchor'): + return var.get(u'anchor') + var.put(u'atom', var.get(u'parseAtom')()) + if var.get(u'atom').neg(): + var.get(u'bail')(Js(u'Expected atom')) + var.put(u'quantifier', (var.get(u'parseQuantifier')() or Js(False))) + if var.get(u'quantifier'): + var.get(u'quantifier').put(u'body', var.get(u'flattenBody')(var.get(u'atom'))) + var.get(u'updateRawStart')(var.get(u'quantifier'), var.get(u'atom').get(u'range').get(u'0')) + return var.get(u'quantifier') + return var.get(u'atom') + PyJsHoisted_parseTerm_.func_name = u'parseTerm' + var.put(u'parseTerm', PyJsHoisted_parseTerm_) + @Js + def PyJsHoisted_createGroup_(behavior, disjunction, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments, u'behavior':behavior, u'this':this, u'disjunction':disjunction}, var) + var.registers([u'to', u'disjunction', u'from', u'behavior']) + PyJs_Object_4019_ = Js({u'type':Js(u'group'),u'behavior':var.get(u'behavior'),u'body':var.get(u'disjunction'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4019_) + PyJsHoisted_createGroup_.func_name = u'createGroup' + var.put(u'createGroup', PyJsHoisted_createGroup_) + @Js + def PyJsHoisted_parseDecimalEscape_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'res', u'refIdx', u'match']) + pass + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^(?!0)\\d+/'))): + var.put(u'match', var.get(u'res').get(u'0')) + var.put(u'refIdx', var.get(u'parseInt')(var.get(u'res').get(u'0'), Js(10.0))) + if (var.get(u'refIdx')<=var.get(u'closedCaptureCounter')): + return var.get(u'createReference')(var.get(u'res').get(u'0')) + else: + var.get(u'backrefDenied').callprop(u'push', var.get(u'refIdx')) + var.get(u'incr')((-var.get(u'res').get(u'0').get(u'length'))) + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[0-7]{1,3}/'))): + return var.get(u'createEscaped')(Js(u'octal'), var.get(u'parseInt')(var.get(u'res').get(u'0'), Js(8.0)), var.get(u'res').get(u'0'), Js(1.0)) + else: + var.put(u'res', var.get(u'createCharacter')(var.get(u'matchReg')(JsRegExp(u'/^[89]/')))) + return var.get(u'updateRawStart')(var.get(u'res'), (var.get(u'res').get(u'range').get(u'0')-Js(1.0))) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[0-7]{1,3}/'))): + var.put(u'match', var.get(u'res').get(u'0')) + if JsRegExp(u'/^0{1,3}$/').callprop(u'test', var.get(u'match')): + return var.get(u'createEscaped')(Js(u'null'), Js(0), Js(u'0'), (var.get(u'match').get(u'length')+Js(1.0))) + else: + return var.get(u'createEscaped')(Js(u'octal'), var.get(u'parseInt')(var.get(u'match'), Js(8.0)), var.get(u'match'), Js(1.0)) + else: + if var.put(u'res', var.get(u'matchReg')(JsRegExp(u'/^[dDsSwW]/'))): + return var.get(u'createCharacterClassEscape')(var.get(u'res').get(u'0')) + return Js(False) + PyJsHoisted_parseDecimalEscape_.func_name = u'parseDecimalEscape' + var.put(u'parseDecimalEscape', PyJsHoisted_parseDecimalEscape_) + @Js + def PyJsHoisted_parseClassAtom_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + if var.get(u'match')(Js(u'-')): + return var.get(u'createCharacter')(Js(u'-')) + else: + return var.get(u'parseClassAtomNoDash')() + PyJsHoisted_parseClassAtom_.func_name = u'parseClassAtom' + var.put(u'parseClassAtom', PyJsHoisted_parseClassAtom_) + @Js + def PyJsHoisted_createCharacterClass_(classRanges, negative, PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'to':to, u'from':PyJsArg_66726f6d_, u'classRanges':classRanges, u'this':this, u'negative':negative, u'arguments':arguments}, var) + var.registers([u'to', u'from', u'classRanges', u'negative']) + PyJs_Object_4022_ = Js({u'type':Js(u'characterClass'),u'body':var.get(u'classRanges'),u'negative':var.get(u'negative'),u'range':Js([var.get(u'from'), var.get(u'to')])}) + return var.get(u'addRaw')(PyJs_Object_4022_) + PyJsHoisted_createCharacterClass_.func_name = u'createCharacterClass' + var.put(u'createCharacterClass', PyJsHoisted_createCharacterClass_) + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + pass + var.put(u'backrefDenied', Js([])) + var.put(u'closedCaptureCounter', Js(0.0)) + var.put(u'firstIteration', var.get(u'true')) + var.put(u'hasUnicodeFlag', PyJsStrictNeq((var.get(u'flags') or Js(u'')).callprop(u'indexOf', Js(u'u')),(-Js(1.0)))) + var.put(u'pos', Js(0.0)) + var.put(u'str', var.get(u'String')(var.get(u'str'))) + if PyJsStrictEq(var.get(u'str'),Js(u'')): + var.put(u'str', Js(u'(?:)')) + var.put(u'result', var.get(u'parseDisjunction')()) + if PyJsStrictNeq(var.get(u'result').get(u'range').get(u'1'),var.get(u'str').get(u'length')): + var.get(u'bail')(Js(u'Could not parse entire input - got stuck'), Js(u''), var.get(u'result').get(u'range').get(u'1')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')>'): + break + return var.get(u'ret') + PyJs_anonymous_4029_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4029_) +PyJs_anonymous_4028_._set_name(u'anonymous') +PyJs_Object_4030_ = Js({u'is-finite':Js(281.0)}) +@Js +def PyJs_anonymous_4031_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + Js(u'use strict') + @Js + def PyJs_anonymous_4032_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'isExtendedLengthPath', u'hasNonAscii', u'str']) + var.put(u'isExtendedLengthPath', JsRegExp(u'/^\\\\\\\\\\?\\\\/').callprop(u'test', var.get(u'str'))) + var.put(u'hasNonAscii', JsRegExp(u'/[^\\x00-\\x80]+/').callprop(u'test', var.get(u'str'))) + if (var.get(u'isExtendedLengthPath') or var.get(u'hasNonAscii')): + return var.get(u'str') + return var.get(u'str').callprop(u'replace', JsRegExp(u'/\\\\/g'), Js(u'/')) + PyJs_anonymous_4032_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4032_) +PyJs_anonymous_4031_._set_name(u'anonymous') +PyJs_Object_4033_ = Js({}) +@Js +def PyJs_anonymous_4034_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'require', u'module', u'util', u'ArraySet', u'has']) + @Js + def PyJsHoisted_ArraySet_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'_array', Js([])) + var.get(u"this").put(u'_set', var.get(u'Object').callprop(u'create', var.get(u"null"))) + PyJsHoisted_ArraySet_.func_name = u'ArraySet' + var.put(u'ArraySet', PyJsHoisted_ArraySet_) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + var.put(u'has', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + pass + @Js + def PyJs_ArraySet_fromArray_4035_(aArray, aAllowDuplicates, this, arguments, var=var): + var = Scope({u'this':this, u'ArraySet_fromArray':PyJs_ArraySet_fromArray_4035_, u'aAllowDuplicates':aAllowDuplicates, u'aArray':aArray, u'arguments':arguments}, var) + var.registers([u'i', u'aAllowDuplicates', u'set', u'aArray', u'len']) + var.put(u'set', var.get(u'ArraySet').create()) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'aArray').get(u'length')) + while (var.get(u'i')=Js(0.0)) and (var.get(u'aIdx')>Js(1.0))) + return ((-var.get(u'shifted')) if var.get(u'isNegative') else var.get(u'shifted')) + PyJsHoisted_fromVLQSigned_.func_name = u'fromVLQSigned' + var.put(u'fromVLQSigned', PyJsHoisted_fromVLQSigned_) + var.put(u'base64', var.get(u'require')(Js(u'./base64'))) + var.put(u'VLQ_BASE_SHIFT', Js(5.0)) + var.put(u'VLQ_BASE', (Js(1.0)<>>') + if (var.get(u'vlq')>Js(0.0)): + var.put(u'digit', var.get(u'VLQ_CONTINUATION_BIT'), u'|') + var.put(u'encoded', var.get(u'base64').callprop(u'encode', var.get(u'digit')), u'+') + if not (var.get(u'vlq')>Js(0.0)): + break + return var.get(u'encoded') + PyJs_base64VLQ_encode_4044_._set_name(u'base64VLQ_encode') + var.get(u'exports').put(u'encode', PyJs_base64VLQ_encode_4044_) + @Js + def PyJs_base64VLQ_decode_4045_(aStr, aIndex, aOutParam, this, arguments, var=var): + var = Scope({u'base64VLQ_decode':PyJs_base64VLQ_decode_4045_, u'this':this, u'arguments':arguments, u'aStr':aStr, u'aOutParam':aOutParam, u'aIndex':aIndex}, var) + var.registers([u'digit', u'shift', u'result', u'continuation', u'aStr', u'aOutParam', u'strLen', u'aIndex']) + var.put(u'strLen', var.get(u'aStr').get(u'length')) + var.put(u'result', Js(0.0)) + var.put(u'shift', Js(0.0)) + pass + while 1: + if (var.get(u'aIndex')>=var.get(u'strLen')): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Expected more digits in base 64 VLQ value.'))) + raise PyJsTempException + var.put(u'digit', var.get(u'base64').callprop(u'decode', var.get(u'aStr').callprop(u'charCodeAt', (var.put(u'aIndex',Js(var.get(u'aIndex').to_number())+Js(1))-Js(1))))) + if PyJsStrictEq(var.get(u'digit'),(-Js(1.0))): + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Invalid base64 digit: ')+var.get(u'aStr').callprop(u'charAt', (var.get(u'aIndex')-Js(1.0)))))) + raise PyJsTempException + var.put(u'continuation', (var.get(u'digit')&var.get(u'VLQ_CONTINUATION_BIT')).neg().neg()) + var.put(u'digit', var.get(u'VLQ_BASE_MASK'), u'&') + var.put(u'result', (var.get(u'result')+(var.get(u'digit')<Js(0.0)): + if ((var.get(u'aHigh')-var.get(u'mid'))>Js(1.0)): + return var.get(u'recursiveSearch')(var.get(u'mid'), var.get(u'aHigh'), var.get(u'aNeedle'), var.get(u'aHaystack'), var.get(u'aCompare'), var.get(u'aBias')) + if (var.get(u'aBias')==var.get(u'exports').get(u'LEAST_UPPER_BOUND')): + return (var.get(u'aHigh') if (var.get(u'aHigh')Js(1.0)): + return var.get(u'recursiveSearch')(var.get(u'aLow'), var.get(u'mid'), var.get(u'aNeedle'), var.get(u'aHaystack'), var.get(u'aCompare'), var.get(u'aBias')) + if (var.get(u'aBias')==var.get(u'exports').get(u'LEAST_UPPER_BOUND')): + return var.get(u'mid') + else: + return ((-Js(1.0)) if (var.get(u'aLow')=Js(0.0)): + if PyJsStrictNeq(var.get(u'aCompare')(var.get(u'aHaystack').get(var.get(u'index')), var.get(u'aHaystack').get((var.get(u'index')-Js(1.0))), var.get(u'true')),Js(0.0)): + break + var.put(u'index',Js(var.get(u'index').to_number())-Js(1)) + return var.get(u'index') + PyJs_search_4052_._set_name(u'search') + var.get(u'exports').put(u'search', PyJs_search_4052_) +PyJs_anonymous_4051_._set_name(u'anonymous') +PyJs_Object_4053_ = Js({}) +@Js +def PyJs_anonymous_4054_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'generatedPositionAfter', u'require', u'exports', u'module', u'util', u'MappingList']) + @Js + def PyJsHoisted_generatedPositionAfter_(mappingA, mappingB, this, arguments, var=var): + var = Scope({u'this':this, u'mappingB':mappingB, u'arguments':arguments, u'mappingA':mappingA}, var) + var.registers([u'columnA', u'columnB', u'mappingB', u'mappingA', u'lineB', u'lineA']) + var.put(u'lineA', var.get(u'mappingA').get(u'generatedLine')) + var.put(u'lineB', var.get(u'mappingB').get(u'generatedLine')) + var.put(u'columnA', var.get(u'mappingA').get(u'generatedColumn')) + var.put(u'columnB', var.get(u'mappingB').get(u'generatedColumn')) + return (((var.get(u'lineB')>var.get(u'lineA')) or ((var.get(u'lineB')==var.get(u'lineA')) and (var.get(u'columnB')>=var.get(u'columnA')))) or (var.get(u'util').callprop(u'compareByGeneratedPositionsInflated', var.get(u'mappingA'), var.get(u'mappingB'))<=Js(0.0))) + PyJsHoisted_generatedPositionAfter_.func_name = u'generatedPositionAfter' + var.put(u'generatedPositionAfter', PyJsHoisted_generatedPositionAfter_) + @Js + def PyJsHoisted_MappingList_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + var.get(u"this").put(u'_array', Js([])) + var.get(u"this").put(u'_sorted', var.get(u'true')) + PyJs_Object_4055_ = Js({u'generatedLine':(-Js(1.0)),u'generatedColumn':Js(0.0)}) + var.get(u"this").put(u'_last', PyJs_Object_4055_) + PyJsHoisted_MappingList_.func_name = u'MappingList' + var.put(u'MappingList', PyJsHoisted_MappingList_) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + pass + pass + @Js + def PyJs_MappingList_forEach_4056_(aCallback, aThisArg, this, arguments, var=var): + var = Scope({u'this':this, u'aThisArg':aThisArg, u'aCallback':aCallback, u'MappingList_forEach':PyJs_MappingList_forEach_4056_, u'arguments':arguments}, var) + var.registers([u'aThisArg', u'aCallback']) + var.get(u"this").get(u'_array').callprop(u'forEach', var.get(u'aCallback'), var.get(u'aThisArg')) + PyJs_MappingList_forEach_4056_._set_name(u'MappingList_forEach') + var.get(u'MappingList').get(u'prototype').put(u'unsortedForEach', PyJs_MappingList_forEach_4056_) + @Js + def PyJs_MappingList_add_4057_(aMapping, this, arguments, var=var): + var = Scope({u'this':this, u'MappingList_add':PyJs_MappingList_add_4057_, u'aMapping':aMapping, u'arguments':arguments}, var) + var.registers([u'aMapping']) + if var.get(u'generatedPositionAfter')(var.get(u"this").get(u'_last'), var.get(u'aMapping')): + var.get(u"this").put(u'_last', var.get(u'aMapping')) + var.get(u"this").get(u'_array').callprop(u'push', var.get(u'aMapping')) + else: + var.get(u"this").put(u'_sorted', Js(False)) + var.get(u"this").get(u'_array').callprop(u'push', var.get(u'aMapping')) + PyJs_MappingList_add_4057_._set_name(u'MappingList_add') + var.get(u'MappingList').get(u'prototype').put(u'add', PyJs_MappingList_add_4057_) + @Js + def PyJs_MappingList_toArray_4058_(this, arguments, var=var): + var = Scope({u'this':this, u'MappingList_toArray':PyJs_MappingList_toArray_4058_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'_sorted').neg(): + var.get(u"this").get(u'_array').callprop(u'sort', var.get(u'util').get(u'compareByGeneratedPositionsInflated')) + var.get(u"this").put(u'_sorted', var.get(u'true')) + return var.get(u"this").get(u'_array') + PyJs_MappingList_toArray_4058_._set_name(u'MappingList_toArray') + var.get(u'MappingList').get(u'prototype').put(u'toArray', PyJs_MappingList_toArray_4058_) + var.get(u'exports').put(u'MappingList', var.get(u'MappingList')) +PyJs_anonymous_4054_._set_name(u'anonymous') +PyJs_Object_4059_ = Js({u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4060_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'exports', u'randomIntInRange', u'require', u'module', u'doQuickSort', u'swap']) + @Js + def PyJsHoisted_randomIntInRange_(low, high, this, arguments, var=var): + var = Scope({u'high':high, u'this':this, u'low':low, u'arguments':arguments}, var) + var.registers([u'high', u'low']) + return var.get(u'Math').callprop(u'round', (var.get(u'low')+(var.get(u'Math').callprop(u'random')*(var.get(u'high')-var.get(u'low'))))) + PyJsHoisted_randomIntInRange_.func_name = u'randomIntInRange' + var.put(u'randomIntInRange', PyJsHoisted_randomIntInRange_) + @Js + def PyJsHoisted_swap_(ary, x, y, this, arguments, var=var): + var = Scope({u'y':y, u'ary':ary, u'this':this, u'arguments':arguments, u'x':x}, var) + var.registers([u'y', u'ary', u'temp', u'x']) + var.put(u'temp', var.get(u'ary').get(var.get(u'x'))) + var.get(u'ary').put(var.get(u'x'), var.get(u'ary').get(var.get(u'y'))) + var.get(u'ary').put(var.get(u'y'), var.get(u'temp')) + PyJsHoisted_swap_.func_name = u'swap' + var.put(u'swap', PyJsHoisted_swap_) + @Js + def PyJsHoisted_doQuickSort_(ary, comparator, p, r, this, arguments, var=var): + var = Scope({u'p':p, u'r':r, u'arguments':arguments, u'comparator':comparator, u'this':this, u'ary':ary}, var) + var.registers([u'comparator', u'i', u'ary', u'pivotIndex', u'j', u'q', u'p', u'r', u'pivot']) + if (var.get(u'p')=Js(0.0)): + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.get(u'index'))) + if PyJsStrictEq(var.get(u'aArgs').get(u'column'),var.get(u'undefined')): + var.put(u'originalLine', var.get(u'mapping').get(u'originalLine')) + while (var.get(u'mapping') and PyJsStrictEq(var.get(u'mapping').get(u'originalLine'),var.get(u'originalLine'))): + PyJs_Object_4076_ = Js({u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedColumn'), var.get(u"null")),u'lastColumn':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'lastGeneratedColumn'), var.get(u"null"))}) + var.get(u'mappings').callprop(u'push', PyJs_Object_4076_) + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)))) + else: + var.put(u'originalColumn', var.get(u'mapping').get(u'originalColumn')) + while ((var.get(u'mapping') and PyJsStrictEq(var.get(u'mapping').get(u'originalLine'),var.get(u'line'))) and (var.get(u'mapping').get(u'originalColumn')==var.get(u'originalColumn'))): + PyJs_Object_4077_ = Js({u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedColumn'), var.get(u"null")),u'lastColumn':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'lastGeneratedColumn'), var.get(u"null"))}) + var.get(u'mappings').callprop(u'push', PyJs_Object_4077_) + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.put(u'index',Js(var.get(u'index').to_number())+Js(1)))) + return var.get(u'mappings') + PyJs_SourceMapConsumer_allGeneratedPositionsFor_4074_._set_name(u'SourceMapConsumer_allGeneratedPositionsFor') + var.get(u'SourceMapConsumer').get(u'prototype').put(u'allGeneratedPositionsFor', PyJs_SourceMapConsumer_allGeneratedPositionsFor_4074_) + var.get(u'exports').put(u'SourceMapConsumer', var.get(u'SourceMapConsumer')) + pass + var.get(u'BasicSourceMapConsumer').put(u'prototype', var.get(u'Object').callprop(u'create', var.get(u'SourceMapConsumer').get(u'prototype'))) + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'consumer', var.get(u'SourceMapConsumer')) + @Js + def PyJs_SourceMapConsumer_fromSourceMap_4079_(aSourceMap, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceMap':aSourceMap, u'SourceMapConsumer_fromSourceMap':PyJs_SourceMapConsumer_fromSourceMap_4079_, u'arguments':arguments}, var) + var.registers([u'i', u'aSourceMap', u'srcMapping', u'destGeneratedMappings', u'destMapping', u'destOriginalMappings', u'sources', u'length', u'generatedMappings', u'names', u'smc']) + var.put(u'smc', var.get(u'Object').callprop(u'create', var.get(u'BasicSourceMapConsumer').get(u'prototype'))) + var.put(u'names', var.get(u'smc').put(u'_names', var.get(u'ArraySet').callprop(u'fromArray', var.get(u'aSourceMap').get(u'_names').callprop(u'toArray'), var.get(u'true')))) + var.put(u'sources', var.get(u'smc').put(u'_sources', var.get(u'ArraySet').callprop(u'fromArray', var.get(u'aSourceMap').get(u'_sources').callprop(u'toArray'), var.get(u'true')))) + var.get(u'smc').put(u'sourceRoot', var.get(u'aSourceMap').get(u'_sourceRoot')) + var.get(u'smc').put(u'sourcesContent', var.get(u'aSourceMap').callprop(u'_generateSourcesContent', var.get(u'smc').get(u'_sources').callprop(u'toArray'), var.get(u'smc').get(u'sourceRoot'))) + var.get(u'smc').put(u'file', var.get(u'aSourceMap').get(u'_file')) + var.put(u'generatedMappings', var.get(u'aSourceMap').get(u'_mappings').callprop(u'toArray').callprop(u'slice')) + var.put(u'destGeneratedMappings', var.get(u'smc').put(u'__generatedMappings', Js([]))) + var.put(u'destOriginalMappings', var.get(u'smc').put(u'__originalMappings', Js([]))) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'length', var.get(u'generatedMappings').get(u'length')) + while (var.get(u'i')Js(1.0)): + var.get(u'mapping').put(u'source', (var.get(u'previousSource')+var.get(u'segment').get(u'1'))) + var.put(u'previousSource', var.get(u'segment').get(u'1'), u'+') + var.get(u'mapping').put(u'originalLine', (var.get(u'previousOriginalLine')+var.get(u'segment').get(u'2'))) + var.put(u'previousOriginalLine', var.get(u'mapping').get(u'originalLine')) + var.get(u'mapping').put(u'originalLine', Js(1.0), u'+') + var.get(u'mapping').put(u'originalColumn', (var.get(u'previousOriginalColumn')+var.get(u'segment').get(u'3'))) + var.put(u'previousOriginalColumn', var.get(u'mapping').get(u'originalColumn')) + if (var.get(u'segment').get(u'length')>Js(4.0)): + var.get(u'mapping').put(u'name', (var.get(u'previousName')+var.get(u'segment').get(u'4'))) + var.put(u'previousName', var.get(u'segment').get(u'4'), u'+') + var.get(u'generatedMappings').callprop(u'push', var.get(u'mapping')) + if PyJsStrictEq(var.get(u'mapping').get(u'originalLine').typeof(),Js(u'number')): + var.get(u'originalMappings').callprop(u'push', var.get(u'mapping')) + var.get(u'quickSort')(var.get(u'generatedMappings'), var.get(u'util').get(u'compareByGeneratedPositionsDeflated')) + var.get(u"this").put(u'__generatedMappings', var.get(u'generatedMappings')) + var.get(u'quickSort')(var.get(u'originalMappings'), var.get(u'util').get(u'compareByOriginalPositions')) + var.get(u"this").put(u'__originalMappings', var.get(u'originalMappings')) + PyJs_SourceMapConsumer_parseMappings_4083_._set_name(u'SourceMapConsumer_parseMappings') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'_parseMappings', PyJs_SourceMapConsumer_parseMappings_4083_) + @Js + def PyJs_SourceMapConsumer_findMapping_4086_(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias, this, arguments, var=var): + var = Scope({u'aNeedle':aNeedle, u'SourceMapConsumer_findMapping':PyJs_SourceMapConsumer_findMapping_4086_, u'this':this, u'aBias':aBias, u'aColumnName':aColumnName, u'aComparator':aComparator, u'arguments':arguments, u'aMappings':aMappings, u'aLineName':aLineName}, var) + var.registers([u'aNeedle', u'aBias', u'aColumnName', u'aComparator', u'aMappings', u'aLineName']) + if (var.get(u'aNeedle').get(var.get(u'aLineName'))<=Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Line must be greater than or equal to 1, got ')+var.get(u'aNeedle').get(var.get(u'aLineName'))))) + raise PyJsTempException + if (var.get(u'aNeedle').get(var.get(u'aColumnName'))=Js(0.0)): + var.put(u'mapping', var.get(u"this").get(u'_generatedMappings').get(var.get(u'index'))) + if PyJsStrictEq(var.get(u'mapping').get(u'generatedLine'),var.get(u'needle').get(u'generatedLine')): + var.put(u'source', var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'source'), var.get(u"null"))) + if PyJsStrictNeq(var.get(u'source'),var.get(u"null")): + var.put(u'source', var.get(u"this").get(u'_sources').callprop(u'at', var.get(u'source'))) + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'join', var.get(u"this").get(u'sourceRoot'), var.get(u'source'))) + var.put(u'name', var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'name'), var.get(u"null"))) + if PyJsStrictNeq(var.get(u'name'),var.get(u"null")): + var.put(u'name', var.get(u"this").get(u'_names').callprop(u'at', var.get(u'name'))) + PyJs_Object_4090_ = Js({u'source':var.get(u'source'),u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'originalLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'originalColumn'), var.get(u"null")),u'name':var.get(u'name')}) + return PyJs_Object_4090_ + PyJs_Object_4091_ = Js({u'source':var.get(u"null"),u'line':var.get(u"null"),u'column':var.get(u"null"),u'name':var.get(u"null")}) + return PyJs_Object_4091_ + PyJs_SourceMapConsumer_originalPositionFor_4088_._set_name(u'SourceMapConsumer_originalPositionFor') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'originalPositionFor', PyJs_SourceMapConsumer_originalPositionFor_4088_) + @Js + def PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_(this, arguments, var=var): + var = Scope({u'this':this, u'BasicSourceMapConsumer_hasContentsOfAllSources':PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_, u'arguments':arguments}, var) + var.registers([]) + if var.get(u"this").get(u'sourcesContent').neg(): + return Js(False) + @Js + def PyJs_anonymous_4093_(sc, this, arguments, var=var): + var = Scope({u'sc':sc, u'this':this, u'arguments':arguments}, var) + var.registers([u'sc']) + return (var.get(u'sc')==var.get(u"null")) + PyJs_anonymous_4093_._set_name(u'anonymous') + return ((var.get(u"this").get(u'sourcesContent').get(u'length')>=var.get(u"this").get(u'_sources').callprop(u'size')) and var.get(u"this").get(u'sourcesContent').callprop(u'some', PyJs_anonymous_4093_).neg()) + PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_._set_name(u'BasicSourceMapConsumer_hasContentsOfAllSources') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'hasContentsOfAllSources', PyJs_BasicSourceMapConsumer_hasContentsOfAllSources_4092_) + @Js + def PyJs_SourceMapConsumer_sourceContentFor_4094_(aSource, nullOnMissing, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapConsumer_sourceContentFor':PyJs_SourceMapConsumer_sourceContentFor_4094_, u'aSource':aSource, u'nullOnMissing':nullOnMissing}, var) + var.registers([u'url', u'fileUriAbsPath', u'aSource', u'nullOnMissing']) + if var.get(u"this").get(u'sourcesContent').neg(): + return var.get(u"null") + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.put(u'aSource', var.get(u'util').callprop(u'relative', var.get(u"this").get(u'sourceRoot'), var.get(u'aSource'))) + if var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'aSource')): + return var.get(u"this").get(u'sourcesContent').get(var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'aSource'))) + pass + if ((var.get(u"this").get(u'sourceRoot')!=var.get(u"null")) and var.put(u'url', var.get(u'util').callprop(u'urlParse', var.get(u"this").get(u'sourceRoot')))): + var.put(u'fileUriAbsPath', var.get(u'aSource').callprop(u'replace', JsRegExp(u'/^file:\\/\\//'), Js(u''))) + if ((var.get(u'url').get(u'scheme')==Js(u'file')) and var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'fileUriAbsPath'))): + return var.get(u"this").get(u'sourcesContent').get(var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'fileUriAbsPath'))) + if ((var.get(u'url').get(u'path').neg() or (var.get(u'url').get(u'path')==Js(u'/'))) and var.get(u"this").get(u'_sources').callprop(u'has', (Js(u'/')+var.get(u'aSource')))): + return var.get(u"this").get(u'sourcesContent').get(var.get(u"this").get(u'_sources').callprop(u'indexOf', (Js(u'/')+var.get(u'aSource')))) + if var.get(u'nullOnMissing'): + return var.get(u"null") + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'"')+var.get(u'aSource'))+Js(u'" is not in the SourceMap.')))) + raise PyJsTempException + PyJs_SourceMapConsumer_sourceContentFor_4094_._set_name(u'SourceMapConsumer_sourceContentFor') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'sourceContentFor', PyJs_SourceMapConsumer_sourceContentFor_4094_) + @Js + def PyJs_SourceMapConsumer_generatedPositionFor_4095_(aArgs, this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapConsumer_generatedPositionFor':PyJs_SourceMapConsumer_generatedPositionFor_4095_, u'arguments':arguments, u'aArgs':aArgs}, var) + var.registers([u'aArgs', u'source', u'needle', u'mapping', u'index']) + var.put(u'source', var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'source'))) + if (var.get(u"this").get(u'sourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'relative', var.get(u"this").get(u'sourceRoot'), var.get(u'source'))) + if var.get(u"this").get(u'_sources').callprop(u'has', var.get(u'source')).neg(): + PyJs_Object_4096_ = Js({u'line':var.get(u"null"),u'column':var.get(u"null"),u'lastColumn':var.get(u"null")}) + return PyJs_Object_4096_ + var.put(u'source', var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'source'))) + PyJs_Object_4097_ = Js({u'source':var.get(u'source'),u'originalLine':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'line')),u'originalColumn':var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'column'))}) + var.put(u'needle', PyJs_Object_4097_) + var.put(u'index', var.get(u"this").callprop(u'_findMapping', var.get(u'needle'), var.get(u"this").get(u'_originalMappings'), Js(u'originalLine'), Js(u'originalColumn'), var.get(u'util').get(u'compareByOriginalPositions'), var.get(u'util').callprop(u'getArg', var.get(u'aArgs'), Js(u'bias'), var.get(u'SourceMapConsumer').get(u'GREATEST_LOWER_BOUND')))) + if (var.get(u'index')>=Js(0.0)): + var.put(u'mapping', var.get(u"this").get(u'_originalMappings').get(var.get(u'index'))) + if PyJsStrictEq(var.get(u'mapping').get(u'source'),var.get(u'needle').get(u'source')): + PyJs_Object_4098_ = Js({u'line':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedLine'), var.get(u"null")),u'column':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'generatedColumn'), var.get(u"null")),u'lastColumn':var.get(u'util').callprop(u'getArg', var.get(u'mapping'), Js(u'lastGeneratedColumn'), var.get(u"null"))}) + return PyJs_Object_4098_ + PyJs_Object_4099_ = Js({u'line':var.get(u"null"),u'column':var.get(u"null"),u'lastColumn':var.get(u"null")}) + return PyJs_Object_4099_ + PyJs_SourceMapConsumer_generatedPositionFor_4095_._set_name(u'SourceMapConsumer_generatedPositionFor') + var.get(u'BasicSourceMapConsumer').get(u'prototype').put(u'generatedPositionFor', PyJs_SourceMapConsumer_generatedPositionFor_4095_) + var.get(u'exports').put(u'BasicSourceMapConsumer', var.get(u'BasicSourceMapConsumer')) + pass + var.get(u'IndexedSourceMapConsumer').put(u'prototype', var.get(u'Object').callprop(u'create', var.get(u'SourceMapConsumer').get(u'prototype'))) + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'constructor', var.get(u'SourceMapConsumer')) + var.get(u'IndexedSourceMapConsumer').get(u'prototype').put(u'_version', Js(3.0)) + @Js + def PyJs_anonymous_4105_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'sources', u'j']) + var.put(u'sources', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(0.0))) and (var.get(u'aGenerated').get(u'column')>=Js(0.0))) and var.get(u'aOriginal').neg()) and var.get(u'aSource').neg()) and var.get(u'aName').neg()): + return var.get('undefined') + else: + def PyJs_LONG_4137_(var=var): + return ((((((((var.get(u'aGenerated') and var.get(u'aGenerated').contains(Js(u'line'))) and var.get(u'aGenerated').contains(Js(u'column'))) and var.get(u'aOriginal')) and var.get(u'aOriginal').contains(Js(u'line'))) and var.get(u'aOriginal').contains(Js(u'column'))) and (var.get(u'aGenerated').get(u'line')>Js(0.0))) and (var.get(u'aGenerated').get(u'column')>=Js(0.0))) and (var.get(u'aOriginal').get(u'line')>Js(0.0))) + if ((PyJs_LONG_4137_() and (var.get(u'aOriginal').get(u'column')>=Js(0.0))) and var.get(u'aSource')): + return var.get('undefined') + else: + PyJs_Object_4138_ = Js({u'generated':var.get(u'aGenerated'),u'source':var.get(u'aSource'),u'original':var.get(u'aOriginal'),u'name':var.get(u'aName')}) + PyJsTempException = JsToPyException(var.get(u'Error').create((Js(u'Invalid mapping: ')+var.get(u'JSON').callprop(u'stringify', PyJs_Object_4138_)))) + raise PyJsTempException + PyJs_SourceMapGenerator_validateMapping_4136_._set_name(u'SourceMapGenerator_validateMapping') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_validateMapping', PyJs_SourceMapGenerator_validateMapping_4136_) + @Js + def PyJs_SourceMapGenerator_serializeMappings_4139_(this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_serializeMappings':PyJs_SourceMapGenerator_serializeMappings_4139_, u'arguments':arguments}, var) + var.registers([u'previousOriginalColumn', u'previousOriginalLine', u'previousGeneratedLine', u'previousSource', u'previousGeneratedColumn', u'i', u'mapping', u'previousName', u'next', u'len', u'nameIdx', u'sourceIdx', u'result', u'mappings']) + var.put(u'previousGeneratedColumn', Js(0.0)) + var.put(u'previousGeneratedLine', Js(1.0)) + var.put(u'previousOriginalColumn', Js(0.0)) + var.put(u'previousOriginalLine', Js(0.0)) + var.put(u'previousName', Js(0.0)) + var.put(u'previousSource', Js(0.0)) + var.put(u'result', Js(u'')) + pass + pass + pass + pass + var.put(u'mappings', var.get(u"this").get(u'_mappings').callprop(u'toArray')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'mappings').get(u'length')) + while (var.get(u'i')Js(0.0)): + if var.get(u'util').callprop(u'compareByGeneratedPositionsInflated', var.get(u'mapping'), var.get(u'mappings').get((var.get(u'i')-Js(1.0)))).neg(): + continue + var.put(u'next', Js(u','), u'+') + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'mapping').get(u'generatedColumn')-var.get(u'previousGeneratedColumn'))), u'+') + var.put(u'previousGeneratedColumn', var.get(u'mapping').get(u'generatedColumn')) + if (var.get(u'mapping').get(u'source')!=var.get(u"null")): + var.put(u'sourceIdx', var.get(u"this").get(u'_sources').callprop(u'indexOf', var.get(u'mapping').get(u'source'))) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'sourceIdx')-var.get(u'previousSource'))), u'+') + var.put(u'previousSource', var.get(u'sourceIdx')) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', ((var.get(u'mapping').get(u'originalLine')-Js(1.0))-var.get(u'previousOriginalLine'))), u'+') + var.put(u'previousOriginalLine', (var.get(u'mapping').get(u'originalLine')-Js(1.0))) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'mapping').get(u'originalColumn')-var.get(u'previousOriginalColumn'))), u'+') + var.put(u'previousOriginalColumn', var.get(u'mapping').get(u'originalColumn')) + if (var.get(u'mapping').get(u'name')!=var.get(u"null")): + var.put(u'nameIdx', var.get(u"this").get(u'_names').callprop(u'indexOf', var.get(u'mapping').get(u'name'))) + var.put(u'next', var.get(u'base64VLQ').callprop(u'encode', (var.get(u'nameIdx')-var.get(u'previousName'))), u'+') + var.put(u'previousName', var.get(u'nameIdx')) + var.put(u'result', var.get(u'next'), u'+') + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'result') + PyJs_SourceMapGenerator_serializeMappings_4139_._set_name(u'SourceMapGenerator_serializeMappings') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_serializeMappings', PyJs_SourceMapGenerator_serializeMappings_4139_) + @Js + def PyJs_SourceMapGenerator_generateSourcesContent_4140_(aSources, aSourceRoot, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapGenerator_generateSourcesContent':PyJs_SourceMapGenerator_generateSourcesContent_4140_, u'aSources':aSources, u'aSourceRoot':aSourceRoot}, var) + var.registers([u'aSources', u'aSourceRoot']) + @Js + def PyJs_anonymous_4141_(source, this, arguments, var=var): + var = Scope({u'this':this, u'source':source, u'arguments':arguments}, var) + var.registers([u'source', u'key']) + if var.get(u"this").get(u'_sourcesContents').neg(): + return var.get(u"null") + if (var.get(u'aSourceRoot')!=var.get(u"null")): + var.put(u'source', var.get(u'util').callprop(u'relative', var.get(u'aSourceRoot'), var.get(u'source'))) + var.put(u'key', var.get(u'util').callprop(u'toSetString', var.get(u'source'))) + return (var.get(u"this").get(u'_sourcesContents').get(var.get(u'key')) if var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u"this").get(u'_sourcesContents'), var.get(u'key')) else var.get(u"null")) + PyJs_anonymous_4141_._set_name(u'anonymous') + return var.get(u'aSources').callprop(u'map', PyJs_anonymous_4141_, var.get(u"this")) + PyJs_SourceMapGenerator_generateSourcesContent_4140_._set_name(u'SourceMapGenerator_generateSourcesContent') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'_generateSourcesContent', PyJs_SourceMapGenerator_generateSourcesContent_4140_) + @Js + def PyJs_SourceMapGenerator_toJSON_4142_(this, arguments, var=var): + var = Scope({u'this':this, u'SourceMapGenerator_toJSON':PyJs_SourceMapGenerator_toJSON_4142_, u'arguments':arguments}, var) + var.registers([u'map']) + PyJs_Object_4143_ = Js({u'version':var.get(u"this").get(u'_version'),u'sources':var.get(u"this").get(u'_sources').callprop(u'toArray'),u'names':var.get(u"this").get(u'_names').callprop(u'toArray'),u'mappings':var.get(u"this").callprop(u'_serializeMappings')}) + var.put(u'map', PyJs_Object_4143_) + if (var.get(u"this").get(u'_file')!=var.get(u"null")): + var.get(u'map').put(u'file', var.get(u"this").get(u'_file')) + if (var.get(u"this").get(u'_sourceRoot')!=var.get(u"null")): + var.get(u'map').put(u'sourceRoot', var.get(u"this").get(u'_sourceRoot')) + if var.get(u"this").get(u'_sourcesContents'): + var.get(u'map').put(u'sourcesContent', var.get(u"this").callprop(u'_generateSourcesContent', var.get(u'map').get(u'sources'), var.get(u'map').get(u'sourceRoot'))) + return var.get(u'map') + PyJs_SourceMapGenerator_toJSON_4142_._set_name(u'SourceMapGenerator_toJSON') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'toJSON', PyJs_SourceMapGenerator_toJSON_4142_) + @Js + def PyJs_SourceMapGenerator_toString_4144_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'SourceMapGenerator_toString':PyJs_SourceMapGenerator_toString_4144_}, var) + var.registers([]) + return var.get(u'JSON').callprop(u'stringify', var.get(u"this").callprop(u'toJSON')) + PyJs_SourceMapGenerator_toString_4144_._set_name(u'SourceMapGenerator_toString') + var.get(u'SourceMapGenerator').get(u'prototype').put(u'toString', PyJs_SourceMapGenerator_toString_4144_) + var.get(u'exports').put(u'SourceMapGenerator', var.get(u'SourceMapGenerator')) +PyJs_anonymous_4120_._set_name(u'anonymous') +PyJs_Object_4145_ = Js({u'./array-set':Js(509.0),u'./base64-vlq':Js(510.0),u'./mapping-list':Js(513.0),u'./util':Js(518.0)}) +@Js +def PyJs_anonymous_4146_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'util', u'exports', u'NEWLINE_CODE', u'SourceNode', u'require', u'isSourceNode', u'module', u'SourceMapGenerator', u'REGEX_NEWLINE']) + @Js + def PyJsHoisted_SourceNode_(aLine, aColumn, aSource, aChunks, aName, this, arguments, var=var): + var = Scope({u'aChunks':aChunks, u'aSource':aSource, u'aLine':aLine, u'this':this, u'aColumn':aColumn, u'aName':aName, u'arguments':arguments}, var) + var.registers([u'aChunks', u'aColumn', u'aSource', u'aLine', u'aName']) + var.get(u"this").put(u'children', Js([])) + PyJs_Object_4147_ = Js({}) + var.get(u"this").put(u'sourceContents', PyJs_Object_4147_) + var.get(u"this").put(u'line', (var.get(u"null") if (var.get(u'aLine')==var.get(u"null")) else var.get(u'aLine'))) + var.get(u"this").put(u'column', (var.get(u"null") if (var.get(u'aColumn')==var.get(u"null")) else var.get(u'aColumn'))) + var.get(u"this").put(u'source', (var.get(u"null") if (var.get(u'aSource')==var.get(u"null")) else var.get(u'aSource'))) + var.get(u"this").put(u'name', (var.get(u"null") if (var.get(u'aName')==var.get(u"null")) else var.get(u'aName'))) + var.get(u"this").put(var.get(u'isSourceNode'), var.get(u'true')) + if (var.get(u'aChunks')!=var.get(u"null")): + var.get(u"this").callprop(u'add', var.get(u'aChunks')) + PyJsHoisted_SourceNode_.func_name = u'SourceNode' + var.put(u'SourceNode', PyJsHoisted_SourceNode_) + var.put(u'SourceMapGenerator', var.get(u'require')(Js(u'./source-map-generator')).get(u'SourceMapGenerator')) + var.put(u'util', var.get(u'require')(Js(u'./util'))) + var.put(u'REGEX_NEWLINE', JsRegExp(u'/(\\r?\\n)/')) + var.put(u'NEWLINE_CODE', Js(10.0)) + var.put(u'isSourceNode', Js(u'$$$isSourceNode$$$')) + pass + @Js + def PyJs_SourceNode_fromStringWithSourceMap_4148_(aGeneratedCode, aSourceMapConsumer, aRelativePath, this, arguments, var=var): + var = Scope({u'aSourceMapConsumer':aSourceMapConsumer, u'this':this, u'aRelativePath':aRelativePath, u'aGeneratedCode':aGeneratedCode, u'SourceNode_fromStringWithSourceMap':PyJs_SourceNode_fromStringWithSourceMap_4148_, u'arguments':arguments}, var) + var.registers([u'node', u'lastMapping', u'remainingLines', u'aSourceMapConsumer', u'aGeneratedCode', u'lastGeneratedLine', u'aRelativePath', u'addMappingWithCode', u'shiftNextLine', u'lastGeneratedColumn']) + @Js + def PyJsHoisted_addMappingWithCode_(mapping, code, this, arguments, var=var): + var = Scope({u'this':this, u'code':code, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'source', u'code', u'mapping']) + if (PyJsStrictEq(var.get(u'mapping'),var.get(u"null")) or PyJsStrictEq(var.get(u'mapping').get(u'source'),var.get(u'undefined'))): + var.get(u'node').callprop(u'add', var.get(u'code')) + else: + var.put(u'source', (var.get(u'util').callprop(u'join', var.get(u'aRelativePath'), var.get(u'mapping').get(u'source')) if var.get(u'aRelativePath') else var.get(u'mapping').get(u'source'))) + var.get(u'node').callprop(u'add', var.get(u'SourceNode').create(var.get(u'mapping').get(u'originalLine'), var.get(u'mapping').get(u'originalColumn'), var.get(u'source'), var.get(u'code'), var.get(u'mapping').get(u'name'))) + PyJsHoisted_addMappingWithCode_.func_name = u'addMappingWithCode' + var.put(u'addMappingWithCode', PyJsHoisted_addMappingWithCode_) + var.put(u'node', var.get(u'SourceNode').create()) + var.put(u'remainingLines', var.get(u'aGeneratedCode').callprop(u'split', var.get(u'REGEX_NEWLINE'))) + @Js + def PyJs_anonymous_4149_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'newLine', u'lineContents']) + var.put(u'lineContents', var.get(u'remainingLines').callprop(u'shift')) + var.put(u'newLine', (var.get(u'remainingLines').callprop(u'shift') or Js(u''))) + return (var.get(u'lineContents')+var.get(u'newLine')) + PyJs_anonymous_4149_._set_name(u'anonymous') + var.put(u'shiftNextLine', PyJs_anonymous_4149_) + var.put(u'lastGeneratedLine', Js(1.0)) + var.put(u'lastGeneratedColumn', Js(0.0)) + var.put(u'lastMapping', var.get(u"null")) + @Js + def PyJs_anonymous_4150_(mapping, this, arguments, var=var): + var = Scope({u'this':this, u'mapping':mapping, u'arguments':arguments}, var) + var.registers([u'nextLine', u'code', u'mapping']) + if PyJsStrictNeq(var.get(u'lastMapping'),var.get(u"null")): + if (var.get(u'lastGeneratedLine')Js(0.0)): + if var.get(u'lastMapping'): + var.get(u'addMappingWithCode')(var.get(u'lastMapping'), var.get(u'shiftNextLine')()) + var.get(u'node').callprop(u'add', var.get(u'remainingLines').callprop(u'join', Js(u''))) + @Js + def PyJs_anonymous_4151_(sourceFile, this, arguments, var=var): + var = Scope({u'this':this, u'sourceFile':sourceFile, u'arguments':arguments}, var) + var.registers([u'content', u'sourceFile']) + var.put(u'content', var.get(u'aSourceMapConsumer').callprop(u'sourceContentFor', var.get(u'sourceFile'))) + if (var.get(u'content')!=var.get(u"null")): + if (var.get(u'aRelativePath')!=var.get(u"null")): + var.put(u'sourceFile', var.get(u'util').callprop(u'join', var.get(u'aRelativePath'), var.get(u'sourceFile'))) + var.get(u'node').callprop(u'setSourceContent', var.get(u'sourceFile'), var.get(u'content')) + PyJs_anonymous_4151_._set_name(u'anonymous') + var.get(u'aSourceMapConsumer').get(u'sources').callprop(u'forEach', PyJs_anonymous_4151_) + return var.get(u'node') + pass + PyJs_SourceNode_fromStringWithSourceMap_4148_._set_name(u'SourceNode_fromStringWithSourceMap') + var.get(u'SourceNode').put(u'fromStringWithSourceMap', PyJs_SourceNode_fromStringWithSourceMap_4148_) + @Js + def PyJs_SourceNode_add_4152_(aChunk, this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_add':PyJs_SourceNode_add_4152_, u'arguments':arguments, u'aChunk':aChunk}, var) + var.registers([u'aChunk']) + if var.get(u'Array').callprop(u'isArray', var.get(u'aChunk')): + @Js + def PyJs_anonymous_4153_(chunk, this, arguments, var=var): + var = Scope({u'this':this, u'chunk':chunk, u'arguments':arguments}, var) + var.registers([u'chunk']) + var.get(u"this").callprop(u'add', var.get(u'chunk')) + PyJs_anonymous_4153_._set_name(u'anonymous') + var.get(u'aChunk').callprop(u'forEach', PyJs_anonymous_4153_, var.get(u"this")) + else: + if (var.get(u'aChunk').get(var.get(u'isSourceNode')) or PyJsStrictEq(var.get(u'aChunk',throw=False).typeof(),Js(u'string'))): + if var.get(u'aChunk'): + var.get(u"this").get(u'children').callprop(u'push', var.get(u'aChunk')) + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Expected a SourceNode, string, or an array of SourceNodes and strings. Got ')+var.get(u'aChunk')))) + raise PyJsTempException + return var.get(u"this") + PyJs_SourceNode_add_4152_._set_name(u'SourceNode_add') + var.get(u'SourceNode').get(u'prototype').put(u'add', PyJs_SourceNode_add_4152_) + @Js + def PyJs_SourceNode_prepend_4154_(aChunk, this, arguments, var=var): + var = Scope({u'this':this, u'SourceNode_prepend':PyJs_SourceNode_prepend_4154_, u'arguments':arguments, u'aChunk':aChunk}, var) + var.registers([u'i', u'aChunk']) + if var.get(u'Array').callprop(u'isArray', var.get(u'aChunk')): + #for JS loop + var.put(u'i', (var.get(u'aChunk').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.get(u"this").callprop(u'prepend', var.get(u'aChunk').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + else: + if (var.get(u'aChunk').get(var.get(u'isSourceNode')) or PyJsStrictEq(var.get(u'aChunk',throw=False).typeof(),Js(u'string'))): + var.get(u"this").get(u'children').callprop(u'unshift', var.get(u'aChunk')) + else: + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Expected a SourceNode, string, or an array of SourceNodes and strings. Got ')+var.get(u'aChunk')))) + raise PyJsTempException + return var.get(u"this") + PyJs_SourceNode_prepend_4154_._set_name(u'SourceNode_prepend') + var.get(u'SourceNode').get(u'prototype').put(u'prepend', PyJs_SourceNode_prepend_4154_) + @Js + def PyJs_SourceNode_walk_4155_(aFn, this, arguments, var=var): + var = Scope({u'this':this, u'aFn':aFn, u'arguments':arguments, u'SourceNode_walk':PyJs_SourceNode_walk_4155_}, var) + var.registers([u'i', u'chunk', u'aFn', u'len']) + pass + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u"this").get(u'children').get(u'length')) + while (var.get(u'i')Js(0.0)): + var.put(u'newChildren', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')<(var.get(u'len')-Js(1.0))): + try: + var.get(u'newChildren').callprop(u'push', var.get(u"this").get(u'children').get(var.get(u'i'))) + var.get(u'newChildren').callprop(u'push', var.get(u'aSep')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + var.get(u'newChildren').callprop(u'push', var.get(u"this").get(u'children').get(var.get(u'i'))) + var.get(u"this").put(u'children', var.get(u'newChildren')) + return var.get(u"this") + PyJs_SourceNode_join_4157_._set_name(u'SourceNode_join') + var.get(u'SourceNode').get(u'prototype').put(u'join', PyJs_SourceNode_join_4157_) + @Js + def PyJs_SourceNode_replaceRight_4158_(aPattern, aReplacement, this, arguments, var=var): + var = Scope({u'this':this, u'aPattern':aPattern, u'aReplacement':aReplacement, u'arguments':arguments, u'SourceNode_replaceRight':PyJs_SourceNode_replaceRight_4158_}, var) + var.registers([u'aPattern', u'lastChild', u'aReplacement']) + var.put(u'lastChild', var.get(u"this").get(u'children').get((var.get(u"this").get(u'children').get(u'length')-Js(1.0)))) + if var.get(u'lastChild').get(var.get(u'isSourceNode')): + var.get(u'lastChild').callprop(u'replaceRight', var.get(u'aPattern'), var.get(u'aReplacement')) + else: + if PyJsStrictEq(var.get(u'lastChild',throw=False).typeof(),Js(u'string')): + var.get(u"this").get(u'children').put((var.get(u"this").get(u'children').get(u'length')-Js(1.0)), var.get(u'lastChild').callprop(u'replace', var.get(u'aPattern'), var.get(u'aReplacement'))) + else: + var.get(u"this").get(u'children').callprop(u'push', Js(u'').callprop(u'replace', var.get(u'aPattern'), var.get(u'aReplacement'))) + return var.get(u"this") + PyJs_SourceNode_replaceRight_4158_._set_name(u'SourceNode_replaceRight') + var.get(u'SourceNode').get(u'prototype').put(u'replaceRight', PyJs_SourceNode_replaceRight_4158_) + @Js + def PyJs_SourceNode_setSourceContent_4159_(aSourceFile, aSourceContent, this, arguments, var=var): + var = Scope({u'this':this, u'aSourceContent':aSourceContent, u'aSourceFile':aSourceFile, u'arguments':arguments, u'SourceNode_setSourceContent':PyJs_SourceNode_setSourceContent_4159_}, var) + var.registers([u'aSourceContent', u'aSourceFile']) + var.get(u"this").get(u'sourceContents').put(var.get(u'util').callprop(u'toSetString', var.get(u'aSourceFile')), var.get(u'aSourceContent')) + PyJs_SourceNode_setSourceContent_4159_._set_name(u'SourceNode_setSourceContent') + var.get(u'SourceNode').get(u'prototype').put(u'setSourceContent', PyJs_SourceNode_setSourceContent_4159_) + @Js + def PyJs_SourceNode_walkSourceContents_4160_(aFn, this, arguments, var=var): + var = Scope({u'this':this, u'aFn':aFn, u'arguments':arguments, u'SourceNode_walkSourceContents':PyJs_SourceNode_walkSourceContents_4160_}, var) + var.registers([u'i', u'sources', u'aFn', u'len']) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u"this").get(u'children').get(u'length')) + while (var.get(u'i')=Js(0.0)): + try: + var.put(u'part', var.get(u'parts').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'part'),Js(u'.')): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + else: + if PyJsStrictEq(var.get(u'part'),Js(u'..')): + (var.put(u'up',Js(var.get(u'up').to_number())+Js(1))-Js(1)) + else: + if (var.get(u'up')>Js(0.0)): + if PyJsStrictEq(var.get(u'part'),Js(u'')): + var.get(u'parts').callprop(u'splice', (var.get(u'i')+Js(1.0)), var.get(u'up')) + var.put(u'up', Js(0.0)) + else: + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(2.0)) + (var.put(u'up',Js(var.get(u'up').to_number())-Js(1))+Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + var.put(u'path', var.get(u'parts').callprop(u'join', Js(u'/'))) + if PyJsStrictEq(var.get(u'path'),Js(u'')): + var.put(u'path', (Js(u'/') if var.get(u'isAbsolute') else Js(u'.'))) + if var.get(u'url'): + var.get(u'url').put(u'path', var.get(u'path')) + return var.get(u'urlGenerate')(var.get(u'url')) + return var.get(u'path') + PyJsHoisted_normalize_.func_name = u'normalize' + var.put(u'normalize', PyJsHoisted_normalize_) + @Js + def PyJsHoisted_urlGenerate_(aParsedUrl, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aParsedUrl':aParsedUrl}, var) + var.registers([u'url', u'aParsedUrl']) + var.put(u'url', Js(u'')) + if var.get(u'aParsedUrl').get(u'scheme'): + var.put(u'url', (var.get(u'aParsedUrl').get(u'scheme')+Js(u':')), u'+') + var.put(u'url', Js(u'//'), u'+') + if var.get(u'aParsedUrl').get(u'auth'): + var.put(u'url', (var.get(u'aParsedUrl').get(u'auth')+Js(u'@')), u'+') + if var.get(u'aParsedUrl').get(u'host'): + var.put(u'url', var.get(u'aParsedUrl').get(u'host'), u'+') + if var.get(u'aParsedUrl').get(u'port'): + var.put(u'url', (Js(u':')+var.get(u'aParsedUrl').get(u'port')), u'+') + if var.get(u'aParsedUrl').get(u'path'): + var.put(u'url', var.get(u'aParsedUrl').get(u'path'), u'+') + return var.get(u'url') + PyJsHoisted_urlGenerate_.func_name = u'urlGenerate' + var.put(u'urlGenerate', PyJsHoisted_urlGenerate_) + @Js + def PyJsHoisted_compareByGeneratedPositionsDeflated_(mappingA, mappingB, onlyCompareGenerated, this, arguments, var=var): + var = Scope({u'this':this, u'mappingB':mappingB, u'arguments':arguments, u'onlyCompareGenerated':onlyCompareGenerated, u'mappingA':mappingA}, var) + var.registers([u'mappingA', u'mappingB', u'onlyCompareGenerated', u'cmp']) + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedLine')-var.get(u'mappingB').get(u'generatedLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedColumn')-var.get(u'mappingB').get(u'generatedColumn'))) + if (PyJsStrictNeq(var.get(u'cmp'),Js(0.0)) or var.get(u'onlyCompareGenerated')): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'source')-var.get(u'mappingB').get(u'source'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalLine')-var.get(u'mappingB').get(u'originalLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalColumn')-var.get(u'mappingB').get(u'originalColumn'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + return (var.get(u'mappingA').get(u'name')-var.get(u'mappingB').get(u'name')) + PyJsHoisted_compareByGeneratedPositionsDeflated_.func_name = u'compareByGeneratedPositionsDeflated' + var.put(u'compareByGeneratedPositionsDeflated', PyJsHoisted_compareByGeneratedPositionsDeflated_) + @Js + def PyJsHoisted_join_(aRoot, aPath, this, arguments, var=var): + var = Scope({u'aRoot':aRoot, u'aPath':aPath, u'this':this, u'arguments':arguments}, var) + var.registers([u'aRootUrl', u'aRoot', u'aPath', u'joined', u'aPathUrl']) + if PyJsStrictEq(var.get(u'aRoot'),Js(u'')): + var.put(u'aRoot', Js(u'.')) + if PyJsStrictEq(var.get(u'aPath'),Js(u'')): + var.put(u'aPath', Js(u'.')) + var.put(u'aPathUrl', var.get(u'urlParse')(var.get(u'aPath'))) + var.put(u'aRootUrl', var.get(u'urlParse')(var.get(u'aRoot'))) + if var.get(u'aRootUrl'): + var.put(u'aRoot', (var.get(u'aRootUrl').get(u'path') or Js(u'/'))) + if (var.get(u'aPathUrl') and var.get(u'aPathUrl').get(u'scheme').neg()): + if var.get(u'aRootUrl'): + var.get(u'aPathUrl').put(u'scheme', var.get(u'aRootUrl').get(u'scheme')) + return var.get(u'urlGenerate')(var.get(u'aPathUrl')) + if (var.get(u'aPathUrl') or var.get(u'aPath').callprop(u'match', var.get(u'dataUrlRegexp'))): + return var.get(u'aPath') + if ((var.get(u'aRootUrl') and var.get(u'aRootUrl').get(u'host').neg()) and var.get(u'aRootUrl').get(u'path').neg()): + var.get(u'aRootUrl').put(u'host', var.get(u'aPath')) + return var.get(u'urlGenerate')(var.get(u'aRootUrl')) + var.put(u'joined', (var.get(u'aPath') if PyJsStrictEq(var.get(u'aPath').callprop(u'charAt', Js(0.0)),Js(u'/')) else var.get(u'normalize')(((var.get(u'aRoot').callprop(u'replace', JsRegExp(u'/\\/+$/'), Js(u''))+Js(u'/'))+var.get(u'aPath'))))) + if var.get(u'aRootUrl'): + var.get(u'aRootUrl').put(u'path', var.get(u'joined')) + return var.get(u'urlGenerate')(var.get(u'aRootUrl')) + return var.get(u'joined') + PyJsHoisted_join_.func_name = u'join' + var.put(u'join', PyJsHoisted_join_) + @Js + def PyJsHoisted_relative_(aRoot, aPath, this, arguments, var=var): + var = Scope({u'aRoot':aRoot, u'aPath':aPath, u'this':this, u'arguments':arguments}, var) + var.registers([u'aRoot', u'index', u'aPath', u'level']) + if PyJsStrictEq(var.get(u'aRoot'),Js(u'')): + var.put(u'aRoot', Js(u'.')) + var.put(u'aRoot', var.get(u'aRoot').callprop(u'replace', JsRegExp(u'/\\/$/'), Js(u''))) + var.put(u'level', Js(0.0)) + while PyJsStrictNeq(var.get(u'aPath').callprop(u'indexOf', (var.get(u'aRoot')+Js(u'/'))),Js(0.0)): + var.put(u'index', var.get(u'aRoot').callprop(u'lastIndexOf', Js(u'/'))) + if (var.get(u'index')=Js(0.0)): + try: + if PyJsStrictNeq(var.get(u's').callprop(u'charCodeAt', var.get(u'i')),Js(36.0)): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + return var.get(u'true') + PyJsHoisted_isProtoString_.func_name = u'isProtoString' + var.put(u'isProtoString', PyJsHoisted_isProtoString_) + @Js + def PyJsHoisted_compareByOriginalPositions_(mappingA, mappingB, onlyCompareOriginal, this, arguments, var=var): + var = Scope({u'this':this, u'onlyCompareOriginal':onlyCompareOriginal, u'mappingB':mappingB, u'arguments':arguments, u'mappingA':mappingA}, var) + var.registers([u'onlyCompareOriginal', u'mappingA', u'mappingB', u'cmp']) + var.put(u'cmp', (var.get(u'mappingA').get(u'source')-var.get(u'mappingB').get(u'source'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalLine')-var.get(u'mappingB').get(u'originalLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'originalColumn')-var.get(u'mappingB').get(u'originalColumn'))) + if (PyJsStrictNeq(var.get(u'cmp'),Js(0.0)) or var.get(u'onlyCompareOriginal')): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedColumn')-var.get(u'mappingB').get(u'generatedColumn'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + var.put(u'cmp', (var.get(u'mappingA').get(u'generatedLine')-var.get(u'mappingB').get(u'generatedLine'))) + if PyJsStrictNeq(var.get(u'cmp'),Js(0.0)): + return var.get(u'cmp') + return (var.get(u'mappingA').get(u'name')-var.get(u'mappingB').get(u'name')) + PyJsHoisted_compareByOriginalPositions_.func_name = u'compareByOriginalPositions' + var.put(u'compareByOriginalPositions', PyJsHoisted_compareByOriginalPositions_) + @Js + def PyJsHoisted_strcmp_(aStr1, aStr2, this, arguments, var=var): + var = Scope({u'this':this, u'aStr2':aStr2, u'aStr1':aStr1, u'arguments':arguments}, var) + var.registers([u'aStr2', u'aStr1']) + if PyJsStrictEq(var.get(u'aStr1'),var.get(u'aStr2')): + return Js(0.0) + if (var.get(u'aStr1')>var.get(u'aStr2')): + return Js(1.0) + return (-Js(1.0)) + PyJsHoisted_strcmp_.func_name = u'strcmp' + var.put(u'strcmp', PyJsHoisted_strcmp_) + @Js + def PyJsHoisted_getArg_(aArgs, aName, aDefaultValue, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'aDefaultValue':aDefaultValue, u'aName':aName, u'aArgs':aArgs}, var) + var.registers([u'aDefaultValue', u'aName', u'aArgs']) + if var.get(u'aArgs').contains(var.get(u'aName')): + return var.get(u'aArgs').get(var.get(u'aName')) + else: + if PyJsStrictEq(var.get(u'arguments').get(u'length'),Js(3.0)): + return var.get(u'aDefaultValue') + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(((Js(u'"')+var.get(u'aName'))+Js(u'" is a required argument.')))) + raise PyJsTempException + PyJsHoisted_getArg_.func_name = u'getArg' + var.put(u'getArg', PyJsHoisted_getArg_) + @Js + def PyJsHoisted_toSetString_(aStr, this, arguments, var=var): + var = Scope({u'this':this, u'aStr':aStr, u'arguments':arguments}, var) + var.registers([u'aStr']) + if var.get(u'isProtoString')(var.get(u'aStr')): + return (Js(u'$')+var.get(u'aStr')) + return var.get(u'aStr') + PyJsHoisted_toSetString_.func_name = u'toSetString' + var.put(u'toSetString', PyJsHoisted_toSetString_) + pass + var.get(u'exports').put(u'getArg', var.get(u'getArg')) + var.put(u'urlRegexp', JsRegExp(u'/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/')) + var.put(u'dataUrlRegexp', JsRegExp(u'/^data:.+\\,.+$/')) + pass + var.get(u'exports').put(u'urlParse', var.get(u'urlParse')) + pass + var.get(u'exports').put(u'urlGenerate', var.get(u'urlGenerate')) + pass + var.get(u'exports').put(u'normalize', var.get(u'normalize')) + pass + var.get(u'exports').put(u'join', var.get(u'join')) + @Js + def PyJs_anonymous_4179_(aPath, this, arguments, var=var): + var = Scope({u'this':this, u'aPath':aPath, u'arguments':arguments}, var) + var.registers([u'aPath']) + return (PyJsStrictEq(var.get(u'aPath').callprop(u'charAt', Js(0.0)),Js(u'/')) or var.get(u'aPath').callprop(u'match', var.get(u'urlRegexp')).neg().neg()) + PyJs_anonymous_4179_._set_name(u'anonymous') + var.get(u'exports').put(u'isAbsolute', PyJs_anonymous_4179_) + pass + var.get(u'exports').put(u'relative', var.get(u'relative')) + @Js + def PyJs_anonymous_4180_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'obj']) + var.put(u'obj', var.get(u'Object').callprop(u'create', var.get(u"null"))) + return var.get(u'obj').contains(Js(u'__proto__')).neg() + PyJs_anonymous_4180_._set_name(u'anonymous') + var.put(u'supportsNullProto', PyJs_anonymous_4180_()) + pass + pass + var.get(u'exports').put(u'toSetString', (var.get(u'identity') if var.get(u'supportsNullProto') else var.get(u'toSetString'))) + pass + var.get(u'exports').put(u'fromSetString', (var.get(u'identity') if var.get(u'supportsNullProto') else var.get(u'fromSetString'))) + pass + pass + var.get(u'exports').put(u'compareByOriginalPositions', var.get(u'compareByOriginalPositions')) + pass + var.get(u'exports').put(u'compareByGeneratedPositionsDeflated', var.get(u'compareByGeneratedPositionsDeflated')) + pass + pass + var.get(u'exports').put(u'compareByGeneratedPositionsInflated', var.get(u'compareByGeneratedPositionsInflated')) +PyJs_anonymous_4177_._set_name(u'anonymous') +PyJs_Object_4183_ = Js({}) +@Js +def PyJs_anonymous_4184_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + var.get(u'exports').put(u'SourceMapGenerator', var.get(u'require')(Js(u'./lib/source-map-generator')).get(u'SourceMapGenerator')) + var.get(u'exports').put(u'SourceMapConsumer', var.get(u'require')(Js(u'./lib/source-map-consumer')).get(u'SourceMapConsumer')) + var.get(u'exports').put(u'SourceNode', var.get(u'require')(Js(u'./lib/source-node')).get(u'SourceNode')) +PyJs_anonymous_4184_._set_name(u'anonymous') +PyJs_Object_4185_ = Js({u'./lib/source-map-consumer':Js(515.0),u'./lib/source-map-generator':Js(516.0),u'./lib/source-node':Js(517.0)}) +@Js +def PyJs_anonymous_4186_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'ansiRegex', u'exports', u'module']) + Js(u'use strict') + var.put(u'ansiRegex', var.get(u'require')(Js(u'ansi-regex'))()) + @Js + def PyJs_anonymous_4187_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + return (var.get(u'str').callprop(u'replace', var.get(u'ansiRegex'), Js(u'')) if PyJsStrictEq(var.get(u'str',throw=False).typeof(),Js(u'string')) else var.get(u'str')) + PyJs_anonymous_4187_._set_name(u'anonymous') + var.get(u'module').put(u'exports', PyJs_anonymous_4187_) +PyJs_anonymous_4186_._set_name(u'anonymous') +PyJs_Object_4188_ = Js({u'ansi-regex':Js(2.0)}) +@Js +def PyJs_anonymous_4189_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_4190_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'process', u'hasFlag', u'terminator', u'argv']) + Js(u'use strict') + var.put(u'argv', var.get(u'process').get(u'argv')) + var.put(u'terminator', var.get(u'argv').callprop(u'indexOf', Js(u'--'))) + @Js + def PyJs_anonymous_4191_(flag, this, arguments, var=var): + var = Scope({u'this':this, u'flag':flag, u'arguments':arguments}, var) + var.registers([u'flag', u'pos']) + var.put(u'flag', (Js(u'--')+var.get(u'flag'))) + var.put(u'pos', var.get(u'argv').callprop(u'indexOf', var.get(u'flag'))) + return (PyJsStrictNeq(var.get(u'pos'),(-Js(1.0))) and ((var.get(u'pos')=Js(0.0)): + try: + if (var.get(u'ka').get(var.get(u'i'))!=var.get(u'kb').get(var.get(u'i'))): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + #for JS loop + var.put(u'i', (var.get(u'ka').get(u'length')-Js(1.0))) + while (var.get(u'i')>=Js(0.0)): + try: + var.put(u'key', var.get(u'ka').get(var.get(u'i'))) + if var.get(u'_deepEqual')(var.get(u'a').get(var.get(u'key')), var.get(u'b').get(var.get(u'key'))).neg(): + return Js(False) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + return var.get(u'true') + PyJsHoisted_objEquiv_.func_name = u'objEquiv' + var.put(u'objEquiv', PyJsHoisted_objEquiv_) + @Js + def PyJsHoisted_isArguments_(object, this, arguments, var=var): + var = Scope({u'this':this, u'object':object, u'arguments':arguments}, var) + var.registers([u'object']) + return (var.get(u'Object').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'object'))==Js(u'[object Arguments]')) + PyJsHoisted_isArguments_.func_name = u'isArguments' + var.put(u'isArguments', PyJsHoisted_isArguments_) + var.put(u'util', var.get(u'require')(Js(u'util/'))) + var.put(u'pSlice', var.get(u'Array').get(u'prototype').get(u'slice')) + var.put(u'hasOwn', var.get(u'Object').get(u'prototype').get(u'hasOwnProperty')) + var.put(u'assert', var.get(u'module').put(u'exports', var.get(u'ok'))) + @Js + def PyJs_AssertionError_4200_(options, this, arguments, var=var): + var = Scope({u'this':this, u'AssertionError':PyJs_AssertionError_4200_, u'options':options, u'arguments':arguments}, var) + var.registers([u'next_line', u'err', u'idx', u'stackStartFunction', u'fn_name', u'options', u'out']) + var.get(u"this").put(u'name', Js(u'AssertionError')) + var.get(u"this").put(u'actual', var.get(u'options').get(u'actual')) + var.get(u"this").put(u'expected', var.get(u'options').get(u'expected')) + var.get(u"this").put(u'operator', var.get(u'options').get(u'operator')) + if var.get(u'options').get(u'message'): + var.get(u"this").put(u'message', var.get(u'options').get(u'message')) + var.get(u"this").put(u'generatedMessage', Js(False)) + else: + var.get(u"this").put(u'message', var.get(u'getMessage')(var.get(u"this"))) + var.get(u"this").put(u'generatedMessage', var.get(u'true')) + var.put(u'stackStartFunction', (var.get(u'options').get(u'stackStartFunction') or var.get(u'fail'))) + if var.get(u'Error').get(u'captureStackTrace'): + var.get(u'Error').callprop(u'captureStackTrace', var.get(u"this"), var.get(u'stackStartFunction')) + else: + var.put(u'err', var.get(u'Error').create()) + if var.get(u'err').get(u'stack'): + var.put(u'out', var.get(u'err').get(u'stack')) + var.put(u'fn_name', var.get(u'stackStartFunction').get(u'name')) + var.put(u'idx', var.get(u'out').callprop(u'indexOf', (Js(u'\n')+var.get(u'fn_name')))) + if (var.get(u'idx')>=Js(0.0)): + var.put(u'next_line', var.get(u'out').callprop(u'indexOf', Js(u'\n'), (var.get(u'idx')+Js(1.0)))) + var.put(u'out', var.get(u'out').callprop(u'substring', (var.get(u'next_line')+Js(1.0)))) + var.get(u"this").put(u'stack', var.get(u'out')) + PyJs_AssertionError_4200_._set_name(u'AssertionError') + var.get(u'assert').put(u'AssertionError', PyJs_AssertionError_4200_) + var.get(u'util').callprop(u'inherits', var.get(u'assert').get(u'AssertionError'), var.get(u'Error')) + pass + pass + pass + pass + var.get(u'assert').put(u'fail', var.get(u'fail')) + pass + var.get(u'assert').put(u'ok', var.get(u'ok')) + @Js + def PyJs_equal_4202_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'equal':PyJs_equal_4202_, u'arguments':arguments, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if (var.get(u'actual')!=var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'=='), var.get(u'assert').get(u'equal')) + PyJs_equal_4202_._set_name(u'equal') + var.get(u'assert').put(u'equal', PyJs_equal_4202_) + @Js + def PyJs_notEqual_4203_(actual, expected, message, this, arguments, var=var): + var = Scope({u'notEqual':PyJs_notEqual_4203_, u'actual':actual, u'this':this, u'arguments':arguments, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if (var.get(u'actual')==var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'!='), var.get(u'assert').get(u'notEqual')) + PyJs_notEqual_4203_._set_name(u'notEqual') + var.get(u'assert').put(u'notEqual', PyJs_notEqual_4203_) + @Js + def PyJs_deepEqual_4204_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'arguments':arguments, u'expected':expected, u'message':message, u'deepEqual':PyJs_deepEqual_4204_}, var) + var.registers([u'expected', u'message', u'actual']) + if var.get(u'_deepEqual')(var.get(u'actual'), var.get(u'expected')).neg(): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'deepEqual'), var.get(u'assert').get(u'deepEqual')) + PyJs_deepEqual_4204_._set_name(u'deepEqual') + var.get(u'assert').put(u'deepEqual', PyJs_deepEqual_4204_) + pass + pass + pass + @Js + def PyJs_notDeepEqual_4206_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'notDeepEqual':PyJs_notDeepEqual_4206_, u'arguments':arguments, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if var.get(u'_deepEqual')(var.get(u'actual'), var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'notDeepEqual'), var.get(u'assert').get(u'notDeepEqual')) + PyJs_notDeepEqual_4206_._set_name(u'notDeepEqual') + var.get(u'assert').put(u'notDeepEqual', PyJs_notDeepEqual_4206_) + @Js + def PyJs_strictEqual_4207_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'arguments':arguments, u'expected':expected, u'message':message, u'strictEqual':PyJs_strictEqual_4207_}, var) + var.registers([u'expected', u'message', u'actual']) + if PyJsStrictNeq(var.get(u'actual'),var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'==='), var.get(u'assert').get(u'strictEqual')) + PyJs_strictEqual_4207_._set_name(u'strictEqual') + var.get(u'assert').put(u'strictEqual', PyJs_strictEqual_4207_) + @Js + def PyJs_notStrictEqual_4208_(actual, expected, message, this, arguments, var=var): + var = Scope({u'actual':actual, u'this':this, u'arguments':arguments, u'notStrictEqual':PyJs_notStrictEqual_4208_, u'expected':expected, u'message':message}, var) + var.registers([u'expected', u'message', u'actual']) + if PyJsStrictEq(var.get(u'actual'),var.get(u'expected')): + var.get(u'fail')(var.get(u'actual'), var.get(u'expected'), var.get(u'message'), Js(u'!=='), var.get(u'assert').get(u'notStrictEqual')) + PyJs_notStrictEqual_4208_._set_name(u'notStrictEqual') + var.get(u'assert').put(u'notStrictEqual', PyJs_notStrictEqual_4208_) + pass + pass + @Js + def PyJs_anonymous_4210_(block, error, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'arguments':arguments, u'block':block, u'error':error}, var) + var.registers([u'message', u'block', u'error']) + var.get(u'_throws').callprop(u'apply', var.get(u"this"), Js([var.get(u'true')]).callprop(u'concat', var.get(u'pSlice').callprop(u'call', var.get(u'arguments')))) + PyJs_anonymous_4210_._set_name(u'anonymous') + var.get(u'assert').put(u'throws', PyJs_anonymous_4210_) + @Js + def PyJs_anonymous_4211_(block, message, this, arguments, var=var): + var = Scope({u'this':this, u'message':message, u'arguments':arguments, u'block':block}, var) + var.registers([u'message', u'block']) + var.get(u'_throws').callprop(u'apply', var.get(u"this"), Js([Js(False)]).callprop(u'concat', var.get(u'pSlice').callprop(u'call', var.get(u'arguments')))) + PyJs_anonymous_4211_._set_name(u'anonymous') + var.get(u'assert').put(u'doesNotThrow', PyJs_anonymous_4211_) + @Js + def PyJs_anonymous_4212_(err, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'err':err}, var) + var.registers([u'err']) + if var.get(u'err'): + PyJsTempException = JsToPyException(var.get(u'err')) + raise PyJsTempException + PyJs_anonymous_4212_._set_name(u'anonymous') + var.get(u'assert').put(u'ifError', PyJs_anonymous_4212_) + @Js + def PyJs_anonymous_4213_(obj, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments}, var) + var.registers([u'keys', u'obj', u'key']) + var.put(u'keys', Js([])) + for PyJsTemp in var.get(u'obj'): + var.put(u'key', PyJsTemp) + if var.get(u'hasOwn').callprop(u'call', var.get(u'obj'), var.get(u'key')): + var.get(u'keys').callprop(u'push', var.get(u'key')) + return var.get(u'keys') + PyJs_anonymous_4213_._set_name(u'anonymous') + var.put(u'objectKeys', (var.get(u'Object').get(u'keys') or PyJs_anonymous_4213_)) +PyJs_anonymous_4199_._set_name(u'anonymous') +PyJs_Object_4214_ = Js({u'util/':Js(534.0)}) +@Js +def PyJs_anonymous_4215_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + PyJs_Object_4216_ = Js({}) + @Js + def PyJs_anonymous_4217_(PyJsArg_676c6f62616c_, this, arguments, var=var): + var = Scope({u'this':this, u'global':PyJsArg_676c6f62616c_, u'arguments':arguments}, var) + var.registers([u'binarySlice', u'asciiWrite', u'objectWriteUInt16', u'ieee754', u'fromBuffer', u'base64Write', u'fromObject', u'fromString', u'global', u'fromArrayBuffer', u'fromJsonObject', u'asciiToBytes', u'hexSlice', u'slowToString', u'byteLength', u'checked', u'Buffer', u'base64', u'base64ToBytes', u'kMaxLength', u'writeFloat', u'utf8Slice', u'allocate', u'checkInt', u'objectWriteUInt32', u'INVALID_BASE64_RE', u'toHex', u'isArray', u'fromNumber', u'SlowBuffer', u'hexWrite', u'fromArrayLike', u'checkIEEE754', u'utf16leToBytes', u'ucs2Write', u'base64clean', u'asciiSlice', u'checkOffset', u'decodeCodePointsArray', u'fromArray', u'binaryWrite', u'fromTypedArray', u'rootParent', u'utf16leSlice', u'typedArraySupport', u'utf8Write', u'utf8ToBytes', u'writeDouble', u'MAX_ARGUMENTS_LENGTH', u'blitBuffer', u'base64Slice', u'stringtrim']) + @Js + def PyJsHoisted_binarySlice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'i', u'start', u'end', u'buf', u'ret']) + var.put(u'ret', Js(u'')) + var.put(u'end', var.get(u'Math').callprop(u'min', var.get(u'buf').get(u'length'), var.get(u'end'))) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')var.get(u'len'))): + var.put(u'end', var.get(u'len')) + var.put(u'out', Js(u'')) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')var.get(u"this").get(u'length')): + var.put(u'end', var.get(u"this").get(u'length')) + if (var.get(u'end')<=var.get(u'start')): + return Js(u'') + while var.get(u'true'): + while 1: + SWITCHED = False + CONDITION = (var.get(u'encoding')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + return var.get(u'hexSlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + return var.get(u'utf8Slice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + return var.get(u'asciiSlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + return var.get(u'binarySlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + return var.get(u'base64Slice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return var.get(u'utf16leSlice')(var.get(u"this"), var.get(u'start'), var.get(u'end')) + if True: + SWITCHED = True + if var.get(u'loweredCase'): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Unknown encoding: ')+var.get(u'encoding')))) + raise PyJsTempException + var.put(u'encoding', (var.get(u'encoding')+Js(u'')).callprop(u'toLowerCase')) + var.put(u'loweredCase', var.get(u'true')) + SWITCHED = True + break + PyJsHoisted_slowToString_.func_name = u'slowToString' + var.put(u'slowToString', PyJsHoisted_slowToString_) + @Js + def PyJsHoisted_byteLength_(string, encoding, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'string':string, u'encoding':encoding}, var) + var.registers([u'loweredCase', u'string', u'len', u'encoding']) + if PyJsStrictNeq(var.get(u'string',throw=False).typeof(),Js(u'string')): + var.put(u'string', (Js(u'')+var.get(u'string'))) + var.put(u'len', var.get(u'string').get(u'length')) + if PyJsStrictEq(var.get(u'len'),Js(0.0)): + return Js(0.0) + var.put(u'loweredCase', Js(False)) + #for JS loop + + while 1: + while 1: + SWITCHED = False + CONDITION = (var.get(u'encoding')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'raw')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'raws')): + SWITCHED = True + return var.get(u'len') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + return var.get(u'utf8ToBytes')(var.get(u'string')).get(u'length') + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return (var.get(u'len')*Js(2.0)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + return PyJsBshift(var.get(u'len'),Js(1.0)) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + return var.get(u'base64ToBytes')(var.get(u'string')).get(u'length') + if True: + SWITCHED = True + if var.get(u'loweredCase'): + return var.get(u'utf8ToBytes')(var.get(u'string')).get(u'length') + var.put(u'encoding', (Js(u'')+var.get(u'encoding')).callprop(u'toLowerCase')) + var.put(u'loweredCase', var.get(u'true')) + SWITCHED = True + break + + PyJsHoisted_byteLength_.func_name = u'byteLength' + var.put(u'byteLength', PyJsHoisted_byteLength_) + @Js + def PyJsHoisted_checked_(length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments}, var) + var.registers([u'length']) + if (var.get(u'length')>=var.get(u'kMaxLength')()): + PyJsTempException = JsToPyException(var.get(u'RangeError').create((((Js(u'Attempt to allocate Buffer larger than maximum ')+Js(u'size: 0x'))+var.get(u'kMaxLength')().callprop(u'toString', Js(16.0)))+Js(u' bytes')))) + raise PyJsTempException + return (var.get(u'length')|Js(0.0)) + PyJsHoisted_checked_.func_name = u'checked' + var.put(u'checked', PyJsHoisted_checked_) + @Js + def PyJsHoisted_Buffer_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + if var.get(u"this").instanceof(var.get(u'Buffer')).neg(): + if (var.get(u'arguments').get(u'length')>Js(1.0)): + return var.get(u'Buffer').create(var.get(u'arg'), var.get(u'arguments').get(u'1')) + return var.get(u'Buffer').create(var.get(u'arg')) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + var.get(u"this").put(u'length', Js(0.0)) + var.get(u"this").put(u'parent', var.get(u'undefined')) + if PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'number')): + return var.get(u'fromNumber')(var.get(u"this"), var.get(u'arg')) + if PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'string')): + return var.get(u'fromString')(var.get(u"this"), var.get(u'arg'), (var.get(u'arguments').get(u'1') if (var.get(u'arguments').get(u'length')>Js(1.0)) else Js(u'utf8'))) + return var.get(u'fromObject')(var.get(u"this"), var.get(u'arg')) + PyJsHoisted_Buffer_.func_name = u'Buffer' + var.put(u'Buffer', PyJsHoisted_Buffer_) + @Js + def PyJsHoisted_asciiSlice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'i', u'start', u'end', u'buf', u'ret']) + var.put(u'ret', Js(u'')) + var.put(u'end', var.get(u'Math').callprop(u'min', var.get(u'buf').get(u'length'), var.get(u'end'))) + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')Js(239)) else (Js(3.0) if (var.get(u'firstByte')>Js(223)) else (Js(2.0) if (var.get(u'firstByte')>Js(191)) else Js(1.0))))) + if ((var.get(u'i')+var.get(u'bytesPerSequence'))<=var.get(u'end')): + pass + while 1: + SWITCHED = False + CONDITION = (var.get(u'bytesPerSequence')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(1.0)): + SWITCHED = True + if (var.get(u'firstByte')Js(127)): + var.put(u'codePoint', var.get(u'tempCodePoint')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(3.0)): + SWITCHED = True + var.put(u'secondByte', var.get(u'buf').get((var.get(u'i')+Js(1.0)))) + var.put(u'thirdByte', var.get(u'buf').get((var.get(u'i')+Js(2.0)))) + if (PyJsStrictEq((var.get(u'secondByte')&Js(192)),Js(128)) and PyJsStrictEq((var.get(u'thirdByte')&Js(192)),Js(128))): + var.put(u'tempCodePoint', ((((var.get(u'firstByte')&Js(15))<Js(2047)) and ((var.get(u'tempCodePoint')Js(57343)))): + var.put(u'codePoint', var.get(u'tempCodePoint')) + break + if SWITCHED or PyJsStrictEq(CONDITION, Js(4.0)): + SWITCHED = True + var.put(u'secondByte', var.get(u'buf').get((var.get(u'i')+Js(1.0)))) + var.put(u'thirdByte', var.get(u'buf').get((var.get(u'i')+Js(2.0)))) + var.put(u'fourthByte', var.get(u'buf').get((var.get(u'i')+Js(3.0)))) + if ((PyJsStrictEq((var.get(u'secondByte')&Js(192)),Js(128)) and PyJsStrictEq((var.get(u'thirdByte')&Js(192)),Js(128))) and PyJsStrictEq((var.get(u'fourthByte')&Js(192)),Js(128))): + var.put(u'tempCodePoint', (((((var.get(u'firstByte')&Js(15))<Js(65535)) and (var.get(u'tempCodePoint')Js(65535)): + var.put(u'codePoint', Js(65536), u'-') + var.get(u'res').callprop(u'push', ((PyJsBshift(var.get(u'codePoint'),Js(10.0))&Js(1023))|Js(55296))) + var.put(u'codePoint', (Js(56320)|(var.get(u'codePoint')&Js(1023)))) + var.get(u'res').callprop(u'push', var.get(u'codePoint')) + var.put(u'i', var.get(u'bytesPerSequence'), u'+') + return var.get(u'decodeCodePointsArray')(var.get(u'res')) + PyJsHoisted_utf8Slice_.func_name = u'utf8Slice' + var.put(u'utf8Slice', PyJsHoisted_utf8Slice_) + @Js + def PyJsHoisted_allocate_(that, length, this, arguments, var=var): + var = Scope({u'this':this, u'length':length, u'arguments':arguments, u'that':that}, var) + var.registers([u'fromPool', u'length', u'that']) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.put(u'that', var.get(u'Uint8Array').create(var.get(u'length'))) + var.get(u'that').put(u'__proto__', var.get(u'Buffer').get(u'prototype')) + else: + var.get(u'that').put(u'length', var.get(u'length')) + var.put(u'fromPool', (PyJsStrictNeq(var.get(u'length'),Js(0.0)) and (var.get(u'length')<=PyJsBshift(var.get(u'Buffer').get(u'poolSize'),Js(1.0))))) + if var.get(u'fromPool'): + var.get(u'that').put(u'parent', var.get(u'rootParent')) + return var.get(u'that') + PyJsHoisted_allocate_.func_name = u'allocate' + var.put(u'allocate', PyJsHoisted_allocate_) + @Js + def PyJsHoisted_checkInt_(buf, value, offset, ext, max, min, this, arguments, var=var): + var = Scope({u'min':min, u'this':this, u'max':max, u'value':value, u'ext':ext, u'arguments':arguments, u'offset':offset, u'buf':buf}, var) + var.registers([u'min', u'max', u'value', u'ext', u'offset', u'buf']) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'buf')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'buffer must be a Buffer instance'))) + raise PyJsTempException + if ((var.get(u'value')>var.get(u'max')) or (var.get(u'value')var.get(u'buf').get(u'length')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'index out of range'))) + raise PyJsTempException + PyJsHoisted_checkInt_.func_name = u'checkInt' + var.put(u'checkInt', PyJsHoisted_checkInt_) + @Js + def PyJsHoisted_objectWriteUInt32_(buf, value, offset, littleEndian, this, arguments, var=var): + var = Scope({u'arguments':arguments, u'offset':offset, u'this':this, u'littleEndian':littleEndian, u'buf':buf, u'value':value}, var) + var.registers([u'i', u'j', u'value', u'offset', u'littleEndian', u'buf']) + if (var.get(u'value')var.get(u'remaining')): + var.put(u'length', var.get(u'remaining')) + var.put(u'strLen', var.get(u'string').get(u'length')) + if PyJsStrictNeq((var.get(u'strLen')%Js(2.0)),Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid hex string'))) + raise PyJsTempException + if (var.get(u'length')>(var.get(u'strLen')/Js(2.0))): + var.put(u'length', (var.get(u'strLen')/Js(2.0))) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')var.get(u'buf').get(u'length')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'index out of range'))) + raise PyJsTempException + if (var.get(u'offset')>Js(8.0))) + var.put(u'lo', (var.get(u'c')%Js(256.0))) + var.get(u'byteArray').callprop(u'push', var.get(u'lo')) + var.get(u'byteArray').callprop(u'push', var.get(u'hi')) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'byteArray') + PyJsHoisted_utf16leToBytes_.func_name = u'utf16leToBytes' + var.put(u'utf16leToBytes', PyJsHoisted_utf16leToBytes_) + @Js + def PyJsHoisted_ucs2Write_(buf, string, offset, length, this, arguments, var=var): + var = Scope({u'length':length, u'string':string, u'offset':offset, u'this':this, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'length', u'buf', u'string', u'offset']) + return var.get(u'blitBuffer')(var.get(u'utf16leToBytes')(var.get(u'string'), (var.get(u'buf').get(u'length')-var.get(u'offset'))), var.get(u'buf'), var.get(u'offset'), var.get(u'length')) + PyJsHoisted_ucs2Write_.func_name = u'ucs2Write' + var.put(u'ucs2Write', PyJsHoisted_ucs2Write_) + @Js + def PyJsHoisted_base64clean_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + var.put(u'str', var.get(u'stringtrim')(var.get(u'str')).callprop(u'replace', var.get(u'INVALID_BASE64_RE'), Js(u''))) + if (var.get(u'str').get(u'length')var.get(u'length')): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'Trying to access beyond buffer length'))) + raise PyJsTempException + PyJsHoisted_checkOffset_.func_name = u'checkOffset' + var.put(u'checkOffset', PyJsHoisted_checkOffset_) + @Js + def PyJsHoisted_decodeCodePointsArray_(codePoints, this, arguments, var=var): + var = Scope({u'codePoints':codePoints, u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'res', u'len', u'codePoints']) + var.put(u'len', var.get(u'codePoints').get(u'length')) + if (var.get(u'len')<=var.get(u'MAX_ARGUMENTS_LENGTH')): + return var.get(u'String').get(u'fromCharCode').callprop(u'apply', var.get(u'String'), var.get(u'codePoints')) + var.put(u'res', Js(u'')) + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(55295)) and (var.get(u'codePoint')Js(56319)): + if (var.put(u'units', Js(3.0), u'-')>(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + continue + else: + if PyJsStrictEq((var.get(u'i')+Js(1.0)),var.get(u'length')): + if (var.put(u'units', Js(3.0), u'-')>(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + continue + var.put(u'leadSurrogate', var.get(u'codePoint')) + continue + if (var.get(u'codePoint')(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + var.put(u'leadSurrogate', var.get(u'codePoint')) + continue + var.put(u'codePoint', ((((var.get(u'leadSurrogate')-Js(55296))<(-Js(1.0))): + var.get(u'bytes').callprop(u'push', Js(239), Js(191), Js(189)) + var.put(u'leadSurrogate', var.get(u"null")) + if (var.get(u'codePoint')>Js(6))|Js(192)), ((var.get(u'codePoint')&Js(63))|Js(128))) + else: + if (var.get(u'codePoint')>Js(12))|Js(224)), (((var.get(u'codePoint')>>Js(6))&Js(63))|Js(128)), ((var.get(u'codePoint')&Js(63))|Js(128))) + else: + if (var.get(u'codePoint')>Js(18))|Js(240)), (((var.get(u'codePoint')>>Js(12))&Js(63))|Js(128)), (((var.get(u'codePoint')>>Js(6))&Js(63))|Js(128)), ((var.get(u'codePoint')&Js(63))|Js(128))) + else: + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid code point'))) + raise PyJsTempException + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'bytes') + PyJsHoisted_utf8ToBytes_.func_name = u'utf8ToBytes' + var.put(u'utf8ToBytes', PyJsHoisted_utf8ToBytes_) + @Js + def PyJsHoisted_writeDouble_(buf, value, offset, littleEndian, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'littleEndian':littleEndian, u'buf':buf, u'value':value}, var) + var.registers([u'littleEndian', u'noAssert', u'buf', u'value', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkIEEE754')(var.get(u'buf'), var.get(u'value'), var.get(u'offset'), Js(8.0), Js(1.7976931348623157e+308), (-Js(1.7976931348623157e+308))) + var.get(u'ieee754').callprop(u'write', var.get(u'buf'), var.get(u'value'), var.get(u'offset'), var.get(u'littleEndian'), Js(52.0), Js(8.0)) + return (var.get(u'offset')+Js(8.0)) + PyJsHoisted_writeDouble_.func_name = u'writeDouble' + var.put(u'writeDouble', PyJsHoisted_writeDouble_) + @Js + def PyJsHoisted_blitBuffer_(src, dst, offset, length, this, arguments, var=var): + var = Scope({u'src':src, u'length':length, u'arguments':arguments, u'offset':offset, u'this':this, u'dst':dst}, var) + var.registers([u'i', u'src', u'dst', u'length', u'offset']) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=var.get(u'dst').get(u'length')) or (var.get(u'i')>=var.get(u'src').get(u'length'))): + break + var.get(u'dst').put((var.get(u'i')+var.get(u'offset')), var.get(u'src').get(var.get(u'i'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)) + return var.get(u'i') + PyJsHoisted_blitBuffer_.func_name = u'blitBuffer' + var.put(u'blitBuffer', PyJsHoisted_blitBuffer_) + @Js + def PyJsHoisted_base64Slice_(buf, start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'end':end, u'buf':buf, u'arguments':arguments}, var) + var.registers([u'start', u'end', u'buf']) + if (PyJsStrictEq(var.get(u'start'),Js(0.0)) and PyJsStrictEq(var.get(u'end'),var.get(u'buf').get(u'length'))): + return var.get(u'base64').callprop(u'fromByteArray', var.get(u'buf')) + else: + return var.get(u'base64').callprop(u'fromByteArray', var.get(u'buf').callprop(u'slice', var.get(u'start'), var.get(u'end'))) + PyJsHoisted_base64Slice_.func_name = u'base64Slice' + var.put(u'base64Slice', PyJsHoisted_base64Slice_) + @Js + def PyJsHoisted_stringtrim_(str, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'str':str}, var) + var.registers([u'str']) + if var.get(u'str').get(u'trim'): + return var.get(u'str').callprop(u'trim') + return var.get(u'str').callprop(u'replace', JsRegExp(u'/^\\s+|\\s+$/g'), Js(u'')) + PyJsHoisted_stringtrim_.func_name = u'stringtrim' + var.put(u'stringtrim', PyJsHoisted_stringtrim_) + Js(u'use strict') + var.put(u'base64', var.get(u'require')(Js(u'base64-js'))) + var.put(u'ieee754', var.get(u'require')(Js(u'ieee754'))) + var.put(u'isArray', var.get(u'require')(Js(u'isarray'))) + var.get(u'exports').put(u'Buffer', var.get(u'Buffer')) + var.get(u'exports').put(u'SlowBuffer', var.get(u'SlowBuffer')) + var.get(u'exports').put(u'INSPECT_MAX_BYTES', Js(50.0)) + var.get(u'Buffer').put(u'poolSize', Js(8192.0)) + PyJs_Object_4218_ = Js({}) + var.put(u'rootParent', PyJs_Object_4218_) + var.get(u'Buffer').put(u'TYPED_ARRAY_SUPPORT', (var.get(u'global').get(u'TYPED_ARRAY_SUPPORT') if PyJsStrictNeq(var.get(u'global').get(u'TYPED_ARRAY_SUPPORT'),var.get(u'undefined')) else var.get(u'typedArraySupport')())) + pass + pass + pass + @Js + def PyJs_anonymous_4220_(arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'arguments':arguments}, var) + var.registers([u'arr']) + var.get(u'arr').put(u'__proto__', var.get(u'Buffer').get(u'prototype')) + return var.get(u'arr') + PyJs_anonymous_4220_._set_name(u'anonymous') + var.get(u'Buffer').put(u'_augment', PyJs_anonymous_4220_) + pass + pass + pass + pass + pass + pass + pass + pass + pass + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u'Buffer').get(u'prototype').put(u'__proto__', var.get(u'Uint8Array').get(u'prototype')) + var.get(u'Buffer').put(u'__proto__', var.get(u'Uint8Array')) + if ((PyJsStrictNeq(var.get(u'Symbol',throw=False).typeof(),Js(u'undefined')) and var.get(u'Symbol').get(u'species')) and PyJsStrictEq(var.get(u'Buffer').get(var.get(u'Symbol').get(u'species')),var.get(u'Buffer'))): + PyJs_Object_4221_ = Js({u'value':var.get(u"null"),u'configurable':var.get(u'true')}) + var.get(u'Object').callprop(u'defineProperty', var.get(u'Buffer'), var.get(u'Symbol').get(u'species'), PyJs_Object_4221_) + else: + var.get(u'Buffer').get(u'prototype').put(u'length', var.get(u'undefined')) + var.get(u'Buffer').get(u'prototype').put(u'parent', var.get(u'undefined')) + pass + pass + pass + @Js + def PyJs_isBuffer_4222_(b, this, arguments, var=var): + var = Scope({u'this':this, u'b':b, u'arguments':arguments, u'isBuffer':PyJs_isBuffer_4222_}, var) + var.registers([u'b']) + return ((var.get(u'b')!=var.get(u"null")) and var.get(u'b').get(u'_isBuffer')).neg().neg() + PyJs_isBuffer_4222_._set_name(u'isBuffer') + var.get(u'Buffer').put(u'isBuffer', PyJs_isBuffer_4222_) + @Js + def PyJs_compare_4223_(a, b, this, arguments, var=var): + var = Scope({u'a':a, u'this':this, u'compare':PyJs_compare_4223_, u'b':b, u'arguments':arguments}, var) + var.registers([u'a', u'b', u'i', u'len', u'y', u'x']) + if (var.get(u'Buffer').callprop(u'isBuffer', var.get(u'a')).neg() or var.get(u'Buffer').callprop(u'isBuffer', var.get(u'b')).neg()): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Arguments must be Buffers'))) + raise PyJsTempException + if PyJsStrictEq(var.get(u'a'),var.get(u'b')): + return Js(0.0) + var.put(u'x', var.get(u'a').get(u'length')) + var.put(u'y', var.get(u'b').get(u'length')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'Math').callprop(u'min', var.get(u'x'), var.get(u'y'))) + while (var.get(u'i')Js(0.0)): + var.put(u'str', var.get(u"this").callprop(u'toString', Js(u'hex'), Js(0.0), var.get(u'max')).callprop(u'match', JsRegExp(u'/.{2}/g')).callprop(u'join', Js(u' '))) + if (var.get(u"this").get(u'length')>var.get(u'max')): + var.put(u'str', Js(u' ... '), u'+') + return ((Js(u'')) + PyJs_inspect_4228_._set_name(u'inspect') + var.get(u'Buffer').get(u'prototype').put(u'inspect', PyJs_inspect_4228_) + @Js + def PyJs_compare_4229_(b, this, arguments, var=var): + var = Scope({u'this':this, u'compare':PyJs_compare_4229_, u'b':b, u'arguments':arguments}, var) + var.registers([u'b']) + if var.get(u'Buffer').callprop(u'isBuffer', var.get(u'b')).neg(): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Argument must be a Buffer'))) + raise PyJsTempException + return var.get(u'Buffer').callprop(u'compare', var.get(u"this"), var.get(u'b')) + PyJs_compare_4229_._set_name(u'compare') + var.get(u'Buffer').get(u'prototype').put(u'compare', PyJs_compare_4229_) + @Js + def PyJs_indexOf_4230_(val, byteOffset, this, arguments, var=var): + var = Scope({u'this':this, u'indexOf':PyJs_indexOf_4230_, u'byteOffset':byteOffset, u'val':val, u'arguments':arguments}, var) + var.registers([u'val', u'arrayIndexOf', u'byteOffset']) + @Js + def PyJsHoisted_arrayIndexOf_(arr, val, byteOffset, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'byteOffset':byteOffset, u'val':val, u'arguments':arguments}, var) + var.registers([u'i', u'foundIndex', u'arr', u'val', u'byteOffset']) + var.put(u'foundIndex', (-Js(1.0))) + #for JS loop + var.put(u'i', Js(0.0)) + while ((var.get(u'byteOffset')+var.get(u'i'))Js(2147483647)): + var.put(u'byteOffset', Js(2147483647)) + else: + if (var.get(u'byteOffset')<(-Js(2147483648))): + var.put(u'byteOffset', (-Js(2147483648))) + var.put(u'byteOffset', Js(0.0), u'>>') + if PyJsStrictEq(var.get(u"this").get(u'length'),Js(0.0)): + return (-Js(1.0)) + if (var.get(u'byteOffset')>=var.get(u"this").get(u'length')): + return (-Js(1.0)) + if (var.get(u'byteOffset')var.get(u'remaining'))): + var.put(u'length', var.get(u'remaining')) + if (((var.get(u'string').get(u'length')>Js(0.0)) and ((var.get(u'length')var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'attempt to write outside buffer bounds'))) + raise PyJsTempException + if var.get(u'encoding').neg(): + var.put(u'encoding', Js(u'utf8')) + var.put(u'loweredCase', Js(False)) + #for JS loop + + while 1: + while 1: + SWITCHED = False + CONDITION = (var.get(u'encoding')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'hex')): + SWITCHED = True + return var.get(u'hexWrite')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf8')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-8')): + SWITCHED = True + return var.get(u'utf8Write')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ascii')): + SWITCHED = True + return var.get(u'asciiWrite')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'binary')): + SWITCHED = True + return var.get(u'binaryWrite')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'base64')): + SWITCHED = True + return var.get(u'base64Write')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'ucs-2')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf16le')): + SWITCHED = True + pass + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'utf-16le')): + SWITCHED = True + return var.get(u'ucs2Write')(var.get(u"this"), var.get(u'string'), var.get(u'offset'), var.get(u'length')) + if True: + SWITCHED = True + if var.get(u'loweredCase'): + PyJsTempException = JsToPyException(var.get(u'TypeError').create((Js(u'Unknown encoding: ')+var.get(u'encoding')))) + raise PyJsTempException + var.put(u'encoding', (Js(u'')+var.get(u'encoding')).callprop(u'toLowerCase')) + var.put(u'loweredCase', var.get(u'true')) + SWITCHED = True + break + + PyJs_write_4231_._set_name(u'write') + var.get(u'Buffer').get(u'prototype').put(u'write', PyJs_write_4231_) + @Js + def PyJs_toJSON_4232_(this, arguments, var=var): + var = Scope({u'this':this, u'toJSON':PyJs_toJSON_4232_, u'arguments':arguments}, var) + var.registers([]) + PyJs_Object_4233_ = Js({u'type':Js(u'Buffer'),u'data':var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', (var.get(u"this").get(u'_arr') or var.get(u"this")), Js(0.0))}) + return PyJs_Object_4233_ + PyJs_toJSON_4232_._set_name(u'toJSON') + var.get(u'Buffer').get(u'prototype').put(u'toJSON', PyJs_toJSON_4232_) + pass + pass + var.put(u'MAX_ARGUMENTS_LENGTH', Js(4096)) + pass + pass + pass + pass + pass + @Js + def PyJs_slice_4234_(start, end, this, arguments, var=var): + var = Scope({u'this':this, u'start':start, u'slice':PyJs_slice_4234_, u'end':end, u'arguments':arguments}, var) + var.registers([u'end', u'i', u'len', u'start', u'newBuf', u'sliceLen']) + var.put(u'len', var.get(u"this").get(u'length')) + var.put(u'start', (~(~var.get(u'start')))) + var.put(u'end', (var.get(u'len') if PyJsStrictEq(var.get(u'end'),var.get(u'undefined')) else (~(~var.get(u'end'))))) + if (var.get(u'start')var.get(u'len')): + var.put(u'start', var.get(u'len')) + if (var.get(u'end')var.get(u'len')): + var.put(u'end', var.get(u'len')) + if (var.get(u'end')Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+var.put(u'byteLength',Js(var.get(u'byteLength').to_number())-Js(1))))*var.get(u'mul')), u'+') + return var.get(u'val') + PyJs_readUIntBE_4236_._set_name(u'readUIntBE') + var.get(u'Buffer').get(u'prototype').put(u'readUIntBE', PyJs_readUIntBE_4236_) + @Js + def PyJs_readUInt8_4237_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'arguments':arguments, u'readUInt8':PyJs_readUInt8_4237_, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(1.0), var.get(u"this").get(u'length')) + return var.get(u"this").get(var.get(u'offset')) + PyJs_readUInt8_4237_._set_name(u'readUInt8') + var.get(u'Buffer').get(u'prototype').put(u'readUInt8', PyJs_readUInt8_4237_) + @Js + def PyJs_readUInt16LE_4238_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'readUInt16LE':PyJs_readUInt16LE_4238_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(2.0), var.get(u"this").get(u'length')) + return (var.get(u"this").get(var.get(u'offset'))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<=var.get(u'mul')): + var.put(u'val', var.get(u'Math').callprop(u'pow', Js(2.0), (Js(8.0)*var.get(u'byteLength'))), u'-') + return var.get(u'val') + PyJs_readIntLE_4242_._set_name(u'readIntLE') + var.get(u'Buffer').get(u'prototype').put(u'readIntLE', PyJs_readIntLE_4242_) + @Js + def PyJs_readIntBE_4243_(offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'readIntBE':PyJs_readIntBE_4243_, u'noAssert':noAssert, u'this':this, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'byteLength', u'noAssert', u'val', u'i', u'offset', u'mul']) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + var.put(u'byteLength', (var.get(u'byteLength')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), var.get(u'byteLength'), var.get(u"this").get(u'length')) + var.put(u'i', var.get(u'byteLength')) + var.put(u'mul', Js(1.0)) + var.put(u'val', var.get(u"this").get((var.get(u'offset')+var.put(u'i',Js(var.get(u'i').to_number())-Js(1))))) + while ((var.get(u'i')>Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.put(u'val', (var.get(u"this").get((var.get(u'offset')+var.put(u'i',Js(var.get(u'i').to_number())-Js(1))))*var.get(u'mul')), u'+') + var.put(u'mul', Js(128), u'*') + if (var.get(u'val')>=var.get(u'mul')): + var.put(u'val', var.get(u'Math').callprop(u'pow', Js(2.0), (Js(8.0)*var.get(u'byteLength'))), u'-') + return var.get(u'val') + PyJs_readIntBE_4243_._set_name(u'readIntBE') + var.get(u'Buffer').get(u'prototype').put(u'readIntBE', PyJs_readIntBE_4243_) + @Js + def PyJs_readInt8_4244_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'noAssert':noAssert, u'readInt8':PyJs_readInt8_4244_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(1.0), var.get(u"this").get(u'length')) + if (var.get(u"this").get(var.get(u'offset'))&Js(128)).neg(): + return var.get(u"this").get(var.get(u'offset')) + return (((Js(255)-var.get(u"this").get(var.get(u'offset')))+Js(1.0))*(-Js(1.0))) + PyJs_readInt8_4244_._set_name(u'readInt8') + var.get(u'Buffer').get(u'prototype').put(u'readInt8', PyJs_readInt8_4244_) + @Js + def PyJs_readInt16LE_4245_(offset, noAssert, this, arguments, var=var): + var = Scope({u'this':this, u'readInt16LE':PyJs_readInt16LE_4245_, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'val', u'offset']) + if var.get(u'noAssert').neg(): + var.get(u'checkOffset')(var.get(u'offset'), Js(2.0), var.get(u"this").get(u'length')) + var.put(u'val', (var.get(u"this").get(var.get(u'offset'))|(var.get(u"this").get((var.get(u'offset')+Js(1.0)))<=Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), ((var.get(u'value')/var.get(u'mul'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeUIntBE_4254_._set_name(u'writeUIntBE') + var.get(u'Buffer').get(u'prototype').put(u'writeUIntBE', PyJs_writeUIntBE_4254_) + @Js + def PyJs_writeUInt8_4255_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'writeUInt8':PyJs_writeUInt8_4255_, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(1.0), Js(255), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + var.put(u'value', var.get(u'Math').callprop(u'floor', var.get(u'value'))) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + return (var.get(u'offset')+Js(1.0)) + PyJs_writeUInt8_4255_._set_name(u'writeUInt8') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt8', PyJs_writeUInt8_4255_) + pass + @Js + def PyJs_writeUInt16LE_4256_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'writeUInt16LE':PyJs_writeUInt16LE_4256_, u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(2.0), Js(65535), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + else: + var.get(u'objectWriteUInt16')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true')) + return (var.get(u'offset')+Js(2.0)) + PyJs_writeUInt16LE_4256_._set_name(u'writeUInt16LE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt16LE', PyJs_writeUInt16LE_4256_) + @Js + def PyJs_writeUInt16BE_4257_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'writeUInt16BE':PyJs_writeUInt16BE_4257_, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(2.0), Js(65535), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt16')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False)) + return (var.get(u'offset')+Js(2.0)) + PyJs_writeUInt16BE_4257_._set_name(u'writeUInt16BE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt16BE', PyJs_writeUInt16BE_4257_) + pass + @Js + def PyJs_writeUInt32LE_4258_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'writeUInt32LE':PyJs_writeUInt32LE_4258_, u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(4294967295), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put((var.get(u'offset')+Js(3.0)), PyJsBshift(var.get(u'value'),Js(24.0))) + var.get(u"this").put((var.get(u'offset')+Js(2.0)), PyJsBshift(var.get(u'value'),Js(16.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put(var.get(u'offset'), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt32')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'true')) + return (var.get(u'offset')+Js(4.0)) + PyJs_writeUInt32LE_4258_._set_name(u'writeUInt32LE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt32LE', PyJs_writeUInt32LE_4258_) + @Js + def PyJs_writeUInt32BE_4259_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'noAssert':noAssert, u'this':this, u'value':value, u'writeUInt32BE':PyJs_writeUInt32BE_4259_, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(4.0), Js(4294967295), Js(0.0)) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT'): + var.get(u"this").put(var.get(u'offset'), PyJsBshift(var.get(u'value'),Js(24.0))) + var.get(u"this").put((var.get(u'offset')+Js(1.0)), PyJsBshift(var.get(u'value'),Js(16.0))) + var.get(u"this").put((var.get(u'offset')+Js(2.0)), PyJsBshift(var.get(u'value'),Js(8.0))) + var.get(u"this").put((var.get(u'offset')+Js(3.0)), (var.get(u'value')&Js(255))) + else: + var.get(u'objectWriteUInt32')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(False)) + return (var.get(u'offset')+Js(4.0)) + PyJs_writeUInt32BE_4259_._set_name(u'writeUInt32BE') + var.get(u'Buffer').get(u'prototype').put(u'writeUInt32BE', PyJs_writeUInt32BE_4259_) + @Js + def PyJs_writeIntLE_4260_(value, offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'writeIntLE':PyJs_writeIntLE_4260_, u'value':value}, var) + var.registers([u'byteLength', u'noAssert', u'sub', u'i', u'value', u'limit', u'offset', u'mul']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.put(u'limit', var.get(u'Math').callprop(u'pow', Js(2.0), ((Js(8.0)*var.get(u'byteLength'))-Js(1.0)))) + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'byteLength'), (var.get(u'limit')-Js(1.0)), (-var.get(u'limit'))) + var.put(u'i', Js(0.0)) + var.put(u'mul', Js(1.0)) + var.put(u'sub', (Js(1.0) if (var.get(u'value')>Js(0.0))-var.get(u'sub'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeIntLE_4260_._set_name(u'writeIntLE') + var.get(u'Buffer').get(u'prototype').put(u'writeIntLE', PyJs_writeIntLE_4260_) + @Js + def PyJs_writeIntBE_4261_(value, offset, byteLength, noAssert, this, arguments, var=var): + var = Scope({u'byteLength':byteLength, u'noAssert':noAssert, u'arguments':arguments, u'offset':offset, u'this':this, u'writeIntBE':PyJs_writeIntBE_4261_, u'value':value}, var) + var.registers([u'byteLength', u'noAssert', u'sub', u'i', u'value', u'limit', u'offset', u'mul']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.put(u'limit', var.get(u'Math').callprop(u'pow', Js(2.0), ((Js(8.0)*var.get(u'byteLength'))-Js(1.0)))) + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), var.get(u'byteLength'), (var.get(u'limit')-Js(1.0)), (-var.get(u'limit'))) + var.put(u'i', (var.get(u'byteLength')-Js(1.0))) + var.put(u'mul', Js(1.0)) + var.put(u'sub', (Js(1.0) if (var.get(u'value')=Js(0.0)) and var.put(u'mul', Js(256), u'*')): + var.get(u"this").put((var.get(u'offset')+var.get(u'i')), ((((var.get(u'value')/var.get(u'mul'))>>Js(0.0))-var.get(u'sub'))&Js(255))) + return (var.get(u'offset')+var.get(u'byteLength')) + PyJs_writeIntBE_4261_._set_name(u'writeIntBE') + var.get(u'Buffer').get(u'prototype').put(u'writeIntBE', PyJs_writeIntBE_4261_) + @Js + def PyJs_writeInt8_4262_(value, offset, noAssert, this, arguments, var=var): + var = Scope({u'writeInt8':PyJs_writeInt8_4262_, u'noAssert':noAssert, u'this':this, u'value':value, u'arguments':arguments, u'offset':offset}, var) + var.registers([u'noAssert', u'value', u'offset']) + var.put(u'value', (+var.get(u'value'))) + var.put(u'offset', (var.get(u'offset')|Js(0.0))) + if var.get(u'noAssert').neg(): + var.get(u'checkInt')(var.get(u"this"), var.get(u'value'), var.get(u'offset'), Js(1.0), Js(127), (-Js(128))) + if var.get(u'Buffer').get(u'TYPED_ARRAY_SUPPORT').neg(): + var.put(u'value', var.get(u'Math').callprop(u'floor', var.get(u'value'))) + if (var.get(u'value')=var.get(u'target').get(u'length')): + var.put(u'targetStart', var.get(u'target').get(u'length')) + if var.get(u'targetStart').neg(): + var.put(u'targetStart', Js(0.0)) + if ((var.get(u'end')>Js(0.0)) and (var.get(u'end')=var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'sourceStart out of bounds'))) + raise PyJsTempException + if (var.get(u'end')var.get(u"this").get(u'length')): + var.put(u'end', var.get(u"this").get(u'length')) + if ((var.get(u'target').get(u'length')-var.get(u'targetStart'))<(var.get(u'end')-var.get(u'start'))): + var.put(u'end', ((var.get(u'target').get(u'length')-var.get(u'targetStart'))+var.get(u'start'))) + var.put(u'len', (var.get(u'end')-var.get(u'start'))) + pass + if ((PyJsStrictEq(var.get(u"this"),var.get(u'target')) and (var.get(u'start')=Js(0.0)): + try: + var.get(u'target').put((var.get(u'i')+var.get(u'targetStart')), var.get(u"this").get((var.get(u'i')+var.get(u'start')))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + else: + if ((var.get(u'len')=var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'start out of bounds'))) + raise PyJsTempException + if ((var.get(u'end')var.get(u"this").get(u'length'))): + PyJsTempException = JsToPyException(var.get(u'RangeError').create(Js(u'end out of bounds'))) + raise PyJsTempException + pass + if PyJsStrictEq(var.get(u'value',throw=False).typeof(),Js(u'number')): + #for JS loop + var.put(u'i', var.get(u'start')) + while (var.get(u'i')>Js(18.0))&Js(63)))+var.get(u'lookup').get(((var.get(u'num')>>Js(12.0))&Js(63))))+var.get(u'lookup').get(((var.get(u'num')>>Js(6.0))&Js(63))))+var.get(u'lookup').get((var.get(u'num')&Js(63)))) + PyJsHoisted_tripletToBase64_.func_name = u'tripletToBase64' + var.put(u'tripletToBase64', PyJsHoisted_tripletToBase64_) + @Js + def PyJsHoisted_init_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'code', u'len']) + var.put(u'code', Js(u'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len', var.get(u'code').get(u'length')) + while (var.get(u'i')Js(0.0)): + PyJsTempException = JsToPyException(var.get(u'Error').create(Js(u'Invalid string. Length must be a multiple of 4'))) + raise PyJsTempException + var.put(u'placeHolders', (Js(2.0) if PyJsStrictEq(var.get(u'b64').get((var.get(u'len')-Js(2.0))),Js(u'=')) else (Js(1.0) if PyJsStrictEq(var.get(u'b64').get((var.get(u'len')-Js(1.0))),Js(u'=')) else Js(0.0)))) + var.put(u'arr', var.get(u'Arr').create((((var.get(u'len')*Js(3.0))/Js(4.0))-var.get(u'placeHolders')))) + var.put(u'l', ((var.get(u'len')-Js(4.0)) if (var.get(u'placeHolders')>Js(0.0)) else var.get(u'len'))) + var.put(u'L', Js(0.0)) + #for JS loop + PyJsComma(var.put(u'i', Js(0.0)),var.put(u'j', Js(0.0))) + while (var.get(u'i')>Js(16.0))&Js(255))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), ((var.get(u'tmp')>>Js(8.0))&Js(255))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), (var.get(u'tmp')&Js(255))) + finally: + PyJsComma(var.put(u'i', Js(4.0), u'+'),var.put(u'j', Js(3.0), u'+')) + if PyJsStrictEq(var.get(u'placeHolders'),Js(2.0)): + var.put(u'tmp', ((var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', var.get(u'i')))<>Js(4.0)))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), (var.get(u'tmp')&Js(255))) + else: + if PyJsStrictEq(var.get(u'placeHolders'),Js(1.0)): + var.put(u'tmp', (((var.get(u'revLookup').get(var.get(u'b64').callprop(u'charCodeAt', var.get(u'i')))<>Js(2.0)))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), ((var.get(u'tmp')>>Js(8.0))&Js(255))) + var.get(u'arr').put((var.put(u'L',Js(var.get(u'L').to_number())+Js(1))-Js(1)), (var.get(u'tmp')&Js(255))) + return var.get(u'arr') + PyJsHoisted_toByteArray_.func_name = u'toByteArray' + var.put(u'toByteArray', PyJsHoisted_toByteArray_) + @Js + def PyJsHoisted_fromByteArray_(uint8, this, arguments, var=var): + var = Scope({u'this':this, u'uint8':uint8, u'arguments':arguments}, var) + var.registers([u'tmp', u'i', u'uint8', u'len', u'len2', u'parts', u'extraBytes', u'output', u'maxChunkLength']) + pass + var.put(u'len', var.get(u'uint8').get(u'length')) + var.put(u'extraBytes', (var.get(u'len')%Js(3.0))) + var.put(u'output', Js(u'')) + var.put(u'parts', Js([])) + var.put(u'maxChunkLength', Js(16383.0)) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'len2', (var.get(u'len')-var.get(u'extraBytes'))) + while (var.get(u'i')var.get(u'len2')) else (var.get(u'i')+var.get(u'maxChunkLength'))))) + finally: + var.put(u'i', var.get(u'maxChunkLength'), u'+') + if PyJsStrictEq(var.get(u'extraBytes'),Js(1.0)): + var.put(u'tmp', var.get(u'uint8').get((var.get(u'len')-Js(1.0)))) + var.put(u'output', var.get(u'lookup').get((var.get(u'tmp')>>Js(2.0))), u'+') + var.put(u'output', var.get(u'lookup').get(((var.get(u'tmp')<>Js(10.0))), u'+') + var.put(u'output', var.get(u'lookup').get(((var.get(u'tmp')>>Js(4.0))&Js(63))), u'+') + var.put(u'output', var.get(u'lookup').get(((var.get(u'tmp')<>Js(1.0))) + var.put(u'nBits', (-Js(7.0))) + var.put(u'i', ((var.get(u'nBytes')-Js(1.0)) if var.get(u'isLE') else Js(0.0))) + var.put(u'd', ((-Js(1.0)) if var.get(u'isLE') else Js(1.0))) + var.put(u's', var.get(u'buffer').get((var.get(u'offset')+var.get(u'i')))) + var.put(u'i', var.get(u'd'), u'+') + var.put(u'e', (var.get(u's')&((Js(1.0)<<(-var.get(u'nBits')))-Js(1.0)))) + var.put(u's', (-var.get(u'nBits')), u'>>') + var.put(u'nBits', var.get(u'eLen'), u'+') + #for JS loop + + while (var.get(u'nBits')>Js(0.0)): + try: + pass + finally: + PyJsComma(PyJsComma(var.put(u'e', ((var.get(u'e')*Js(256.0))+var.get(u'buffer').get((var.get(u'offset')+var.get(u'i'))))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'nBits', Js(8.0), u'-')) + var.put(u'm', (var.get(u'e')&((Js(1.0)<<(-var.get(u'nBits')))-Js(1.0)))) + var.put(u'e', (-var.get(u'nBits')), u'>>') + var.put(u'nBits', var.get(u'mLen'), u'+') + #for JS loop + + while (var.get(u'nBits')>Js(0.0)): + try: + pass + finally: + PyJsComma(PyJsComma(var.put(u'm', ((var.get(u'm')*Js(256.0))+var.get(u'buffer').get((var.get(u'offset')+var.get(u'i'))))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'nBits', Js(8.0), u'-')) + if PyJsStrictEq(var.get(u'e'),Js(0.0)): + var.put(u'e', (Js(1.0)-var.get(u'eBias'))) + else: + if PyJsStrictEq(var.get(u'e'),var.get(u'eMax')): + return (var.get(u'NaN') if var.get(u'm') else (((-Js(1.0)) if var.get(u's') else Js(1.0))*var.get(u'Infinity'))) + else: + var.put(u'm', (var.get(u'm')+var.get(u'Math').callprop(u'pow', Js(2.0), var.get(u'mLen')))) + var.put(u'e', (var.get(u'e')-var.get(u'eBias'))) + return ((((-Js(1.0)) if var.get(u's') else Js(1.0))*var.get(u'm'))*var.get(u'Math').callprop(u'pow', Js(2.0), (var.get(u'e')-var.get(u'mLen')))) + PyJs_anonymous_4278_._set_name(u'anonymous') + var.get(u'exports').put(u'read', PyJs_anonymous_4278_) + @Js + def PyJs_anonymous_4279_(buffer, value, offset, isLE, mLen, nBytes, this, arguments, var=var): + var = Scope({u'mLen':mLen, u'buffer':buffer, u'value':value, u'this':this, u'nBytes':nBytes, u'offset':offset, u'isLE':isLE, u'arguments':arguments}, var) + var.registers([u'rt', u'c', u'e', u'd', u'mLen', u'i', u'eMax', u'offset', u'm', u'eLen', u'buffer', u's', u'value', u'eBias', u'isLE', u'nBytes']) + pass + var.put(u'eLen', (((var.get(u'nBytes')*Js(8.0))-var.get(u'mLen'))-Js(1.0))) + var.put(u'eMax', ((Js(1.0)<>Js(1.0))) + var.put(u'rt', ((var.get(u'Math').callprop(u'pow', Js(2.0), (-Js(24.0)))-var.get(u'Math').callprop(u'pow', Js(2.0), (-Js(77.0)))) if PyJsStrictEq(var.get(u'mLen'),Js(23.0)) else Js(0.0))) + var.put(u'i', (Js(0.0) if var.get(u'isLE') else (var.get(u'nBytes')-Js(1.0)))) + var.put(u'd', (Js(1.0) if var.get(u'isLE') else (-Js(1.0)))) + var.put(u's', (Js(1.0) if ((var.get(u'value')=Js(1.0)): + var.put(u'value', (var.get(u'rt')/var.get(u'c')), u'+') + else: + var.put(u'value', (var.get(u'rt')*var.get(u'Math').callprop(u'pow', Js(2.0), (Js(1.0)-var.get(u'eBias')))), u'+') + if ((var.get(u'value')*var.get(u'c'))>=Js(2.0)): + (var.put(u'e',Js(var.get(u'e').to_number())+Js(1))-Js(1)) + var.put(u'c', Js(2.0), u'/') + if ((var.get(u'e')+var.get(u'eBias'))>=var.get(u'eMax')): + var.put(u'm', Js(0.0)) + var.put(u'e', var.get(u'eMax')) + else: + if ((var.get(u'e')+var.get(u'eBias'))>=Js(1.0)): + var.put(u'm', (((var.get(u'value')*var.get(u'c'))-Js(1.0))*var.get(u'Math').callprop(u'pow', Js(2.0), var.get(u'mLen')))) + var.put(u'e', (var.get(u'e')+var.get(u'eBias'))) + else: + var.put(u'm', ((var.get(u'value')*var.get(u'Math').callprop(u'pow', Js(2.0), (var.get(u'eBias')-Js(1.0))))*var.get(u'Math').callprop(u'pow', Js(2.0), var.get(u'mLen')))) + var.put(u'e', Js(0.0)) + #for JS loop + + while (var.get(u'mLen')>=Js(8.0)): + try: + pass + finally: + PyJsComma(PyJsComma(PyJsComma(var.get(u'buffer').put((var.get(u'offset')+var.get(u'i')), (var.get(u'm')&Js(255))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'm', Js(256.0), u'/')),var.put(u'mLen', Js(8.0), u'-')) + var.put(u'e', ((var.get(u'e')<Js(0.0)): + try: + pass + finally: + PyJsComma(PyJsComma(PyJsComma(var.get(u'buffer').put((var.get(u'offset')+var.get(u'i')), (var.get(u'e')&Js(255))),var.put(u'i', var.get(u'd'), u'+')),var.put(u'e', Js(256.0), u'/')),var.put(u'eLen', Js(8.0), u'-')) + var.get(u'buffer').put(((var.get(u'offset')+var.get(u'i'))-var.get(u'd')), (var.get(u's')*Js(128.0)), u'|') + PyJs_anonymous_4279_._set_name(u'anonymous') + var.get(u'exports').put(u'write', PyJs_anonymous_4279_) +PyJs_anonymous_4277_._set_name(u'anonymous') +PyJs_Object_4280_ = Js({}) +@Js +def PyJs_anonymous_4281_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'toString', u'exports', u'module']) + PyJs_Object_4282_ = Js({}) + var.put(u'toString', PyJs_Object_4282_.get(u'toString')) + @Js + def PyJs_anonymous_4283_(arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'arguments':arguments}, var) + var.registers([u'arr']) + return (var.get(u'toString').callprop(u'call', var.get(u'arr'))==Js(u'[object Array]')) + PyJs_anonymous_4283_._set_name(u'anonymous') + var.get(u'module').put(u'exports', (var.get(u'Array').get(u'isArray') or PyJs_anonymous_4283_)) +PyJs_anonymous_4281_._set_name(u'anonymous') +PyJs_Object_4284_ = Js({}) +@Js +def PyJs_anonymous_4285_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + if PyJsStrictEq(var.get(u'Object').get(u'create').typeof(),Js(u'function')): + @Js + def PyJs_inherits_4286_(ctor, superCtor, this, arguments, var=var): + var = Scope({u'this':this, u'inherits':PyJs_inherits_4286_, u'superCtor':superCtor, u'arguments':arguments, u'ctor':ctor}, var) + var.registers([u'superCtor', u'ctor']) + var.get(u'ctor').put(u'super_', var.get(u'superCtor')) + PyJs_Object_4288_ = Js({u'value':var.get(u'ctor'),u'enumerable':Js(False),u'writable':var.get(u'true'),u'configurable':var.get(u'true')}) + PyJs_Object_4287_ = Js({u'constructor':PyJs_Object_4288_}) + var.get(u'ctor').put(u'prototype', var.get(u'Object').callprop(u'create', var.get(u'superCtor').get(u'prototype'), PyJs_Object_4287_)) + PyJs_inherits_4286_._set_name(u'inherits') + var.get(u'module').put(u'exports', PyJs_inherits_4286_) + else: + @Js + def PyJs_inherits_4289_(ctor, superCtor, this, arguments, var=var): + var = Scope({u'this':this, u'inherits':PyJs_inherits_4289_, u'superCtor':superCtor, u'arguments':arguments, u'ctor':ctor}, var) + var.registers([u'TempCtor', u'superCtor', u'ctor']) + var.get(u'ctor').put(u'super_', var.get(u'superCtor')) + @Js + def PyJs_anonymous_4290_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([]) + pass + PyJs_anonymous_4290_._set_name(u'anonymous') + var.put(u'TempCtor', PyJs_anonymous_4290_) + var.get(u'TempCtor').put(u'prototype', var.get(u'superCtor').get(u'prototype')) + var.get(u'ctor').put(u'prototype', var.get(u'TempCtor').create()) + var.get(u'ctor').get(u'prototype').put(u'constructor', var.get(u'ctor')) + PyJs_inherits_4289_._set_name(u'inherits') + var.get(u'module').put(u'exports', PyJs_inherits_4289_) +PyJs_anonymous_4285_._set_name(u'anonymous') +PyJs_Object_4291_ = Js({}) +@Js +def PyJs_anonymous_4292_(require, module, exports, this, arguments, var=var): + var = Scope({u'this':this, u'require':require, u'exports':exports, u'module':module, u'arguments':arguments}, var) + var.registers([u'require', u'exports', u'module']) + @Js + def PyJs_anonymous_4293_(process, this, arguments, var=var): + var = Scope({u'process':process, u'this':this, u'arguments':arguments}, var) + var.registers([u'splitPath', u'substr', u'process', u'normalizeArray', u'filter', u'splitPathRe']) + @Js + def PyJsHoisted_filter_(xs, f, this, arguments, var=var): + var = Scope({u'this':this, u'xs':xs, u'arguments':arguments, u'f':f}, var) + var.registers([u'i', u'res', u'f', u'xs']) + if var.get(u'xs').get(u'filter'): + return var.get(u'xs').callprop(u'filter', var.get(u'f')) + var.put(u'res', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')=Js(0.0)): + try: + var.put(u'last', var.get(u'parts').get(var.get(u'i'))) + if PyJsStrictEq(var.get(u'last'),Js(u'.')): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + else: + if PyJsStrictEq(var.get(u'last'),Js(u'..')): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + (var.put(u'up',Js(var.get(u'up').to_number())+Js(1))-Js(1)) + else: + if var.get(u'up'): + var.get(u'parts').callprop(u'splice', var.get(u'i'), Js(1.0)) + (var.put(u'up',Js(var.get(u'up').to_number())-Js(1))+Js(1)) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + if var.get(u'allowAboveRoot'): + #for JS loop + + while (var.put(u'up',Js(var.get(u'up').to_number())-Js(1))+Js(1)): + try: + var.get(u'parts').callprop(u'unshift', Js(u'..')) + finally: + var.get(u'up') + return var.get(u'parts') + PyJsHoisted_normalizeArray_.func_name = u'normalizeArray' + var.put(u'normalizeArray', PyJsHoisted_normalizeArray_) + pass + var.put(u'splitPathRe', JsRegExp(u'/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/')) + @Js + def PyJs_anonymous_4294_(filename, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'filename':filename}, var) + var.registers([u'filename']) + return var.get(u'splitPathRe').callprop(u'exec', var.get(u'filename')).callprop(u'slice', Js(1.0)) + PyJs_anonymous_4294_._set_name(u'anonymous') + var.put(u'splitPath', PyJs_anonymous_4294_) + @Js + def PyJs_anonymous_4295_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'i', u'resolvedPath', u'path', u'resolvedAbsolute']) + var.put(u'resolvedPath', Js(u'')) + var.put(u'resolvedAbsolute', Js(False)) + #for JS loop + var.put(u'i', (var.get(u'arguments').get(u'length')-Js(1.0))) + while ((var.get(u'i')>=(-Js(1.0))) and var.get(u'resolvedAbsolute').neg()): + try: + var.put(u'path', (var.get(u'arguments').get(var.get(u'i')) if (var.get(u'i')>=Js(0.0)) else var.get(u'process').callprop(u'cwd'))) + if PyJsStrictNeq(var.get(u'path',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Arguments to path.resolve must be strings'))) + raise PyJsTempException + else: + if var.get(u'path').neg(): + continue + var.put(u'resolvedPath', ((var.get(u'path')+Js(u'/'))+var.get(u'resolvedPath'))) + var.put(u'resolvedAbsolute', PyJsStrictEq(var.get(u'path').callprop(u'charAt', Js(0.0)),Js(u'/'))) + finally: + (var.put(u'i',Js(var.get(u'i').to_number())-Js(1))+Js(1)) + @Js + def PyJs_anonymous_4296_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').neg().neg() + PyJs_anonymous_4296_._set_name(u'anonymous') + var.put(u'resolvedPath', var.get(u'normalizeArray')(var.get(u'filter')(var.get(u'resolvedPath').callprop(u'split', Js(u'/')), PyJs_anonymous_4296_), var.get(u'resolvedAbsolute').neg()).callprop(u'join', Js(u'/'))) + return (((Js(u'/') if var.get(u'resolvedAbsolute') else Js(u''))+var.get(u'resolvedPath')) or Js(u'.')) + PyJs_anonymous_4295_._set_name(u'anonymous') + var.get(u'exports').put(u'resolve', PyJs_anonymous_4295_) + @Js + def PyJs_anonymous_4297_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path', u'trailingSlash', u'isAbsolute']) + var.put(u'isAbsolute', var.get(u'exports').callprop(u'isAbsolute', var.get(u'path'))) + var.put(u'trailingSlash', PyJsStrictEq(var.get(u'substr')(var.get(u'path'), (-Js(1.0))),Js(u'/'))) + @Js + def PyJs_anonymous_4298_(p, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments}, var) + var.registers([u'p']) + return var.get(u'p').neg().neg() + PyJs_anonymous_4298_._set_name(u'anonymous') + var.put(u'path', var.get(u'normalizeArray')(var.get(u'filter')(var.get(u'path').callprop(u'split', Js(u'/')), PyJs_anonymous_4298_), var.get(u'isAbsolute').neg()).callprop(u'join', Js(u'/'))) + if (var.get(u'path').neg() and var.get(u'isAbsolute').neg()): + var.put(u'path', Js(u'.')) + if (var.get(u'path') and var.get(u'trailingSlash')): + var.put(u'path', Js(u'/'), u'+') + return ((Js(u'/') if var.get(u'isAbsolute') else Js(u''))+var.get(u'path')) + PyJs_anonymous_4297_._set_name(u'anonymous') + var.get(u'exports').put(u'normalize', PyJs_anonymous_4297_) + @Js + def PyJs_anonymous_4299_(path, this, arguments, var=var): + var = Scope({u'this':this, u'path':path, u'arguments':arguments}, var) + var.registers([u'path']) + return PyJsStrictEq(var.get(u'path').callprop(u'charAt', Js(0.0)),Js(u'/')) + PyJs_anonymous_4299_._set_name(u'anonymous') + var.get(u'exports').put(u'isAbsolute', PyJs_anonymous_4299_) + @Js + def PyJs_anonymous_4300_(this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments}, var) + var.registers([u'paths']) + var.put(u'paths', var.get(u'Array').get(u'prototype').get(u'slice').callprop(u'call', var.get(u'arguments'), Js(0.0))) + @Js + def PyJs_anonymous_4301_(p, index, this, arguments, var=var): + var = Scope({u'this':this, u'p':p, u'arguments':arguments, u'index':index}, var) + var.registers([u'p', u'index']) + if PyJsStrictNeq(var.get(u'p',throw=False).typeof(),Js(u'string')): + PyJsTempException = JsToPyException(var.get(u'TypeError').create(Js(u'Arguments to path.join must be strings'))) + raise PyJsTempException + return var.get(u'p') + PyJs_anonymous_4301_._set_name(u'anonymous') + return var.get(u'exports').callprop(u'normalize', var.get(u'filter')(var.get(u'paths'), PyJs_anonymous_4301_).callprop(u'join', Js(u'/'))) + PyJs_anonymous_4300_._set_name(u'anonymous') + var.get(u'exports').put(u'join', PyJs_anonymous_4300_) + @Js + def PyJs_anonymous_4302_(PyJsArg_66726f6d_, to, this, arguments, var=var): + var = Scope({u'this':this, u'to':to, u'from':PyJsArg_66726f6d_, u'arguments':arguments}, var) + var.registers([u'trim', u'outputParts', u'i', u'to', u'length', u'toParts', u'from', u'fromParts', u'samePartsLength']) + @Js + def PyJsHoisted_trim_(arr, this, arguments, var=var): + var = Scope({u'this':this, u'arr':arr, u'arguments':arguments}, var) + var.registers([u'start', u'arr', u'end']) + var.put(u'start', Js(0.0)) + #for JS loop + + while (var.get(u'start')=Js(0.0)): + try: + if PyJsStrictNeq(var.get(u'arr').get(var.get(u'end')),Js(u'')): + break + finally: + (var.put(u'end',Js(var.get(u'end').to_number())-Js(1))+Js(1)) + if (var.get(u'start')>var.get(u'end')): + return Js([]) + return var.get(u'arr').callprop(u'slice', var.get(u'start'), ((var.get(u'end')-var.get(u'start'))+Js(1.0))) + PyJsHoisted_trim_.func_name = u'trim' + var.put(u'trim', PyJsHoisted_trim_) + var.put(u'from', var.get(u'exports').callprop(u'resolve', var.get(u'from')).callprop(u'substr', Js(1.0))) + var.put(u'to', var.get(u'exports').callprop(u'resolve', var.get(u'to')).callprop(u'substr', Js(1.0))) + pass + var.put(u'fromParts', var.get(u'trim')(var.get(u'from').callprop(u'split', Js(u'/')))) + var.put(u'toParts', var.get(u'trim')(var.get(u'to').callprop(u'split', Js(u'/')))) + var.put(u'length', var.get(u'Math').callprop(u'min', var.get(u'fromParts').get(u'length'), var.get(u'toParts').get(u'length'))) + var.put(u'samePartsLength', var.get(u'length')) + #for JS loop + var.put(u'i', Js(0.0)) + while (var.get(u'i')Js(1.0)): + #for JS loop + var.put(u'i', Js(1.0)) + while (var.get(u'i')(-Js(1.0))): + if var.get(u'array'): + @Js + def PyJs_anonymous_4345_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return (Js(u' ')+var.get(u'line')) + PyJs_anonymous_4345_._set_name(u'anonymous') + var.put(u'str', var.get(u'str').callprop(u'split', Js(u'\n')).callprop(u'map', PyJs_anonymous_4345_).callprop(u'join', Js(u'\n')).callprop(u'substr', Js(2.0))) + else: + @Js + def PyJs_anonymous_4346_(line, this, arguments, var=var): + var = Scope({u'this':this, u'line':line, u'arguments':arguments}, var) + var.registers([u'line']) + return (Js(u' ')+var.get(u'line')) + PyJs_anonymous_4346_._set_name(u'anonymous') + var.put(u'str', (Js(u'\n')+var.get(u'str').callprop(u'split', Js(u'\n')).callprop(u'map', PyJs_anonymous_4346_).callprop(u'join', Js(u'\n')))) + else: + var.put(u'str', var.get(u'ctx').callprop(u'stylize', Js(u'[Circular]'), Js(u'special'))) + if var.get(u'isUndefined')(var.get(u'name')): + if (var.get(u'array') and var.get(u'key').callprop(u'match', JsRegExp(u'/^\\d+$/'))): + return var.get(u'str') + var.put(u'name', var.get(u'JSON').callprop(u'stringify', (Js(u'')+var.get(u'key')))) + if var.get(u'name').callprop(u'match', JsRegExp(u'/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/')): + var.put(u'name', var.get(u'name').callprop(u'substr', Js(1.0), (var.get(u'name').get(u'length')-Js(2.0)))) + var.put(u'name', var.get(u'ctx').callprop(u'stylize', var.get(u'name'), Js(u'name'))) + else: + var.put(u'name', var.get(u'name').callprop(u'replace', JsRegExp(u"/'/g"), Js(u"\\'")).callprop(u'replace', JsRegExp(u'/\\\\"/g'), Js(u'"')).callprop(u'replace', JsRegExp(u'/(^"|"$)/g'), Js(u"'"))) + var.put(u'name', var.get(u'ctx').callprop(u'stylize', var.get(u'name'), Js(u'string'))) + return ((var.get(u'name')+Js(u': '))+var.get(u'str')) + PyJsHoisted_formatProperty_.func_name = u'formatProperty' + var.put(u'formatProperty', PyJsHoisted_formatProperty_) + @Js + def PyJsHoisted_formatError_(value, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'value':value}, var) + var.registers([u'value']) + return ((Js(u'[')+var.get(u'Error').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')))+Js(u']')) + PyJsHoisted_formatError_.func_name = u'formatError' + var.put(u'formatError', PyJsHoisted_formatError_) + @Js + def PyJsHoisted_formatArray_(ctx, value, recurseTimes, visibleKeys, keys, this, arguments, var=var): + var = Scope({u'this':this, u'visibleKeys':visibleKeys, u'arguments':arguments, u'recurseTimes':recurseTimes, u'keys':keys, u'ctx':ctx, u'value':value}, var) + var.registers([u'keys', u'recurseTimes', u'i', u'ctx', u'l', u'value', u'visibleKeys', u'output']) + var.put(u'output', Js([])) + #for JS loop + var.put(u'i', Js(0.0)) + var.put(u'l', var.get(u'value').get(u'length')) + while (var.get(u'i')=Js(3.0)): + var.get(u'ctx').put(u'depth', var.get(u'arguments').get(u'2')) + if (var.get(u'arguments').get(u'length')>=Js(4.0)): + var.get(u'ctx').put(u'colors', var.get(u'arguments').get(u'3')) + if var.get(u'isBoolean')(var.get(u'opts')): + var.get(u'ctx').put(u'showHidden', var.get(u'opts')) + else: + if var.get(u'opts'): + var.get(u'exports').callprop(u'_extend', var.get(u'ctx'), var.get(u'opts')) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'showHidden')): + var.get(u'ctx').put(u'showHidden', Js(False)) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'depth')): + var.get(u'ctx').put(u'depth', Js(2.0)) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'colors')): + var.get(u'ctx').put(u'colors', Js(False)) + if var.get(u'isUndefined')(var.get(u'ctx').get(u'customInspect')): + var.get(u'ctx').put(u'customInspect', var.get(u'true')) + if var.get(u'ctx').get(u'colors'): + var.get(u'ctx').put(u'stylize', var.get(u'stylizeWithColor')) + return var.get(u'formatValue')(var.get(u'ctx'), var.get(u'obj'), var.get(u'ctx').get(u'depth')) + PyJsHoisted_inspect_.func_name = u'inspect' + var.put(u'inspect', PyJsHoisted_inspect_) + @Js + def PyJsHoisted_formatPrimitive_(ctx, value, this, arguments, var=var): + var = Scope({u'this':this, u'ctx':ctx, u'arguments':arguments, u'value':value}, var) + var.registers([u'simple', u'ctx', u'value']) + if var.get(u'isUndefined')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', Js(u'undefined'), Js(u'undefined')) + if var.get(u'isString')(var.get(u'value')): + var.put(u'simple', ((Js(u"'")+var.get(u'JSON').callprop(u'stringify', var.get(u'value')).callprop(u'replace', JsRegExp(u'/^"|"$/g'), Js(u'')).callprop(u'replace', JsRegExp(u"/'/g"), Js(u"\\'")).callprop(u'replace', JsRegExp(u'/\\\\"/g'), Js(u'"')))+Js(u"'"))) + return var.get(u'ctx').callprop(u'stylize', var.get(u'simple'), Js(u'string')) + if var.get(u'isNumber')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', (Js(u'')+var.get(u'value')), Js(u'number')) + if var.get(u'isBoolean')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', (Js(u'')+var.get(u'value')), Js(u'boolean')) + if var.get(u'isNull')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', Js(u'null'), Js(u'null')) + PyJsHoisted_formatPrimitive_.func_name = u'formatPrimitive' + var.put(u'formatPrimitive', PyJsHoisted_formatPrimitive_) + @Js + def PyJsHoisted_hasOwnProperty_(obj, prop, this, arguments, var=var): + var = Scope({u'this':this, u'obj':obj, u'arguments':arguments, u'prop':prop}, var) + var.registers([u'obj', u'prop']) + return var.get(u'Object').get(u'prototype').get(u'hasOwnProperty').callprop(u'call', var.get(u'obj'), var.get(u'prop')) + PyJsHoisted_hasOwnProperty_.func_name = u'hasOwnProperty' + var.put(u'hasOwnProperty', PyJsHoisted_hasOwnProperty_) + @Js + def PyJsHoisted_isNumber_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'number')) + PyJsHoisted_isNumber_.func_name = u'isNumber' + var.put(u'isNumber', PyJsHoisted_isNumber_) + @Js + def PyJsHoisted_isError_(e, this, arguments, var=var): + var = Scope({u'this':this, u'e':e, u'arguments':arguments}, var) + var.registers([u'e']) + return (var.get(u'isObject')(var.get(u'e')) and (PyJsStrictEq(var.get(u'objectToString')(var.get(u'e')),Js(u'[object Error]')) or var.get(u'e').instanceof(var.get(u'Error')))) + PyJsHoisted_isError_.func_name = u'isError' + var.put(u'isError', PyJsHoisted_isError_) + @Js + def PyJsHoisted_reduceToSingleString_(output, base, braces, this, arguments, var=var): + var = Scope({u'this':this, u'output':output, u'base':base, u'arguments':arguments, u'braces':braces}, var) + var.registers([u'output', u'length', u'base', u'numLinesEst', u'braces']) + var.put(u'numLinesEst', Js(0.0)) + @Js + def PyJs_anonymous_4347_(prev, cur, this, arguments, var=var): + var = Scope({u'this':this, u'prev':prev, u'cur':cur, u'arguments':arguments}, var) + var.registers([u'prev', u'cur']) + (var.put(u'numLinesEst',Js(var.get(u'numLinesEst').to_number())+Js(1))-Js(1)) + if (var.get(u'cur').callprop(u'indexOf', Js(u'\n'))>=Js(0.0)): + (var.put(u'numLinesEst',Js(var.get(u'numLinesEst').to_number())+Js(1))-Js(1)) + return ((var.get(u'prev')+var.get(u'cur').callprop(u'replace', JsRegExp(u'/\\u001b\\[\\d\\d?m/g'), Js(u'')).get(u'length'))+Js(1.0)) + PyJs_anonymous_4347_._set_name(u'anonymous') + var.put(u'length', var.get(u'output').callprop(u'reduce', PyJs_anonymous_4347_, Js(0.0))) + if (var.get(u'length')>Js(60.0)): + return (((((var.get(u'braces').get(u'0')+(Js(u'') if PyJsStrictEq(var.get(u'base'),Js(u'')) else (var.get(u'base')+Js(u'\n '))))+Js(u' '))+var.get(u'output').callprop(u'join', Js(u',\n ')))+Js(u' '))+var.get(u'braces').get(u'1')) + return (((((var.get(u'braces').get(u'0')+var.get(u'base'))+Js(u' '))+var.get(u'output').callprop(u'join', Js(u', ')))+Js(u' '))+var.get(u'braces').get(u'1')) + PyJsHoisted_reduceToSingleString_.func_name = u'reduceToSingleString' + var.put(u'reduceToSingleString', PyJsHoisted_reduceToSingleString_) + @Js + def PyJsHoisted_isNullOrUndefined_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (var.get(u'arg')==var.get(u"null")) + PyJsHoisted_isNullOrUndefined_.func_name = u'isNullOrUndefined' + var.put(u'isNullOrUndefined', PyJsHoisted_isNullOrUndefined_) + @Js + def PyJsHoisted_isDate_(d, this, arguments, var=var): + var = Scope({u'this':this, u'd':d, u'arguments':arguments}, var) + var.registers([u'd']) + return (var.get(u'isObject')(var.get(u'd')) and PyJsStrictEq(var.get(u'objectToString')(var.get(u'd')),Js(u'[object Date]'))) + PyJsHoisted_isDate_.func_name = u'isDate' + var.put(u'isDate', PyJsHoisted_isDate_) + @Js + def PyJsHoisted_isString_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'string')) + PyJsHoisted_isString_.func_name = u'isString' + var.put(u'isString', PyJsHoisted_isString_) + @Js + def PyJsHoisted_isPrimitive_(arg, this, arguments, var=var): + var = Scope({u'this':this, u'arguments':arguments, u'arg':arg}, var) + var.registers([u'arg']) + return (((((PyJsStrictEq(var.get(u'arg'),var.get(u"null")) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'boolean'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'number'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'string'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'symbol'))) or PyJsStrictEq(var.get(u'arg',throw=False).typeof(),Js(u'undefined'))) + PyJsHoisted_isPrimitive_.func_name = u'isPrimitive' + var.put(u'isPrimitive', PyJsHoisted_isPrimitive_) + @Js + def PyJsHoisted_formatValue_(ctx, value, recurseTimes, this, arguments, var=var): + var = Scope({u'this':this, u'ctx':ctx, u'arguments':arguments, u'value':value, u'recurseTimes':recurseTimes}, var) + var.registers([u'primitive', u'name', u'recurseTimes', u'keys', u'ctx', u'ret', u'n', u'visibleKeys', u'base', u'value', u'output', u'array', u'braces']) + if ((((var.get(u'ctx').get(u'customInspect') and var.get(u'value')) and var.get(u'isFunction')(var.get(u'value').get(u'inspect'))) and PyJsStrictNeq(var.get(u'value').get(u'inspect'),var.get(u'exports').get(u'inspect'))) and (var.get(u'value').get(u'constructor') and PyJsStrictEq(var.get(u'value').get(u'constructor').get(u'prototype'),var.get(u'value'))).neg()): + var.put(u'ret', var.get(u'value').callprop(u'inspect', var.get(u'recurseTimes'), var.get(u'ctx'))) + if var.get(u'isString')(var.get(u'ret')).neg(): + var.put(u'ret', var.get(u'formatValue')(var.get(u'ctx'), var.get(u'ret'), var.get(u'recurseTimes'))) + return var.get(u'ret') + var.put(u'primitive', var.get(u'formatPrimitive')(var.get(u'ctx'), var.get(u'value'))) + if var.get(u'primitive'): + return var.get(u'primitive') + var.put(u'keys', var.get(u'Object').callprop(u'keys', var.get(u'value'))) + var.put(u'visibleKeys', var.get(u'arrayToHash')(var.get(u'keys'))) + if var.get(u'ctx').get(u'showHidden'): + var.put(u'keys', var.get(u'Object').callprop(u'getOwnPropertyNames', var.get(u'value'))) + if (var.get(u'isError')(var.get(u'value')) and ((var.get(u'keys').callprop(u'indexOf', Js(u'message'))>=Js(0.0)) or (var.get(u'keys').callprop(u'indexOf', Js(u'description'))>=Js(0.0)))): + return var.get(u'formatError')(var.get(u'value')) + if PyJsStrictEq(var.get(u'keys').get(u'length'),Js(0.0)): + if var.get(u'isFunction')(var.get(u'value')): + var.put(u'name', ((Js(u': ')+var.get(u'value').get(u'name')) if var.get(u'value').get(u'name') else Js(u''))) + return var.get(u'ctx').callprop(u'stylize', ((Js(u'[Function')+var.get(u'name'))+Js(u']')), Js(u'special')) + if var.get(u'isRegExp')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', var.get(u'RegExp').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')), Js(u'regexp')) + if var.get(u'isDate')(var.get(u'value')): + return var.get(u'ctx').callprop(u'stylize', var.get(u'Date').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')), Js(u'date')) + if var.get(u'isError')(var.get(u'value')): + return var.get(u'formatError')(var.get(u'value')) + var.put(u'base', Js(u'')) + var.put(u'array', Js(False)) + var.put(u'braces', Js([Js(u'{'), Js(u'}')])) + if var.get(u'isArray')(var.get(u'value')): + var.put(u'array', var.get(u'true')) + var.put(u'braces', Js([Js(u'['), Js(u']')])) + if var.get(u'isFunction')(var.get(u'value')): + var.put(u'n', ((Js(u': ')+var.get(u'value').get(u'name')) if var.get(u'value').get(u'name') else Js(u''))) + var.put(u'base', ((Js(u' [Function')+var.get(u'n'))+Js(u']'))) + if var.get(u'isRegExp')(var.get(u'value')): + var.put(u'base', (Js(u' ')+var.get(u'RegExp').get(u'prototype').get(u'toString').callprop(u'call', var.get(u'value')))) + if var.get(u'isDate')(var.get(u'value')): + var.put(u'base', (Js(u' ')+var.get(u'Date').get(u'prototype').get(u'toUTCString').callprop(u'call', var.get(u'value')))) + if var.get(u'isError')(var.get(u'value')): + var.put(u'base', (Js(u' ')+var.get(u'formatError')(var.get(u'value')))) + if (PyJsStrictEq(var.get(u'keys').get(u'length'),Js(0.0)) and (var.get(u'array').neg() or (var.get(u'value').get(u'length')==Js(0.0)))): + return ((var.get(u'braces').get(u'0')+var.get(u'base'))+var.get(u'braces').get(u'1')) + if (var.get(u'recurseTimes')=var.get(u'len')): + return var.get(u'x') + while 1: + SWITCHED = False + CONDITION = (var.get(u'x')) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%s')): + SWITCHED = True + return var.get(u'String')(var.get(u'args').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%d')): + SWITCHED = True + return var.get(u'Number')(var.get(u'args').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + if SWITCHED or PyJsStrictEq(CONDITION, Js(u'%j')): + SWITCHED = True + try: + return var.get(u'JSON').callprop(u'stringify', var.get(u'args').get((var.put(u'i',Js(var.get(u'i').to_number())+Js(1))-Js(1)))) + except PyJsException as PyJsTempException: + PyJsHolder_5f_51919926 = var.own.get(u'_') + var.force_own_put(u'_', PyExceptionToJs(PyJsTempException)) + try: + return Js(u'[Circular]') + finally: + if PyJsHolder_5f_51919926 is not None: + var.own[u'_'] = PyJsHolder_5f_51919926 + else: + del var.own[u'_'] + del PyJsHolder_5f_51919926 + if True: + SWITCHED = True + return var.get(u'x') + SWITCHED = True + break + PyJs_anonymous_4330_._set_name(u'anonymous') + var.put(u'str', var.get(u'String')(var.get(u'f')).callprop(u'replace', var.get(u'formatRegExp'), PyJs_anonymous_4330_)) + #for JS loop + var.put(u'x', var.get(u'args').get(var.get(u'i'))) + while (var.get(u'i') generates babel.py +echo "Generating babel.py..." +python -c "import js2py;js2py.translate_file('babel_bundle.js', 'babel.py');" +rm babel_bundle.js + diff --git a/Contents/Libraries/Shared/js2py/evaljs.py b/Contents/Libraries/Shared/js2py/evaljs.py new file mode 100644 index 000000000..64eea5c4c --- /dev/null +++ b/Contents/Libraries/Shared/js2py/evaljs.py @@ -0,0 +1,267 @@ +# coding=utf-8 +from .translators import translate_js, DEFAULT_HEADER +from .es6 import js6_to_js5 +import sys +import time +import json +import six +import os +import hashlib +import codecs + +__all__ = [ + 'EvalJs', 'translate_js', 'import_js', 'eval_js', 'translate_file', + 'eval_js6', 'translate_js6', 'run_file', 'disable_pyimport', + 'get_file_contents', 'write_file_contents' +] +DEBUG = False + + +def disable_pyimport(): + import pyjsparser.parser + pyjsparser.parser.ENABLE_PYIMPORT = False + + +def path_as_local(path): + if os.path.isabs(path): + return path + # relative to cwd + return os.path.join(os.getcwd(), path) + + +def import_js(path, lib_name, globals): + """Imports from javascript source file. + globals is your globals()""" + with codecs.open(path_as_local(path), "r", "utf-8") as f: + js = f.read() + e = EvalJs() + e.execute(js) + var = e.context['var'] + globals[lib_name] = var.to_python() + + +def get_file_contents(path_or_file): + if hasattr(path_or_file, 'read'): + js = path_or_file.read() + else: + with codecs.open(path_as_local(path_or_file), "r", "utf-8") as f: + js = f.read() + return js + + +def write_file_contents(path_or_file, contents): + if hasattr(path_or_file, 'write'): + path_or_file.write(contents) + else: + with open(path_as_local(path_or_file), 'w') as f: + f.write(contents) + + +def translate_file(input_path, output_path): + ''' + Translates input JS file to python and saves the it to the output path. + It appends some convenience code at the end so that it is easy to import JS objects. + + For example we have a file 'example.js' with: var a = function(x) {return x} + translate_file('example.js', 'example.py') + + Now example.py can be easily importend and used: + >>> from example import example + >>> example.a(30) + 30 + ''' + js = get_file_contents(input_path) + + py_code = translate_js(js) + lib_name = os.path.basename(output_path).split('.')[0] + head = '__all__ = [%s]\n\n# Don\'t look below, you will not understand this Python code :) I don\'t.\n\n' % repr( + lib_name) + tail = '\n\n# Add lib to the module scope\n%s = var.to_python()' % lib_name + out = head + py_code + tail + write_file_contents(output_path, out) + + +def run_file(path_or_file, context=None): + ''' Context must be EvalJS object. Runs given path as a JS program. Returns (eval_value, context). + ''' + if context is None: + context = EvalJs() + if not isinstance(context, EvalJs): + raise TypeError('context must be the instance of EvalJs') + eval_value = context.eval(get_file_contents(path_or_file)) + return eval_value, context + + +def eval_js(js): + """Just like javascript eval. Translates javascript to python, + executes and returns python object. + js is javascript source code + + EXAMPLE: + >>> import js2py + >>> add = js2py.eval_js('function add(a, b) {return a + b}') + >>> add(1, 2) + 3 + 6 + >>> add('1', 2, 3) + u'12' + >>> add.constructor + function Function() { [python code] } + + NOTE: For Js Number, String, Boolean and other base types returns appropriate python BUILTIN type. + For Js functions and objects, returns Python wrapper - basically behaves like normal python object. + If you really want to convert object to python dict you can use to_dict method. + """ + e = EvalJs() + return e.eval(js) + + +def eval_js6(js): + """Just like eval_js but with experimental support for js6 via babel.""" + return eval_js(js6_to_js5(js)) + + +def translate_js6(js): + """Just like translate_js but with experimental support for js6 via babel.""" + return translate_js(js6_to_js5(js)) + + +class EvalJs(object): + """This class supports continuous execution of javascript under same context. + + >>> js = EvalJs() + >>> js.execute('var a = 10;function f(x) {return x*x};') + >>> js.f(9) + 81 + >>> js.a + 10 + + context is a python dict or object that contains python variables that should be available to JavaScript + For example: + >>> js = EvalJs({'a': 30}) + >>> js.execute('var x = a') + >>> js.x + 30 + + You can run interactive javascript console with console method!""" + + def __init__(self, context={}): + self.__dict__['_context'] = {} + exec (DEFAULT_HEADER, self._context) + self.__dict__['_var'] = self._context['var'].to_python() + if not isinstance(context, dict): + try: + context = context.__dict__ + except: + raise TypeError( + 'context has to be either a dict or have __dict__ attr') + for k, v in six.iteritems(context): + setattr(self._var, k, v) + + def execute(self, js=None, use_compilation_plan=False): + """executes javascript js in current context + + During initial execute() the converted js is cached for re-use. That means next time you + run the same javascript snippet you save many instructions needed to parse and convert the + js code to python code. + + This cache causes minor overhead (a cache dicts is updated) but the Js=>Py conversion process + is typically expensive compared to actually running the generated python code. + + Note that the cache is just a dict, it has no expiration or cleanup so when running this + in automated situations with vast amounts of snippets it might increase memory usage. + """ + try: + cache = self.__dict__['cache'] + except KeyError: + cache = self.__dict__['cache'] = {} + hashkey = hashlib.md5(js.encode('utf-8')).digest() + try: + compiled = cache[hashkey] + except KeyError: + code = translate_js( + js, '', use_compilation_plan=use_compilation_plan) + compiled = cache[hashkey] = compile(code, '', + 'exec') + exec (compiled, self._context) + + def eval(self, expression, use_compilation_plan=False): + """evaluates expression in current context and returns its value""" + code = 'PyJsEvalResult = eval(%s)' % json.dumps(expression) + self.execute(code, use_compilation_plan=use_compilation_plan) + return self['PyJsEvalResult'] + + def execute_debug(self, js): + """executes javascript js in current context + as opposed to the (faster) self.execute method, you can use your regular debugger + to set breakpoints and inspect the generated python code + """ + code = translate_js(js, '') + # make sure you have a temp folder: + filename = 'temp' + os.sep + '_' + hashlib.md5( + code.encode("utf-8")).hexdigest() + '.py' + try: + with open(filename, mode='w') as f: + f.write(code) + with open(filename, "r") as f: + pyCode = compile(f.read(), filename, 'exec') + exec(pyCode, self._context) + + except Exception as err: + raise err + finally: + os.remove(filename) + try: + os.remove(filename + 'c') + except: + pass + + def eval_debug(self, expression): + """evaluates expression in current context and returns its value + as opposed to the (faster) self.execute method, you can use your regular debugger + to set breakpoints and inspect the generated python code + """ + code = 'PyJsEvalResult = eval(%s)' % json.dumps(expression) + self.execute_debug(code) + return self['PyJsEvalResult'] + + def __getattr__(self, var): + return getattr(self._var, var) + + def __getitem__(self, var): + return getattr(self._var, var) + + def __setattr__(self, var, val): + return setattr(self._var, var, val) + + def __setitem__(self, var, val): + return setattr(self._var, var, val) + + def console(self): + """starts to interact (starts interactive console) Something like code.InteractiveConsole""" + while True: + if six.PY2: + code = raw_input('>>> ') + else: + code = input('>>>') + try: + print(self.eval(code)) + except KeyboardInterrupt: + break + except Exception as e: + import traceback + if DEBUG: + sys.stderr.write(traceback.format_exc()) + else: + sys.stderr.write('EXCEPTION: ' + str(e) + '\n') + time.sleep(0.01) + + +#print x + +if __name__ == '__main__': + #with open('C:\Users\Piotrek\Desktop\esprima.js', 'rb') as f: + # x = f.read() + e = EvalJs() + e.execute('square(x)') + #e.execute(x) + e.console() diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py b/Contents/Libraries/Shared/js2py/host/__init__.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py rename to Contents/Libraries/Shared/js2py/host/__init__.py diff --git a/Contents/Libraries/Shared/js2py/host/console.py b/Contents/Libraries/Shared/js2py/host/console.py new file mode 100644 index 000000000..50a08632a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/host/console.py @@ -0,0 +1,15 @@ +from ..base import * + +@Js +def console(): + pass + +@Js +def log(): + print(arguments[0]) + +console.put('log', log) +console.put('debug', log) +console.put('info', log) +console.put('warn', log) +console.put('error', log) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py b/Contents/Libraries/Shared/js2py/host/dom/__init__.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py rename to Contents/Libraries/Shared/js2py/host/dom/__init__.py diff --git a/Contents/Libraries/Shared/js2py/host/jseval.py b/Contents/Libraries/Shared/js2py/host/jseval.py new file mode 100644 index 000000000..13140d2d5 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/host/jseval.py @@ -0,0 +1,51 @@ +from ..base import * +import inspect +try: + from js2py.translators.translator import translate_js +except: + pass + + +@Js +def Eval(code): + local_scope = inspect.stack()[3][0].f_locals['var'] + global_scope = this.GlobalObject + # todo fix scope - we have to behave differently if called through variable other than eval + # we will use local scope (default) + globals()['var'] = local_scope + try: + py_code = translate_js(code.to_string().value, '') + except SyntaxError as syn_err: + raise MakeError('SyntaxError', str(syn_err)) + lines = py_code.split('\n') + # a simple way to return value from eval. Will not work in complex cases. + has_return = False + for n in xrange(len(lines)): + line = lines[len(lines) - n - 1] + if line.strip(): + if line.startswith(' '): + break + elif line.strip() == 'pass': + continue + elif any( + line.startswith(e) + for e in ['return ', 'continue ', 'break', 'raise ']): + break + else: + has_return = True + cand = 'EVAL_RESULT = (%s)\n' % line + try: + compile(cand, '', 'exec') + except SyntaxError: + break + lines[len(lines) - n - 1] = cand + py_code = '\n'.join(lines) + break + #print py_code + executor(py_code) + if has_return: + return globals()['EVAL_RESULT'] + + +def executor(code): + exec (code, globals()) diff --git a/Contents/Libraries/Shared/js2py/host/jsfunctions.py b/Contents/Libraries/Shared/js2py/host/jsfunctions.py new file mode 100644 index 000000000..2360fee86 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/host/jsfunctions.py @@ -0,0 +1,176 @@ +from ..base import * +from six.moves.urllib.parse import quote, unquote + +RADIX_CHARS = { + '1': 1, + '0': 0, + '3': 3, + '2': 2, + '5': 5, + '4': 4, + '7': 7, + '6': 6, + '9': 9, + '8': 8, + 'a': 10, + 'c': 12, + 'b': 11, + 'e': 14, + 'd': 13, + 'g': 16, + 'f': 15, + 'i': 18, + 'h': 17, + 'k': 20, + 'j': 19, + 'm': 22, + 'l': 21, + 'o': 24, + 'n': 23, + 'q': 26, + 'p': 25, + 's': 28, + 'r': 27, + 'u': 30, + 't': 29, + 'w': 32, + 'v': 31, + 'y': 34, + 'x': 33, + 'z': 35, + 'A': 10, + 'C': 12, + 'B': 11, + 'E': 14, + 'D': 13, + 'G': 16, + 'F': 15, + 'I': 18, + 'H': 17, + 'K': 20, + 'J': 19, + 'M': 22, + 'L': 21, + 'O': 24, + 'N': 23, + 'Q': 26, + 'P': 25, + 'S': 28, + 'R': 27, + 'U': 30, + 'T': 29, + 'W': 32, + 'V': 31, + 'Y': 34, + 'X': 33, + 'Z': 35 +} + + +@Js +def parseInt(string, radix): + string = string.to_string().value.lstrip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + r = radix.to_int32() + strip_prefix = True + if r: + if r < 2 or r > 36: + return NaN + if r != 16: + strip_prefix = False + else: + r = 10 + if strip_prefix: + if len(string) >= 2 and string[:2] in ('0x', '0X'): + string = string[2:] + r = 16 + n = 0 + num = 0 + while n < len(string): + cand = RADIX_CHARS.get(string[n]) + if cand is None or not cand < r: + break + num = cand + num * r + n += 1 + if not n: + return NaN + return sign * num + + +@Js +def parseFloat(string): + string = string.to_string().value.strip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + num = None + length = 1 + max_len = None + failed = 0 + while length <= len(string): + try: + num = float(string[:length]) + max_len = length + failed = 0 + except: + failed += 1 + if failed > 4: # cant be a number anymore + break + length += 1 + if num is None: + return NaN + return sign * float(string[:max_len]) + + +@Js +def isNaN(number): + if number.to_number().is_nan(): + return true + return false + + +@Js +def isFinite(number): + num = number.to_number() + if num.is_nan() or num.is_infinity(): + return false + return true + + +# todo test them properly + + +@Js +def escape(text): + return quote(text.to_string().value) + + +@Js +def unescape(text): + return unquote(text.to_string().value) + + +@Js +def encodeURI(text): + return quote(text.to_string().value, safe='~@#$&()*!+=:;,.?/\'') + + +@Js +def decodeURI(text): + return unquote(text.to_string().value) + + +@Js +def encodeURIComponent(text): + return quote(text.to_string().value, safe='~()*!.\'') + + +@Js +def decodeURIComponent(text): + return unquote(text.to_string().value) diff --git a/Contents/Libraries/Shared/js2py/internals/__init__.py b/Contents/Libraries/Shared/js2py/internals/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/internals/base.py b/Contents/Libraries/Shared/js2py/internals/base.py new file mode 100644 index 000000000..a02a21229 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/base.py @@ -0,0 +1,929 @@ +from __future__ import unicode_literals +import re + +import datetime + +from .desc import * +from .simplex import * +from .conversions import * + +from pyjsparser import PyJsParser + +import six +if six.PY2: + from itertools import izip +else: + izip = zip + + + + +def Type(obj): + return obj.TYPE + + +# 8.6.2 +class PyJs(object): + TYPE = 'Object' + IS_CONSTRUCTOR = False + + prototype = None + Class = None + extensible = True + value = None + + own = {} + + def get_member(self, unconverted_prop): + return self.get(to_string(unconverted_prop)) + + def put_member(self, unconverted_prop, val): + return self.put(to_string(unconverted_prop), val) + + def get(self, prop): + assert type(prop) == unicode + cand = self.get_property(prop) + if cand is None: + return undefined + if is_data_descriptor(cand): + return cand['value'] + if is_undefined(cand['get']): + return undefined + return cand['get'].call(self) + + def get_own_property(self, prop): + assert type(prop) == unicode + # takes py returns py + return self.own.get(prop) + + def get_property(self, prop): + assert type(prop) == unicode + # take py returns py + cand = self.get_own_property(prop) + if cand: + return cand + if self.prototype is not None: + return self.prototype.get_property(prop) + + def put(self, prop, val, throw=False): + assert type(prop) == unicode + # takes py, returns none + if not self.can_put(prop): + if throw: + raise MakeError('TypeError', 'Could not define own property') + return + own_desc = self.get_own_property(prop) + if is_data_descriptor(own_desc): + self.own[prop]['value'] = val + return + desc = self.get_property(prop) + if is_accessor_descriptor(desc): + desc['set'].call( + self, (val, )) # calling setter on own or inherited element + else: # new property + self.own[prop] = { + 'value': val, + 'writable': True, + 'configurable': True, + 'enumerable': True + } + + def can_put(self, prop): # to check + assert type(prop) == unicode, type(prop) + # takes py returns py + desc = self.get_own_property(prop) + if desc: # if we have this property + if is_accessor_descriptor(desc): + return is_callable( + desc['set']) # Check if setter method is defined + else: # data desc + return desc['writable'] + if self.prototype is None: + return self.extensible + inherited = self.prototype.get_property(prop) + if inherited is None: + return self.extensible + if is_accessor_descriptor(inherited): + return not is_undefined(inherited['set']) + elif self.extensible: + return inherited['writable'] # weird... + return False + + def has_property(self, prop): + assert type(prop) == unicode + # takes py returns Py + return self.get_property(prop) is not None + + def delete(self, prop, throw=False): + assert type(prop) == unicode + # takes py, returns py + desc = self.get_own_property(prop) + if desc is None: + return True + if desc['configurable']: + del self.own[prop] + return True + if throw: + raise MakeError('TypeError', 'Could not define own property') + return False + + def default_value(self, hint=None): + order = ('valueOf', 'toString') + if hint == 'String' or (hint is None and self.Class == 'Date'): + order = ('toString', 'valueOf') + for meth_name in order: + method = self.get(meth_name) + if method is not None and is_callable(method): + cand = method.call(self, ()) + if is_primitive(cand): + return cand + raise MakeError('TypeError', + 'Cannot convert object to primitive value') + + def define_own_property( + self, prop, desc, + throw): # Internal use only. External through Object + assert type(prop) == unicode + # takes Py, returns Py + # prop must be a Py string. Desc is either a descriptor or accessor. + # Messy method - raw translation from Ecma spec to prevent any bugs. # todo check this + current = self.get_own_property(prop) + + extensible = self.extensible + if not current: # We are creating a new OWN property + if not extensible: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + # extensible must be True + if is_data_descriptor(desc) or is_generic_descriptor(desc): + DEFAULT_DATA_DESC = { + 'value': undefined, # undefined + 'writable': False, + 'enumerable': False, + 'configurable': False + } + DEFAULT_DATA_DESC.update(desc) + self.own[prop] = DEFAULT_DATA_DESC + else: + DEFAULT_ACCESSOR_DESC = { + 'get': undefined, # undefined + 'set': undefined, # undefined + 'enumerable': False, + 'configurable': False + } + DEFAULT_ACCESSOR_DESC.update(desc) + self.own[prop] = DEFAULT_ACCESSOR_DESC + return True + # therefore current exists! + if not desc or desc == current: # We don't need to change anything. + return True + configurable = current['configurable'] + if not configurable: # Prevent changing params + if desc.get('configurable'): + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if 'enumerable' in desc and desc['enumerable'] != current[ + 'enumerable']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if is_generic_descriptor(desc): + pass + elif is_data_descriptor(current) != is_data_descriptor(desc): + # we want to change the current type of property + if not configurable: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if is_data_descriptor(current): # from data to setter + del current['value'] + del current['writable'] + current['set'] = undefined # undefined + current['get'] = undefined # undefined + else: # from setter to data + del current['set'] + del current['get'] + current['value'] = undefined # undefined + current['writable'] = False + elif is_data_descriptor(current) and is_data_descriptor(desc): + if not configurable: + if not current['writable'] and desc.get('writable'): + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if not current['writable'] and 'value' in desc and current[ + 'value'] != desc['value']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + elif is_accessor_descriptor(current) and is_accessor_descriptor(desc): + if not configurable: + if 'set' in desc and desc['set'] != current['set']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + if 'get' in desc and desc['get'] != current['get']: + if throw: + raise MakeError('TypeError', + 'Could not define own property') + return False + current.update(desc) + return True + + def create(self, args, space): + '''Generally not a constructor, raise an error''' + raise MakeError('TypeError', '%s is not a constructor' % self.Class) + + +def get_member( + self, prop, space +): # general member getter, prop has to be unconverted prop. it is it can be any value + typ = type(self) + if typ not in PRIMITIVES: # most likely getter for object + return self.get_member( + prop + ) # <- object can implement this to support faster prop getting. ex array. + elif typ == unicode: # then probably a String + if type(prop) == float and is_finite(prop): + index = int(prop) + if index == prop and 0 <= index < len(self): + return self[index] + s_prop = to_string(prop) + if s_prop == 'length': + return float(len(self)) + elif s_prop.isdigit(): + index = int(s_prop) + if 0 <= index < len(self): + return self[index] + # use standard string prototype + return space.StringPrototype.get(s_prop) + # maybe an index + elif typ == float: + # use standard number prototype + return space.NumberPrototype.get(to_string(prop)) + elif typ == bool: + return space.BooleanPrototype.get(to_string(prop)) + elif typ is UNDEFINED_TYPE: + raise MakeError('TypeError', + "Cannot read property '%s' of undefined" % prop) + elif typ is NULL_TYPE: + raise MakeError('TypeError', + "Cannot read property '%s' of null" % prop) + else: + raise RuntimeError('Unknown type! - ' + repr(typ)) + + +def get_member_dot(self, prop, space): + # dot member getter, prop has to be unicode + typ = type(self) + if typ not in PRIMITIVES: # most likely getter for object + return self.get(prop) + elif typ == unicode: # then probably a String + if prop == 'length': + return float(len(self)) + elif prop.isdigit(): + index = int(prop) + if 0 <= index < len(self): + return self[index] + else: + # use standard string prototype + return space.StringPrototype.get(prop) + # maybe an index + elif typ == float: + # use standard number prototype + return space.NumberPrototype.get(prop) + elif typ == bool: + return space.BooleanPrototype.get(prop) + elif typ in (UNDEFINED_TYPE, NULL_TYPE): + raise MakeError('TypeError', + "Cannot read property '%s' of undefined" % prop) + else: + raise RuntimeError('Unknown type! - ' + repr(typ)) + + +# Object + + +class PyJsObject(PyJs): + TYPE = 'Object' + Class = 'Object' + + def __init__(self, prototype=None): + self.prototype = prototype + self.own = {} + + def _init(self, props, vals): + i = 0 + for prop, kind in props: + if prop in self.own: # just check... probably will not happen very often. + if is_data_descriptor(self.own[prop]): + if kind != 'i': + raise MakeError( + 'SyntaxError', + 'Invalid object initializer! Duplicate property name "%s"' + % prop) + else: + if kind == 'i' or (kind == 'g' and 'get' in self.own[prop] + ) or (kind == 's' + and 'set' in self.own[prop]): + raise MakeError( + 'SyntaxError', + 'Invalid object initializer! Duplicate setter/getter of prop: "%s"' + % prop) + + if kind == 'i': # init + self.own[prop] = { + 'value': vals[i], + 'writable': True, + 'enumerable': True, + 'configurable': True + } + elif kind == 'g': # get + self.define_own_property(prop, { + 'get': vals[i], + 'enumerable': True, + 'configurable': True + }, False) + elif kind == 's': # get + self.define_own_property(prop, { + 'get': vals[i], + 'enumerable': True, + 'configurable': True + }, False) + else: + raise RuntimeError( + 'Invalid property kind - %s. Expected one of i, g, s.' % + repr(kind)) + i += 1 + + def _set_props(self, prop_descs): + for prop, desc in six.iteritems(prop_descs): + self.define_own_property(prop, desc) + + +# Array + + +# todo Optimise Array - extremely slow due to index conversions from str to int and back etc. +# solution - make get and put methods callable with any type of prop and handle conversions from inside +# if not array then use to_string(prop). In array if prop is integer then just use it +# also consider removal of these stupid writable, enumerable etc for ints. +class PyJsArray(PyJs): + Class = 'Array' + + def __init__(self, length, prototype=None): + self.prototype = prototype + self.own = { + 'length': { + 'value': float(length), + 'writable': True, + 'enumerable': False, + 'configurable': False + } + } + + def _init(self, elements): + for i, ele in enumerate(elements): + if ele is None: continue + self.own[unicode(i)] = { + 'value': ele, + 'writable': True, + 'enumerable': True, + 'configurable': True + } + + def put(self, prop, val, throw=False): + assert type(val) != int + # takes py, returns none + if not self.can_put(prop): + if throw: + raise MakeError('TypeError', 'Could not define own property') + return + own_desc = self.get_own_property(prop) + if is_data_descriptor(own_desc): + self.define_own_property(prop, {'value': val}, False) + return + desc = self.get_property(prop) + if is_accessor_descriptor(desc): + desc['set'].call( + self, (val, )) # calling setter on own or inherited element + else: # new property + self.define_own_property( + prop, { + 'value': val, + 'writable': True, + 'configurable': True, + 'enumerable': True + }, False) + + def define_own_property(self, prop, desc, throw): + assert type(desc.get('value')) != int + old_len_desc = self.get_own_property('length') + old_len = old_len_desc['value'] # value is js type so convert to py. + if prop == 'length': + if 'value' not in desc: + return PyJs.define_own_property(self, prop, desc, False) + new_len = to_uint32(desc['value']) + if new_len != to_number(desc['value']): + raise MakeError('RangeError', 'Invalid range!') + new_desc = dict((k, v) for k, v in six.iteritems(desc)) + new_desc['value'] = float(new_len) + if new_len >= old_len: + return PyJs.define_own_property(self, prop, new_desc, False) + if not old_len_desc['writable']: + return False + if 'writable' not in new_desc or new_desc['writable'] == True: + new_writable = True + else: + new_writable = False + new_desc['writable'] = True + if not PyJs.define_own_property(self, prop, new_desc, False): + return False + if new_len < old_len: + # not very efficient for sparse arrays, so using different method for sparse: + if old_len > 30 * len(self.own): + for ele in self.own.keys(): + if ele.isdigit() and int(ele) >= new_len: + if not self.delete( + ele + ): # if failed to delete set len to current len and reject. + new_desc['value'] = old_len + 1. + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property( + self, prop, new_desc, False) + return False + old_len = new_len + else: # standard method + while new_len < old_len: + old_len -= 1 + if not self.delete( + unicode(int(old_len)) + ): # if failed to delete set len to current len and reject. + new_desc['value'] = old_len + 1. + if not new_writable: + new_desc['writable'] = False + PyJs.define_own_property(self, prop, new_desc, + False) + return False + if not new_writable: + self.own['length']['writable'] = False + return True + + elif prop.isdigit(): + index = to_uint32(prop) + if index >= old_len and not old_len_desc['writable']: + return False + if not PyJs.define_own_property(self, prop, desc, False): + return False + if index >= old_len: + old_len_desc['value'] = index + 1. + return True + else: + return PyJs.define_own_property(self, prop, desc, False) + + def to_list(self): + return [ + self.get(str(e)) for e in xrange(self.get('length').to_uint32()) + ] + + +# database with compiled patterns. Js pattern -> Py pattern. +REGEXP_DB = {} + + +class PyJsRegExp(PyJs): + Class = 'RegExp' + + def __init__(self, body, flags, prototype=None): + self.prototype = prototype + self.glob = True if 'g' in flags else False + self.ignore_case = re.IGNORECASE if 'i' in flags else 0 + self.multiline = re.MULTILINE if 'm' in flags else 0 + self.value = body + + if (body, flags) in REGEXP_DB: + self.pat = REGEXP_DB[body, flags] + else: + comp = None + try: + # converting JS regexp pattern to Py pattern. + possible_fixes = [(u'[]', u'[\0]'), (u'[^]', u'[^\0]'), + (u'nofix1791', u'nofix1791')] + reg = self.value + for fix, rep in possible_fixes: + comp = PyJsParser()._interpret_regexp(reg, flags) + #print 'reg -> comp', reg, '->', comp + try: + self.pat = re.compile( + comp, self.ignore_case | self.multiline) + #print reg, '->', comp + break + except: + reg = reg.replace(fix, rep) + # print 'Fix', fix, '->', rep, '=', reg + else: + raise Exception() + REGEXP_DB[body, flags] = self.pat + except: + #print 'Invalid pattern...', self.value, comp + raise MakeError( + 'SyntaxError', + 'Invalid RegExp pattern: %s -> %s' % (repr(self.value), + repr(comp))) + # now set own properties: + self.own = { + 'source': { + 'value': self.value, + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'global': { + 'value': self.glob, + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'ignoreCase': { + 'value': bool(self.ignore_case), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'multiline': { + 'value': bool(self.multiline), + 'enumerable': False, + 'writable': False, + 'configurable': False + }, + 'lastIndex': { + 'value': 0., + 'enumerable': False, + 'writable': True, + 'configurable': False + } + } + + def match(self, string, pos): + '''string is of course a py string''' + return self.pat.match(string, int(pos)) + + +class PyJsError(PyJs): + Class = 'Error' + extensible = True + + def __init__(self, message=None, prototype=None): + self.prototype = prototype + self.own = {} + if message is not None: + self.put('message', to_string(message)) + self.own['message']['enumerable'] = False + + +class PyJsDate(PyJs): + Class = 'Date' + UTCToLocal = None # todo UTC to local should be imported! + + def __init__(self, value, prototype=None): + self.value = value + self.own = {} + self.prototype = prototype + + # todo fix this problematic datetime part + def to_local_dt(self): + return datetime.datetime.utcfromtimestamp( + self.UTCToLocal(self.value) // 1000) + + def to_utc_dt(self): + return datetime.datetime.utcfromtimestamp(self.value // 1000) + + def local_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_local_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + def utc_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_utc_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + +# Scope class it will hold all the variables accessible to user +class Scope(PyJs): + Class = 'Global' + extensible = True + IS_CHILD_SCOPE = True + THIS_BINDING = None + space = None + exe = None + + # todo speed up! + # in order to speed up this very important class the top scope should behave differently than + # child scopes, child scope should not have this property descriptor thing because they cant be changed anyway + # they are all confugurable= False + + def __init__(self, scope, space, parent=None): + """Doc""" + self.space = space + self.prototype = parent + if type(scope) is not dict: + assert parent is not None, 'You initialised the WITH_SCOPE without a parent scope.' + self.own = scope + self.is_with_scope = True + else: + self.is_with_scope = False + if parent is None: + # global, top level scope + self.own = {} + for k, v in six.iteritems(scope): + # set all the global items + self.define_own_property( + k, { + 'value': v, + 'configurable': False, + 'writable': False, + 'enumerable': False + }, False) + else: + # not global, less powerful but faster closure. + self.own = scope # simple dictionary which maps name directly to js object. + + self.par = super(Scope, self) + self.stack = [] + + def register(self, var): + # registered keeps only global registered variables + if self.prototype is None: + # define in global scope + if var in self.own: + self.own[var]['configurable'] = False + else: + self.define_own_property( + var, { + 'value': undefined, + 'configurable': False, + 'writable': True, + 'enumerable': True + }, False) + elif var not in self.own: + # define in local scope since it has not been defined yet + self.own[var] = undefined # default value + + def registers(self, vars): + """register multiple variables""" + for var in vars: + self.register(var) + + def put(self, var, val, throw=False): + if self.prototype is None: + desc = self.own.get(var) # global scope + if desc is None: + self.par.put(var, val, False) + else: + if desc['writable']: # todo consider getters/setters + desc['value'] = val + else: + if self.is_with_scope: + if self.own.has_property(var): + return self.own.put(var, val, throw=throw) + else: + return self.prototype.put(var, val) + # trying to put in local scope + # we dont know yet in which scope we should place this var + elif var in self.own: + self.own[var] = val + return val + else: + # try to put in the lower scope since we cant put in this one (var wasn't registered) + return self.prototype.put(var, val) + + def get(self, var, throw=False): + if self.prototype is not None: + if self.is_with_scope: + cand = None if not self.own.has_property( + var) else self.own.get(var) + else: + # fast local scope + cand = self.own.get(var) + if cand is None: + return self.prototype.get(var, throw) + return cand + # slow, global scope + if var not in self.own: + # try in ObjectPrototype... + if var in self.space.ObjectPrototype.own: + return self.space.ObjectPrototype.get(var) + if throw: + raise MakeError('ReferenceError', '%s is not defined' % var) + return undefined + cand = self.own[var].get('value') + return cand if cand is not None else self.own[var]['get'].call(self) + + def delete(self, var, throw=False): + if self.prototype is not None: + if self.is_with_scope: + if self.own.has_property(var): + return self.own.delete(var) + elif var in self.own: + return False + return self.prototype.delete(var) + # we are in global scope here. Must exist and be configurable to delete + if var not in self.own: + # this var does not exist, why do you want to delete it??? + return True + if self.own[var]['configurable']: + del self.own[var] + return True + # not configurable, cant delete + return False + + +def get_new_arguments_obj(args, space): + obj = space.NewObject() + obj.Class = 'Arguments' + obj.define_own_property( + 'length', { + 'value': float(len(args)), + 'writable': True, + 'enumerable': False, + 'configurable': True + }, False) + for i, e in enumerate(args): + obj.put(unicode(i), e) + return obj + + +#Function +class PyJsFunction(PyJs): + Class = 'Function' + source = '{ [native code] }' + IS_CONSTRUCTOR = True + + def __init__(self, + code, + ctx, + params, + name, + space, + is_declaration, + definitions, + prototype=None): + self.prototype = prototype + self.own = {} + + self.code = code + if type( + self.code + ) == int: # just a label pointing to the beginning of the code. + self.is_native = False + else: + self.is_native = True # python function + + self.ctx = ctx + + self.params = params + self.arguments_in_params = 'arguments' in params + self.definitions = definitions + + # todo remove this check later + for p in params: + assert p in self.definitions + + self.name = name + self.space = space + self.is_declaration = is_declaration + + #set own property length to the number of arguments + self.own['length'] = { + 'value': float(len(params)), + 'writable': False, + 'enumerable': False, + 'configurable': False + } + + if name: + self.own['name'] = { + 'value': name, + 'writable': False, + 'enumerable': False, + 'configurable': True + } + + if not self.is_native: # set prototype for user defined functions + # constructor points to this function + proto = space.NewObject() + proto.own['constructor'] = { + 'value': self, + 'writable': True, + 'enumerable': False, + 'configurable': True + } + self.own['prototype'] = { + 'value': proto, + 'writable': True, + 'enumerable': False, + 'configurable': False + } + # todo set up throwers on callee and arguments if in strict mode + + def call(self, this, args=()): + ''' Dont use this method from inside bytecode to call other bytecode. ''' + if self.is_native: + _args = SpaceTuple( + args + ) # we have to do that unfortunately to pass all the necessary info to the funcs + _args.space = self.space + return self.code( + this, _args + ) # must return valid js object - undefined, null, float, unicode, bool, or PyJs + else: + return self.space.exe._call(self, this, + args) # will run inside bytecode + + def has_instance(self, other): + # I am not sure here so instanceof may not work lol. + if not is_object(other): + return False + proto = self.get('prototype') + if not is_object(proto): + raise MakeError( + 'TypeError', + 'Function has non-object prototype in instanceof check') + while True: + other = other.prototype + if not other: # todo make sure that the condition is not None or null + return False + if other is proto: + return True + + def create(self, args, space): + proto = self.get('prototype') + if not is_object(proto): + proto = space.ObjectPrototype + new = PyJsObject(prototype=proto) + res = self.call(new, args) + if is_object(res): + return res + return new + + def _generate_my_context(self, this, args): + my_ctx = Scope( + dict(izip(self.params, args)), self.space, parent=self.ctx) + my_ctx.registers(self.definitions) + my_ctx.THIS_BINDING = this + if not self.arguments_in_params: + my_ctx.own['arguments'] = get_new_arguments_obj(args, self.space) + if not self.is_declaration and self.name and self.name not in my_ctx.own: + my_ctx.own[ + self. + name] = self # this should be immutable binding but come on! + return my_ctx + + +class SpaceTuple: + def __init__(self, tup): + self.tup = tup + + def __len__(self): + return len(self.tup) + + def __getitem__(self, item): + return self.tup[item] + + def __iter__(self): + return iter(self.tup) diff --git a/Contents/Libraries/Shared/js2py/internals/byte_trans.py b/Contents/Libraries/Shared/js2py/internals/byte_trans.py new file mode 100644 index 000000000..e32bcb1e2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/byte_trans.py @@ -0,0 +1,753 @@ +from .code import Code +from .simplex import MakeError +from .opcodes import * +from .operations import * +from .trans_utils import * + +SPECIAL_IDENTIFIERS = {'true', 'false', 'this'} + + +class ByteCodeGenerator: + def __init__(self, exe): + self.exe = exe + + self.declared_continue_labels = {} + self.declared_break_labels = {} + + self.implicit_breaks = [] + self.implicit_continues = [] + + self.declared_vars = [] + + self.function_declaration_tape = [] + + self.states = [] + + def record_state(self): + self.states.append( + (self.declared_continue_labels, self.declared_break_labels, + self.implicit_breaks, self.implicit_continues, self.declared_vars, + self.function_declaration_tape)) + self.declared_continue_labels, self.declared_break_labels, \ + self.implicit_breaks, self.implicit_continues, \ + self.declared_vars, self.function_declaration_tape = {}, {}, [], [], [], [] + + def restore_state(self): + self.declared_continue_labels, self.declared_break_labels, \ + self.implicit_breaks, self.implicit_continues, \ + self.declared_vars, self.function_declaration_tape = self.states.pop() + + def ArrayExpression(self, elements, **kwargs): + for e in elements: + if e is None: + self.emit('LOAD_NONE') + else: + self.emit(e) + self.emit('LOAD_ARRAY', len(elements)) + + def AssignmentExpression(self, operator, left, right, **kwargs): + operator = operator[:-1] + if left['type'] == 'MemberExpression': + self.emit(left['object']) + if left['computed']: + self.emit(left['property']) + self.emit(right) + if operator: + self.emit('STORE_MEMBER_OP', operator) + else: + self.emit('STORE_MEMBER') + else: + self.emit(right) + if operator: + self.emit('STORE_MEMBER_DOT_OP', left['property']['name'], + operator) + else: + self.emit('STORE_MEMBER_DOT', left['property']['name']) + elif left['type'] == 'Identifier': + if left['name'] in SPECIAL_IDENTIFIERS: + raise MakeError('SyntaxError', + 'Invalid left-hand side in assignment') + self.emit(right) + if operator: + self.emit('STORE_OP', left['name'], operator) + else: + self.emit('STORE', left['name']) + else: + raise MakeError('SyntaxError', + 'Invalid left-hand side in assignment') + + def BinaryExpression(self, operator, left, right, **kwargs): + self.emit(left) + self.emit(right) + self.emit('BINARY_OP', operator) + + def BlockStatement(self, body, **kwargs): + self._emit_statement_list(body) + + def BreakStatement(self, label, **kwargs): + if label is None: + self.emit('JUMP', self.implicit_breaks[-1]) + else: + label = label.get('name') + if label not in self.declared_break_labels: + raise MakeError('SyntaxError', + 'Undefined label \'%s\'' % label) + else: + self.emit('JUMP', self.declared_break_labels[label]) + + def CallExpression(self, callee, arguments, **kwargs): + if callee['type'] == 'MemberExpression': + self.emit(callee['object']) + if callee['computed']: + self.emit(callee['property']) + if arguments: + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', len(arguments)) + self.emit('CALL_METHOD') + else: + self.emit('CALL_METHOD_NO_ARGS') + else: + prop_name = to_key(callee['property']) + if arguments: + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', len(arguments)) + self.emit('CALL_METHOD_DOT', prop_name) + else: + self.emit('CALL_METHOD_DOT_NO_ARGS', prop_name) + else: + self.emit(callee) + if arguments: + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', len(arguments)) + self.emit('CALL') + else: + self.emit('CALL_NO_ARGS') + + def ClassBody(self, body, **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def ClassDeclaration(self, id, superClass, body, **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def ClassExpression(self, id, superClass, body, **kwargs): + raise NotImplementedError('Classes not available in ECMA 5.1') + + def ConditionalExpression(self, test, consequent, alternate, **kwargs): + alt = self.exe.get_new_label() + end = self.exe.get_new_label() + # ? + self.emit(test) + self.emit('JUMP_IF_FALSE', alt) + # first val + self.emit(consequent) + self.emit('JUMP', end) + # second val + self.emit('LABEL', alt) + self.emit(alternate) + # end of ?: statement + self.emit('LABEL', end) + + def ContinueStatement(self, label, **kwargs): + if label is None: + self.emit('JUMP', self.implicit_continues[-1]) + else: + label = label.get('name') + if label not in self.declared_continue_labels: + raise MakeError('SyntaxError', + 'Undefined label \'%s\'' % label) + else: + self.emit('JUMP', self.declared_continue_labels[label]) + + def DebuggerStatement(self, **kwargs): + self.EmptyStatement(**kwargs) + + def DoWhileStatement(self, body, test, **kwargs): + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + initial_do = self.exe.get_new_label() + + self.emit('JUMP', initial_do) + self.emit('LABEL', continue_label) + self.emit(test) + self.emit('JUMP_IF_FALSE', break_label) + self.emit('LABEL', initial_do) + + # translate the body, remember to add and afterwards remove implicit break/continue labels + + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + + self.emit('JUMP', continue_label) # loop back + self.emit('LABEL', break_label) + + def EmptyStatement(self, **kwargs): + # do nothing + pass + + def ExpressionStatement(self, expression, **kwargs): + # change the final stack value + # pop the previous value and execute expression + self.emit('POP') + self.emit(expression) + + def ForStatement(self, init, test, update, body, **kwargs): + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + first_start = self.exe.get_new_label() + + if init is not None: + self.emit(init) + if init['type'] != 'VariableDeclaration': + self.emit('POP') + + # skip first update and go straight to test + self.emit('JUMP', first_start) + + self.emit('LABEL', continue_label) + if update: + self.emit(update) + self.emit('POP') + self.emit('LABEL', first_start) + if test: + self.emit(test) + self.emit('JUMP_IF_FALSE', break_label) + + # translate the body, remember to add and afterwards to remove implicit break/continue labels + + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + + self.emit('JUMP', continue_label) # loop back + self.emit('LABEL', break_label) + + def ForInStatement(self, left, right, body, **kwargs): + # prepare the needed labels + body_start_label = self.exe.get_new_label() + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + + # prepare the name + if left['type'] == 'VariableDeclaration': + if len(left['declarations']) != 1: + raise MakeError( + 'SyntaxError', + ' Invalid left-hand side in for-in loop: Must have a single binding.' + ) + self.emit(left) + name = left['declarations'][0]['id']['name'] + elif left['type'] == 'Identifier': + name = left['name'] + else: + raise MakeError('SyntaxError', + 'Invalid left-hand side in for-loop') + + # prepare the iterable + self.emit(right) + + # emit ForIn Opcode + self.emit('FOR_IN', name, body_start_label, continue_label, + break_label) + + # a special continue position + self.emit('LABEL', continue_label) + self.emit('NOP') + + self.emit('LABEL', body_start_label) + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit('LOAD_UNDEFINED') + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + self.emit('NOP') + self.emit('LABEL', break_label) + self.emit('NOP') + + def FunctionDeclaration(self, id, params, defaults, body, **kwargs): + if defaults: + raise NotImplementedError('Defaults not available in ECMA 5.1') + + # compile function + self.record_state( + ) # cleans translator state and appends it to the stack so that it can be later restored + function_start = self.exe.get_new_label() + function_declarations = self.exe.get_new_label() + declarations_done = self.exe.get_new_label( + ) # put jump to this place at the and of function tape! + function_end = self.exe.get_new_label() + + # skip the function if encountered externally + self.emit('JUMP', function_end) + + self.emit('LABEL', function_start) + # call is made with empty stack so load undefined to fill it + self.emit('LOAD_UNDEFINED') + # declare all functions + self.emit('JUMP', function_declarations) + self.emit('LABEL', declarations_done) + self.function_declaration_tape.append(LABEL(function_declarations)) + + self.emit(body) + self.ReturnStatement(None) + + self.function_declaration_tape.append(JUMP(declarations_done)) + self.exe.tape.extend(self.function_declaration_tape) + + self.emit('LABEL', function_end) + declared_vars = self.declared_vars + self.restore_state() + + # create function object and append to stack + name = id.get('name') + assert name is not None + self.declared_vars.append(name) + self.function_declaration_tape.append( + LOAD_FUNCTION(function_start, tuple(p['name'] for p in params), + name, True, tuple(declared_vars))) + self.function_declaration_tape.append(STORE(name)) + self.function_declaration_tape.append(POP()) + + def FunctionExpression(self, id, params, defaults, body, **kwargs): + if defaults: + raise NotImplementedError('Defaults not available in ECMA 5.1') + + # compile function + self.record_state( + ) # cleans translator state and appends it to the stack so that it can be later restored + function_start = self.exe.get_new_label() + function_declarations = self.exe.get_new_label() + declarations_done = self.exe.get_new_label( + ) # put jump to this place at the and of function tape! + function_end = self.exe.get_new_label() + + # skip the function if encountered externally + self.emit('JUMP', function_end) + + self.emit('LABEL', function_start) + # call is made with empty stack so load undefined to fill it + self.emit('LOAD_UNDEFINED') + # declare all functions + self.emit('JUMP', function_declarations) + self.emit('LABEL', declarations_done) + self.function_declaration_tape.append(LABEL(function_declarations)) + + self.emit(body) + self.ReturnStatement(None) + + self.function_declaration_tape.append(JUMP(declarations_done)) + self.exe.tape.extend(self.function_declaration_tape) + + self.emit('LABEL', function_end) + declared_vars = self.declared_vars + self.restore_state() + + # create function object and append to stack + name = id.get('name') if id else None + self.emit('LOAD_FUNCTION', function_start, + tuple(p['name'] for p in params), name, False, + tuple(declared_vars)) + + def Identifier(self, name, **kwargs): + if name == 'true': + self.emit('LOAD_BOOLEAN', 1) + elif name == 'false': + self.emit('LOAD_BOOLEAN', 0) + elif name == 'undefined': + self.emit('LOAD_UNDEFINED') + else: + self.emit('LOAD', name) + + def IfStatement(self, test, consequent, alternate, **kwargs): + alt = self.exe.get_new_label() + end = self.exe.get_new_label() + # if + self.emit(test) + self.emit('JUMP_IF_FALSE', alt) + # consequent + self.emit(consequent) + self.emit('JUMP', end) + # alternate + self.emit('LABEL', alt) + if alternate is not None: + self.emit(alternate) + # end of if statement + self.emit('LABEL', end) + + def LabeledStatement(self, label, body, **kwargs): + label = label['name'] + if body['type'] in ('WhileStatement', 'DoWhileStatement', + 'ForStatement', 'ForInStatement'): + # Continue label available... Simply take labels defined by the loop. + # It is important that they request continue label first + self.declared_continue_labels[label] = self.exe._label_count + 1 + self.declared_break_labels[label] = self.exe._label_count + 2 + self.emit(body) + del self.declared_break_labels[label] + del self.declared_continue_labels[label] + else: + # only break label available + lbl = self.exe.get_new_label() + self.declared_break_labels[label] = lbl + self.emit(body) + self.emit('LABEL', lbl) + del self.declared_break_labels[label] + + def Literal(self, value, **kwargs): + if value is None: + self.emit('LOAD_NULL') + elif isinstance(value, bool): + self.emit('LOAD_BOOLEAN', int(value)) + elif isinstance(value, basestring): + self.emit('LOAD_STRING', unicode(value)) + elif isinstance(value, (float, int, long)): + self.emit('LOAD_NUMBER', float(value)) + elif isinstance(value, tuple): + self.emit('LOAD_REGEXP', *value) + else: + raise RuntimeError('Unsupported literal') + + def LogicalExpression(self, left, right, operator, **kwargs): + end = self.exe.get_new_label() + if operator == '&&': + # AND + self.emit(left) + self.emit('JUMP_IF_FALSE_WITHOUT_POP', end) + self.emit('POP') + self.emit(right) + self.emit('LABEL', end) + elif operator == '||': + # OR + self.emit(left) + self.emit('JUMP_IF_TRUE_WITHOUT_POP', end) + self.emit('POP') + self.emit(right) + self.emit('LABEL', end) + else: + raise RuntimeError("Unknown logical expression: %s" % operator) + + def MemberExpression(self, computed, object, property, **kwargs): + if computed: + self.emit(object) + self.emit(property) + self.emit('LOAD_MEMBER') + else: + self.emit(object) + self.emit('LOAD_MEMBER_DOT', property['name']) + + def NewExpression(self, callee, arguments, **kwargs): + self.emit(callee) + if arguments: + n = len(arguments) + for e in arguments: + self.emit(e) + self.emit('LOAD_N_TUPLE', n) + self.emit('NEW') + else: + self.emit('NEW_NO_ARGS') + + def ObjectExpression(self, properties, **kwargs): + data = [] + for prop in properties: + self.emit(prop['value']) + if prop['computed']: + raise NotImplementedError( + 'ECMA 5.1 does not support computed object properties!') + data.append((to_key(prop['key']), prop['kind'][0])) + self.emit('LOAD_OBJECT', tuple(data)) + + def Program(self, body, **kwargs): + old_tape_len = len(self.exe.tape) + self.emit('LOAD_UNDEFINED') + self.emit(body) + # add function tape ! + self.exe.tape = self.exe.tape[:old_tape_len] + self.function_declaration_tape + self.exe.tape[old_tape_len:] + + def Pyimport(self, imp, **kwargs): + raise NotImplementedError( + 'Not available for bytecode interpreter yet, use the Js2Py translator.' + ) + + def Property(self, kind, key, computed, value, method, shorthand, + **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def RestElement(self, argument, **kwargs): + raise NotImplementedError('Not available in ECMA 5.1') + + def ReturnStatement(self, argument, **kwargs): + self.emit('POP') # pop result of expression statements + if argument is None: + self.emit('LOAD_UNDEFINED') + else: + self.emit(argument) + self.emit('RETURN') + + def SequenceExpression(self, expressions, **kwargs): + for e in expressions: + self.emit(e) + self.emit('POP') + del self.exe.tape[-1] + + def SwitchCase(self, test, consequent, **kwargs): + raise NotImplementedError('Already implemented in SwitchStatement') + + def SwitchStatement(self, discriminant, cases, **kwargs): + self.emit(discriminant) + labels = [self.exe.get_new_label() for case in cases] + tests = [case['test'] for case in cases] + consequents = [case['consequent'] for case in cases] + end_of_switch = self.exe.get_new_label() + + # translate test cases + for test, label in zip(tests, labels): + if test is not None: + self.emit(test) + self.emit('JUMP_IF_EQ', label) + else: + self.emit('POP') + self.emit('JUMP', label) + # this will be executed if none of the cases worked + self.emit('POP') + self.emit('JUMP', end_of_switch) + + # translate consequents + self.implicit_breaks.append(end_of_switch) + for consequent, label in zip(consequents, labels): + self.emit('LABEL', label) + self._emit_statement_list(consequent) + self.implicit_breaks.pop() + + self.emit('LABEL', end_of_switch) + + def ThisExpression(self, **kwargs): + self.emit('LOAD_THIS') + + def ThrowStatement(self, argument, **kwargs): + # throw with the empty stack + self.emit('POP') + self.emit(argument) + self.emit('THROW') + + def TryStatement(self, block, handler, finalizer, **kwargs): + try_label = self.exe.get_new_label() + catch_label = self.exe.get_new_label() + finally_label = self.exe.get_new_label() + end_label = self.exe.get_new_label() + + self.emit('JUMP', end_label) + + # try block + self.emit('LABEL', try_label) + self.emit('LOAD_UNDEFINED') + self.emit(block) + self.emit( + 'NOP' + ) # needed to distinguish from break/continue vs some internal jumps + + # catch block + self.emit('LABEL', catch_label) + self.emit('LOAD_UNDEFINED') + if handler: + self.emit(handler['body']) + self.emit('NOP') + + # finally block + self.emit('LABEL', finally_label) + self.emit('LOAD_UNDEFINED') + if finalizer: + self.emit(finalizer) + self.emit('NOP') + + self.emit('LABEL', end_label) + + # give life to the code + self.emit('TRY_CATCH_FINALLY', try_label, catch_label, + handler['param']['name'] if handler else None, finally_label, + bool(finalizer), end_label) + + def UnaryExpression(self, operator, argument, **kwargs): + if operator == 'typeof' and argument[ + 'type'] == 'Identifier': # todo fix typeof + self.emit('TYPEOF', argument['name']) + elif operator == 'delete': + if argument['type'] == 'MemberExpression': + self.emit(argument['object']) + if argument['property']['type'] == 'Identifier': + self.emit('LOAD_STRING', + unicode(argument['property']['name'])) + else: + self.emit(argument['property']) + self.emit('DELETE_MEMBER') + elif argument['type'] == 'Identifier': + self.emit('DELETE', argument['name']) + else: + self.emit('LOAD_BOOLEAN', 1) + elif operator in UNARY_OPERATIONS: + self.emit(argument) + self.emit('UNARY_OP', operator) + else: + raise MakeError('SyntaxError', + 'Unknown unary operator %s' % operator) + + def UpdateExpression(self, operator, argument, prefix, **kwargs): + incr = int(operator == "++") + post = int(not prefix) + if argument['type'] == 'MemberExpression': + if argument['computed']: + self.emit(argument['object']) + self.emit(argument['property']) + self.emit('POSTFIX_MEMBER', post, incr) + else: + self.emit(argument['object']) + name = to_key(argument['property']) + self.emit('POSTFIX_MEMBER_DOT', post, incr, name) + elif argument['type'] == 'Identifier': + name = to_key(argument) + self.emit('POSTFIX', post, incr, name) + else: + raise MakeError('SyntaxError', + 'Invalid left-hand side in assignment') + + def VariableDeclaration(self, declarations, kind, **kwargs): + if kind != 'var': + raise NotImplementedError( + 'Only var variable declaration is supported by ECMA 5.1') + for d in declarations: + self.emit(d) + + def LexicalDeclaration(self, declarations, kind, **kwargs): + raise NotImplementedError('Not supported by ECMA 5.1') + + def VariableDeclarator(self, id, init, **kwargs): + name = id['name'] + if name in SPECIAL_IDENTIFIERS: + raise MakeError('Invalid left-hand side in assignment') + self.declared_vars.append(name) + if init is not None: + self.emit(init) + self.emit('STORE', name) + self.emit('POP') + + def WhileStatement(self, test, body, **kwargs): + continue_label = self.exe.get_new_label() + break_label = self.exe.get_new_label() + + self.emit('LABEL', continue_label) + self.emit(test) + self.emit('JUMP_IF_FALSE', break_label) + + # translate the body, remember to add and afterwards remove implicit break/continue labels + + self.implicit_continues.append(continue_label) + self.implicit_breaks.append(break_label) + self.emit(body) + self.implicit_continues.pop() + self.implicit_breaks.pop() + + self.emit('JUMP', continue_label) # loop back + self.emit('LABEL', break_label) + + def WithStatement(self, object, body, **kwargs): + beg_label = self.exe.get_new_label() + end_label = self.exe.get_new_label() + # scope + self.emit(object) + + # now the body + self.emit('JUMP', end_label) + self.emit('LABEL', beg_label) + self.emit('LOAD_UNDEFINED') + self.emit(body) + self.emit('NOP') + self.emit('LABEL', end_label) + + # with statement implementation + self.emit('WITH', beg_label, end_label) + + def _emit_statement_list(self, statements): + for statement in statements: + self.emit(statement) + + def emit(self, what, *args): + ''' what can be either name of the op, or node, or a list of statements.''' + if isinstance(what, basestring): + return self.exe.emit(what, *args) + elif isinstance(what, list): + self._emit_statement_list(what) + else: + return getattr(self, what['type'])(**what) + + +import os, codecs + + +def path_as_local(path): + if os.path.isabs(path): + return path + # relative to cwd + return os.path.join(os.getcwd(), path) + + +def get_file_contents(path_or_file): + if hasattr(path_or_file, 'read'): + js = path_or_file.read() + else: + with codecs.open(path_as_local(path_or_file), "r", "utf-8") as f: + js = f.read() + return js + + +def main(): + from space import Space + import fill_space + + from pyjsparser import parse + import json + a = ByteCodeGenerator(Code()) + + s = Space() + fill_space.fill_space(s, a) + + a.exe.space = s + s.exe = a.exe + con = get_file_contents('internals/esprima.js') + d = parse(con + ( + ''';JSON.stringify(exports.parse(%s), 4, 4)''' % json.dumps(con))) + # d = parse(''' + # function x(n) { + # log(n) + # return x(n+1) + # } + # x(0) + # ''') + + # var v = 333333; + # while (v) { + # v-- + # + # } + a.emit(d) + print(a.declared_vars) + print(a.exe.tape) + print(len(a.exe.tape)) + + a.exe.compile() + + def log(this, args): + print(args[0]) + return 999 + + print(a.exe.run(a.exe.space.GlobalObj)) + + +if __name__ == '__main__': + main() diff --git a/Contents/Libraries/Shared/js2py/internals/code.py b/Contents/Libraries/Shared/js2py/internals/code.py new file mode 100644 index 000000000..9af0e602b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/code.py @@ -0,0 +1,227 @@ +from .opcodes import * +from .space import * +from .base import * + + +class Code: + '''Can generate, store and run sequence of ops representing js code''' + + def __init__(self, is_strict=False, debug_mode=False): + self.tape = [] + self.compiled = False + self.label_locs = None + self.is_strict = is_strict + self.debug_mode = debug_mode + + self.contexts = [] + self.current_ctx = None + self.return_locs = [] + self._label_count = 0 + self.label_locs = None + + # useful references + self.GLOBAL_THIS = None + self.space = None + + # dbg + self.ctx_depth = 0 + + + def get_new_label(self): + self._label_count += 1 + return self._label_count + + def emit(self, op_code, *args): + ''' Adds op_code with specified args to tape ''' + self.tape.append(OP_CODES[op_code](*args)) + + def compile(self, start_loc=0): + ''' Records locations of labels and compiles the code ''' + self.label_locs = {} if self.label_locs is None else self.label_locs + loc = start_loc + while loc < len(self.tape): + if type(self.tape[loc]) == LABEL: + self.label_locs[self.tape[loc].num] = loc + del self.tape[loc] + continue + loc += 1 + self.compiled = True + + def _call(self, func, this, args): + ''' Calls a bytecode function func + NOTE: use !ONLY! when calling functions from native methods! ''' + assert not func.is_native + # fake call - the the runner to return to the end of the file + old_contexts = self.contexts + old_return_locs = self.return_locs + old_curr_ctx = self.current_ctx + + self.contexts = [FakeCtx()] + self.return_locs = [len(self.tape)] # target line after return + + # prepare my ctx + my_ctx = func._generate_my_context(this, args) + self.current_ctx = my_ctx + + # execute dunction + ret = self.run(my_ctx, starting_loc=self.label_locs[func.code]) + + # bring back old execution + self.current_ctx = old_curr_ctx + self.contexts = old_contexts + self.return_locs = old_return_locs + + return ret + + def execute_fragment_under_context(self, ctx, start_label, end_label): + ''' just like run but returns if moved outside of the specified fragment + # 4 different exectution results + # 0=normal, 1=return, 2=jump_outside, 3=errors + # execute_fragment_under_context returns: + # (return_value, typ, return_value/jump_loc/py_error) + # IMPARTANT: It is guaranteed that the length of the ctx.stack is unchanged. + ''' + old_curr_ctx = self.current_ctx + self.ctx_depth += 1 + old_stack_len = len(ctx.stack) + old_ret_len = len(self.return_locs) + old_ctx_len = len(self.contexts) + try: + self.current_ctx = ctx + return self._execute_fragment_under_context( + ctx, start_label, end_label) + except JsException as err: + if self.debug_mode: + self._on_fragment_exit("js errors") + # undo the things that were put on the stack (if any) to ensure a proper error recovery + del ctx.stack[old_stack_len:] + del self.return_locs[old_ret_len:] + del self.contexts[old_ctx_len :] + return undefined, 3, err + finally: + self.ctx_depth -= 1 + self.current_ctx = old_curr_ctx + assert old_stack_len == len(ctx.stack) + + def _get_dbg_indent(self): + return self.ctx_depth * ' ' + + def _on_fragment_exit(self, mode): + print(self._get_dbg_indent() + 'ctx exit (%s)' % mode) + + def _execute_fragment_under_context(self, ctx, start_label, end_label): + start, end = self.label_locs[start_label], self.label_locs[end_label] + initial_len = len(ctx.stack) + loc = start + entry_level = len(self.contexts) + # for e in self.tape[start:end]: + # print e + if self.debug_mode: + print(self._get_dbg_indent() + 'ctx entry (from:%d, to:%d)' % (start, end)) + while loc < len(self.tape): + if len(self.contexts) == entry_level and loc >= end: + if self.debug_mode: + self._on_fragment_exit('normal') + assert loc == end + delta_stack = len(ctx.stack) - initial_len + assert delta_stack == +1, 'Stack change must be equal to +1! got %d' % delta_stack + return ctx.stack.pop(), 0, None # means normal return + + # execute instruction + if self.debug_mode: + print(self._get_dbg_indent() + str(loc), self.tape[loc]) + status = self.tape[loc].eval(ctx) + + # check status for special actions + if status is not None: + if type(status) == int: # jump to label + loc = self.label_locs[status] + if len(self.contexts) == entry_level: + # check if jumped outside of the fragment and break if so + if not start <= loc < end: + if self.debug_mode: + self._on_fragment_exit('jump outside loc:%d label:%d' % (loc, status)) + delta_stack = len(ctx.stack) - initial_len + assert delta_stack == +1, 'Stack change must be equal to +1! got %d' % delta_stack + return ctx.stack.pop(), 2, status # jump outside + continue + + elif len(status) == 2: # a call or a return! + # call: (new_ctx, func_loc_label_num) + if status[0] is not None: + # append old state to the stack + self.contexts.append(ctx) + self.return_locs.append(loc + 1) + # set new state + loc = self.label_locs[status[1]] + ctx = status[0] + self.current_ctx = ctx + continue + + # return: (None, None) + else: + if len(self.contexts) == entry_level: + if self.debug_mode: + self._on_fragment_exit('return') + delta_stack = len(ctx.stack) - initial_len + assert delta_stack == +1, 'Stack change must be equal to +1! got %d' % delta_stack + return undefined, 1, ctx.stack.pop( + ) # return signal + return_value = ctx.stack.pop() + ctx = self.contexts.pop() + self.current_ctx = ctx + ctx.stack.append(return_value) + + loc = self.return_locs.pop() + continue + # next instruction + loc += 1 + if self.debug_mode: + self._on_fragment_exit('internal error - unexpected end of tape, will crash') + assert False, 'Remember to add NOP at the end!' + + def run(self, ctx, starting_loc=0): + loc = starting_loc + self.current_ctx = ctx + while loc < len(self.tape): + # execute instruction + if self.debug_mode: + print(loc, self.tape[loc]) + status = self.tape[loc].eval(ctx) + + # check status for special actions + if status is not None: + if type(status) == int: # jump to label + loc = self.label_locs[status] + continue + + elif len(status) == 2: # a call or a return! + # call: (new_ctx, func_loc_label_num) + if status[0] is not None: + # append old state to the stack + self.contexts.append(ctx) + self.return_locs.append(loc + 1) + # set new state + loc = self.label_locs[status[1]] + ctx = status[0] + self.current_ctx = ctx + continue + + # return: (None, None) + else: + return_value = ctx.stack.pop() + ctx = self.contexts.pop() + self.current_ctx = ctx + ctx.stack.append(return_value) + + loc = self.return_locs.pop() + continue + # next instruction + loc += 1 + assert len(ctx.stack) == 1, ctx.stack + return ctx.stack.pop() + + +class FakeCtx(object): + def __init__(self): + self.stack = [] diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/__init__.py b/Contents/Libraries/Shared/js2py/internals/constructors/__init__.py new file mode 100644 index 000000000..4bf956237 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py new file mode 100644 index 000000000..23364ce48 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsarray.py @@ -0,0 +1,28 @@ +from ..conversions import * +from ..func_utils import * + + +def Array(this, args): + return ArrayConstructor(args, args.space) + + +def ArrayConstructor(args, space): + if len(args) == 1: + l = get_arg(args, 0) + if type(l) == float: + if to_uint32(l) == l: + return space.NewArray(l) + else: + raise MakeError( + 'RangeError', + 'Invalid length specified for Array constructor (must be uint32)' + ) + else: + return space.ConstructArray([l]) + else: + return space.ConstructArray(list(args)) + + +def isArray(this, args): + x = get_arg(args, 0) + return is_object(x) and x.Class == u'Array' diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py new file mode 100644 index 000000000..17025d9f5 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsboolean.py @@ -0,0 +1,14 @@ +from ..conversions import * +from ..func_utils import * + + +def Boolean(this, args): + return to_boolean(get_arg(args, 0)) + + +def BooleanConstructor(args, space): + temp = space.NewObject() + temp.prototype = space.BooleanPrototype + temp.Class = 'Boolean' + temp.value = to_boolean(get_arg(args, 0)) + return temp diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py new file mode 100644 index 000000000..6840ba708 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsconsole.py @@ -0,0 +1,11 @@ +from __future__ import unicode_literals + +from js2py.internals.conversions import * +from js2py.internals.func_utils import * + + +class ConsoleMethods: + def log(this, args): + x = ' '.join(to_string(e) for e in args) + print(x) + return undefined diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py new file mode 100644 index 000000000..98de64319 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsdate.py @@ -0,0 +1,405 @@ +from ..base import * +from .time_helpers import * + +TZ_OFFSET = (time.altzone // 3600) +ABS_OFFSET = abs(TZ_OFFSET) +TZ_NAME = time.tzname[1] +ISO_FORMAT = '%s-%s-%sT%s:%s:%s.%sZ' + + +@Js +def Date(year, month, date, hours, minutes, seconds, ms): + return now().to_string() + + +Date.Class = 'Date' + + +def now(): + return PyJsDate(int(time.time() * 1000), prototype=DatePrototype) + + +@Js +def UTC(year, month, date, hours, minutes, seconds, ms): # todo complete this + args = arguments + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili))) + return PyJsDate(t, prototype=DatePrototype) + + +@Js +def parse(string): + return PyJsDate( + TimeClip(parse_date(string.to_string().value)), + prototype=DatePrototype) + + +Date.define_own_property('now', { + 'value': Js(now), + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('parse', { + 'value': parse, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + +Date.define_own_property('UTC', { + 'value': UTC, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) + + +class PyJsDate(PyJs): + Class = 'Date' + extensible = True + + def __init__(self, value, prototype=None): + self.value = value + self.own = {} + self.prototype = prototype + + # todo fix this problematic datetime part + def to_local_dt(self): + return datetime.datetime.utcfromtimestamp( + UTCToLocal(self.value) // 1000) + + def to_utc_dt(self): + return datetime.datetime.utcfromtimestamp(self.value // 1000) + + def local_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_local_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + def utc_strftime(self, pattern): + if self.value is NaN: + return 'Invalid Date' + try: + dt = self.to_utc_dt() + except: + raise MakeError( + 'TypeError', + 'unsupported date range. Will fix in future versions') + try: + return dt.strftime(pattern) + except: + raise MakeError( + 'TypeError', + 'Could not generate date string from this date (limitations of python.datetime)' + ) + + +def parse_date(py_string): # todo support all date string formats + try: + try: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%S.%fZ") + except: + dt = datetime.datetime.strptime(py_string, "%Y-%m-%dT%H:%M:%SZ") + return MakeDate( + MakeDay(Js(dt.year), Js(dt.month - 1), Js(dt.day)), + MakeTime( + Js(dt.hour), Js(dt.minute), Js(dt.second), + Js(dt.microsecond // 1000))) + except: + raise MakeError( + 'TypeError', + 'Could not parse date %s - unsupported date format. Currently only supported format is RFC3339 utc. Sorry!' + % py_string) + + +def date_constructor(*args): + if len(args) >= 2: + return date_constructor2(*args) + elif len(args) == 1: + return date_constructor1(args[0]) + else: + return date_constructor0() + + +def date_constructor0(): + return now() + + +def date_constructor1(value): + v = value.to_primitive() + if v._type() == 'String': + v = parse_date(v.value) + else: + v = v.to_int() + return PyJsDate(TimeClip(v), prototype=DatePrototype) + + +def date_constructor2(*args): + y = args[0].to_number() + m = args[1].to_number() + l = len(args) + dt = args[2].to_number() if l > 2 else Js(1) + h = args[3].to_number() if l > 3 else Js(0) + mi = args[4].to_number() if l > 4 else Js(0) + sec = args[5].to_number() if l > 5 else Js(0) + mili = args[6].to_number() if l > 6 else Js(0) + if not y.is_nan() and 0 <= y.value <= 99: + y = y + Js(1900) + t = TimeClip( + LocalToUTC(MakeDate(MakeDay(y, m, dt), MakeTime(h, mi, sec, mili)))) + return PyJsDate(t, prototype=DatePrototype) + + +Date.create = date_constructor + +DatePrototype = PyJsDate(float('nan'), prototype=ObjectPrototype) + + +def check_date(obj): + if obj.Class != 'Date': + raise MakeError('TypeError', 'this is not a Date object') + + +class DateProto: + def toString(): + check_date(this) + if this.value is NaN: + return 'Invalid Date' + offset = (UTCToLocal(this.value) - this.value) // msPerHour + return this.local_strftime( + '%a %b %d %Y %H:%M:%S GMT') + '%s00 (%s)' % (pad( + offset, 2, True), GetTimeZoneName(this.value)) + + def toDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def toLocaleString(): + check_date(this) + return this.local_strftime('%d %B %Y %H:%M:%S') + + def toLocaleDateString(): + check_date(this) + return this.local_strftime('%d %B %Y') + + def toLocaleTimeString(): + check_date(this) + return this.local_strftime('%H:%M:%S') + + def valueOf(): + check_date(this) + return this.value + + def getTime(): + check_date(this) + return this.value + + def getFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(UTCToLocal(this.value)) + + def getUTCFullYear(): + check_date(this) + if this.value is NaN: + return NaN + return YearFromTime(this.value) + + def getMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(UTCToLocal(this.value)) + + def getDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(UTCToLocal(this.value)) + + def getUTCMonth(): + check_date(this) + if this.value is NaN: + return NaN + return MonthFromTime(this.value) + + def getUTCDate(): + check_date(this) + if this.value is NaN: + return NaN + return DateFromTime(this.value) + + def getDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(UTCToLocal(this.value)) + + def getUTCDay(): + check_date(this) + if this.value is NaN: + return NaN + return WeekDay(this.value) + + def getHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(UTCToLocal(this.value)) + + def getUTCHours(): + check_date(this) + if this.value is NaN: + return NaN + return HourFromTime(this.value) + + def getMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(UTCToLocal(this.value)) + + def getUTCMinutes(): + check_date(this) + if this.value is NaN: + return NaN + return MinFromTime(this.value) + + def getSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(UTCToLocal(this.value)) + + def getUTCSeconds(): + check_date(this) + if this.value is NaN: + return NaN + return SecFromTime(this.value) + + def getMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(UTCToLocal(this.value)) + + def getUTCMilliseconds(): + check_date(this) + if this.value is NaN: + return NaN + return msFromTime(this.value) + + def getTimezoneOffset(): + check_date(this) + if this.value is NaN: + return NaN + return (this.value - UTCToLocal(this.value)) // 60000 + + def setTime(time): + check_date(this) + this.value = TimeClip(time.to_number().to_int()) + return this.value + + def setMilliseconds(ms): + check_date(this) + t = UTCToLocal(this.value) + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(LocalToUTC(MakeDate(Day(t), tim))) + this.value = u + return u + + def setUTCMilliseconds(ms): + check_date(this) + t = this.value + tim = MakeTime( + HourFromTime(t), MinFromTime(t), SecFromTime(t), ms.to_int()) + u = TimeClip(MakeDate(Day(t), tim)) + this.value = u + return u + + # todo Complete all setters! + + def toUTCString(): + check_date(this) + return this.utc_strftime('%d %B %Y %H:%M:%S') + + def toISOString(): + check_date(this) + t = this.value + year = YearFromTime(t) + month, day, hour, minute, second, milli = pad( + MonthFromTime(t) + 1), pad(DateFromTime(t)), pad( + HourFromTime(t)), pad(MinFromTime(t)), pad( + SecFromTime(t)), pad(msFromTime(t)) + return ISO_FORMAT % (unicode(year) if 0 <= year <= 9999 else pad( + year, 6, True), month, day, hour, minute, second, milli) + + def toJSON(key): + o = this.to_object() + tv = o.to_primitive('Number') + if tv.Class == 'Number' and not tv.is_finite(): + return this.null + toISO = o.get('toISOString') + if not toISO.is_callable(): + raise this.MakeError('TypeError', 'toISOString is not callable') + return toISO.call(o, ()) + + +def pad(num, n=2, sign=False): + '''returns n digit string representation of the num''' + s = unicode(abs(num)) + if len(s) < n: + s = '0' * (n - len(s)) + s + if not sign: + return s + if num >= 0: + return '+' + s + else: + return '-' + s + + +fill_prototype(DatePrototype, DateProto, default_attrs) + +Date.define_own_property( + 'prototype', { + 'value': DatePrototype, + 'enumerable': False, + 'writable': False, + 'configurable': False + }) + +DatePrototype.define_own_property('constructor', { + 'value': Date, + 'enumerable': False, + 'writable': True, + 'configurable': True +}) diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py new file mode 100644 index 000000000..d62731ac3 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsfunction.py @@ -0,0 +1,76 @@ +from ..base import * +from ..conversions import * +from ..func_utils import * +from pyjsparser import parse +from ..byte_trans import ByteCodeGenerator, Code + + +def Function(this, args): + # convert arguments to python list of strings + a = map(to_string, tuple(args)) + _body = u';' + _args = () + if len(a): + _body = u'%s;' % a[-1] + _args = a[:-1] + return executable_function(_body, _args, args.space, global_context=True) + + +def executable_function(_body, _args, space, global_context=True): + func_str = u'(function (%s) { ; %s ; });' % (u', '.join(_args), _body) + + co = executable_code( + code_str=func_str, space=space, global_context=global_context) + return co() + + +# you can use this one lovely piece of function to compile and execute code on the fly! Watch out though as it may generate lots of code. +# todo tape cleanup? we dont know which pieces are needed and which are not so rather impossible without smarter machinery something like GC, +# a one solution would be to have a separate tape for functions +def executable_code(code_str, space, global_context=True): + # parse first to check if any SyntaxErrors + parsed = parse(code_str) + + old_tape_len = len(space.byte_generator.exe.tape) + space.byte_generator.record_state() + start = space.byte_generator.exe.get_new_label() + skip = space.byte_generator.exe.get_new_label() + space.byte_generator.emit('JUMP', skip) + space.byte_generator.emit('LABEL', start) + space.byte_generator.emit(parsed) + space.byte_generator.emit('NOP') + space.byte_generator.emit('LABEL', skip) + space.byte_generator.emit('NOP') + space.byte_generator.restore_state() + + space.byte_generator.exe.compile( + start_loc=old_tape_len + ) # dont read the code from the beginning, dont be stupid! + + ctx = space.GlobalObj if global_context else space.exe.current_ctx + + def ex_code(): + ret, status, token = space.byte_generator.exe.execute_fragment_under_context( + ctx, start, skip) + # todo Clean up the tape! + # this is NOT a way to do that because the fragment may contain the executable code! We dont want to remove it + #del space.byte_generator.exe.tape[old_tape_len:] + if status == 0: + return ret + elif status == 3: + raise token + else: + raise RuntimeError( + 'Unexpected return status during JIT execution: %d' % status) + + return ex_code + + +def _eval(this, args): + code_str = to_string(get_arg(args, 0)) + return executable_code(code_str, args.space, global_context=True)() + + +def log(this, args): + print(' '.join(map(to_string, args))) + return undefined diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py new file mode 100644 index 000000000..3eb44616b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsmath.py @@ -0,0 +1,157 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + +import math +import random + +CONSTANTS = { + 'E': 2.7182818284590452354, + 'LN10': 2.302585092994046, + 'LN2': 0.6931471805599453, + 'LOG2E': 1.4426950408889634, + 'LOG10E': 0.4342944819032518, + 'PI': 3.1415926535897932, + 'SQRT1_2': 0.7071067811865476, + 'SQRT2': 1.4142135623730951 +} + + +class MathFunctions: + def abs(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return abs(a) + + def acos(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return math.acos(a) + except: + return NaN + + def asin(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return math.asin(a) + except: + return NaN + + def atan(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return math.atan(a) + + def atan2(this, args): + x = get_arg(args, 0) + y = get_arg(args, 1) + a = to_number(x) + b = to_number(y) + if a != a or b != b: # it must be a nan + return NaN + return math.atan2(a, b) + + def ceil(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return float(math.ceil(a)) + + def floor(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return float(math.floor(a)) + + def round(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return float(round(a)) + + def sin(this, args): + x = get_arg(args, 0) + a = to_number(x) + if not is_finite(a): # it must be a nan + return NaN + return math.sin(a) + + def cos(this, args): + x = get_arg(args, 0) + a = to_number(x) + if not is_finite(a): # it must be a nan + return NaN + return math.cos(a) + + def tan(this, args): + x = get_arg(args, 0) + a = to_number(x) + if not is_finite(a): # it must be a nan + return NaN + return math.tan(a) + + def log(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return math.log(a) + except: + return NaN + + def exp(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + return math.exp(a) + + def pow(this, args): + x = get_arg(args, 0) + y = get_arg(args, 1) + a = to_number(x) + b = to_number(y) + if a != a or b != b: # it must be a nan + return NaN + try: + return a**b + except: + return NaN + + def sqrt(this, args): + x = get_arg(args, 0) + a = to_number(x) + if a != a: # it must be a nan + return NaN + try: + return a**0.5 + except: + return NaN + + def min(this, args): + if len(args) == 0: + return Infinity + return min(map(to_number, tuple(args))) + + def max(this, args): + if len(args) == 0: + return -Infinity + return max(map(to_number, tuple(args))) + + def random(this, args): + return random.random() diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py new file mode 100644 index 000000000..276b7cfad --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsnumber.py @@ -0,0 +1,27 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + + +def Number(this, args): + if len(args) == 0: + return 0. + return to_number(args[0]) + + +def NumberConstructor(args, space): + temp = space.NewObject() + temp.prototype = space.NumberPrototype + temp.Class = 'Number' + temp.value = float(to_number(get_arg(args, 0)) if len(args) > 0 else 0.) + return temp + + +CONSTS = { + 'MAX_VALUE': 1.7976931348623157e308, + 'MIN_VALUE': 5.0e-324, + 'NaN': NaN, + 'NEGATIVE_INFINITY': Infinity, + 'POSITIVE_INFINITY': -Infinity +} diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py new file mode 100644 index 000000000..06fdbbb05 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsobject.py @@ -0,0 +1,204 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..base import is_data_descriptor +import six + + +def Object(this, args): + val = get_arg(args, 0) + if is_null(val) or is_undefined(val): + return args.space.NewObject() + return to_object(val, args.space) + + +def ObjectCreate(args, space): + if len(args): + val = get_arg(args, 0) + if is_object(val): + # Implementation dependent, but my will simply return :) + return val + elif type(val) in (NUMBER_TYPE, STRING_TYPE, BOOLEAN_TYPE): + return to_object(val, space) + return space.NewObject() + + +class ObjectMethods: + def getPrototypeOf(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.getPrototypeOf called on non-object') + return null if obj.prototype is None else obj.prototype + + def getOwnPropertyDescriptor(this, args): + obj = get_arg(args, 0) + prop = get_arg(args, 1) + if not is_object(obj): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + desc = obj.own.get(to_string(prop)) + return convert_to_js_type(desc, args.space) + + def getOwnPropertyNames(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError( + 'TypeError', + 'Object.getOwnPropertyDescriptor called on non-object') + return args.space.ConstructArray(obj.own.keys()) + + def create(this, args): + obj = get_arg(args, 0) + if not (is_object(obj) or is_null(obj)): + raise MakeError('TypeError', + 'Object prototype may only be an Object or null') + temp = args.space.NewObject() + temp.prototype = None if is_null(obj) else obj + if len(args) > 1 and not is_undefined(args[1]): + if six.PY2: + args.tup = (args[1], ) + ObjectMethods.defineProperties.__func__(temp, args) + else: + args.tup = (args[1], ) + ObjectMethods.defineProperties(temp, args) + return temp + + def defineProperty(this, args): + obj = get_arg(args, 0) + prop = get_arg(args, 1) + attrs = get_arg(args, 2) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.defineProperty called on non-object') + name = to_string(prop) + if not obj.define_own_property(name, ToPropertyDescriptor(attrs), + False): + raise MakeError('TypeError', 'Cannot redefine property: %s' % name) + return obj + + def defineProperties(this, args): + obj = get_arg(args, 0) + properties = get_arg(args, 1) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.defineProperties called on non-object') + props = to_object(properties, args.space) + for k, v in props.own.items(): + if not v.get('enumerable'): + continue + desc = ToPropertyDescriptor(props.get(unicode(k))) + if not obj.define_own_property(unicode(k), desc, False): + raise MakeError('TypeError', + 'Failed to define own property: %s' % k) + return obj + + def seal(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', 'Object.seal called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + obj.extensible = False + return obj + + def freeze(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', 'Object.freeze called on non-object') + for desc in obj.own.values(): + desc['configurable'] = False + if is_data_descriptor(desc): + desc['writable'] = False + obj.extensible = False + return obj + + def preventExtensions(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.preventExtensions on non-object') + obj.extensible = False + return obj + + def isSealed(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.isSealed called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc.get('configurable'): + return False + return True + + def isFrozen(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.isFrozen called on non-object') + if obj.extensible: + return False + for desc in obj.own.values(): + if desc.get('configurable'): + return False + if is_data_descriptor(desc) and desc.get('writable'): + return False + return True + + def isExtensible(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', + 'Object.isExtensible called on non-object') + return obj.extensible + + def keys(this, args): + obj = get_arg(args, 0) + if not is_object(obj): + raise MakeError('TypeError', 'Object.keys called on non-object') + return args.space.ConstructArray([ + unicode(e) for e, d in six.iteritems(obj.own) + if d.get('enumerable') + ]) + + +# some utility functions: + + +def ToPropertyDescriptor(obj): # page 38 (50 absolute) + if not is_object(obj): + raise MakeError('TypeError', + 'Can\'t convert non-object to property descriptor') + desc = {} + if obj.has_property('enumerable'): + desc['enumerable'] = to_boolean(obj.get('enumerable')) + if obj.has_property('configurable'): + desc['configurable'] = to_boolean(obj.get('configurable')) + if obj.has_property('value'): + desc['value'] = obj.get('value') + if obj.has_property('writable'): + desc['writable'] = to_boolean(obj.get('writable')) + if obj.has_property('get'): + cand = obj.get('get') + if not (is_undefined(cand) or is_callable(cand)): + raise MakeError( + 'TypeError', + 'Invalid getter (it has to be a function or undefined)') + desc['get'] = cand + if obj.has_property('set'): + cand = obj.get('set') + if not (is_undefined(cand) or is_callable(cand)): + raise MakeError( + 'TypeError', + 'Invalid setter (it has to be a function or undefined)') + desc['set'] = cand + if ('get' in desc or 'set' in desc) and ('value' in desc + or 'writable' in desc): + raise MakeError( + 'TypeError', + 'Invalid property. A property cannot both have accessors and be writable or have a value.' + ) + return desc diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py new file mode 100644 index 000000000..7b264fdb6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsregexp.py @@ -0,0 +1,41 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..base import SpaceTuple + +REG_EXP_FLAGS = ('g', 'i', 'm') + + +def RegExp(this, args): + pattern = get_arg(args, 0) + flags = get_arg(args, 1) + if GetClass(pattern) == 'RegExp': + if not is_undefined(flags): + raise MakeError( + 'TypeError', + 'Cannot supply flags when constructing one RegExp from another' + ) + # return unchanged + return pattern + #pattern is not a regexp + if is_undefined(pattern): + pattern = u'' + else: + pattern = to_string(pattern) + flags = to_string(flags) if not is_undefined(flags) else u'' + for flag in flags: + if flag not in REG_EXP_FLAGS: + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flag) + if len(set(flags)) != len(flags): + raise MakeError( + 'SyntaxError', + 'Invalid flags supplied to RegExp constructor "%s"' % flags) + return args.space.NewRegExp(pattern, flags) + + +def RegExpCreate(args, space): + _args = SpaceTuple(args) + _args.space = space + return RegExp(undefined, _args) diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py b/Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py new file mode 100644 index 000000000..f2b43831b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/jsstring.py @@ -0,0 +1,23 @@ +from ..conversions import * +from ..func_utils import * + + +def fromCharCode(this, args): + res = u'' + for e in args: + res += unichr(to_uint16(e)) + return res + + +def String(this, args): + if len(args) == 0: + return u'' + return to_string(args[0]) + + +def StringConstructor(args, space): + temp = space.NewObject() + temp.prototype = space.StringPrototype + temp.Class = 'String' + temp.value = to_string(get_arg(args, 0)) if len(args) > 0 else u'' + return temp diff --git a/Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py b/Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py new file mode 100644 index 000000000..eda95fb60 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/constructors/time_helpers.py @@ -0,0 +1,209 @@ +from __future__ import unicode_literals + +# NOTE: t must be INT!!! +import time +import datetime +import warnings + +try: + from tzlocal import get_localzone + LOCAL_ZONE = get_localzone() +except: # except all problems... + warnings.warn( + 'Please install or fix tzlocal library (pip install tzlocal) in order to make Date object work better. Otherwise I will assume DST is in effect all the time' + ) + + class LOCAL_ZONE: + @staticmethod + def dst(*args): + return 1 + + +from js2py.base import MakeError +CUM = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +msPerDay = 86400000 +msPerYear = int(86400000 * 365.242) +msPerSecond = 1000 +msPerMinute = 60000 +msPerHour = 3600000 +HoursPerDay = 24 +MinutesPerHour = 60 +SecondsPerMinute = 60 +NaN = float('nan') +LocalTZA = -time.timezone * msPerSecond + + +def DaylightSavingTA(t): + if t is NaN: + return t + try: + return int( + LOCAL_ZONE.dst(datetime.datetime.utcfromtimestamp( + t // 1000)).seconds) * 1000 + except: + warnings.warn( + 'Invalid datetime date, assumed DST time, may be inaccurate...', + Warning) + return 1 + #raise MakeError('TypeError', 'date not supported by python.datetime. I will solve it in future versions') + + +def GetTimeZoneName(t): + return time.tzname[DaylightSavingTA(t) > 0] + + +def LocalToUTC(t): + return t - LocalTZA - DaylightSavingTA(t - LocalTZA) + + +def UTCToLocal(t): + return t + LocalTZA + DaylightSavingTA(t) + + +def Day(t): + return t // 86400000 + + +def TimeWithinDay(t): + return t % 86400000 + + +def DaysInYear(y): + if y % 4: + return 365 + elif y % 100: + return 366 + elif y % 400: + return 365 + else: + return 366 + + +def DayFromYear(y): + return 365 * (y - 1970) + (y - 1969) // 4 - (y - 1901) // 100 + ( + y - 1601) // 400 + + +def TimeFromYear(y): + return 86400000 * DayFromYear(y) + + +def YearFromTime(t): + guess = 1970 - t // 31556908800 # msPerYear + gt = TimeFromYear(guess) + if gt <= t: + while gt <= t: + guess += 1 + gt = TimeFromYear(guess) + return guess - 1 + else: + while gt > t: + guess -= 1 + gt = TimeFromYear(guess) + return guess + + +def DayWithinYear(t): + return Day(t) - DayFromYear(YearFromTime(t)) + + +def InLeapYear(t): + y = YearFromTime(t) + if y % 4: + return 0 + elif y % 100: + return 1 + elif y % 400: + return 0 + else: + return 1 + + +def MonthFromTime(t): + day = DayWithinYear(t) + leap = InLeapYear(t) + if day < 31: + return 0 + day -= leap + if day < 59: + return 1 + elif day < 90: + return 2 + elif day < 120: + return 3 + elif day < 151: + return 4 + elif day < 181: + return 5 + elif day < 212: + return 6 + elif day < 243: + return 7 + elif day < 273: + return 8 + elif day < 304: + return 9 + elif day < 334: + return 10 + else: + return 11 + + +def DateFromTime(t): + mon = MonthFromTime(t) + day = DayWithinYear(t) + return day - CUM[mon] - (1 if InLeapYear(t) and mon >= 2 else 0) + 1 + + +def WeekDay(t): + # 0 == sunday + return (Day(t) + 4) % 7 + + +def msFromTime(t): + return t % 1000 + + +def SecFromTime(t): + return (t // 1000) % 60 + + +def MinFromTime(t): + return (t // 60000) % 60 + + +def HourFromTime(t): + return (t // 3600000) % 24 + + +def MakeTime(hour, Min, sec, ms): + # takes PyJs objects and returns t + if not (hour.is_finite() and Min.is_finite() and sec.is_finite() + and ms.is_finite()): + return NaN + h, m, s, milli = hour.to_int(), Min.to_int(), sec.to_int(), ms.to_int() + return h * 3600000 + m * 60000 + s * 1000 + milli + + +def MakeDay(year, month, date): + # takes PyJs objects and returns t + if not (year.is_finite() and month.is_finite() and date.is_finite()): + return NaN + y, m, dt = year.to_int(), month.to_int(), date.to_int() + y += m // 12 + mn = m % 12 + d = DayFromYear(y) + CUM[mn] + dt - 1 + (1 if DaysInYear(y) == 366 + and mn >= 2 else 0) + return d # ms per day + + +def MakeDate(day, time): + return 86400000 * day + time + + +def TimeClip(t): + if t != t or abs(t) == float('inf'): + return NaN + if abs(t) > 8.64 * 10**15: + return NaN + return int(t) diff --git a/Contents/Libraries/Shared/js2py/internals/conversions.py b/Contents/Libraries/Shared/js2py/internals/conversions.py new file mode 100644 index 000000000..8b2c7c308 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/conversions.py @@ -0,0 +1,141 @@ +from __future__ import unicode_literals +# Type Conversions. to_type. All must return PyJs subclass instance +from .simplex import * + + +def to_primitive(self, hint=None): + if is_primitive(self): + return self + if hint is None and (self.Class == 'Number' or self.Class == 'Boolean'): + # favour number for Class== Number or Boolean default = String + hint = 'Number' + return self.default_value(hint) + + +def to_boolean(self): + typ = Type(self) + if typ == 'Boolean': # no need to convert + return self + elif typ == 'Null' or typ == 'Undefined': # they are both always false + return False + elif typ == 'Number': # false only for 0, and NaN + return self and self == self # test for nan (nan -> flase) + elif typ == 'String': + return bool(self) + else: # object - always True + return True + + +def to_number(self): + typ = Type(self) + if typ == 'Number': # or self.Class=='Number': # no need to convert + return self + elif typ == 'Null': # null is 0 + return 0. + elif typ == 'Undefined': # undefined is NaN + return NaN + elif typ == 'Boolean': # 1 for True 0 for false + return float(self) + elif typ == 'String': + s = self.strip() # Strip white space + if not s: # '' is simply 0 + return 0. + if 'x' in s or 'X' in s[:3]: # hex (positive only) + try: # try to convert + num = int(s, 16) + except ValueError: # could not convert -> NaN + return NaN + return float(num) + sign = 1 # get sign + if s[0] in '+-': + if s[0] == '-': + sign = -1 + s = s[1:] + if s == 'Infinity': # Check for infinity keyword. 'NaN' will be NaN anyway. + return sign * Infinity + try: # decimal try + num = sign * float(s) # Converted + except ValueError: + return NaN # could not convert to decimal > return NaN + return float(num) + else: # object - most likely it will be NaN. + return to_number(to_primitive(self, 'Number')) + + +def to_string(self): + typ = Type(self) + if typ == 'String': + return self + elif typ == 'Null': + return 'null' + elif typ == 'Undefined': + return 'undefined' + elif typ == 'Boolean': + return 'true' if self else 'false' + elif typ == 'Number': # or self.Class=='Number': + return js_dtoa(self) + else: # object + return to_string(to_primitive(self, 'String')) + + +def to_object(self, space): + typ = Type(self) + if typ == 'Object': + return self + elif typ == 'Boolean': # Unsure ... todo check here + return space.Boolean.create((self, ), space) + elif typ == 'Number': # ? + return space.Number.create((self, ), space) + elif typ == 'String': # ? + return space.String.create((self, ), space) + elif typ == 'Null' or typ == 'Undefined': + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') + else: + raise RuntimeError() + + +def to_int32(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + int32 = int(num) % 2**32 + return int(int32 - 2**32 if int32 >= 2**31 else int32) + + +def to_int(self): + num = to_number(self) + if is_nan(num): + return 0 + elif is_infinity(num): + return 10**20 if num > 0 else -10**20 + return int(num) + + +def to_uint32(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + return int(num) % 2**32 + + +def to_uint16(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + return int(num) % 2**16 + + +def to_int16(self): + num = to_number(self) + if is_nan(num) or is_infinity(num): + return 0 + int16 = int(num) % 2**16 + return int(int16 - 2**16 if int16 >= 2**15 else int16) + + +def cok(self): + """Check object coercible""" + if type(self) in (UNDEFINED_TYPE, NULL_TYPE): + raise MakeError('TypeError', + 'undefined or null can\'t be converted to object') diff --git a/Contents/Libraries/Shared/js2py/internals/desc.py b/Contents/Libraries/Shared/js2py/internals/desc.py new file mode 100644 index 000000000..e81179c28 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/desc.py @@ -0,0 +1,90 @@ +# todo make sure what they mean by desc undefined? None or empty? Answer: None :) it can never be empty but None is sometimes returned. + +# I am implementing everything as dicts to speed up property creation + +# Warning: value, get, set props of dest are PyJs types. Rest is Py! + + +def is_data_descriptor(desc): + return desc and ('value' in desc or 'writable' in desc) + + +def is_accessor_descriptor(desc): + return desc and ('get' in desc or 'set' in desc) + + +def is_generic_descriptor( + desc +): # generic means not the data and not the setter - therefore it must be one that changes only enum and conf + return desc and not (is_data_descriptor(desc) + or is_accessor_descriptor(desc)) + + +def from_property_descriptor(desc, space): + if not desc: + return {} + obj = space.NewObject() + if is_data_descriptor(desc): + obj.define_own_property( + 'value', { + 'value': desc['value'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'writable', { + 'value': desc['writable'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + else: + obj.define_own_property( + 'get', { + 'value': desc['get'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'set', { + 'value': desc['set'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'writable', { + 'value': desc['writable'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + obj.define_own_property( + 'enumerable', { + 'value': desc['enumerable'], + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + return obj + + +def to_property_descriptor(obj): + if obj._type() != 'Object': + raise TypeError() + desc = {} + for e in ('enumerable', 'configurable', 'writable'): + if obj.has_property(e): + desc[e] = obj.get(e).to_boolean().value + if obj.has_property('value'): + desc['value'] = obj.get('value') + for e in ('get', 'set'): + if obj.has_property(e): + cand = obj.get(e) + if not (cand.is_callable() or cand.is_undefined()): + raise TypeError() + if ('get' in desc or 'set' in desc) and ('value' in desc + or 'writable' in desc): + raise TypeError() diff --git a/Contents/Libraries/Shared/js2py/internals/fill_space.py b/Contents/Libraries/Shared/js2py/internals/fill_space.py new file mode 100644 index 000000000..329c8b28f --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/fill_space.py @@ -0,0 +1,281 @@ +from __future__ import unicode_literals + +from .base import Scope +from .func_utils import * +from .conversions import * +import six +from .prototypes.jsboolean import BooleanPrototype +from .prototypes.jserror import ErrorPrototype +from .prototypes.jsfunction import FunctionPrototype +from .prototypes.jsnumber import NumberPrototype +from .prototypes.jsobject import ObjectPrototype +from .prototypes.jsregexp import RegExpPrototype +from .prototypes.jsstring import StringPrototype +from .prototypes.jsarray import ArrayPrototype +from .prototypes import jsjson +from .prototypes import jsutils + +from .constructors import jsnumber, jsstring, jsarray, jsboolean, jsregexp, jsmath, jsobject, jsfunction, jsconsole + + + +def fill_proto(proto, proto_class, space): + for i in dir(proto_class): + e = getattr(proto_class, i) + if six.PY2: + if hasattr(e, '__func__'): + meth = e.__func__ + else: + continue + else: + if hasattr(e, '__call__') and not i.startswith('__'): + meth = e + else: + continue + meth_name = meth.__name__.strip('_') # RexExp._exec -> RegExp.exec + js_meth = space.NewFunction(meth, space.ctx, (), meth_name, False, ()) + set_non_enumerable(proto, meth_name, js_meth) + return proto + + +def easy_func(f, space): + return space.NewFunction(f, space.ctx, (), f.__name__, False, ()) + + +def Empty(this, args): + return undefined + + +def set_non_enumerable(obj, name, prop): + obj.define_own_property( + unicode(name), { + 'value': prop, + 'writable': True, + 'enumerable': False, + 'configurable': True + }, True) + + +def set_protected(obj, name, prop): + obj.define_own_property( + unicode(name), { + 'value': prop, + 'writable': False, + 'enumerable': False, + 'configurable': False + }, True) + + +def fill_space(space, byte_generator): + # set global scope + global_scope = Scope({}, space, parent=None) + global_scope.THIS_BINDING = global_scope + global_scope.registers(byte_generator.declared_vars) + space.GlobalObj = global_scope + + space.byte_generator = byte_generator + + # first init all protos, later take care of constructors and details + + # Function must be first obviously, we have to use a small trick to do that... + function_proto = space.NewFunction(Empty, space.ctx, (), 'Empty', False, + ()) + space.FunctionPrototype = function_proto # this will fill the prototypes of the methods! + fill_proto(function_proto, FunctionPrototype, space) + + # Object next + object_proto = space.NewObject() # no proto + fill_proto(object_proto, ObjectPrototype, space) + space.ObjectPrototype = object_proto + function_proto.prototype = object_proto + + # Number + number_proto = space.NewObject() + number_proto.prototype = object_proto + fill_proto(number_proto, NumberPrototype, space) + number_proto.value = 0. + number_proto.Class = 'Number' + space.NumberPrototype = number_proto + + # String + string_proto = space.NewObject() + string_proto.prototype = object_proto + fill_proto(string_proto, StringPrototype, space) + string_proto.value = u'' + string_proto.Class = 'String' + space.StringPrototype = string_proto + + # Boolean + boolean_proto = space.NewObject() + boolean_proto.prototype = object_proto + fill_proto(boolean_proto, BooleanPrototype, space) + boolean_proto.value = False + boolean_proto.Class = 'Boolean' + space.BooleanPrototype = boolean_proto + + # Array + array_proto = space.NewArray(0) + array_proto.prototype = object_proto + fill_proto(array_proto, ArrayPrototype, space) + space.ArrayPrototype = array_proto + + # JSON + json = space.NewObject() + json.put(u'stringify', easy_func(jsjson.stringify, space)) + json.put(u'parse', easy_func(jsjson.parse, space)) + + # Utils + parseFloat = easy_func(jsutils.parseFloat, space) + parseInt = easy_func(jsutils.parseInt, space) + isNaN = easy_func(jsutils.isNaN, space) + isFinite = easy_func(jsutils.isFinite, space) + + # Error + error_proto = space.NewError(u'Error', u'') + error_proto.prototype = object_proto + error_proto.put(u'name', u'Error') + fill_proto(error_proto, ErrorPrototype, space) + space.ErrorPrototype = error_proto + + def construct_constructor(typ): + def creator(this, args): + message = get_arg(args, 0) + if not is_undefined(message): + msg = to_string(message) + else: + msg = u'' + return space.NewError(typ, msg) + + j = easy_func(creator, space) + j.name = unicode(typ) + + set_protected(j, 'prototype', space.ERROR_TYPES[typ]) + + set_non_enumerable(space.ERROR_TYPES[typ], 'constructor', j) + + def new_create(args, space): + message = get_arg(args, 0) + if not is_undefined(message): + msg = to_string(message) + else: + msg = u'' + return space.NewError(typ, msg) + + j.create = new_create + return j + + # fill remaining error types + error_constructors = {} + for err_type_name in (u'Error', u'EvalError', u'RangeError', + u'ReferenceError', u'SyntaxError', u'TypeError', + u'URIError'): + extra_err = space.NewError(u'Error', u'') + extra_err.put(u'name', err_type_name) + setattr(space, err_type_name + u'Prototype', extra_err) + error_constructors[err_type_name] = construct_constructor( + err_type_name) + + assert space.TypeErrorPrototype is not None + + # RegExp + regexp_proto = space.NewRegExp(u'(?:)', u'') + regexp_proto.prototype = object_proto + fill_proto(regexp_proto, RegExpPrototype, space) + space.RegExpPrototype = regexp_proto + + # Json + + # now all these boring constructors... + + # Number + number = easy_func(jsnumber.Number, space) + space.Number = number + number.create = jsnumber.NumberConstructor + set_non_enumerable(number_proto, 'constructor', number) + set_protected(number, 'prototype', number_proto) + # number has some extra constants + for k, v in jsnumber.CONSTS.items(): + set_protected(number, k, v) + + # String + string = easy_func(jsstring.String, space) + space.String = string + string.create = jsstring.StringConstructor + set_non_enumerable(string_proto, 'constructor', string) + set_protected(string, 'prototype', string_proto) + # string has an extra function + set_non_enumerable(string, 'fromCharCode', + easy_func(jsstring.fromCharCode, space)) + + # Boolean + boolean = easy_func(jsboolean.Boolean, space) + space.Boolean = boolean + boolean.create = jsboolean.BooleanConstructor + set_non_enumerable(boolean_proto, 'constructor', boolean) + set_protected(boolean, 'prototype', boolean_proto) + + # Array + array = easy_func(jsarray.Array, space) + space.Array = array + array.create = jsarray.ArrayConstructor + set_non_enumerable(array_proto, 'constructor', array) + set_protected(array, 'prototype', array_proto) + array.put(u'isArray', easy_func(jsarray.isArray, space)) + + # RegExp + regexp = easy_func(jsregexp.RegExp, space) + space.RegExp = regexp + regexp.create = jsregexp.RegExpCreate + set_non_enumerable(regexp_proto, 'constructor', regexp) + set_protected(regexp, 'prototype', regexp_proto) + + # Object + _object = easy_func(jsobject.Object, space) + space.Object = _object + _object.create = jsobject.ObjectCreate + set_non_enumerable(object_proto, 'constructor', _object) + set_protected(_object, 'prototype', object_proto) + fill_proto(_object, jsobject.ObjectMethods, space) + + # Function + function = easy_func(jsfunction.Function, space) + space.Function = function + + # Math + math = space.NewObject() + math.Class = 'Math' + fill_proto(math, jsmath.MathFunctions, space) + for k, v in jsmath.CONSTANTS.items(): + set_protected(math, k, v) + + console = space.NewObject() + fill_proto(console, jsconsole.ConsoleMethods, space) + + # set global object + builtins = { + 'String': string, + 'Number': number, + 'Boolean': boolean, + 'RegExp': regexp, + 'exports': convert_to_js_type({}, space), + 'Math': math, + #'Date', + 'Object': _object, + 'Function': function, + 'JSON': json, + 'Array': array, + 'parseFloat': parseFloat, + 'parseInt': parseInt, + 'isFinite': isFinite, + 'isNaN': isNaN, + 'eval': easy_func(jsfunction._eval, space), + 'console': console, + 'log': console.get(u'log'), + } + + builtins.update(error_constructors) + + set_protected(global_scope, 'NaN', NaN) + set_protected(global_scope, 'Infinity', Infinity) + for k, v in builtins.items(): + set_non_enumerable(global_scope, k, v) diff --git a/Contents/Libraries/Shared/js2py/internals/func_utils.py b/Contents/Libraries/Shared/js2py/internals/func_utils.py new file mode 100644 index 000000000..58dfef9ee --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/func_utils.py @@ -0,0 +1,73 @@ +from .simplex import * +from .conversions import * + +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def get_arg(arguments, n): + if len(arguments) <= n: + return undefined + return arguments[n] + + +def ensure_js_types(args, space=None): + return tuple(convert_to_js_type(e, space=space) for e in args) + + +def convert_to_js_type(e, space=None): + t = type(e) + if is_js_type(e): + return e + if t in (int, long, float): + return float(e) + elif isinstance(t, basestring): + return unicode(t) + elif t in (list, tuple): + if space is None: + raise MakeError( + 'TypeError', + 'Actually an internal error, could not convert to js type because space not specified' + ) + return space.ConstructArray(ensure_js_types(e, space=space)) + elif t == dict: + if space is None: + raise MakeError( + 'TypeError', + 'Actually an internal error, could not convert to js type because space not specified' + ) + new = {} + for k, v in e.items(): + new[to_string(convert_to_js_type(k, space))] = convert_to_js_type( + v, space) + return space.ConstructObject(new) + else: + raise MakeError('TypeError', 'Could not convert to js type!') + + +def is_js_type(e): + if type(e) in PRIMITIVES: + return True + elif hasattr(e, 'Class') and hasattr(e, 'value'): # not perfect but works + return True + else: + return False + + +# todo optimise these 2! +def js_array_to_tuple(arr): + length = to_uint32(arr.get(u'length')) + return tuple(arr.get(unicode(e)) for e in xrange(length)) + + +def js_array_to_list(arr): + length = to_uint32(arr.get(u'length')) + return [arr.get(unicode(e)) for e in xrange(length)] + + +def js_arr_length(arr): + return to_uint32(arr.get(u'length')) diff --git a/Contents/Libraries/Shared/js2py/internals/gen.py b/Contents/Libraries/Shared/js2py/internals/gen.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/js2py/internals/opcodes.py b/Contents/Libraries/Shared/js2py/internals/opcodes.py new file mode 100644 index 000000000..15c57ccd1 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/opcodes.py @@ -0,0 +1,805 @@ +from .operations import * +from .base import get_member, get_member_dot, PyJsFunction, Scope + + +class OP_CODE(object): + _params = [] + + # def eval(self, ctx): + # raise + + def __repr__(self): + return self.__class__.__name__ + str( + tuple([getattr(self, e) for e in self._params])) + + +# --------------------- UNARY ---------------------- + + +class UNARY_OP(OP_CODE): + _params = ['operator'] + + def __init__(self, operator): + self.operator = operator + + def eval(self, ctx): + val = ctx.stack.pop() + ctx.stack.append(UNARY_OPERATIONS[self.operator](val)) + + +# special unary operations + + +class TYPEOF(OP_CODE): + _params = ['identifier'] + + def __init__(self, identifier): + self.identifier = identifier + + def eval(self, ctx): + # typeof something_undefined does not throw reference error + val = ctx.get(self.identifier, + False) # <= this makes it slightly different! + ctx.stack.append(typeof_uop(val)) + + +class POSTFIX(OP_CODE): + _params = ['cb', 'ca', 'identifier'] + + def __init__(self, post, incr, identifier): + self.identifier = identifier + self.cb = 1 if incr else -1 + self.ca = -self.cb if post else 0 + + def eval(self, ctx): + target = to_number(ctx.get(self.identifier)) + self.cb + ctx.put(self.identifier, target) + ctx.stack.append(target + self.ca) + + +class POSTFIX_MEMBER(OP_CODE): + _params = ['cb', 'ca'] + + def __init__(self, post, incr): + self.cb = 1 if incr else -1 + self.ca = -self.cb if post else 0 + + def eval(self, ctx): + name = ctx.stack.pop() + left = ctx.stack.pop() + + target = to_number(get_member(left, name, ctx.space)) + self.cb + if type(left) not in PRIMITIVES: + left.put_member(name, target) + + ctx.stack.append(target + self.ca) + + +class POSTFIX_MEMBER_DOT(OP_CODE): + _params = ['cb', 'ca', 'prop'] + + def __init__(self, post, incr, prop): + self.cb = 1 if incr else -1 + self.ca = -self.cb if post else 0 + self.prop = prop + + def eval(self, ctx): + left = ctx.stack.pop() + + target = to_number(get_member_dot(left, self.prop, + ctx.space)) + self.cb + if type(left) not in PRIMITIVES: + left.put(self.prop, target) + + ctx.stack.append(target + self.ca) + + +class DELETE(OP_CODE): + _params = ['name'] + + def __init__(self, name): + self.name = name + + def eval(self, ctx): + ctx.stack.append(ctx.delete(self.name)) + + +class DELETE_MEMBER(OP_CODE): + def eval(self, ctx): + prop = to_string(ctx.stack.pop()) + obj = to_object(ctx.stack.pop(), ctx) + ctx.stack.append(obj.delete(prop, False)) + + +# --------------------- BITWISE ---------------------- + + +class BINARY_OP(OP_CODE): + _params = ['operator'] + + def __init__(self, operator): + self.operator = operator + + def eval(self, ctx): + right = ctx.stack.pop() + left = ctx.stack.pop() + ctx.stack.append(BINARY_OPERATIONS[self.operator](left, right)) + + +# &&, || and conditional are implemented in bytecode + +# --------------------- JUMPS ---------------------- + + +# simple label that will be removed from code after compilation. labels ID will be translated +# to source code position. +class LABEL(OP_CODE): + _params = ['num'] + + def __init__(self, num): + self.num = num + + +# I implemented interpreter in the way that when an integer is returned by eval operation the execution will jump +# to the location of the label (it is loc = label_locations[label]) + + +class BASE_JUMP(OP_CODE): + _params = ['label'] + + def __init__(self, label): + self.label = label + + +class JUMP(BASE_JUMP): + def eval(self, ctx): + return self.label + + +class JUMP_IF_TRUE(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack.pop() + if to_boolean(val): + return self.label + + +class JUMP_IF_EQ(BASE_JUMP): + # this one is used in switch statement - compares last 2 values using === operator and jumps popping both if true else pops last. + def eval(self, ctx): + cmp = ctx.stack.pop() + if strict_equality_op(ctx.stack[-1], cmp): + ctx.stack.pop() + return self.label + + +class JUMP_IF_TRUE_WITHOUT_POP(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack[-1] + if to_boolean(val): + return self.label + + +class JUMP_IF_FALSE(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack.pop() + if not to_boolean(val): + return self.label + + +class JUMP_IF_FALSE_WITHOUT_POP(BASE_JUMP): + def eval(self, ctx): + val = ctx.stack[-1] + if not to_boolean(val): + return self.label + + +class POP(OP_CODE): + def eval(self, ctx): + # todo remove this check later + assert len(ctx.stack), 'Popped from empty stack!' + del ctx.stack[-1] + + +# class REDUCE(OP_CODE): +# def eval(self, ctx): +# assert len(ctx.stack)==2 +# ctx.stack[0] = ctx.stack[1] +# del ctx.stack[1] + +# --------------- LOADING -------------- + + +class LOAD_NONE(OP_CODE): # be careful with this :) + _params = [] + + def eval(self, ctx): + ctx.stack.append(None) + + +class LOAD_N_TUPLE( + OP_CODE +): # loads the tuple composed of n last elements on stack. elements are popped. + _params = ['n'] + + def __init__(self, n): + self.n = n + + def eval(self, ctx): + tup = tuple(ctx.stack[-self.n:]) + del ctx.stack[-self.n:] + ctx.stack.append(tup) + + +class LOAD_UNDEFINED(OP_CODE): + def eval(self, ctx): + ctx.stack.append(undefined) + + +class LOAD_NULL(OP_CODE): + def eval(self, ctx): + ctx.stack.append(null) + + +class LOAD_BOOLEAN(OP_CODE): + _params = ['val'] + + def __init__(self, val): + assert val in (0, 1) + self.val = bool(val) + + def eval(self, ctx): + ctx.stack.append(self.val) + + +class LOAD_STRING(OP_CODE): + _params = ['val'] + + def __init__(self, val): + assert isinstance(val, basestring) + self.val = unicode(val) + + def eval(self, ctx): + ctx.stack.append(self.val) + + +class LOAD_NUMBER(OP_CODE): + _params = ['val'] + + def __init__(self, val): + assert isinstance(val, (float, int, long)) + self.val = float(val) + + def eval(self, ctx): + ctx.stack.append(self.val) + + +class LOAD_REGEXP(OP_CODE): + _params = ['body', 'flags'] + + def __init__(self, body, flags): + self.body = body + self.flags = flags + + def eval(self, ctx): + # we have to generate a new regexp - they are mutable + ctx.stack.append(ctx.space.NewRegExp(self.body, self.flags)) + + +class LOAD_FUNCTION(OP_CODE): + _params = ['start', 'params', 'name', 'is_declaration', 'definitions'] + + def __init__(self, start, params, name, is_declaration, definitions): + assert type(start) == int + self.start = start # its an ID of label pointing to the beginning of the function bytecode + self.params = params + self.name = name + self.is_declaration = bool(is_declaration) + self.definitions = tuple(set(definitions + params)) + + def eval(self, ctx): + ctx.stack.append( + ctx.space.NewFunction(self.start, ctx, self.params, self.name, + self.is_declaration, self.definitions)) + + +class LOAD_OBJECT(OP_CODE): + _params = [ + 'props' + ] # props are py string pairs (prop_name, kind): kind can be either i, g or s. (init, get, set) + + def __init__(self, props): + self.num = len(props) + self.props = props + + def eval(self, ctx): + obj = ctx.space.NewObject() + if self.num: + obj._init(self.props, ctx.stack[-self.num:]) + del ctx.stack[-self.num:] + + ctx.stack.append(obj) + + +class LOAD_ARRAY(OP_CODE): + _params = ['num'] + + def __init__(self, num): + self.num = num + + def eval(self, ctx): + arr = ctx.space.NewArray(self.num) + if self.num: + arr._init(ctx.stack[-self.num:]) + del ctx.stack[-self.num:] + ctx.stack.append(arr) + + +class LOAD_THIS(OP_CODE): + def eval(self, ctx): + ctx.stack.append(ctx.THIS_BINDING) + + +class LOAD(OP_CODE): # todo check! + _params = ['identifier'] + + def __init__(self, identifier): + self.identifier = identifier + + # 11.1.2 + def eval(self, ctx): + ctx.stack.append(ctx.get(self.identifier, throw=True)) + + +class LOAD_MEMBER(OP_CODE): + def eval(self, ctx): + prop = ctx.stack.pop() + obj = ctx.stack.pop() + ctx.stack.append(get_member(obj, prop, ctx.space)) + + +class LOAD_MEMBER_DOT(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + obj = ctx.stack.pop() + ctx.stack.append(get_member_dot(obj, self.prop, ctx.space)) + + +# --------------- STORING -------------- + + +class STORE(OP_CODE): + _params = ['identifier'] + + def __init__(self, identifier): + self.identifier = identifier + + def eval(self, ctx): + value = ctx.stack[-1] # don't pop + ctx.put(self.identifier, value) + + +class STORE_MEMBER(OP_CODE): + def eval(self, ctx): + value = ctx.stack.pop() + name = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + prop = to_string(name) + if typ == NULL_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of null" % prop) + elif typ == UNDEFINED_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of undefined" % prop) + # just ignore... + else: + left.put_member(name, value) + + ctx.stack.append(value) + + +class STORE_MEMBER_DOT(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + value = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + if typ == NULL_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of null" % self.prop) + elif typ == UNDEFINED_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of undefined" % self.prop) + # just ignore... + else: + left.put(self.prop, value) + ctx.stack.append(value) + + +class STORE_OP(OP_CODE): + _params = ['identifier', 'op'] + + def __init__(self, identifier, op): + self.identifier = identifier + self.op = op + + def eval(self, ctx): + value = ctx.stack.pop() + new_value = BINARY_OPERATIONS[self.op](ctx.get(self.identifier), value) + ctx.put(self.identifier, new_value) + ctx.stack.append(new_value) + + +class STORE_MEMBER_OP(OP_CODE): + _params = ['op'] + + def __init__(self, op): + self.op = op + + def eval(self, ctx): + value = ctx.stack.pop() + name = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + if typ is NULL_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of null" % to_string(name)) + elif typ is UNDEFINED_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of undefined" % to_string(name)) + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member( + left, name, ctx.space), value)) + return + else: + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member( + left, name, ctx.space), value)) + left.put_member(name, ctx.stack[-1]) + + +class STORE_MEMBER_DOT_OP(OP_CODE): + _params = ['prop', 'op'] + + def __init__(self, prop, op): + self.prop = prop + self.op = op + + def eval(self, ctx): + value = ctx.stack.pop() + left = ctx.stack.pop() + + typ = type(left) + if typ in PRIMITIVES: + if typ == NULL_TYPE: + raise MakeError('TypeError', + "Cannot set property '%s' of null" % self.prop) + elif typ == UNDEFINED_TYPE: + raise MakeError( + 'TypeError', + "Cannot set property '%s' of undefined" % self.prop) + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member_dot( + left, self.prop, ctx.space), value)) + return + else: + ctx.stack.append(BINARY_OPERATIONS[self.op](get_member_dot( + left, self.prop, ctx.space), value)) + left.put(self.prop, ctx.stack[-1]) + + +# --------------- CALLS -------------- + + +def bytecode_call(ctx, func, this, args): + if type(func) is not PyJsFunction: + raise MakeError('TypeError', "%s is not a function" % Type(func)) + if func.is_native: # call to built-in function or method + ctx.stack.append(func.call(this, args)) + return None + + # therefore not native. we have to return (new_context, function_label) to instruct interpreter to call + return func._generate_my_context(this, args), func.code + + +class CALL(OP_CODE): + def eval(self, ctx): + args = ctx.stack.pop() + func = ctx.stack.pop() + + return bytecode_call(ctx, func, ctx.space.GlobalObj, args) + + +class CALL_METHOD(OP_CODE): + def eval(self, ctx): + args = ctx.stack.pop() + prop = ctx.stack.pop() + base = ctx.stack.pop() + + func = get_member(base, prop, ctx.space) + + return bytecode_call(ctx, func, base, args) + + +class CALL_METHOD_DOT(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + args = ctx.stack.pop() + base = ctx.stack.pop() + + func = get_member_dot(base, self.prop, ctx.space) + + return bytecode_call(ctx, func, base, args) + + +class CALL_NO_ARGS(OP_CODE): + def eval(self, ctx): + func = ctx.stack.pop() + + return bytecode_call(ctx, func, ctx.space.GlobalObj, ()) + + +class CALL_METHOD_NO_ARGS(OP_CODE): + def eval(self, ctx): + prop = ctx.stack.pop() + base = ctx.stack.pop() + + func = get_member(base, prop, ctx.space) + + return bytecode_call(ctx, func, base, ()) + + +class CALL_METHOD_DOT_NO_ARGS(OP_CODE): + _params = ['prop'] + + def __init__(self, prop): + self.prop = prop + + def eval(self, ctx): + base = ctx.stack.pop() + + func = get_member_dot(base, self.prop, ctx.space) + + return bytecode_call(ctx, func, base, ()) + + +class NOP(OP_CODE): + def eval(self, ctx): + pass + + +class RETURN(OP_CODE): + def eval( + self, ctx + ): # remember to load the return value on stack before using RETURN op. + return (None, None) + + +class NEW(OP_CODE): + def eval(self, ctx): + args = ctx.stack.pop() + constructor = ctx.stack.pop() + if type(constructor) in PRIMITIVES or not hasattr( + constructor, 'create'): + raise MakeError('TypeError', + '%s is not a constructor' % Type(constructor)) + ctx.stack.append(constructor.create(args, space=ctx.space)) + + +class NEW_NO_ARGS(OP_CODE): + def eval(self, ctx): + constructor = ctx.stack.pop() + if type(constructor) in PRIMITIVES or not hasattr( + constructor, 'create'): + raise MakeError('TypeError', + '%s is not a constructor' % Type(constructor)) + ctx.stack.append(constructor.create((), space=ctx.space)) + + +# --------------- EXCEPTIONS -------------- + + +class THROW(OP_CODE): + def eval(self, ctx): + raise MakeError(None, None, ctx.stack.pop()) + + +class TRY_CATCH_FINALLY(OP_CODE): + _params = [ + 'try_label', 'catch_label', 'catch_variable', 'finally_label', + 'finally_present', 'end_label' + ] + + def __init__(self, try_label, catch_label, catch_variable, finally_label, + finally_present, end_label): + self.try_label = try_label + self.catch_label = catch_label + self.catch_variable = catch_variable + self.finally_label = finally_label + self.finally_present = finally_present + self.end_label = end_label + + def eval(self, ctx): + # 4 different exectution results + # 0=normal, 1=return, 2=jump_outside, 3=errors + # execute_fragment_under_context returns: + # (return_value, typ, jump_loc/error) + + ctx.stack.pop() + + # execute try statement + try_status = ctx.space.exe.execute_fragment_under_context( + ctx, self.try_label, self.catch_label) + + errors = try_status[1] == 3 + + # catch + if errors and self.catch_variable is not None: + # generate catch block context... + catch_context = Scope({ + self.catch_variable: + try_status[2].get_thrown_value(ctx.space) + }, ctx.space, ctx) + catch_context.THIS_BINDING = ctx.THIS_BINDING + catch_status = ctx.space.exe.execute_fragment_under_context( + catch_context, self.catch_label, self.finally_label) + else: + catch_status = None + + # finally + if self.finally_present: + finally_status = ctx.space.exe.execute_fragment_under_context( + ctx, self.finally_label, self.end_label) + else: + finally_status = None + + # now return controls + other_status = catch_status or try_status + if finally_status is None or (finally_status[1] == 0 + and other_status[1] != 0): + winning_status = other_status + else: + winning_status = finally_status + + val, typ, spec = winning_status + if typ == 0: # normal + ctx.stack.append(val) + return + elif typ == 1: # return + ctx.stack.append(spec) + return None, None # send return signal + elif typ == 2: # jump outside + ctx.stack.append(val) + return spec + elif typ == 3: + # throw is made with empty stack as usual + raise spec + else: + raise RuntimeError('Invalid return code') + + +# ------------ WITH + ITERATORS ---------- + + +class WITH(OP_CODE): + _params = ['beg_label', 'end_label'] + + def __init__(self, beg_label, end_label): + self.beg_label = beg_label + self.end_label = end_label + + def eval(self, ctx): + obj = to_object(ctx.stack.pop(), ctx.space) + + with_context = Scope( + obj, ctx.space, ctx) # todo actually use the obj to modify the ctx + with_context.THIS_BINDING = ctx.THIS_BINDING + status = ctx.space.exe.execute_fragment_under_context( + with_context, self.beg_label, self.end_label) + + val, typ, spec = status + + if typ != 3: # exception + ctx.stack.pop() + + if typ == 0: # normal + ctx.stack.append(val) + return + elif typ == 1: # return + ctx.stack.append(spec) + return None, None # send return signal + elif typ == 2: # jump outside + ctx.stack.append(val) + return spec + elif typ == 3: # exception + # throw is made with empty stack as usual + raise spec + else: + raise RuntimeError('Invalid return code') + + +class FOR_IN(OP_CODE): + _params = ['name', 'body_start_label', 'continue_label', 'break_label'] + + def __init__(self, name, body_start_label, continue_label, break_label): + self.name = name + self.body_start_label = body_start_label + self.continue_label = continue_label + self.break_label = break_label + + def eval(self, ctx): + iterable = ctx.stack.pop() + if is_null(iterable) or is_undefined(iterable): + ctx.stack.pop() + ctx.stack.append(undefined) + return self.break_label + + obj = to_object(iterable, ctx.space) + + for e in sorted(obj.own): + if not obj.own[e]['enumerable']: + continue + + ctx.put( + self.name, e + ) # JS would have been so much nicer if this was ctx.space.put(self.name, obj.get(e)) + + # evaluate the body + status = ctx.space.exe.execute_fragment_under_context( + ctx, self.body_start_label, self.break_label) + + val, typ, spec = status + + if typ != 3: # exception + ctx.stack.pop() + + if typ == 0: # normal + ctx.stack.append(val) + continue + elif typ == 1: # return + ctx.stack.append(spec) + return None, None # send return signal + elif typ == 2: # jump outside + # now have to figure out whether this is a continue or something else... + ctx.stack.append(val) + if spec == self.continue_label: + # just a continue, perform next iteration as normal + continue + return spec # break or smth, go there and finish the iteration + elif typ == 3: # exception + # throw is made with empty stack as usual + raise spec + else: + raise RuntimeError('Invalid return code') + + return self.break_label + + +# all opcodes... +OP_CODES = {} +g = '' +for g in globals(): + try: + if not issubclass(globals()[g], OP_CODE) or g is 'OP_CODE': + continue + except: + continue + OP_CODES[g] = globals()[g] diff --git a/Contents/Libraries/Shared/js2py/internals/operations.py b/Contents/Libraries/Shared/js2py/internals/operations.py new file mode 100644 index 000000000..35b901794 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/operations.py @@ -0,0 +1,314 @@ +from __future__ import unicode_literals +from .simplex import * +from .conversions import * + +# ------------------------------------------------------------------------------ +# Unary operations + + +# -x +def minus_uop(self): + return -to_number(self) + + +# +x +def plus_uop(self): # +u + return to_number(self) + + +# !x +def logical_negation_uop(self): # !u cant do 'not u' :( + return not to_boolean(self) + + +# typeof x +def typeof_uop(self): + if is_callable(self): + return u'function' + typ = Type(self).lower() + if typ == u'null': + typ = u'object' # absolutely idiotic... + return typ + + +# ~u +def bit_invert_uop(self): + return float(to_int32(float(~to_int32(self)))) + + +# void +def void_op(self): + return undefined + + +UNARY_OPERATIONS = { + '+': plus_uop, + '-': minus_uop, + '!': logical_negation_uop, + '~': bit_invert_uop, + 'void': void_op, + 'typeof': + typeof_uop, # this one only for member expressions! for identifiers its slightly different... +} + +# ------------------------------------------------------------------------------ +# ----- binary ops ------- + +# Bitwise operators +# <<, >>, &, ^, |, ~ + + +# << +def bit_lshift_op(self, other): + lnum = to_int32(self) + rnum = to_uint32(other) + shiftCount = rnum & 0x1F + return float(to_int32(float(lnum << shiftCount))) + + +# >> +def bit_rshift_op(self, other): + lnum = to_int32(self) + rnum = to_uint32(other) + shiftCount = rnum & 0x1F + return float(to_int32(float(lnum >> shiftCount))) + + +# >>> +def bit_bshift_op(self, other): + lnum = to_uint32(self) + rnum = to_uint32(other) + shiftCount = rnum & 0x1F + return float(to_uint32(float(lnum >> shiftCount))) + + +# & +def bit_and_op(self, other): + lnum = to_int32(self) + rnum = to_int32(other) + return float(to_int32(float(lnum & rnum))) + + +# ^ +def bit_xor_op(self, other): + lnum = to_int32(self) + rnum = to_int32(other) + return float(to_int32(float(lnum ^ rnum))) + + +# | +def bit_or_op(self, other): + lnum = to_int32(self) + rnum = to_int32(other) + return float(to_int32(float(lnum | rnum))) + + +# Additive operators +# + and - are implemented here + + +# + +def add_op(self, other): + if type(self) is float and type(other) is float: + return self + other + if type(self) is unicode and type(other) is unicode: + return self + other + # standard way... + a = to_primitive(self) + b = to_primitive(other) + if type(a) is unicode or type(b) is unicode: # string wins hehe + return to_string(a) + to_string(b) + return to_number(a) + to_number(b) + + +# - +def sub_op(self, other): + return to_number(self) - to_number(other) + + +# Multiplicative operators +# *, / and % are implemented here + + +# * +def mul_op(self, other): + return to_number(self) * to_number(other) + + +# / +def div_op(self, other): + a = to_number(self) + b = to_number(other) + if b: + return a / float(b) # ensure at least one is a float. + if not a or a != a: + return NaN + return Infinity if a > 0 else -Infinity + + +# % +def mod_op(self, other): + a = to_number(self) + b = to_number(other) + if abs(a) == Infinity or not b: + return NaN + if abs(b) == Infinity: + return a + pyres = a % b # different signs in python and javascript + # python has the same sign as b and js has the same + # sign as a. + if a < 0 and pyres > 0: + pyres -= abs(b) + elif a > 0 and pyres < 0: + pyres += abs(b) + return float(pyres) + + +# Comparisons +# <, <=, !=, ==, >=, > are implemented here. +def abstract_relational_comparison(self, other, + self_first=True): # todo speed up! + ''' self= +def greater_eq_op(self, other): + res = abstract_relational_comparison(self, other, True) + if res is None: + return False + return not res + + +# > +def greater_op(self, other): + res = abstract_relational_comparison(self, other, False) + if res is None: + return False + return res + + +# equality + + +def abstract_equality_op(self, other): + ''' returns the result of JS == compare. + result is PyJs type: bool''' + tx, ty = Type(self), Type(other) + if tx == ty: + if tx == 'Undefined' or tx == 'Null': + return True + if tx == 'Number' or tx == 'String' or tx == 'Boolean': + return self == other + return self is other # Object + elif (tx == 'Undefined' and ty == 'Null') or (ty == 'Undefined' + and tx == 'Null'): + return True + elif tx == 'Number' and ty == 'String': + return abstract_equality_op(self, to_number(other)) + elif tx == 'String' and ty == 'Number': + return abstract_equality_op(to_number(self), other) + elif tx == 'Boolean': + return abstract_equality_op(to_number(self), other) + elif ty == 'Boolean': + return abstract_equality_op(self, to_number(other)) + elif (tx == 'String' or tx == 'Number') and is_object(other): + return abstract_equality_op(self, to_primitive(other)) + elif (ty == 'String' or ty == 'Number') and is_object(self): + return abstract_equality_op(to_primitive(self), other) + else: + return False + + +def abstract_inequality_op(self, other): + return not abstract_equality_op(self, other) + + +def strict_equality_op(self, other): + typ = Type(self) + if typ != Type(other): + return False + if typ == 'Undefined' or typ == 'Null': + return True + if typ == 'Boolean' or typ == 'String' or typ == 'Number': + return self == other + else: # object + return self is other # Id compare. + + +def strict_inequality_op(self, other): + return not strict_equality_op(self, other) + + +def instanceof_op(self, other): + '''checks if self is instance of other''' + if not hasattr(other, 'has_instance'): + return False + return other.has_instance(self) + + +def in_op(self, other): + '''checks if self is in other''' + if not is_object(other): + raise MakeError( + 'TypeError', + "You can\'t use 'in' operator to search in non-objects") + return other.has_property(to_string(self)) + + +BINARY_OPERATIONS = { + '+': add_op, + '-': sub_op, + '*': mul_op, + '/': div_op, + '%': mod_op, + '<<': bit_lshift_op, + '>>': bit_rshift_op, + '>>>': bit_bshift_op, + '|': bit_or_op, + '&': bit_and_op, + '^': bit_xor_op, + '==': abstract_equality_op, + '!=': abstract_inequality_op, + '===': strict_equality_op, + '!==': strict_inequality_op, + '<': less_op, + '<=': less_eq_op, + '>': greater_op, + '>=': greater_eq_op, + 'in': in_op, + 'instanceof': instanceof_op, +} diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py b/Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py new file mode 100644 index 000000000..8de79cb9d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py new file mode 100644 index 000000000..ace774ece --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsarray.py @@ -0,0 +1,489 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..operations import strict_equality_op + +import six + +if six.PY3: + xrange = range + import functools + +ARR_STACK = set({}) + + +class ArrayPrototype: + def toString(this, args): + arr = to_object(this, args.space) + func = arr.get('join') + if not is_callable(func): + return u'[object %s]' % GetClass(arr) + return func.call(this, ()) + + def toLocaleString(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + # separator is simply a comma ',' + if not arr_len: + return '' + res = [] + for i in xrange(arr_len): + element = array.get(unicode(i)) + if is_undefined(element) or is_null(element): + res.append('') + else: + cand = to_object(element, args.space) + str_func = cand.get('toLocaleString') + if not is_callable(str_func): + raise MakeError( + 'TypeError', + 'toLocaleString method of item at index %d is not callable' + % i) + res.append(to_string(str_func.call(cand, ()))) + return ','.join(res) + + def concat(this, args): + array = to_object(this, args.space) + items = [array] + items.extend(tuple(args)) + A = [] + for E in items: + if GetClass(E) == 'Array': + k = 0 + e_len = js_arr_length(E) + while k < e_len: + if E.has_property(unicode(k)): + A.append(E.get(unicode(k))) + k += 1 + else: + A.append(E) + return args.space.ConstructArray(A) + + def join(this, args): + ARR_STACK.add(this) + array = to_object(this, args.space) + separator = get_arg(args, 0) + arr_len = js_arr_length(array) + separator = ',' if is_undefined(separator) else to_string(separator) + elems = [] + for e in xrange(arr_len): + elem = array.get(unicode(e)) + if elem in ARR_STACK: + s = '' + else: + s = to_string(elem) + elems.append( + s if not (is_undefined(elem) or is_null(elem)) else '') + res = separator.join(elems) + ARR_STACK.remove(this) + return res + + def pop(this, args): #todo check + array = to_object(this, args.space) + arr_len = js_arr_length(array) + if not arr_len: + array.put('length', float(arr_len)) + return undefined + ind = unicode(arr_len - 1) + element = array.get(ind) + array.delete(ind) + array.put('length', float(arr_len - 1)) + return element + + def push(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + to_put = tuple(args) + i = arr_len + for i, e in enumerate(to_put, arr_len): + array.put(unicode(i), e, True) + array.put('length', float(arr_len + len(to_put)), True) + return float(i) + + def reverse(this, args): + array = to_object(this, args.space) + vals = js_array_to_list(array) + has_props = [ + array.has_property(unicode(e)) + for e in xrange(js_arr_length(array)) + ] + vals.reverse() + has_props.reverse() + for i, val in enumerate(vals): + if has_props[i]: + array.put(unicode(i), val) + else: + array.delete(unicode(i)) + return array + + def shift(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + if not arr_len: + array.put('length', 0.) + return undefined + first = array.get('0') + for k in xrange(1, arr_len): + from_s, to_s = unicode(k), unicode(k - 1) + if array.has_property(from_s): + array.put(to_s, array.get(from_s)) + else: + array.delete(to_s) + array.delete(unicode(arr_len - 1)) + array.put('length', float(arr_len - 1)) + return first + + def slice(this, args): # todo check + array = to_object(this, args.space) + start = get_arg(args, 0) + end = get_arg(args, 1) + arr_len = js_arr_length(array) + relative_start = to_int(start) + k = max((arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + relative_end = arr_len if is_undefined(end) else to_int(end) + final = max((arr_len + relative_end), 0) if relative_end < 0 else min( + relative_end, arr_len) + res = [] + n = 0 + while k < final: + pk = unicode(k) + if array.has_property(pk): + res.append(array.get(pk)) + k += 1 + n += 1 + return args.space.ConstructArray(res) + + def sort( + this, args + ): # todo: this assumes array continous (not sparse) - fix for sparse arrays + cmpfn = get_arg(args, 0) + if not GetClass(this) in ('Array', 'Arguments'): + return to_object(this, args.space) # do nothing + arr_len = js_arr_length(this) + if not arr_len: + return this + arr = [ + (this.get(unicode(e)) if this.has_property(unicode(e)) else None) + for e in xrange(arr_len) + ] + if not is_callable(cmpfn): + cmpfn = None + cmp = lambda a, b: sort_compare(a, b, cmpfn) + if six.PY3: + key = functools.cmp_to_key(cmp) + arr.sort(key=key) + else: + arr.sort(cmp=cmp) + for i in xrange(arr_len): + if arr[i] is None: + this.delete(unicode(i)) + else: + this.put(unicode(i), arr[i]) + return this + + def splice(this, args): + # 1-8 + array = to_object(this, args.space) + start = get_arg(args, 0) + deleteCount = get_arg(args, 1) + arr_len = js_arr_length(this) + relative_start = to_int(start) + actual_start = max( + (arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + actual_delete_count = min( + max(to_int(deleteCount), 0), arr_len - actual_start) + k = 0 + A = args.space.NewArray(0) + # 9 + while k < actual_delete_count: + if array.has_property(unicode(actual_start + k)): + A.put(unicode(k), array.get(unicode(actual_start + k))) + k += 1 + # 10-11 + items = list(args)[2:] + items_len = len(items) + # 12 + if items_len < actual_delete_count: + k = actual_start + while k < (arr_len - actual_delete_count): + fr = unicode(k + actual_delete_count) + to = unicode(k + items_len) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k += 1 + k = arr_len + while k > (arr_len - actual_delete_count + items_len): + array.delete(unicode(k - 1)) + k -= 1 + # 13 + elif items_len > actual_delete_count: + k = arr_len - actual_delete_count + while k > actual_start: + fr = unicode(k + actual_delete_count - 1) + to = unicode(k + items_len - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + # 14-17 + k = actual_start + while items: + E = items.pop(0) + array.put(unicode(k), E) + k += 1 + array.put('length', float(arr_len - actual_delete_count + items_len)) + return A + + def unshift(this, args): + array = to_object(this, args.space) + arr_len = js_arr_length(array) + argCount = len(args) + k = arr_len + while k > 0: + fr = unicode(k - 1) + to = unicode(k + argCount - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + items = tuple(args) + for j, e in enumerate(items): + array.put(unicode(j), e) + array.put('length', float(arr_len + argCount)) + return float(arr_len + argCount) + + def indexOf(this, args): + array = to_object(this, args.space) + searchElement = get_arg(args, 0) + arr_len = js_arr_length(array) + if arr_len == 0: + return -1. + if len(args) > 1: + n = to_int(args[1]) + else: + n = 0 + if n >= arr_len: + return -1. + if n >= 0: + k = n + else: + k = arr_len - abs(n) + if k < 0: + k = 0 + while k < arr_len: + if array.has_property(unicode(k)): + elementK = array.get(unicode(k)) + if strict_equality_op(searchElement, elementK): + return float(k) + k += 1 + return -1. + + def lastIndexOf(this, args): + array = to_object(this, args.space) + searchElement = get_arg(args, 0) + arr_len = js_arr_length(array) + if arr_len == 0: + return -1. + if len(args) > 1: + n = to_int(args[1]) + else: + n = arr_len - 1 + if n >= 0: + k = min(n, arr_len - 1) + else: + k = arr_len - abs(n) + while k >= 0: + if array.has_property(unicode(k)): + elementK = array.get(unicode(k)) + if strict_equality_op(searchElement, elementK): + return float(k) + k -= 1 + return -1. + + def every(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + T = get_arg(args, 1) + k = 0 + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + if not to_boolean( + callbackfn.call(T, (kValue, float(k), array))): + return False + k += 1 + return True + + def some(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + T = get_arg(args, 1) + k = 0 + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + if to_boolean(callbackfn.call(T, (kValue, float(k), array))): + return True + k += 1 + return False + + def forEach(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + _this = get_arg(args, 1) + k = 0 + while k < arr_len: + sk = unicode(k) + if array.has_property(sk): + kValue = array.get(sk) + callbackfn.call(_this, (kValue, float(k), array)) + k += 1 + return undefined + + def map(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + _this = get_arg(args, 1) + k = 0 + A = args.space.NewArray(0) + while k < arr_len: + Pk = unicode(k) + if array.has_property(Pk): + kValue = array.get(Pk) + mappedValue = callbackfn.call(_this, (kValue, float(k), array)) + A.define_own_property( + Pk, { + 'value': mappedValue, + 'writable': True, + 'enumerable': True, + 'configurable': True + }, False) + k += 1 + return A + + def filter(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + _this = get_arg(args, 1) + k = 0 + res = [] + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + if to_boolean( + callbackfn.call(_this, (kValue, float(k), array))): + res.append(kValue) + k += 1 + return args.space.ConstructArray(res) + + def reduce(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(args) < 2: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + k = 0 + accumulator = undefined + if len(args) > 1: # initial value present + accumulator = args[1] + else: + kPresent = False + while not kPresent and k < arr_len: + kPresent = array.has_property(unicode(k)) + if kPresent: + accumulator = array.get(unicode(k)) + k += 1 + if not kPresent: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + while k < arr_len: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + accumulator = callbackfn.call( + undefined, (accumulator, kValue, float(k), array)) + k += 1 + return accumulator + + def reduceRight(this, args): + array = to_object(this, args.space) + callbackfn = get_arg(args, 0) + arr_len = js_arr_length(array) + if not is_callable(callbackfn): + raise MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(args) < 2: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + k = arr_len - 1 + accumulator = undefined + + if len(args) > 1: # initial value present + accumulator = args[1] + else: + kPresent = False + while not kPresent and k >= 0: + kPresent = array.has_property(unicode(k)) + if kPresent: + accumulator = array.get(unicode(k)) + k -= 1 + if not kPresent: + raise MakeError('TypeError', + 'Reduce of empty array with no initial value') + while k >= 0: + if array.has_property(unicode(k)): + kValue = array.get(unicode(k)) + accumulator = callbackfn.call( + undefined, (accumulator, kValue, float(k), array)) + k -= 1 + return accumulator + + +def sort_compare(a, b, comp): + if a is None: + if b is None: + return 0 + return 1 + if b is None: + if a is None: + return 0 + return -1 + if is_undefined(a): + if is_undefined(b): + return 0 + return 1 + if is_undefined(b): + if is_undefined(a): + return 0 + return -1 + if comp is not None: + res = comp.call(undefined, (a, b)) + return to_int(res) + x, y = to_string(a), to_string(b) + if x < y: + return -1 + elif x > y: + return 1 + return 0 diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py new file mode 100644 index 000000000..9aff9d2e8 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsboolean.py @@ -0,0 +1,22 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + + +class BooleanPrototype: + def toString(this, args): + if GetClass(this) != 'Boolean': + raise MakeError('TypeError', + 'Boolean.prototype.toString is not generic') + if is_object(this): + this = this.value + return u'true' if this else u'false' + + def valueOf(this, args): + if GetClass(this) != 'Boolean': + raise MakeError('TypeError', + 'Boolean.prototype.valueOf is not generic') + if is_object(this): + this = this.value + return this diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py new file mode 100644 index 000000000..c58dec498 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jserror.py @@ -0,0 +1,15 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + + +class ErrorPrototype: + def toString(this, args): + if Type(this) != 'Object': + raise MakeError('TypeError', + 'Error.prototype.toString called on non-object') + name = this.get('name') + name = u'Error' if is_undefined(name) else to_string(name) + msg = this.get('message') + msg = '' if is_undefined(msg) else to_string(msg) + return name + (name and msg and ': ') + msg diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py new file mode 100644 index 000000000..06ec68014 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsfunction.py @@ -0,0 +1,61 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +# todo fix apply and bind + + +class FunctionPrototype: + def toString(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.toString is not generic') + + args = u', '.join(map(unicode, this.params)) + return u'function %s(%s) { [native code] }' % (this.name if this.name + else u'', args) + + def call(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.call is not generic') + _this = get_arg(args, 0) + _args = tuple(args)[1:] + return this.call(_this, _args) + + def apply(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.apply is not generic') + _args = get_arg(args, 1) + if not is_object(_args): + raise MakeError( + 'TypeError', + 'argList argument to Function.prototype.apply must an Object') + _this = get_arg(args, 0) + return this.call(_this, js_array_to_tuple(_args)) + + def bind(this, args): + if not is_callable(this): + raise MakeError('TypeError', + 'Function.prototype.bind is not generic') + bound_this = get_arg(args, 0) + bound_args = tuple(args)[1:] + + def bound(dummy_this, extra_args): + return this.call(bound_this, bound_args + tuple(extra_args)) + + js_bound = args.space.NewFunction(bound, this.ctx, (), u'', False, ()) + js_bound.put(u'length', + float(max(len(this.params) - len(bound_args), 0.))) + js_bound.put(u'name', u'boundFunc') + return js_bound diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py new file mode 100644 index 000000000..87dc5f389 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsjson.py @@ -0,0 +1,205 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * +from ..operations import strict_equality_op +import json + +indent = '' +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def parse(this, args): + text, reviver = get_arg(args, 0), get_arg(args, 1) + s = to_string(text) + try: + unfiltered = json.loads(s) + except: + raise MakeError( + 'SyntaxError', + 'JSON.parse could not parse JSON string - Invalid syntax') + unfiltered = to_js(unfiltered, args.space) + if is_callable(reviver): + root = args.space.ConstructObject({'': unfiltered}) + return walk(root, '', reviver) + else: + return unfiltered + + +def stringify(this, args): + global indent + value, replacer, space = get_arg(args, 0), get_arg(args, 1), get_arg( + args, 2) + stack = set([]) + indent = '' + property_list = replacer_function = undefined + if is_object(replacer): + if is_callable(replacer): + replacer_function = replacer + elif replacer.Class == 'Array': + property_list = [] + for e in replacer: + v = replacer[e] + item = undefined + typ = Type(v) + if typ == 'Number': + item = to_string(v) + elif typ == 'String': + item = v + elif typ == 'Object': + if GetClass(v) in ('String', 'Number'): + item = to_string(v) + if not is_undefined(item) and item not in property_list: + property_list.append(item) + if is_object(space): + if GetClass(space) == 'Number': + space = to_number(space) + elif GetClass(space) == 'String': + space = to_string(space) + if Type(space) == 'Number': + space = min(10, to_int(space)) + gap = max(int(space), 0) * ' ' + elif Type(space) == 'String': + gap = space[:10] + else: + gap = '' + return Str('', args.space.ConstructObject({ + '': value + }), replacer_function, property_list, gap, stack, space) + + +def Str(key, holder, replacer_function, property_list, gap, stack, space): + value = holder.get(key) + if is_object(value): + to_json = value.get('toJSON') + if is_callable(to_json): + value = to_json.call(value, (key, )) + if not is_undefined(replacer_function): + value = replacer_function.call(holder, (key, value)) + + if is_object(value): + if value.Class == 'String': + value = to_string(value) + elif value.Class == 'Number': + value = to_number(value) + elif value.Class == 'Boolean': + value = to_boolean(value) + typ = Type(value) + if is_null(value): + return 'null' + elif typ == 'Boolean': + return 'true' if value else 'false' + elif typ == 'String': + return Quote(value) + elif typ == 'Number': + if not is_infinity(value): + return to_string(value) + return 'null' + if is_object(value) and not is_callable(value): + if value.Class == 'Array': + return ja(value, stack, gap, property_list, replacer_function, + space) + else: + return jo(value, stack, gap, property_list, replacer_function, + space) + return undefined + + +def jo(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise MakeError('TypeError', 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + if not is_undefined(property_list): + k = property_list + else: + k = [unicode(e) for e, d in value.own.items() if d.get('enumerable')] + partial = [] + for p in k: + str_p = Str(p, value, replacer_function, property_list, gap, stack, + space) + if not is_undefined(str_p): + member = json.dumps(p) + ':' + ( + ' ' if gap else + '') + str_p # todo not sure here - what space character? + partial.append(member) + if not partial: + final = '{}' + else: + if not gap: + final = '{%s}' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '{\n' + indent + properties + '\n' + stepback + '}' + stack.remove(value) + indent = stepback + return final + + +def ja(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise MakeError('TypeError', 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + partial = [] + length = js_arr_length(value) + for index in xrange(length): + index = unicode(index) + str_index = Str(index, value, replacer_function, property_list, gap, + stack, space) + if is_undefined(str_index): + partial.append('null') + else: + partial.append(str_index) + if not partial: + final = '[]' + else: + if not gap: + final = '[%s]' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '[\n' + indent + properties + '\n' + stepback + ']' + stack.remove(value) + indent = stepback + return final + + +def Quote(string): + return json.dumps(string) + + +def to_js(d, _args_space): + return convert_to_js_type(d, _args_space) + + +def walk(holder, name, reviver): + val = holder.get(name) + if GetClass(val) == 'Array': + for i in xrange(js_arr_length(val)): + i = unicode(i) + new_element = walk(val, i, reviver) + if is_undefined(new_element): + val.delete(i) + else: + new_element.put(i, new_element) + elif is_object(val): + for key in [ + unicode(e) for e, d in val.own.items() if d.get('enumerable') + ]: + new_element = walk(val, key, reviver) + if is_undefined(new_element): + val.delete(key) + else: + val.put(key, new_element) + return reviver.call(holder, (name, val)) diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py new file mode 100644 index 000000000..d099eabd3 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsnumber.py @@ -0,0 +1,163 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +RADIX_SYMBOLS = { + 0: '0', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: 'a', + 11: 'b', + 12: 'c', + 13: 'd', + 14: 'e', + 15: 'f', + 16: 'g', + 17: 'h', + 18: 'i', + 19: 'j', + 20: 'k', + 21: 'l', + 22: 'm', + 23: 'n', + 24: 'o', + 25: 'p', + 26: 'q', + 27: 'r', + 28: 's', + 29: 't', + 30: 'u', + 31: 'v', + 32: 'w', + 33: 'x', + 34: 'y', + 35: 'z' +} + + +def to_str_rep(num): + if is_nan(num): + return 'NaN' + elif is_infinity(num): + sign = '-' if num < 0 else '' + return sign + 'Infinity' + elif int(num) == num: # dont print .0 + return unicode(int(num)) + return unicode(num) # todo: Make it 100% consistent with Node + + +class NumberPrototype: + def toString(this, args): + if GetClass(this) != 'Number': + raise MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + if type(this) != float: + this = this.value + radix = get_arg(args, 0) + if is_undefined(radix): + return to_str_rep(this) + r = to_int(radix) + if r == 10: + return to_str_rep(this) + if r not in xrange(2, 37) or radix != r: + raise MakeError( + 'RangeError', + 'Number.prototype.toString() radix argument must be an integer between 2 and 36' + ) + num = to_int(this) + if num < 0: + num = -num + sign = '-' + else: + sign = '' + res = '' + while num: + s = RADIX_SYMBOLS[num % r] + num = num // r + res = s + res + return sign + (res if res else '0') + + def valueOf(this, args): + if GetClass(this) != 'Number': + raise MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + if type(this) != float: + this = this.value + return this + + def toFixed(this, args): + if GetClass(this) != 'Number': + raise MakeError( + 'TypeError', + 'Number.prototype.toFixed called on incompatible receiver') + if type(this) != float: + this = this.value + fractionDigits = get_arg(args, 0) + digs = to_int(fractionDigits) + if digs < 0 or digs > 20: + raise MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif is_infinity(this): + return 'Infinity' if this > 0 else '-Infinity' + elif is_nan(this): + return 'NaN' + return format(this, '-.%df' % digs) + + def toExponential(this, args): + if GetClass(this) != 'Number': + raise MakeError( + 'TypeError', + 'Number.prototype.toExponential called on incompatible receiver' + ) + if type(this) != float: + this = this.value + fractionDigits = get_arg(args, 0) + digs = to_int(fractionDigits) + if digs < 0 or digs > 20: + raise MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif is_infinity(this): + return 'Infinity' if this > 0 else '-Infinity' + elif is_nan(this): + return 'NaN' + return format(this, '-.%de' % digs) + + def toPrecision(this, args): + if GetClass(this) != 'Number': + raise MakeError( + 'TypeError', + 'Number.prototype.toPrecision called on incompatible receiver') + if type(this) != float: + this = this.value + precision = get_arg(args, 0) + if is_undefined(precision): + return to_string(this) + prec = to_int(precision) + if is_nan(this): + return 'NaN' + elif is_infinity(this): + return 'Infinity' if this > 0 else '-Infinity' + digs = prec - len(str(int(this))) + if digs >= 0: + return format(this, '-.%df' % digs) + else: + return format(this, '-.%df' % (prec - 1)) + + +NumberPrototype.toLocaleString = NumberPrototype.toString diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py new file mode 100644 index 000000000..cdda6baba --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsobject.py @@ -0,0 +1,48 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + + +class ObjectPrototype: + def toString(this, args): + if type(this) == UNDEFINED_TYPE: + return u'[object Undefined]' + elif type(this) == NULL_TYPE: + return u'[object Null]' + return u'[object %s]' % GetClass(to_object(this, args.space)) + + def valueOf(this, args): + return to_object(this, args.space) + + def toLocaleString(this, args): + o = to_object(this, args.space) + toString = o.get(u'toString') + if not is_callable(toString): + raise MakeError('TypeError', 'toString of this is not callcable') + else: + return toString.call(this, args) + + def hasOwnProperty(this, args): + prop = get_arg(args, 0) + o = to_object(this, args.space) + return o.get_own_property(to_string(prop)) is not None + + def isPrototypeOf(this, args): + # a bit stupid specification because of object conversion that will cause invalid values for primitives + # for example Object.prototype.isPrototypeOf.call((5).__proto__, 5) gives false + obj = get_arg(args, 0) + if not is_object(obj): + return False + o = to_object(this, args.space) + while 1: + obj = obj.prototype + if obj is None or is_null(obj): + return False + if obj is o: + return True + + def propertyIsEnumerable(this, args): + prop = get_arg(args, 0) + o = to_object(this, args.space) + cand = o.own.get(to_string(prop)) + return cand is not None and cand.get('enumerable') diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py new file mode 100644 index 000000000..54aba3274 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsregexp.py @@ -0,0 +1,56 @@ +from __future__ import unicode_literals + +from ..conversions import * +from ..func_utils import * + + +class RegExpPrototype: + def toString(this, args): + flags = u'' + try: + if this.glob: + flags += u'g' + if this.ignore_case: + flags += u'i' + if this.multiline: + flags += u'm' + except: + pass + try: + v = this.value if this.value else u'(?:)' + except: + v = u'(?:)' + return u'/%s/' % v + flags + + def test(this, args): + string = get_arg(args, 0) + return RegExpExec(this, string, args.space) is not null + + def _exec( + this, args + ): # will be changed to exec in base.py. cant name it exec here... + string = get_arg(args, 0) + return RegExpExec(this, string, args.space) + + +def RegExpExec(this, string, space): + if GetClass(this) != 'RegExp': + raise MakeError('TypeError', 'RegExp.prototype.exec is not generic!') + string = to_string(string) + length = len(string) + i = to_int(this.get('lastIndex')) if this.glob else 0 + matched = False + while not matched: + if i < 0 or i > length: + this.put('lastIndex', 0.) + return null + matched = this.match(string, i) + i += 1 + start, end = matched.span() #[0]+i-1, matched.span()[1]+i-1 + if this.glob: + this.put('lastIndex', float(end)) + arr = convert_to_js_type( + [matched.group()] + list(matched.groups()), space=space) + arr.put('index', float(start)) + arr.put('input', unicode(string)) + return arr diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py new file mode 100644 index 000000000..be38802ef --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsstring.py @@ -0,0 +1,323 @@ +from __future__ import unicode_literals + +# -*- coding: utf-8 -*- +import re +from ..conversions import * +from ..func_utils import * +from .jsregexp import RegExpExec + +DIGS = set(u'0123456789') +WHITE = u"\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF" + + +def replacement_template(rep, source, span, npar): + """Takes the replacement template and some info about the match and returns filled template + """ + n = 0 + res = '' + while n < len(rep) - 1: + char = rep[n] + if char == '$': + if rep[n + 1] == '$': + res += '$' + n += 2 + continue + elif rep[n + 1] == '`': + # replace with string that is BEFORE match + res += source[:span[0]] + n += 2 + continue + elif rep[n + 1] == '\'': + # replace with string that is AFTER match + res += source[span[1]:] + n += 2 + continue + elif rep[n + 1] in DIGS: + dig = rep[n + 1] + if n + 2 < len(rep) and rep[n + 2] in DIGS: + dig += rep[n + 2] + num = int(dig) + # we will not do any replacements if we dont have this npar or dig is 0 + if not num or num > len(npar): + res += '$' + dig + else: + # None - undefined has to be replaced with '' + res += npar[num - 1] if npar[num - 1] else '' + n += 1 + len(dig) + continue + res += char + n += 1 + if n < len(rep): + res += rep[-1] + return res + + +################################################### + + +class StringPrototype: + def toString(this, args): + if GetClass(this) != 'String': + raise MakeError('TypeError', + 'String.prototype.toString is not generic') + if type(this) == unicode: + return this + assert type(this.value) == unicode + return this.value + + def valueOf(this, args): + if GetClass(this) != 'String': + raise MakeError('TypeError', + 'String.prototype.valueOf is not generic') + if type(this) == unicode: + return this + assert type(this.value) == unicode + return this.value + + def charAt(this, args): + cok(this) + pos = to_int(get_arg(args, 0)) + s = to_string(this) + if 0 <= pos < len(s): + return s[pos] + return u'' + + def charCodeAt(this, args): + cok(this) + pos = to_int(get_arg(args, 0)) + s = to_string(this) + if 0 <= pos < len(s): + return float(ord(s[pos])) + return NaN + + def concat(this, args): + cok(this) + return to_string(this) + u''.join(map(to_string, args)) + + def indexOf(this, args): + cok(this) + search = to_string(get_arg(args, 0)) + pos = to_int(get_arg(args, 1)) + s = to_string(this) + return float(s.find(search, min(max(pos, 0), len(s)))) + + def lastIndexOf(this, args): + cok(this) + search = to_string(get_arg(args, 0)) + pos = get_arg(args, 1) + s = to_string(this) + pos = 10**12 if is_nan(pos) else to_int(pos) + return float(s.rfind(search, 0, min(max(pos, 0) + 1, len(s)))) + + def localeCompare(this, args): + cok(this) + s = to_string(this) + that = to_string(get_arg(args, 0)) + if s < that: + return -1. + elif s > that: + return 1. + return 0. + + def match(this, args): + cok(this) + s = to_string(this) + regexp = get_arg(args, 0) + r = args.space.NewRegExp( + regexp, '') if GetClass(regexp) != 'RegExp' else regexp + if not r.glob: + return RegExpExec(r, s, space=args.space) + r.put('lastIndex', float(0)) + found = [] + previous_last_index = 0 + last_match = True + while last_match: + result = RegExpExec(r, s, space=args.space) + if is_null(result): + last_match = False + else: + this_index = r.get('lastIndex') + if this_index == previous_last_index: + r.put('lastIndex', float(this_index + 1)) + previous_last_index += 1 + else: + previous_last_index = this_index + matchStr = result.get('0') + found.append(matchStr) + if not found: + return null + return args.space.ConstructArray(found) + + def replace(this, args): + # VERY COMPLICATED. to check again. + cok(this) + s = to_string(this) + searchValue = get_arg(args, 0) + replaceValue = get_arg(args, 1) + res = '' + if not is_callable(replaceValue): + replaceValue = to_string(replaceValue) + func = False + else: + func = True + # Replace all ( global ) + if GetClass(searchValue) == 'RegExp' and searchValue.glob: + last = 0 + for e in re.finditer(searchValue.pat, s): + res += s[last:e.span()[0]] + if func: + # prepare arguments for custom func (replaceValue) + call_args = (e.group(), ) + e.groups() + (e.span()[1], s) + # convert all types to JS before Js bytecode call... + res += to_string( + replaceValue.call( + this, ensure_js_types(call_args, + space=args.space))) + else: + res += replacement_template(replaceValue, s, e.span(), + e.groups()) + last = e.span()[1] + res += s[last:] + return res + elif GetClass(searchValue) == 'RegExp': + e = re.search(searchValue.pat, s) + if e is None: + return s + span = e.span() + pars = e.groups() + match = e.group() + else: + match = to_string(searchValue) + ind = s.find(match) + if ind == -1: + return s + span = ind, ind + len(match) + pars = () + res = s[:span[0]] + if func: + call_args = (match, ) + pars + (span[1], s) + # convert all types to JS before Js bytecode call... + res += to_string( + replaceValue.call(this, + ensure_js_types(call_args, + space=args.space))) + else: + res += replacement_template(replaceValue, s, span, pars) + res += s[span[1]:] + return res + + def search(this, args): + cok(this) + string = to_string(this) + regexp = get_arg(args, 0) + if GetClass(regexp) == 'RegExp': + rx = regexp + else: + rx = args.space.NewRegExp(regexp, '') + res = re.search(rx.pat, string) + if res is not None: + return float(res.span()[0]) + return -1. + + def slice(this, args): + cok(this) + s = to_string(this) + start = to_int(get_arg(args, 0)) + length = len(s) + end = get_arg(args, 1) + end = length if is_undefined(end) else to_int(end) + #From = max(length+start, 0) if start<0 else min(length, start) + #To = max(length+end, 0) if end<0 else min(length, end) + return s[start:end] + + def split(this, args): + # its a bit different from re.split! + cok(this) + s = to_string(this) + separator = get_arg(args, 0) + limit = get_arg(args, 1) + lim = 2**32 - 1 if is_undefined(limit) else to_uint32(limit) + if not lim: + return args.space.ConstructArray([]) + if is_undefined(separator): + return args.space.ConstructArray([s]) + len_s = len(s) + res = [] + R = separator if GetClass(separator) == 'RegExp' else to_string( + separator) + if not len_s: + if SplitMatch(s, 0, R) is None: + return args.space.ConstructArray([s]) + return args.space.ConstructArray([]) + p = q = 0 + while q != len_s: + e, cap = SplitMatch(s, q, R) + if e is None or e == p: + q += 1 + continue + res.append(s[p:q]) + p = q = e + if len(res) == lim: + return args.space.ConstructArray(res) + for element in cap: + res.append(element) + if len(res) == lim: + return args.space.ConstructArray(res) + res.append(s[p:]) + return args.space.ConstructArray(res) + + def substring(this, args): + cok(this) + s = to_string(this) + start = to_int(get_arg(args, 0)) + length = len(s) + end = get_arg(args, 1) + end = length if is_undefined(end) else to_int(end) + fstart = min(max(start, 0), length) + fend = min(max(end, 0), length) + return s[min(fstart, fend):max(fstart, fend)] + + def substr(this, args): + cok(this) + #I hate this function and its description in specification + r1 = to_string(this) + r2 = to_int(get_arg(args, 0)) + length = get_arg(args, 1) + r3 = 10**20 if is_undefined(length) else to_int(length) + r4 = len(r1) + r5 = r2 if r2 >= 0 else max(0, r2 + r4) + r6 = min(max(r3, 0), r4 - r5) + if r6 <= 0: + return '' + return r1[r5:r5 + r6] + + def toLowerCase(this, args): + cok(this) + return to_string(this).lower() + + def toLocaleLowerCase(this, args): + cok(this) + return to_string(this).lower() + + def toUpperCase(this, args): + cok(this) + return to_string(this).upper() + + def toLocaleUpperCase(this, args): + cok(this) + return to_string(this).upper() + + def trim(this, args): + cok(this) + return to_string(this).strip(WHITE) + + +def SplitMatch(s, q, R): + # s is Py String to match, q is the py int match start and R is Js RegExp or String. + if GetClass(R) == 'RegExp': + res = R.match(s, q) + return (None, ()) if res is None else (res.span()[1], res.groups()) + # R is just a string + if s[q:].startswith(R): + return q + len(R), () + return None, () diff --git a/Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py b/Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py new file mode 100644 index 000000000..85f5bd44b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/prototypes/jsutils.py @@ -0,0 +1,149 @@ +from __future__ import unicode_literals +from ..conversions import * +from ..func_utils import * + +RADIX_CHARS = { + '1': 1, + '0': 0, + '3': 3, + '2': 2, + '5': 5, + '4': 4, + '7': 7, + '6': 6, + '9': 9, + '8': 8, + 'a': 10, + 'c': 12, + 'b': 11, + 'e': 14, + 'd': 13, + 'g': 16, + 'f': 15, + 'i': 18, + 'h': 17, + 'k': 20, + 'j': 19, + 'm': 22, + 'l': 21, + 'o': 24, + 'n': 23, + 'q': 26, + 'p': 25, + 's': 28, + 'r': 27, + 'u': 30, + 't': 29, + 'w': 32, + 'v': 31, + 'y': 34, + 'x': 33, + 'z': 35, + 'A': 10, + 'C': 12, + 'B': 11, + 'E': 14, + 'D': 13, + 'G': 16, + 'F': 15, + 'I': 18, + 'H': 17, + 'K': 20, + 'J': 19, + 'M': 22, + 'L': 21, + 'O': 24, + 'N': 23, + 'Q': 26, + 'P': 25, + 'S': 28, + 'R': 27, + 'U': 30, + 'T': 29, + 'W': 32, + 'V': 31, + 'Y': 34, + 'X': 33, + 'Z': 35 +} + +# parseFloat +# parseInt +# isFinite +# isNaN + + +def parseInt(this, args): + string, radix = get_arg(args, 0), get_arg(args, 1) + string = to_string(string).lstrip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + r = to_int32(radix) + strip_prefix = True + if r: + if r < 2 or r > 36: + return NaN + if r != 16: + strip_prefix = False + else: + r = 10 + if strip_prefix: + if len(string) >= 2 and string[:2] in ('0x', '0X'): + string = string[2:] + r = 16 + n = 0 + num = 0 + while n < len(string): + cand = RADIX_CHARS.get(string[n]) + if cand is None or not cand < r: + break + num = cand + num * r + n += 1 + if not n: + return NaN + return float(sign * num) + + +def parseFloat(this, args): + string = get_arg(args, 0) + string = to_string(string).strip() + sign = 1 + if string and string[0] in ('+', '-'): + if string[0] == '-': + sign = -1 + string = string[1:] + num = None + length = 1 + max_len = None + failed = 0 + while length <= len(string): + try: + num = float(string[:length]) + max_len = length + failed = 0 + except: + failed += 1 + if failed > 4: # cant be a number anymore + break + length += 1 + if num is None: + return NaN + return sign * float(string[:max_len]) + + +def isNaN(this, args): + number = get_arg(args, 0) + if is_nan(to_number(number)): + return True + return False + + +def isFinite(this, args): + number = get_arg(args, 0) + num = to_number(number) + if is_nan(num) or is_infinity(num): + return False + return True diff --git a/Contents/Libraries/Shared/js2py/internals/seval.py b/Contents/Libraries/Shared/js2py/internals/seval.py new file mode 100644 index 000000000..cd8ea50fa --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/seval.py @@ -0,0 +1,33 @@ +import pyjsparser +from .space import Space +from . import fill_space +from .byte_trans import ByteCodeGenerator +from .code import Code +from .simplex import * + + +pyjsparser.parser.ENABLE_JS2PY_ERRORS = lambda msg: MakeError(u'SyntaxError', unicode(msg)) + +def get_js_bytecode(js): + a = ByteCodeGenerator(Code()) + d = pyjsparser.parse(js) + a.emit(d) + return a.exe.tape + +def eval_js_vm(js, debug=False): + a = ByteCodeGenerator(Code(debug_mode=debug)) + s = Space() + a.exe.space = s + s.exe = a.exe + + d = pyjsparser.parse(js) + + a.emit(d) + fill_space.fill_space(s, a) + if debug: + from pprint import pprint + pprint(a.exe.tape) + print() + a.exe.compile() + + return a.exe.run(a.exe.space.GlobalObj) diff --git a/Contents/Libraries/Shared/js2py/internals/simplex.py b/Contents/Libraries/Shared/js2py/internals/simplex.py new file mode 100644 index 000000000..4cd247eb2 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/simplex.py @@ -0,0 +1,160 @@ +from __future__ import unicode_literals +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +#Undefined +class PyJsUndefined(object): + TYPE = 'Undefined' + Class = 'Undefined' + + +undefined = PyJsUndefined() + + +#Null +class PyJsNull(object): + TYPE = 'Null' + Class = 'Null' + + +null = PyJsNull() + +Infinity = float('inf') +NaN = float('nan') + +UNDEFINED_TYPE = PyJsUndefined +NULL_TYPE = PyJsNull +STRING_TYPE = unicode if six.PY2 else str +NUMBER_TYPE = float +BOOLEAN_TYPE = bool + +# exactly 5 simplexes! +PRIMITIVES = frozenset( + [UNDEFINED_TYPE, NULL_TYPE, STRING_TYPE, NUMBER_TYPE, BOOLEAN_TYPE]) + +TYPE_NAMES = { + UNDEFINED_TYPE: 'Undefined', + NULL_TYPE: 'Null', + STRING_TYPE: 'String', + NUMBER_TYPE: 'Number', + BOOLEAN_TYPE: 'Boolean', +} + + +def Type(x): + # Any -> Str + return TYPE_NAMES.get(type(x), 'Object') + + +def GetClass(x): + # Any -> Str + cand = TYPE_NAMES.get(type(x)) + if cand is None: + return x.Class + return cand + + +def is_undefined(self): + return self is undefined + + +def is_null(self): + return self is null + + +def is_primitive(self): + return type(self) in PRIMITIVES + + +def is_object(self): + return not is_primitive(self) + + +def is_callable(self): + return hasattr(self, 'call') + + +def is_infinity(self): + return self == Infinity or self == -Infinity + + +def is_nan(self): + return self != self # nan!=nan evaluates to True + + +def is_finite(self): + return not (is_nan(self) or is_infinity(self)) + + +class JsException(Exception): + def __init__(self, typ=None, message=None, throw=None): + if typ is None and message is None and throw is None: + # it means its the trasnlator based error (old format), do nothing + self._translator_based = True + else: + assert throw is None or (typ is None + and message is None), (throw, typ, + message) + self._translator_based = False + self.typ = typ + self.message = message + self.throw = throw + + def get_thrown_value(self, space): + if self.throw is not None: + return self.throw + else: + return space.NewError(self.typ, self.message) + + def __str__(self): + if self._translator_based: + if self.mes.Class == 'Error': + return self.mes.callprop('toString').value + else: + return self.mes.to_string().value + else: + if self.throw is not None: + from .conversions import to_string + return to_string(self.throw) + else: + return self.typ + ': ' + self.message + + +def MakeError(typ, message=u'no info', throw=None): + return JsException(typ, + unicode(message) if message is not None else message, + throw) + + +def value_from_js_exception(js_exception, space): + if js_exception.throw is not None: + return js_exception.throw + else: + return space.NewError(js_exception.typ, js_exception.message) + + +def js_dtoa(number): + if is_nan(number): + return u'NaN' + elif is_infinity(number): + if number > 0: + return u'Infinity' + return u'-Infinity' + elif number == 0.: + return u'0' + elif abs(number) < 1e-6 or abs(number) >= 1e21: + frac, exponent = unicode(repr(float(number))).split('e') + # Remove leading zeros from the exponent. + exponent = int(exponent) + return frac + ('e' if exponent < 0 else 'e+') + unicode(exponent) + elif abs(number) < 1e-4: # python starts to return exp notation while we still want the prec + frac, exponent = unicode(repr(float(number))).split('e-') + base = u'0.' + u'0' * (int(exponent) - 1) + frac.lstrip('-').replace('.', '') + return base if number > 0. else u'-' + base + elif isinstance(number, long) or number.is_integer(): # dont print .0 + return unicode(int(number)) + return unicode(repr(number)) # python representation should be equivalent. diff --git a/Contents/Libraries/Shared/js2py/internals/space.py b/Contents/Libraries/Shared/js2py/internals/space.py new file mode 100644 index 000000000..cb2e77ae0 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/space.py @@ -0,0 +1,92 @@ +from .base import * +from .simplex import * + + +class Space(object): + def __init__(self): + self.GlobalObj = None + self.ctx = None + self.byte_generator = None + + self.Number = None + self.String = None + self.Boolean = None + self.RegExp = None + self.Object = None + self.Array = None + self.Function = None + + self.BooleanPrototype = None + self.NumberPrototype = None + self.StringPrototype = None + + self.FunctionPrototype = None + self.ArrayPrototype = None + self.RegExpPrototype = None + self.DatePrototype = None + self.ObjectPrototype = None + + self.ErrorPrototype = None + self.EvalErrorPrototype = None + self.RangeErrorPrototype = None + self.ReferenceErrorPrototype = None + self.SyntaxErrorPrototype = None + self.TypeErrorPrototype = None + self.URIErrorPrototype = None + + self.interpreter = None + + @property + def ERROR_TYPES(self): + return { + 'Error': self.ErrorPrototype, + 'EvalError': self.EvalErrorPrototype, + 'RangeError': self.RangeErrorPrototype, + 'ReferenceError': self.ReferenceErrorPrototype, + 'SyntaxError': self.SyntaxErrorPrototype, + 'TypeError': self.TypeErrorPrototype, + 'URIError': self.URIErrorPrototype, + } + + def get_global_environment(self): + return self.GlobalCtx.variable_environment() + + def NewObject(self): + return PyJsObject(self.ObjectPrototype) + + def NewFunction(self, code, ctx, params, name, is_declaration, + definitions): + return PyJsFunction( + code, + ctx, + params, + name, + self, + is_declaration, + definitions, + prototype=self.FunctionPrototype) + + def NewDate(self, value): + return PyJsDate(value, self.DatePrototype) + + def NewArray(self, length=0): + return PyJsArray(length, self.ArrayPrototype) + + def NewError(self, typ, message): + return PyJsError(message, self.ERROR_TYPES[typ]) + + def NewRegExp(self, body, flags): + return PyJsRegExp(body, flags, self.RegExpPrototype) + + def ConstructArray(self, py_arr): + ''' note py_arr elems are NOT converted to PyJs types!''' + arr = self.NewArray(len(py_arr)) + arr._init(py_arr) + return arr + + def ConstructObject(self, py_obj): + ''' note py_obj items are NOT converted to PyJs types! ''' + obj = self.NewObject() + for k, v in py_obj.items(): + obj.put(unicode(k), v) + return obj diff --git a/Contents/Libraries/Shared/js2py/internals/speed.py b/Contents/Libraries/Shared/js2py/internals/speed.py new file mode 100644 index 000000000..3ca4079e7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/speed.py @@ -0,0 +1,62 @@ +from timeit import timeit +from collections import namedtuple +from array import array +from itertools import izip +from collections import deque + + +class Y(object): + UUU = 88 + + def __init__(self, x): + self.x = x + + def s(self, x): + return self.x + 1 + + +class X(Y): + A = 10 + B = 2 + C = 4 + D = 9 + + def __init__(self, x): + self.x = x + self.stack = [] + self.par = super(X, self) + + def s(self, x): + pass + + def __add__(self, other): + return self.x + other.x + + def another(self): + return Y.s(self, 1) + + def yet_another(self): + return self.par.s(1) + + +def add(a, b): + return a.x + b.x + + +t = [] + +Type = None +try: + print timeit( + """ + +t.append(4) +t.pop() + + + +""", + "from __main__ import X,Y,namedtuple,array,t,add,Type, izip", + number=1000000) +except: + raise diff --git a/Contents/Libraries/Shared/js2py/internals/trans_utils.py b/Contents/Libraries/Shared/js2py/internals/trans_utils.py new file mode 100644 index 000000000..f99c09945 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/internals/trans_utils.py @@ -0,0 +1,35 @@ +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +def to_key(literal_or_identifier): + ''' returns string representation of this object''' + if literal_or_identifier['type'] == 'Identifier': + return literal_or_identifier['name'] + elif literal_or_identifier['type'] == 'Literal': + k = literal_or_identifier['value'] + if isinstance(k, float): + return unicode(float_repr(k)) + elif 'regex' in literal_or_identifier: + return compose_regex(k) + elif isinstance(k, bool): + return u'true' if k else u'false' + elif k is None: + return u'null' + else: + return unicode(k) + + +def compose_regex(val): + reg, flags = val + # reg = REGEXP_CONVERTER._unescape_string(reg) + return u'/%s/%s' % (reg, flags) + + +def float_repr(f): + if int(f) == f: + return unicode(repr(int(f))) + return unicode(repr(f)) diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/__init__.py b/Contents/Libraries/Shared/js2py/legecy_translators/__init__.py new file mode 100644 index 000000000..d01e0f5fd --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotrek' diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/constants.py b/Contents/Libraries/Shared/js2py/legecy_translators/constants.py new file mode 100644 index 000000000..ea048f128 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/constants.py @@ -0,0 +1,308 @@ +from string import ascii_lowercase, digits +################################## +StringName = u'PyJsConstantString%d_' +NumberName = u'PyJsConstantNumber%d_' +RegExpName = u'PyJsConstantRegExp%d_' +################################## +ALPHAS = set(ascii_lowercase + ascii_lowercase.upper()) +NUMS = set(digits) +IDENTIFIER_START = ALPHAS.union(NUMS) +ESCAPE_CHARS = {'n', '0', 'b', 'f', 'r', 't', 'v', '"', "'", '\\'} +OCTAL = {'0', '1', '2', '3', '4', '5', '6', '7'} +HEX = set('0123456789abcdefABCDEF') +from utils import * +IDENTIFIER_PART = IDENTIFIER_PART.union({'.'}) + + +def _is_cancelled(source, n): + cancelled = False + k = 0 + while True: + k += 1 + if source[n - k] != '\\': + break + cancelled = not cancelled + return cancelled + + +def _ensure_regexp(source, n): #<- this function has to be improved + '''returns True if regexp starts at n else returns False + checks whether it is not a division ''' + markers = '(+~"\'=[%:?!*^|&-,;/\\' + k = 0 + while True: + k += 1 + if n - k < 0: + return True + char = source[n - k] + if char in markers: + return True + if char != ' ' and char != '\n': + break + return False + + +def parse_num(source, start, charset): + """Returns a first index>=start of chat not in charset""" + while start < len(source) and source[start] in charset: + start += 1 + return start + + +def parse_exponent(source, start): + """returns end of exponential, raises SyntaxError if failed""" + if not source[start] in {'e', 'E'}: + if source[start] in IDENTIFIER_PART: + raise SyntaxError('Invalid number literal!') + return start + start += 1 + if source[start] in {'-', '+'}: + start += 1 + FOUND = False + # we need at least one dig after exponent + while source[start] in NUMS: + FOUND = True + start += 1 + if not FOUND or source[start] in IDENTIFIER_PART: + raise SyntaxError('Invalid number literal!') + return start + + +def remove_constants(source): + '''Replaces Strings and Regexp literals in the source code with + identifiers and *removes comments*. Identifier is of the format: + + PyJsStringConst(String const number)_ - for Strings + PyJsRegExpConst(RegExp const number)_ - for RegExps + + Returns dict which relates identifier and replaced constant. + + Removes single line and multiline comments from JavaScript source code + Pseudo comments (inside strings) will not be removed. + + For example this line: + var x = "/*PSEUDO COMMENT*/ TEXT //ANOTHER PSEUDO COMMENT" + will be unaltered''' + source = ' ' + source + '\n' + comments = [] + inside_comment, single_comment = False, False + inside_single, inside_double = False, False + inside_regexp = False + regexp_class_count = 0 + n = 0 + while n < len(source): + char = source[n] + if char == '"' and not (inside_comment or inside_single + or inside_regexp): + if not _is_cancelled(source, n): + if inside_double: + inside_double[1] = n + 1 + comments.append(inside_double) + inside_double = False + else: + inside_double = [n, None, 0] + elif char == "'" and not (inside_comment or inside_double + or inside_regexp): + if not _is_cancelled(source, n): + if inside_single: + inside_single[1] = n + 1 + comments.append(inside_single) + inside_single = False + else: + inside_single = [n, None, 0] + elif (inside_single or inside_double): + if char in LINE_TERMINATOR: + if _is_cancelled(source, n): + if char == CR and source[n + 1] == LF: + n += 1 + n += 1 + continue + else: + raise SyntaxError( + 'Invalid string literal. Line terminators must be escaped!' + ) + else: + if inside_comment: + if single_comment: + if char in LINE_TERMINATOR: + inside_comment[1] = n + comments.append(inside_comment) + inside_comment = False + single_comment = False + else: # Multiline + if char == '/' and source[n - 1] == '*': + inside_comment[1] = n + 1 + comments.append(inside_comment) + inside_comment = False + elif inside_regexp: + if not quiting_regexp: + if char in LINE_TERMINATOR: + raise SyntaxError( + 'Invalid regexp literal. Line terminators cant appear!' + ) + if _is_cancelled(source, n): + n += 1 + continue + if char == '[': + regexp_class_count += 1 + elif char == ']': + regexp_class_count = max(regexp_class_count - 1, 0) + elif char == '/' and not regexp_class_count: + quiting_regexp = True + else: + if char not in IDENTIFIER_START: + inside_regexp[1] = n + comments.append(inside_regexp) + inside_regexp = False + elif char == '/' and source[n - 1] == '/': + single_comment = True + inside_comment = [n - 1, None, 1] + elif char == '*' and source[n - 1] == '/': + inside_comment = [n - 1, None, 1] + elif char == '/' and source[n + 1] not in ('/', '*'): + if not _ensure_regexp(source, n): #<- improve this one + n += 1 + continue #Probably just a division + quiting_regexp = False + inside_regexp = [n, None, 2] + elif not (inside_comment or inside_regexp): + if (char in NUMS and + source[n - 1] not in IDENTIFIER_PART) or char == '.': + if char == '.': + k = parse_num(source, n + 1, NUMS) + if k == n + 1: # just a stupid dot... + n += 1 + continue + k = parse_exponent(source, k) + elif char == '0' and source[n + 1] in { + 'x', 'X' + }: #Hex number probably + k = parse_num(source, n + 2, HEX) + if k == n + 2 or source[k] in IDENTIFIER_PART: + raise SyntaxError('Invalid hex literal!') + else: #int or exp or flot or exp flot + k = parse_num(source, n + 1, NUMS) + if source[k] == '.': + k = parse_num(source, k + 1, NUMS) + k = parse_exponent(source, k) + comments.append((n, k, 3)) + n = k + continue + n += 1 + res = '' + start = 0 + count = 0 + constants = {} + for end, next_start, typ in comments: + res += source[start:end] + start = next_start + if typ == 0: # String + name = StringName + elif typ == 1: # comment + continue + elif typ == 2: # regexp + name = RegExpName + elif typ == 3: # number + name = NumberName + else: + raise RuntimeError() + res += ' ' + name % count + ' ' + constants[name % count] = source[end:next_start] + count += 1 + res += source[start:] + # remove this stupid white space + for e in WHITE: + res = res.replace(e, ' ') + res = res.replace(CR + LF, '\n') + for e in LINE_TERMINATOR: + res = res.replace(e, '\n') + return res.strip(), constants + + +def recover_constants(py_source, + replacements): #now has n^2 complexity. improve to n + '''Converts identifiers representing Js constants to the PyJs constants + PyJsNumberConst_1_ which has the true value of 5 will be converted to PyJsNumber(5)''' + for identifier, value in replacements.iteritems(): + if identifier.startswith('PyJsConstantRegExp'): + py_source = py_source.replace(identifier, + 'JsRegExp(%s)' % repr(value)) + elif identifier.startswith('PyJsConstantString'): + py_source = py_source.replace( + identifier, 'Js(u%s)' % unify_string_literals(value)) + else: + py_source = py_source.replace(identifier, 'Js(%s)' % value) + return py_source + + +def unify_string_literals(js_string): + """this function parses the string just like javascript + for example literal '\d' in JavaScript would be interpreted + as 'd' - backslash would be ignored and in Pyhon this + would be interpreted as '\\d' This function fixes this problem.""" + n = 0 + res = '' + limit = len(js_string) + while n < limit: + char = js_string[n] + if char == '\\': + new, n = do_escape(js_string, n) + res += new + else: + res += char + n += 1 + return res + + +def unify_regexp_literals(js): + pass + + +def do_escape(source, n): + """Its actually quite complicated to cover every case :) + http://www.javascriptkit.com/jsref/escapesequence.shtml""" + if not n + 1 < len(source): + return '' # not possible here but can be possible in general case. + if source[n + 1] in LINE_TERMINATOR: + if source[n + 1] == CR and n + 2 < len(source) and source[n + 2] == LF: + return source[n:n + 3], n + 3 + return source[n:n + 2], n + 2 + if source[n + 1] in ESCAPE_CHARS: + return source[n:n + 2], n + 2 + if source[n + 1] in {'x', 'u'}: + char, length = ('u', 4) if source[n + 1] == 'u' else ('x', 2) + n += 2 + end = parse_num(source, n, HEX) + if end - n < length: + raise SyntaxError('Invalid escape sequence!') + #if length==4: + # return unichr(int(source[n:n+4], 16)), n+4 # <- this was a very bad way of solving this problem :) + return source[n - 2:n + length], n + length + if source[n + 1] in OCTAL: + n += 1 + end = parse_num(source, n, OCTAL) + end = min(end, n + 3) # cant be longer than 3 + # now the max allowed is 377 ( in octal) and 255 in decimal + max_num = 255 + num = 0 + len_parsed = 0 + for e in source[n:end]: + cand = 8 * num + int(e) + if cand > max_num: + break + num = cand + len_parsed += 1 + # we have to return in a different form because python may want to parse more... + # for example '\777' will be parsed by python as a whole while js will use only \77 + return '\\' + hex(num)[1:], n + len_parsed + return source[n + 1], n + 2 + + +#####TEST###### + +if __name__ == '__main__': + test = (''' + ''') + + t, d = remove_constants(test) + print t, d diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/exps.py b/Contents/Libraries/Shared/js2py/legecy_translators/exps.py new file mode 100644 index 000000000..3c8f793cd --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/exps.py @@ -0,0 +1,83 @@ +""" +exp_translate routine: +It takes a single line of JS code and returns a SINGLE line of Python code. +Note var is not present here because it was removed in previous stages. Also remove this useless void keyword +If case of parsing errors it must return a pos of error. +1. Convert all assignment operations to put operations, this may be hard :( DONE, wasn't that bad +2. Convert all gets and calls to get and callprop. +3. Convert unary operators like typeof, new, !, delete, ++, -- + Delete can be handled by replacing last get method with delete. +4. Convert remaining operators that are not handled by python: + &&, || <= these should be easy simply replace && by and and || by or + === and !== + comma operator , in, instanceof and finally :? + + +NOTES: +Strings and other literals are not present so each = means assignment +""" +from utils import * +from jsparser import * + + +def exps_translator(js): + #Check () {} and [] nums + ass = assignment_translator(js) + + +# Step 1 +def assignment_translator(js): + sep = js.split(',') + res = sep[:] + for i, e in enumerate(sep): + if '=' not in e: # no need to convert + continue + res[i] = bass_translator(e) + return ','.join(res) + + +def bass_translator(s): + # I hope that I will not have to fix any bugs here because it will be terrible + if '(' in s or '[' in s: + converted = '' + for e in bracket_split(s, ['()', '[]'], strip=False): + if e[0] == '(': + converted += '(' + bass_translator(e[1:-1]) + ')' + elif e[0] == '[': + converted += '[' + bass_translator(e[1:-1]) + ']' + else: + converted += e + s = converted + if '=' not in s: + return s + ass = reversed(s.split('=')) + last = ass.next() + res = last + for e in ass: + op = '' + if e[-1] in OP_METHODS: #increment assign like += + op = ', "' + e[-1] + '"' + e = e[:-1] + cand = e.strip( + '() ') # (a) = 40 is valid so we need to transform '(a) ' to 'a' + if not is_property_accessor(cand): # it is not a property assignment + if not is_lval(cand) or is_internal(cand): + raise SyntaxError('Invalid left-hand side in assignment') + res = 'var.put(%s, %s%s)' % (cand.__repr__(), res, op) + elif cand[-1] == ']': # property assignment via [] + c = list(bracket_split(cand, ['[]'], strip=False)) + meth, prop = ''.join(c[:-1]).strip(), c[-1][1:-1].strip( + ) #this does not have to be a string so dont remove + #() because it can be a call + res = '%s.put(%s, %s%s)' % (meth, prop, res, op) + else: # Prop set via '.' + c = cand.rfind('.') + meth, prop = cand[:c].strip(), cand[c + 1:].strip('() ') + if not is_lval(prop): + raise SyntaxError('Invalid left-hand side in assignment') + res = '%s.put(%s, %s%s)' % (meth, prop.__repr__(), res, op) + return res + + +if __name__ == '__main__': + print bass_translator('3.ddsd = 40') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/flow.py b/Contents/Libraries/Shared/js2py/legecy_translators/flow.py new file mode 100644 index 000000000..9e2bb0fa7 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/flow.py @@ -0,0 +1,480 @@ +"""This module translates JS flow into PY flow. + +Translates: +IF ELSE + +DO WHILE +WHILE +FOR 123 +FOR iter +CONTINUE, BREAK, RETURN, LABEL, THROW, TRY, SWITCH +""" +from utils import * +from jsparser import * +from nodevisitor import exp_translator +import random + +TO_REGISTER = [] +CONTINUE_LABEL = 'JS_CONTINUE_LABEL_%s' +BREAK_LABEL = 'JS_BREAK_LABEL_%s' + +PREPARE = '''HOLDER = var.own.get(NAME)\nvar.force_own_put(NAME, PyExceptionToJs(PyJsTempException))\n''' +RESTORE = '''if HOLDER is not None:\n var.own[NAME] = HOLDER\nelse:\n del var.own[NAME]\ndel HOLDER\n''' +TRY_CATCH = '''%stry:\nBLOCKfinally:\n%s''' % (PREPARE, indent(RESTORE)) + + +def get_continue_label(label): + return CONTINUE_LABEL % label.encode('hex') + + +def get_break_label(label): + return BREAK_LABEL % label.encode('hex') + + +def pass_until(source, start, tokens=(';', )): + while start < len(source) and source[start] not in tokens: + start += 1 + return start + 1 + + +def do_bracket_exp(source, start, throw=True): + bra, cand = pass_bracket(source, start, '()') + if throw and not bra: + raise SyntaxError('Missing bracket expression') + bra = exp_translator(bra[1:-1]) + if throw and not bra: + raise SyntaxError('Empty bracket condition') + return bra, cand if bra else start + + +def do_if(source, start): + start += 2 # pass this if + bra, start = do_bracket_exp(source, start, throw=True) + statement, start = do_statement(source, start) + if statement is None: + raise SyntaxError('Invalid if statement') + translated = 'if %s:\n' % bra + indent(statement) + + elseif = except_keyword(source, start, 'else') + is_elseif = False + if elseif: + start = elseif + if except_keyword(source, start, 'if'): + is_elseif = True + elseif, start = do_statement(source, start) + if elseif is None: + raise SyntaxError('Invalid if statement)') + if is_elseif: + translated += 'el' + elseif + else: + translated += 'else:\n' + indent(elseif) + return translated, start + + +def do_statement(source, start): + """returns none if not found other functions that begin with 'do_' raise + also this do_ type function passes white space""" + start = pass_white(source, start) + # start is the fist position after initial start that is not a white space or \n + if not start < len(source): #if finished parsing return None + return None, start + if any(startswith_keyword(source[start:], e) for e in {'case', 'default'}): + return None, start + rest = source[start:] + for key, meth in KEYWORD_METHODS.iteritems( + ): # check for statements that are uniquely defined by their keywords + if rest.startswith(key): + # has to startwith this keyword and the next letter after keyword must be either EOF or not in IDENTIFIER_PART + if len(key) == len(rest) or rest[len(key)] not in IDENTIFIER_PART: + return meth(source, start) + if rest[0] == '{': #Block + return do_block(source, start) + # Now only label and expression left + cand = parse_identifier(source, start, False) + if cand is not None: # it can mean that its a label + label, cand_start = cand + cand_start = pass_white(source, cand_start) + if source[cand_start] == ':': + return do_label(source, start) + return do_expression(source, start) + + +def do_while(source, start): + start += 5 # pass while + bra, start = do_bracket_exp(source, start, throw=True) + statement, start = do_statement(source, start) + if statement is None: + raise SyntaxError('Missing statement to execute in while loop!') + return 'while %s:\n' % bra + indent(statement), start + + +def do_dowhile(source, start): + start += 2 # pass do + statement, start = do_statement(source, start) + if statement is None: + raise SyntaxError('Missing statement to execute in do while loop!') + start = except_keyword(source, start, 'while') + if not start: + raise SyntaxError('Missing while keyword in do-while loop') + bra, start = do_bracket_exp(source, start, throw=True) + statement += 'if not %s:\n' % bra + indent('break\n') + return 'while 1:\n' + indent(statement), start + + +def do_block(source, start): + bra, start = pass_bracket(source, start, '{}') + #print source[start:], bra + #return bra +'\n', start + if bra is None: + raise SyntaxError('Missing block ( {code} )') + code = '' + bra = bra[1:-1] + ';' + bra_pos = 0 + while bra_pos < len(bra): + st, bra_pos = do_statement(bra, bra_pos) + if st is None: + break + code += st + bra_pos = pass_white(bra, bra_pos) + if bra_pos < len(bra): + raise SyntaxError('Block has more code that could not be parsed:\n' + + bra[bra_pos:]) + return code, start + + +def do_empty(source, start): + return 'pass\n', start + 1 + + +def do_expression(source, start): + start = pass_white(source, start) + end = pass_until(source, start, tokens=(';', )) + if end == start + 1: #empty statement + return 'pass\n', end + # AUTOMATIC SEMICOLON INSERTION FOLLOWS + # Without ASI this function would end with: return exp_translator(source[start:end].rstrip(';'))+'\n', end + # ASI makes things a bit more complicated: + # we will try to parse as much as possible, inserting ; in place of last new line in case of error + rev = False + rpos = 0 + while True: + try: + code = source[start:end].rstrip(';') + cand = exp_translator(code) + '\n', end + just_to_test = compile(cand[0], '', 'exec') + return cand + except Exception as e: + if not rev: + rev = source[start:end][::-1] + lpos = rpos + while True: + rpos = pass_until(rev, rpos, LINE_TERMINATOR) + if rpos >= len(rev): + raise + if filter(lambda x: x not in SPACE, rev[lpos:rpos]): + break + end = start + len(rev) - rpos + 1 + + +def do_var(source, start): + #todo auto ; insertion + start += 3 #pass var + end = pass_until(source, start, tokens=(';', )) + defs = argsplit( + source[start:end - 1] + ) # defs is the list of defined vars with optional initializer + code = '' + for de in defs: + var, var_end = parse_identifier(de, 0, True) + TO_REGISTER.append(var) + var_end = pass_white(de, var_end) + if var_end < len( + de + ): # we have something more to parse... It has to start with = + if de[var_end] != '=': + raise SyntaxError( + 'Unexpected initializer in var statement. Expected "=", got "%s"' + % de[var_end]) + code += exp_translator(de) + '\n' + if not code.strip(): + code = 'pass\n' + return code, end + + +def do_label(source, start): + label, end = parse_identifier(source, start) + end = pass_white(source, end) + #now source[end] must be : + assert source[end] == ':' + end += 1 + inside, end = do_statement(source, end) + if inside is None: + raise SyntaxError('Missing statement after label') + defs = '' + if inside.startswith('while ') or inside.startswith( + 'for ') or inside.startswith('#for'): + # we have to add contine label as well... + # 3 or 1 since #for loop type has more lines before real for. + sep = 1 if not inside.startswith('#for') else 3 + cont_label = get_continue_label(label) + temp = inside.split('\n') + injected = 'try:\n' + '\n'.join(temp[sep:]) + injected += 'except %s:\n pass\n' % cont_label + inside = '\n'.join(temp[:sep]) + '\n' + indent(injected) + defs += 'class %s(Exception): pass\n' % cont_label + break_label = get_break_label(label) + inside = 'try:\n%sexcept %s:\n pass\n' % (indent(inside), break_label) + defs += 'class %s(Exception): pass\n' % break_label + return defs + inside, end + + +def do_for(source, start): + start += 3 # pass for + entered = start + bra, start = pass_bracket(source, start, '()') + inside, start = do_statement(source, start) + if inside is None: + raise SyntaxError('Missing statement after for') + bra = bra[1:-1] + if ';' in bra: + init = argsplit(bra, ';') + if len(init) != 3: + raise SyntaxError('Invalid for statement') + args = [] + for i, item in enumerate(init): + end = pass_white(item, 0) + if end == len(item): + args.append('' if i != 1 else '1') + continue + if not i and except_keyword(item, end, 'var') is not None: + # var statement + args.append(do_var(item, end)[0]) + continue + args.append(do_expression(item, end)[0]) + return '#for JS loop\n%swhile %s:\n%s%s\n' % ( + args[0], args[1].strip(), indent(inside), indent(args[2])), start + # iteration + end = pass_white(bra, 0) + register = False + if bra[end:].startswith('var '): + end += 3 + end = pass_white(bra, end) + register = True + name, end = parse_identifier(bra, end) + if register: + TO_REGISTER.append(name) + end = pass_white(bra, end) + if bra[end:end + 2] != 'in' or bra[end + 2] in IDENTIFIER_PART: + #print source[entered-10:entered+50] + raise SyntaxError('Invalid "for x in y" statement') + end += 2 # pass in + exp = exp_translator(bra[end:]) + res = 'for temp in %s:\n' % exp + res += indent('var.put(%s, temp)\n' % name.__repr__()) + indent(inside) + return res, start + + +# todo - IMPORTANT +def do_continue(source, start, name='continue'): + start += len(name) #pass continue + start = pass_white(source, start) + if start < len(source) and source[start] == ';': + return '%s\n' % name, start + 1 + # labeled statement or error + label, start = parse_identifier(source, start) + start = pass_white(source, start) + if start < len(source) and source[start] != ';': + raise SyntaxError('Missing ; after label name in %s statement' % name) + return 'raise %s("%s")\n' % (get_continue_label(label) + if name == 'continue' else + get_break_label(label), name), start + 1 + + +def do_break(source, start): + return do_continue(source, start, 'break') + + +def do_return(source, start): + start += 6 # pass return + end = source.find(';', start) + 1 + if end == -1: + end = len(source) + trans = exp_translator(source[start:end].rstrip(';')) + return 'return %s\n' % (trans if trans else "var.get('undefined')"), end + + +# todo later?- Also important +def do_throw(source, start): + start += 5 # pass throw + end = source.find(';', start) + 1 + if not end: + end = len(source) + trans = exp_translator(source[start:end].rstrip(';')) + if not trans: + raise SyntaxError('Invalid throw statement: nothing to throw') + res = 'PyJsTempException = JsToPyException(%s)\nraise PyJsTempException\n' % trans + return res, end + + +def do_try(source, start): + start += 3 # pass try + block, start = do_block(source, start) + result = 'try:\n%s' % indent(block) + catch = except_keyword(source, start, 'catch') + if catch: + bra, catch = pass_bracket(source, catch, '()') + bra = bra[1:-1] + identifier, bra_end = parse_identifier(bra, 0) + holder = 'PyJsHolder_%s_%d' % (identifier.encode('hex'), + random.randrange(1e8)) + identifier = identifier.__repr__() + bra_end = pass_white(bra, bra_end) + if bra_end < len(bra): + raise SyntaxError('Invalid content of catch statement') + result += 'except PyJsException as PyJsTempException:\n' + block, catch = do_block(source, catch) + # fill in except ( catch ) block and remember to recover holder variable to its previous state + result += indent( + TRY_CATCH.replace('HOLDER', holder).replace('NAME', + identifier).replace( + 'BLOCK', + indent(block))) + start = max(catch, start) + final = except_keyword(source, start, 'finally') + if not (final or catch): + raise SyntaxError( + 'Try statement has to be followed by catch or finally') + if not final: + return result, start + # translate finally statement + block, start = do_block(source, final) + return result + 'finally:\n%s' % indent(block), start + + +def do_debugger(source, start): + start += 8 # pass debugger + end = pass_white(source, start) + if end < len(source) and source[end] == ';': + end += 1 + return 'pass\n', end #ignore errors... + + +# todo automatic ; insertion. fuck this crappy feature + +# Least important + + +def do_switch(source, start): + start += 6 # pass switch + code = 'while 1:\n' + indent('SWITCHED = False\nCONDITION = (%s)\n') + # parse value of check + val, start = pass_bracket(source, start, '()') + if val is None: + raise SyntaxError('Missing () after switch statement') + if not val.strip(): + raise SyntaxError('Missing content inside () after switch statement') + code = code % exp_translator(val) + bra, start = pass_bracket(source, start, '{}') + if bra is None: + raise SyntaxError('Missing block {} after switch statement') + bra_pos = 0 + bra = bra[1:-1] + ';' + while True: + case = except_keyword(bra, bra_pos, 'case') + default = except_keyword(bra, bra_pos, 'default') + assert not (case and default) + if case or default: # this ?: expression makes things much harder.... + case_code = None + if case: + case_code = 'if SWITCHED or PyJsStrictEq(CONDITION, %s):\n' + # we are looking for a first : with count 1. ? gives -1 and : gives +1. + count = 0 + for pos, e in enumerate(bra[case:], case): + if e == '?': + count -= 1 + elif e == ':': + count += 1 + if count == 1: + break + else: + raise SyntaxError( + 'Missing : token after case in switch statement') + case_condition = exp_translator( + bra[case:pos]) # switch {case CONDITION: statements} + case_code = case_code % case_condition + case = pos + 1 + if default: + case = except_token(bra, default, ':') + case_code = 'if True:\n' + # now parse case statements (things after ':' ) + cand, case = do_statement(bra, case) + while cand: + case_code += indent(cand) + cand, case = do_statement(bra, case) + case_code += indent('SWITCHED = True\n') + code += indent(case_code) + bra_pos = case + else: + break + # prevent infinite loop :) + code += indent('break\n') + return code, start + + +def do_pyimport(source, start): + start += 8 + lib, start = parse_identifier(source, start) + jlib = 'PyImport_%s' % lib + code = 'import %s as %s\n' % (lib, jlib) + #check whether valid lib name... + try: + compile(code, '', 'exec') + except: + raise SyntaxError( + 'Invalid Python module name (%s) in pyimport statement' % lib) + # var.pyimport will handle module conversion to PyJs object + code += 'var.pyimport(%s, %s)\n' % (repr(lib), jlib) + return code, start + + +def do_with(source, start): + raise NotImplementedError('With statement is not implemented yet :(') + + +KEYWORD_METHODS = { + 'do': do_dowhile, + 'while': do_while, + 'if': do_if, + 'throw': do_throw, + 'return': do_return, + 'continue': do_continue, + 'break': do_break, + 'try': do_try, + 'for': do_for, + 'switch': do_switch, + 'var': do_var, + 'debugger': do_debugger, # this one does not do anything + 'with': do_with, + 'pyimport': do_pyimport +} + +#Also not specific statements (harder to detect) +# Block {} +# Expression or Empty Statement +# Label +# +# Its easy to recognize block but harder to distinguish between label and expression statement + + +def translate_flow(source): + """Source cant have arrays, object, constant or function literals. + Returns PySource and variables to register""" + global TO_REGISTER + TO_REGISTER = [] + return do_block('{%s}' % source, 0)[0], TO_REGISTER + + +if __name__ == '__main__': + #print do_dowhile('do {} while(k+f)', 0)[0] + #print 'e: "%s"'%do_expression('++(c?g:h); mj', 0)[0] + print translate_flow('a; yimport test')[0] diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/functions.py b/Contents/Libraries/Shared/js2py/legecy_translators/functions.py new file mode 100644 index 000000000..4825eee0f --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/functions.py @@ -0,0 +1,98 @@ +"""This module removes JS functions from source code""" +from jsparser import * +from utils import * + +INLINE_NAME = 'PyJsLvalInline%d_' +INLINE_COUNT = 0 +PRE_EXP_STARTS = { + 'return', 'new', 'void', 'throw', 'typeof', 'in', 'instanceof' +} +PRE_ALLOWED = IDENTIFIER_PART.union({';', '{', '}', ']', ')', ':'}) +INCREMENTS = {'++', '--'} + + +def reset_inline_count(): + global INLINE_COUNT + INLINE_COUNT = 0 + + +def remove_functions(source, all_inline=False): + """removes functions and returns new source, and 2 dicts. + first dict with removed hoisted(global) functions and second with replaced inline functions""" + global INLINE_COUNT + inline = {} + hoisted = {} + n = 0 + limit = len(source) - 9 # 8 is length of 'function' + res = '' + last = 0 + while n < limit: + if n and source[n - 1] in IDENTIFIER_PART: + n += 1 + continue + if source[n:n + 8] == 'function' and source[n + + 8] not in IDENTIFIER_PART: + if source[:n].rstrip().endswith( + '.'): # allow function as a property name :) + n += 1 + continue + if source[n + 8:].lstrip().startswith( + ':'): # allow functions inside objects... + n += 1 + continue + entered = n + res += source[last:n] + name = '' + n = pass_white(source, n + 8) + if source[n] in IDENTIFIER_START: # hoisted function + name, n = parse_identifier(source, n) + args, n = pass_bracket(source, n, '()') + if not args: + raise SyntaxError('Function misses bracket with argnames ()') + args = args.strip('() \n') + args = tuple(parse_identifier(e, 0)[0] + for e in argsplit(args)) if args else () + if len(args) - len(set(args)): + # I know its legal in JS but python does not allow duplicate argnames + # I will not work around it + raise SyntaxError( + 'Function has duplicate argument names. Its not legal in this implementation. Sorry.' + ) + block, n = pass_bracket(source, n, '{}') + if not block: + raise SyntaxError( + 'Function does not have any code block to execute') + mixed = False # named function expression flag + if name and not all_inline: + # Here I will distinguish between named function expression (mixed) and a function statement + before = source[:entered].rstrip() + if any(endswith_keyword(before, e) for e in PRE_EXP_STARTS): + #print 'Ended ith keyword' + mixed = True + elif before and before[-1] not in PRE_ALLOWED and not before[ + -2:] in INCREMENTS: + #print 'Ended with'+repr(before[-1]), before[-1]=='}' + mixed = True + else: + #print 'FUNCTION STATEMENT' + #its a function statement. + # todo remove fucking label if present! + hoisted[name] = block, args + if not name or mixed or all_inline: # its a function expression (can be both named and not named) + #print 'FUNCTION EXPRESSION' + INLINE_COUNT += 1 + iname = INLINE_NAME % INLINE_COUNT # inline name + res += ' ' + iname + inline['%s@%s' % ( + iname, name + )] = block, args #here added real name at the end because it has to be added to the func scope + last = n + else: + n += 1 + res += source[last:] + return res, hoisted, inline + + +if __name__ == '__main__': + print remove_functions( + '5+5 function n (functiona ,functionaj) {dsd s, dsdd}') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py b/Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py new file mode 100644 index 000000000..a09537d31 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/jsparser.py @@ -0,0 +1,326 @@ +""" +The process of translating JS will go like that: # TOP = 'imports and scope set' + +1. Remove all the comments +2. Replace number, string and regexp literals with markers +4. Remove global Functions and move their translation to the TOP. Also add register code there. +5. Replace inline functions with lvals +6. Remove List and Object literals and replace them with lvals +7. Find and remove var declarations, generate python register code that would go on TOP. + +Here we should be left with global code only where 1 line of js code = 1 line of python code. +Routine translating this code should be called glob_translate: +1. Search for outer structures and translate them using glob and inside using exps_translate + + +exps_translate routine: +1. Remove outer {} +2. Split lines at ; +3. Convert line by line using exp_translate +4. In case of error in 3 try to insert ; according to ECMA rules and repeat 3. + +exp_translate routine: +It takes a single line of JS code and returns a SINGLE line of Python code. +Note var is not present here because it was removed in previous stages. +If case of parsing errors it must return a pos of error. +1. Convert all assignment operations to put operations, this may be hard :( +2. Convert all gets and calls to get and callprop. +3. Convert unary operators like typeof, new, !, delete. + Delete can be handled by replacing last get method with delete. +4. Convert remaining operators that are not handled by python eg: === and , + + + + + +lval format PyJsLvalNR +marker PyJs(TYPE_NAME)(NR) + +TODO +1. Number literal replacement +2. Array literal replacement +3. Object literal replacement +5. Function replacement +4. Literal replacement translators + + +""" + +from utils import * + +OP_METHODS = { + '*': '__mul__', + '/': '__div__', + '%': '__mod__', + '+': '__add__', + '-': '__sub__', + '<<': '__lshift__', + '>>': '__rshift__', + '&': '__and__', + '^': '__xor__', + '|': '__or__' +} + + +def dbg(source): + try: + with open('C:\Users\Piotrek\Desktop\dbg.py', 'w') as f: + f.write(source) + except: + pass + + +def indent(lines, ind=4): + return ind * ' ' + lines.replace('\n', '\n' + ind * ' ').rstrip(' ') + + +def inject_before_lval(source, lval, code): + if source.count(lval) > 1: + dbg(source) + print + print lval + raise RuntimeError('To many lvals (%s)' % lval) + elif not source.count(lval): + dbg(source) + print + print lval + assert lval not in source + raise RuntimeError('No lval found "%s"' % lval) + end = source.index(lval) + inj = source.rfind('\n', 0, end) + ind = inj + while source[ind + 1] == ' ': + ind += 1 + ind -= inj + return source[:inj + 1] + indent(code, ind) + source[inj + 1:] + + +def bracket_split(source, brackets=('()', '{}', '[]'), strip=False): + """DOES NOT RETURN EMPTY STRINGS (can only return empty bracket content if strip=True)""" + starts = [e[0] for e in brackets] + in_bracket = 0 + n = 0 + last = 0 + while n < len(source): + e = source[n] + if not in_bracket and e in starts: + in_bracket = 1 + start = n + b_start, b_end = brackets[starts.index(e)] + elif in_bracket: + if e == b_start: + in_bracket += 1 + elif e == b_end: + in_bracket -= 1 + if not in_bracket: + if source[last:start]: + yield source[last:start] + last = n + 1 + yield source[start + strip:n + 1 - strip] + n += 1 + if source[last:]: + yield source[last:] + + +def pass_bracket(source, start, bracket='()'): + """Returns content of brackets with brackets and first pos after brackets + if source[start] is followed by some optional white space and brackets. + Otherwise None""" + e = bracket_split(source[start:], [bracket], False) + try: + cand = e.next() + except StopIteration: + return None, None + if not cand.strip(): #white space... + try: + res = e.next() + return res, start + len(cand) + len(res) + except StopIteration: + return None, None + elif cand[-1] == bracket[1]: + return cand, start + len(cand) + else: + return None, None + + +def startswith_keyword(start, keyword): + start = start.lstrip() + if start.startswith(keyword): + if len(keyword) < len(start): + if start[len(keyword)] in IDENTIFIER_PART: + return False + return True + return False + + +def endswith_keyword(ending, keyword): + ending = ending.rstrip() + if ending.endswith(keyword): + if len(keyword) < len(ending): + if ending[len(ending) - len(keyword) - 1] in IDENTIFIER_PART: + return False + return True + return False + + +def pass_white(source, start): + n = start + while n < len(source): + if source[n] in SPACE: + n += 1 + else: + break + return n + + +def except_token(source, start, token, throw=True): + """Token can be only a single char. Returns position after token if found. Otherwise raises syntax error if throw + otherwise returns None""" + start = pass_white(source, start) + if start < len(source) and source[start] == token: + return start + 1 + if throw: + raise SyntaxError('Missing token. Expected %s' % token) + return None + + +def except_keyword(source, start, keyword): + """ Returns position after keyword if found else None + Note: skips white space""" + start = pass_white(source, start) + kl = len(keyword) #keyword len + if kl + start > len(source): + return None + if source[start:start + kl] != keyword: + return None + if kl + start < len(source) and source[start + kl] in IDENTIFIER_PART: + return None + return start + kl + + +def parse_identifier(source, start, throw=True): + """passes white space from start and returns first identifier, + if identifier invalid and throw raises SyntaxError otherwise returns None""" + start = pass_white(source, start) + end = start + if not end < len(source): + if throw: + raise SyntaxError('Missing identifier!') + return None + if source[end] not in IDENTIFIER_START: + if throw: + raise SyntaxError('Invalid identifier start: "%s"' % source[end]) + return None + end += 1 + while end < len(source) and source[end] in IDENTIFIER_PART: + end += 1 + if not is_valid_lval(source[start:end]): + if throw: + raise SyntaxError( + 'Invalid identifier name: "%s"' % source[start:end]) + return None + return source[start:end], end + + +def argsplit(args, sep=','): + """used to split JS args (it is not that simple as it seems because + sep can be inside brackets). + + pass args *without* brackets! + + Used also to parse array and object elements, and more""" + parsed_len = 0 + last = 0 + splits = [] + for e in bracket_split(args, brackets=['()', '[]', '{}']): + if e[0] not in {'(', '[', '{'}: + for i, char in enumerate(e): + if char == sep: + splits.append(args[last:parsed_len + i]) + last = parsed_len + i + 1 + parsed_len += len(e) + splits.append(args[last:]) + return splits + + +def split_add_ops(text): + """Specialized function splitting text at add/sub operators. + Operands are *not* translated. Example result ['op1', '+', 'op2', '-', 'op3']""" + n = 0 + text = text.replace('++', '##').replace( + '--', '@@') #text does not normally contain any of these + spotted = False # set to true if noticed anything other than +- or white space + last = 0 + while n < len(text): + e = text[n] + if e == '+' or e == '-': + if spotted: + yield text[last:n].replace('##', '++').replace('@@', '--') + yield e + last = n + 1 + spotted = False + elif e == '/' or e == '*' or e == '%': + spotted = False + elif e != ' ': + spotted = True + n += 1 + yield text[last:n].replace('##', '++').replace('@@', '--') + + +def split_at_any(text, + lis, + translate=False, + not_before=[], + not_after=[], + validitate=None): + """ doc """ + lis.sort(key=lambda x: len(x), reverse=True) + last = 0 + n = 0 + text_len = len(text) + while n < text_len: + if any(text[:n].endswith(e) + for e in not_before): #Cant end with end before + n += 1 + continue + for e in lis: + s = len(e) + if s + n > text_len: + continue + if validitate and not validitate(e, text[:n], text[n + s:]): + continue + if any(text[n + s:].startswith(e) + for e in not_after): #Cant end with end before + n += 1 + break + if e == text[n:n + s]: + yield text[last:n] if not translate else translate( + text[last:n]) + yield e + n += s + last = n + break + else: + n += 1 + yield text[last:n] if not translate else translate(text[last:n]) + + +def split_at_single(text, sep, not_before=[], not_after=[]): + """Works like text.split(sep) but separated fragments + cant end with not_before or start with not_after""" + n = 0 + lt, s = len(text), len(sep) + last = 0 + while n < lt: + if not s + n > lt: + if sep == text[n:n + s]: + if any(text[last:n].endswith(e) for e in not_before): + pass + elif any(text[n + s:].startswith(e) for e in not_after): + pass + else: + yield text[last:n] + last = n + s + n += s - 1 + n += 1 + yield text[last:] diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py b/Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py new file mode 100644 index 000000000..4d50545c9 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/nodevisitor.py @@ -0,0 +1,562 @@ +from jsparser import * +from utils import * +import re +from utils import * + +#Note all white space sent to this module must be ' ' so no '\n' +REPL = {} + +#PROBLEMS +# <<=, >>=, >>>= +# they are unusual so I will not fix that now. a++ +b works fine and a+++++b (a++ + ++b) does not work even in V8 +ASSIGNMENT_MATCH = '(?)=(?!=)' + + +def unary_validitator(keyword, before, after): + if keyword[-1] in IDENTIFIER_PART: + if not after or after[0] in IDENTIFIER_PART: + return False + if before and before[-1] in IDENTIFIER_PART: # I am not sure here... + return False + return True + + +def comb_validitator(keyword, before, after): + if keyword == 'instanceof' or keyword == 'in': + if before and before[-1] in IDENTIFIER_PART: + return False + elif after and after[0] in IDENTIFIER_PART: + return False + return True + + +def bracket_replace(code): + new = '' + for e in bracket_split(code, ['()', '[]'], False): + if e[0] == '[': + name = '#PYJSREPL' + str(len(REPL)) + '{' + new += name + REPL[name] = e + elif e[0] == '(': # can be a function call + name = '@PYJSREPL' + str(len(REPL)) + '}' + new += name + REPL[name] = e + else: + new += e + return new + + +class NodeVisitor: + def __init__(self, code): + self.code = code + + def rl(self, lis, op): + """performs this operation on a list from *right to left* + op must take 2 args + a,b,c => op(a, op(b, c))""" + it = reversed(lis) + res = trans(it.next()) + for e in it: + e = trans(e) + res = op(e, res) + return res + + def lr(self, lis, op): + """performs this operation on a list from *left to right* + op must take 2 args + a,b,c => op(op(a, b), c)""" + it = iter(lis) + res = trans(it.next()) + for e in it: + e = trans(e) + res = op(res, e) + return res + + def translate(self): + """Translates outer operation and calls translate on inner operation. + Returns fully translated code.""" + if not self.code: + return '' + new = bracket_replace(self.code) + #Check comma operator: + cand = new.split(',') #every comma in new must be an operator + if len(cand) > 1: #LR + return self.lr(cand, js_comma) + #Check = operator: + # dont split at != or !== or == or === or <= or >= + #note <<=, >>= or this >>> will NOT be supported + # maybe I will change my mind later + # Find this crappy ?: + if '?' in new: + cond_ind = new.find('?') + tenary_start = 0 + for ass in re.finditer(ASSIGNMENT_MATCH, new): + cand = ass.span()[1] + if cand < cond_ind: + tenary_start = cand + else: + break + actual_tenary = new[tenary_start:] + spl = ''.join(split_at_any(new, [':', '?'], translate=trans)) + tenary_translation = transform_crap(spl) + assignment = new[:tenary_start] + ' PyJsConstantTENARY' + return trans(assignment).replace('PyJsConstantTENARY', + tenary_translation) + cand = list(split_at_single(new, '=', ['!', '=', '<', '>'], ['='])) + if len(cand) > 1: # RL + it = reversed(cand) + res = trans(it.next()) + for e in it: + e = e.strip() + if not e: + raise SyntaxError('Missing left-hand in assignment!') + op = '' + if e[-2:] in OP_METHODS: + op = ',' + e[-2:].__repr__() + e = e[:-2] + elif e[-1:] in OP_METHODS: + op = ',' + e[-1].__repr__() + e = e[:-1] + e = trans(e) + #Now replace last get method with put and change args + c = list(bracket_split(e, ['()'])) + beg, arglist = ''.join(c[:-1]).strip(), c[-1].strip( + ) #strips just to make sure... I will remove it later + if beg[-4:] != '.get': + raise SyntaxError('Invalid left-hand side in assignment') + beg = beg[0:-3] + 'put' + arglist = arglist[0:-1] + ', ' + res + op + ')' + res = beg + arglist + return res + #Now check remaining 2 arg operators that are not handled by python + #They all have Left to Right (LR) associativity + order = [OR, AND, BOR, BXOR, BAND, EQS, COMPS, BSHIFTS, ADDS, MULTS] + # actually we dont need OR and AND because they can be handled easier. But just for fun + dangerous = ['<', '>'] + for typ in order: + #we have to use special method for ADDS since they can be also unary operation +/++ or -/-- FUCK + if '+' in typ: + cand = list(split_add_ops(new)) + else: + #dont translate. cant start or end on dangerous op. + cand = list( + split_at_any( + new, + typ.keys(), + False, + dangerous, + dangerous, + validitate=comb_validitator)) + if not len(cand) > 1: + continue + n = 1 + res = trans(cand[0]) + if not res: + raise SyntaxError("Missing operand!") + while n < len(cand): + e = cand[n] + if not e: + raise SyntaxError("Missing operand!") + if n % 2: + op = typ[e] + else: + res = op(res, trans(e)) + n += 1 + return res + #Now replace unary operators - only they are left + cand = list( + split_at_any( + new, UNARY.keys(), False, validitate=unary_validitator)) + if len(cand) > 1: #contains unary operators + if '++' in cand or '--' in cand: #it cant contain both ++ and -- + if '--' in cand: + op = '--' + meths = js_post_dec, js_pre_dec + else: + op = '++' + meths = js_post_inc, js_pre_inc + pos = cand.index(op) + if cand[pos - 1].strip(): # post increment + a = cand[pos - 1] + meth = meths[0] + elif cand[pos + 1].strip(): #pre increment + a = cand[pos + 1] + meth = meths[1] + else: + raise SyntaxError('Invalid use of ++ operator') + if cand[pos + 2:]: + raise SyntaxError('Too many operands') + operand = meth(trans(a)) + cand = cand[:pos - 1] + # now last cand should be operand and every other odd element should be empty + else: + operand = trans(cand[-1]) + del cand[-1] + for i, e in enumerate(reversed(cand)): + if i % 2: + if e.strip(): + raise SyntaxError('Too many operands') + else: + operand = UNARY[e](operand) + return operand + #Replace brackets + if new[0] == '@' or new[0] == '#': + if len( + list(bracket_split(new, ('#{', '@}'))) + ) == 1: # we have only one bracket, otherwise pseudobracket like @@.... + assert new in REPL + if new[0] == '#': + raise SyntaxError( + '[] cant be used as brackets! Use () instead.') + return '(' + trans(REPL[new][1:-1]) + ')' + #Replace function calls and prop getters + # 'now' must be a reference like: a or b.c.d but it can have also calls or getters ( for example a["b"](3)) + #From here @@ means a function call and ## means get operation (note they dont have to present) + it = bracket_split(new, ('#{', '@}')) + res = [] + for e in it: + if e[0] != '#' and e[0] != '@': + res += [x.strip() for x in e.split('.')] + else: + res += [e.strip()] + # res[0] can be inside @@ (name)... + res = filter(lambda x: x, res) + if is_internal(res[0]): + out = res[0] + elif res[0][0] in {'#', '@'}: + out = '(' + trans(REPL[res[0]][1:-1]) + ')' + elif is_valid_lval( + res[0]) or res[0] in {'this', 'false', 'true', 'null'}: + out = 'var.get(' + res[0].__repr__() + ')' + else: + if is_reserved(res[0]): + raise SyntaxError('Unexpected reserved word: "%s"' % res[0]) + raise SyntaxError('Invalid identifier: "%s"' % res[0]) + if len(res) == 1: + return out + n = 1 + while n < len(res): #now every func call is a prop call + e = res[n] + if e[0] == '@': # direct call + out += trans_args(REPL[e]) + n += 1 + continue + args = False #assume not prop call + if n + 1 < len(res) and res[n + 1][0] == '@': #prop call + args = trans_args(REPL[res[n + 1]])[1:] + if args != ')': + args = ',' + args + if e[0] == '#': + prop = trans(REPL[e][1:-1]) + else: + if not is_lval(e): + raise SyntaxError('Invalid identifier: "%s"' % e) + prop = e.__repr__() + if args: # prop call + n += 1 + out += '.callprop(' + prop + args + else: #prop get + out += '.get(' + prop + ')' + n += 1 + return out + + +def js_comma(a, b): + return 'PyJsComma(' + a + ',' + b + ')' + + +def js_or(a, b): + return '(' + a + ' or ' + b + ')' + + +def js_bor(a, b): + return '(' + a + '|' + b + ')' + + +def js_bxor(a, b): + return '(' + a + '^' + b + ')' + + +def js_band(a, b): + return '(' + a + '&' + b + ')' + + +def js_and(a, b): + return '(' + a + ' and ' + b + ')' + + +def js_strict_eq(a, b): + + return 'PyJsStrictEq(' + a + ',' + b + ')' + + +def js_strict_neq(a, b): + return 'PyJsStrictNeq(' + a + ',' + b + ')' + + +#Not handled by python in the same way like JS. For example 2==2==True returns false. +# In JS above would return true so we need brackets. +def js_abstract_eq(a, b): + return '(' + a + '==' + b + ')' + + +#just like == +def js_abstract_neq(a, b): + return '(' + a + '!=' + b + ')' + + +def js_lt(a, b): + return '(' + a + '<' + b + ')' + + +def js_le(a, b): + return '(' + a + '<=' + b + ')' + + +def js_ge(a, b): + return '(' + a + '>=' + b + ')' + + +def js_gt(a, b): + return '(' + a + '>' + b + ')' + + +def js_in(a, b): + return b + '.contains(' + a + ')' + + +def js_instanceof(a, b): + return a + '.instanceof(' + b + ')' + + +def js_lshift(a, b): + return '(' + a + '<<' + b + ')' + + +def js_rshift(a, b): + return '(' + a + '>>' + b + ')' + + +def js_shit(a, b): + return 'PyJsBshift(' + a + ',' + b + ')' + + +def js_add( + a, + b): # To simplify later process of converting unary operators + and ++ + return '(%s+%s)' % (a, b) + + +def js_sub(a, b): # To simplify + return '(%s-%s)' % (a, b) + + +def js_mul(a, b): + return '(' + a + '*' + b + ')' + + +def js_div(a, b): + return '(' + a + '/' + b + ')' + + +def js_mod(a, b): + return '(' + a + '%' + b + ')' + + +def js_typeof(a): + cand = list(bracket_split(a, ('()', ))) + if len(cand) == 2 and cand[0] == 'var.get': + return cand[0] + cand[1][:-1] + ',throw=False).typeof()' + return a + '.typeof()' + + +def js_void(a): + return '(' + a + ')' + + +def js_new(a): + cands = list(bracket_split(a, ('()', ))) + lim = len(cands) + if lim < 2: + return a + '.create()' + n = 0 + while n < lim: + c = cands[n] + if c[0] == '(': + if cands[n - 1].endswith( + '.get') and n + 1 >= lim: # last get operation. + return a + '.create()' + elif cands[n - 1][0] == '(': + return ''.join(cands[:n]) + '.create' + c + ''.join( + cands[n + 1:]) + elif cands[n - 1] == '.callprop': + beg = ''.join(cands[:n - 1]) + args = argsplit(c[1:-1], ',') + prop = args[0] + new_args = ','.join(args[1:]) + create = '.get(%s).create(%s)' % (prop, new_args) + return beg + create + ''.join(cands[n + 1:]) + n += 1 + return a + '.create()' + + +def js_delete(a): + #replace last get with delete. + c = list(bracket_split(a, ['()'])) + beg, arglist = ''.join(c[:-1]).strip(), c[-1].strip( + ) #strips just to make sure... I will remove it later + if beg[-4:] != '.get': + raise SyntaxError('Invalid delete operation') + return beg[:-3] + 'delete' + arglist + + +def js_neg(a): + return '(-' + a + ')' + + +def js_pos(a): + return '(+' + a + ')' + + +def js_inv(a): + return '(~' + a + ')' + + +def js_not(a): + return a + '.neg()' + + +def postfix(a, inc, post): + bra = list(bracket_split(a, ('()', ))) + meth = bra[-2] + if not meth.endswith('get'): + raise SyntaxError('Invalid ++ or -- operation.') + bra[-2] = bra[-2][:-3] + 'put' + bra[-1] = '(%s,%s%sJs(1))' % (bra[-1][1:-1], a, '+' if inc else '-') + res = ''.join(bra) + return res if not post else '(%s%sJs(1))' % (res, '-' if inc else '+') + + +def js_pre_inc(a): + return postfix(a, True, False) + + +def js_post_inc(a): + return postfix(a, True, True) + + +def js_pre_dec(a): + return postfix(a, False, False) + + +def js_post_dec(a): + return postfix(a, False, True) + + +OR = {'||': js_or} +AND = {'&&': js_and} +BOR = {'|': js_bor} +BXOR = {'^': js_bxor} +BAND = {'&': js_band} + +EQS = { + '===': js_strict_eq, + '!==': js_strict_neq, + '==': js_abstract_eq, # we need == and != too. Read a note above method + '!=': js_abstract_neq +} + +#Since JS does not have chained comparisons we need to implement all cmp methods. +COMPS = { + '<': js_lt, + '<=': js_le, + '>=': js_ge, + '>': js_gt, + 'instanceof': js_instanceof, #todo change to validitate + 'in': js_in +} + +BSHIFTS = {'<<': js_lshift, '>>': js_rshift, '>>>': js_shit} + +ADDS = {'+': js_add, '-': js_sub} + +MULTS = {'*': js_mul, '/': js_div, '%': js_mod} + +#Note they dont contain ++ and -- methods because they both have 2 different methods +# correct method will be found automatically in translate function +UNARY = { + 'typeof': js_typeof, + 'void': js_void, + 'new': js_new, + 'delete': js_delete, + '!': js_not, + '-': js_neg, + '+': js_pos, + '~': js_inv, + '++': None, + '--': None +} + + +def transform_crap(code): #needs some more tests + """Transforms this ?: crap into if else python syntax""" + ind = code.rfind('?') + if ind == -1: + return code + sep = code.find(':', ind) + if sep == -1: + raise SyntaxError('Invalid ?: syntax (probably missing ":" )') + beg = max(code.rfind(':', 0, ind), code.find('?', 0, ind)) + 1 + end = code.find(':', sep + 1) + end = len(code) if end == -1 else end + formula = '(' + code[ind + 1:sep] + ' if ' + code[ + beg:ind] + ' else ' + code[sep + 1:end] + ')' + return transform_crap(code[:beg] + formula + code[end:]) + + +from code import InteractiveConsole + +#e = InteractiveConsole(globals()).interact() +import traceback + + +def trans(code): + return NodeVisitor(code.strip()).translate().strip() + + +#todo finish this trans args +def trans_args(code): + new = bracket_replace(code.strip()[1:-1]) + args = ','.join(trans(e) for e in new.split(',')) + return '(%s)' % args + + +EXP = 0 + + +def exp_translator(code): + global REPL, EXP + EXP += 1 + REPL = {} + #print EXP, code + code = code.replace('\n', ' ') + assert '@' not in code + assert ';' not in code + assert '#' not in code + #if not code.strip(): #? + # return 'var.get("undefined")' + try: + return trans(code) + except: + #print '\n\ntrans failed on \n\n' + code + #raw_input('\n\npress enter') + raise + + +if __name__ == '__main__': + #print 'Here', trans('(eee ) . ii [ PyJsMarker ] [ jkj ] ( j , j ) . + # jiji (h , ji , i)(non )( )()()()') + for e in xrange(3): + print exp_translator('jk = kk.ik++') + #First line translated with PyJs: PyJsStrictEq(PyJsAdd((Js(100)*Js(50)),Js(30)), Js("5030")), yay! + print exp_translator('delete a.f') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/nparser.py b/Contents/Libraries/Shared/js2py/legecy_translators/nparser.py new file mode 100644 index 000000000..a9c97c9ae --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/nparser.py @@ -0,0 +1,3209 @@ +# JUST FOR NOW, later I will write my own - much faster and better. + +# Copyright (C) 2013 Ariya Hidayat +# Copyright (C) 2013 Thaddee Tyl +# Copyright (C) 2012 Ariya Hidayat +# Copyright (C) 2012 Mathias Bynens +# Copyright (C) 2012 Joost-Wim Boekesteijn +# Copyright (C) 2012 Kris Kowal +# Copyright (C) 2012 Yusuke Suzuki +# Copyright (C) 2012 Arpad Borsos +# Copyright (C) 2011 Ariya Hidayat +# +# 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. +# +# 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 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. + +# -*- coding: latin-1 -*- +from __future__ import print_function +import re + + +def typeof(t): + if t is None: return 'undefined' + elif isinstance(t, bool): return 'boolean' + elif isinstance(t, str): return 'string' + elif isinstance(t, int) or isinstance(t, float): return 'number' + elif hasattr(t, '__call__'): return 'function' + else: return 'object' + + +def list_indexOf(l, v): + try: + return l.index(v) + except: + return -1 + + +parseFloat = float +parseInt = int + + +class jsdict(object): + def __init__(self, d): + self.__dict__.update(d) + + def __getitem__(self, name): + if name in self.__dict__: + return self.__dict__[name] + else: + return None + + def __setitem__(self, name, value): + self.__dict__[name] = value + return value + + def __getattr__(self, name): + try: + return getattr(self, name) + except: + return None + + def __setattr__(self, name, value): + self[name] = value + return value + + def __contains__(self, name): + return name in self.__dict__ + + def __repr__(self): + return str(self.__dict__) + + +class RegExp(object): + def __init__(self, pattern, flags=''): + self.flags = flags + pyflags = 0 | re.M if 'm' in flags else 0 | re.I if 'i' in flags else 0 + self.source = pattern + self.pattern = re.compile(pattern, pyflags) + + def test(self, s): + return self.pattern.search(s) is not None + + +console = jsdict({"log": print}) + + +def __temp__42(object=None, body=None): + return jsdict({ + "type": Syntax.WithStatement, + "object": object, + "body": body, + }) + + +def __temp__41(test=None, body=None): + return jsdict({ + "type": Syntax.WhileStatement, + "test": test, + "body": body, + }) + + +def __temp__40(id=None, init=None): + return jsdict({ + "type": Syntax.VariableDeclarator, + "id": id, + "init": init, + }) + + +def __temp__39(declarations=None, kind=None): + return jsdict({ + "type": Syntax.VariableDeclaration, + "declarations": declarations, + "kind": kind, + }) + + +def __temp__38(operator=None, argument=None): + if (operator == "++") or (operator == "--"): + return jsdict({ + "type": Syntax.UpdateExpression, + "operator": operator, + "argument": argument, + "prefix": True, + }) + return jsdict({ + "type": Syntax.UnaryExpression, + "operator": operator, + "argument": argument, + "prefix": True, + }) + + +def __temp__37(block=None, guardedHandlers=None, handlers=None, + finalizer=None): + return jsdict({ + "type": Syntax.TryStatement, + "block": block, + "guardedHandlers": guardedHandlers, + "handlers": handlers, + "finalizer": finalizer, + }) + + +def __temp__36(argument=None): + return jsdict({ + "type": Syntax.ThrowStatement, + "argument": argument, + }) + + +def __temp__35(): + return jsdict({ + "type": Syntax.ThisExpression, + }) + + +def __temp__34(discriminant=None, cases=None): + return jsdict({ + "type": Syntax.SwitchStatement, + "discriminant": discriminant, + "cases": cases, + }) + + +def __temp__33(test=None, consequent=None): + return jsdict({ + "type": Syntax.SwitchCase, + "test": test, + "consequent": consequent, + }) + + +def __temp__32(expressions=None): + return jsdict({ + "type": Syntax.SequenceExpression, + "expressions": expressions, + }) + + +def __temp__31(argument=None): + return jsdict({ + "type": Syntax.ReturnStatement, + "argument": argument, + }) + + +def __temp__30(kind=None, key=None, value=None): + return jsdict({ + "type": Syntax.Property, + "key": key, + "value": value, + "kind": kind, + }) + + +def __temp__29(body=None): + return jsdict({ + "type": Syntax.Program, + "body": body, + }) + + +def __temp__28(operator=None, argument=None): + return jsdict({ + "type": Syntax.UpdateExpression, + "operator": operator, + "argument": argument, + "prefix": False, + }) + + +def __temp__27(properties=None): + return jsdict({ + "type": Syntax.ObjectExpression, + "properties": properties, + }) + + +def __temp__26(callee=None, args=None): + return jsdict({ + "type": Syntax.NewExpression, + "callee": callee, + "arguments": args, + }) + + +def __temp__25(accessor=None, object=None, property=None): + return jsdict({ + "type": Syntax.MemberExpression, + "computed": accessor == "[", + "object": object, + "property": property, + }) + + +def __temp__24(token=None): + return jsdict({ + "type": Syntax.Literal, + "value": token.value, + "raw": source[token.range[0]:token.range[1]], + }) + + +def __temp__23(label=None, body=None): + return jsdict({ + "type": Syntax.LabeledStatement, + "label": label, + "body": body, + }) + + +def __temp__22(test=None, consequent=None, alternate=None): + return jsdict({ + "type": Syntax.IfStatement, + "test": test, + "consequent": consequent, + "alternate": alternate, + }) + + +def __temp__21(name=None): + return jsdict({ + "type": Syntax.Identifier, + "name": name, + }) + + +def __temp__20(id=None, params=None, defaults=None, body=None): + return jsdict({ + "type": Syntax.FunctionExpression, + "id": id, + "params": params, + "defaults": defaults, + "body": body, + "rest": None, + "generator": False, + "expression": False, + }) + + +def __temp__19(id=None, params=None, defaults=None, body=None): + return jsdict({ + "type": Syntax.FunctionDeclaration, + "id": id, + "params": params, + "defaults": defaults, + "body": body, + "rest": None, + "generator": False, + "expression": False, + }) + + +def __temp__18(left=None, right=None, body=None): + return jsdict({ + "type": Syntax.ForInStatement, + "left": left, + "right": right, + "body": body, + "each": False, + }) + + +def __temp__17(init=None, test=None, update=None, body=None): + return jsdict({ + "type": Syntax.ForStatement, + "init": init, + "test": test, + "update": update, + "body": body, + }) + + +def __temp__16(expression=None): + return jsdict({ + "type": Syntax.ExpressionStatement, + "expression": expression, + }) + + +def __temp__15(): + return jsdict({ + "type": Syntax.EmptyStatement, + }) + + +def __temp__14(body=None, test=None): + return jsdict({ + "type": Syntax.DoWhileStatement, + "body": body, + "test": test, + }) + + +def __temp__13(): + return jsdict({ + "type": Syntax.DebuggerStatement, + }) + + +def __temp__12(label=None): + return jsdict({ + "type": Syntax.ContinueStatement, + "label": label, + }) + + +def __temp__11(test=None, consequent=None, alternate=None): + return jsdict({ + "type": Syntax.ConditionalExpression, + "test": test, + "consequent": consequent, + "alternate": alternate, + }) + + +def __temp__10(param=None, body=None): + return jsdict({ + "type": Syntax.CatchClause, + "param": param, + "body": body, + }) + + +def __temp__9(callee=None, args=None): + return jsdict({ + "type": Syntax.CallExpression, + "callee": callee, + "arguments": args, + }) + + +def __temp__8(label=None): + return jsdict({ + "type": Syntax.BreakStatement, + "label": label, + }) + + +def __temp__7(body=None): + return jsdict({ + "type": Syntax.BlockStatement, + "body": body, + }) + + +def __temp__6(operator=None, left=None, right=None): + type = (Syntax.LogicalExpression if (operator == "||") or + (operator == "&&") else Syntax.BinaryExpression) + return jsdict({ + "type": type, + "operator": operator, + "left": left, + "right": right, + }) + + +def __temp__5(operator=None, left=None, right=None): + return jsdict({ + "type": Syntax.AssignmentExpression, + "operator": operator, + "left": left, + "right": right, + }) + + +def __temp__4(elements=None): + return jsdict({ + "type": Syntax.ArrayExpression, + "elements": elements, + }) + + +def __temp__3(node=None): + if extra.source: + node.loc.source = extra.source + return node + + +def __temp__2(node=None): + if node.range or node.loc: + if extra.loc: + state.markerStack.pop() + state.markerStack.pop() + if extra.range: + state.markerStack.pop() + else: + SyntaxTreeDelegate.markEnd(node) + return node + + +def __temp__1(node=None): + if extra.range: + node.range = [state.markerStack.pop(), index] + if extra.loc: + node.loc = jsdict({ + "start": + jsdict({ + "line": state.markerStack.pop(), + "column": state.markerStack.pop(), + }), + "end": + jsdict({ + "line": lineNumber, + "column": index - lineStart, + }), + }) + SyntaxTreeDelegate.postProcess(node) + return node + + +def __temp__0(): + if extra.loc: + state.markerStack.append(index - lineStart) + state.markerStack.append(lineNumber) + if extra.range: + state.markerStack.append(index) + + +Token = None +TokenName = None +FnExprTokens = None +Syntax = None +PropertyKind = None +Messages = None +Regex = None +SyntaxTreeDelegate = None +source = None +strict = None +index = None +lineNumber = None +lineStart = None +length = None +delegate = None +lookahead = None +state = None +extra = None +Token = jsdict({ + "BooleanLiteral": 1, + "EOF": 2, + "Identifier": 3, + "Keyword": 4, + "NullLiteral": 5, + "NumericLiteral": 6, + "Punctuator": 7, + "StringLiteral": 8, + "RegularExpression": 9, +}) +TokenName = jsdict({}) +TokenName[Token.BooleanLiteral] = "Boolean" +TokenName[Token.EOF] = "" +TokenName[Token.Identifier] = "Identifier" +TokenName[Token.Keyword] = "Keyword" +TokenName[Token.NullLiteral] = "Null" +TokenName[Token.NumericLiteral] = "Numeric" +TokenName[Token.Punctuator] = "Punctuator" +TokenName[Token.StringLiteral] = "String" +TokenName[Token.RegularExpression] = "RegularExpression" +FnExprTokens = [ + "(", "{", "[", "in", "typeof", "instanceof", "new", "return", "case", + "delete", "throw", "void", "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", + ">>>=", "&=", "|=", "^=", ",", "+", "-", "*", "/", "%", "++", "--", "<<", + ">>", ">>>", "&", "|", "^", "!", "~", "&&", "||", "?", ":", "===", "==", + ">=", "<=", "<", ">", "!=", "!==" +] +Syntax = jsdict({ + "AssignmentExpression": "AssignmentExpression", + "ArrayExpression": "ArrayExpression", + "BlockStatement": "BlockStatement", + "BinaryExpression": "BinaryExpression", + "BreakStatement": "BreakStatement", + "CallExpression": "CallExpression", + "CatchClause": "CatchClause", + "ConditionalExpression": "ConditionalExpression", + "ContinueStatement": "ContinueStatement", + "DoWhileStatement": "DoWhileStatement", + "DebuggerStatement": "DebuggerStatement", + "EmptyStatement": "EmptyStatement", + "ExpressionStatement": "ExpressionStatement", + "ForStatement": "ForStatement", + "ForInStatement": "ForInStatement", + "FunctionDeclaration": "FunctionDeclaration", + "FunctionExpression": "FunctionExpression", + "Identifier": "Identifier", + "IfStatement": "IfStatement", + "Literal": "Literal", + "LabeledStatement": "LabeledStatement", + "LogicalExpression": "LogicalExpression", + "MemberExpression": "MemberExpression", + "NewExpression": "NewExpression", + "ObjectExpression": "ObjectExpression", + "Program": "Program", + "Property": "Property", + "ReturnStatement": "ReturnStatement", + "SequenceExpression": "SequenceExpression", + "SwitchStatement": "SwitchStatement", + "SwitchCase": "SwitchCase", + "ThisExpression": "ThisExpression", + "ThrowStatement": "ThrowStatement", + "TryStatement": "TryStatement", + "UnaryExpression": "UnaryExpression", + "UpdateExpression": "UpdateExpression", + "VariableDeclaration": "VariableDeclaration", + "VariableDeclarator": "VariableDeclarator", + "WhileStatement": "WhileStatement", + "WithStatement": "WithStatement", +}) +PropertyKind = jsdict({ + "Data": 1, + "Get": 2, + "Set": 4, +}) +Messages = jsdict({ + "UnexpectedToken": + "Unexpected token %0", + "UnexpectedNumber": + "Unexpected number", + "UnexpectedString": + "Unexpected string", + "UnexpectedIdentifier": + "Unexpected identifier", + "UnexpectedReserved": + "Unexpected reserved word", + "UnexpectedEOS": + "Unexpected end of input", + "NewlineAfterThrow": + "Illegal newline after throw", + "InvalidRegExp": + "Invalid regular expression", + "UnterminatedRegExp": + "Invalid regular expression: missing /", + "InvalidLHSInAssignment": + "Invalid left-hand side in assignment", + "InvalidLHSInForIn": + "Invalid left-hand side in for-in", + "MultipleDefaultsInSwitch": + "More than one default clause in switch statement", + "NoCatchOrFinally": + "Missing catch or finally after try", + "UnknownLabel": + "Undefined label '%0'", + "Redeclaration": + "%0 '%1' has already been declared", + "IllegalContinue": + "Illegal continue statement", + "IllegalBreak": + "Illegal break statement", + "IllegalReturn": + "Illegal return statement", + "StrictModeWith": + "Strict mode code may not include a with statement", + "StrictCatchVariable": + "Catch variable may not be eval or arguments in strict mode", + "StrictVarName": + "Variable name may not be eval or arguments in strict mode", + "StrictParamName": + "Parameter name eval or arguments is not allowed in strict mode", + "StrictParamDupe": + "Strict mode function may not have duplicate parameter names", + "StrictFunctionName": + "Function name may not be eval or arguments in strict mode", + "StrictOctalLiteral": + "Octal literals are not allowed in strict mode.", + "StrictDelete": + "Delete of an unqualified identifier in strict mode.", + "StrictDuplicateProperty": + "Duplicate data property in object literal not allowed in strict mode", + "AccessorDataProperty": + "Object literal may not have data and accessor property with the same name", + "AccessorGetSet": + "Object literal may not have multiple get/set accessors with the same name", + "StrictLHSAssignment": + "Assignment to eval or arguments is not allowed in strict mode", + "StrictLHSPostfix": + "Postfix increment/decrement may not have eval or arguments operand in strict mode", + "StrictLHSPrefix": + "Prefix increment/decrement may not have eval or arguments operand in strict mode", + "StrictReservedWord": + "Use of future reserved word in strict mode", +}) +Regex = jsdict({ + "NonAsciiIdentifierStart": + RegExp( + u"[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]" + ), + "NonAsciiIdentifierPart": + RegExp( + u"[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]" + ), +}) + + +def assert__py__(condition=None, message=None): + if not condition: + raise RuntimeError("ASSERT: " + message) + + +def isDecimalDigit(ch=None): + return (ch >= 48) and (ch <= 57) + + +def isHexDigit(ch=None): + return "0123456789abcdefABCDEF".find(ch) >= 0 + + +def isOctalDigit(ch=None): + return "01234567".find(ch) >= 0 + + +def isWhiteSpace(ch=None): + return ( + ((((ch == 32) or (ch == 9)) or (ch == 11)) or + (ch == 12)) or (ch == 160) + ) or ((ch >= 5760) and ( + u"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff" + .find(unichr(ch)) > 0)) + + +def isLineTerminator(ch=None): + return (((ch == 10) or (ch == 13)) or (ch == 8232)) or (ch == 8233) + + +def isIdentifierStart(ch=None): + return (((((ch == 36) or (ch == 95)) or ((ch >= 65) and (ch <= 90))) or + ((ch >= 97) and (ch <= 122))) or + (ch == 92)) or ((ch >= 128) + and Regex.NonAsciiIdentifierStart.test(unichr(ch))) + + +def isIdentifierPart(ch=None): + return ((((((ch == 36) or (ch == 95)) or ((ch >= 65) and (ch <= 90))) or + ((ch >= 97) and (ch <= 122))) or ((ch >= 48) and (ch <= 57))) or + (ch == 92)) or ((ch >= 128) + and Regex.NonAsciiIdentifierPart.test(unichr(ch))) + + +def isFutureReservedWord(id=None): + while 1: + if (id == "super") or ((id == "import") or ((id == "extends") or + ((id == "export") or + ((id == "enum") or + (id == "class"))))): + return True + else: + return False + break + + +def isStrictModeReservedWord(id=None): + while 1: + if (id == "let") or ((id == "yield") or + ((id == "static") or + ((id == "public") or + ((id == "protected") or + ((id == "private") or + ((id == "package") or + ((id == "interface") or + (id == "implements")))))))): + return True + else: + return False + break + + +def isRestrictedWord(id=None): + return (id == "eval") or (id == "arguments") + + +def isKeyword(id=None): + if strict and isStrictModeReservedWord(id): + return True + while 1: + if len(id) == 2: + return ((id == "if") or (id == "in")) or (id == "do") + elif len(id) == 3: + return ((((id == "var") or (id == "for")) or (id == "new")) or + (id == "try")) or (id == "let") + elif len(id) == 4: + return (((((id == "this") or (id == "else")) or (id == "case")) or + (id == "void")) or (id == "with")) or (id == "enum") + elif len(id) == 5: + return (((((((id == "while") or (id == "break")) or + (id == "catch")) or (id == "throw")) or + (id == "const")) or (id == "yield")) or + (id == "class")) or (id == "super") + elif len(id) == 6: + return (((((id == "return") or (id == "typeof")) or + (id == "delete")) or (id == "switch")) or + (id == "export")) or (id == "import") + elif len(id) == 7: + return ((id == "default") or + (id == "finally")) or (id == "extends") + elif len(id) == 8: + return ((id == "function") or + (id == "continue")) or (id == "debugger") + elif len(id) == 10: + return id == "instanceof" + else: + return False + break + + +def addComment(type=None, value=None, start=None, end=None, loc=None): + comment = None + assert__py__(('undefined' + if not 'start' in locals() else typeof(start)) == "number", + "Comment must have valid position") + if state.lastCommentStart >= start: + return + state.lastCommentStart = start + comment = jsdict({ + "type": type, + "value": value, + }) + if extra.range: + comment.range = [start, end] + if extra.loc: + comment.loc = loc + extra.comments.append(comment) + + +def skipSingleLineComment(): + global index, lineNumber, lineStart + start = None + loc = None + ch = None + comment = None + start = index - 2 + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": (index - lineStart) - 2, + }), + }) + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + index += 1 + index + if isLineTerminator(ch): + if extra.comments: + comment = source[(start + 2):(index - 1)] + loc.end = jsdict({ + "line": lineNumber, + "column": (index - lineStart) - 1, + }) + addComment("Line", comment, start, index - 1, loc) + if (ch == 13) and ( + (ord(source[index]) if index < len(source) else None) == 10): + index += 1 + index + lineNumber += 1 + lineNumber + lineStart = index + return + if extra.comments: + comment = source[(start + 2):index] + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + addComment("Line", comment, start, index, loc) + + +def skipMultiLineComment(): + global index, lineNumber, lineStart + start = None + loc = None + ch = None + comment = None + if extra.comments: + start = index - 2 + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": (index - lineStart) - 2, + }), + }) + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if isLineTerminator(ch): + if (ch == 13) and ((ord(source[index + 1]) if + (index + 1) < len(source) else None) == 10): + index += 1 + index + lineNumber += 1 + lineNumber + index += 1 + index + lineStart = index + if index >= length: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + elif ch == 42: + if (ord(source[index + 1]) if + (index + 1) < len(source) else None) == 47: + index += 1 + index + index += 1 + index + if extra.comments: + comment = source[(start + 2):(index - 2)] + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + addComment("Block", comment, start, index, loc) + return + index += 1 + index + else: + index += 1 + index + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + + +def skipComment(): + global index, lineNumber, lineStart + ch = None + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if isWhiteSpace(ch): + index += 1 + index + elif isLineTerminator(ch): + index += 1 + index + if (ch == 13) and ( + (ord(source[index]) if index < len(source) else None) == 10): + index += 1 + index + lineNumber += 1 + lineNumber + lineStart = index + elif ch == 47: + ch = (ord(source[index + 1]) if + (index + 1) < len(source) else None) + if ch == 47: + index += 1 + index + index += 1 + index + skipSingleLineComment() + elif ch == 42: + index += 1 + index + index += 1 + index + skipMultiLineComment() + else: + break + else: + break + + +def scanHexEscape(prefix=None): + global len__py__, index + i = None + len__py__ = None + ch = None + code = 0 + len__py__ = (4 if prefix == "u" else 2) + i = 0 + while 1: + if not (i < len__py__): + break + if (index < length) and isHexDigit(source[index]): + index += 1 + ch = source[index - 1] + code = (code * 16) + "0123456789abcdef".find(ch.lower()) + else: + return "" + i += 1 + return unichr(code) + + +def getEscapedIdentifier(): + global index + ch = None + id = None + index += 1 + index += 1 + ch = (ord(source[index - 1]) if index - 1 < len(source) else None) + id = unichr(ch) + if ch == 92: + if (ord(source[index]) if index < len(source) else None) != 117: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + index += 1 + index + ch = scanHexEscape("u") + if ((not ch) or (ch == "\\")) or (not isIdentifierStart( + (ord(ch[0]) if 0 < len(ch) else None))): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + id = ch + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if not isIdentifierPart(ch): + break + index += 1 + index + id += unichr(ch) + if ch == 92: + id = id[0:(0 + (len(id) - 1))] + if (ord(source[index]) if index < len(source) else None) != 117: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + index += 1 + index + ch = scanHexEscape("u") + if ((not ch) or (ch == "\\")) or (not isIdentifierPart( + (ord(ch[0]) if 0 < len(ch) else None))): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + id += ch + return id + + +def getIdentifier(): + global index + start = None + ch = None + index += 1 + start = index - 1 + while index < length: + ch = (ord(source[index]) if index < len(source) else None) + if ch == 92: + index = start + return getEscapedIdentifier() + if isIdentifierPart(ch): + index += 1 + index + else: + break + return source[start:index] + + +def scanIdentifier(): + start = None + id = None + type = None + start = index + id = (getEscapedIdentifier() if + (ord(source[index]) if index < len(source) else None) == 92 else + getIdentifier()) + if len(id) == 1: + type = Token.Identifier + elif isKeyword(id): + type = Token.Keyword + elif id == "null": + type = Token.NullLiteral + elif (id == "true") or (id == "false"): + type = Token.BooleanLiteral + else: + type = Token.Identifier + return jsdict({ + "type": type, + "value": id, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanPunctuator(): + global index + start = index + code = (ord(source[index]) if index < len(source) else None) + code2 = None + ch1 = source[index] + ch2 = None + ch3 = None + ch4 = None + while 1: + if (code == 126) or ((code == 63) or ((code == 58) or + ((code == 93) or + ((code == 91) or + ((code == 125) or + ((code == 123) or + ((code == 44) or + ((code == 59) or + ((code == 41) or + ((code == 40) or + (code == 46))))))))))): + index += 1 + index + if extra.tokenize: + if code == 40: + extra.openParenToken = len(extra.tokens) + elif code == 123: + extra.openCurlyToken = len(extra.tokens) + return jsdict({ + "type": Token.Punctuator, + "value": unichr(code), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + else: + code2 = (ord(source[index + 1]) if + (index + 1) < len(source) else None) + if code2 == 61: + while 1: + if (code == 124) or ((code == 94) or + ((code == 62) or + ((code == 60) or + ((code == 47) or + ((code == 45) or + ((code == 43) or + ((code == 42) or + ((code == 38) or + (code == 37))))))))): + index += 2 + return jsdict({ + "type": Token.Punctuator, + "value": unichr(code) + unichr(code2), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + elif (code == 61) or (code == 33): + index += 2 + if (ord(source[index]) + if index < len(source) else None) == 61: + index += 1 + index + return jsdict({ + "type": Token.Punctuator, + "value": source[start:index], + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + else: + break + break + break + break + ch2 = source[index + 1] if index + 1 < len(source) else None + ch3 = source[index + 2] if index + 2 < len(source) else None + ch4 = source[index + 3] if index + 3 < len(source) else None + if ((ch1 == ">") and (ch2 == ">")) and (ch3 == ">"): + if ch4 == "=": + index += 4 + return jsdict({ + "type": Token.Punctuator, + "value": ">>>=", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if ((ch1 == ">") and (ch2 == ">")) and (ch3 == ">"): + index += 3 + return jsdict({ + "type": Token.Punctuator, + "value": ">>>", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if ((ch1 == "<") and (ch2 == "<")) and (ch3 == "="): + index += 3 + return jsdict({ + "type": Token.Punctuator, + "value": "<<=", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if ((ch1 == ">") and (ch2 == ">")) and (ch3 == "="): + index += 3 + return jsdict({ + "type": Token.Punctuator, + "value": ">>=", + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if (ch1 == ch2) and ("+-<>&|".find(ch1) >= 0): + index += 2 + return jsdict({ + "type": Token.Punctuator, + "value": ch1 + ch2, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + if "<>=!+-*%&|^/".find(ch1) >= 0: + index += 1 + index + return jsdict({ + "type": Token.Punctuator, + "value": ch1, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + + +def scanHexLiteral(start=None): + global index + number = "" + while index < length: + if not isHexDigit(source[index]): + break + index += 1 + number += source[index - 1] + if len(number) == 0: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + if isIdentifierStart( + (ord(source[index]) if index < len(source) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.NumericLiteral, + "value": parseInt("0x" + number, 16), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanOctalLiteral(start=None): + global index + index += 1 + number = "0" + source[index - 1] + while index < length: + if not isOctalDigit(source[index]): + break + index += 1 + number += source[index - 1] + if isIdentifierStart( + (ord(source[index]) + if index < len(source) else None)) or isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.NumericLiteral, + "value": parseInt(number, 8), + "octal": True, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanNumericLiteral(): + global index + number = None + start = None + ch = None + ch = source[index] + assert__py__( + isDecimalDigit((ord(ch[0]) if 0 < len(ch) else None)) or (ch == "."), + "Numeric literal must start with a decimal digit or a decimal point") + start = index + number = "" + if ch != ".": + index += 1 + number = source[index - 1] + ch = source[index] if index < len(source) else None + if number == "0": + if (ch == "x") or (ch == "X"): + index += 1 + index + return scanHexLiteral(start) + if isOctalDigit(ch): + return scanOctalLiteral(start) + if ch and isDecimalDigit((ord(ch[0]) if 0 < len(ch) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + while isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + index += 1 + number += source[index - 1] + ch = source[index] if index < len(source) else None + if ch == ".": + index += 1 + number += source[index - 1] + while isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + index += 1 + number += source[index - 1] + ch = source[index] + if (ch == "e") or (ch == "E"): + index += 1 + number += source[index - 1] + ch = source[index] + if (ch == "+") or (ch == "-"): + index += 1 + number += source[index - 1] + if isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + while isDecimalDigit( + (ord(source[index]) if index < len(source) else None)): + index += 1 + number += source[index - 1] + else: + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + if isIdentifierStart( + (ord(source[index]) if index < len(source) else None)): + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.NumericLiteral, + "value": parseFloat(number), + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanStringLiteral(): + global index, lineNumber + str = "" + quote = None + start = None + ch = None + code = None + unescaped = None + restore = None + octal = False + quote = source[index] + assert__py__((quote == "'") or (quote == "\""), + "String literal must starts with a quote") + start = index + index += 1 + index + while index < length: + index += 1 + ch = source[index - 1] + if ch == quote: + quote = "" + break + elif ch == "\\": + index += 1 + ch = source[index - 1] + if (not ch) or (not isLineTerminator( + (ord(ch[0]) if 0 < len(ch) else None))): + while 1: + if ch == "n": + str += u"\x0a" + break + elif ch == "r": + str += u"\x0d" + break + elif ch == "t": + str += u"\x09" + break + elif (ch == "x") or (ch == "u"): + restore = index + unescaped = scanHexEscape(ch) + if unescaped: + str += unescaped + else: + index = restore + str += ch + break + elif ch == "b": + str += u"\x08" + break + elif ch == "f": + str += u"\x0c" + break + elif ch == "v": + str += u"\x0b" + break + else: + if isOctalDigit(ch): + code = "01234567".find(ch) + if code != 0: + octal = True + if (index < length) and isOctalDigit( + source[index]): + octal = True + index += 1 + code = (code * 8) + "01234567".find( + source[index - 1]) + if (("0123".find(ch) >= 0) and + (index < length)) and isOctalDigit( + source[index]): + index += 1 + code = (code * 8) + "01234567".find( + source[index - 1]) + str += unichr(code) + else: + str += ch + break + break + else: + lineNumber += 1 + lineNumber + if (ch == u"\x0d") and (source[index] == u"\x0a"): + index += 1 + index + elif isLineTerminator((ord(ch[0]) if 0 < len(ch) else None)): + break + else: + str += ch + if quote != "": + throwError(jsdict({}), Messages.UnexpectedToken, "ILLEGAL") + return jsdict({ + "type": Token.StringLiteral, + "value": str, + "octal": octal, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + + +def scanRegExp(): + global lookahead, index + str = None + ch = None + start = None + pattern = None + flags = None + value = None + classMarker = False + restore = None + terminated = False + lookahead = None + skipComment() + start = index + ch = source[index] + assert__py__(ch == "/", + "Regular expression literal must start with a slash") + index += 1 + str = source[index - 1] + while index < length: + index += 1 + ch = source[index - 1] + str += ch + if classMarker: + if ch == "]": + classMarker = False + else: + if ch == "\\": + index += 1 + ch = source[index - 1] + if isLineTerminator((ord(ch[0]) if 0 < len(ch) else None)): + throwError(jsdict({}), Messages.UnterminatedRegExp) + str += ch + elif ch == "/": + terminated = True + break + elif ch == "[": + classMarker = True + elif isLineTerminator((ord(ch[0]) if 0 < len(ch) else None)): + throwError(jsdict({}), Messages.UnterminatedRegExp) + if not terminated: + throwError(jsdict({}), Messages.UnterminatedRegExp) + pattern = str[1:(1 + (len(str) - 2))] + flags = "" + while index < length: + ch = source[index] + if not isIdentifierPart((ord(ch[0]) if 0 < len(ch) else None)): + break + index += 1 + index + if (ch == "\\") and (index < length): + ch = source[index] + if ch == "u": + index += 1 + index + restore = index + ch = scanHexEscape("u") + if ch: + flags += ch + str += "\\u" + while 1: + if not (restore < index): + break + str += source[restore] + restore += 1 + else: + index = restore + flags += "u" + str += "\\u" + else: + str += "\\" + else: + flags += ch + str += ch + try: + value = RegExp(pattern, flags) + except Exception as e: + throwError(jsdict({}), Messages.InvalidRegExp) + peek() + if extra.tokenize: + return jsdict({ + "type": Token.RegularExpression, + "value": value, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [start, index], + }) + return jsdict({ + "literal": str, + "value": value, + "range": [start, index], + }) + + +def isIdentifierName(token=None): + return (((token.type == Token.Identifier) or + (token.type == Token.Keyword)) or + (token.type == Token.BooleanLiteral)) or ( + token.type == Token.NullLiteral) + + +def advanceSlash(): + prevToken = None + checkToken = None + prevToken = extra.tokens[len(extra.tokens) - 1] + if not prevToken: + return scanRegExp() + if prevToken.type == "Punctuator": + if prevToken.value == ")": + checkToken = extra.tokens[extra.openParenToken - 1] + if (checkToken and (checkToken.type == "Keyword")) and ( + (((checkToken.value == "if") or + (checkToken.value == "while")) or + (checkToken.value == "for")) or (checkToken.value == "with")): + return scanRegExp() + return scanPunctuator() + if prevToken.value == "}": + if extra.tokens[extra.openCurlyToken - 3] and ( + extra.tokens[extra.openCurlyToken - 3].type == "Keyword"): + checkToken = extra.tokens[extra.openCurlyToken - 4] + if not checkToken: + return scanPunctuator() + elif extra.tokens[extra.openCurlyToken - 4] and ( + extra.tokens[extra.openCurlyToken - 4].type == "Keyword"): + checkToken = extra.tokens[extra.openCurlyToken - 5] + if not checkToken: + return scanRegExp() + else: + return scanPunctuator() + if FnExprTokens.indexOf(checkToken.value) >= 0: + return scanPunctuator() + return scanRegExp() + return scanRegExp() + if prevToken.type == "Keyword": + return scanRegExp() + return scanPunctuator() + + +def advance(): + ch = None + skipComment() + if index >= length: + return jsdict({ + "type": Token.EOF, + "lineNumber": lineNumber, + "lineStart": lineStart, + "range": [index, index], + }) + ch = (ord(source[index]) if index < len(source) else None) + if ((ch == 40) or (ch == 41)) or (ch == 58): + return scanPunctuator() + if (ch == 39) or (ch == 34): + return scanStringLiteral() + if isIdentifierStart(ch): + return scanIdentifier() + if ch == 46: + if isDecimalDigit((ord(source[index + 1]) if + (index + 1) < len(source) else None)): + return scanNumericLiteral() + return scanPunctuator() + if isDecimalDigit(ch): + return scanNumericLiteral() + if extra.tokenize and (ch == 47): + return advanceSlash() + return scanPunctuator() + + +def lex(): + global index, lineNumber, lineStart, lookahead + token = None + token = lookahead + index = token.range[1] + lineNumber = token.lineNumber + lineStart = token.lineStart + lookahead = advance() + index = token.range[1] + lineNumber = token.lineNumber + lineStart = token.lineStart + return token + + +def peek(): + global lookahead, index, lineNumber, lineStart + pos = None + line = None + start = None + pos = index + line = lineNumber + start = lineStart + lookahead = advance() + index = pos + lineNumber = line + lineStart = start + + +SyntaxTreeDelegate = jsdict({ + "name": "SyntaxTree", + "markStart": __temp__0, + "markEnd": __temp__1, + "markEndIf": __temp__2, + "postProcess": __temp__3, + "createArrayExpression": __temp__4, + "createAssignmentExpression": __temp__5, + "createBinaryExpression": __temp__6, + "createBlockStatement": __temp__7, + "createBreakStatement": __temp__8, + "createCallExpression": __temp__9, + "createCatchClause": __temp__10, + "createConditionalExpression": __temp__11, + "createContinueStatement": __temp__12, + "createDebuggerStatement": __temp__13, + "createDoWhileStatement": __temp__14, + "createEmptyStatement": __temp__15, + "createExpressionStatement": __temp__16, + "createForStatement": __temp__17, + "createForInStatement": __temp__18, + "createFunctionDeclaration": __temp__19, + "createFunctionExpression": __temp__20, + "createIdentifier": __temp__21, + "createIfStatement": __temp__22, + "createLabeledStatement": __temp__23, + "createLiteral": __temp__24, + "createMemberExpression": __temp__25, + "createNewExpression": __temp__26, + "createObjectExpression": __temp__27, + "createPostfixExpression": __temp__28, + "createProgram": __temp__29, + "createProperty": __temp__30, + "createReturnStatement": __temp__31, + "createSequenceExpression": __temp__32, + "createSwitchCase": __temp__33, + "createSwitchStatement": __temp__34, + "createThisExpression": __temp__35, + "createThrowStatement": __temp__36, + "createTryStatement": __temp__37, + "createUnaryExpression": __temp__38, + "createVariableDeclaration": __temp__39, + "createVariableDeclarator": __temp__40, + "createWhileStatement": __temp__41, + "createWithStatement": __temp__42, +}) + + +def peekLineTerminator(): + global index, lineNumber, lineStart + pos = None + line = None + start = None + found = None + pos = index + line = lineNumber + start = lineStart + skipComment() + found = lineNumber != line + index = pos + lineNumber = line + lineStart = start + return found + + +def throwError(token=None, messageFormat=None, a=None): + def __temp__43(whole=None, index=None): + assert__py__(index < len(args), "Message reference must be in range") + return args[index] + + error = None + args = Array.prototype.slice.call(arguments, 2) + msg = messageFormat.replace(RegExp(r'%(\d)'), __temp__43) + if ('undefined' if not ('lineNumber' in token) else typeof( + token.lineNumber)) == "number": + error = RuntimeError((("Line " + token.lineNumber) + ": ") + msg) + error.index = token.range[0] + error.lineNumber = token.lineNumber + error.column = (token.range[0] - lineStart) + 1 + else: + error = RuntimeError((("Line " + lineNumber) + ": ") + msg) + error.index = index + error.lineNumber = lineNumber + error.column = (index - lineStart) + 1 + error.description = msg + raise error + + +def throwErrorTolerant(): + try: + throwError.apply(None, arguments) + except Exception as e: + if extra.errors: + extra.errors.append(e) + else: + raise + + +def throwUnexpected(token=None): + if token.type == Token.EOF: + throwError(token, Messages.UnexpectedEOS) + if token.type == Token.NumericLiteral: + throwError(token, Messages.UnexpectedNumber) + if token.type == Token.StringLiteral: + throwError(token, Messages.UnexpectedString) + if token.type == Token.Identifier: + throwError(token, Messages.UnexpectedIdentifier) + if token.type == Token.Keyword: + if isFutureReservedWord(token.value): + throwError(token, Messages.UnexpectedReserved) + elif strict and isStrictModeReservedWord(token.value): + throwErrorTolerant(token, Messages.StrictReservedWord) + return + throwError(token, Messages.UnexpectedToken, token.value) + throwError(token, Messages.UnexpectedToken, token.value) + + +def expect(value=None): + token = lex() + if (token.type != Token.Punctuator) or (token.value != value): + throwUnexpected(token) + + +def expectKeyword(keyword=None): + token = lex() + if (token.type != Token.Keyword) or (token.value != keyword): + throwUnexpected(token) + + +def match(value=None): + return (lookahead.type == Token.Punctuator) and (lookahead.value == value) + + +def matchKeyword(keyword=None): + return (lookahead.type == Token.Keyword) and (lookahead.value == keyword) + + +def matchAssign(): + op = None + if lookahead.type != Token.Punctuator: + return False + op = lookahead.value + return (((((((((((op == "=") or (op == "*=")) or (op == "/=")) or + (op == "%=")) or (op == "+=")) or (op == "-=")) or + (op == "<<=")) or (op == ">>=")) or (op == ">>>=")) or + (op == "&=")) or (op == "^=")) or (op == "|=") + + +def consumeSemicolon(): + line = None + if (ord(source[index]) if index < len(source) else None) == 59: + lex() + return + line = lineNumber + skipComment() + if lineNumber != line: + return + if match(";"): + lex() + return + if (lookahead.type != Token.EOF) and (not match("}")): + throwUnexpected(lookahead) + + +def isLeftHandSide(expr=None): + return (expr.type == Syntax.Identifier) or ( + expr.type == Syntax.MemberExpression) + + +def parseArrayInitialiser(): + elements = [] + expect("[") + while not match("]"): + if match(","): + lex() + elements.append(None) + else: + elements.append(parseAssignmentExpression()) + if not match("]"): + expect(",") + expect("]") + return delegate.createArrayExpression(elements) + + +def parsePropertyFunction(param=None, first=None): + global strict + previousStrict = None + body = None + previousStrict = strict + skipComment() + delegate.markStart() + body = parseFunctionSourceElements() + if (first and strict) and isRestrictedWord(param[0].name): + throwErrorTolerant(first, Messages.StrictParamName) + strict = previousStrict + return delegate.markEnd( + delegate.createFunctionExpression(None, param, [], body)) + + +def parseObjectPropertyKey(): + token = None + skipComment() + delegate.markStart() + token = lex() + if (token.type == Token.StringLiteral) or ( + token.type == Token.NumericLiteral): + if strict and token.octal: + throwErrorTolerant(token, Messages.StrictOctalLiteral) + return delegate.markEnd(delegate.createLiteral(token)) + return delegate.markEnd(delegate.createIdentifier(token.value)) + + +def parseObjectProperty(): + token = None + key = None + id = None + value = None + param = None + token = lookahead + skipComment() + delegate.markStart() + if token.type == Token.Identifier: + id = parseObjectPropertyKey() + if (token.value == "get") and (not match(":")): + key = parseObjectPropertyKey() + expect("(") + expect(")") + value = parsePropertyFunction([]) + return delegate.markEnd(delegate.createProperty("get", key, value)) + if (token.value == "set") and (not match(":")): + key = parseObjectPropertyKey() + expect("(") + token = lookahead + if token.type != Token.Identifier: + expect(")") + throwErrorTolerant(token, Messages.UnexpectedToken, + token.value) + value = parsePropertyFunction([]) + else: + param = [parseVariableIdentifier()] + expect(")") + value = parsePropertyFunction(param, token) + return delegate.markEnd(delegate.createProperty("set", key, value)) + expect(":") + value = parseAssignmentExpression() + return delegate.markEnd(delegate.createProperty("init", id, value)) + if (token.type == Token.EOF) or (token.type == Token.Punctuator): + throwUnexpected(token) + else: + key = parseObjectPropertyKey() + expect(":") + value = parseAssignmentExpression() + return delegate.markEnd(delegate.createProperty("init", key, value)) + + +def parseObjectInitialiser(): + properties = [] + property = None + name = None + key = None + kind = None + map = jsdict({}) + toString = str + expect("{") + while not match("}"): + property = parseObjectProperty() + if property.key.type == Syntax.Identifier: + name = property.key.name + else: + name = toString(property.key.value) + kind = (PropertyKind.Data if property.kind == "init" else ( + PropertyKind.Get if property.kind == "get" else PropertyKind.Set)) + key = "$" + name + if key in map: + if map[key] == PropertyKind.Data: + if strict and (kind == PropertyKind.Data): + throwErrorTolerant( + jsdict({}), Messages.StrictDuplicateProperty) + elif kind != PropertyKind.Data: + throwErrorTolerant( + jsdict({}), Messages.AccessorDataProperty) + else: + if kind == PropertyKind.Data: + throwErrorTolerant( + jsdict({}), Messages.AccessorDataProperty) + elif map[key] & kind: + throwErrorTolerant(jsdict({}), Messages.AccessorGetSet) + map[key] |= kind + else: + map[key] = kind + properties.append(property) + if not match("}"): + expect(",") + expect("}") + return delegate.createObjectExpression(properties) + + +def parseGroupExpression(): + expr = None + expect("(") + expr = parseExpression() + expect(")") + return expr + + +def parsePrimaryExpression(): + type = None + token = None + expr = None + if match("("): + return parseGroupExpression() + type = lookahead.type + delegate.markStart() + if type == Token.Identifier: + expr = delegate.createIdentifier(lex().value) + elif (type == Token.StringLiteral) or (type == Token.NumericLiteral): + if strict and lookahead.octal: + throwErrorTolerant(lookahead, Messages.StrictOctalLiteral) + expr = delegate.createLiteral(lex()) + elif type == Token.Keyword: + if matchKeyword("this"): + lex() + expr = delegate.createThisExpression() + elif matchKeyword("function"): + expr = parseFunctionExpression() + elif type == Token.BooleanLiteral: + token = lex() + token.value = token.value == "true" + expr = delegate.createLiteral(token) + elif type == Token.NullLiteral: + token = lex() + token.value = None + expr = delegate.createLiteral(token) + elif match("["): + expr = parseArrayInitialiser() + elif match("{"): + expr = parseObjectInitialiser() + elif match("/") or match("/="): + expr = delegate.createLiteral(scanRegExp()) + if expr: + return delegate.markEnd(expr) + throwUnexpected(lex()) + + +def parseArguments(): + args = [] + expect("(") + if not match(")"): + while index < length: + args.append(parseAssignmentExpression()) + if match(")"): + break + expect(",") + expect(")") + return args + + +def parseNonComputedProperty(): + token = None + delegate.markStart() + token = lex() + if not isIdentifierName(token): + throwUnexpected(token) + return delegate.markEnd(delegate.createIdentifier(token.value)) + + +def parseNonComputedMember(): + expect(".") + return parseNonComputedProperty() + + +def parseComputedMember(): + expr = None + expect("[") + expr = parseExpression() + expect("]") + return expr + + +def parseNewExpression(): + callee = None + args = None + delegate.markStart() + expectKeyword("new") + callee = parseLeftHandSideExpression() + args = (parseArguments() if match("(") else []) + return delegate.markEnd(delegate.createNewExpression(callee, args)) + + +def parseLeftHandSideExpressionAllowCall(): + marker = None + expr = None + args = None + property = None + marker = createLocationMarker() + expr = (parseNewExpression() + if matchKeyword("new") else parsePrimaryExpression()) + while (match(".") or match("[")) or match("("): + if match("("): + args = parseArguments() + expr = delegate.createCallExpression(expr, args) + elif match("["): + property = parseComputedMember() + expr = delegate.createMemberExpression("[", expr, property) + else: + property = parseNonComputedMember() + expr = delegate.createMemberExpression(".", expr, property) + if marker: + marker.end() + marker.apply(expr) + return expr + + +def parseLeftHandSideExpression(): + marker = None + expr = None + property = None + marker = createLocationMarker() + expr = (parseNewExpression() + if matchKeyword("new") else parsePrimaryExpression()) + while match(".") or match("["): + if match("["): + property = parseComputedMember() + expr = delegate.createMemberExpression("[", expr, property) + else: + property = parseNonComputedMember() + expr = delegate.createMemberExpression(".", expr, property) + if marker: + marker.end() + marker.apply(expr) + return expr + + +def parsePostfixExpression(): + expr = None + token = None + delegate.markStart() + expr = parseLeftHandSideExpressionAllowCall() + if lookahead.type == Token.Punctuator: + if (match("++") or match("--")) and (not peekLineTerminator()): + if (strict and + (expr.type == Syntax.Identifier)) and isRestrictedWord( + expr.name): + throwErrorTolerant(jsdict({}), Messages.StrictLHSPostfix) + if not isLeftHandSide(expr): + throwError(jsdict({}), Messages.InvalidLHSInAssignment) + token = lex() + expr = delegate.createPostfixExpression(token.value, expr) + return delegate.markEndIf(expr) + + +def parseUnaryExpression(): + token = None + expr = None + delegate.markStart() + if (lookahead.type != Token.Punctuator) and (lookahead.type != + Token.Keyword): + expr = parsePostfixExpression() + elif match("++") or match("--"): + token = lex() + expr = parseUnaryExpression() + if (strict and + (expr.type == Syntax.Identifier)) and isRestrictedWord(expr.name): + throwErrorTolerant(jsdict({}), Messages.StrictLHSPrefix) + if not isLeftHandSide(expr): + throwError(jsdict({}), Messages.InvalidLHSInAssignment) + expr = delegate.createUnaryExpression(token.value, expr) + elif ((match("+") or match("-")) or match("~")) or match("!"): + token = lex() + expr = parseUnaryExpression() + expr = delegate.createUnaryExpression(token.value, expr) + elif (matchKeyword("delete") + or matchKeyword("void")) or matchKeyword("typeof"): + token = lex() + expr = parseUnaryExpression() + expr = delegate.createUnaryExpression(token.value, expr) + if (strict and (expr.operator == "delete")) and ( + expr.argument.type == Syntax.Identifier): + throwErrorTolerant(jsdict({}), Messages.StrictDelete) + else: + expr = parsePostfixExpression() + return delegate.markEndIf(expr) + + +def binaryPrecedence(token=None, allowIn=None): + prec = 0 + if (token.type != Token.Punctuator) and (token.type != Token.Keyword): + return 0 + while 1: + if token.value == "||": + prec = 1 + break + elif token.value == "&&": + prec = 2 + break + elif token.value == "|": + prec = 3 + break + elif token.value == "^": + prec = 4 + break + elif token.value == "&": + prec = 5 + break + elif (token.value == "!==") or ((token.value == "===") or + ((token.value == "!=") or + (token.value == "=="))): + prec = 6 + break + elif (token.value == "instanceof") or ((token.value == ">=") or + ((token.value == "<=") or + ((token.value == ">") or + (token.value == "<")))): + prec = 7 + break + elif token.value == "in": + prec = (7 if allowIn else 0) + break + elif (token.value == ">>>") or ((token.value == ">>") or + (token.value == "<<")): + prec = 8 + break + elif (token.value == "-") or (token.value == "+"): + prec = 9 + break + elif (token.value == "%") or ((token.value == "/") or + (token.value == "*")): + prec = 11 + break + else: + break + break + return prec + + +def parseBinaryExpression(): + marker = None + markers = None + expr = None + token = None + prec = None + previousAllowIn = None + stack = None + right = None + operator = None + left = None + i = None + previousAllowIn = state.allowIn + state.allowIn = True + marker = createLocationMarker() + left = parseUnaryExpression() + token = lookahead + prec = binaryPrecedence(token, previousAllowIn) + if prec == 0: + return left + token.prec = prec + lex() + markers = [marker, createLocationMarker()] + right = parseUnaryExpression() + stack = [left, token, right] + prec = binaryPrecedence(lookahead, previousAllowIn) + while prec > 0: + while (len(stack) > 2) and (prec <= stack[len(stack) - 2].prec): + right = stack.pop() + operator = stack.pop().value + left = stack.pop() + expr = delegate.createBinaryExpression(operator, left, right) + markers.pop() + marker = markers.pop() + if marker: + marker.end() + marker.apply(expr) + stack.append(expr) + markers.append(marker) + token = lex() + token.prec = prec + stack.append(token) + markers.append(createLocationMarker()) + expr = parseUnaryExpression() + stack.append(expr) + prec = binaryPrecedence(lookahead, previousAllowIn) + state.allowIn = previousAllowIn + i = len(stack) - 1 + expr = stack[i] + markers.pop() + while i > 1: + expr = delegate.createBinaryExpression(stack[i - 1].value, + stack[i - 2], expr) + i -= 2 + marker = markers.pop() + if marker: + marker.end() + marker.apply(expr) + return expr + + +def parseConditionalExpression(): + expr = None + previousAllowIn = None + consequent = None + alternate = None + delegate.markStart() + expr = parseBinaryExpression() + if match("?"): + lex() + previousAllowIn = state.allowIn + state.allowIn = True + consequent = parseAssignmentExpression() + state.allowIn = previousAllowIn + expect(":") + alternate = parseAssignmentExpression() + expr = delegate.markEnd( + delegate.createConditionalExpression(expr, consequent, alternate)) + else: + delegate.markEnd(jsdict({})) + return expr + + +def parseAssignmentExpression(): + token = None + left = None + right = None + node = None + token = lookahead + delegate.markStart() + left = parseConditionalExpression() + node = left + if matchAssign(): + if not isLeftHandSide(left): + throwError(jsdict({}), Messages.InvalidLHSInAssignment) + if (strict and + (left.type == Syntax.Identifier)) and isRestrictedWord(left.name): + throwErrorTolerant(token, Messages.StrictLHSAssignment) + token = lex() + right = parseAssignmentExpression() + node = delegate.createAssignmentExpression(token.value, left, right) + return delegate.markEndIf(node) + + +def parseExpression(): + expr = None + delegate.markStart() + expr = parseAssignmentExpression() + if match(","): + expr = delegate.createSequenceExpression([expr]) + while index < length: + if not match(","): + break + lex() + expr.expressions.append(parseAssignmentExpression()) + return delegate.markEndIf(expr) + + +def parseStatementList(): + list__py__ = [] + statement = None + while index < length: + if match("}"): + break + statement = parseSourceElement() + if ('undefined' if not 'statement' in locals() else + typeof(statement)) == "undefined": + break + list__py__.append(statement) + return list__py__ + + +def parseBlock(): + block = None + skipComment() + delegate.markStart() + expect("{") + block = parseStatementList() + expect("}") + return delegate.markEnd(delegate.createBlockStatement(block)) + + +def parseVariableIdentifier(): + token = None + skipComment() + delegate.markStart() + token = lex() + if token.type != Token.Identifier: + throwUnexpected(token) + return delegate.markEnd(delegate.createIdentifier(token.value)) + + +def parseVariableDeclaration(kind=None): + init = None + id = None + skipComment() + delegate.markStart() + id = parseVariableIdentifier() + if strict and isRestrictedWord(id.name): + throwErrorTolerant(jsdict({}), Messages.StrictVarName) + if kind == "const": + expect("=") + init = parseAssignmentExpression() + elif match("="): + lex() + init = parseAssignmentExpression() + return delegate.markEnd(delegate.createVariableDeclarator(id, init)) + + +def parseVariableDeclarationList(kind=None): + list__py__ = [] + while 1: + list__py__.append(parseVariableDeclaration(kind)) + if not match(","): + break + lex() + if not (index < length): + break + return list__py__ + + +def parseVariableStatement(): + declarations = None + expectKeyword("var") + declarations = parseVariableDeclarationList() + consumeSemicolon() + return delegate.createVariableDeclaration(declarations, "var") + + +def parseConstLetDeclaration(kind=None): + declarations = None + skipComment() + delegate.markStart() + expectKeyword(kind) + declarations = parseVariableDeclarationList(kind) + consumeSemicolon() + return delegate.markEnd( + delegate.createVariableDeclaration(declarations, kind)) + + +def parseEmptyStatement(): + expect(";") + return delegate.createEmptyStatement() + + +def parseExpressionStatement(): + expr = parseExpression() + consumeSemicolon() + return delegate.createExpressionStatement(expr) + + +def parseIfStatement(): + test = None + consequent = None + alternate = None + expectKeyword("if") + expect("(") + test = parseExpression() + expect(")") + consequent = parseStatement() + if matchKeyword("else"): + lex() + alternate = parseStatement() + else: + alternate = None + return delegate.createIfStatement(test, consequent, alternate) + + +def parseDoWhileStatement(): + body = None + test = None + oldInIteration = None + expectKeyword("do") + oldInIteration = state.inIteration + state.inIteration = True + body = parseStatement() + state.inIteration = oldInIteration + expectKeyword("while") + expect("(") + test = parseExpression() + expect(")") + if match(";"): + lex() + return delegate.createDoWhileStatement(body, test) + + +def parseWhileStatement(): + test = None + body = None + oldInIteration = None + expectKeyword("while") + expect("(") + test = parseExpression() + expect(")") + oldInIteration = state.inIteration + state.inIteration = True + body = parseStatement() + state.inIteration = oldInIteration + return delegate.createWhileStatement(test, body) + + +def parseForVariableDeclaration(): + token = None + declarations = None + delegate.markStart() + token = lex() + declarations = parseVariableDeclarationList() + return delegate.markEnd( + delegate.createVariableDeclaration(declarations, token.value)) + + +def parseForStatement(): + init = None + test = None + update = None + left = None + right = None + body = None + oldInIteration = None + update = None + test = update + init = test + expectKeyword("for") + expect("(") + if match(";"): + lex() + else: + if matchKeyword("var") or matchKeyword("let"): + state.allowIn = False + init = parseForVariableDeclaration() + state.allowIn = True + if (len(init.declarations) == 1) and matchKeyword("in"): + lex() + left = init + right = parseExpression() + init = None + else: + state.allowIn = False + init = parseExpression() + state.allowIn = True + if matchKeyword("in"): + if not isLeftHandSide(init): + throwError(jsdict({}), Messages.InvalidLHSInForIn) + lex() + left = init + right = parseExpression() + init = None + if ('undefined' + if not 'left' in locals() else typeof(left)) == "undefined": + expect(";") + if ('undefined' + if not 'left' in locals() else typeof(left)) == "undefined": + if not match(";"): + test = parseExpression() + expect(";") + if not match(")"): + update = parseExpression() + expect(")") + oldInIteration = state.inIteration + state.inIteration = True + body = parseStatement() + state.inIteration = oldInIteration + return (delegate.createForStatement(init, test, update, body) if ( + 'undefined' if not 'left' in locals() else typeof(left)) == "undefined" + else delegate.createForInStatement(left, right, body)) + + +def parseContinueStatement(): + label = None + key = None + expectKeyword("continue") + if (ord(source[index]) if index < len(source) else None) == 59: + lex() + if not state.inIteration: + throwError(jsdict({}), Messages.IllegalContinue) + return delegate.createContinueStatement(None) + if peekLineTerminator(): + if not state.inIteration: + throwError(jsdict({}), Messages.IllegalContinue) + return delegate.createContinueStatement(None) + if lookahead.type == Token.Identifier: + label = parseVariableIdentifier() + key = "$" + label.name + if not (key in state.labelSet): + throwError(jsdict({}), Messages.UnknownLabel, label.name) + consumeSemicolon() + if (label == None) and (not state.inIteration): + throwError(jsdict({}), Messages.IllegalContinue) + return delegate.createContinueStatement(label) + + +def parseBreakStatement(): + label = None + key = None + expectKeyword("break") + if (ord(source[index]) if index < len(source) else None) == 59: + lex() + if not (state.inIteration or state.inSwitch): + throwError(jsdict({}), Messages.IllegalBreak) + return delegate.createBreakStatement(None) + if peekLineTerminator(): + if not (state.inIteration or state.inSwitch): + throwError(jsdict({}), Messages.IllegalBreak) + return delegate.createBreakStatement(None) + if lookahead.type == Token.Identifier: + label = parseVariableIdentifier() + key = "$" + label.name + if not (key in state.labelSet): + throwError(jsdict({}), Messages.UnknownLabel, label.name) + consumeSemicolon() + if (label == None) and (not (state.inIteration or state.inSwitch)): + throwError(jsdict({}), Messages.IllegalBreak) + return delegate.createBreakStatement(label) + + +def parseReturnStatement(): + argument = None + expectKeyword("return") + if not state.inFunctionBody: + throwErrorTolerant(jsdict({}), Messages.IllegalReturn) + if (ord(source[index]) if index < len(source) else None) == 32: + if isIdentifierStart((ord(source[index + 1]) if + (index + 1) < len(source) else None)): + argument = parseExpression() + consumeSemicolon() + return delegate.createReturnStatement(argument) + if peekLineTerminator(): + return delegate.createReturnStatement(None) + if not match(";"): + if (not match("}")) and (lookahead.type != Token.EOF): + argument = parseExpression() + consumeSemicolon() + return delegate.createReturnStatement(argument) + + +def parseWithStatement(): + object = None + body = None + if strict: + throwErrorTolerant(jsdict({}), Messages.StrictModeWith) + expectKeyword("with") + expect("(") + object = parseExpression() + expect(")") + body = parseStatement() + return delegate.createWithStatement(object, body) + + +def parseSwitchCase(): + test = None + consequent = [] + statement = None + skipComment() + delegate.markStart() + if matchKeyword("default"): + lex() + test = None + else: + expectKeyword("case") + test = parseExpression() + expect(":") + while index < length: + if (match("}") or matchKeyword("default")) or matchKeyword("case"): + break + statement = parseStatement() + consequent.append(statement) + return delegate.markEnd(delegate.createSwitchCase(test, consequent)) + + +def parseSwitchStatement(): + discriminant = None + cases = None + clause = None + oldInSwitch = None + defaultFound = None + expectKeyword("switch") + expect("(") + discriminant = parseExpression() + expect(")") + expect("{") + if match("}"): + lex() + return delegate.createSwitchStatement(discriminant) + cases = [] + oldInSwitch = state.inSwitch + state.inSwitch = True + defaultFound = False + while index < length: + if match("}"): + break + clause = parseSwitchCase() + if clause.test == None: + if defaultFound: + throwError(jsdict({}), Messages.MultipleDefaultsInSwitch) + defaultFound = True + cases.append(clause) + state.inSwitch = oldInSwitch + expect("}") + return delegate.createSwitchStatement(discriminant, cases) + + +def parseThrowStatement(): + argument = None + expectKeyword("throw") + if peekLineTerminator(): + throwError(jsdict({}), Messages.NewlineAfterThrow) + argument = parseExpression() + consumeSemicolon() + return delegate.createThrowStatement(argument) + + +def parseCatchClause(): + param = None + body = None + skipComment() + delegate.markStart() + expectKeyword("catch") + expect("(") + if match(")"): + throwUnexpected(lookahead) + param = parseVariableIdentifier() + if strict and isRestrictedWord(param.name): + throwErrorTolerant(jsdict({}), Messages.StrictCatchVariable) + expect(")") + body = parseBlock() + return delegate.markEnd(delegate.createCatchClause(param, body)) + + +def parseTryStatement(): + block = None + handlers = [] + finalizer = None + expectKeyword("try") + block = parseBlock() + if matchKeyword("catch"): + handlers.append(parseCatchClause()) + if matchKeyword("finally"): + lex() + finalizer = parseBlock() + if (len(handlers) == 0) and (not finalizer): + throwError(jsdict({}), Messages.NoCatchOrFinally) + return delegate.createTryStatement(block, [], handlers, finalizer) + + +def parseDebuggerStatement(): + expectKeyword("debugger") + consumeSemicolon() + return delegate.createDebuggerStatement() + + +def parseStatement(): + type = lookahead.type + expr = None + labeledBody = None + key = None + if type == Token.EOF: + throwUnexpected(lookahead) + skipComment() + delegate.markStart() + if type == Token.Punctuator: + while 1: + if lookahead.value == ";": + return delegate.markEnd(parseEmptyStatement()) + elif lookahead.value == "{": + return delegate.markEnd(parseBlock()) + elif lookahead.value == "(": + return delegate.markEnd(parseExpressionStatement()) + else: + break + break + if type == Token.Keyword: + while 1: + if lookahead.value == "break": + return delegate.markEnd(parseBreakStatement()) + elif lookahead.value == "continue": + return delegate.markEnd(parseContinueStatement()) + elif lookahead.value == "debugger": + return delegate.markEnd(parseDebuggerStatement()) + elif lookahead.value == "do": + return delegate.markEnd(parseDoWhileStatement()) + elif lookahead.value == "for": + return delegate.markEnd(parseForStatement()) + elif lookahead.value == "function": + return delegate.markEnd(parseFunctionDeclaration()) + elif lookahead.value == "if": + return delegate.markEnd(parseIfStatement()) + elif lookahead.value == "return": + return delegate.markEnd(parseReturnStatement()) + elif lookahead.value == "switch": + return delegate.markEnd(parseSwitchStatement()) + elif lookahead.value == "throw": + return delegate.markEnd(parseThrowStatement()) + elif lookahead.value == "try": + return delegate.markEnd(parseTryStatement()) + elif lookahead.value == "var": + return delegate.markEnd(parseVariableStatement()) + elif lookahead.value == "while": + return delegate.markEnd(parseWhileStatement()) + elif lookahead.value == "with": + return delegate.markEnd(parseWithStatement()) + else: + break + break + expr = parseExpression() + if (expr.type == Syntax.Identifier) and match(":"): + lex() + key = "$" + expr.name + if key in state.labelSet: + throwError(jsdict({}), Messages.Redeclaration, "Label", expr.name) + state.labelSet[key] = True + labeledBody = parseStatement() + del state.labelSet[key] + return delegate.markEnd( + delegate.createLabeledStatement(expr, labeledBody)) + consumeSemicolon() + return delegate.markEnd(delegate.createExpressionStatement(expr)) + + +def parseFunctionSourceElements(): + global strict + sourceElement = None + sourceElements = [] + token = None + directive = None + firstRestricted = None + oldLabelSet = None + oldInIteration = None + oldInSwitch = None + oldInFunctionBody = None + skipComment() + delegate.markStart() + expect("{") + while index < length: + if lookahead.type != Token.StringLiteral: + break + token = lookahead + sourceElement = parseSourceElement() + sourceElements.append(sourceElement) + if sourceElement.expression.type != Syntax.Literal: + break + directive = source[(token.range[0] + 1):(token.range[1] - 1)] + if directive == "use strict": + strict = True + if firstRestricted: + throwErrorTolerant(firstRestricted, + Messages.StrictOctalLiteral) + else: + if (not firstRestricted) and token.octal: + firstRestricted = token + oldLabelSet = state.labelSet + oldInIteration = state.inIteration + oldInSwitch = state.inSwitch + oldInFunctionBody = state.inFunctionBody + state.labelSet = jsdict({}) + state.inIteration = False + state.inSwitch = False + state.inFunctionBody = True + while index < length: + if match("}"): + break + sourceElement = parseSourceElement() + if ('undefined' if not 'sourceElement' in locals() else + typeof(sourceElement)) == "undefined": + break + sourceElements.append(sourceElement) + expect("}") + state.labelSet = oldLabelSet + state.inIteration = oldInIteration + state.inSwitch = oldInSwitch + state.inFunctionBody = oldInFunctionBody + return delegate.markEnd(delegate.createBlockStatement(sourceElements)) + + +def parseParams(firstRestricted=None): + param = None + params = [] + token = None + stricted = None + paramSet = None + key = None + message = None + expect("(") + if not match(")"): + paramSet = jsdict({}) + while index < length: + token = lookahead + param = parseVariableIdentifier() + key = "$" + token.value + if strict: + if isRestrictedWord(token.value): + stricted = token + message = Messages.StrictParamName + if key in paramSet: + stricted = token + message = Messages.StrictParamDupe + elif not firstRestricted: + if isRestrictedWord(token.value): + firstRestricted = token + message = Messages.StrictParamName + elif isStrictModeReservedWord(token.value): + firstRestricted = token + message = Messages.StrictReservedWord + elif key in paramSet: + firstRestricted = token + message = Messages.StrictParamDupe + params.append(param) + paramSet[key] = True + if match(")"): + break + expect(",") + expect(")") + return jsdict({ + "params": params, + "stricted": stricted, + "firstRestricted": firstRestricted, + "message": message, + }) + + +def parseFunctionDeclaration(): + global strict + id = None + params = [] + body = None + token = None + stricted = None + tmp = None + firstRestricted = None + message = None + previousStrict = None + skipComment() + delegate.markStart() + expectKeyword("function") + token = lookahead + id = parseVariableIdentifier() + if strict: + if isRestrictedWord(token.value): + throwErrorTolerant(token, Messages.StrictFunctionName) + else: + if isRestrictedWord(token.value): + firstRestricted = token + message = Messages.StrictFunctionName + elif isStrictModeReservedWord(token.value): + firstRestricted = token + message = Messages.StrictReservedWord + tmp = parseParams(firstRestricted) + params = tmp.params + stricted = tmp.stricted + firstRestricted = tmp.firstRestricted + if tmp.message: + message = tmp.message + previousStrict = strict + body = parseFunctionSourceElements() + if strict and firstRestricted: + throwError(firstRestricted, message) + if strict and stricted: + throwErrorTolerant(stricted, message) + strict = previousStrict + return delegate.markEnd( + delegate.createFunctionDeclaration(id, params, [], body)) + + +def parseFunctionExpression(): + global strict + token = None + id = None + stricted = None + firstRestricted = None + message = None + tmp = None + params = [] + body = None + previousStrict = None + delegate.markStart() + expectKeyword("function") + if not match("("): + token = lookahead + id = parseVariableIdentifier() + if strict: + if isRestrictedWord(token.value): + throwErrorTolerant(token, Messages.StrictFunctionName) + else: + if isRestrictedWord(token.value): + firstRestricted = token + message = Messages.StrictFunctionName + elif isStrictModeReservedWord(token.value): + firstRestricted = token + message = Messages.StrictReservedWord + tmp = parseParams(firstRestricted) + params = tmp.params + stricted = tmp.stricted + firstRestricted = tmp.firstRestricted + if tmp.message: + message = tmp.message + previousStrict = strict + body = parseFunctionSourceElements() + if strict and firstRestricted: + throwError(firstRestricted, message) + if strict and stricted: + throwErrorTolerant(stricted, message) + strict = previousStrict + return delegate.markEnd( + delegate.createFunctionExpression(id, params, [], body)) + + +def parseSourceElement(): + if lookahead.type == Token.Keyword: + while 1: + if (lookahead.value == "let") or (lookahead.value == "const"): + return parseConstLetDeclaration(lookahead.value) + elif lookahead.value == "function": + return parseFunctionDeclaration() + else: + return parseStatement() + break + if lookahead.type != Token.EOF: + return parseStatement() + + +def parseSourceElements(): + global strict + sourceElement = None + sourceElements = [] + token = None + directive = None + firstRestricted = None + while index < length: + token = lookahead + if token.type != Token.StringLiteral: + break + sourceElement = parseSourceElement() + sourceElements.append(sourceElement) + if sourceElement.expression.type != Syntax.Literal: + break + directive = source[(token.range[0] + 1):(token.range[1] - 1)] + if directive == "use strict": + strict = True + if firstRestricted: + throwErrorTolerant(firstRestricted, + Messages.StrictOctalLiteral) + else: + if (not firstRestricted) and token.octal: + firstRestricted = token + while index < length: + sourceElement = parseSourceElement() + if ('undefined' if not 'sourceElement' in locals() else + typeof(sourceElement)) == "undefined": + break + sourceElements.append(sourceElement) + return sourceElements + + +def parseProgram(): + global strict + body = None + skipComment() + delegate.markStart() + strict = False + peek() + body = parseSourceElements() + return delegate.markEnd(delegate.createProgram(body)) + + +def collectToken(): + start = None + loc = None + token = None + range = None + value = None + skipComment() + start = index + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": index - lineStart, + }), + }) + token = extra.advance() + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + if token.type != Token.EOF: + range = [token.range[0], token.range[1]] + value = source[token.range[0]:token.range[1]] + extra.tokens.append( + jsdict({ + "type": TokenName[token.type], + "value": value, + "range": range, + "loc": loc, + })) + return token + + +def collectRegex(): + pos = None + loc = None + regex = None + token = None + skipComment() + pos = index + loc = jsdict({ + "start": + jsdict({ + "line": lineNumber, + "column": index - lineStart, + }), + }) + regex = extra.scanRegExp() + loc.end = jsdict({ + "line": lineNumber, + "column": index - lineStart, + }) + if not extra.tokenize: + if len(extra.tokens) > 0: + token = extra.tokens[len(extra.tokens) - 1] + if (token.range[0] == pos) and (token.type == "Punctuator"): + if (token.value == "/") or (token.value == "/="): + extra.tokens.pop() + extra.tokens.append( + jsdict({ + "type": "RegularExpression", + "value": regex.literal, + "range": [pos, index], + "loc": loc, + })) + return regex + + +def filterTokenLocation(): + i = None + entry = None + token = None + tokens = [] + i = 0 + while 1: + if not (i < len(extra.tokens)): + break + entry = extra.tokens[i] + token = jsdict({ + "type": entry.type, + "value": entry.value, + }) + if extra.range: + token.range = entry.range + if extra.loc: + token.loc = entry.loc + tokens.append(token) + i += 1 + extra.tokens = tokens + + +class LocationMarker(object): + def __init__(self=None): + self.marker = [index, lineNumber, index - lineStart, 0, 0, 0] + + def end(self=None): + self.marker[3] = index + self.marker[4] = lineNumber + self.marker[5] = index - lineStart + + def apply(self=None, node=None): + if extra.range: + node.range = [self.marker[0], self.marker[3]] + if extra.loc: + node.loc = jsdict({ + "start": + jsdict({ + "line": self.marker[1], + "column": self.marker[2], + }), + "end": + jsdict({ + "line": self.marker[4], + "column": self.marker[5], + }), + }) + node = delegate.postProcess(node) + + +def createLocationMarker(): + if (not extra.loc) and (not extra.range): + return None + skipComment() + return LocationMarker() + + +def patch(): + global advance, scanRegExp + if ('undefined' if not ('tokens' in extra) else typeof( + extra.tokens)) != "undefined": + extra.advance = advance + extra.scanRegExp = scanRegExp + advance = collectToken + scanRegExp = collectRegex + + +def unpatch(): + global advance, scanRegExp + if ('undefined' if not ('scanRegExp' in extra) else typeof( + extra.scanRegExp)) == "function": + advance = extra.advance + scanRegExp = extra.scanRegExp + + +def tokenize(code, **options): + global delegate, source, index, lineNumber, lineStart, length, lookahead, state, extra + options = jsdict(options) + toString = None + token = None + tokens = None + toString = str + if (('undefined' if not 'code' in locals() else typeof(code)) != + "string") and (not isinstance(code, str)): + code = toString(code) + delegate = SyntaxTreeDelegate + source = code + index = 0 + lineNumber = (1 if len(source) > 0 else 0) + lineStart = 0 + length = len(source) + lookahead = None + state = jsdict({ + "allowIn": True, + "labelSet": jsdict({}), + "inFunctionBody": False, + "inIteration": False, + "inSwitch": False, + "lastCommentStart": -1, + }) + extra = jsdict({}) + options = options or jsdict({}) + options.tokens = True + extra.tokens = [] + extra.tokenize = True + extra.openParenToken = -1 + extra.openCurlyToken = -1 + extra.range = (('undefined' if not ('range' in options) else typeof( + options.range)) == "boolean") and options.range + extra.loc = (('undefined' if not ('loc' in options) else typeof( + options.loc)) == "boolean") and options.loc + if (('undefined' if not ('comment' in options) else typeof( + options.comment)) == "boolean") and options.comment: + extra.comments = [] + if (('undefined' if not ('tolerant' in options) else typeof( + options.tolerant)) == "boolean") and options.tolerant: + extra.errors = [] + if length > 0: + if (typeof(source[0])) == "undefined": + if isinstance(code, str): + source = code.valueOf() + patch() + try: + peek() + if lookahead.type == Token.EOF: + return extra.tokens + token = lex() + while lookahead.type != Token.EOF: + try: + token = lex() + except Exception as lexError: + token = lookahead + if extra.errors: + extra.errors.append(lexError) + break + else: + raise + filterTokenLocation() + tokens = extra.tokens + if ('undefined' if not ('comments' in extra) else typeof( + extra.comments)) != "undefined": + tokens.comments = extra.comments + if ('undefined' if not ('errors' in extra) else typeof( + extra.errors)) != "undefined": + tokens.errors = extra.errors + except Exception as e: + raise + finally: + unpatch() + extra = jsdict({}) + return tokens + + +def parse(code, **options): + global delegate, source, index, lineNumber, lineStart, length, lookahead, state, extra + options = jsdict(options) + program = None + toString = None + toString = str + if (('undefined' if not 'code' in locals() else typeof(code)) != + "string") and (not isinstance(code, str)): + code = toString(code) + delegate = SyntaxTreeDelegate + source = code + index = 0 + lineNumber = (1 if len(source) > 0 else 0) + lineStart = 0 + length = len(source) + lookahead = None + state = jsdict({ + "allowIn": True, + "labelSet": jsdict({}), + "inFunctionBody": False, + "inIteration": False, + "inSwitch": False, + "lastCommentStart": -1, + "markerStack": [], + }) + extra = jsdict({}) + if ('undefined' + if not 'options' in locals() else typeof(options)) != "undefined": + extra.range = (('undefined' if not ('range' in options) else typeof( + options.range)) == "boolean") and options.range + extra.loc = (('undefined' if not ('loc' in options) else typeof( + options.loc)) == "boolean") and options.loc + if (extra.loc and + (options.source != None)) and (options.source != undefined): + extra.source = toString(options.source) + if (('undefined' if not ('tokens' in options) else typeof( + options.tokens)) == "boolean") and options.tokens: + extra.tokens = [] + if (('undefined' if not ('comment' in options) else typeof( + options.comment)) == "boolean") and options.comment: + extra.comments = [] + if (('undefined' if not ('tolerant' in options) else typeof( + options.tolerant)) == "boolean") and options.tolerant: + extra.errors = [] + if length > 0: + if (typeof(source[0])) == "undefined": + if isinstance(code, str): + source = code.valueOf() + patch() + try: + program = parseProgram() + if ('undefined' if not ('comments' in extra) else typeof( + extra.comments)) != "undefined": + program.comments = extra.comments + if ('undefined' if not ('tokens' in extra) else typeof( + extra.tokens)) != "undefined": + filterTokenLocation() + program.tokens = extra.tokens + if ('undefined' if not ('errors' in extra) else typeof( + extra.errors)) != "undefined": + program.errors = extra.errors + except Exception as e: + raise + finally: + unpatch() + extra = jsdict({}) + return program + + +parse('var = 490 \n a=4;') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/objects.py b/Contents/Libraries/Shared/js2py/legecy_translators/objects.py new file mode 100644 index 000000000..2abda3e8b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/objects.py @@ -0,0 +1,300 @@ +""" This module removes all objects/arrays from JS source code and replace them with LVALS. +Also it has s function translating removed object/array to python code. +Use this module just after removing constants. Later move on to removing functions""" +OBJECT_LVAL = 'PyJsLvalObject%d_' +ARRAY_LVAL = 'PyJsLvalArray%d_' +from utils import * +from jsparser import * +from nodevisitor import exp_translator +import functions +from flow import KEYWORD_METHODS + + +def FUNC_TRANSLATOR(*a): # stupid import system in python + raise RuntimeError('Remember to set func translator. Thank you.') + + +def set_func_translator(ftrans): + # stupid stupid Python or Peter + global FUNC_TRANSLATOR + FUNC_TRANSLATOR = ftrans + + +def is_empty_object(n, last): + """n may be the inside of block or object""" + if n.strip(): + return False + # seems to be but can be empty code + last = last.strip() + markers = { + ')', + ';', + } + if not last or last[-1] in markers: + return False + return True + + +# todo refine this function +def is_object(n, last): + """n may be the inside of block or object. + last is the code before object""" + if is_empty_object(n, last): + return True + if not n.strip(): + return False + #Object contains lines of code so it cant be an object + if len(argsplit(n, ';')) > 1: + return False + cands = argsplit(n, ',') + if not cands[-1].strip(): + return True # {xxxx,} empty after last , it must be an object + for cand in cands: + cand = cand.strip() + # separate each candidate element at : in dict and check whether they are correct... + kv = argsplit(cand, ':') + if len( + kv + ) > 2: # set the len of kv to 2 because of this stupid : expression + kv = kv[0], ':'.join(kv[1:]) + + if len(kv) == 2: + # key value pair, check whether not label or ?: + k, v = kv + if not is_lval(k.strip()): + return False + v = v.strip() + if v.startswith('function'): + continue + #will fail on label... {xxx: while {}} + if v[0] == '{': # value cant be a code block + return False + for e in KEYWORD_METHODS: + # if v starts with any statement then return false + if v.startswith(e) and len(e) < len(v) and v[len( + e)] not in IDENTIFIER_PART: + return False + elif not (cand.startswith('set ') or cand.startswith('get ')): + return False + return True + + +def is_array(last): + #it can be prop getter + last = last.strip() + if any( + endswith_keyword(last, e) for e in + {'return', 'new', 'void', 'throw', 'typeof', 'in', 'instanceof'}): + return True + markers = {')', ']'} + return not last or not (last[-1] in markers or last[-1] in IDENTIFIER_PART) + + +def remove_objects(code, count=1): + """ This function replaces objects with OBJECTS_LVALS, returns new code, replacement dict and count. + count arg is the number that should be added to the LVAL of the first replaced object + """ + replacements = {} #replacement dict + br = bracket_split(code, ['{}', '[]']) + res = '' + last = '' + for e in br: + #test whether e is an object + if e[0] == '{': + n, temp_rep, cand_count = remove_objects(e[1:-1], count) + # if e was not an object then n should not contain any : + if is_object(n, last): + #e was an object + res += ' ' + OBJECT_LVAL % count + replacements[OBJECT_LVAL % count] = e + count += 1 + else: + # e was just a code block but could contain objects inside + res += '{%s}' % n + count = cand_count + replacements.update(temp_rep) + elif e[0] == '[': + if is_array(last): + res += e # will be translated later + else: # prop get + n, rep, count = remove_objects(e[1:-1], count) + res += '[%s]' % n + replacements.update(rep) + else: # e does not contain any objects + res += e + last = e #needed to test for this stipid empty object + return res, replacements, count + + +def remove_arrays(code, count=1): + """removes arrays and replaces them with ARRAY_LVALS + returns new code and replacement dict + *NOTE* has to be called AFTER remove objects""" + res = '' + last = '' + replacements = {} + for e in bracket_split(code, ['[]']): + if e[0] == '[': + if is_array(last): + name = ARRAY_LVAL % count + res += ' ' + name + replacements[name] = e + count += 1 + else: # pseudo array. But pseudo array can contain true array. for example a[['d'][3]] has 2 pseudo and 1 true array + cand, new_replacements, count = remove_arrays(e[1:-1], count) + res += '[%s]' % cand + replacements.update(new_replacements) + else: + res += e + last = e + return res, replacements, count + + +def translate_object(obj, lval, obj_count=1, arr_count=1): + obj = obj[1:-1] # remove {} from both ends + obj, obj_rep, obj_count = remove_objects(obj, obj_count) + obj, arr_rep, arr_count = remove_arrays(obj, arr_count) + # functions can be defined inside objects. exp translator cant translate them. + # we have to remove them and translate with func translator + # its better explained in translate_array function + obj, hoisted, inline = functions.remove_functions(obj, all_inline=True) + assert not hoisted + gsetters_after = '' + keys = argsplit(obj) + res = [] + for i, e in enumerate(keys, 1): + e = e.strip() + if e.startswith('set '): + gsetters_after += translate_setter(lval, e) + elif e.startswith('get '): + gsetters_after += translate_getter(lval, e) + elif ':' not in e: + if i < len(keys + ): # can happen legally only in the last element {3:2,} + raise SyntaxError('Unexpected "," in Object literal') + break + else: #Not getter, setter or elision + spl = argsplit(e, ':') + if len(spl) < 2: + raise SyntaxError('Invalid Object literal: ' + e) + try: + key, value = spl + except: #len(spl)> 2 + print 'Unusual case ' + repr(e) + key = spl[0] + value = ':'.join(spl[1:]) + key = key.strip() + if is_internal(key): + key = '%s.to_string().value' % key + else: + key = repr(key) + + value = exp_translator(value) + if not value: + raise SyntaxError('Missing value in Object literal') + res.append('%s:%s' % (key, value)) + res = '%s = Js({%s})\n' % (lval, ','.join(res)) + gsetters_after + # translate all the nested objects (including removed earlier functions) + for nested_name, nested_info in inline.iteritems(): # functions + nested_block, nested_args = nested_info + new_def = FUNC_TRANSLATOR(nested_name, nested_block, nested_args) + res = new_def + res + for lval, obj in obj_rep.iteritems(): #objects + new_def, obj_count, arr_count = translate_object( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + res = new_def + res + for lval, obj in arr_rep.iteritems(): # arrays + new_def, obj_count, arr_count = translate_array( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + res = new_def + res + return res, obj_count, arr_count + + +def translate_setter(lval, setter): + func = 'function' + setter[3:] + try: + _, data, _ = functions.remove_functions(func) + if not data or len(data) > 1: + raise Exception() + except: + raise SyntaxError('Could not parse setter: ' + setter) + prop = data.keys()[0] + body, args = data[prop] + if len(args) != 1: #setter must have exactly 1 argument + raise SyntaxError('Invalid setter. It must take exactly 1 argument.') + # now messy part + res = FUNC_TRANSLATOR('setter', body, args) + res += "%s.define_own_property(%s, {'set': setter})\n" % (lval, repr(prop)) + return res + + +def translate_getter(lval, getter): + func = 'function' + getter[3:] + try: + _, data, _ = functions.remove_functions(func) + if not data or len(data) > 1: + raise Exception() + except: + raise SyntaxError('Could not parse getter: ' + getter) + prop = data.keys()[0] + body, args = data[prop] + if len(args) != 0: #setter must have exactly 0 argument + raise SyntaxError('Invalid getter. It must take exactly 0 argument.') + # now messy part + res = FUNC_TRANSLATOR('getter', body, args) + res += "%s.define_own_property(%s, {'get': setter})\n" % (lval, repr(prop)) + return res + + +def translate_array(array, lval, obj_count=1, arr_count=1): + """array has to be any js array for example [1,2,3] + lval has to be name of this array. + Returns python code that adds lval to the PY scope it should be put before lval""" + array = array[1:-1] + array, obj_rep, obj_count = remove_objects(array, obj_count) + array, arr_rep, arr_count = remove_arrays(array, arr_count) + #functions can be also defined in arrays, this caused many problems since in Python + # functions cant be defined inside literal + # remove functions (they dont contain arrays or objects so can be translated easily) + # hoisted functions are treated like inline + array, hoisted, inline = functions.remove_functions(array, all_inline=True) + assert not hoisted + arr = [] + # separate elements in array + for e in argsplit(array, ','): + # translate expressions in array PyJsLvalInline will not be translated! + e = exp_translator(e.replace('\n', '')) + arr.append(e if e else 'None') + arr = '%s = Js([%s])\n' % (lval, ','.join(arr)) + #But we can have more code to add to define arrays/objects/functions defined inside this array + # translate nested objects: + # functions: + for nested_name, nested_info in inline.iteritems(): + nested_block, nested_args = nested_info + new_def = FUNC_TRANSLATOR(nested_name, nested_block, nested_args) + arr = new_def + arr + for lval, obj in obj_rep.iteritems(): + new_def, obj_count, arr_count = translate_object( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + arr = new_def + arr + for lval, obj in arr_rep.iteritems(): + new_def, obj_count, arr_count = translate_array( + obj, lval, obj_count, arr_count) + # add object definition BEFORE array definition + arr = new_def + arr + return arr, obj_count, arr_count + + +if __name__ == '__main__': + test = 'a = {404:{494:19}}; b = 303; if () {f={:}; { }}' + + #print remove_objects(test) + #print list(bracket_split(' {}')) + print + print remove_arrays( + 'typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""], [][[5][5]])[1].toLowerCase()])' + ) + print is_object('', ')') diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py b/Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py new file mode 100644 index 000000000..d6af01958 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/tokenize.py @@ -0,0 +1,4 @@ +from jsparser import * +from utils import * +# maybe I will try rewriting my parser in the future... Tokenizer makes things much easier and faster, unfortunately I +# did not know anything about parsers when I was starting this project so I invented my own. diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/translator.py b/Contents/Libraries/Shared/js2py/legecy_translators/translator.py new file mode 100644 index 000000000..3573f06c6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/translator.py @@ -0,0 +1,151 @@ +from flow import translate_flow +from constants import remove_constants, recover_constants +from objects import remove_objects, remove_arrays, translate_object, translate_array, set_func_translator +from functions import remove_functions, reset_inline_count +from jsparser import inject_before_lval, indent, dbg + +TOP_GLOBAL = '''from js2py.pyjs import *\nvar = Scope( JS_BUILTINS )\nset_global_object(var)\n''' + + +def translate_js(js, top=TOP_GLOBAL): + """js has to be a javascript source code. + returns equivalent python code.""" + # Remove constant literals + no_const, constants = remove_constants(js) + #print 'const count', len(constants) + # Remove object literals + no_obj, objects, obj_count = remove_objects(no_const) + #print 'obj count', len(objects) + # Remove arrays + no_arr, arrays, arr_count = remove_arrays(no_obj) + #print 'arr count', len(arrays) + # Here remove and replace functions + reset_inline_count() + no_func, hoisted, inline = remove_functions(no_arr) + + #translate flow and expressions + py_seed, to_register = translate_flow(no_func) + + # register variables and hoisted functions + #top += '# register variables\n' + top += 'var.registers(%s)\n' % str(to_register + hoisted.keys()) + + #Recover functions + # hoisted functions recovery + defs = '' + #defs += '# define hoisted functions\n' + #print len(hoisted) , 'HH'*40 + for nested_name, nested_info in hoisted.iteritems(): + nested_block, nested_args = nested_info + new_code = translate_func('PyJsLvalTempHoisted', nested_block, + nested_args) + new_code += 'PyJsLvalTempHoisted.func_name = %s\n' % repr(nested_name) + defs += new_code + '\nvar.put(%s, PyJsLvalTempHoisted)\n' % repr( + nested_name) + #defs += '# Everting ready!\n' + # inline functions recovery + for nested_name, nested_info in inline.iteritems(): + nested_block, nested_args = nested_info + new_code = translate_func(nested_name, nested_block, nested_args) + py_seed = inject_before_lval(py_seed, + nested_name.split('@')[0], new_code) + # add hoisted definitiond - they have literals that have to be recovered + py_seed = defs + py_seed + + #Recover arrays + for arr_lval, arr_code in arrays.iteritems(): + translation, obj_count, arr_count = translate_array( + arr_code, arr_lval, obj_count, arr_count) + py_seed = inject_before_lval(py_seed, arr_lval, translation) + + #Recover objects + for obj_lval, obj_code in objects.iteritems(): + translation, obj_count, arr_count = translate_object( + obj_code, obj_lval, obj_count, arr_count) + py_seed = inject_before_lval(py_seed, obj_lval, translation) + + #Recover constants + py_code = recover_constants(py_seed, constants) + + return top + py_code + + +def translate_func(name, block, args): + """Translates functions and all nested functions to Python code. + name - name of that function (global functions will be available under var while + inline will be available directly under this name ) + block - code of the function (*with* brackets {} ) + args - arguments that this function takes""" + inline = name.startswith('PyJsLvalInline') + real_name = '' + if inline: + name, real_name = name.split('@') + arglist = ', '.join(args) + ', ' if args else '' + code = '@Js\ndef %s(%sthis, arguments, var=var):\n' % (name, arglist) + # register local variables + scope = "'this':this, 'arguments':arguments" #it will be a simple dictionary + for arg in args: + scope += ', %s:%s' % (repr(arg), arg) + if real_name: + scope += ', %s:%s' % (repr(real_name), name) + code += indent('var = Scope({%s}, var)\n' % scope) + block, nested_hoisted, nested_inline = remove_functions(block) + py_code, to_register = translate_flow(block) + #register variables declared with var and names of hoisted functions. + to_register += nested_hoisted.keys() + if to_register: + code += indent('var.registers(%s)\n' % str(to_register)) + for nested_name, info in nested_hoisted.iteritems(): + nested_block, nested_args = info + new_code = translate_func('PyJsLvalTempHoisted', nested_block, + nested_args) + # Now put definition of hoisted function on the top + code += indent(new_code) + code += indent( + 'PyJsLvalTempHoisted.func_name = %s\n' % repr(nested_name)) + code += indent( + 'var.put(%s, PyJsLvalTempHoisted)\n' % repr(nested_name)) + for nested_name, info in nested_inline.iteritems(): + nested_block, nested_args = info + new_code = translate_func(nested_name, nested_block, nested_args) + # Inject definitions of inline functions just before usage + # nested inline names have this format : LVAL_NAME@REAL_NAME + py_code = inject_before_lval(py_code, + nested_name.split('@')[0], new_code) + if py_code.strip(): + code += indent(py_code) + return code + + +set_func_translator(translate_func) + +#print inject_before_lval(' chuj\n moj\n lval\nelse\n', 'lval', 'siema\njestem piter\n') +import time +#print time.time() +#print translate_js('if (1) console.log("Hello, World!"); else if (5) console.log("Hello world?");') +#print time.time() +t = """ +var x = [1,2,3,4,5,6]; +for (var e in x) {console.log(e); delete x[3];} +console.log(5 in [1,2,3,4,5]); + +""" + +SANDBOX = ''' +import traceback +try: +%s +except: + print traceback.format_exc() +print +raw_input('Press Enter to quit') +''' +if __name__ == '__main__': + # test with jq if works then it really works :) + #with open('jq.js', 'r') as f: + #jq = f.read() + + #res = translate_js(jq) + res = translate_js(t) + dbg(SANDBOX % indent(res)) + print 'Done' diff --git a/Contents/Libraries/Shared/js2py/legecy_translators/utils.py b/Contents/Libraries/Shared/js2py/legecy_translators/utils.py new file mode 100644 index 000000000..b14e13d83 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/legecy_translators/utils.py @@ -0,0 +1,91 @@ +import sys +import unicodedata +from collections import defaultdict + + +def is_lval(t): + """Does not chceck whether t is not resticted or internal""" + if not t: + return False + i = iter(t) + if i.next() not in IDENTIFIER_START: + return False + return all(e in IDENTIFIER_PART for e in i) + + +def is_valid_lval(t): + """Checks whether t is valid JS identifier name (no keyword like var, function, if etc) + Also returns false on internal""" + if not is_internal(t) and is_lval(t) and t not in RESERVED_NAMES: + return True + return False + + +def is_plval(t): + return t.startswith('PyJsLval') + + +def is_marker(t): + return t.startswith('PyJsMarker') or t.startswith('PyJsConstant') + + +def is_internal(t): + return is_plval(t) or is_marker(t) or t == 'var' # var is a scope var + + +def is_property_accessor(t): + return '[' in t or '.' in t + + +def is_reserved(t): + return t in RESERVED_NAMES + + +#http://stackoverflow.com/questions/14245893/efficiently-list-all-characters-in-a-given-unicode-category +BOM = u'\uFEFF' +ZWJ = u'\u200D' +ZWNJ = u'\u200C' +TAB = u'\u0009' +VT = u'\u000B' +FF = u'\u000C' +SP = u'\u0020' +NBSP = u'\u00A0' +LF = u'\u000A' +CR = u'\u000D' +LS = u'\u2028' +PS = u'\u2029' + +U_CATEGORIES = defaultdict(list) # Thank you Martijn Pieters! +for c in map(unichr, range(sys.maxunicode + 1)): + U_CATEGORIES[unicodedata.category(c)].append(c) + +UNICODE_LETTER = set(U_CATEGORIES['Lu'] + U_CATEGORIES['Ll'] + + U_CATEGORIES['Lt'] + U_CATEGORIES['Lm'] + + U_CATEGORIES['Lo'] + U_CATEGORIES['Nl']) +UNICODE_COMBINING_MARK = set(U_CATEGORIES['Mn'] + U_CATEGORIES['Mc']) +UNICODE_DIGIT = set(U_CATEGORIES['Nd']) +UNICODE_CONNECTOR_PUNCTUATION = set(U_CATEGORIES['Pc']) +IDENTIFIER_START = UNICODE_LETTER.union( + {'$', '_'}) # and some fucking unicode escape sequence +IDENTIFIER_PART = IDENTIFIER_START.union(UNICODE_COMBINING_MARK).union( + UNICODE_DIGIT).union(UNICODE_CONNECTOR_PUNCTUATION).union({ZWJ, ZWNJ}) +USP = U_CATEGORIES['Zs'] +KEYWORD = { + 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', + 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while', + 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', + 'in', 'try' +} + +FUTURE_RESERVED_WORD = { + 'class', 'enum', 'extends', 'super', 'const', 'export', 'import' +} +RESERVED_NAMES = KEYWORD.union(FUTURE_RESERVED_WORD).union( + {'null', 'false', 'true'}) + +WHITE = {TAB, VT, FF, SP, NBSP, BOM}.union(USP) +LINE_TERMINATOR = {LF, CR, LS, PS} +LLINE_TERMINATOR = list(LINE_TERMINATOR) +x = ''.join(WHITE) + ''.join(LINE_TERMINATOR) +SPACE = WHITE.union(LINE_TERMINATOR) +LINE_TERMINATOR_SEQUENCE = LINE_TERMINATOR.union({CR + LF}) diff --git a/Contents/Libraries/Shared/js2py/node_import.py b/Contents/Libraries/Shared/js2py/node_import.py new file mode 100644 index 000000000..a49a1f51e --- /dev/null +++ b/Contents/Libraries/Shared/js2py/node_import.py @@ -0,0 +1,113 @@ +__all__ = ['require'] +import subprocess, os, codecs, glob +from .evaljs import translate_js +import six +DID_INIT = False +DIRNAME = os.path.dirname(os.path.abspath(__file__)) +PY_NODE_MODULES_PATH = os.path.join(DIRNAME, 'py_node_modules') + + +def _init(): + global DID_INIT + if DID_INIT: + return + assert subprocess.call( + 'node -v', shell=True, cwd=DIRNAME + ) == 0, 'You must have node installed! run: brew install node' + assert subprocess.call( + 'cd %s;npm install babel-core babel-cli babel-preset-es2015 babel-polyfill babelify browserify' + % repr(DIRNAME), + shell=True, + cwd=DIRNAME) == 0, 'Could not link required node_modules' + DID_INIT = True + + +ADD_TO_GLOBALS_FUNC = ''' +;function addToGlobals(name, obj) { + if (!Object.prototype.hasOwnProperty('_fake_exports')) { + Object.prototype._fake_exports = {}; + } + Object.prototype._fake_exports[name] = obj; +}; + +''' +# subprocess.call("""node -e 'require("browserify")'""", shell=True) +GET_FROM_GLOBALS_FUNC = ''' +;function getFromGlobals(name) { + if (!Object.prototype.hasOwnProperty('_fake_exports')) { + throw Error("Could not find any value named "+name); + } + if (Object.prototype._fake_exports.hasOwnProperty(name)) { + return Object.prototype._fake_exports[name]; + } else { + throw Error("Could not find any value named "+name); + } +}; + +''' + + +def require(module_name, include_polyfill=False, update=False): + assert isinstance(module_name, str), 'module_name must be a string!' + py_name = module_name.replace('-', '_') + module_filename = '%s.py' % py_name + var_name = py_name.rpartition('/')[-1] + if not os.path.exists(os.path.join(PY_NODE_MODULES_PATH, + module_filename)) or update: + _init() + in_file_name = 'tmp0in439341018923js2py.js' + out_file_name = 'tmp0out439341018923js2py.js' + code = ADD_TO_GLOBALS_FUNC + if include_polyfill: + code += "\n;require('babel-polyfill');\n" + code += """ + var module_temp_love_python = require(%s); + addToGlobals(%s, module_temp_love_python); + """ % (repr(module_name), repr(module_name)) + with open(os.path.join(DIRNAME, in_file_name), 'wb') as f: + f.write(code.encode('utf-8') if six.PY3 else code) + + pkg_name = module_name.partition('/')[0] + # make sure the module is installed + assert subprocess.call( + 'cd %s;npm install %s' % (repr(DIRNAME), pkg_name), + shell=True, + cwd=DIRNAME + ) == 0, 'Could not install the required module: ' + pkg_name + + # convert the module + assert subprocess.call( + '''node -e "(require('browserify')('./%s').bundle(function (err,data) {fs.writeFile('%s', require('babel-core').transform(data, {'presets': require('babel-preset-es2015')}).code, ()=>{});}))"''' + % (in_file_name, out_file_name), + shell=True, + cwd=DIRNAME, + ) == 0, 'Error when converting module to the js bundle' + + os.remove(os.path.join(DIRNAME, in_file_name)) + with codecs.open(os.path.join(DIRNAME, out_file_name), "r", + "utf-8") as f: + js_code = f.read() + os.remove(os.path.join(DIRNAME, out_file_name)) + + js_code += GET_FROM_GLOBALS_FUNC + js_code += ';var %s = getFromGlobals(%s);%s' % ( + var_name, repr(module_name), var_name) + print('Please wait, translating...') + py_code = translate_js(js_code) + + dirname = os.path.dirname( + os.path.join(PY_NODE_MODULES_PATH, module_filename)) + if not os.path.isdir(dirname): + os.makedirs(dirname) + with open(os.path.join(PY_NODE_MODULES_PATH, module_filename), + 'wb') as f: + f.write(py_code.encode('utf-8') if six.PY3 else py_code) + else: + with codecs.open( + os.path.join(PY_NODE_MODULES_PATH, module_filename), "r", + "utf-8") as f: + py_code = f.read() + + context = {} + exec (py_code, context) + return context['var'][var_name].to_py() diff --git a/Contents/Libraries/Shared/js2py/prototypes/__init__.py b/Contents/Libraries/Shared/js2py/prototypes/__init__.py new file mode 100644 index 000000000..8de79cb9d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/__init__.py @@ -0,0 +1 @@ +__author__ = 'Piotr Dabkowski' diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsarray.py b/Contents/Libraries/Shared/js2py/prototypes/jsarray.py new file mode 100644 index 000000000..d02e62b25 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsarray.py @@ -0,0 +1,476 @@ +import six + +if six.PY3: + xrange = range + import functools + + +def to_arr(this): + """Returns Python array from Js array""" + return [this.get(str(e)) for e in xrange(len(this))] + + +ARR_STACK = set({}) + + +class ArrayPrototype: + def toString(): + # this function is wrong but I will leave it here fore debugging purposes. + func = this.get('join') + if not func.is_callable(): + + @this.Js + def func(): + return '[object %s]' % this.Class + + return func.call(this, ()) + + def toLocaleString(): + array = this.to_object() + arr_len = array.get('length').to_uint32() + # separator is simply a comma ',' + if not arr_len: + return '' + res = [] + for i in xrange(arr_len): + element = array[str(i)] + if element.is_undefined() or element.is_null(): + res.append('') + else: + cand = element.to_object() + str_func = element.get('toLocaleString') + if not str_func.is_callable(): + raise this.MakeError( + 'TypeError', + 'toLocaleString method of item at index %d is not callable' + % i) + res.append(element.callprop('toLocaleString').value) + return ','.join(res) + + def concat(): + array = this.to_object() + A = this.Js([]) + items = [array] + items.extend(to_arr(arguments)) + n = 0 + for E in items: + if E.Class == 'Array': + k = 0 + e_len = len(E) + while k < e_len: + if E.has_property(str(k)): + A.put(str(n), E.get(str(k))) + n += 1 + k += 1 + else: + A.put(str(n), E) + n += 1 + return A + + def join(separator): + ARR_STACK.add(this) + array = this.to_object() + arr_len = array.get('length').to_uint32() + separator = ',' if separator.is_undefined() else separator.to_string( + ).value + elems = [] + for e in xrange(arr_len): + elem = array.get(str(e)) + if elem in ARR_STACK: + s = '' + else: + s = elem.to_string().value + elems.append( + s if not (elem.is_undefined() or elem.is_null()) else '') + res = separator.join(elems) + ARR_STACK.remove(this) + return res + + def pop(): #todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not arr_len: + array.put('length', this.Js(arr_len)) + return None + ind = str(arr_len - 1) + element = array.get(ind) + array.delete(ind) + array.put('length', this.Js(arr_len - 1)) + return element + + def push(item): # todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + to_put = arguments.to_list() + i = arr_len + for i, e in enumerate(to_put, arr_len): + array.put(str(i), e) + if to_put: + i += 1 + array.put('length', this.Js(i)) + return i + + def reverse(): + array = this.to_object() # my own algorithm + vals = to_arr(array) + has_props = [array.has_property(str(e)) for e in xrange(len(array))] + vals.reverse() + has_props.reverse() + for i, val in enumerate(vals): + if has_props[i]: + array.put(str(i), val) + else: + array.delete(str(i)) + return array + + def shift(): #todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not arr_len: + array.put('length', this.Js(0)) + return None + first = array.get('0') + for k in xrange(1, arr_len): + from_s, to_s = str(k), str(k - 1) + if array.has_property(from_s): + array.put(to_s, array.get(from_s)) + else: + array.delete(to) + array.delete(str(arr_len - 1)) + array.put('length', this.Js(str(arr_len - 1))) + return first + + def slice(start, end): # todo check + array = this.to_object() + arr_len = array.get('length').to_uint32() + relative_start = start.to_int() + k = max((arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + relative_end = arr_len if end.is_undefined() else end.to_int() + final = max((arr_len + relative_end), 0) if relative_end < 0 else min( + relative_end, arr_len) + res = [] + n = 0 + while k < final: + pk = str(k) + if array.has_property(pk): + res.append(array.get(pk)) + k += 1 + n += 1 + return res + + def sort(cmpfn): + if not this.Class in ('Array', 'Arguments'): + return this.to_object() # do nothing + arr = [] + for i in xrange(len(this)): + arr.append(this.get(six.text_type(i))) + + if not arr: + return this + if not cmpfn.is_callable(): + cmpfn = None + cmp = lambda a, b: sort_compare(a, b, cmpfn) + if six.PY3: + key = functools.cmp_to_key(cmp) + arr.sort(key=key) + else: + arr.sort(cmp=cmp) + for i in xrange(len(arr)): + this.put(six.text_type(i), arr[i]) + + return this + + def splice(start, deleteCount): + # 1-8 + array = this.to_object() + arr_len = array.get('length').to_uint32() + relative_start = start.to_int() + actual_start = max( + (arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + actual_delete_count = min( + max(deleteCount.to_int(), 0), arr_len - actual_start) + k = 0 + A = this.Js([]) + # 9 + while k < actual_delete_count: + if array.has_property(str(actual_start + k)): + A.put(str(k), array.get(str(actual_start + k))) + k += 1 + # 10-11 + items = to_arr(arguments)[2:] + items_len = len(items) + # 12 + if items_len < actual_delete_count: + k = actual_start + while k < (arr_len - actual_delete_count): + fr = str(k + actual_delete_count) + to = str(k + items_len) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k += 1 + k = arr_len + while k > (arr_len - actual_delete_count + items_len): + array.delete(str(k - 1)) + k -= 1 + # 13 + elif items_len > actual_delete_count: + k = arr_len - actual_delete_count + while k > actual_start: + fr = str(k + actual_delete_count - 1) + to = str(k + items_len - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + # 14-17 + k = actual_start + while items: + E = items.pop(0) + array.put(str(k), E) + k += 1 + array.put('length', this.Js(arr_len - actual_delete_count + items_len)) + return A + + def unshift(): + array = this.to_object() + arr_len = array.get('length').to_uint32() + argCount = len(arguments) + k = arr_len + while k > 0: + fr = str(k - 1) + to = str(k + argCount - 1) + if array.has_property(fr): + array.put(to, array.get(fr)) + else: + array.delete(to) + k -= 1 + j = 0 + items = to_arr(arguments) + while items: + E = items.pop(0) + array.put(str(j), E) + j += 1 + array.put('length', this.Js(arr_len + argCount)) + return arr_len + argCount + + def indexOf(searchElement): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = 0 + if n >= arr_len: + return -1 + if n >= 0: + k = n + else: + k = arr_len - abs(n) + if k < 0: + k = 0 + while k < arr_len: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k += 1 + return -1 + + def lastIndexOf(searchElement): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = arr_len - 1 + if n >= 0: + k = min(n, arr_len - 1) + else: + k = arr_len - abs(n) + while k >= 0: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k -= 1 + return -1 + + def every(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if not callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return False + k += 1 + return True + + def some(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return True + k += 1 + return False + + def forEach(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + callbackfn.call(T, (kValue, this.Js(k), array)) + k += 1 + + def map(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + A = this.Js([]) + k = 0 + while k < arr_len: + Pk = str(k) + if array.has_property(Pk): + kValue = array.get(Pk) + mappedValue = callbackfn.call(T, (kValue, this.Js(k), array)) + A.define_own_property( + Pk, { + 'value': mappedValue, + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + k += 1 + return A + + def filter(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + res = [] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + res.append(kValue) + k += 1 + return res # converted to js array automatically + + def reduce(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = 0 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k < arr_len: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k += 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k += 1 + return accumulator + + def reduceRight(callbackfn): + array = this.to_object() + arr_len = array.get('length').to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = arr_len - 1 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k >= 0: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k -= 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k >= 0: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k -= 1 + return accumulator + + +def sort_compare(a, b, comp): + if a is None: + if b is None: + return 0 + return 1 + if b is None: + if a is None: + return 0 + return -1 + if a.is_undefined(): + if b.is_undefined(): + return 0 + return 1 + if b.is_undefined(): + if a.is_undefined(): + return 0 + return -1 + if comp is not None: + res = comp.call(a.undefined, (a, b)) + return res.to_int() + x, y = a.to_string(), b.to_string() + if x < y: + return -1 + elif x > y: + return 1 + return 0 diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py b/Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py new file mode 100644 index 000000000..7bcd00fb0 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsarraybuffer.py @@ -0,0 +1,19 @@ +# this is based on jsarray.py + +import six + +if six.PY3: + xrange = range + import functools + + +def to_arr(this): + """Returns Python array from Js array""" + return [this.get(str(e)) for e in xrange(len(this))] + + +ARR_STACK = set({}) + + +class ArrayBufferPrototype: + pass diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsboolean.py b/Contents/Libraries/Shared/js2py/prototypes/jsboolean.py new file mode 100644 index 000000000..2cacd32da --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsboolean.py @@ -0,0 +1,10 @@ +class BooleanPrototype: + def toString(): + if this.Class != 'Boolean': + raise this.Js(TypeError)('this must be a boolean') + return 'true' if this.value else 'false' + + def valueOf(): + if this.Class != 'Boolean': + raise this.Js(TypeError)('this must be a boolean') + return this.value diff --git a/Contents/Libraries/Shared/js2py/prototypes/jserror.py b/Contents/Libraries/Shared/js2py/prototypes/jserror.py new file mode 100644 index 000000000..c488bf155 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jserror.py @@ -0,0 +1,10 @@ +class ErrorPrototype: + def toString(): + if this.TYPE != 'Object': + raise this.MakeError( + 'TypeError', 'Error.prototype.toString called on non-object') + name = this.get('name') + name = 'Error' if name.is_undefined() else name.to_string().value + msg = this.get('message') + msg = '' if msg.is_undefined() else msg.to_string().value + return name + (name and msg and ': ') + msg diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py b/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py new file mode 100644 index 000000000..2ed417e0d --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsfunction.py @@ -0,0 +1,51 @@ +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +class FunctionPrototype: + def toString(): + if not this.is_callable(): + raise TypeError('toString is not generic!') + args = ', '.join(this.code.__code__.co_varnames[:this.argcount]) + return 'function %s(%s) ' % (this.func_name, args) + this.source + + def call(): + arguments_ = arguments + if not len(arguments): + obj = this.Js(None) + else: + obj = arguments[0] + if len(arguments) <= 1: + args = () + else: + args = tuple([arguments_[e] for e in xrange(1, len(arguments_))]) + return this.call(obj, args) + + def apply(): + if not len(arguments): + obj = this.Js(None) + else: + obj = arguments[0] + if len(arguments) <= 1: + args = () + else: + appl = arguments[1] + args = tuple([appl[e] for e in xrange(len(appl))]) + return this.call(obj, args) + + def bind(thisArg): + arguments_ = arguments + target = this + if not target.is_callable(): + raise this.MakeError( + 'Object must be callable in order to be used with bind method') + if len(arguments) <= 1: + args = () + else: + args = tuple([arguments_[e] for e in xrange(1, len(arguments_))]) + return this.PyJsBoundFunction(target, thisArg, args) diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsjson.py b/Contents/Libraries/Shared/js2py/prototypes/jsjson.py new file mode 100644 index 000000000..9f7ccbb01 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsjson.py @@ -0,0 +1,219 @@ +import json +from ..base import Js +indent = '' +# python 3 support +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + + +def parse(text): + reviver = arguments[1] + s = text.to_string().value + try: + unfiltered = json.loads(s) + except: + raise this.MakeError('SyntaxError', + 'Could not parse JSON string - Invalid syntax') + unfiltered = to_js(this, unfiltered) + if reviver.is_callable(): + root = this.Js({'': unfiltered}) + return walk(root, '', reviver) + else: + return unfiltered + + +def stringify(value, replacer, space): + global indent + stack = set([]) + indent = '' + property_list = replacer_function = this.undefined + if replacer.is_object(): + if replacer.is_callable(): + replacer_function = replacer + elif replacer.Class == 'Array': + property_list = [] + for e in replacer: + v = replacer[e] + item = this.undefined + if v._type() == 'Number': + item = v.to_string() + elif v._type() == 'String': + item = v + elif v.is_object(): + if v.Class in ('String', 'Number'): + item = v.to_string() + if not item.is_undefined() and item.value not in property_list: + property_list.append(item.value) + if space.is_object(): + if space.Class == 'Number': + space = space.to_number() + elif space.Class == 'String': + space = space.to_string() + if space._type() == 'Number': + space = this.Js(min(10, space.to_int())) + gap = max(int(space.value), 0) * ' ' + elif space._type() == 'String': + gap = space.value[:10] + else: + gap = '' + return this.Js( + Str('', this.Js({ + '': value + }), replacer_function, property_list, gap, stack, space)) + + +def Str(key, holder, replacer_function, property_list, gap, stack, space): + value = holder[key] + if value.is_object(): + to_json = value.get('toJSON') + if to_json.is_callable(): + value = to_json.call(value, (key, )) + if not replacer_function.is_undefined(): + value = replacer_function.call(holder, (key, value)) + + if value.is_object(): + if value.Class == 'String': + value = value.to_string() + elif value.Class == 'Number': + value = value.to_number() + elif value.Class == 'Boolean': + value = value.to_boolean() + if value.is_null(): + return 'null' + elif value.Class == 'Boolean': + return 'true' if value.value else 'false' + elif value._type() == 'String': + return Quote(value) + elif value._type() == 'Number': + if not value.is_infinity(): + return value.to_string() + return 'null' + if value.is_object() and not value.is_callable(): + if value.Class == 'Array': + return ja(value, stack, gap, property_list, replacer_function, + space) + else: + return jo(value, stack, gap, property_list, replacer_function, + space) + return None # undefined + + +def jo(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise value.MakeError('TypeError', + 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + if not property_list.is_undefined(): + k = property_list + else: + k = [e.value for e in value] + partial = [] + for p in k: + str_p = value.Js( + Str(p, value, replacer_function, property_list, gap, stack, space)) + if not str_p.is_undefined(): + member = json.dumps(p) + ':' + ( + ' ' if gap else + '') + str_p.value # todo not sure here - what space character? + partial.append(member) + if not partial: + final = '{}' + else: + if not gap: + final = '{%s}' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '{\n' + indent + properties + '\n' + stepback + '}' + stack.remove(value) + indent = stepback + return final + + +def ja(value, stack, gap, property_list, replacer_function, space): + global indent + if value in stack: + raise value.MakeError('TypeError', + 'Converting circular structure to JSON') + stack.add(value) + stepback = indent + indent += gap + partial = [] + length = len(value) + for index in xrange(length): + index = str(index) + str_index = value.Js( + Str(index, value, replacer_function, property_list, gap, stack, + space)) + if str_index.is_undefined(): + partial.append('null') + else: + partial.append(str_index.value) + if not partial: + final = '[]' + else: + if not gap: + final = '[%s]' % ','.join(partial) + else: + sep = ',\n' + indent + properties = sep.join(partial) + final = '[\n' + indent + properties + '\n' + stepback + ']' + stack.remove(value) + indent = stepback + return final + + +def Quote(string): + return string.Js(json.dumps(string.value)) + + +def to_js(this, d): + if isinstance(d, dict): + return this.Js(dict((k, this.Js(v)) for k, v in six.iteritems(d))) + return this.Js(d) + + +def walk(holder, name, reviver): + val = holder.get(name) + if val.Class == 'Array': + for i in xrange(len(val)): + i = unicode(i) + new_element = walk(val, i, reviver) + if new_element.is_undefined(): + val.delete(i) + else: + new_element.put(i, new_element) + elif val.is_object(): + for key in val: + new_element = walk(val, key, reviver) + if new_element.is_undefined(): + val.delete(key) + else: + val.put(key, new_element) + return reviver.call(holder, (name, val)) + + +JSON = Js({}) + +JSON.define_own_property( + 'parse', { + 'value': Js(parse), + 'enumerable': False, + 'writable': True, + 'configurable': True + }) + +JSON.define_own_property( + 'stringify', { + 'value': Js(stringify), + 'enumerable': False, + 'writable': True, + 'configurable': True + }) diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsnumber.py b/Contents/Libraries/Shared/js2py/prototypes/jsnumber.py new file mode 100644 index 000000000..c9905ab01 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsnumber.py @@ -0,0 +1,146 @@ +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +RADIX_SYMBOLS = { + 0: '0', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: 'a', + 11: 'b', + 12: 'c', + 13: 'd', + 14: 'e', + 15: 'f', + 16: 'g', + 17: 'h', + 18: 'i', + 19: 'j', + 20: 'k', + 21: 'l', + 22: 'm', + 23: 'n', + 24: 'o', + 25: 'p', + 26: 'q', + 27: 'r', + 28: 's', + 29: 't', + 30: 'u', + 31: 'v', + 32: 'w', + 33: 'x', + 34: 'y', + 35: 'z' +} + + +def to_str_rep(num): + if num.is_nan(): + return num.Js('NaN') + elif num.is_infinity(): + sign = '-' if num.value < 0 else '' + return num.Js(sign + 'Infinity') + elif isinstance(num.value, + (long, int)) or num.value.is_integer(): # dont print .0 + return num.Js(unicode(int(num.value))) + return num.Js(unicode(num.value)) # accurate enough + + +class NumberPrototype: + def toString(radix): + if this.Class != 'Number': + raise this.MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + if radix.is_undefined(): + return to_str_rep(this) + r = radix.to_int() + if r == 10: + return to_str_rep(this) + if r not in xrange(2, 37): + raise this.MakeError( + 'RangeError', + 'Number.prototype.toString() radix argument must be between 2 and 36' + ) + num = this.to_int() + if num < 0: + num = -num + sign = '-' + else: + sign = '' + res = '' + while num: + s = RADIX_SYMBOLS[num % r] + num = num // r + res = s + res + return sign + (res if res else '0') + + def valueOf(): + if this.Class != 'Number': + raise this.MakeError('TypeError', + 'Number.prototype.valueOf is not generic') + return this.value + + def toLocaleString(): + return this.to_string() + + def toFixed(fractionDigits): + if this.Class != 'Number': + raise this.MakeError( + 'TypeError', + 'Number.prototype.toFixed called on incompatible receiver') + digs = fractionDigits.to_int() + if digs < 0 or digs > 20: + raise this.MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif this.is_infinity(): + return 'Infinity' if this.value > 0 else '-Infinity' + elif this.is_nan(): + return 'NaN' + return format(this.value, '-.%df' % digs) + + def toExponential(fractionDigits): + if this.Class != 'Number': + raise this.MakeError( + 'TypeError', + 'Number.prototype.toExponential called on incompatible receiver' + ) + digs = fractionDigits.to_int() + if digs < 0 or digs > 20: + raise this.MakeError( + 'RangeError', + 'toFixed() digits argument must be between 0 and 20') + elif this.is_infinity(): + return 'Infinity' if this.value > 0 else '-Infinity' + elif this.is_nan(): + return 'NaN' + return format(this.value, '-.%de' % digs) + + def toPrecision(precision): + if this.Class != 'Number': + raise this.MakeError( + 'TypeError', + 'Number.prototype.toPrecision called on incompatible receiver') + if precision.is_undefined(): + return this.to_string() + prec = precision.to_int() + if this.is_nan(): + return 'NaN' + elif this.is_infinity(): + return 'Infinity' if this.value > 0 else '-Infinity' + digs = prec - len(str(int(this.value))) + if digs >= 0: + return format(this.value, '-.%df' % digs) + else: + return format(this.value, '-.%df' % (prec - 1)) diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsobject.py b/Contents/Libraries/Shared/js2py/prototypes/jsobject.py new file mode 100644 index 000000000..aeefe5d37 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsobject.py @@ -0,0 +1,28 @@ +class ObjectPrototype: + def toString(): + return '[object %s]' % this.Class + + def valueOf(): + return this.to_object() + + def toLocaleString(): + return this.callprop('toString') + + def hasOwnProperty(prop): + return this.get_own_property(prop.to_string().value) is not None + + def isPrototypeOf(obj): + #a bit stupid specification but well + # for example Object.prototype.isPrototypeOf.call((5).__proto__, 5) gives false + if not obj.is_object(): + return False + while 1: + obj = obj.prototype + if obj is None or obj.is_null(): + return False + if obj is this: + return True + + def propertyIsEnumerable(prop): + cand = this.own.get(prop.to_string().value) + return cand is not None and cand.get('enumerable') diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsregexp.py b/Contents/Libraries/Shared/js2py/prototypes/jsregexp.py new file mode 100644 index 000000000..b23f2003b --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsregexp.py @@ -0,0 +1,45 @@ +class RegExpPrototype: + def toString(): + flags = u'' + try: + if this.glob: + flags += u'g' + if this.ignore_case: + flags += u'i' + if this.multiline: + flags += u'm' + except: + pass + v = this.value if this.value else '(?:)' + return u'/%s/' % v + flags + + def test(string): + return Exec(this, string) is not this.null + + def exec2(string + ): # will be changed to exec in base.py. cant name it exec here + return Exec(this, string) + + +def Exec(this, string): + if this.Class != 'RegExp': + raise this.MakeError('TypeError', + 'RegExp.prototype.exec is not generic!') + string = string.to_string() + length = len(string) + i = this.get('lastIndex').to_int() if this.glob else 0 + matched = False + while not matched: + if i < 0 or i > length: + this.put('lastIndex', this.Js(0)) + return this.null + matched = this.match(string.value, i) + i += 1 + start, end = matched.span() #[0]+i-1, matched.span()[1]+i-1 + if this.glob: + this.put('lastIndex', this.Js(end)) + arr = this.Js( + [this.Js(e) for e in [matched.group()] + list(matched.groups())]) + arr.put('index', this.Js(start)) + arr.put('input', string) + return arr diff --git a/Contents/Libraries/Shared/js2py/prototypes/jsstring.py b/Contents/Libraries/Shared/js2py/prototypes/jsstring.py new file mode 100644 index 000000000..ee3207094 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jsstring.py @@ -0,0 +1,306 @@ +# -*- coding: utf-8 -*- +from .jsregexp import Exec +import re +DIGS = set('0123456789') +WHITE = u"\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF" + + +def replacement_template(rep, source, span, npar): + """Takes the replacement template and some info about the match and returns filled template + """ + n = 0 + res = '' + while n < len(rep) - 1: + char = rep[n] + if char == '$': + if rep[n + 1] == '$': + res += '$' + n += 2 + continue + elif rep[n + 1] == '`': + # replace with string that is BEFORE match + res += source[:span[0]] + n += 2 + continue + elif rep[n + 1] == '\'': + # replace with string that is AFTER match + res += source[span[1]:] + n += 2 + continue + elif rep[n + 1] in DIGS: + dig = rep[n + 1] + if n + 2 < len(rep) and rep[n + 2] in DIGS: + dig += rep[n + 2] + num = int(dig) + # we will not do any replacements if we dont have this npar or dig is 0 + if not num or num > len(npar): + res += '$' + dig + else: + # None - undefined has to be replaced with '' + res += npar[num - 1] if npar[num - 1] else '' + n += 1 + len(dig) + continue + res += char + n += 1 + if n < len(rep): + res += rep[-1] + return res + + +################################################### + + +class StringPrototype: + def toString(): + if this.Class != 'String': + raise this.MakeError('TypeError', + 'String.prototype.toString is not generic') + return this.value + + def valueOf(): + if this.Class != 'String': + raise this.MakeError('TypeError', + 'String.prototype.valueOf is not generic') + return this.value + + def charAt(pos): + this.cok() + pos = pos.to_int() + s = this.to_string() + if 0 <= pos < len(s.value): + char = s.value[pos] + if char not in s.CHAR_BANK: + s.Js(char) # add char to char bank + return s.CHAR_BANK[char] + return s.CHAR_BANK[''] + + def charCodeAt(pos): + this.cok() + pos = pos.to_int() + s = this.to_string() + if 0 <= pos < len(s.value): + return s.Js(ord(s.value[pos])) + return s.NaN + + def concat(): + this.cok() + s = this.to_string() + res = s.value + for e in arguments.to_list(): + res += e.to_string().value + return res + + def indexOf(searchString, position): + this.cok() + s = this.to_string().value + search = searchString.to_string().value + pos = position.to_int() + return this.Js(s.find(search, min(max(pos, 0), len(s)))) + + def lastIndexOf(searchString, position): + this.cok() + s = this.to_string().value + search = searchString.to_string().value + pos = position.to_number() + pos = 10**15 if pos.is_nan() else pos.to_int() + return s.rfind(search, 0, min(max(pos, 0) + 1, len(s))) + + def localeCompare(that): + this.cok() + s = this.to_string() + that = that.to_string() + if s < that: + return this.Js(-1) + elif s > that: + return this.Js(1) + return this.Js(0) + + def match(regexp): + this.cok() + s = this.to_string() + r = this.RegExp(regexp) if regexp.Class != 'RegExp' else regexp + if not r.glob: + return Exec(r, s) + r.put('lastIndex', this.Js(0)) + found = [] + previous_last_index = 0 + last_match = True + while last_match: + result = Exec(r, s) + if result.is_null(): + last_match = False + else: + this_index = r.get('lastIndex').value + if this_index == previous_last_index: + r.put('lastIndex', this.Js(this_index + 1)) + previous_last_index += 1 + else: + previous_last_index = this_index + matchStr = result.get('0') + found.append(matchStr) + if not found: + return this.null + return found + + def replace(searchValue, replaceValue): + # VERY COMPLICATED. to check again. + this.cok() + string = this.to_string() + s = string.value + res = '' + if not replaceValue.is_callable(): + replaceValue = replaceValue.to_string().value + func = False + else: + func = True + # Replace all ( global ) + if searchValue.Class == 'RegExp' and searchValue.glob: + last = 0 + for e in re.finditer(searchValue.pat, s): + res += s[last:e.span()[0]] + if func: + # prepare arguments for custom func (replaceValue) + args = (e.group(), ) + e.groups() + (e.span()[1], string) + # convert all types to JS + args = map(this.Js, args) + res += replaceValue(*args).to_string().value + else: + res += replacement_template(replaceValue, s, e.span(), + e.groups()) + last = e.span()[1] + res += s[last:] + return this.Js(res) + elif searchValue.Class == 'RegExp': + e = re.search(searchValue.pat, s) + if e is None: + return string + span = e.span() + pars = e.groups() + match = e.group() + else: + match = searchValue.to_string().value + ind = s.find(match) + if ind == -1: + return string + span = ind, ind + len(match) + pars = () + res = s[:span[0]] + if func: + args = (match, ) + pars + (span[1], string) + # convert all types to JS + this_ = this + args = tuple([this_.Js(x) for x in args]) + res += replaceValue(*args).to_string().value + else: + res += replacement_template(replaceValue, s, span, pars) + res += s[span[1]:] + return res + + def search(regexp): + this.cok() + string = this.to_string() + if regexp.Class == 'RegExp': + rx = regexp + else: + rx = this.RegExp(regexp) + res = re.search(rx.pat, string.value) + if res is not None: + return this.Js(res.span()[0]) + return -1 + + def slice(start, end): + this.cok() + s = this.to_string() + start = start.to_int() + length = len(s.value) + end = length if end.is_undefined() else end.to_int() + #From = max(length+start, 0) if start<0 else min(length, start) + #To = max(length+end, 0) if end<0 else min(length, end) + return s.value[start:end] + + def split(separator, limit): + # its a bit different that re.split! + this.cok() + S = this.to_string() + s = S.value + lim = 2**32 - 1 if limit.is_undefined() else limit.to_uint32() + if not lim: + return [] + if separator.is_undefined(): + return [s] + len_s = len(s) + res = [] + R = separator if separator.Class == 'RegExp' else separator.to_string() + if not len_s: + if SplitMatch(s, 0, R) is None: + return [S] + return [] + p = q = 0 + while q != len_s: + e, cap = SplitMatch(s, q, R) + if e is None or e == p: + q += 1 + continue + res.append(s[p:q]) + p = q = e + if len(res) == lim: + return res + for element in cap: + res.append(this.Js(element)) + if len(res) == lim: + return res + res.append(s[p:]) + return res + + def substring(start, end): + this.cok() + s = this.to_string().value + start = start.to_int() + length = len(s) + end = length if end.is_undefined() else end.to_int() + fstart = min(max(start, 0), length) + fend = min(max(end, 0), length) + return this.Js(s[min(fstart, fend):max(fstart, fend)]) + + def substr(start, length): + #I hate this function and its description in specification + r1 = this.to_string().value + r2 = start.to_int() + r3 = 10**20 if length.is_undefined() else length.to_int() + r4 = len(r1) + r5 = r2 if r2 >= 0 else max(0, r2 + r4) + r6 = min(max(r3, 0), r4 - r5) + if r6 <= 0: + return '' + return r1[r5:r5 + r6] + + def toLowerCase(): + this.cok() + return this.Js(this.to_string().value.lower()) + + def toLocaleLowerCase(): + this.cok() + return this.Js(this.to_string().value.lower()) + + def toUpperCase(): + this.cok() + return this.Js(this.to_string().value.upper()) + + def toLocaleUpperCase(): + this.cok() + return this.Js(this.to_string().value.upper()) + + def trim(): + this.cok() + return this.Js(this.to_string().value.strip(WHITE)) + + +def SplitMatch(s, q, R): + # s is Py String to match, q is the py int match start and R is Js RegExp or String. + if R.Class == 'RegExp': + res = R.match(s, q) + return (None, ()) if res is None else (res.span()[1], res.groups()) + # R is just a string + if s[q:].startswith(R.value): + return q + len(R.value), () + return None, () diff --git a/Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py b/Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py new file mode 100644 index 000000000..43285aaef --- /dev/null +++ b/Contents/Libraries/Shared/js2py/prototypes/jstypedarray.py @@ -0,0 +1,344 @@ +# this is based on jsarray.py + +import six +try: + import numpy +except: + pass + +if six.PY3: + xrange = range + import functools + + +def to_arr(this): + """Returns Python array from Js array""" + return [this.get(str(e)) for e in xrange(len(this))] + + +ARR_STACK = set({}) + + +class TypedArrayPrototype: + def toString(): + # this function is wrong + func = this.get('join') + if not func.is_callable(): + + @this.Js + def func(): + return '[object %s]' % this.Class + + return func.call(this, ()) + + def toLocaleString(locales=None, options=None): + array = this.to_object() + arr_len = array.get("length").to_uint32() + # separator is simply a comma ',' + if not arr_len: + return '' + res = [] + for i in xrange(arr_len): + element = array[str(i)] + if element.is_undefined() or element.is_null(): + res.append('') + else: + cand = element.to_object() + str_func = element.get('toLocaleString') + if not str_func.is_callable(): + raise this.MakeError( + 'TypeError', + 'toLocaleString method of item at index %d is not callable' + % i) + res.append(element.callprop('toLocaleString').value) + return ','.join(res) + + def join(separator): + ARR_STACK.add(this) + array = this.to_object() + arr_len = array.get("length").to_uint32() + separator = ',' if separator.is_undefined() else separator.to_string( + ).value + elems = [] + for e in xrange(arr_len): + elem = array.get(str(e)) + if elem in ARR_STACK: + s = '' + else: + s = elem.to_string().value + elems.append( + s if not (elem.is_undefined() or elem.is_null()) else '') + res = separator.join(elems) + ARR_STACK.remove(this) + return res + + def reverse(): + array = this.to_object() # my own algorithm + vals = to_arr(array) + has_props = [array.has_property(str(e)) for e in xrange(len(array))] + vals.reverse() + has_props.reverse() + for i, val in enumerate(vals): + if has_props[i]: + array.put(str(i), val) + else: + array.delete(str(i)) + return array + + def slice(start, end): # todo check + array = this.to_object() + arr_len = array.get("length").to_uint32() + relative_start = start.to_int() + k = max((arr_len + relative_start), 0) if relative_start < 0 else min( + relative_start, arr_len) + relative_end = arr_len if end.is_undefined() else end.to_int() + final = max((arr_len + relative_end), 0) if relative_end < 0 else min( + relative_end, arr_len) + res = [] + n = 0 + while k < final: + pk = str(k) + if array.has_property(pk): + res.append(array.get(pk)) + k += 1 + n += 1 + return res + + def sort(cmpfn): + if not this.Class in ('Array', 'Arguments'): + return this.to_object() # do nothing + arr = [] + for i in xrange(len(this)): + arr.append(this.get(six.text_type(i))) + + if not arr: + return this + if not cmpfn.is_callable(): + cmpfn = None + cmp = lambda a, b: sort_compare(a, b, cmpfn) + if six.PY3: + key = functools.cmp_to_key(cmp) + arr.sort(key=key) + else: + arr.sort(cmp=cmp) + for i in xrange(len(arr)): + this.put(six.text_type(i), arr[i]) + + return this + + def indexOf(searchElement): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = 0 + if n >= arr_len: + return -1 + if n >= 0: + k = n + else: + k = arr_len - abs(n) + if k < 0: + k = 0 + while k < arr_len: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k += 1 + return -1 + + def lastIndexOf(searchElement): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if arr_len == 0: + return -1 + if len(arguments) > 1: + n = arguments[1].to_int() + else: + n = arr_len - 1 + if n >= 0: + k = min(n, arr_len - 1) + else: + k = arr_len - abs(n) + while k >= 0: + if array.has_property(str(k)): + elementK = array.get(str(k)) + if searchElement.strict_equality_comparison(elementK): + return k + k -= 1 + return -1 + + def every(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if not callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return False + k += 1 + return True + + def some(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + return True + k += 1 + return False + + def forEach(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + callbackfn.call(T, (kValue, this.Js(k), array)) + k += 1 + + def map(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + A = this.Js([]) + k = 0 + while k < arr_len: + Pk = str(k) + if array.has_property(Pk): + kValue = array.get(Pk) + mappedValue = callbackfn.call(T, (kValue, this.Js(k), array)) + A.define_own_property( + Pk, { + 'value': mappedValue, + 'writable': True, + 'enumerable': True, + 'configurable': True + }) + k += 1 + return A + + def filter(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + T = arguments[1] + res = [] + k = 0 + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + if callbackfn.call( + T, (kValue, this.Js(k), array)).to_boolean().value: + res.append(kValue) + k += 1 + return res # converted to js array automatically + + def reduce(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = 0 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k < arr_len: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k += 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k < arr_len: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k += 1 + return accumulator + + def reduceRight(callbackfn): + array = this.to_object() + arr_len = array.get("length").to_uint32() + if not callbackfn.is_callable(): + raise this.MakeError('TypeError', 'callbackfn must be a function') + if not arr_len and len(arguments) < 2: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + k = arr_len - 1 + if len(arguments) > 1: # initial value present + accumulator = arguments[1] + else: + kPresent = False + while not kPresent and k >= 0: + kPresent = array.has_property(str(k)) + if kPresent: + accumulator = array.get(str(k)) + k -= 1 + if not kPresent: + raise this.MakeError( + 'TypeError', 'Reduce of empty array with no initial value') + while k >= 0: + if array.has_property(str(k)): + kValue = array.get(str(k)) + accumulator = callbackfn.call( + this.undefined, (accumulator, kValue, this.Js(k), array)) + k -= 1 + return accumulator + + +def sort_compare(a, b, comp): + if a is None: + if b is None: + return 0 + return 1 + if b is None: + if a is None: + return 0 + return -1 + if a.is_undefined(): + if b.is_undefined(): + return 0 + return 1 + if b.is_undefined(): + if a.is_undefined(): + return 0 + return -1 + if comp is not None: + res = comp.call(a.undefined, (a, b)) + return res.to_int() + x, y = a.to_string(), b.to_string() + if x < y: + return -1 + elif x > y: + return 1 + return 0 diff --git a/Contents/Libraries/Shared/js2py/py_node_modules/__init__.py b/Contents/Libraries/Shared/js2py/py_node_modules/__init__.py new file mode 100644 index 000000000..03b730262 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/py_node_modules/__init__.py @@ -0,0 +1 @@ +"""this package contains all the npm modules translated by js2py via node import""" \ No newline at end of file diff --git a/Contents/Libraries/Shared/js2py/pyjs.py b/Contents/Libraries/Shared/js2py/pyjs.py new file mode 100644 index 000000000..98e106a00 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/pyjs.py @@ -0,0 +1,100 @@ +from .base import * +from .constructors.jsmath import Math +from .constructors.jsdate import Date +from .constructors.jsobject import Object +from .constructors.jsfunction import Function +from .constructors.jsstring import String +from .constructors.jsnumber import Number +from .constructors.jsboolean import Boolean +from .constructors.jsregexp import RegExp +from .constructors.jsarray import Array +from .constructors.jsarraybuffer import ArrayBuffer +from .constructors.jsint8array import Int8Array +from .constructors.jsuint8array import Uint8Array +from .constructors.jsuint8clampedarray import Uint8ClampedArray +from .constructors.jsint16array import Int16Array +from .constructors.jsuint16array import Uint16Array +from .constructors.jsint32array import Int32Array +from .constructors.jsuint32array import Uint32Array +from .constructors.jsfloat32array import Float32Array +from .constructors.jsfloat64array import Float64Array +from .prototypes.jsjson import JSON +from .host.console import console +from .host.jseval import Eval +from .host.jsfunctions import parseFloat, parseInt, isFinite, \ + isNaN, escape, unescape, encodeURI, decodeURI, encodeURIComponent, decodeURIComponent + +# Now we have all the necessary items to create global environment for script +__all__ = [ + 'Js', 'PyJsComma', 'PyJsStrictEq', 'PyJsStrictNeq', 'PyJsException', + 'PyJsBshift', 'Scope', 'PyExceptionToJs', 'JsToPyException', 'JS_BUILTINS', + 'appengine', 'set_global_object', 'JsRegExp', 'PyJsException', + 'PyExceptionToJs', 'JsToPyException', 'PyJsSwitchException' +] + +# these were defined in base.py +builtins = ( + 'true', + 'false', + 'null', + 'undefined', + 'Infinity', + 'NaN', + 'console', + 'String', + 'Number', + 'Boolean', + 'RegExp', + 'Math', + 'Date', + 'Object', + 'Function', + 'Array', + 'Int8Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'Int16Array', + 'Uint16Array', + 'Int32Array', + 'Uint32Array', + 'Float32Array', + 'Float64Array', + 'ArrayBuffer', + 'parseFloat', + 'parseInt', + 'isFinite', + 'isNaN', + 'escape', + 'unescape', + 'encodeURI', + 'decodeURI', + 'encodeURIComponent', + 'decodeURIComponent', +) + +#Array, Function, JSON, Error is done later :) +# also some built in functions like eval... + + +def set_global_object(obj): + obj.IS_CHILD_SCOPE = False + this = This({}) + this.own = obj.own + this.prototype = obj.prototype + PyJs.GlobalObject = this + # make this available + obj.register('this') + obj.put('this', this) + # also add window and set it to be a global object for compatibility + obj.register('window') + obj.put('window', this) + + +scope = dict(zip(builtins, [globals()[e] for e in builtins])) +# Now add errors: +for name, error in ERRORS.items(): + scope[name] = error +#add eval +scope['eval'] = Eval +scope['JSON'] = JSON +JS_BUILTINS = dict((k, v) for k, v in scope.items()) diff --git a/Contents/Libraries/Shared/js2py/test_internals.py b/Contents/Libraries/Shared/js2py/test_internals.py new file mode 100644 index 000000000..12cf4ad7a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/test_internals.py @@ -0,0 +1,9 @@ +from internals import byte_trans +from internals import seval +import pyjsparser + +x = r''' +function g() {var h123 = 11; return [function g1() {return h123}, new Function('return h123')]} +g()[1]() +''' +print seval.eval_js_vm(x) diff --git a/Contents/Libraries/Shared/js2py/translators/__init__.py b/Contents/Libraries/Shared/js2py/translators/__init__.py new file mode 100644 index 000000000..7a1001fd1 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/__init__.py @@ -0,0 +1,38 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# 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 + +__all__ = [ + 'PyJsParser', 'Node', 'WrappingNode', 'node_to_dict', 'parse', + 'translate_js', 'translate', 'syntax_tree_translate', 'DEFAULT_HEADER' +] +__author__ = 'Piotr Dabkowski' +__version__ = '2.2.0' +from pyjsparser import PyJsParser +from .translator import translate_js, trasnlate, syntax_tree_translate, DEFAULT_HEADER + + +def parse(javascript_code): + """Returns syntax tree of javascript_code. + + Syntax tree has the same structure as syntax tree produced by esprima.js + + Same as PyJsParser().parse For your convenience :) """ + p = PyJsParser() + return p.parse(javascript_code) diff --git a/Contents/Libraries/Shared/js2py/translators/friendly_nodes.py b/Contents/Libraries/Shared/js2py/translators/friendly_nodes.py new file mode 100644 index 000000000..370f85d8a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/friendly_nodes.py @@ -0,0 +1,375 @@ +import binascii + +from pyjsparser import PyJsParser +import six +if six.PY3: + basestring = str + long = int + xrange = range + unicode = str + +REGEXP_CONVERTER = PyJsParser() + + +def to_hex(s): + return binascii.hexlify(s.encode('utf8')).decode( + 'utf8') # fucking python 3, I hate it so much + + + # wtf was wrong with s.encode('hex') ??? +def indent(lines, ind=4): + return ind * ' ' + lines.replace('\n', '\n' + ind * ' ').rstrip(' ') + + +def inject_before_lval(source, lval, code): + if source.count(lval) > 1: + print() + print(lval) + raise RuntimeError('To many lvals (%s)' % lval) + elif not source.count(lval): + print() + print(lval) + assert lval not in source + raise RuntimeError('No lval found "%s"' % lval) + end = source.index(lval) + inj = source.rfind('\n', 0, end) + ind = inj + while source[ind + 1] == ' ': + ind += 1 + ind -= inj + return source[:inj + 1] + indent(code, ind) + source[inj + 1:] + + +def get_continue_label(label): + return CONTINUE_LABEL % to_hex(label) + + +def get_break_label(label): + return BREAK_LABEL % to_hex(label) + + +def is_valid_py_name(name): + try: + compile(name + ' = 11', 'a', 'exec') + except: + return False + return True + + +def indent(lines, ind=4): + return ind * ' ' + lines.replace('\n', '\n' + ind * ' ').rstrip(' ') + + +def compose_regex(val): + reg, flags = val + #reg = REGEXP_CONVERTER._unescape_string(reg) + return u'/%s/%s' % (reg, flags) + + +def float_repr(f): + if int(f) == f: + return repr(int(f)) + return repr(f) + + +def argsplit(args, sep=','): + """used to split JS args (it is not that simple as it seems because + sep can be inside brackets). + + pass args *without* brackets! + + Used also to parse array and object elements, and more""" + parsed_len = 0 + last = 0 + splits = [] + for e in bracket_split(args, brackets=['()', '[]', '{}']): + if e[0] not in ('(', '[', '{'): + for i, char in enumerate(e): + if char == sep: + splits.append(args[last:parsed_len + i]) + last = parsed_len + i + 1 + parsed_len += len(e) + splits.append(args[last:]) + return splits + + +def bracket_split(source, brackets=('()', '{}', '[]'), strip=False): + """DOES NOT RETURN EMPTY STRINGS (can only return empty bracket content if strip=True)""" + starts = [e[0] for e in brackets] + in_bracket = 0 + n = 0 + last = 0 + while n < len(source): + e = source[n] + if not in_bracket and e in starts: + in_bracket = 1 + start = n + b_start, b_end = brackets[starts.index(e)] + elif in_bracket: + if e == b_start: + in_bracket += 1 + elif e == b_end: + in_bracket -= 1 + if not in_bracket: + if source[last:start]: + yield source[last:start] + last = n + 1 + yield source[start + strip:n + 1 - strip] + n += 1 + if source[last:]: + yield source[last:] + + +def js_comma(a, b): + return 'PyJsComma(' + a + ',' + b + ')' + + +def js_or(a, b): + return '(' + a + ' or ' + b + ')' + + +def js_bor(a, b): + return '(' + a + '|' + b + ')' + + +def js_bxor(a, b): + return '(' + a + '^' + b + ')' + + +def js_band(a, b): + return '(' + a + '&' + b + ')' + + +def js_and(a, b): + return '(' + a + ' and ' + b + ')' + + +def js_strict_eq(a, b): + return 'PyJsStrictEq(' + a + ',' + b + ')' + + +def js_strict_neq(a, b): + return 'PyJsStrictNeq(' + a + ',' + b + ')' + + +#Not handled by python in the same way like JS. For example 2==2==True returns false. +# In JS above would return true so we need brackets. +def js_abstract_eq(a, b): + return '(' + a + '==' + b + ')' + + +#just like == +def js_abstract_neq(a, b): + return '(' + a + '!=' + b + ')' + + +def js_lt(a, b): + return '(' + a + '<' + b + ')' + + +def js_le(a, b): + return '(' + a + '<=' + b + ')' + + +def js_ge(a, b): + return '(' + a + '>=' + b + ')' + + +def js_gt(a, b): + return '(' + a + '>' + b + ')' + + +def js_in(a, b): + return b + '.contains(' + a + ')' + + +def js_instanceof(a, b): + return a + '.instanceof(' + b + ')' + + +def js_lshift(a, b): + return '(' + a + '<<' + b + ')' + + +def js_rshift(a, b): + return '(' + a + '>>' + b + ')' + + +def js_shit(a, b): + return 'PyJsBshift(' + a + ',' + b + ')' + + +def js_add( + a, + b): # To simplify later process of converting unary operators + and ++ + return '(%s+%s)' % (a, b) + + +def js_sub(a, b): # To simplify + return '(%s-%s)' % (a, b) + + +def js_mul(a, b): + return '(' + a + '*' + b + ')' + + +def js_div(a, b): + return '(' + a + '/' + b + ')' + + +def js_mod(a, b): + return '(' + a + '%' + b + ')' + + +def js_typeof(a): + cand = list(bracket_split(a, ('()', ))) + if len(cand) == 2 and cand[0] == 'var.get': + return cand[0] + cand[1][:-1] + ',throw=False).typeof()' + return a + '.typeof()' + + +def js_void(a): + # eval and return undefined + return 'PyJsComma(%s, Js(None))' % a + + +def js_new(a): + cands = list(bracket_split(a, ('()', ))) + lim = len(cands) + if lim < 2: + return a + '.create()' + n = 0 + while n < lim: + c = cands[n] + if c[0] == '(': + if cands[n - 1].endswith( + '.get') and n + 1 >= lim: # last get operation. + return a + '.create()' + elif cands[n - 1][0] == '(': + return ''.join(cands[:n]) + '.create' + c + ''.join( + cands[n + 1:]) + elif cands[n - 1] == '.callprop': + beg = ''.join(cands[:n - 1]) + args = argsplit(c[1:-1], ',') + prop = args[0] + new_args = ','.join(args[1:]) + create = '.get(%s).create(%s)' % (prop, new_args) + return beg + create + ''.join(cands[n + 1:]) + n += 1 + return a + '.create()' + + +def js_delete(a): + #replace last get with delete. + c = list(bracket_split(a, ['()'])) + beg, arglist = ''.join(c[:-1]).strip(), c[-1].strip( + ) #strips just to make sure... I will remove it later + if beg[-4:] != '.get': + print(a) + raise SyntaxError('Invalid delete operation') + return beg[:-3] + 'delete' + arglist + + +def js_neg(a): + return '(-' + a + ')' + + +def js_pos(a): + return '(+' + a + ')' + + +def js_inv(a): + return '(~' + a + ')' + + +def js_not(a): + return a + '.neg()' + + +def js_postfix(a, inc, post): + bra = list(bracket_split(a, ('()', ))) + meth = bra[-2] + if not meth.endswith('get'): + raise SyntaxError('Invalid ++ or -- operation.') + bra[-2] = bra[-2][:-3] + 'put' + bra[-1] = '(%s,Js(%s.to_number())%sJs(1))' % (bra[-1][1:-1], a, + '+' if inc else '-') + res = ''.join(bra) + return res if not post else '(%s%sJs(1))' % (res, '-' if inc else '+') + + +def js_pre_inc(a): + return js_postfix(a, True, False) + + +def js_post_inc(a): + return js_postfix(a, True, True) + + +def js_pre_dec(a): + return js_postfix(a, False, False) + + +def js_post_dec(a): + return js_postfix(a, False, True) + + +CONTINUE_LABEL = 'JS_CONTINUE_LABEL_%s' +BREAK_LABEL = 'JS_BREAK_LABEL_%s' +PREPARE = '''HOLDER = var.own.get(NAME)\nvar.force_own_put(NAME, PyExceptionToJs(PyJsTempException))\n''' +RESTORE = '''if HOLDER is not None:\n var.own[NAME] = HOLDER\nelse:\n del var.own[NAME]\ndel HOLDER\n''' +TRY_CATCH = '''%stry:\nBLOCKfinally:\n%s''' % (PREPARE, indent(RESTORE)) + +OR = {'||': js_or} +AND = {'&&': js_and} +BOR = {'|': js_bor} +BXOR = {'^': js_bxor} +BAND = {'&': js_band} + +EQS = { + '===': js_strict_eq, + '!==': js_strict_neq, + '==': js_abstract_eq, # we need == and != too. Read a note above method + '!=': js_abstract_neq +} + +#Since JS does not have chained comparisons we need to implement all cmp methods. +COMPS = { + '<': js_lt, + '<=': js_le, + '>=': js_ge, + '>': js_gt, + 'instanceof': js_instanceof, #todo change to validitate + 'in': js_in +} + +BSHIFTS = {'<<': js_lshift, '>>': js_rshift, '>>>': js_shit} + +ADDS = {'+': js_add, '-': js_sub} + +MULTS = {'*': js_mul, '/': js_div, '%': js_mod} +BINARY = {} +BINARY.update(ADDS) +BINARY.update(MULTS) +BINARY.update(BSHIFTS) +BINARY.update(COMPS) +BINARY.update(EQS) +BINARY.update(BAND) +BINARY.update(BXOR) +BINARY.update(BOR) +BINARY.update(AND) +BINARY.update(OR) +#Note they dont contain ++ and -- methods because they both have 2 different methods +# correct method will be found automatically in translate function +UNARY = { + 'typeof': js_typeof, + 'void': js_void, + 'new': js_new, + 'delete': js_delete, + '!': js_not, + '-': js_neg, + '+': js_pos, + '~': js_inv, + '++': None, + '--': None +} diff --git a/Contents/Libraries/Shared/js2py/translators/jsregexps.py b/Contents/Libraries/Shared/js2py/translators/jsregexps.py new file mode 100644 index 000000000..235d67c78 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/jsregexps.py @@ -0,0 +1,211 @@ +from pyjsparser.pyjsparserdata import * + +REGEXP_SPECIAL_SINGLE = {'\\', '^', '$', '*', '+', '?', '.'} + +NOT_PATTERN_CHARS = { + '^', '$', '\\', '.', '*', '+', '?', '(', ')', '[', ']', '|' +} # what about '{', '}', ??? + +CHAR_CLASS_ESCAPE = {'d', 'D', 's', 'S', 'w', 'W'} +CONTROL_ESCAPE_CHARS = {'f', 'n', 'r', 't', 'v'} +CONTROL_LETTERS = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', + 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +} + + +def SpecialChar(char): + return {'type': 'SpecialChar', 'content': char} + + +def isPatternCharacter(char): + return char not in NOT_PATTERN_CHARS + + +class JsRegExpParser: + def __init__(self, source, flags): + self.source = source + self.flags = flags + self.index = 0 + self.length = len(source) + self.lineNumber = 0 + self.lineStart = 0 + + def parsePattern(self): + '''Perform sctring escape - for regexp literals''' + return {'type': 'Pattern', 'contents': self.parseDisjunction()} + + def parseDisjunction(self): + alternatives = [] + while True: + alternatives.append(self.parseAlternative()) + if not self.isEOF(): + self.expect_character('|') + else: + break + return {'type': 'Disjunction', 'contents': alternatives} + + def isEOF(self): + if self.index >= self.length: + return True + return False + + def expect_character(self, character): + if self.source[self.index] != character: + self.throwUnexpected(character) + self.index += 1 + + def parseAlternative(self): + contents = [] + while not self.isEOF() and self.source[self.index] != '|': + contents.append(self.parseTerm()) + return {'type': 'Alternative', 'contents': contents} + + def follows(self, chars): + for i, c in enumerate(chars): + if self.index + i >= self.length or self.source[self.index + + i] != c: + return False + return True + + def parseTerm(self): + assertion = self.parseAssertion() + if assertion: + return assertion + else: + return { + 'type': 'Term', + 'contents': self.parseAtom() + } # quantifier will go inside atom! + + def parseAssertion(self): + if self.follows('$'): + content = SpecialChar('$') + self.index += 1 + elif self.follows('^'): + content = SpecialChar('^') + self.index += 1 + elif self.follows('\\b'): + content = SpecialChar('\\b') + self.index += 2 + elif self.follows('\\B'): + content = SpecialChar('\\B') + self.index += 2 + elif self.follows('(?='): + self.index += 3 + dis = self.parseDisjunction() + self.expect_character(')') + content = {'type': 'Lookached', 'contents': dis, 'negated': False} + elif self.follows('(?!'): + self.index += 3 + dis = self.parseDisjunction() + self.expect_character(')') + content = {'type': 'Lookached', 'contents': dis, 'negated': True} + else: + return None + return {'type': 'Assertion', 'content': content} + + def parseAtom(self): + if self.follows('.'): + content = SpecialChar('.') + self.index += 1 + elif self.follows('\\'): + self.index += 1 + content = self.parseAtomEscape() + elif self.follows('['): + content = self.parseCharacterClass() + elif self.follows('(?:'): + self.index += 3 + dis = self.parseDisjunction() + self.expect_character(')') + content = 'idk' + elif self.follows('('): + self.index += 1 + dis = self.parseDisjunction() + self.expect_character(')') + content = 'idk' + elif isPatternCharacter(self.source[self.index]): + content = self.source[self.index] + self.index += 1 + else: + return None + quantifier = self.parseQuantifier() + return {'type': 'Atom', 'content': content, 'quantifier': quantifier} + + def parseQuantifier(self): + prefix = self.parseQuantifierPrefix() + if not prefix: + return None + greedy = True + if self.follows('?'): + self.index += 1 + greedy = False + return {'type': 'Quantifier', 'contents': prefix, 'greedy': greedy} + + def parseQuantifierPrefix(self): + if self.isEOF(): + return None + if self.follows('+'): + content = '+' + self.index += 1 + elif self.follows('?'): + content = '?' + self.index += 1 + elif self.follows('*'): + content = '*' + self.index += 1 + elif self.follows( + '{' + ): # try matching otherwise return None and restore the state + i = self.index + self.index += 1 + digs1 = self.scanDecimalDigs() + # if no minimal number of digs provided then return no quantifier + if not digs1: + self.index = i + return None + # scan char limit if provided + if self.follows(','): + self.index += 1 + digs2 = self.scanDecimalDigs() + else: + digs2 = '' + # must be valid! + if not self.follows('}'): + self.index = i + return None + else: + self.expect_character('}') + content = int(digs1), int(digs2) if digs2 else None + else: + return None + return content + + def parseAtomEscape(self): + ch = self.source[self.index] + if isDecimalDigit(ch) and ch != 0: + digs = self.scanDecimalDigs() + elif ch in CHAR_CLASS_ESCAPE: + self.index += 1 + return SpecialChar('\\' + ch) + else: + return self.parseCharacterEscape() + + def parseCharacterEscape(self): + ch = self.source[self.index] + if ch in CONTROL_ESCAPE_CHARS: + return SpecialChar('\\' + ch) + if ch == 'c': + 'ok, fuck this shit.' + + def scanDecimalDigs(self): + s = self.index + while not self.isEOF() and isDecimalDigit(self.source[self.index]): + self.index += 1 + return self.source[s:self.index] + + +a = JsRegExpParser('a(?=x)', '') +print(a.parsePattern()) diff --git a/Contents/Libraries/Shared/js2py/translators/translating_nodes.py b/Contents/Libraries/Shared/js2py/translators/translating_nodes.py new file mode 100644 index 000000000..0ae93dd9a --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/translating_nodes.py @@ -0,0 +1,688 @@ +from __future__ import unicode_literals +from pyjsparser.pyjsparserdata import * +from .friendly_nodes import * +import random +import six + +if six.PY3: + from functools import reduce + xrange = range + unicode = str +# number of characters above which expression will be split to multiple lines in order to avoid python parser stack overflow +# still experimental so I suggest to set it to 400 in order to avoid common errors +# set it to smaller value only if you have problems with parser stack overflow +LINE_LEN_LIMIT = 400 # 200 # or any other value - the larger the smaller probability of errors :) + + +class ForController: + def __init__(self): + self.inside = [False] + self.update = '' + + def enter_for(self, update): + self.inside.append(True) + self.update = update + + def leave_for(self): + self.inside.pop() + + def enter_other(self): + self.inside.append(False) + + def leave_other(self): + self.inside.pop() + + def is_inside(self): + return self.inside[-1] + + +class InlineStack: + NAME = 'PyJs_%s_%d_' + + def __init__(self): + self.reps = {} + self.names = [] + + def inject_inlines(self, source): + for lval in self.names: # first in first out! Its important by the way + source = inject_before_lval(source, lval, self.reps[lval]) + return source + + def require(self, typ): + name = self.NAME % (typ, len(self.names)) + self.names.append(name) + return name + + def define(self, name, val): + self.reps[name] = val + + def reset(self): + self.rel = {} + self.names = [] + + +class ContextStack: + def __init__(self): + self.to_register = set([]) + self.to_define = {} + + def reset(self): + self.to_register = set([]) + self.to_define = {} + + def register(self, var): + self.to_register.add(var) + + def define(self, name, code): + self.to_define[name] = code + self.register(name) + + def get_code(self): + code = 'var.registers([%s])\n' % ', '.join( + repr(e) for e in self.to_register) + for name, func_code in six.iteritems(self.to_define): + code += func_code + return code + + +def clean_stacks(): + global Context, inline_stack + Context = ContextStack() + inline_stack = InlineStack() + + +def to_key(literal_or_identifier): + ''' returns string representation of this object''' + if literal_or_identifier['type'] == 'Identifier': + return literal_or_identifier['name'] + elif literal_or_identifier['type'] == 'Literal': + k = literal_or_identifier['value'] + if isinstance(k, float): + return unicode(float_repr(k)) + elif 'regex' in literal_or_identifier: + return compose_regex(k) + elif isinstance(k, bool): + return 'true' if k else 'false' + elif k is None: + return 'null' + else: + return unicode(k) + + +def trans(ele, standard=False): + """Translates esprima syntax tree to python by delegating to appropriate translating node""" + try: + node = globals().get(ele['type']) + if not node: + raise NotImplementedError('%s is not supported!' % ele['type']) + if standard: + node = node.__dict__[ + 'standard'] if 'standard' in node.__dict__ else node + return node(**ele) + except: + #print ele + raise + + +def limited(func): + '''Decorator limiting resulting line length in order to avoid python parser stack overflow - + If expression longer than LINE_LEN_LIMIT characters then it will be moved to upper line + USE ONLY ON EXPRESSIONS!!! ''' + + def f(standard=False, **args): + insert_pos = len( + inline_stack.names + ) # in case line is longer than limit we will have to insert the lval at current position + # this is because calling func will change inline_stack. + # we cant use inline_stack.require here because we dont know whether line overflows yet + res = func(**args) + if len(res) > LINE_LEN_LIMIT: + name = inline_stack.require('LONG') + inline_stack.names.pop() + inline_stack.names.insert(insert_pos, name) + res = 'def %s(var=var):\n return %s\n' % (name, res) + inline_stack.define(name, res) + return name + '()' + else: + return res + + f.__dict__['standard'] = func + return f + + +# ==== IDENTIFIERS AND LITERALS ======= + +inf = float('inf') + + +def Literal(type, value, raw, regex=None): + if regex: # regex + return 'JsRegExp(%s)' % repr(compose_regex(value)) + elif value is None: # null + return 'var.get(u"null")' + # Todo template + # String, Bool, Float + return 'Js(%s)' % repr(value) if value != inf else 'Js(float("inf"))' + + +def Identifier(type, name): + return 'var.get(%s)' % repr(name) + + +@limited +def MemberExpression(type, computed, object, property): + far_left = trans(object) + if computed: # obj[prop] type accessor + # may be literal which is the same in every case so we can save some time on conversion + if property['type'] == 'Literal': + prop = repr(to_key(property)) + else: # worst case + prop = trans(property) + else: # always the same since not computed (obj.prop accessor) + prop = repr(to_key(property)) + return far_left + '.get(%s)' % prop + + +def ThisExpression(type): + return 'var.get(u"this")' + + +@limited +def CallExpression(type, callee, arguments): + arguments = [trans(e) for e in arguments] + if callee['type'] == 'MemberExpression': + far_left = trans(callee['object']) + if callee['computed']: # obj[prop] type accessor + # may be literal which is the same in every case so we can save some time on conversion + if callee['property']['type'] == 'Literal': + prop = repr(to_key(callee['property'])) + else: # worst case + prop = trans( + callee['property']) # its not a string literal! so no repr + else: # always the same since not computed (obj.prop accessor) + prop = repr(to_key(callee['property'])) + arguments.insert(0, prop) + return far_left + '.callprop(%s)' % ', '.join(arguments) + else: # standard call + return trans(callee) + '(%s)' % ', '.join(arguments) + + +# ========== ARRAYS ============ + + +def ArrayExpression(type, elements): # todo fix null inside problem + return 'Js([%s])' % ', '.join(trans(e) if e else 'None' for e in elements) + + +# ========== OBJECTS ============= + + +def ObjectExpression(type, properties): + name = inline_stack.require('Object') + elems = [] + after = '' + for p in properties: + if p['kind'] == 'init': + elems.append('%s:%s' % Property(**p)) + elif p['kind'] == 'set': + k, setter = Property( + **p + ) # setter is just a lval referring to that function, it will be defined in InlineStack automatically + after += '%s.define_own_property(%s, {"set":%s, "configurable":True, "enumerable":True})\n' % ( + name, k, setter) + elif p['kind'] == 'get': + k, getter = Property(**p) + after += '%s.define_own_property(%s, {"get":%s, "configurable":True, "enumerable":True})\n' % ( + name, k, getter) + else: + raise RuntimeError('Unexpected object propery kind') + obj = '%s = Js({%s})\n' % (name, ','.join(elems)) + inline_stack.define(name, obj + after) + return name + + +def Property(type, kind, key, computed, value, method, shorthand): + if shorthand or computed: + raise NotImplementedError( + 'Shorthand and Computed properties not implemented!') + k = to_key(key) + if k is None: + raise SyntaxError('Invalid key in dictionary! Or bug in Js2Py') + v = trans(value) + return repr(k), v + + +# ========== EXPRESSIONS ============ + + +@limited +def UnaryExpression(type, operator, argument, prefix): + a = trans( + argument, standard=True + ) # unary involve some complex operations so we cant use line shorteners here + if operator == 'delete': + if argument['type'] in ('Identifier', 'MemberExpression'): + # means that operation is valid + return js_delete(a) + return 'PyJsComma(%s, Js(True))' % a # otherwise not valid, just perform expression and return true. + elif operator == 'typeof': + return js_typeof(a) + return UNARY[operator](a) + + +@limited +def BinaryExpression(type, operator, left, right): + a = trans(left) + b = trans(right) + # delegate to our friends + return BINARY[operator](a, b) + + +@limited +def UpdateExpression(type, operator, argument, prefix): + a = trans( + argument, standard=True + ) # also complex operation involving parsing of the result so no line length reducing here + return js_postfix(a, operator == '++', not prefix) + + +@limited +def AssignmentExpression(type, operator, left, right): + operator = operator[:-1] + if left['type'] == 'Identifier': + if operator: + return 'var.put(%s, %s, %s)' % (repr(to_key(left)), trans(right), + repr(operator)) + else: + return 'var.put(%s, %s)' % (repr(to_key(left)), trans(right)) + elif left['type'] == 'MemberExpression': + far_left = trans(left['object']) + if left['computed']: # obj[prop] type accessor + # may be literal which is the same in every case so we can save some time on conversion + if left['property']['type'] == 'Literal': + prop = repr(to_key(left['property'])) + else: # worst case + prop = trans( + left['property']) # its not a string literal! so no repr + else: # always the same since not computed (obj.prop accessor) + prop = repr(to_key(left['property'])) + if operator: + return far_left + '.put(%s, %s, %s)' % (prop, trans(right), + repr(operator)) + else: + return far_left + '.put(%s, %s)' % (prop, trans(right)) + else: + raise SyntaxError('Invalid left hand side in assignment!') + + +six + + +@limited +def SequenceExpression(type, expressions): + return reduce(js_comma, (trans(e) for e in expressions)) + + +@limited +def NewExpression(type, callee, arguments): + return trans(callee) + '.create(%s)' % ', '.join( + trans(e) for e in arguments) + + +@limited +def ConditionalExpression( + type, test, consequent, + alternate): # caused plenty of problems in my home-made translator :) + return '(%s if %s else %s)' % (trans(consequent), trans(test), + trans(alternate)) + + +# =========== STATEMENTS ============= + + +def BlockStatement(type, body): + return StatementList( + body) # never returns empty string! In the worst case returns pass\n + + +def ExpressionStatement(type, expression): + return trans(expression) + '\n' # end expression space with new line + + +def BreakStatement(type, label): + if label: + return 'raise %s("Breaked")\n' % (get_break_label(label['name'])) + else: + return 'break\n' + + +def ContinueStatement(type, label): + if label: + return 'raise %s("Continued")\n' % (get_continue_label(label['name'])) + else: + return 'continue\n' + + +def ReturnStatement(type, argument): + return 'return %s\n' % (trans(argument) + if argument else "var.get('undefined')") + + +def EmptyStatement(type): + return 'pass\n' + + +def DebuggerStatement(type): + return 'pass\n' + + +def DoWhileStatement(type, body, test): + inside = trans(body) + 'if not %s:\n' % trans(test) + indent('break\n') + result = 'while 1:\n' + indent(inside) + return result + + +def ForStatement(type, init, test, update, body): + update = indent(trans(update)) if update else '' + init = trans(init) if init else '' + if not init.endswith('\n'): + init += '\n' + test = trans(test) if test else '1' + if not update: + result = '#for JS loop\n%swhile %s:\n%s%s\n' % ( + init, test, indent(trans(body)), update) + else: + result = '#for JS loop\n%swhile %s:\n' % (init, test) + body = 'try:\n%sfinally:\n %s\n' % (indent(trans(body)), update) + result += indent(body) + return result + + +def ForInStatement(type, left, right, body, each): + res = 'for PyJsTemp in %s:\n' % trans(right) + if left['type'] == "VariableDeclaration": + addon = trans(left) # make sure variable is registered + if addon != 'pass\n': + res = addon + res # we have to execute this expression :( + # now extract the name + try: + name = left['declarations'][0]['id']['name'] + except: + raise RuntimeError('Unusual ForIn loop') + elif left['type'] == 'Identifier': + name = left['name'] + else: + raise RuntimeError('Unusual ForIn loop') + res += indent('var.put(%s, PyJsTemp)\n' % repr(name) + trans(body)) + return res + + +def IfStatement(type, test, consequent, alternate): + # NOTE we cannot do elif because function definition inside elif statement would not be possible! + IF = 'if %s:\n' % trans(test) + IF += indent(trans(consequent)) + if not alternate: + return IF + ELSE = 'else:\n' + indent(trans(alternate)) + return IF + ELSE + + +def LabeledStatement(type, label, body): + # todo consider using smarter approach! + inside = trans(body) + defs = '' + if inside.startswith('while ') or inside.startswith( + 'for ') or inside.startswith('#for'): + # we have to add contine label as well... + # 3 or 1 since #for loop type has more lines before real for. + sep = 1 if not inside.startswith('#for') else 3 + cont_label = get_continue_label(label['name']) + temp = inside.split('\n') + injected = 'try:\n' + '\n'.join(temp[sep:]) + injected += 'except %s:\n pass\n' % cont_label + inside = '\n'.join(temp[:sep]) + '\n' + indent(injected) + defs += 'class %s(Exception): pass\n' % cont_label + break_label = get_break_label(label['name']) + inside = 'try:\n%sexcept %s:\n pass\n' % (indent(inside), break_label) + defs += 'class %s(Exception): pass\n' % break_label + return defs + inside + + +def StatementList(lis): + if lis: # ensure we don't return empty string because it may ruin indentation! + code = ''.join(trans(e) for e in lis) + return code if code else 'pass\n' + else: + return 'pass\n' + + +def PyimportStatement(type, imp): + lib = imp['name'] + jlib = 'PyImport_%s' % lib + code = 'import %s as %s\n' % (lib, jlib) + #check whether valid lib name... + try: + compile(code, '', 'exec') + except: + raise SyntaxError( + 'Invalid Python module name (%s) in pyimport statement' % lib) + # var.pyimport will handle module conversion to PyJs object + code += 'var.pyimport(%s, %s)\n' % (repr(lib), jlib) + return code + + +def SwitchStatement(type, discriminant, cases): + #TODO there will be a problem with continue in a switch statement.... FIX IT + code = 'while 1:\n' + indent('SWITCHED = False\nCONDITION = (%s)\n') + code = code % trans(discriminant) + for case in cases: + case_code = None + if case['test']: # case (x): + case_code = 'if SWITCHED or PyJsStrictEq(CONDITION, %s):\n' % ( + trans(case['test'])) + else: # default: + case_code = 'if True:\n' + case_code += indent('SWITCHED = True\n') + case_code += indent(StatementList(case['consequent'])) + # one more indent for whole + code += indent(case_code) + # prevent infinite loop and sort out nested switch... + code += indent('SWITCHED = True\nbreak\n') + return code + + +def ThrowStatement(type, argument): + return 'PyJsTempException = JsToPyException(%s)\nraise PyJsTempException\n' % trans( + argument) + + +def TryStatement(type, block, handler, handlers, guardedHandlers, finalizer): + result = 'try:\n%s' % indent(trans(block)) + # complicated catch statement... + if handler: + identifier = handler['param']['name'] + holder = 'PyJsHolder_%s_%d' % (to_hex(identifier), + random.randrange(1e8)) + identifier = repr(identifier) + result += 'except PyJsException as PyJsTempException:\n' + # fill in except ( catch ) block and remember to recover holder variable to its previous state + result += indent( + TRY_CATCH.replace('HOLDER', + holder).replace('NAME', identifier).replace( + 'BLOCK', indent(trans(handler['body'])))) + # translate finally statement if present + if finalizer: + result += 'finally:\n%s' % indent(trans(finalizer)) + return result + + +def LexicalDeclaration(type, declarations, kind): + raise NotImplementedError( + 'let and const not implemented yet but they will be soon! Check github for updates.' + ) + + +def VariableDeclarator(type, id, init): + name = id['name'] + # register the name if not already registered + Context.register(name) + if init: + return 'var.put(%s, %s)\n' % (repr(name), trans(init)) + return '' + + +def VariableDeclaration(type, declarations, kind): + code = ''.join(trans(d) for d in declarations) + return code if code else 'pass\n' + + +def WhileStatement(type, test, body): + result = 'while %s:\n' % trans(test) + indent(trans(body)) + return result + + +def WithStatement(type, object, body): + raise NotImplementedError('With statement not implemented!') + + +def Program(type, body): + inline_stack.reset() + code = ''.join(trans(e) for e in body) + # here add hoisted elements (register variables and define functions) + code = Context.get_code() + code + # replace all inline variables + code = inline_stack.inject_inlines(code) + return code + + +# ======== FUNCTIONS ============ + + +def FunctionDeclaration(type, id, params, defaults, body, generator, + expression): + if generator: + raise NotImplementedError('Generators not supported') + if defaults: + raise NotImplementedError('Defaults not supported') + if not id: + return FunctionExpression(type, id, params, defaults, body, generator, + expression) + '\n' + JsName = id['name'] + PyName = 'PyJsHoisted_%s_' % JsName + PyName = PyName if is_valid_py_name(PyName) else 'PyJsHoistedNonPyName' + # this is quite complicated + global Context + previous_context = Context + # change context to the context of this function + Context = ContextStack() + # translate body within current context + code = trans(body) + # get arg names + vars = [v['name'] for v in params] + # args are automaticaly registered variables + Context.to_register.update(vars) + # add all hoisted elements inside function + code = Context.get_code() + code + # check whether args are valid python names: + used_vars = [] + for v in vars: + if is_valid_py_name(v): + used_vars.append(v) + else: # invalid arg in python, for example $, replace with alternatice arg + used_vars.append('PyJsArg_%s_' % to_hex(v)) + header = '@Js\n' + header += 'def %s(%sthis, arguments, var=var):\n' % ( + PyName, ', '.join(used_vars) + (', ' if vars else '')) + # transfer names from Py scope to Js scope + arg_map = dict(zip(vars, used_vars)) + arg_map.update({'this': 'this', 'arguments': 'arguments'}) + arg_conv = 'var = Scope({%s}, var)\n' % ', '.join( + repr(k) + ':' + v for k, v in six.iteritems(arg_map)) + # and finally set the name of the function to its real name: + footer = '%s.func_name = %s\n' % (PyName, repr(JsName)) + footer += 'var.put(%s, %s)\n' % (repr(JsName), PyName) + whole_code = header + indent(arg_conv + code) + footer + # restore context + Context = previous_context + # define in upper context + Context.define(JsName, whole_code) + return 'pass\n' + + +def FunctionExpression(type, id, params, defaults, body, generator, + expression): + if generator: + raise NotImplementedError('Generators not supported') + if defaults: + raise NotImplementedError('Defaults not supported') + JsName = id['name'] if id else 'anonymous' + if not is_valid_py_name(JsName): + ScriptName = 'InlineNonPyName' + else: + ScriptName = JsName + PyName = inline_stack.require(ScriptName) # this is unique + + # again quite complicated + global Context + previous_context = Context + # change context to the context of this function + Context = ContextStack() + # translate body within current context + code = trans(body) + # get arg names + vars = [v['name'] for v in params] + # args are automaticaly registered variables + Context.to_register.update(vars) + # add all hoisted elements inside function + code = Context.get_code() + code + # check whether args are valid python names: + used_vars = [] + for v in vars: + if is_valid_py_name(v): + used_vars.append(v) + else: # invalid arg in python, for example $, replace with alternatice arg + used_vars.append('PyJsArg_%s_' % to_hex(v)) + header = '@Js\n' + header += 'def %s(%sthis, arguments, var=var):\n' % ( + PyName, ', '.join(used_vars) + (', ' if vars else '')) + # transfer names from Py scope to Js scope + arg_map = dict(zip(vars, used_vars)) + arg_map.update({'this': 'this', 'arguments': 'arguments'}) + if id: # make self available from inside... + if id['name'] not in arg_map: + arg_map[id['name']] = PyName + arg_conv = 'var = Scope({%s}, var)\n' % ', '.join( + repr(k) + ':' + v for k, v in six.iteritems(arg_map)) + # and finally set the name of the function to its real name: + footer = '%s._set_name(%s)\n' % (PyName, repr(JsName)) + whole_code = header + indent(arg_conv + code) + footer + # restore context + Context = previous_context + # define in upper context + inline_stack.define(PyName, whole_code) + return PyName + + +LogicalExpression = BinaryExpression +PostfixExpression = UpdateExpression + +clean_stacks() + +if __name__ == '__main__': + import codecs + import time + import pyjsparser + + c = None #'''`ijfdij`''' + if not c: + with codecs.open("esp.js", "r", "utf-8") as f: + c = f.read() + + print('Started') + t = time.time() + res = trans(pyjsparser.PyJsParser().parse(c)) + dt = time.time() - t + 0.000000001 + print('Translated everyting in', round(dt, 5), 'seconds.') + print('Thats %d characters per second' % int(len(c) / dt)) + with open('res.py', 'w') as f: + f.write(res) diff --git a/Contents/Libraries/Shared/js2py/translators/translator.py b/Contents/Libraries/Shared/js2py/translators/translator.py new file mode 100644 index 000000000..16ed5bdb6 --- /dev/null +++ b/Contents/Libraries/Shared/js2py/translators/translator.py @@ -0,0 +1,189 @@ +import pyjsparser +import pyjsparser.parser +from . import translating_nodes + +import hashlib +import re + +# Enable Js2Py exceptions and pyimport in parser +pyjsparser.parser.ENABLE_PYIMPORT = True + +# the re below is how we'll recognise numeric constants. +# it finds any 'simple numeric that is not preceded with an alphanumeric character +# the numeric can be a float (so a dot is found) but +# it does not recognise notation such as 123e5, 0xFF, infinity or NaN +CP_NUMERIC_RE = re.compile(r'(?= (3, 4): + for inst in dis.Bytecode(code_obj): + yield inst + else: + # otherwise we have to manually parse + code = code_obj.co_code + NewInstruction = namedtuple('Instruction', ('opcode', 'arg')) + if six.PY2: + code = map(ord, code) + i, L = 0, len(code) + extended_arg = 0 + while i < L: + op = code[i] + i += 1 + if op < opcode.HAVE_ARGUMENT: + yield NewInstruction(op, None) + continue + oparg = code[i] + (code[i + 1] << 8) + extended_arg + extended_arg = 0 + i += 2 + if op == opcode.EXTENDED_ARG: + extended_arg = oparg << 16 + continue + yield NewInstruction(op, oparg) + + +def write_instruction(op, arg): + if sys.version_info < (3, 6): + if arg is None: + return [chr(op)] + elif arg <= 65536: + return [chr(op), chr(arg & 255), chr((arg >> 8) & 255)] + elif arg <= 4294967296: + return [ + chr(opcode.EXTENDED_ARG), + chr((arg >> 16) & 255), + chr((arg >> 24) & 255), + chr(op), + chr(arg & 255), + chr((arg >> 8) & 255) + ] + else: + raise ValueError("Invalid oparg: {0} is too large".format(oparg)) + else: # python 3.6+ uses wordcode instead of bytecode and they already supply all the EXTENDEND_ARG ops :) + if arg is None: + return [chr(op), 0] + return [chr(op), arg & 255] + # the code below is for case when extended args are to be determined automatically + # if op == opcode.EXTENDED_ARG: + # return [] # this will be added automatically + # elif arg < 1 << 8: + # return [chr(op), arg] + # elif arg < 1 << 32: + # subs = [1<<24, 1<<16, 1<<8] # allowed op extension sizes + # for sub in subs: + # if arg >= sub: + # fit = int(arg / sub) + # return [chr(opcode.EXTENDED_ARG), fit] + write_instruction(op, arg - fit * sub) + # else: + # raise ValueError("Invalid oparg: {0} is too large".format(oparg)) + + +def check(code_obj): + old_bytecode = code_obj.co_code + insts = list(instructions(code_obj)) + + pos_to_inst = {} + bytelist = [] + + for inst in insts: + pos_to_inst[len(bytelist)] = inst + bytelist.extend(write_instruction(inst.opcode, inst.arg)) + if six.PY2: + new_bytecode = ''.join(bytelist) + else: + new_bytecode = bytes(bytelist) + if new_bytecode != old_bytecode: + print(new_bytecode) + print(old_bytecode) + for i in range(min(len(new_bytecode), len(old_bytecode))): + if old_bytecode[i] != new_bytecode[i]: + while 1: + if i in pos_to_inst: + print(pos_to_inst[i]) + print(pos_to_inst[i - 2]) + print(list(map(chr, old_bytecode))[i - 4:i + 8]) + print(bytelist[i - 4:i + 8]) + break + raise RuntimeError( + 'Your python version made changes to the bytecode') + + +check(six.get_function_code(check)) + +if __name__ == '__main__': + x = 'Wrong' + dick = 3000 + + def func(a): + print(x, y, z, a) + print(dick) + d = (x, ) + for e in (e for e in x): + print(e) + return x, y, z + + func2 = types.FunctionType( + append_arguments(six.get_function_code(func), ('x', 'y', 'z')), + six.get_function_globals(func), + func.__name__, + closure=six.get_function_closure(func)) + args = (2, 2, 3, 4), 3, 4 + assert func2(1, *args) == args diff --git a/Contents/Libraries/Shared/libfilebot/main.py b/Contents/Libraries/Shared/libfilebot/main.py index 55c3ab1f1..9a4e685eb 100644 --- a/Contents/Libraries/Shared/libfilebot/main.py +++ b/Contents/Libraries/Shared/libfilebot/main.py @@ -7,11 +7,14 @@ import re import binascii import types +import os from pipes import quote from lib import find_executable +mswindows = False if sys.platform == "win32": + mswindows = True from pyads import ADS logger = logging.getLogger(__name__) @@ -48,18 +51,25 @@ def default_xattr(fn): lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)', result).group(2) ), - "darwin": { - lambda fn: ["xattr", "-p", "net.filebot.filename", fn], - lambda result: binascii.unhexlify(result.replace(' ', '').replace('\n', '')).strip("\x00") - }, - "win32": { + # "darwin": ( + # lambda fn: ["xattr", "-p", "net.filebot.filename", fn], + # lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '') + # .replace('\n', '')).strip("\x00") + # ), + "darwin": ( + lambda fn: ["filebot", "-script", "fn:xattr", fn], + lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)', + result).group(2) + ), + "win32": ( lambda fn: fn, win32_xattr, - } + ) } if sys.platform not in XATTR_MAP: - default_xattr_bin = find_executable("getfattr") or find_executable("attr") or find_executable("filebot") + default_xattr_bin = find_executable("getfattr") or find_executable("attr") or find_executable("filebot") \ + or "filebot" def get_filebot_attrs(fn): @@ -79,12 +89,35 @@ def get_filebot_attrs(fn): args = args_func(fn) if isinstance(args, types.ListType): try: - output = subprocess.check_output(quote_args(args), stderr=subprocess.PIPE, shell=True) - except subprocess.CalledProcessError, e: - if e.returncode == 1: - logger.info(u"%s: Couldn't get filebot original filename", fn) - else: - logger.error(u"%s: Unexpected error while getting filebot original filename: %s", fn, + env = dict(os.environ) + if not mswindows: + env_path = {"PATH": os.pathsep.join( + [ + "/usr/local/bin", + "/usr/bin", + "/usr/local/sbin", + "/usr/sbin", + os.environ.get("PATH", "") + ] + ) + } + env = dict(os.environ, **env_path) + + env.pop("LD_LIBRARY_PATH", None) + + proc = subprocess.Popen(quote_args(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, + env=env) + output, errors = proc.communicate() + + if proc.returncode == 1: + logger.info(u"%s: Couldn't get filebot original filename, args: %r, output: %r, error: %r", fn, args, + output, errors) + return + + output = output.decode() + + except: + logger.error(u"%s: Unexpected error while getting filebot original filename: %s", fn, traceback.format_exc()) return else: @@ -95,6 +128,7 @@ def get_filebot_attrs(fn): return orig_fn.strip() except: logger.info(u"%s: Couldn't get filebot original filename" % fn) + logger.debug(u"%s: Result: %r" % (fn, output)) if __name__ == "__main__": diff --git a/Contents/Libraries/Shared/pbkdf2.py b/Contents/Libraries/Shared/pbkdf2.py new file mode 100644 index 000000000..937a99a5c --- /dev/null +++ b/Contents/Libraries/Shared/pbkdf2.py @@ -0,0 +1,297 @@ +#!/usr/bin/python +# -*- coding: ascii -*- +########################################################################### +# pbkdf2 - PKCS#5 v2.0 Password-Based Key Derivation +# +# Copyright (C) 2007-2011 Dwayne C. Litzenberger +# +# 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. +# +# Country of origin: Canada +# +########################################################################### +# Sample PBKDF2 usage: +# from Crypto.Cipher import AES +# from pbkdf2 import PBKDF2 +# import os +# +# salt = os.urandom(8) # 64-bit salt +# key = PBKDF2("This passphrase is a secret.", salt).read(32) # 256-bit key +# iv = os.urandom(16) # 128-bit IV +# cipher = AES.new(key, AES.MODE_CBC, iv) +# ... +# +# Sample crypt() usage: +# from pbkdf2 import crypt +# pwhash = crypt("secret") +# alleged_pw = raw_input("Enter password: ") +# if pwhash == crypt(alleged_pw, pwhash): +# print "Password good" +# else: +# print "Invalid password" +# +########################################################################### + +__version__ = "1.3" +__all__ = ['PBKDF2', 'crypt'] + +from struct import pack +from random import randint +import string +import sys + +try: + # Use PyCrypto (if available). + from Crypto.Hash import HMAC, SHA as SHA1 +except ImportError: + # PyCrypto not available. Use the Python standard library. + import hmac as HMAC + try: + from hashlib import sha1 as SHA1 + except ImportError: + # hashlib not available. Use the old sha module. + import sha as SHA1 + +# +# Python 2.1 thru 3.2 compatibility +# + +if sys.version_info[0] == 2: + _0xffffffffL = long(1) << 32 + def isunicode(s): + return isinstance(s, unicode) + def isbytes(s): + return isinstance(s, str) + def isinteger(n): + return isinstance(n, (int, long)) + def b(s): + return s + def binxor(a, b): + return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)]) + def b64encode(data, chars="+/"): + tt = string.maketrans("+/", chars) + return data.encode('base64').replace("\n", "").translate(tt) + from binascii import b2a_hex +else: + _0xffffffffL = 0xffffffff + def isunicode(s): + return isinstance(s, str) + def isbytes(s): + return isinstance(s, bytes) + def isinteger(n): + return isinstance(n, int) + def callable(obj): + return hasattr(obj, '__call__') + def b(s): + return s.encode("latin-1") + def binxor(a, b): + return bytes([x ^ y for (x, y) in zip(a, b)]) + from base64 import b64encode as _b64encode + def b64encode(data, chars="+/"): + if isunicode(chars): + return _b64encode(data, chars.encode('utf-8')).decode('utf-8') + else: + return _b64encode(data, chars) + from binascii import b2a_hex as _b2a_hex + def b2a_hex(s): + return _b2a_hex(s).decode('us-ascii') + xrange = range + +class PBKDF2(object): + """PBKDF2.py : PKCS#5 v2.0 Password-Based Key Derivation + + This implementation takes a passphrase and a salt (and optionally an + iteration count, a digest module, and a MAC module) and provides a + file-like object from which an arbitrarily-sized key can be read. + + If the passphrase and/or salt are unicode objects, they are encoded as + UTF-8 before they are processed. + + The idea behind PBKDF2 is to derive a cryptographic key from a + passphrase and a salt. + + PBKDF2 may also be used as a strong salted password hash. The + 'crypt' function is provided for that purpose. + + Remember: Keys generated using PBKDF2 are only as strong as the + passphrases they are derived from. + """ + + def __init__(self, passphrase, salt, iterations=1000, + digestmodule=SHA1, macmodule=HMAC): + self.__macmodule = macmodule + self.__digestmodule = digestmodule + self._setup(passphrase, salt, iterations, self._pseudorandom) + + def _pseudorandom(self, key, msg): + """Pseudorandom function. e.g. HMAC-SHA1""" + return self.__macmodule.new(key=key, msg=msg, + digestmod=self.__digestmodule).digest() + + def read(self, bytes): + """Read the specified number of key bytes.""" + if self.closed: + raise ValueError("file-like object is closed") + + size = len(self.__buf) + blocks = [self.__buf] + i = self.__blockNum + while size < bytes: + i += 1 + if i > _0xffffffffL or i < 1: + # We could return "" here, but + raise OverflowError("derived key too long") + block = self.__f(i) + blocks.append(block) + size += len(block) + buf = b("").join(blocks) + retval = buf[:bytes] + self.__buf = buf[bytes:] + self.__blockNum = i + return retval + + def __f(self, i): + # i must fit within 32 bits + assert 1 <= i <= _0xffffffffL + U = self.__prf(self.__passphrase, self.__salt + pack("!L", i)) + result = U + for j in xrange(2, 1+self.__iterations): + U = self.__prf(self.__passphrase, U) + result = binxor(result, U) + return result + + def hexread(self, octets): + """Read the specified number of octets. Return them as hexadecimal. + + Note that len(obj.hexread(n)) == 2*n. + """ + return b2a_hex(self.read(octets)) + + def _setup(self, passphrase, salt, iterations, prf): + # Sanity checks: + + # passphrase and salt must be str or unicode (in the latter + # case, we convert to UTF-8) + if isunicode(passphrase): + passphrase = passphrase.encode("UTF-8") + elif not isbytes(passphrase): + raise TypeError("passphrase must be str or unicode") + if isunicode(salt): + salt = salt.encode("UTF-8") + elif not isbytes(salt): + raise TypeError("salt must be str or unicode") + + # iterations must be an integer >= 1 + if not isinteger(iterations): + raise TypeError("iterations must be an integer") + if iterations < 1: + raise ValueError("iterations must be at least 1") + + # prf must be callable + if not callable(prf): + raise TypeError("prf must be callable") + + self.__passphrase = passphrase + self.__salt = salt + self.__iterations = iterations + self.__prf = prf + self.__blockNum = 0 + self.__buf = b("") + self.closed = False + + def close(self): + """Close the stream.""" + if not self.closed: + del self.__passphrase + del self.__salt + del self.__iterations + del self.__prf + del self.__blockNum + del self.__buf + self.closed = True + +def crypt(word, salt=None, iterations=None): + """PBKDF2-based unix crypt(3) replacement. + + The number of iterations specified in the salt overrides the 'iterations' + parameter. + + The effective hash length is 192 bits. + """ + + # Generate a (pseudo-)random salt if the user hasn't provided one. + if salt is None: + salt = _makesalt() + + # salt must be a string or the us-ascii subset of unicode + if isunicode(salt): + salt = salt.encode('us-ascii').decode('us-ascii') + elif isbytes(salt): + salt = salt.decode('us-ascii') + else: + raise TypeError("salt must be a string") + + # word must be a string or unicode (in the latter case, we convert to UTF-8) + if isunicode(word): + word = word.encode("UTF-8") + elif not isbytes(word): + raise TypeError("word must be a string or unicode") + + # Try to extract the real salt and iteration count from the salt + if salt.startswith("$p5k2$"): + (iterations, salt, dummy) = salt.split("$")[2:5] + if iterations == "": + iterations = 400 + else: + converted = int(iterations, 16) + if iterations != "%x" % converted: # lowercase hex, minimum digits + raise ValueError("Invalid salt") + iterations = converted + if not (iterations >= 1): + raise ValueError("Invalid salt") + + # Make sure the salt matches the allowed character set + allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./" + for ch in salt: + if ch not in allowed: + raise ValueError("Illegal character %r in salt" % (ch,)) + + if iterations is None or iterations == 400: + iterations = 400 + salt = "$p5k2$$" + salt + else: + salt = "$p5k2$%x$%s" % (iterations, salt) + rawhash = PBKDF2(word, salt, iterations).read(24) + return salt + "$" + b64encode(rawhash, "./") + +# Add crypt as a static method of the PBKDF2 class +# This makes it easier to do "from PBKDF2 import PBKDF2" and still use +# crypt. +PBKDF2.crypt = staticmethod(crypt) + +def _makesalt(): + """Return a 48-bit pseudorandom salt for crypt(). + + This function is not suitable for generating cryptographic secrets. + """ + binarysalt = b("").join([pack("@H", randint(0, 0xffff)) for i in range(3)]) + return b64encode(binarysalt, "./") + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Contents/Libraries/Shared/provider_test.sh b/Contents/Libraries/Shared/provider_test.sh index 6235a06e0..a91c1b8ad 100644 --- a/Contents/Libraries/Shared/provider_test.sh +++ b/Contents/Libraries/Shared/provider_test.sh @@ -4,9 +4,15 @@ python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.get # addic7ed download_best python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import os; os.environ['U1pfT01EQl9LRVk'] = '789CF30DAC2C8B0AF433F5C9AD34290A712DF30D7135F12D0FB3E502006FDE081E'; import subliminal_patch, subliminal; from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from babelfish import Language; subliminal.region.configure('dogpile.cache.memory'); from subzero.video import parse_video; video = parse_video('FILE_NAME', hints={'type': 'episode'}, dry_run=True); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['addic7ed'], provider_configs={'addic7ed': {'use_random_agents': True}}, languages={Language('fra')} )" -# opensubtitles +# opensubtitles:list python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; from subzero.video import parse_video; SZProviderPool(providers=['opensubtitles'], )['opensubtitles'].list_subtitles(parse_video('FULL_PATH', {}, {'type': 'episode'}), languages=[Language('eng')])" +# opensubtitles:download +python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from babelfish import Language; from subzero.video import parse_video; video = parse_video('FILE_NAME', hints={'type': 'movie'}, dry_run=True); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['opensubtitles'], languages={Language('srp')} )" + +# opensubtitles:full +python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool, download_best_subtitles; from subliminal_patch.score import compute_score; from subzero.language import Language; from subzero.video import parse_video, refine_video; import os; os.environ['U1pfT01EQl9LRVk'] = '789CF30DAC2C8B0AF433F5C9AD34290A712DF30D7135F12D0FB3E502006FDE081E'; video = parse_video('SUBPATH_TO_FILE', hints={'episode_title': 'EPISODE_TITLE', 'type': 'episode', 'title': 'SERIES_TITLE'}, dry_run=True); refine_video(video); download_best_subtitles([video], pool_class=SZProviderPool, compute_score=compute_score, providers=['opensubtitles'], languages={Language('eng')} )" + # podnapisi python -c "import logging; logging.basicConfig(level=logging.DEBUG); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; SZProviderPool(providers=['podnapisi'], )['podnapisi'].query([Language('eng')], 'Game of Thrones', season=2, episode=1)" @@ -37,6 +43,8 @@ python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.get # subscenter:list python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from babelfish import Language; from subliminal.core import scan_video; print SZProviderPool(providers=['subscenter'], )['subscenter'].list_subtitles(scan_video('FULL_PATH'), languages=[Language('heb')])" +# subscene:list +python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subliminal_patch.core import SZProviderPool; from subzero.language import Language; from subzero.video import parse_video; SZProviderPool(providers=['subscene'], provider_configs={'subscene': {'username': 'USERNAME', 'password': 'PASSWORD'}})['subscene'].list_subtitles(parse_video('FILENAME', {}, {'type': 'episode'}, dry_run=True), languages=[Language('eng')])" # refining python -c "import logging; logging.basicConfig(level=logging.DEBUG); logging.getLogger('rebulk').setLevel(logging.WARNING); import os; os.environ['U1pfT01EQl9LRVk'] = '789CF30DAC2C8B0AF433F5C9AD34290A712DF30D7135F12D0FB3E502006FDE081E'; import subliminal_patch, subliminal; subliminal.region.configure('dogpile.cache.memory'); from subzero.video import parse_video, refine_video; video = parse_video('FILE_NAME', {'type': 'episode'}, dry_run=True); print refine_video(video)" diff --git a/Contents/Libraries/Shared/pyaes/__init__.py b/Contents/Libraries/Shared/pyaes/__init__.py new file mode 100644 index 000000000..5712f794a --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/__init__.py @@ -0,0 +1,53 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# 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. + +# This is a pure-Python implementation of the AES algorithm and AES common +# modes of operation. + +# See: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard +# See: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation + + +# Supported key sizes: +# 128-bit +# 192-bit +# 256-bit + + +# Supported modes of operation: +# ECB - Electronic Codebook +# CBC - Cipher-Block Chaining +# CFB - Cipher Feedback +# OFB - Output Feedback +# CTR - Counter + +# See the README.md for API details and general information. + +# Also useful, PyCrypto, a crypto library implemented in C with Python bindings: +# https://www.dlitz.net/software/pycrypto/ + + +VERSION = [1, 3, 0] + +from .aes import AES, AESModeOfOperationCTR, AESModeOfOperationCBC, AESModeOfOperationCFB, AESModeOfOperationECB, AESModeOfOperationOFB, AESModesOfOperation, Counter +from .blockfeeder import decrypt_stream, Decrypter, encrypt_stream, Encrypter +from .blockfeeder import PADDING_NONE, PADDING_DEFAULT diff --git a/Contents/Libraries/Shared/pyaes/aes.py b/Contents/Libraries/Shared/pyaes/aes.py new file mode 100644 index 000000000..c6e8bc02a --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/aes.py @@ -0,0 +1,589 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# 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. + +# This is a pure-Python implementation of the AES algorithm and AES common +# modes of operation. + +# See: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard + +# Honestly, the best description of the modes of operations are the wonderful +# diagrams on Wikipedia. They explain in moments what my words could never +# achieve. Hence the inline documentation here is sparer than I'd prefer. +# See: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation + +# Also useful, PyCrypto, a crypto library implemented in C with Python bindings: +# https://www.dlitz.net/software/pycrypto/ + + +# Supported key sizes: +# 128-bit +# 192-bit +# 256-bit + + +# Supported modes of operation: +# ECB - Electronic Codebook +# CBC - Cipher-Block Chaining +# CFB - Cipher Feedback +# OFB - Output Feedback +# CTR - Counter + + +# See the README.md for API details and general information. + + +import copy +import struct + +__all__ = ["AES", "AESModeOfOperationCTR", "AESModeOfOperationCBC", "AESModeOfOperationCFB", + "AESModeOfOperationECB", "AESModeOfOperationOFB", "AESModesOfOperation", "Counter"] + + +def _compact_word(word): + return (word[0] << 24) | (word[1] << 16) | (word[2] << 8) | word[3] + +def _string_to_bytes(text): + return list(ord(c) for c in text) + +def _bytes_to_string(binary): + return "".join(chr(b) for b in binary) + +def _concat_list(a, b): + return a + b + + +# Python 3 compatibility +try: + xrange +except Exception: + xrange = range + + # Python 3 supports bytes, which is already an array of integers + def _string_to_bytes(text): + if isinstance(text, bytes): + return text + return [ord(c) for c in text] + + # In Python 3, we return bytes + def _bytes_to_string(binary): + return bytes(binary) + + # Python 3 cannot concatenate a list onto a bytes, so we bytes-ify it first + def _concat_list(a, b): + return a + bytes(b) + + +# Based *largely* on the Rijndael implementation +# See: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf +class AES(object): + '''Encapsulates the AES block cipher. + + You generally should not need this. Use the AESModeOfOperation classes + below instead.''' + + # Number of rounds by keysize + number_of_rounds = {16: 10, 24: 12, 32: 14} + + # Round constant words + rcon = [ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ] + + # S-box and Inverse S-box (S is for Substitution) + S = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ] + Si =[ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d ] + + # Transformations for encryption + T1 = [ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a ] + T2 = [ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616 ] + T3 = [ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16 ] + T4 = [ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c ] + + # Transformations for decryption + T5 = [ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742 ] + T6 = [ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857 ] + T7 = [ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8 ] + T8 = [ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0 ] + + # Transformations for decryption key expansion + U1 = [ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3 ] + U2 = [ 0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697 ] + U3 = [ 0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46 ] + U4 = [ 0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d ] + + def __init__(self, key): + + if len(key) not in (16, 24, 32): + raise ValueError('Invalid key size') + + rounds = self.number_of_rounds[len(key)] + + # Encryption round keys + self._Ke = [[0] * 4 for i in xrange(rounds + 1)] + + # Decryption round keys + self._Kd = [[0] * 4 for i in xrange(rounds + 1)] + + round_key_count = (rounds + 1) * 4 + KC = len(key) // 4 + + # Convert the key into ints + tk = [ struct.unpack('>i', key[i:i + 4])[0] for i in xrange(0, len(key), 4) ] + + # Copy values into round key arrays + for i in xrange(0, KC): + self._Ke[i // 4][i % 4] = tk[i] + self._Kd[rounds - (i // 4)][i % 4] = tk[i] + + # Key expansion (fips-197 section 5.2) + rconpointer = 0 + t = KC + while t < round_key_count: + + tt = tk[KC - 1] + tk[0] ^= ((self.S[(tt >> 16) & 0xFF] << 24) ^ + (self.S[(tt >> 8) & 0xFF] << 16) ^ + (self.S[ tt & 0xFF] << 8) ^ + self.S[(tt >> 24) & 0xFF] ^ + (self.rcon[rconpointer] << 24)) + rconpointer += 1 + + if KC != 8: + for i in xrange(1, KC): + tk[i] ^= tk[i - 1] + + # Key expansion for 256-bit keys is "slightly different" (fips-197) + else: + for i in xrange(1, KC // 2): + tk[i] ^= tk[i - 1] + tt = tk[KC // 2 - 1] + + tk[KC // 2] ^= (self.S[ tt & 0xFF] ^ + (self.S[(tt >> 8) & 0xFF] << 8) ^ + (self.S[(tt >> 16) & 0xFF] << 16) ^ + (self.S[(tt >> 24) & 0xFF] << 24)) + + for i in xrange(KC // 2 + 1, KC): + tk[i] ^= tk[i - 1] + + # Copy values into round key arrays + j = 0 + while j < KC and t < round_key_count: + self._Ke[t // 4][t % 4] = tk[j] + self._Kd[rounds - (t // 4)][t % 4] = tk[j] + j += 1 + t += 1 + + # Inverse-Cipher-ify the decryption round key (fips-197 section 5.3) + for r in xrange(1, rounds): + for j in xrange(0, 4): + tt = self._Kd[r][j] + self._Kd[r][j] = (self.U1[(tt >> 24) & 0xFF] ^ + self.U2[(tt >> 16) & 0xFF] ^ + self.U3[(tt >> 8) & 0xFF] ^ + self.U4[ tt & 0xFF]) + + def encrypt(self, plaintext): + 'Encrypt a block of plain text using the AES block cipher.' + + if len(plaintext) != 16: + raise ValueError('wrong block length') + + rounds = len(self._Ke) - 1 + (s1, s2, s3) = [1, 2, 3] + a = [0, 0, 0, 0] + + # Convert plaintext to (ints ^ key) + t = [(_compact_word(plaintext[4 * i:4 * i + 4]) ^ self._Ke[0][i]) for i in xrange(0, 4)] + + # Apply round transforms + for r in xrange(1, rounds): + for i in xrange(0, 4): + a[i] = (self.T1[(t[ i ] >> 24) & 0xFF] ^ + self.T2[(t[(i + s1) % 4] >> 16) & 0xFF] ^ + self.T3[(t[(i + s2) % 4] >> 8) & 0xFF] ^ + self.T4[ t[(i + s3) % 4] & 0xFF] ^ + self._Ke[r][i]) + t = copy.copy(a) + + # The last round is special + result = [ ] + for i in xrange(0, 4): + tt = self._Ke[rounds][i] + result.append((self.S[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((self.S[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((self.S[(t[(i + s2) % 4] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((self.S[ t[(i + s3) % 4] & 0xFF] ^ tt ) & 0xFF) + + return result + + def decrypt(self, ciphertext): + 'Decrypt a block of cipher text using the AES block cipher.' + + if len(ciphertext) != 16: + raise ValueError('wrong block length') + + rounds = len(self._Kd) - 1 + (s1, s2, s3) = [3, 2, 1] + a = [0, 0, 0, 0] + + # Convert ciphertext to (ints ^ key) + t = [(_compact_word(ciphertext[4 * i:4 * i + 4]) ^ self._Kd[0][i]) for i in xrange(0, 4)] + + # Apply round transforms + for r in xrange(1, rounds): + for i in xrange(0, 4): + a[i] = (self.T5[(t[ i ] >> 24) & 0xFF] ^ + self.T6[(t[(i + s1) % 4] >> 16) & 0xFF] ^ + self.T7[(t[(i + s2) % 4] >> 8) & 0xFF] ^ + self.T8[ t[(i + s3) % 4] & 0xFF] ^ + self._Kd[r][i]) + t = copy.copy(a) + + # The last round is special + result = [ ] + for i in xrange(0, 4): + tt = self._Kd[rounds][i] + result.append((self.Si[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((self.Si[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((self.Si[(t[(i + s2) % 4] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((self.Si[ t[(i + s3) % 4] & 0xFF] ^ tt ) & 0xFF) + + return result + + +class Counter(object): + '''A counter object for the Counter (CTR) mode of operation. + + To create a custom counter, you can usually just override the + increment method.''' + + def __init__(self, initial_value = 1): + + # Convert the value into an array of bytes long + self._counter = [ ((initial_value >> i) % 256) for i in xrange(128 - 8, -1, -8) ] + + value = property(lambda s: s._counter) + + def increment(self): + '''Increment the counter (overflow rolls back to 0).''' + + for i in xrange(len(self._counter) - 1, -1, -1): + self._counter[i] += 1 + + if self._counter[i] < 256: break + + # Carry the one + self._counter[i] = 0 + + # Overflow + else: + self._counter = [ 0 ] * len(self._counter) + + +class AESBlockModeOfOperation(object): + '''Super-class for AES modes of operation that require blocks.''' + def __init__(self, key): + self._aes = AES(key) + + def decrypt(self, ciphertext): + raise Exception('not implemented') + + def encrypt(self, plaintext): + raise Exception('not implemented') + + +class AESStreamModeOfOperation(AESBlockModeOfOperation): + '''Super-class for AES modes of operation that are stream-ciphers.''' + +class AESSegmentModeOfOperation(AESStreamModeOfOperation): + '''Super-class for AES modes of operation that segment data.''' + + segment_bytes = 16 + + + +class AESModeOfOperationECB(AESBlockModeOfOperation): + '''AES Electronic Codebook Mode of Operation. + + o Block-cipher, so data must be padded to 16 byte boundaries + + Security Notes: + o This mode is not recommended + o Any two identical blocks produce identical encrypted values, + exposing data patterns. (See the image of Tux on wikipedia) + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.1''' + + + name = "Electronic Codebook (ECB)" + + def encrypt(self, plaintext): + if len(plaintext) != 16: + raise ValueError('plaintext block must be 16 bytes') + + plaintext = _string_to_bytes(plaintext) + return _bytes_to_string(self._aes.encrypt(plaintext)) + + def decrypt(self, ciphertext): + if len(ciphertext) != 16: + raise ValueError('ciphertext block must be 16 bytes') + + ciphertext = _string_to_bytes(ciphertext) + return _bytes_to_string(self._aes.decrypt(ciphertext)) + + + +class AESModeOfOperationCBC(AESBlockModeOfOperation): + '''AES Cipher-Block Chaining Mode of Operation. + + o The Initialization Vector (IV) + o Block-cipher, so data must be padded to 16 byte boundaries + o An incorrect initialization vector will only cause the first + block to be corrupt; all other blocks will be intact + o A corrupt bit in the cipher text will cause a block to be + corrupted, and the next block to be inverted, but all other + blocks will be intact. + + Security Notes: + o This method (and CTR) ARE recommended. + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.2''' + + + name = "Cipher-Block Chaining (CBC)" + + def __init__(self, key, iv = None): + if iv is None: + self._last_cipherblock = [ 0 ] * 16 + elif len(iv) != 16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._last_cipherblock = _string_to_bytes(iv) + + AESBlockModeOfOperation.__init__(self, key) + + def encrypt(self, plaintext): + if len(plaintext) != 16: + raise ValueError('plaintext block must be 16 bytes') + + plaintext = _string_to_bytes(plaintext) + precipherblock = [ (p ^ l) for (p, l) in zip(plaintext, self._last_cipherblock) ] + self._last_cipherblock = self._aes.encrypt(precipherblock) + + return _bytes_to_string(self._last_cipherblock) + + def decrypt(self, ciphertext): + if len(ciphertext) != 16: + raise ValueError('ciphertext block must be 16 bytes') + + cipherblock = _string_to_bytes(ciphertext) + plaintext = [ (p ^ l) for (p, l) in zip(self._aes.decrypt(cipherblock), self._last_cipherblock) ] + self._last_cipherblock = cipherblock + + return _bytes_to_string(plaintext) + + + +class AESModeOfOperationCFB(AESSegmentModeOfOperation): + '''AES Cipher Feedback Mode of Operation. + + o A stream-cipher, so input does not need to be padded to blocks, + but does need to be padded to segment_size + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_.28CFB.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.3''' + + + name = "Cipher Feedback (CFB)" + + def __init__(self, key, iv, segment_size = 1): + if segment_size == 0: segment_size = 1 + + if iv is None: + self._shift_register = [ 0 ] * 16 + elif len(iv) != 16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._shift_register = _string_to_bytes(iv) + + self._segment_bytes = segment_size + + AESBlockModeOfOperation.__init__(self, key) + + segment_bytes = property(lambda s: s._segment_bytes) + + def encrypt(self, plaintext): + if len(plaintext) % self._segment_bytes != 0: + raise ValueError('plaintext block must be a multiple of segment_size') + + plaintext = _string_to_bytes(plaintext) + + # Break block into segments + encrypted = [ ] + for i in xrange(0, len(plaintext), self._segment_bytes): + plaintext_segment = plaintext[i: i + self._segment_bytes] + xor_segment = self._aes.encrypt(self._shift_register)[:len(plaintext_segment)] + cipher_segment = [ (p ^ x) for (p, x) in zip(plaintext_segment, xor_segment) ] + + # Shift the top bits out and the ciphertext in + self._shift_register = _concat_list(self._shift_register[len(cipher_segment):], cipher_segment) + + encrypted.extend(cipher_segment) + + return _bytes_to_string(encrypted) + + def decrypt(self, ciphertext): + if len(ciphertext) % self._segment_bytes != 0: + raise ValueError('ciphertext block must be a multiple of segment_size') + + ciphertext = _string_to_bytes(ciphertext) + + # Break block into segments + decrypted = [ ] + for i in xrange(0, len(ciphertext), self._segment_bytes): + cipher_segment = ciphertext[i: i + self._segment_bytes] + xor_segment = self._aes.encrypt(self._shift_register)[:len(cipher_segment)] + plaintext_segment = [ (p ^ x) for (p, x) in zip(cipher_segment, xor_segment) ] + + # Shift the top bits out and the ciphertext in + self._shift_register = _concat_list(self._shift_register[len(cipher_segment):], cipher_segment) + + decrypted.extend(plaintext_segment) + + return _bytes_to_string(decrypted) + + + +class AESModeOfOperationOFB(AESStreamModeOfOperation): + '''AES Output Feedback Mode of Operation. + + o A stream-cipher, so input does not need to be padded to blocks, + allowing arbitrary length data. + o A bit twiddled in the cipher text, twiddles the same bit in the + same bit in the plain text, which can be useful for error + correction techniques. + + Also see: + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_feedback_.28OFB.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.4''' + + + name = "Output Feedback (OFB)" + + def __init__(self, key, iv = None): + if iv is None: + self._last_precipherblock = [ 0 ] * 16 + elif len(iv) != 16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._last_precipherblock = _string_to_bytes(iv) + + self._remaining_block = [ ] + + AESBlockModeOfOperation.__init__(self, key) + + def encrypt(self, plaintext): + encrypted = [ ] + for p in _string_to_bytes(plaintext): + if len(self._remaining_block) == 0: + self._remaining_block = self._aes.encrypt(self._last_precipherblock) + self._last_precipherblock = [ ] + precipherbyte = self._remaining_block.pop(0) + self._last_precipherblock.append(precipherbyte) + cipherbyte = p ^ precipherbyte + encrypted.append(cipherbyte) + + return _bytes_to_string(encrypted) + + def decrypt(self, ciphertext): + # AES-OFB is symetric + return self.encrypt(ciphertext) + + + +class AESModeOfOperationCTR(AESStreamModeOfOperation): + '''AES Counter Mode of Operation. + + o A stream-cipher, so input does not need to be padded to blocks, + allowing arbitrary length data. + o The counter must be the same size as the key size (ie. len(key)) + o Each block independant of the other, so a corrupt byte will not + damage future blocks. + o Each block has a uniue counter value associated with it, which + contributes to the encrypted value, so no data patterns are + leaked. + o Also known as: Counter Mode (CM), Integer Counter Mode (ICM) and + Segmented Integer Counter (SIC + + Security Notes: + o This method (and CBC) ARE recommended. + o Each message block is associated with a counter value which must be + unique for ALL messages with the same key. Otherwise security may be + compromised. + + Also see: + + o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29 + o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.5 + and Appendix B for managing the initial counter''' + + + name = "Counter (CTR)" + + def __init__(self, key, counter = None): + AESBlockModeOfOperation.__init__(self, key) + + if counter is None: + counter = Counter() + + self._counter = counter + self._remaining_counter = [ ] + + def encrypt(self, plaintext): + while len(self._remaining_counter) < len(plaintext): + self._remaining_counter += self._aes.encrypt(self._counter.value) + self._counter.increment() + + plaintext = _string_to_bytes(plaintext) + + encrypted = [ (p ^ c) for (p, c) in zip(plaintext, self._remaining_counter) ] + self._remaining_counter = self._remaining_counter[len(encrypted):] + + return _bytes_to_string(encrypted) + + def decrypt(self, crypttext): + # AES-CTR is symetric + return self.encrypt(crypttext) + + +# Simple lookup table for each mode +AESModesOfOperation = dict( + ctr = AESModeOfOperationCTR, + cbc = AESModeOfOperationCBC, + cfb = AESModeOfOperationCFB, + ecb = AESModeOfOperationECB, + ofb = AESModeOfOperationOFB, +) diff --git a/Contents/Libraries/Shared/pyaes/blockfeeder.py b/Contents/Libraries/Shared/pyaes/blockfeeder.py new file mode 100644 index 000000000..b9a904d22 --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/blockfeeder.py @@ -0,0 +1,227 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# 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 .aes import AESBlockModeOfOperation, AESSegmentModeOfOperation, AESStreamModeOfOperation +from .util import append_PKCS7_padding, strip_PKCS7_padding, to_bufferable + + +# First we inject three functions to each of the modes of operations +# +# _can_consume(size) +# - Given a size, determine how many bytes could be consumed in +# a single call to either the decrypt or encrypt method +# +# _final_encrypt(data, padding = PADDING_DEFAULT) +# - call and return encrypt on this (last) chunk of data, +# padding as necessary; this will always be at least 16 +# bytes unless the total incoming input was less than 16 +# bytes +# +# _final_decrypt(data, padding = PADDING_DEFAULT) +# - same as _final_encrypt except for decrypt, for +# stripping off padding +# + +PADDING_NONE = 'none' +PADDING_DEFAULT = 'default' + +# @TODO: Ciphertext stealing and explicit PKCS#7 +# PADDING_CIPHERTEXT_STEALING +# PADDING_PKCS7 + +# ECB and CBC are block-only ciphers + +def _block_can_consume(self, size): + if size >= 16: return 16 + return 0 + +# After padding, we may have more than one block +def _block_final_encrypt(self, data, padding = PADDING_DEFAULT): + if padding == PADDING_DEFAULT: + data = append_PKCS7_padding(data) + + elif padding == PADDING_NONE: + if len(data) != 16: + raise Exception('invalid data length for final block') + else: + raise Exception('invalid padding option') + + if len(data) == 32: + return self.encrypt(data[:16]) + self.encrypt(data[16:]) + + return self.encrypt(data) + + +def _block_final_decrypt(self, data, padding = PADDING_DEFAULT): + if padding == PADDING_DEFAULT: + return strip_PKCS7_padding(self.decrypt(data)) + + if padding == PADDING_NONE: + if len(data) != 16: + raise Exception('invalid data length for final block') + return self.decrypt(data) + + raise Exception('invalid padding option') + +AESBlockModeOfOperation._can_consume = _block_can_consume +AESBlockModeOfOperation._final_encrypt = _block_final_encrypt +AESBlockModeOfOperation._final_decrypt = _block_final_decrypt + + + +# CFB is a segment cipher + +def _segment_can_consume(self, size): + return self.segment_bytes * int(size // self.segment_bytes) + +# CFB can handle a non-segment-sized block at the end using the remaining cipherblock +def _segment_final_encrypt(self, data, padding = PADDING_DEFAULT): + if padding != PADDING_DEFAULT: + raise Exception('invalid padding option') + + faux_padding = (chr(0) * (self.segment_bytes - (len(data) % self.segment_bytes))) + padded = data + to_bufferable(faux_padding) + return self.encrypt(padded)[:len(data)] + +# CFB can handle a non-segment-sized block at the end using the remaining cipherblock +def _segment_final_decrypt(self, data, padding = PADDING_DEFAULT): + if padding != PADDING_DEFAULT: + raise Exception('invalid padding option') + + faux_padding = (chr(0) * (self.segment_bytes - (len(data) % self.segment_bytes))) + padded = data + to_bufferable(faux_padding) + return self.decrypt(padded)[:len(data)] + +AESSegmentModeOfOperation._can_consume = _segment_can_consume +AESSegmentModeOfOperation._final_encrypt = _segment_final_encrypt +AESSegmentModeOfOperation._final_decrypt = _segment_final_decrypt + + + +# OFB and CTR are stream ciphers + +def _stream_can_consume(self, size): + return size + +def _stream_final_encrypt(self, data, padding = PADDING_DEFAULT): + if padding not in [PADDING_NONE, PADDING_DEFAULT]: + raise Exception('invalid padding option') + + return self.encrypt(data) + +def _stream_final_decrypt(self, data, padding = PADDING_DEFAULT): + if padding not in [PADDING_NONE, PADDING_DEFAULT]: + raise Exception('invalid padding option') + + return self.decrypt(data) + +AESStreamModeOfOperation._can_consume = _stream_can_consume +AESStreamModeOfOperation._final_encrypt = _stream_final_encrypt +AESStreamModeOfOperation._final_decrypt = _stream_final_decrypt + + + +class BlockFeeder(object): + '''The super-class for objects to handle chunking a stream of bytes + into the appropriate block size for the underlying mode of operation + and applying (or stripping) padding, as necessary.''' + + def __init__(self, mode, feed, final, padding = PADDING_DEFAULT): + self._mode = mode + self._feed = feed + self._final = final + self._buffer = to_bufferable("") + self._padding = padding + + def feed(self, data = None): + '''Provide bytes to encrypt (or decrypt), returning any bytes + possible from this or any previous calls to feed. + + Call with None or an empty string to flush the mode of + operation and return any final bytes; no further calls to + feed may be made.''' + + if self._buffer is None: + raise ValueError('already finished feeder') + + # Finalize; process the spare bytes we were keeping + if data is None: + result = self._final(self._buffer, self._padding) + self._buffer = None + return result + + self._buffer += to_bufferable(data) + + # We keep 16 bytes around so we can determine padding + result = to_bufferable('') + while len(self._buffer) > 16: + can_consume = self._mode._can_consume(len(self._buffer) - 16) + if can_consume == 0: break + result += self._feed(self._buffer[:can_consume]) + self._buffer = self._buffer[can_consume:] + + return result + + +class Encrypter(BlockFeeder): + 'Accepts bytes of plaintext and returns encrypted ciphertext.' + + def __init__(self, mode, padding = PADDING_DEFAULT): + BlockFeeder.__init__(self, mode, mode.encrypt, mode._final_encrypt, padding) + + +class Decrypter(BlockFeeder): + 'Accepts bytes of ciphertext and returns decrypted plaintext.' + + def __init__(self, mode, padding = PADDING_DEFAULT): + BlockFeeder.__init__(self, mode, mode.decrypt, mode._final_decrypt, padding) + + +# 8kb blocks +BLOCK_SIZE = (1 << 13) + +def _feed_stream(feeder, in_stream, out_stream, block_size = BLOCK_SIZE): + 'Uses feeder to read and convert from in_stream and write to out_stream.' + + while True: + chunk = in_stream.read(block_size) + if not chunk: + break + converted = feeder.feed(chunk) + out_stream.write(converted) + converted = feeder.feed() + out_stream.write(converted) + + +def encrypt_stream(mode, in_stream, out_stream, block_size = BLOCK_SIZE, padding = PADDING_DEFAULT): + 'Encrypts a stream of bytes from in_stream to out_stream using mode.' + + encrypter = Encrypter(mode, padding = padding) + _feed_stream(encrypter, in_stream, out_stream, block_size) + + +def decrypt_stream(mode, in_stream, out_stream, block_size = BLOCK_SIZE, padding = PADDING_DEFAULT): + 'Decrypts a stream of bytes from in_stream to out_stream using mode.' + + decrypter = Decrypter(mode, padding = padding) + _feed_stream(decrypter, in_stream, out_stream, block_size) diff --git a/Contents/Libraries/Shared/pyaes/util.py b/Contents/Libraries/Shared/pyaes/util.py new file mode 100644 index 000000000..081a37594 --- /dev/null +++ b/Contents/Libraries/Shared/pyaes/util.py @@ -0,0 +1,60 @@ +# The MIT License (MIT) +# +# Copyright (c) 2014 Richard Moore +# +# 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. + +# Why to_bufferable? +# Python 3 is very different from Python 2.x when it comes to strings of text +# and strings of bytes; in Python 3, strings of bytes do not exist, instead to +# represent arbitrary binary data, we must use the "bytes" object. This method +# ensures the object behaves as we need it to. + +def to_bufferable(binary): + return binary + +def _get_byte(c): + return ord(c) + +try: + xrange +except: + + def to_bufferable(binary): + if isinstance(binary, bytes): + return binary + return bytes(ord(b) for b in binary) + + def _get_byte(c): + return c + +def append_PKCS7_padding(data): + pad = 16 - (len(data) % 16) + return data + to_bufferable(chr(pad) * pad) + +def strip_PKCS7_padding(data): + if len(data) % 16 != 0: + raise ValueError("invalid length") + + pad = _get_byte(data[-1]) + + if pad > 16: + raise ValueError("invalid padding byte") + + return data[:-pad] diff --git a/Contents/Libraries/Shared/pyjsparser/__init__.py b/Contents/Libraries/Shared/pyjsparser/__init__.py new file mode 100644 index 000000000..2a9de69e9 --- /dev/null +++ b/Contents/Libraries/Shared/pyjsparser/__init__.py @@ -0,0 +1,4 @@ +__all__ = ['PyJsParser', 'parse', 'JsSyntaxError'] +__author__ = 'Piotr Dabkowski' +__version__ = '2.2.0' +from .parser import PyJsParser, parse, JsSyntaxError \ No newline at end of file diff --git a/Contents/Libraries/Shared/pyjsparser/parser.py b/Contents/Libraries/Shared/pyjsparser/parser.py new file mode 100644 index 000000000..a67869ce8 --- /dev/null +++ b/Contents/Libraries/Shared/pyjsparser/parser.py @@ -0,0 +1,2898 @@ +# The MIT License +# +# Copyright 2014, 2015 Piotr Dabkowski +# +# 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 +from .pyjsparserdata import * +from .std_nodes import * +from pprint import pprint +import sys + +__all__ = ['PyJsParser', 'parse', 'ENABLE_JS2PY_ERRORS', 'ENABLE_PYIMPORT', 'JsSyntaxError'] +REGEXP_SPECIAL_SINGLE = ('\\', '^', '$', '*', '+', '?', '.', '[', ']', '(', ')', '{', '{', '|', '-') +ENABLE_PYIMPORT = False +ENABLE_JS2PY_ERRORS = False + +PY3 = sys.version_info >= (3,0) + +if PY3: + basestring = str + long = int + xrange = range + unicode = str + +ESPRIMA_VERSION = '2.2.0' +DEBUG = False +# Small naming convention changes +# len -> leng +# id -> d +# type -> typ +# str -> st +true = True +false = False +null = None + + +class PyJsParser: + """ Usage: + parser = PyJsParser() + parser.parse('var JavaScriptCode = 5.1') + """ + + def __init__(self): + self.clean() + + def test(self, code): + pprint(self.parse(code)) + + def clean(self): + self.strict = None + self.sourceType = None + self.index = 0 + self.lineNumber = 1 + self.lineStart = 0 + self.hasLineTerminator = None + self.lastIndex = None + self.lastLineNumber = None + self.lastLineStart = None + self.startIndex = None + self.startLineNumber = None + self.startLineStart = None + self.scanning = None + self.lookahead = None + self.state = None + self.extra = None + self.isBindingElement = None + self.isAssignmentTarget = None + self.firstCoverInitializedNameError = None + + # 7.4 Comments + + def skipSingleLineComment(self, offset): + start = self.index - offset; + while self.index < self.length: + ch = self.source[self.index]; + self.index += 1 + if isLineTerminator(ch): + if (ord(ch) == 13 and ord(self.source[self.index]) == 10): + self.index += 1 + self.lineNumber += 1 + self.hasLineTerminator = True + self.lineStart = self.index + return + + def skipMultiLineComment(self): + while self.index < self.length: + ch = ord(self.source[self.index]) + if isLineTerminator(ch): + if (ch == 0x0D and ord(self.source[self.index + 1]) == 0x0A): + self.index += 1 + self.lineNumber += 1 + self.index += 1 + self.hasLineTerminator = True + self.lineStart = self.index + elif ch == 0x2A: + # Block comment ends with '*/'. + if ord(self.source[self.index + 1]) == 0x2F: + self.index += 2 + return + self.index += 1 + else: + self.index += 1 + self.tolerateUnexpectedToken() + + def skipComment(self): + self.hasLineTerminator = False + start = (self.index == 0) + while self.index < self.length: + ch = ord(self.source[self.index]) + if isWhiteSpace(ch): + self.index += 1 + elif isLineTerminator(ch): + self.hasLineTerminator = True + self.index += 1 + if (ch == 0x0D and ord(self.source[self.index]) == 0x0A): + self.index += 1 + self.lineNumber += 1 + self.lineStart = self.index + start = True + elif (ch == 0x2F): # U+002F is '/' + ch = ord(self.source[self.index + 1]) + if (ch == 0x2F): + self.index += 2 + self.skipSingleLineComment(2) + start = True + elif (ch == 0x2A): # U+002A is '*' + self.index += 2 + self.skipMultiLineComment() + else: + break + elif (start and ch == 0x2D): # U+002D is '-' + # U+003E is '>' + if (ord(self.source[self.index + 1]) == 0x2D) and (ord(self.source[self.index + 2]) == 0x3E): + # '-->' is a single-line comment + self.index += 3 + self.skipSingleLineComment(3) + else: + break + elif (ch == 0x3C): # U+003C is '<' + if self.source[self.index + 1: self.index + 4] == '!--': + # ", end, file=fp) diff --git a/Contents/Libraries/Shared/pysubs2/substation.py b/Contents/Libraries/Shared/pysubs2/substation.py index 0e5a1b707..808b94130 100644 --- a/Contents/Libraries/Shared/pysubs2/substation.py +++ b/Contents/Libraries/Shared/pysubs2/substation.py @@ -4,7 +4,7 @@ from .formatbase import FormatBase from .ssaevent import SSAEvent from .ssastyle import SSAStyle -from .common import text_type, Color +from .common import text_type, Color, PY3, binary_string_type from .time import make_time, ms_to_times, timestamp_to_ms, TIMESTAMP SSA_ALIGNMENT = (1, 2, 3, 9, 10, 11, 5, 6, 7) @@ -110,7 +110,7 @@ def parse_tags(text, style=SSAStyle.DEFAULT_STYLE, styles={}): def apply_overrides(all_overrides): s = style.copy() - for tag in re.findall(r"\\[ibus][10]|\\r[a-zA-Z_0-9 ]*", all_overrides): + for tag in re.findall(r"\\[ibusp][0-9]|\\r[a-zA-Z_0-9 ]*", all_overrides): if tag == r"\r": s = style.copy() # reset to original line style elif tag.startswith(r"\r"): @@ -122,6 +122,13 @@ def apply_overrides(all_overrides): elif "b" in tag: s.bold = "1" in tag elif "u" in tag: s.underline = "1" in tag elif "s" in tag: s.strikeout = "1" in tag + elif "p" in tag: + try: + scale = int(tag[2:]) + except (ValueError, IndexError): + continue + + s.drawing = scale > 0 return s overrides = SSAEvent.OVERRIDE_SEQUENCE.findall(text) @@ -222,7 +229,7 @@ def to_file(cls, subs, fp, format_, header_notice=NOTICE, **kwargs): for k, v in subs.aegisub_project.items(): print(k, v, sep=": ", file=fp) - def field_to_string(f, v): + def field_to_string(f, v, line): if f in {"start", "end"}: return ms_to_timestamp(v) elif f == "marked": @@ -233,23 +240,31 @@ def field_to_string(f, v): return "-1" if v else "0" elif isinstance(v, (text_type, Number)): return text_type(v) + elif not PY3 and isinstance(v, binary_string_type): + # A convenience feature, see issue #12 - accept non-unicode strings + # when they are ASCII; this is useful in Python 2, especially for non-text + # fields like style names, where requiring Unicode type seems too stringent + if all(ord(c) < 128 for c in v): + return text_type(v) + else: + raise TypeError("Encountered binary string with non-ASCII codepoint in SubStation field {!r} for line {!r} - please use unicode string instead of str".format(f, line)) elif isinstance(v, Color): if format_ == "ass": return color_to_ass_rgba(v) else: return color_to_ssa_rgb(v) else: - raise TypeError("Unexpected type when writing a SubStation field") + raise TypeError("Unexpected type when writing a SubStation field {!r} for line {!r}".format(f, line)) print("\n[V4+ Styles]" if format_ == "ass" else "\n[V4 Styles]", file=fp) print(STYLE_FORMAT_LINE[format_], file=fp) for name, sty in subs.styles.items(): - fields = [field_to_string(f, getattr(sty, f)) for f in STYLE_FIELDS[format_]] + fields = [field_to_string(f, getattr(sty, f), sty) for f in STYLE_FIELDS[format_]] print("Style: %s" % name, *fields, sep=",", file=fp) print("\n[Events]", file=fp) print(EVENT_FORMAT_LINE[format_], file=fp) for ev in subs.events: - fields = [field_to_string(f, getattr(ev, f)) for f in EVENT_FIELDS[format_]] + fields = [field_to_string(f, getattr(ev, f), ev) for f in EVENT_FIELDS[format_]] print(ev.type, end=": ", file=fp) print(*fields, sep=",", file=fp) diff --git a/Contents/Libraries/Shared/python_anticaptcha/__init__.py b/Contents/Libraries/Shared/python_anticaptcha/__init__.py new file mode 100644 index 000000000..ac9f0550f --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/__init__.py @@ -0,0 +1,7 @@ +from .base import AnticaptchaClient +from .tasks import NoCaptchaTask, NoCaptchaTaskProxylessTask, ImageToTextTask, FunCaptchaTask +from .proxy import Proxy +from .exceptions import AnticaptchaException +from .fields import SimpleText, Image, WebLink, TextInput, Textarea, Checkbox, Select, Radio, ImageUpload + +AnticatpchaException = AnticaptchaException \ No newline at end of file diff --git a/Contents/Libraries/Shared/python_anticaptcha/base.py b/Contents/Libraries/Shared/python_anticaptcha/base.py new file mode 100644 index 000000000..fca8cdf53 --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/base.py @@ -0,0 +1,114 @@ +import requests +import time + +from six.moves.urllib_parse import urljoin +from .exceptions import AnticaptchaException + +SLEEP_EVERY_CHECK_FINISHED = 3 +MAXIMUM_JOIN_TIME = 60 * 5 + + +class Job(object): + client = None + task_id = None + _last_result = None + + def __init__(self, client, task_id): + self.client = client + self.task_id = task_id + + def _update(self): + self._last_result = self.client.getTaskResult(self.task_id) + + def check_is_ready(self): + self._update() + return self._last_result['status'] == 'ready' + + def get_solution_response(self): # Recaptcha + return self._last_result['solution']['gRecaptchaResponse'] + + def get_token_response(self): # Funcaptcha + return self._last_result['solution']['token'] + + def get_answers(self): + return self._last_result['solution']['answers'] + + def get_captcha_text(self): # Image + return self._last_result['solution']['text'] + + def report_incorrect(self): + return self.client.reportIncorrectImage(self.task_id) + + def join(self, maximum_time=None): + elapsed_time = 0 + maximum_time = maximum_time or MAXIMUM_JOIN_TIME + while not self.check_is_ready(): + time.sleep(SLEEP_EVERY_CHECK_FINISHED) + elapsed_time += SLEEP_EVERY_CHECK_FINISHED + if elapsed_time is not None and elapsed_time > maximum_time: + raise AnticaptchaException(None, 250, + "The execution time exceeded a maximum time of {} seconds. It takes {} seconds.".format( + maximum_time, elapsed_time)) + + +class AnticaptchaClient(object): + client_key = None + CREATE_TASK_URL = "/createTask" + TASK_RESULT_URL = "/getTaskResult" + BALANCE_URL = "/getBalance" + REPORT_IMAGE_URL = "/reportIncorrectImageCaptcha" + SOFT_ID = 847 + language_pool = "en" + + def __init__(self, client_key, language_pool="en", host="api.anti-captcha.com", use_ssl=True): + self.client_key = client_key + self.language_pool = language_pool + self.base_url = "{proto}://{host}/".format(proto="https" if use_ssl else "http", + host=host) + self.session = requests.Session() + + @property + def client_ip(self): + if not hasattr(self, '_client_ip'): + self._client_ip = self.session.get('http://httpbin.org/ip').json()['origin'] + return self._client_ip + + def _check_response(self, response): + if response.get('errorId', False) == 11: + response['errorDescription'] = "{} Your missing IP address is {}.".format(response['errorDescription'], + self.client_ip) + if response.get('errorId', False): + raise AnticaptchaException(response['errorId'], + response['errorCode'], + response['errorDescription']) + + def createTask(self, task): + request = {"clientKey": self.client_key, + "task": task.serialize(), + "softId": self.SOFT_ID, + "languagePool": self.language_pool, + } + response = self.session.post(urljoin(self.base_url, self.CREATE_TASK_URL), json=request).json() + self._check_response(response) + return Job(self, response['taskId']) + + def getTaskResult(self, task_id): + request = {"clientKey": self.client_key, + "taskId": task_id} + response = self.session.post(urljoin(self.base_url, self.TASK_RESULT_URL), json=request).json() + self._check_response(response) + return response + + def getBalance(self): + request = {"clientKey": self.client_key} + response = self.session.post(urljoin(self.base_url, self.BALANCE_URL), json=request).json() + self._check_response(response) + return response['balance'] + + def reportIncorrectImage(self, task_id): + request = {"clientKey": self.client_key, + "taskId": task_id + } + response = self.session.post(urljoin(self.base_url, self.REPORT_IMAGE_URL), json=request).json() + self._check_response(response) + return response.get('status', False) != False diff --git a/Contents/Libraries/Shared/python_anticaptcha/exceptions.py b/Contents/Libraries/Shared/python_anticaptcha/exceptions.py new file mode 100644 index 000000000..f37eb372c --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/exceptions.py @@ -0,0 +1,23 @@ +class AnticaptchaException(Exception): + def __init__(self, error_id, error_code, error_description, *args): + super(AnticaptchaException, self).__init__("[{}:{}]{}".format(error_code, error_id, error_description)) + self.error_description = error_description + self.error_id = error_id + self.error_code = error_code + + +AnticatpchaException = AnticaptchaException + + +class InvalidWidthException(AnticaptchaException): + def __init__(self, width): + self.width = width + msg = 'Invalid width (%s). Can be one of these: 100, 50, 33, 25.' % (self.width,) + super(InvalidWidthException, self).__init__("AC-1", 1, msg) + + +class MissingNameException(AnticaptchaException): + def __init__(self, cls): + self.cls = cls + msg = 'Missing name data in {0}. Provide {0}.__init__(name="X") or {0}.serialize(name="X")'.format(str(self.cls)) + super(MissingNameException, self).__init__("AC-2", 2, msg) diff --git a/Contents/Libraries/Shared/python_anticaptcha/fields.py b/Contents/Libraries/Shared/python_anticaptcha/fields.py new file mode 100644 index 000000000..9e6245946 --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/fields.py @@ -0,0 +1,199 @@ +import six +from python_anticaptcha.exceptions import InvalidWidthException, MissingNameException + + +class BaseField(object): + label = None + labelHint = None + + def serialize(self, name=None): + data = {} + if self.label: + data['label'] = self.label or False + if self.labelHint: + data['labelHint'] = self.labelHint or False + return data + + +class NameBaseField(BaseField): + name = None + + def serialize(self, name=None): + data = super(NameBaseField, self).serialize(name) + if name: + data['name'] = name + elif self.name: + data['name'] = self.name + else: + raise MissingNameException(cls=self.__class__) + return data + + +class SimpleText(BaseField): + contentType = 'text' + + def __init__(self, content, label=None, labelHint=None, width=None): + self.label = label + self.labelHint = labelHint + + self.content = content + self.width = width + + def serialize(self, name=None): + data = super(SimpleText, self).serialize(name) + data['contentType'] = self.contentType + data['content'] = self.content + + if self.width: + if self.width not in [100, 50, 33, 25]: + raise InvalidWidthException(self.width) + data['inputOptions'] = {} + data['width'] = self.width + return data + + +class Image(BaseField): + contentType = 'image' + + def __init__(self, imageUrl, label=None, labelHint=None): + self.label = label + self.labelHint = labelHint + self.imageUrl = imageUrl + + def serialize(self, name=None): + data = super(Image, self).serialize(name) + data['contentType'] = self.contentType + data['content'] = self.imageUrl + return data + + +class WebLink(BaseField): + contentType = 'link' + + def __init__(self, linkText, linkUrl, label=None, labelHint=None, width=None): + self.label = label + self.labelHint = labelHint + + self.linkText = linkText + self.linkUrl = linkUrl + + self.width = width + + def serialize(self, name=None): + data = super(WebLink, self).serialize(name) + data['contentType'] = self.contentType + + if self.width: + if self.width not in [100, 50, 33, 25]: + raise InvalidWidthException(self.width) + data['inputOptions'] = {} + data['width'] = self.width + + data.update({'content': {'url': self.linkUrl, + 'text': self.linkText}}) + + return data + + +class TextInput(NameBaseField): + def __init__(self, placeHolder=None, label=None, labelHint=None, width=None): + self.label = label + self.labelHint = labelHint + + self.placeHolder = placeHolder + + self.width = width + + def serialize(self, name=None): + data = super(TextInput, self).serialize(name) + data['inputType'] = 'text' + + data['inputOptions'] = {} + + if self.width: + if self.width not in [100, 50, 33, 25]: + raise InvalidWidthException(self.width) + + data['inputOptions']['width'] = str(self.width) + + if self.placeHolder: + data['inputOptions']['placeHolder'] = self.placeHolder + return data + + +class Textarea(NameBaseField): + def __init__(self, placeHolder=None, rows=None, label=None, width=None, labelHint=None): + self.label = label + self.labelHint = labelHint + + self.placeHolder = placeHolder + self.rows = rows + self.width = width + + def serialize(self, name=None): + data = super(Textarea, self).serialize(name) + data['inputType'] = 'textarea' + data['inputOptions'] = {} + if self.rows: + data['inputOptions']['rows'] = str(self.rows) + if self.placeHolder: + data['inputOptions']['placeHolder'] = self.placeHolder + if self.width: + data['inputOptions']['width'] = str(self.width) + return data + + +class Checkbox(NameBaseField): + def __init__(self, text, label=None, labelHint=None): + self.label = label + self.labelHint = labelHint + + self.text = text + + def serialize(self, name=None): + data = super(Checkbox, self).serialize(name) + data['inputType'] = 'checkbox' + data['inputOptions'] = {'label': self.text} + return data + + +class Select(NameBaseField): + type = 'select' + + def __init__(self, label=None, choices=None, labelHint=None): + self.label = label + self.labelHint = labelHint + self.choices = choices or () + + def get_choices(self): + for choice in self.choices: + if isinstance(choice, six.text_type): + yield choice, choice + else: + yield choice + + def serialize(self, name=None): + data = super(Select, self).serialize(name) + data['inputType'] = self.type + + data['inputOptions'] = [] + for value, caption in self.get_choices(): + data['inputOptions'].append({"value": value, + "caption": caption}) + + return data + + +class Radio(Select): + type = 'radio' + + +class ImageUpload(NameBaseField): + def __init__(self, label=None, labelHint=None): + self.label = label + self.labelHint = labelHint + + def serialize(self, name=None): + data = super(ImageUpload, self).serialize(name) + data['inputType'] = 'imageUpload' + return data diff --git a/Contents/Libraries/Shared/python_anticaptcha/proxy.py b/Contents/Libraries/Shared/python_anticaptcha/proxy.py new file mode 100644 index 000000000..907232f7e --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/proxy.py @@ -0,0 +1,28 @@ +from six.moves.urllib_parse import urlparse + + +class Proxy(object): + def __init__(self, proxy_type, proxy_address, proxy_port, proxy_login, proxy_password): + self.proxyType = proxy_type + self.proxyAddress = proxy_address + self.proxyPort = proxy_port + self.proxyLogin = proxy_login + self.proxyPassword = proxy_password + + def serialize(self): + result = {'proxyType': self.proxyType, + 'proxyAddress': self.proxyAddress, + 'proxyPort': self.proxyPort} + if self.proxyLogin or self.proxyPassword: + result['proxyLogin'] = self.proxyLogin + result['proxyPassword'] = self.proxyPassword + return result + + @classmethod + def parse_url(cls, url): + parsed = urlparse(url) + return cls(proxy_type=parsed.scheme, + proxy_address=parsed.hostname, + proxy_port=parsed.port, + proxy_login=parsed.username, + proxy_password=parsed.password) diff --git a/Contents/Libraries/Shared/python_anticaptcha/tasks.py b/Contents/Libraries/Shared/python_anticaptcha/tasks.py new file mode 100644 index 000000000..57462763f --- /dev/null +++ b/Contents/Libraries/Shared/python_anticaptcha/tasks.py @@ -0,0 +1,128 @@ +import base64 +from .fields import BaseField + + +class BaseTask(object): + def serialize(self, **result): + return result + + +class ProxyMixin(BaseTask): + def __init__(self, *args, **kwargs): + self.proxy = kwargs.pop('proxy') + self.userAgent = kwargs.pop('user_agent') + self.cookies = kwargs.pop('cookies', '') + super(ProxyMixin, self).__init__(*args, **kwargs) + + def serialize(self, **result): + result = super(ProxyMixin, self).serialize(**result) + result.update(self.proxy.serialize()) + result['userAgent'] = self.userAgent + if self.cookies: + result['cookies'] = self.cookies + return result + + +class NoCaptchaTaskProxylessTask(BaseTask): + type = "NoCaptchaTaskProxyless" + websiteURL = None + websiteKey = None + websiteSToken = None + + def __init__(self, website_url, website_key, website_s_token=None, is_invisible=None): + self.websiteURL = website_url + self.websiteKey = website_key + self.websiteSToken = website_s_token + self.isInvisible = is_invisible + + def serialize(self): + data = {'type': self.type, + 'websiteURL': self.websiteURL, + 'websiteKey': self.websiteKey} + if self.websiteSToken is not None: + data['websiteSToken'] = self.websiteSToken + if self.isInvisible is not None: + data['isInvisible'] = self.isInvisible + return data + + +class FunCaptchaTask(ProxyMixin): + type = "FunCaptchaTask" + websiteURL = None + websiteKey = None + + def __init__(self, website_url, website_key, *args, **kwargs): + self.websiteURL = website_url + self.websiteKey = website_key + super(FunCaptchaTask, self).__init__(*args, **kwargs) + + def serialize(self, **result): + result = super(FunCaptchaTask, self).serialize(**result) + result.update({'type': self.type, + 'websiteURL': self.websiteURL, + 'websitePublicKey': self.websiteKey}) + return result + + +class NoCaptchaTask(ProxyMixin, NoCaptchaTaskProxylessTask): + type = "NoCaptchaTask" + + +class ImageToTextTask(object): + type = "ImageToTextTask" + fp = None + phrase = None + case = None + numeric = None + math = None + minLength = None + maxLength = None + + def __init__(self, fp, phrase=None, case=None, numeric=None, math=None, min_length=None, max_length=None): + self.fp = fp + self.phrase = phrase + self.case = case + self.numeric = numeric + self.math = math + self.minLength = min_length + self.maxLength = max_length + + def serialize(self): + return {'type': self.type, + 'body': base64.b64encode(self.fp.read()).decode('utf-8'), + 'phrase': self.phrase, + 'case': self.case, + 'numeric': self.numeric, + 'math': self.math, + 'minLength': self.minLength, + 'maxLength': self.maxLength} + + +class CustomCaptchaTask(BaseTask): + type = 'CustomCaptchaTask' + imageUrl = None + assignment = None + form = None + + def __init__(self, imageUrl, form=None, assignment=None): + self.imageUrl = imageUrl + self.form = form or {} + self.assignment = assignment + + def serialize(self): + data = super(CustomCaptchaTask, self).serialize() + data.update({'type': self.type, + 'imageUrl': self.imageUrl}) + if self.form: + forms = [] + for name, field in self.form.items(): + if isinstance(field, BaseField): + forms.append(field.serialize(name)) + else: + field = field.copy() + field['name'] = name + forms.append(field) + data['forms'] = forms + if self.assignment: + data['assignment'] = self.assignment + return data diff --git a/Contents/Libraries/Shared/requests/__init__.py b/Contents/Libraries/Shared/requests/__init__.py index 1665d4b95..bc168ee53 100644 --- a/Contents/Libraries/Shared/requests/__init__.py +++ b/Contents/Libraries/Shared/requests/__init__.py @@ -6,7 +6,7 @@ # / """ -Requests HTTP library +Requests HTTP Library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET @@ -22,7 +22,7 @@ ... or POST: >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> r = requests.post('https://httpbin.org/post', data=payload) >>> print(r.text) { ... @@ -36,31 +36,81 @@ The other HTTP methods are supported - see `requests.api`. Full documentation is at . -:copyright: (c) 2016 by Kenneth Reitz. +:copyright: (c) 2017 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. """ -__title__ = 'requests' -__version__ = '2.13.0' -__build__ = 0x021300 -__author__ = 'Kenneth Reitz' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2016 Kenneth Reitz' +import urllib3 +import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) # Attempt to enable urllib3's SNI support, if possible try: - from .packages.urllib3.contrib import pyopenssl + from urllib3.contrib import pyopenssl pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) except ImportError: pass -import warnings - # urllib3's DependencyWarnings should be silenced. -from .packages.urllib3.exceptions import DependencyWarning +from urllib3.exceptions import DependencyWarning warnings.simplefilter('ignore', DependencyWarning) +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + from . import utils +from . import packages from .models import Request, Response, PreparedRequest from .api import request, get, head, post, patch, put, delete, options from .sessions import session, Session @@ -73,12 +123,7 @@ # 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 +from logging import NullHandler logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/Contents/Libraries/Shared/requests/__version__.py b/Contents/Libraries/Shared/requests/__version__.py new file mode 100644 index 000000000..f5b5d0367 --- /dev/null +++ b/Contents/Libraries/Shared/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.21.0' +__build__ = 0x022100 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/Contents/Libraries/Shared/requests/adapters.py b/Contents/Libraries/Shared/requests/adapters.py index 2475879c2..fa4d9b3cc 100644 --- a/Contents/Libraries/Shared/requests/adapters.py +++ b/Contents/Libraries/Shared/requests/adapters.py @@ -11,33 +11,37 @@ import os.path import socket +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.response import HTTPResponse +from urllib3.util import parse_url +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util.retry import Retry +from urllib3.exceptions import ClosedPoolError +from urllib3.exceptions import ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import MaxRetryError +from urllib3.exceptions import NewConnectionError +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ProtocolError +from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.exceptions import ResponseError +from urllib3.exceptions import LocationValueError + from .models import Response -from .packages.urllib3.poolmanager import PoolManager, proxy_from_url -from .packages.urllib3.response import HTTPResponse -from .packages.urllib3.util import Timeout as TimeoutSauce -from .packages.urllib3.util.retry import Retry 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, - select_proxy, to_native_string) +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) from .structures import CaseInsensitiveDict -from .packages.urllib3.exceptions import ClosedPoolError -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 NewConnectionError -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, InvalidSchema) + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL) from .auth import _basic_auth_str try: - from .packages.urllib3.contrib.socks import SOCKSProxyManager + from urllib3.contrib.socks import SOCKSProxyManager except ImportError: def SOCKSProxyManager(*args, **kwargs): raise InvalidSchema("Missing dependencies for SOCKS support.") @@ -64,7 +68,9 @@ def send(self, request, stream=False, timeout=None, verify=True, data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. :type timeout: float or tuple - :param verify: (optional) Whether to verify SSL certificates. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. """ @@ -123,8 +129,7 @@ def __init__(self, pool_connections=DEFAULT_POOLSIZE, 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__) + return {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 @@ -168,7 +173,7 @@ def proxy_manager_for(self, proxy, **proxy_kwargs): :param proxy: The proxy to return a urllib3 ProxyManager for. :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. :returns: ProxyManager - :rtype: requests.packages.urllib3.ProxyManager + :rtype: urllib3.ProxyManager """ if proxy in self.proxy_manager: manager = self.proxy_manager[proxy] @@ -202,7 +207,9 @@ def cert_verify(self, conn, url, verify, cert): :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 verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use :param cert: The SSL certificate to verify. """ if url.lower().startswith('https') and verify: @@ -214,10 +221,11 @@ def cert_verify(self, conn, url, verify, cert): cert_loc = verify if not cert_loc: - cert_loc = DEFAULT_CA_BUNDLE_PATH + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - if not cert_loc: - raise Exception("Could not find a suitable SSL CA certificate bundle.") + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) conn.cert_reqs = 'CERT_REQUIRED' @@ -236,6 +244,13 @@ def cert_verify(self, conn, url, verify, cert): conn.key_file = cert[1] else: conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) def build_response(self, req, resp): """Builds a :class:`Response ` object from a urllib3 @@ -281,12 +296,16 @@ def get_connection(self, url, proxies=None): :param url: The URL to connect to. :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: requests.packages.urllib3.ConnectionPool + :rtype: urllib3.ConnectionPool """ proxy = select_proxy(url, proxies) if proxy: proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") proxy_manager = self.proxy_manager_for(proxy) conn = proxy_manager.connection_from_url(url) else: @@ -360,7 +379,7 @@ def proxy_headers(self, proxy): when subclassing the :class:`HTTPAdapter `. - :param proxies: The url of the proxy being used for this request. + :param proxy: The url of the proxy being used for this request. :rtype: dict """ headers = {} @@ -380,18 +399,23 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. - :type timeout: float or tuple - :param verify: (optional) Whether to verify SSL certificates. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. :rtype: requests.Response """ - conn = self.get_connection(request.url, proxies) + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) self.cert_verify(conn, request.url, verify, cert) url = self.request_url(request, proxies) - self.add_headers(request) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) chunked = not (request.body is None or 'Content-Length' in request.headers) @@ -401,10 +425,12 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox 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) " + err = ("Invalid timeout {}. Pass a (connect, read) " "timeout tuple, or a single float to set " "both timeouts to the same value".format(timeout)) raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass else: timeout = TimeoutSauce(connect=timeout, read=timeout) @@ -449,11 +475,10 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox # Receive the response from the server try: - # For Python 2.7+ versions, use buffering of HTTP - # responses + # For Python 2.7, use buffering of HTTP responses r = low_conn.getresponse(buffering=True) except TypeError: - # For compatibility with Python 2.6 versions and back + # For compatibility with Python 3.3+ r = low_conn.getresponse() resp = HTTPResponse.from_httplib( @@ -484,6 +509,10 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox if isinstance(e.reason, _ProxyError): raise ProxyError(e, request=request) + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + raise ConnectionError(e, request=request) except ClosedPoolError as e: @@ -494,6 +523,7 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 raise SSLError(e, request=request) elif isinstance(e, ReadTimeoutError): raise ReadTimeout(e, request=request) diff --git a/Contents/Libraries/Shared/requests/api.py b/Contents/Libraries/Shared/requests/api.py index 16fd1e94f..abada96d4 100644 --- a/Contents/Libraries/Shared/requests/api.py +++ b/Contents/Libraries/Shared/requests/api.py @@ -18,9 +18,11 @@ def request(method, url, **kwargs): :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 params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object 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': file-tuple}``) for multipart encoding upload. @@ -29,14 +31,16 @@ def request(method, url, **kwargs): defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers to add for the file. :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 + :param timeout: (optional) How many seconds to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) ` tuple. :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. :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. :return: :class:`Response ` object @@ -45,7 +49,7 @@ def request(method, url, **kwargs): Usage:: >>> import requests - >>> req = requests.request('GET', 'http://httpbin.org/get') + >>> req = requests.request('GET', 'https://httpbin.org/get') """ @@ -57,10 +61,11 @@ def request(method, url, **kwargs): def get(url, params=None, **kwargs): - """Sends a GET request. + r"""Sends a GET request. :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 params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response @@ -71,7 +76,7 @@ def get(url, params=None, **kwargs): def options(url, **kwargs): - """Sends a OPTIONS request. + r"""Sends an OPTIONS request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -84,7 +89,7 @@ def options(url, **kwargs): def head(url, **kwargs): - """Sends a HEAD request. + r"""Sends a HEAD request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -97,10 +102,11 @@ def head(url, **kwargs): def post(url, data=None, json=None, **kwargs): - """Sends a POST request. + r"""Sends a POST request. :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 data: (optional) Dictionary, list of tuples, 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: :class:`Response ` object @@ -111,10 +117,11 @@ def post(url, data=None, json=None, **kwargs): def put(url, data=None, **kwargs): - """Sends a PUT request. + r"""Sends a PUT request. :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 data: (optional) Dictionary, list of tuples, 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: :class:`Response ` object @@ -125,21 +132,22 @@ def put(url, data=None, **kwargs): def patch(url, data=None, **kwargs): - """Sends a PATCH request. + r"""Sends a PATCH request. :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 data: (optional) Dictionary, list of tuples, 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: :class:`Response ` object :rtype: requests.Response """ - return request('patch', url, data=data, **kwargs) + return request('patch', url, data=data, **kwargs) def delete(url, **kwargs): - """Sends a DELETE request. + r"""Sends a DELETE request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. diff --git a/Contents/Libraries/Shared/requests/auth.py b/Contents/Libraries/Shared/requests/auth.py index 510846d69..bdde51c7f 100644 --- a/Contents/Libraries/Shared/requests/auth.py +++ b/Contents/Libraries/Shared/requests/auth.py @@ -20,7 +20,6 @@ from .cookies import extract_cookies_to_jar from ._internal_utils import to_native_string from .utils import parse_dict_header -from .status_codes import codes CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' CONTENT_TYPE_MULTI_PART = 'multipart/form-data' @@ -39,7 +38,7 @@ def _basic_auth_str(username, password): if not isinstance(username, basestring): warnings.warn( "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " + "3.0.0. Please convert the object you've passed in ({!r}) to " "a string or bytes object in the near future to avoid " "problems.".format(username), category=DeprecationWarning, @@ -49,7 +48,7 @@ def _basic_auth_str(username, password): if not isinstance(password, basestring): warnings.warn( "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " + "3.0.0. Please convert the object you've passed in ({!r}) to " "a string or bytes object in the near future to avoid " "problems.".format(password), category=DeprecationWarning, @@ -154,6 +153,18 @@ def sha_utf8(x): x = x.encode('utf-8') return hashlib.sha1(x).hexdigest() hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) @@ -193,7 +204,7 @@ def sha_utf8(x): elif qop == 'auth' or 'auth' in qop.split(','): noncebit = "%s:%s:%s:%s:%s" % ( nonce, ncvalue, cnonce, 'auth', HA2 - ) + ) respdig = KD(HA1, noncebit) else: # XXX handle auth-int. @@ -227,6 +238,12 @@ def handle_401(self, r, **kwargs): :rtype: requests.Response """ + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + if self._thread_local.pos is not None: # Rewind the file position indicator of the body to where # it was to resend the request. diff --git a/Contents/Libraries/Shared/requests/cacert.pem b/Contents/Libraries/Shared/requests/cacert.pem deleted file mode 100644 index 108f9d631..000000000 --- a/Contents/Libraries/Shared/requests/cacert.pem +++ /dev/null @@ -1,5689 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Low-Value Services Root" -# Serial: 1 -# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc -# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d -# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Public Services Root" -# Serial: 1 -# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f -# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 -# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Qualified Certificates Root" -# Serial: 1 -# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb -# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf -# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3 -# Subject: O=RSA Security Inc OU=RSA Security 2048 V3 -# Label: "RSA Security 2048 v3" -# Serial: 13297492616345471454730593562152402946 -# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e -# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42 -# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Global CA 2" -# Serial: 1 -# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 -# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d -# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. -# Subject: CN=Certum CA O=Unizeto Sp. z o.o. -# Label: "Certum Root CA" -# Serial: 65568 -# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 -# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 -# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=Secure Certificate Services O=Comodo CA Limited -# Subject: CN=Secure Certificate Services O=Comodo CA Limited -# Label: "Comodo Secure Services root" -# Serial: 1 -# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd -# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 -# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- - -# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited -# Subject: CN=Trusted Certificate Services O=Comodo CA Limited -# Label: "Comodo Trusted Services root" -# Serial: 1 -# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 -# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd -# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Label: "UTN USERFirst Hardware Root CA" -# Serial: 91374294542884704022267039221184531197 -# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 -# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 -# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Chambers of Commerce Root" -# Serial: 0 -# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 -# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 -# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org -# Label: "Camerfirma Global Chambersign Root" -# Serial: 0 -# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 -# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 -# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 1 -# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 -# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f -# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 1" -# Serial: 122348795730808398873664200247279986742 -# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9 -# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51 -# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES -# Label: "DST ACES CA X6" -# Serial: 17771143917277623872238992636097467865 -# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 -# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d -# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA -# Label: "WellsSecure Public Root Certificate Authority" -# Serial: 1 -# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36 -# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee -# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43 ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 -# Label: "Security Communication EV RootCA1" -# Serial: 0 -# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 -# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d -# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA -# Label: "Microsec e-Szigno Root CA" -# Serial: 272122594155480254301341951808045322001 -# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5 -# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d -# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0 ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw -cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy -b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z -ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 -NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN -TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p -Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u -uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ -LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA -vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 -Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx -62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB -AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw -LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP -BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB -AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov -MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 -ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT -AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh -ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo -AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa -AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln -bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p -Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP -PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv -Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB -EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu -w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj -cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV -HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI -VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS -BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS -b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS -8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds -ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl -7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR -hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ -MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi -# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" -# Serial: 17 -# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 -# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 -# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 2 CA 1" -# Serial: 1 -# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23 -# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc -# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 -ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX -l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB -HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B -5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 -WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP -gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ -DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu -BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs -h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk -LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=CNNIC ROOT O=CNNIC -# Subject: CN=CNNIC ROOT O=CNNIC -# Label: "CNNIC ROOT" -# Serial: 1228079105 -# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19 -# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f -# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7 ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD -TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 -MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF -Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh -IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 -dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO -V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC -GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN -v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB -AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB -Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO -76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK -OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH -ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi -yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL -buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj -2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= ------END CERTIFICATE----- - -# Issuer: O=Japanese Government OU=ApplicationCA -# Subject: O=Japanese Government OU=ApplicationCA -# Label: "ApplicationCA - Japanese Government" -# Serial: 49 -# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6 -# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74 -# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19 ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc -MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp -b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT -AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs -aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H -j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K -f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 -IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw -FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht -QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm -/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ -k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ -MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC -seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ -hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ -eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U -DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj -B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) -# Label: "NetLock Arany (Class Gold) Főtanúsítvány" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI -# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI -# Label: "ACEDICOM Root" -# Serial: 7029493972724711941 -# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 -# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 -# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Autorité Racine" -# Serial: 1 -# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a -# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 -# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk -BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 -Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl -cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 -aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY -F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N -8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe -rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K -/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu -7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC -28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 -lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E -nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB -0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 -5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj -WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN -jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s -ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM -OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q -619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn -2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj -o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v -nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG -5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq -pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb -dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 -BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA -# Label: "Root CA Generalitat Valenciana" -# Serial: 994436456 -# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2 -# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46 -# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF -UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ -R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN -MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw -JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ -WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj -SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl -u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy -A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk -Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 -MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr -aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC -IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A -cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA -YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA -bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA -bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA -aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA -ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA -YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA -ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA -LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 -Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y -eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw -CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G -A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu -Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn -lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt -b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg -9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF -ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC -IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 45 -# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 -# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 -# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul -F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC -ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w -ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk -aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 -YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg -c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 -d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG -CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF -wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS -Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst -0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc -pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl -CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF -P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK -1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm -KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ -8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm -fyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Label: "StartCom Certification Authority G2" -# Serial: 59 -# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 -# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 -# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 -OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG -A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ -JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD -vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo -D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ -Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW -RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK -HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN -nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM -0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i -UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 -Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg -TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL -BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX -UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl -6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK -9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ -HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI -wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY -XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l -IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo -hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr -so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -# Label: "TURKTRUST Certificate Services Provider Root 2007" -# Serial: 1 -# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 -# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 -# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx -OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry -b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC -VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE -sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F -ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY -KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG -+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG -HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P -IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M -733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk -Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW -AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 -mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa -XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ -qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica -# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT -# Label: "PSCProcert" -# Serial: 11 -# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec -# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 -# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s -YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz -dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 -aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh -IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ -KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw -MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy -b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx -KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG -A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u -aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 -7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 -BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G -ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 -JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 -PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 -0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ -6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m -v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 -K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev -bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw -MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w -MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD -gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 -b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh -bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 -cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp -ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg -ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq -hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD -AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w -MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag -RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t -UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl -cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG -AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN -AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS -1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB -3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv -Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh -HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm -pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz -sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE -qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb -mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 -opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H -YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center -# Label: "China Internet Network Information Center EV Certificates Root" -# Serial: 1218379777 -# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15 -# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e -# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7 ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC -Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g -Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 -aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa -Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg -SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo -aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp -ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z -7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// -DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx -zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 -hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs -4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u -gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY -NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 -j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG -52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB -echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI -zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy -wy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root CA 2" -# Serial: 40698052477090394928831521023204026294 -# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19 -# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec -# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41 ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr -jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r -0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f -2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP -ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF -y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA -tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL -6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 -uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL -acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh -k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q -VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O -BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh -b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R -fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv -/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI -REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx -srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv -aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT -woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n -Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W -t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N -8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 -9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 -wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services -# Label: "Swisscom Root EV CA 2" -# Serial: 322973295377129385374608406479535262296 -# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec -# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b -# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d ------BEGIN CERTIFICATE----- -MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw -ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp -dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 -IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD -VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy -dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg -MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx -UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD -1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH -oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR -HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ -5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv -idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL -OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC -NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f -46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB -UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth -7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G -A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED -MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB -bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x -XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T -PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 -Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 -WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL -Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm -7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S -nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN -vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB -WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI -fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb -I+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R1 O=Disig a.s. -# Subject: CN=CA Disig Root R1 O=Disig a.s. -# Label: "CA Disig Root R1" -# Serial: 14052245610670616104 -# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a -# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 -# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy -MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk -D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o -OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A -fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe -IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n -oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK -/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj -rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD -3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE -7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC -yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd -qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI -hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA -SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo -HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB -emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC -AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb -7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x -DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk -F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF -a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT -Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited -# Label: "WoSign" -# Serial: 125491772294754854453622855443212256657 -# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d -# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb -# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 ------BEGIN CERTIFICATE----- -MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV -BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw -MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX -b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN -rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U -fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc -f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 -ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M -x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR -aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch -zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar -uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K -mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA -Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv -HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H -EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 -LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ -MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e -JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN -g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp -dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab -R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ -PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce -xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ -J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl -OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT -ee5Ehr7XHuQe+w== ------END CERTIFICATE----- - -# Issuer: CN=CA 沃通根证书 O=WoSign CA Limited -# Subject: CN=CA 沃通根证书 O=WoSign CA Limited -# Label: "WoSign China" -# Serial: 106921963437422998931660691310149453965 -# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 -# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 -# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 ------BEGIN CERTIFICATE----- -MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV -BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw -MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl -ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r -D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 -9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf -v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk -UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L -NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb -+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V -qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K -yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G -AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK -J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC -AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 -WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 -yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj -/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 -jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 -ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX -X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n -FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D -u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l -O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le -ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 -2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5" -# Serial: 156233699172481 -# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e -# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb -# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 ------BEGIN CERTIFICATE----- -MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE -BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn -aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg -QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 -MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD -VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom -/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR -Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 -4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z -5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 -hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID -AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX -SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l -VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq -URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf -peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF -Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW -+qtB4Uu2NQvAmxU= ------END CERTIFICATE----- - -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6" -# Serial: 138134509972618 -# MD5 Fingerprint: f8:c5:ee:2a:6b:be:95:8d:08:f7:25:4a:ea:71:3e:46 -# SHA1 Fingerprint: 8a:5c:8c:ee:a5:03:e6:05:56:ba:d8:1b:d4:f6:c9:b0:ed:e5:2f:e0 -# SHA256 Fingerprint: 8d:e7:86:55:e1:be:7f:78:47:80:0b:93:f6:94:d2:1d:36:8c:c0:6e:03:3e:7f:ab:04:bb:5e:b9:9d:a6:b7:00 ------BEGIN CERTIFICATE----- -MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQG -EwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdp -IMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBB -LsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBI -aXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5MDQxMFoXDTIzMTIx -NjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBLBgNV -BAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2 -ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVs -ZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdsGjW6L0UlqMACprx9MfMkU1x -eHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a2uqsxgbPJQ1BgfbBOCK9 -+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EEDwnS3/faA -z1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0p -u5FbHH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6p -lVxiSvgNZ1GpryHV+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMB -AAGjQjBAMB0GA1UdDgQWBBTdVRcT9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAb1gNl0Oq -FlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3RfdCaqaXKGDsC -QC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy -o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKID -gI6tflEATseWhvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm -9ocJV612ph1jmv3XZch4gyt1O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsG -tAuYSyher4hYyw== ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Subject: CN=Certification Authority of WoSign G2 O=WoSign CA Limited -# Label: "Certification Authority of WoSign G2" -# Serial: 142423943073812161787490648904721057092 -# MD5 Fingerprint: c8:1c:7d:19:aa:cb:71:93:f2:50:f8:52:a8:1e:ba:60 -# SHA1 Fingerprint: fb:ed:dc:90:65:b7:27:20:37:bc:55:0c:9c:56:de:bb:f2:78:94:e1 -# SHA256 Fingerprint: d4:87:a5:6f:83:b0:74:82:e8:5e:96:33:94:c1:ec:c2:c9:e5:1d:09:03:ee:94:6b:02:c3:01:58:1e:d9:9e:16 ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBY -MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNV -BAMTJENlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDEx -MDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgxCzAJBgNVBAYTAkNOMRowGAYDVQQK -ExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPX -JYY1kBaiXW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgO -gHzKtB0TiGsOqCR3A9DuW/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg -5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg95k4ot+vElbGs/V6r+kHLXZ1L3PR8du9n -fwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BKv0mUYQs4kI9dJGwlezt5 -2eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJ -KoZIhvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8 -fHulwqZm46qwtyeYP0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G -3CE4Q3RM+zD4F3LBMvzIkRfEzFg3TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yy -SrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu+sif/a+RZQp4OBXllxcU3fng -LDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+7Q9LGOHSJDy7 -XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= ------END CERTIFICATE----- - -# Issuer: CN=CA WoSign ECC Root O=WoSign CA Limited -# Subject: CN=CA WoSign ECC Root O=WoSign CA Limited -# Label: "CA WoSign ECC Root" -# Serial: 138625735294506723296996289575837012112 -# MD5 Fingerprint: 80:c6:53:ee:61:82:28:72:f0:ff:21:b9:17:ca:b2:20 -# SHA1 Fingerprint: d2:7a:d2:be:ed:94:c0:a1:3c:c7:25:21:ea:5d:71:be:81:19:f3:2b -# SHA256 Fingerprint: 8b:45:da:1c:06:f7:91:eb:0c:ab:f2:6b:e5:88:f5:fb:23:16:5c:2e:61:4b:f8:85:56:2d:0d:ce:50:b2:9b:02 ------BEGIN CERTIFICATE----- -MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQsw -CQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMT -EkNBIFdvU2lnbiBFQ0MgUm9vdDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4 -NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEb -MBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZIzj0CAQYFK4EEACID -YgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiUt5v8 -KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES -1ns2o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUqv3VWqP2h4syhf3RMluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB -1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0Daupn75OcsqF1NnstTJFGG+rrQIwfcf3 -aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYua/GRspBl9JrmkO5K ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G1 O=Certplus -# Subject: CN=Certplus Root CA G1 O=Certplus -# Label: "Certplus Root CA G1" -# Serial: 1491911565779898356709731176965615564637713 -# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 -# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 -# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa -MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy -dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a -iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt -6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP -0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f -6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE -EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN -1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc -h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT -mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV -4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO -WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud -DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd -Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq -hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 -/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS -S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j -2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R -Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr -RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy -6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV -V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 -g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl -++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -# Issuer: CN=Certplus Root CA G2 O=Certplus -# Subject: CN=Certplus Root CA G2 O=Certplus -# Label: "Certplus Root CA G2" -# Serial: 1492087096131536844209563509228951875861589 -# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 -# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a -# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x -CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs -dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat -93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x -Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj -FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG -SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch -p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal -U5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust -# Subject: CN=OpenTrust Root CA G1 O=OpenTrust -# Label: "OpenTrust Root CA G1" -# Serial: 1492036577811947013770400127034825178844775 -# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da -# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e -# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b -wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX -/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 -77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP -uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx -p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx -Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 -TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W -G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw -vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY -EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 -2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw -DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf -gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS -FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 -V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P -XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I -i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t -TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 -09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky -Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ -AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj -1oxx ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust -# Subject: CN=OpenTrust Root CA G2 O=OpenTrust -# Label: "OpenTrust Root CA G2" -# Serial: 1492012448042702096986875987676935573415441 -# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb -# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b -# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA -MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w -ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw -MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU -T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh -/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e -CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 -1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE -FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS -gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X -G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy -YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH -vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 -t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ -gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 -5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w -DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 -nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT -RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT -wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 -t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa -TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 -o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU -3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA -iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f -WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM -S1IK ------END CERTIFICATE----- - -# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust -# Subject: CN=OpenTrust Root CA G3 O=OpenTrust -# Label: "OpenTrust Root CA G3" -# Serial: 1492104908271485653071219941864171170455615 -# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 -# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 -# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx -CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U -cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow -QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl -blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm -3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d -oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 -DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK -BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q -j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx -4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure Certificate Authority" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/Contents/Libraries/Shared/requests/certs.py b/Contents/Libraries/Shared/requests/certs.py index f922b99d7..d1a378d78 100644 --- a/Contents/Libraries/Shared/requests/certs.py +++ b/Contents/Libraries/Shared/requests/certs.py @@ -5,21 +5,14 @@ requests.certs ~~~~~~~~~~~~~~ -This module returns the preferred default CA certificate bundle. +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. """ -import os.path - -try: - from certifi import where -except ImportError: - def where(): - """Return the preferred certificate bundle.""" - # vendored bundle inside Requests - return os.path.join(os.path.dirname(__file__), 'cacert.pem') +from certifi import where if __name__ == '__main__': print(where()) diff --git a/Contents/Libraries/Shared/requests/compat.py b/Contents/Libraries/Shared/requests/compat.py index f88e600d2..c44b35efb 100644 --- a/Contents/Libraries/Shared/requests/compat.py +++ b/Contents/Libraries/Shared/requests/compat.py @@ -8,7 +8,7 @@ Python 3. """ -from .packages import chardet +import chardet import sys @@ -27,9 +27,7 @@ try: import simplejson as json -except (ImportError, SyntaxError): - # simplejson does not support Python 3.2, it throws a SyntaxError - # because of u'...' Unicode literals. +except ImportError: import json # --------- @@ -37,13 +35,16 @@ # --------- if is_py2: - from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) 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 + from collections import Callable, Mapping, MutableMapping, OrderedDict + builtin_str = str bytes = str @@ -54,11 +55,12 @@ 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 urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment from http import cookiejar as cookielib from http.cookies import Morsel from io import StringIO from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping builtin_str = str str = str diff --git a/Contents/Libraries/Shared/requests/cookies.py b/Contents/Libraries/Shared/requests/cookies.py index 856fd45ec..56fccd9c2 100644 --- a/Contents/Libraries/Shared/requests/cookies.py +++ b/Contents/Libraries/Shared/requests/cookies.py @@ -12,15 +12,12 @@ import copy import time import calendar -import collections from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping try: import threading - # grr, pyflakes: this fixes "redefinition of unused 'threading'" - threading except ImportError: import dummy_threading as threading @@ -171,7 +168,7 @@ class CookieConflictError(RuntimeError): """ -class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. @@ -308,8 +305,10 @@ def get_dict(self, domain=None, path=None): """ dictionary = {} for cookie in iter(self): - if (domain is None or cookie.domain == domain) and (path is None - or cookie.path == path): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): dictionary[cookie.name] = cookie.value return dictionary @@ -415,9 +414,14 @@ def __setstate__(self, state): def copy(self): """Return a copy of this RequestsCookieJar.""" new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) new_cj.update(self) return new_cj + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + def _copy_cookie_jar(jar): if jar is None: @@ -440,20 +444,21 @@ def create_cookie(name, value, **kwargs): By default, the pair of `name` and `value` will be set for the domain '' and sent on every request (this is sometimes called a "supercookie"). """ - result = dict( - version=0, - name=name, - value=value, - port=None, - domain='', - path='/', - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False,) + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } badargs = set(kwargs) - set(result) if badargs: @@ -507,6 +512,7 @@ def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): :param cookiejar: (optional) A cookiejar to add the cookies to. :param overwrite: (optional) If False, will not replace cookies already in the jar with new ones. + :rtype: CookieJar """ if cookiejar is None: cookiejar = RequestsCookieJar() @@ -525,6 +531,7 @@ def merge_cookies(cookiejar, cookies): :param cookiejar: CookieJar object to add the cookies to. :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar """ if not isinstance(cookiejar, cookielib.CookieJar): raise ValueError('You can only merge into CookieJar') diff --git a/Contents/Libraries/Shared/requests/exceptions.py b/Contents/Libraries/Shared/requests/exceptions.py index 0658e7ec5..a80cad80f 100644 --- a/Contents/Libraries/Shared/requests/exceptions.py +++ b/Contents/Libraries/Shared/requests/exceptions.py @@ -6,7 +6,7 @@ This module contains the set of Requests' exceptions. """ -from .packages.urllib3.exceptions import HTTPError as BaseHTTPError +from urllib3.exceptions import HTTPError as BaseHTTPError class RequestException(IOError): @@ -85,6 +85,10 @@ class InvalidHeader(RequestException, ValueError): """The header value provided was somehow invalid.""" +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + class ChunkedEncodingError(RequestException): """The server declared chunked encoding but sent an invalid chunk.""" @@ -100,6 +104,7 @@ class StreamConsumedError(RequestException, TypeError): class RetryError(RequestException): """Custom retries logic failed""" + class UnrewindableBodyError(RequestException): """Requests encountered an error when trying to rewind a body""" @@ -114,3 +119,8 @@ class RequestsWarning(Warning): class FileModeWarning(RequestsWarning, DeprecationWarning): """A file was opened in text mode, but Requests determined its binary length.""" pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/Contents/Libraries/Shared/requests/help.py b/Contents/Libraries/Shared/requests/help.py new file mode 100644 index 000000000..e53d35ef6 --- /dev/null +++ b/Contents/Libraries/Shared/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + 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' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/Contents/Libraries/Shared/requests/hooks.py b/Contents/Libraries/Shared/requests/hooks.py index 32b32de75..7a51f212c 100644 --- a/Contents/Libraries/Shared/requests/hooks.py +++ b/Contents/Libraries/Shared/requests/hooks.py @@ -15,14 +15,14 @@ def default_hooks(): - return dict((event, []) for event in HOOKS) + return {event: [] for event in 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() + hooks = hooks or {} hooks = hooks.get(key) if hooks: if hasattr(hooks, '__call__'): diff --git a/Contents/Libraries/Shared/requests/models.py b/Contents/Libraries/Shared/requests/models.py index d1a9c8687..62dcd0b7c 100644 --- a/Contents/Libraries/Shared/requests/models.py +++ b/Contents/Libraries/Shared/requests/models.py @@ -7,26 +7,26 @@ This module contains the primary objects that power Requests. """ -import collections import datetime import sys # Import encoding now, to avoid implicit import later. # Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/kennethreitz/requests/issues/3578. +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. import encodings.idna -from io import BytesIO, UnsupportedOperation +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation from .hooks import default_hooks from .structures import CaseInsensitiveDict from .auth import HTTPBasicAuth from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .packages.urllib3.fields import RequestField -from .packages.urllib3.filepost import encode_multipart_formdata -from .packages.urllib3.util import parse_url -from .packages.urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) from .exceptions import ( HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, ContentDecodingError, ConnectionError, StreamConsumedError) @@ -36,7 +36,8 @@ stream_decode_response_unicode, to_key_val_list, parse_header_links, iter_slices, guess_json_utf, super_len, check_header_validity) from .compat import ( - cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO, + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, is_py2, chardet, builtin_str, basestring) from .compat import json as complexjson from .status_codes import codes @@ -154,8 +155,12 @@ def _encode_files(files, data): if isinstance(fp, (str, bytes, bytearray)): fdata = fp - else: + elif hasattr(fp, 'read'): fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) rf.make_multipart(content_type=ft) @@ -173,10 +178,10 @@ def register_hook(self, event, hook): if event not in self.hooks: raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - if isinstance(hook, collections.Callable): + if isinstance(hook, Callable): self.hooks[event].append(hook) elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) def deregister_hook(self, event, hook): """Deregister a previously registered hook. @@ -199,9 +204,13 @@ class Request(RequestHooksMixin): :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 data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. :param json: json for the body to attach to the request (if files or data is not specified). - :param params: dictionary of URL parameters to append to the URL. + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. :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. @@ -209,13 +218,14 @@ class Request(RequestHooksMixin): Usage:: >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req = requests.Request('GET', 'https://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): + 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 @@ -268,7 +278,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): Usage:: >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req = requests.Request('GET', 'https://httpbin.org/get') >>> r = req.prepare() @@ -294,8 +304,9 @@ def __init__(self): #: integer denoting starting position of a readable file-like body. self._body_position = None - def prepare(self, method=None, url=None, headers=None, files=None, - data=None, params=None, auth=None, cookies=None, hooks=None, json=None): + 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) @@ -333,13 +344,7 @@ def prepare_method(self, method): @staticmethod def _get_idna_encoded_host(host): - try: - from .packages import idna - except ImportError: - # tolerate the possibility of downstream repackagers unvendoring `requests` - # For more information, read: packages/__init__.py - import idna - sys.modules['requests.packages.idna'] = idna + import idna try: host = idna.encode(host, uts46=True).decode('utf-8') @@ -353,7 +358,7 @@ def prepare_url(self, url, params): #: We're unable to blindly call unicode/str functions #: as this will include the bytestring indicator (b'') #: on python 3.x. - #: https://github.com/kennethreitz/requests/pull/2238 + #: https://github.com/requests/requests/pull/2238 if isinstance(url, bytes): url = url.decode('utf8') else: @@ -464,7 +469,7 @@ def prepare_body(self, data, files, json=None): is_stream = all([ hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, collections.Mapping)) + not isinstance(data, (basestring, list, tuple, Mapping)) ]) try: @@ -589,10 +594,9 @@ class Response(object): ] def __init__(self): - super(Response, self).__init__() - self._content = False self._content_consumed = False + self._next = None #: Integer Code of responded HTTP Status, e.g. 404 or 200. self.status_code = None @@ -636,16 +640,19 @@ def __init__(self): #: is a response. self.request = None + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + 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__ - ) + return {attr: getattr(self, attr, None) for attr in self.__attrs__} def __setstate__(self, state): for name, value in state.items(): @@ -659,11 +666,23 @@ def __repr__(self): return '' % (self.status_code) def __bool__(self): - """Returns true if :attr:`status_code` is 'OK'.""" + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ return self.ok def __nonzero__(self): - """Returns true if :attr:`status_code` is 'OK'.""" + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ return self.ok def __iter__(self): @@ -672,6 +691,13 @@ def __iter__(self): @property def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ try: self.raise_for_status() except HTTPError: @@ -687,12 +713,17 @@ def is_redirect(self): @property def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect""" + """True if this Response one of the permanent versions of redirect.""" return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + @property def apparent_encoding(self): - """The apparent encoding, provided by the chardet library""" + """The apparent encoding, provided by the chardet library.""" return chardet.detect(self.content)['encoding'] def iter_content(self, chunk_size=1, decode_unicode=False): @@ -750,7 +781,7 @@ def generate(): return chunks - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, 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. @@ -794,7 +825,7 @@ def content(self): if self.status_code == 0 or self.raw is None: self._content = None else: - self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' self._content_consumed = True # don't need to release the connection; that's been handled by urllib3 @@ -840,7 +871,7 @@ def text(self): return content def json(self, **kwargs): - """Returns the json-encoded content of a response, if any. + r"""Returns the json-encoded content of a response, if any. :param \*\*kwargs: Optional arguments that ``json.loads`` takes. :raises ValueError: If the response body does not contain valid json. diff --git a/Contents/Libraries/Shared/requests/packages.py b/Contents/Libraries/Shared/requests/packages.py new file mode 100644 index 000000000..7232fe0ff --- /dev/null +++ b/Contents/Libraries/Shared/requests/packages.py @@ -0,0 +1,14 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/Contents/Libraries/Shared/requests/packages/__init__.py b/Contents/Libraries/Shared/requests/packages/__init__.py deleted file mode 100644 index 971c2ad02..000000000 --- a/Contents/Libraries/Shared/requests/packages/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -''' -Debian and other distributions "unbundle" requests' vendored dependencies, and -rewrite all imports to use the global versions of ``urllib3`` and ``chardet``. -The problem with this is that not only requests itself imports those -dependencies, but third-party code outside of the distros' control too. - -In reaction to these problems, the distro maintainers replaced -``requests.packages`` with a magical "stub module" that imports the correct -modules. The implementations were varying in quality and all had severe -problems. For example, a symlink (or hardlink) that links the correct modules -into place introduces problems regarding object identity, since you now have -two modules in `sys.modules` with the same API, but different identities:: - - requests.packages.urllib3 is not urllib3 - -With version ``2.5.2``, requests started to maintain its own stub, so that -distro-specific breakage would be reduced to a minimum, even though the whole -issue is not requests' fault in the first place. See -https://github.com/kennethreitz/requests/pull/2375 for the corresponding pull -request. -''' - -from __future__ import absolute_import -import sys - -try: - from . import urllib3 -except ImportError: - import urllib3 - sys.modules['%s.urllib3' % __name__] = urllib3 - -try: - from . import chardet -except ImportError: - import chardet - sys.modules['%s.chardet' % __name__] = chardet diff --git a/Contents/Libraries/Shared/requests/packages/chardet/__init__.py b/Contents/Libraries/Shared/requests/packages/chardet/__init__.py deleted file mode 100644 index 82c2a48d2..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/big5freq.py b/Contents/Libraries/Shared/requests/packages/chardet/big5freq.py deleted file mode 100644 index 65bffc04b..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/big5freq.py +++ /dev/null @@ -1,925 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/big5prober.py b/Contents/Libraries/Shared/requests/packages/chardet/big5prober.py deleted file mode 100644 index becce81e5..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/big5prober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/chardetect.py b/Contents/Libraries/Shared/requests/packages/chardet/chardetect.py deleted file mode 100644 index ffe892f25..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/chardetect.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/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/Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py b/Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py deleted file mode 100644 index 4e64a00be..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py +++ /dev/null @@ -1,231 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py b/Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py deleted file mode 100644 index 85e7a1c67..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py b/Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py deleted file mode 100644 index 97581712c..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py +++ /dev/null @@ -1,62 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py b/Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py deleted file mode 100644 index 8dd8c9179..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py +++ /dev/null @@ -1,61 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/compat.py b/Contents/Libraries/Shared/requests/packages/chardet/compat.py deleted file mode 100644 index d9e30addf..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/constants.py b/Contents/Libraries/Shared/requests/packages/chardet/constants.py deleted file mode 100644 index e4d148b3c..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py b/Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py deleted file mode 100644 index ff4272f82..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py +++ /dev/null @@ -1,44 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/escprober.py b/Contents/Libraries/Shared/requests/packages/chardet/escprober.py deleted file mode 100644 index 80a844ff3..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/escprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/escsm.py b/Contents/Libraries/Shared/requests/packages/chardet/escsm.py deleted file mode 100644 index bd302b4c6..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/escsm.py +++ /dev/null @@ -1,242 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py b/Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py deleted file mode 100644 index 8e64fdcc2..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py b/Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py deleted file mode 100644 index a179e4c21..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py +++ /dev/null @@ -1,596 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py b/Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py deleted file mode 100644 index 5982a46b6..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py b/Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py deleted file mode 100644 index 576e7504d..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py +++ /dev/null @@ -1,428 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py b/Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py deleted file mode 100644 index fe652fe37..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py b/Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py deleted file mode 100644 index 1238f510f..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py +++ /dev/null @@ -1,472 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py b/Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py deleted file mode 100644 index 0325a2d86..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py b/Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py deleted file mode 100644 index ba225c5ef..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py b/Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py deleted file mode 100644 index 064345b08..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py +++ /dev/null @@ -1,569 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py b/Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py deleted file mode 100644 index 59aeb6a87..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py +++ /dev/null @@ -1,227 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py deleted file mode 100644 index e5788fc64..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,229 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py deleted file mode 100644 index a86f54bd5..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,329 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py deleted file mode 100644 index ddb583765..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py deleted file mode 100644 index 75f2bc7fe..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py +++ /dev/null @@ -1,201 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py deleted file mode 100644 index 49d2f0fe7..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py b/Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py deleted file mode 100644 index 0508b1b1a..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py b/Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py deleted file mode 100644 index eef357354..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py +++ /dev/null @@ -1,139 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py b/Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py deleted file mode 100644 index bb42f2fb5..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py b/Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py deleted file mode 100644 index 03c9dcf3e..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py b/Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py deleted file mode 100644 index efe678ca0..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py b/Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py deleted file mode 100644 index 37291bd27..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py +++ /dev/null @@ -1,120 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py b/Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py deleted file mode 100644 index 1b6196cd1..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,69 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py b/Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py deleted file mode 100644 index cd0e9e707..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py b/Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py deleted file mode 100644 index 476522b99..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py +++ /dev/null @@ -1,170 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py b/Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py deleted file mode 100644 index 1c0bb5d8f..000000000 --- a/Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py +++ /dev/null @@ -1,76 +0,0 @@ -######################## 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/Contents/Libraries/Shared/requests/packages/idna/__init__.py b/Contents/Libraries/Shared/requests/packages/idna/__init__.py deleted file mode 100644 index bb67a43fa..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .core import * diff --git a/Contents/Libraries/Shared/requests/packages/idna/idnadata.py b/Contents/Libraries/Shared/requests/packages/idna/idnadata.py deleted file mode 100644 index 2bffe527c..000000000 --- a/Contents/Libraries/Shared/requests/packages/idna/idnadata.py +++ /dev/null @@ -1,1584 +0,0 @@ -# This file is automatically generated by build-idnadata.py - -scripts = { - 'Greek': ( - (0x370, 0x374), - (0x375, 0x378), - (0x37a, 0x37e), - (0x384, 0x385), - (0x386, 0x387), - (0x388, 0x38b), - (0x38c, 0x38d), - (0x38e, 0x3a2), - (0x3a3, 0x3e2), - (0x3f0, 0x400), - (0x1d26, 0x1d2b), - (0x1d5d, 0x1d62), - (0x1d66, 0x1d6b), - (0x1dbf, 0x1dc0), - (0x1f00, 0x1f16), - (0x1f18, 0x1f1e), - (0x1f20, 0x1f46), - (0x1f48, 0x1f4e), - (0x1f50, 0x1f58), - (0x1f59, 0x1f5a), - (0x1f5b, 0x1f5c), - (0x1f5d, 0x1f5e), - (0x1f5f, 0x1f7e), - (0x1f80, 0x1fb5), - (0x1fb6, 0x1fc5), - (0x1fc6, 0x1fd4), - (0x1fd6, 0x1fdc), - (0x1fdd, 0x1ff0), - (0x1ff2, 0x1ff5), - (0x1ff6, 0x1fff), - (0x2126, 0x2127), - (0x10140, 0x1018b), - (0x1d200, 0x1d246), - ), - 'Han': ( - (0x2e80, 0x2e9a), - (0x2e9b, 0x2ef4), - (0x2f00, 0x2fd6), - (0x3005, 0x3006), - (0x3007, 0x3008), - (0x3021, 0x302a), - (0x3038, 0x303c), - (0x3400, 0x4db6), - (0x4e00, 0x9fcd), - (0xf900, 0xfa6e), - (0xfa70, 0xfada), - (0x20000, 0x2a6d7), - (0x2a700, 0x2b735), - (0x2b740, 0x2b81e), - (0x2f800, 0x2fa1e), - ), - 'Hebrew': ( - (0x591, 0x5c8), - (0x5d0, 0x5eb), - (0x5f0, 0x5f5), - (0xfb1d, 0xfb37), - (0xfb38, 0xfb3d), - (0xfb3e, 0xfb3f), - (0xfb40, 0xfb42), - (0xfb43, 0xfb45), - (0xfb46, 0xfb50), - ), - 'Hiragana': ( - (0x3041, 0x3097), - (0x309d, 0x30a0), - (0x1b001, 0x1b002), - (0x1f200, 0x1f201), - ), - 'Katakana': ( - (0x30a1, 0x30fb), - (0x30fd, 0x3100), - (0x31f0, 0x3200), - (0x32d0, 0x32ff), - (0x3300, 0x3358), - (0xff66, 0xff70), - (0xff71, 0xff9e), - (0x1b000, 0x1b001), - ), -} -joining_types = { - 0x600: 'U', - 0x601: 'U', - 0x602: 'U', - 0x603: 'U', - 0x604: 'U', - 0x608: 'U', - 0x60b: 'U', - 0x620: 'D', - 0x621: 'U', - 0x622: 'R', - 0x623: 'R', - 0x624: 'R', - 0x625: 'R', - 0x626: 'D', - 0x627: 'R', - 0x628: 'D', - 0x629: 'R', - 0x62a: 'D', - 0x62b: 'D', - 0x62c: 'D', - 0x62d: 'D', - 0x62e: 'D', - 0x62f: 'R', - 0x630: 'R', - 0x631: 'R', - 0x632: 'R', - 0x633: 'D', - 0x634: 'D', - 0x635: 'D', - 0x636: 'D', - 0x637: 'D', - 0x638: 'D', - 0x639: 'D', - 0x63a: 'D', - 0x63b: 'D', - 0x63c: 'D', - 0x63d: 'D', - 0x63e: 'D', - 0x63f: 'D', - 0x640: 'C', - 0x641: 'D', - 0x642: 'D', - 0x643: 'D', - 0x644: 'D', - 0x645: 'D', - 0x646: 'D', - 0x647: 'D', - 0x648: 'R', - 0x649: 'D', - 0x64a: 'D', - 0x66e: 'D', - 0x66f: 'D', - 0x671: 'R', - 0x672: 'R', - 0x673: 'R', - 0x674: 'U', - 0x675: 'R', - 0x676: 'R', - 0x677: 'R', - 0x678: 'D', - 0x679: 'D', - 0x67a: 'D', - 0x67b: 'D', - 0x67c: 'D', - 0x67d: 'D', - 0x67e: 'D', - 0x67f: 'D', - 0x680: 'D', - 0x681: 'D', - 0x682: 'D', - 0x683: 'D', - 0x684: 'D', - 0x685: 'D', - 0x686: 'D', - 0x687: 'D', - 0x688: 'R', - 0x689: 'R', - 0x68a: 'R', - 0x68b: 'R', - 0x68c: 'R', - 0x68d: 'R', - 0x68e: 'R', - 0x68f: 'R', - 0x690: 'R', - 0x691: 'R', - 0x692: 'R', - 0x693: 'R', - 0x694: 'R', - 0x695: 'R', - 0x696: 'R', - 0x697: 'R', - 0x698: 'R', - 0x699: 'R', - 0x69a: 'D', - 0x69b: 'D', - 0x69c: 'D', - 0x69d: 'D', - 0x69e: 'D', - 0x69f: 'D', - 0x6a0: 'D', - 0x6a1: 'D', - 0x6a2: 'D', - 0x6a3: 'D', - 0x6a4: 'D', - 0x6a5: 'D', - 0x6a6: 'D', - 0x6a7: 'D', - 0x6a8: 'D', - 0x6a9: 'D', - 0x6aa: 'D', - 0x6ab: 'D', - 0x6ac: 'D', - 0x6ad: 'D', - 0x6ae: 'D', - 0x6af: 'D', - 0x6b0: 'D', - 0x6b1: 'D', - 0x6b2: 'D', - 0x6b3: 'D', - 0x6b4: 'D', - 0x6b5: 'D', - 0x6b6: 'D', - 0x6b7: 'D', - 0x6b8: 'D', - 0x6b9: 'D', - 0x6ba: 'D', - 0x6bb: 'D', - 0x6bc: 'D', - 0x6bd: 'D', - 0x6be: 'D', - 0x6bf: 'D', - 0x6c0: 'R', - 0x6c1: 'D', - 0x6c2: 'D', - 0x6c3: 'R', - 0x6c4: 'R', - 0x6c5: 'R', - 0x6c6: 'R', - 0x6c7: 'R', - 0x6c8: 'R', - 0x6c9: 'R', - 0x6ca: 'R', - 0x6cb: 'R', - 0x6cc: 'D', - 0x6cd: 'R', - 0x6ce: 'D', - 0x6cf: 'R', - 0x6d0: 'D', - 0x6d1: 'D', - 0x6d2: 'R', - 0x6d3: 'R', - 0x6d5: 'R', - 0x6dd: 'U', - 0x6ee: 'R', - 0x6ef: 'R', - 0x6fa: 'D', - 0x6fb: 'D', - 0x6fc: 'D', - 0x6ff: 'D', - 0x710: 'R', - 0x712: 'D', - 0x713: 'D', - 0x714: 'D', - 0x715: 'R', - 0x716: 'R', - 0x717: 'R', - 0x718: 'R', - 0x719: 'R', - 0x71a: 'D', - 0x71b: 'D', - 0x71c: 'D', - 0x71d: 'D', - 0x71e: 'R', - 0x71f: 'D', - 0x720: 'D', - 0x721: 'D', - 0x722: 'D', - 0x723: 'D', - 0x724: 'D', - 0x725: 'D', - 0x726: 'D', - 0x727: 'D', - 0x728: 'R', - 0x729: 'D', - 0x72a: 'R', - 0x72b: 'D', - 0x72c: 'R', - 0x72d: 'D', - 0x72e: 'D', - 0x72f: 'R', - 0x74d: 'R', - 0x74e: 'D', - 0x74f: 'D', - 0x750: 'D', - 0x751: 'D', - 0x752: 'D', - 0x753: 'D', - 0x754: 'D', - 0x755: 'D', - 0x756: 'D', - 0x757: 'D', - 0x758: 'D', - 0x759: 'R', - 0x75a: 'R', - 0x75b: 'R', - 0x75c: 'D', - 0x75d: 'D', - 0x75e: 'D', - 0x75f: 'D', - 0x760: 'D', - 0x761: 'D', - 0x762: 'D', - 0x763: 'D', - 0x764: 'D', - 0x765: 'D', - 0x766: 'D', - 0x767: 'D', - 0x768: 'D', - 0x769: 'D', - 0x76a: 'D', - 0x76b: 'R', - 0x76c: 'R', - 0x76d: 'D', - 0x76e: 'D', - 0x76f: 'D', - 0x770: 'D', - 0x771: 'R', - 0x772: 'D', - 0x773: 'R', - 0x774: 'R', - 0x775: 'D', - 0x776: 'D', - 0x777: 'D', - 0x778: 'R', - 0x779: 'R', - 0x77a: 'D', - 0x77b: 'D', - 0x77c: 'D', - 0x77d: 'D', - 0x77e: 'D', - 0x77f: 'D', - 0x7ca: 'D', - 0x7cb: 'D', - 0x7cc: 'D', - 0x7cd: 'D', - 0x7ce: 'D', - 0x7cf: 'D', - 0x7d0: 'D', - 0x7d1: 'D', - 0x7d2: 'D', - 0x7d3: 'D', - 0x7d4: 'D', - 0x7d5: 'D', - 0x7d6: 'D', - 0x7d7: 'D', - 0x7d8: 'D', - 0x7d9: 'D', - 0x7da: 'D', - 0x7db: 'D', - 0x7dc: 'D', - 0x7dd: 'D', - 0x7de: 'D', - 0x7df: 'D', - 0x7e0: 'D', - 0x7e1: 'D', - 0x7e2: 'D', - 0x7e3: 'D', - 0x7e4: 'D', - 0x7e5: 'D', - 0x7e6: 'D', - 0x7e7: 'D', - 0x7e8: 'D', - 0x7e9: 'D', - 0x7ea: 'D', - 0x7fa: 'C', - 0x840: 'R', - 0x841: 'D', - 0x842: 'D', - 0x843: 'D', - 0x844: 'D', - 0x845: 'D', - 0x846: 'R', - 0x847: 'D', - 0x848: 'D', - 0x849: 'R', - 0x84a: 'D', - 0x84b: 'D', - 0x84c: 'D', - 0x84d: 'D', - 0x84e: 'D', - 0x84f: 'R', - 0x850: 'D', - 0x851: 'D', - 0x852: 'D', - 0x853: 'D', - 0x854: 'R', - 0x855: 'D', - 0x856: 'U', - 0x857: 'U', - 0x858: 'U', - 0x8a0: 'D', - 0x8a2: 'D', - 0x8a3: 'D', - 0x8a4: 'D', - 0x8a5: 'D', - 0x8a6: 'D', - 0x8a7: 'D', - 0x8a8: 'D', - 0x8a9: 'D', - 0x8aa: 'R', - 0x8ab: 'R', - 0x8ac: 'R', - 0x1806: 'U', - 0x1807: 'D', - 0x180a: 'C', - 0x180e: 'U', - 0x1820: 'D', - 0x1821: 'D', - 0x1822: 'D', - 0x1823: 'D', - 0x1824: 'D', - 0x1825: 'D', - 0x1826: 'D', - 0x1827: 'D', - 0x1828: 'D', - 0x1829: 'D', - 0x182a: 'D', - 0x182b: 'D', - 0x182c: 'D', - 0x182d: 'D', - 0x182e: 'D', - 0x182f: 'D', - 0x1830: 'D', - 0x1831: 'D', - 0x1832: 'D', - 0x1833: 'D', - 0x1834: 'D', - 0x1835: 'D', - 0x1836: 'D', - 0x1837: 'D', - 0x1838: 'D', - 0x1839: 'D', - 0x183a: 'D', - 0x183b: 'D', - 0x183c: 'D', - 0x183d: 'D', - 0x183e: 'D', - 0x183f: 'D', - 0x1840: 'D', - 0x1841: 'D', - 0x1842: 'D', - 0x1843: 'D', - 0x1844: 'D', - 0x1845: 'D', - 0x1846: 'D', - 0x1847: 'D', - 0x1848: 'D', - 0x1849: 'D', - 0x184a: 'D', - 0x184b: 'D', - 0x184c: 'D', - 0x184d: 'D', - 0x184e: 'D', - 0x184f: 'D', - 0x1850: 'D', - 0x1851: 'D', - 0x1852: 'D', - 0x1853: 'D', - 0x1854: 'D', - 0x1855: 'D', - 0x1856: 'D', - 0x1857: 'D', - 0x1858: 'D', - 0x1859: 'D', - 0x185a: 'D', - 0x185b: 'D', - 0x185c: 'D', - 0x185d: 'D', - 0x185e: 'D', - 0x185f: 'D', - 0x1860: 'D', - 0x1861: 'D', - 0x1862: 'D', - 0x1863: 'D', - 0x1864: 'D', - 0x1865: 'D', - 0x1866: 'D', - 0x1867: 'D', - 0x1868: 'D', - 0x1869: 'D', - 0x186a: 'D', - 0x186b: 'D', - 0x186c: 'D', - 0x186d: 'D', - 0x186e: 'D', - 0x186f: 'D', - 0x1870: 'D', - 0x1871: 'D', - 0x1872: 'D', - 0x1873: 'D', - 0x1874: 'D', - 0x1875: 'D', - 0x1876: 'D', - 0x1877: 'D', - 0x1880: 'U', - 0x1881: 'U', - 0x1882: 'U', - 0x1883: 'U', - 0x1884: 'U', - 0x1885: 'U', - 0x1886: 'U', - 0x1887: 'D', - 0x1888: 'D', - 0x1889: 'D', - 0x188a: 'D', - 0x188b: 'D', - 0x188c: 'D', - 0x188d: 'D', - 0x188e: 'D', - 0x188f: 'D', - 0x1890: 'D', - 0x1891: 'D', - 0x1892: 'D', - 0x1893: 'D', - 0x1894: 'D', - 0x1895: 'D', - 0x1896: 'D', - 0x1897: 'D', - 0x1898: 'D', - 0x1899: 'D', - 0x189a: 'D', - 0x189b: 'D', - 0x189c: 'D', - 0x189d: 'D', - 0x189e: 'D', - 0x189f: 'D', - 0x18a0: 'D', - 0x18a1: 'D', - 0x18a2: 'D', - 0x18a3: 'D', - 0x18a4: 'D', - 0x18a5: 'D', - 0x18a6: 'D', - 0x18a7: 'D', - 0x18a8: 'D', - 0x18aa: 'D', - 0x200c: 'U', - 0x200d: 'C', - 0x2066: 'U', - 0x2067: 'U', - 0x2068: 'U', - 0x2069: 'U', - 0xa840: 'D', - 0xa841: 'D', - 0xa842: 'D', - 0xa843: 'D', - 0xa844: 'D', - 0xa845: 'D', - 0xa846: 'D', - 0xa847: 'D', - 0xa848: 'D', - 0xa849: 'D', - 0xa84a: 'D', - 0xa84b: 'D', - 0xa84c: 'D', - 0xa84d: 'D', - 0xa84e: 'D', - 0xa84f: 'D', - 0xa850: 'D', - 0xa851: 'D', - 0xa852: 'D', - 0xa853: 'D', - 0xa854: 'D', - 0xa855: 'D', - 0xa856: 'D', - 0xa857: 'D', - 0xa858: 'D', - 0xa859: 'D', - 0xa85a: 'D', - 0xa85b: 'D', - 0xa85c: 'D', - 0xa85d: 'D', - 0xa85e: 'D', - 0xa85f: 'D', - 0xa860: 'D', - 0xa861: 'D', - 0xa862: 'D', - 0xa863: 'D', - 0xa864: 'D', - 0xa865: 'D', - 0xa866: 'D', - 0xa867: 'D', - 0xa868: 'D', - 0xa869: 'D', - 0xa86a: 'D', - 0xa86b: 'D', - 0xa86c: 'D', - 0xa86d: 'D', - 0xa86e: 'D', - 0xa86f: 'D', - 0xa870: 'D', - 0xa871: 'D', - 0xa872: 'L', - 0xa873: 'U', -} -codepoint_classes = { - 'PVALID': ( - (0x2d, 0x2e), - (0x30, 0x3a), - (0x61, 0x7b), - (0xdf, 0xf7), - (0xf8, 0x100), - (0x101, 0x102), - (0x103, 0x104), - (0x105, 0x106), - (0x107, 0x108), - (0x109, 0x10a), - (0x10b, 0x10c), - (0x10d, 0x10e), - (0x10f, 0x110), - (0x111, 0x112), - (0x113, 0x114), - (0x115, 0x116), - (0x117, 0x118), - (0x119, 0x11a), - (0x11b, 0x11c), - (0x11d, 0x11e), - (0x11f, 0x120), - (0x121, 0x122), - (0x123, 0x124), - (0x125, 0x126), - (0x127, 0x128), - (0x129, 0x12a), - (0x12b, 0x12c), - (0x12d, 0x12e), - (0x12f, 0x130), - (0x131, 0x132), - (0x135, 0x136), - (0x137, 0x139), - (0x13a, 0x13b), - (0x13c, 0x13d), - (0x13e, 0x13f), - (0x142, 0x143), - (0x144, 0x145), - (0x146, 0x147), - (0x148, 0x149), - (0x14b, 0x14c), - (0x14d, 0x14e), - (0x14f, 0x150), - (0x151, 0x152), - (0x153, 0x154), - (0x155, 0x156), - (0x157, 0x158), - (0x159, 0x15a), - (0x15b, 0x15c), - (0x15d, 0x15e), - (0x15f, 0x160), - (0x161, 0x162), - (0x163, 0x164), - (0x165, 0x166), - (0x167, 0x168), - (0x169, 0x16a), - (0x16b, 0x16c), - (0x16d, 0x16e), - (0x16f, 0x170), - (0x171, 0x172), - (0x173, 0x174), - (0x175, 0x176), - (0x177, 0x178), - (0x17a, 0x17b), - (0x17c, 0x17d), - (0x17e, 0x17f), - (0x180, 0x181), - (0x183, 0x184), - (0x185, 0x186), - (0x188, 0x189), - (0x18c, 0x18e), - (0x192, 0x193), - (0x195, 0x196), - (0x199, 0x19c), - (0x19e, 0x19f), - (0x1a1, 0x1a2), - (0x1a3, 0x1a4), - (0x1a5, 0x1a6), - (0x1a8, 0x1a9), - (0x1aa, 0x1ac), - (0x1ad, 0x1ae), - (0x1b0, 0x1b1), - (0x1b4, 0x1b5), - (0x1b6, 0x1b7), - (0x1b9, 0x1bc), - (0x1bd, 0x1c4), - (0x1ce, 0x1cf), - (0x1d0, 0x1d1), - (0x1d2, 0x1d3), - (0x1d4, 0x1d5), - (0x1d6, 0x1d7), - (0x1d8, 0x1d9), - (0x1da, 0x1db), - (0x1dc, 0x1de), - (0x1df, 0x1e0), - (0x1e1, 0x1e2), - (0x1e3, 0x1e4), - (0x1e5, 0x1e6), - (0x1e7, 0x1e8), - (0x1e9, 0x1ea), - (0x1eb, 0x1ec), - (0x1ed, 0x1ee), - (0x1ef, 0x1f1), - (0x1f5, 0x1f6), - (0x1f9, 0x1fa), - (0x1fb, 0x1fc), - (0x1fd, 0x1fe), - (0x1ff, 0x200), - (0x201, 0x202), - (0x203, 0x204), - (0x205, 0x206), - (0x207, 0x208), - (0x209, 0x20a), - (0x20b, 0x20c), - (0x20d, 0x20e), - (0x20f, 0x210), - (0x211, 0x212), - (0x213, 0x214), - (0x215, 0x216), - (0x217, 0x218), - (0x219, 0x21a), - (0x21b, 0x21c), - (0x21d, 0x21e), - (0x21f, 0x220), - (0x221, 0x222), - (0x223, 0x224), - (0x225, 0x226), - (0x227, 0x228), - (0x229, 0x22a), - (0x22b, 0x22c), - (0x22d, 0x22e), - (0x22f, 0x230), - (0x231, 0x232), - (0x233, 0x23a), - (0x23c, 0x23d), - (0x23f, 0x241), - (0x242, 0x243), - (0x247, 0x248), - (0x249, 0x24a), - (0x24b, 0x24c), - (0x24d, 0x24e), - (0x24f, 0x2b0), - (0x2b9, 0x2c2), - (0x2c6, 0x2d2), - (0x2ec, 0x2ed), - (0x2ee, 0x2ef), - (0x300, 0x340), - (0x342, 0x343), - (0x346, 0x34f), - (0x350, 0x370), - (0x371, 0x372), - (0x373, 0x374), - (0x377, 0x378), - (0x37b, 0x37e), - (0x390, 0x391), - (0x3ac, 0x3cf), - (0x3d7, 0x3d8), - (0x3d9, 0x3da), - (0x3db, 0x3dc), - (0x3dd, 0x3de), - (0x3df, 0x3e0), - (0x3e1, 0x3e2), - (0x3e3, 0x3e4), - (0x3e5, 0x3e6), - (0x3e7, 0x3e8), - (0x3e9, 0x3ea), - (0x3eb, 0x3ec), - (0x3ed, 0x3ee), - (0x3ef, 0x3f0), - (0x3f3, 0x3f4), - (0x3f8, 0x3f9), - (0x3fb, 0x3fd), - (0x430, 0x460), - (0x461, 0x462), - (0x463, 0x464), - (0x465, 0x466), - (0x467, 0x468), - (0x469, 0x46a), - (0x46b, 0x46c), - (0x46d, 0x46e), - (0x46f, 0x470), - (0x471, 0x472), - (0x473, 0x474), - (0x475, 0x476), - (0x477, 0x478), - (0x479, 0x47a), - (0x47b, 0x47c), - (0x47d, 0x47e), - (0x47f, 0x480), - (0x481, 0x482), - (0x483, 0x488), - (0x48b, 0x48c), - (0x48d, 0x48e), - (0x48f, 0x490), - (0x491, 0x492), - (0x493, 0x494), - (0x495, 0x496), - (0x497, 0x498), - (0x499, 0x49a), - (0x49b, 0x49c), - (0x49d, 0x49e), - (0x49f, 0x4a0), - (0x4a1, 0x4a2), - (0x4a3, 0x4a4), - (0x4a5, 0x4a6), - (0x4a7, 0x4a8), - (0x4a9, 0x4aa), - (0x4ab, 0x4ac), - (0x4ad, 0x4ae), - (0x4af, 0x4b0), - (0x4b1, 0x4b2), - (0x4b3, 0x4b4), - (0x4b5, 0x4b6), - (0x4b7, 0x4b8), - (0x4b9, 0x4ba), - (0x4bb, 0x4bc), - (0x4bd, 0x4be), - (0x4bf, 0x4c0), - (0x4c2, 0x4c3), - (0x4c4, 0x4c5), - (0x4c6, 0x4c7), - (0x4c8, 0x4c9), - (0x4ca, 0x4cb), - (0x4cc, 0x4cd), - (0x4ce, 0x4d0), - (0x4d1, 0x4d2), - (0x4d3, 0x4d4), - (0x4d5, 0x4d6), - (0x4d7, 0x4d8), - (0x4d9, 0x4da), - (0x4db, 0x4dc), - (0x4dd, 0x4de), - (0x4df, 0x4e0), - (0x4e1, 0x4e2), - (0x4e3, 0x4e4), - (0x4e5, 0x4e6), - (0x4e7, 0x4e8), - (0x4e9, 0x4ea), - (0x4eb, 0x4ec), - (0x4ed, 0x4ee), - (0x4ef, 0x4f0), - (0x4f1, 0x4f2), - (0x4f3, 0x4f4), - (0x4f5, 0x4f6), - (0x4f7, 0x4f8), - (0x4f9, 0x4fa), - (0x4fb, 0x4fc), - (0x4fd, 0x4fe), - (0x4ff, 0x500), - (0x501, 0x502), - (0x503, 0x504), - (0x505, 0x506), - (0x507, 0x508), - (0x509, 0x50a), - (0x50b, 0x50c), - (0x50d, 0x50e), - (0x50f, 0x510), - (0x511, 0x512), - (0x513, 0x514), - (0x515, 0x516), - (0x517, 0x518), - (0x519, 0x51a), - (0x51b, 0x51c), - (0x51d, 0x51e), - (0x51f, 0x520), - (0x521, 0x522), - (0x523, 0x524), - (0x525, 0x526), - (0x527, 0x528), - (0x559, 0x55a), - (0x561, 0x587), - (0x591, 0x5be), - (0x5bf, 0x5c0), - (0x5c1, 0x5c3), - (0x5c4, 0x5c6), - (0x5c7, 0x5c8), - (0x5d0, 0x5eb), - (0x5f0, 0x5f3), - (0x610, 0x61b), - (0x620, 0x640), - (0x641, 0x660), - (0x66e, 0x675), - (0x679, 0x6d4), - (0x6d5, 0x6dd), - (0x6df, 0x6e9), - (0x6ea, 0x6f0), - (0x6fa, 0x700), - (0x710, 0x74b), - (0x74d, 0x7b2), - (0x7c0, 0x7f6), - (0x800, 0x82e), - (0x840, 0x85c), - (0x8a0, 0x8a1), - (0x8a2, 0x8ad), - (0x8e4, 0x8ff), - (0x900, 0x958), - (0x960, 0x964), - (0x966, 0x970), - (0x971, 0x978), - (0x979, 0x980), - (0x981, 0x984), - (0x985, 0x98d), - (0x98f, 0x991), - (0x993, 0x9a9), - (0x9aa, 0x9b1), - (0x9b2, 0x9b3), - (0x9b6, 0x9ba), - (0x9bc, 0x9c5), - (0x9c7, 0x9c9), - (0x9cb, 0x9cf), - (0x9d7, 0x9d8), - (0x9e0, 0x9e4), - (0x9e6, 0x9f2), - (0xa01, 0xa04), - (0xa05, 0xa0b), - (0xa0f, 0xa11), - (0xa13, 0xa29), - (0xa2a, 0xa31), - (0xa32, 0xa33), - (0xa35, 0xa36), - (0xa38, 0xa3a), - (0xa3c, 0xa3d), - (0xa3e, 0xa43), - (0xa47, 0xa49), - (0xa4b, 0xa4e), - (0xa51, 0xa52), - (0xa5c, 0xa5d), - (0xa66, 0xa76), - (0xa81, 0xa84), - (0xa85, 0xa8e), - (0xa8f, 0xa92), - (0xa93, 0xaa9), - (0xaaa, 0xab1), - (0xab2, 0xab4), - (0xab5, 0xaba), - (0xabc, 0xac6), - (0xac7, 0xaca), - (0xacb, 0xace), - (0xad0, 0xad1), - (0xae0, 0xae4), - (0xae6, 0xaf0), - (0xb01, 0xb04), - (0xb05, 0xb0d), - (0xb0f, 0xb11), - (0xb13, 0xb29), - (0xb2a, 0xb31), - (0xb32, 0xb34), - (0xb35, 0xb3a), - (0xb3c, 0xb45), - (0xb47, 0xb49), - (0xb4b, 0xb4e), - (0xb56, 0xb58), - (0xb5f, 0xb64), - (0xb66, 0xb70), - (0xb71, 0xb72), - (0xb82, 0xb84), - (0xb85, 0xb8b), - (0xb8e, 0xb91), - (0xb92, 0xb96), - (0xb99, 0xb9b), - (0xb9c, 0xb9d), - (0xb9e, 0xba0), - (0xba3, 0xba5), - (0xba8, 0xbab), - (0xbae, 0xbba), - (0xbbe, 0xbc3), - (0xbc6, 0xbc9), - (0xbca, 0xbce), - (0xbd0, 0xbd1), - (0xbd7, 0xbd8), - (0xbe6, 0xbf0), - (0xc01, 0xc04), - (0xc05, 0xc0d), - (0xc0e, 0xc11), - (0xc12, 0xc29), - (0xc2a, 0xc34), - (0xc35, 0xc3a), - (0xc3d, 0xc45), - (0xc46, 0xc49), - (0xc4a, 0xc4e), - (0xc55, 0xc57), - (0xc58, 0xc5a), - (0xc60, 0xc64), - (0xc66, 0xc70), - (0xc82, 0xc84), - (0xc85, 0xc8d), - (0xc8e, 0xc91), - (0xc92, 0xca9), - (0xcaa, 0xcb4), - (0xcb5, 0xcba), - (0xcbc, 0xcc5), - (0xcc6, 0xcc9), - (0xcca, 0xcce), - (0xcd5, 0xcd7), - (0xcde, 0xcdf), - (0xce0, 0xce4), - (0xce6, 0xcf0), - (0xcf1, 0xcf3), - (0xd02, 0xd04), - (0xd05, 0xd0d), - (0xd0e, 0xd11), - (0xd12, 0xd3b), - (0xd3d, 0xd45), - (0xd46, 0xd49), - (0xd4a, 0xd4f), - (0xd57, 0xd58), - (0xd60, 0xd64), - (0xd66, 0xd70), - (0xd7a, 0xd80), - (0xd82, 0xd84), - (0xd85, 0xd97), - (0xd9a, 0xdb2), - (0xdb3, 0xdbc), - (0xdbd, 0xdbe), - (0xdc0, 0xdc7), - (0xdca, 0xdcb), - (0xdcf, 0xdd5), - (0xdd6, 0xdd7), - (0xdd8, 0xde0), - (0xdf2, 0xdf4), - (0xe01, 0xe33), - (0xe34, 0xe3b), - (0xe40, 0xe4f), - (0xe50, 0xe5a), - (0xe81, 0xe83), - (0xe84, 0xe85), - (0xe87, 0xe89), - (0xe8a, 0xe8b), - (0xe8d, 0xe8e), - (0xe94, 0xe98), - (0xe99, 0xea0), - (0xea1, 0xea4), - (0xea5, 0xea6), - (0xea7, 0xea8), - (0xeaa, 0xeac), - (0xead, 0xeb3), - (0xeb4, 0xeba), - (0xebb, 0xebe), - (0xec0, 0xec5), - (0xec6, 0xec7), - (0xec8, 0xece), - (0xed0, 0xeda), - (0xede, 0xee0), - (0xf00, 0xf01), - (0xf0b, 0xf0c), - (0xf18, 0xf1a), - (0xf20, 0xf2a), - (0xf35, 0xf36), - (0xf37, 0xf38), - (0xf39, 0xf3a), - (0xf3e, 0xf43), - (0xf44, 0xf48), - (0xf49, 0xf4d), - (0xf4e, 0xf52), - (0xf53, 0xf57), - (0xf58, 0xf5c), - (0xf5d, 0xf69), - (0xf6a, 0xf6d), - (0xf71, 0xf73), - (0xf74, 0xf75), - (0xf7a, 0xf81), - (0xf82, 0xf85), - (0xf86, 0xf93), - (0xf94, 0xf98), - (0xf99, 0xf9d), - (0xf9e, 0xfa2), - (0xfa3, 0xfa7), - (0xfa8, 0xfac), - (0xfad, 0xfb9), - (0xfba, 0xfbd), - (0xfc6, 0xfc7), - (0x1000, 0x104a), - (0x1050, 0x109e), - (0x10d0, 0x10fb), - (0x10fd, 0x1100), - (0x1200, 0x1249), - (0x124a, 0x124e), - (0x1250, 0x1257), - (0x1258, 0x1259), - (0x125a, 0x125e), - (0x1260, 0x1289), - (0x128a, 0x128e), - (0x1290, 0x12b1), - (0x12b2, 0x12b6), - (0x12b8, 0x12bf), - (0x12c0, 0x12c1), - (0x12c2, 0x12c6), - (0x12c8, 0x12d7), - (0x12d8, 0x1311), - (0x1312, 0x1316), - (0x1318, 0x135b), - (0x135d, 0x1360), - (0x1380, 0x1390), - (0x13a0, 0x13f5), - (0x1401, 0x166d), - (0x166f, 0x1680), - (0x1681, 0x169b), - (0x16a0, 0x16eb), - (0x1700, 0x170d), - (0x170e, 0x1715), - (0x1720, 0x1735), - (0x1740, 0x1754), - (0x1760, 0x176d), - (0x176e, 0x1771), - (0x1772, 0x1774), - (0x1780, 0x17b4), - (0x17b6, 0x17d4), - (0x17d7, 0x17d8), - (0x17dc, 0x17de), - (0x17e0, 0x17ea), - (0x1810, 0x181a), - (0x1820, 0x1878), - (0x1880, 0x18ab), - (0x18b0, 0x18f6), - (0x1900, 0x191d), - (0x1920, 0x192c), - (0x1930, 0x193c), - (0x1946, 0x196e), - (0x1970, 0x1975), - (0x1980, 0x19ac), - (0x19b0, 0x19ca), - (0x19d0, 0x19da), - (0x1a00, 0x1a1c), - (0x1a20, 0x1a5f), - (0x1a60, 0x1a7d), - (0x1a7f, 0x1a8a), - (0x1a90, 0x1a9a), - (0x1aa7, 0x1aa8), - (0x1b00, 0x1b4c), - (0x1b50, 0x1b5a), - (0x1b6b, 0x1b74), - (0x1b80, 0x1bf4), - (0x1c00, 0x1c38), - (0x1c40, 0x1c4a), - (0x1c4d, 0x1c7e), - (0x1cd0, 0x1cd3), - (0x1cd4, 0x1cf7), - (0x1d00, 0x1d2c), - (0x1d2f, 0x1d30), - (0x1d3b, 0x1d3c), - (0x1d4e, 0x1d4f), - (0x1d6b, 0x1d78), - (0x1d79, 0x1d9b), - (0x1dc0, 0x1de7), - (0x1dfc, 0x1e00), - (0x1e01, 0x1e02), - (0x1e03, 0x1e04), - (0x1e05, 0x1e06), - (0x1e07, 0x1e08), - (0x1e09, 0x1e0a), - (0x1e0b, 0x1e0c), - (0x1e0d, 0x1e0e), - (0x1e0f, 0x1e10), - (0x1e11, 0x1e12), - (0x1e13, 0x1e14), - (0x1e15, 0x1e16), - (0x1e17, 0x1e18), - (0x1e19, 0x1e1a), - (0x1e1b, 0x1e1c), - (0x1e1d, 0x1e1e), - (0x1e1f, 0x1e20), - (0x1e21, 0x1e22), - (0x1e23, 0x1e24), - (0x1e25, 0x1e26), - (0x1e27, 0x1e28), - (0x1e29, 0x1e2a), - (0x1e2b, 0x1e2c), - (0x1e2d, 0x1e2e), - (0x1e2f, 0x1e30), - (0x1e31, 0x1e32), - (0x1e33, 0x1e34), - (0x1e35, 0x1e36), - (0x1e37, 0x1e38), - (0x1e39, 0x1e3a), - (0x1e3b, 0x1e3c), - (0x1e3d, 0x1e3e), - (0x1e3f, 0x1e40), - (0x1e41, 0x1e42), - (0x1e43, 0x1e44), - (0x1e45, 0x1e46), - (0x1e47, 0x1e48), - (0x1e49, 0x1e4a), - (0x1e4b, 0x1e4c), - (0x1e4d, 0x1e4e), - (0x1e4f, 0x1e50), - (0x1e51, 0x1e52), - (0x1e53, 0x1e54), - (0x1e55, 0x1e56), - (0x1e57, 0x1e58), - (0x1e59, 0x1e5a), - (0x1e5b, 0x1e5c), - (0x1e5d, 0x1e5e), - (0x1e5f, 0x1e60), - (0x1e61, 0x1e62), - (0x1e63, 0x1e64), - (0x1e65, 0x1e66), - (0x1e67, 0x1e68), - (0x1e69, 0x1e6a), - (0x1e6b, 0x1e6c), - (0x1e6d, 0x1e6e), - (0x1e6f, 0x1e70), - (0x1e71, 0x1e72), - (0x1e73, 0x1e74), - (0x1e75, 0x1e76), - (0x1e77, 0x1e78), - (0x1e79, 0x1e7a), - (0x1e7b, 0x1e7c), - (0x1e7d, 0x1e7e), - (0x1e7f, 0x1e80), - (0x1e81, 0x1e82), - (0x1e83, 0x1e84), - (0x1e85, 0x1e86), - (0x1e87, 0x1e88), - (0x1e89, 0x1e8a), - (0x1e8b, 0x1e8c), - (0x1e8d, 0x1e8e), - (0x1e8f, 0x1e90), - (0x1e91, 0x1e92), - (0x1e93, 0x1e94), - (0x1e95, 0x1e9a), - (0x1e9c, 0x1e9e), - (0x1e9f, 0x1ea0), - (0x1ea1, 0x1ea2), - (0x1ea3, 0x1ea4), - (0x1ea5, 0x1ea6), - (0x1ea7, 0x1ea8), - (0x1ea9, 0x1eaa), - (0x1eab, 0x1eac), - (0x1ead, 0x1eae), - (0x1eaf, 0x1eb0), - (0x1eb1, 0x1eb2), - (0x1eb3, 0x1eb4), - (0x1eb5, 0x1eb6), - (0x1eb7, 0x1eb8), - (0x1eb9, 0x1eba), - (0x1ebb, 0x1ebc), - (0x1ebd, 0x1ebe), - (0x1ebf, 0x1ec0), - (0x1ec1, 0x1ec2), - (0x1ec3, 0x1ec4), - (0x1ec5, 0x1ec6), - (0x1ec7, 0x1ec8), - (0x1ec9, 0x1eca), - (0x1ecb, 0x1ecc), - (0x1ecd, 0x1ece), - (0x1ecf, 0x1ed0), - (0x1ed1, 0x1ed2), - (0x1ed3, 0x1ed4), - (0x1ed5, 0x1ed6), - (0x1ed7, 0x1ed8), - (0x1ed9, 0x1eda), - (0x1edb, 0x1edc), - (0x1edd, 0x1ede), - (0x1edf, 0x1ee0), - (0x1ee1, 0x1ee2), - (0x1ee3, 0x1ee4), - (0x1ee5, 0x1ee6), - (0x1ee7, 0x1ee8), - (0x1ee9, 0x1eea), - (0x1eeb, 0x1eec), - (0x1eed, 0x1eee), - (0x1eef, 0x1ef0), - (0x1ef1, 0x1ef2), - (0x1ef3, 0x1ef4), - (0x1ef5, 0x1ef6), - (0x1ef7, 0x1ef8), - (0x1ef9, 0x1efa), - (0x1efb, 0x1efc), - (0x1efd, 0x1efe), - (0x1eff, 0x1f08), - (0x1f10, 0x1f16), - (0x1f20, 0x1f28), - (0x1f30, 0x1f38), - (0x1f40, 0x1f46), - (0x1f50, 0x1f58), - (0x1f60, 0x1f68), - (0x1f70, 0x1f71), - (0x1f72, 0x1f73), - (0x1f74, 0x1f75), - (0x1f76, 0x1f77), - (0x1f78, 0x1f79), - (0x1f7a, 0x1f7b), - (0x1f7c, 0x1f7d), - (0x1fb0, 0x1fb2), - (0x1fb6, 0x1fb7), - (0x1fc6, 0x1fc7), - (0x1fd0, 0x1fd3), - (0x1fd6, 0x1fd8), - (0x1fe0, 0x1fe3), - (0x1fe4, 0x1fe8), - (0x1ff6, 0x1ff7), - (0x214e, 0x214f), - (0x2184, 0x2185), - (0x2c30, 0x2c5f), - (0x2c61, 0x2c62), - (0x2c65, 0x2c67), - (0x2c68, 0x2c69), - (0x2c6a, 0x2c6b), - (0x2c6c, 0x2c6d), - (0x2c71, 0x2c72), - (0x2c73, 0x2c75), - (0x2c76, 0x2c7c), - (0x2c81, 0x2c82), - (0x2c83, 0x2c84), - (0x2c85, 0x2c86), - (0x2c87, 0x2c88), - (0x2c89, 0x2c8a), - (0x2c8b, 0x2c8c), - (0x2c8d, 0x2c8e), - (0x2c8f, 0x2c90), - (0x2c91, 0x2c92), - (0x2c93, 0x2c94), - (0x2c95, 0x2c96), - (0x2c97, 0x2c98), - (0x2c99, 0x2c9a), - (0x2c9b, 0x2c9c), - (0x2c9d, 0x2c9e), - (0x2c9f, 0x2ca0), - (0x2ca1, 0x2ca2), - (0x2ca3, 0x2ca4), - (0x2ca5, 0x2ca6), - (0x2ca7, 0x2ca8), - (0x2ca9, 0x2caa), - (0x2cab, 0x2cac), - (0x2cad, 0x2cae), - (0x2caf, 0x2cb0), - (0x2cb1, 0x2cb2), - (0x2cb3, 0x2cb4), - (0x2cb5, 0x2cb6), - (0x2cb7, 0x2cb8), - (0x2cb9, 0x2cba), - (0x2cbb, 0x2cbc), - (0x2cbd, 0x2cbe), - (0x2cbf, 0x2cc0), - (0x2cc1, 0x2cc2), - (0x2cc3, 0x2cc4), - (0x2cc5, 0x2cc6), - (0x2cc7, 0x2cc8), - (0x2cc9, 0x2cca), - (0x2ccb, 0x2ccc), - (0x2ccd, 0x2cce), - (0x2ccf, 0x2cd0), - (0x2cd1, 0x2cd2), - (0x2cd3, 0x2cd4), - (0x2cd5, 0x2cd6), - (0x2cd7, 0x2cd8), - (0x2cd9, 0x2cda), - (0x2cdb, 0x2cdc), - (0x2cdd, 0x2cde), - (0x2cdf, 0x2ce0), - (0x2ce1, 0x2ce2), - (0x2ce3, 0x2ce5), - (0x2cec, 0x2ced), - (0x2cee, 0x2cf2), - (0x2cf3, 0x2cf4), - (0x2d00, 0x2d26), - (0x2d27, 0x2d28), - (0x2d2d, 0x2d2e), - (0x2d30, 0x2d68), - (0x2d7f, 0x2d97), - (0x2da0, 0x2da7), - (0x2da8, 0x2daf), - (0x2db0, 0x2db7), - (0x2db8, 0x2dbf), - (0x2dc0, 0x2dc7), - (0x2dc8, 0x2dcf), - (0x2dd0, 0x2dd7), - (0x2dd8, 0x2ddf), - (0x2de0, 0x2e00), - (0x2e2f, 0x2e30), - (0x3005, 0x3008), - (0x302a, 0x302e), - (0x303c, 0x303d), - (0x3041, 0x3097), - (0x3099, 0x309b), - (0x309d, 0x309f), - (0x30a1, 0x30fb), - (0x30fc, 0x30ff), - (0x3105, 0x312e), - (0x31a0, 0x31bb), - (0x31f0, 0x3200), - (0x3400, 0x4db6), - (0x4e00, 0x9fcd), - (0xa000, 0xa48d), - (0xa4d0, 0xa4fe), - (0xa500, 0xa60d), - (0xa610, 0xa62c), - (0xa641, 0xa642), - (0xa643, 0xa644), - (0xa645, 0xa646), - (0xa647, 0xa648), - (0xa649, 0xa64a), - (0xa64b, 0xa64c), - (0xa64d, 0xa64e), - (0xa64f, 0xa650), - (0xa651, 0xa652), - (0xa653, 0xa654), - (0xa655, 0xa656), - (0xa657, 0xa658), - (0xa659, 0xa65a), - (0xa65b, 0xa65c), - (0xa65d, 0xa65e), - (0xa65f, 0xa660), - (0xa661, 0xa662), - (0xa663, 0xa664), - (0xa665, 0xa666), - (0xa667, 0xa668), - (0xa669, 0xa66a), - (0xa66b, 0xa66c), - (0xa66d, 0xa670), - (0xa674, 0xa67e), - (0xa67f, 0xa680), - (0xa681, 0xa682), - (0xa683, 0xa684), - (0xa685, 0xa686), - (0xa687, 0xa688), - (0xa689, 0xa68a), - (0xa68b, 0xa68c), - (0xa68d, 0xa68e), - (0xa68f, 0xa690), - (0xa691, 0xa692), - (0xa693, 0xa694), - (0xa695, 0xa696), - (0xa697, 0xa698), - (0xa69f, 0xa6e6), - (0xa6f0, 0xa6f2), - (0xa717, 0xa720), - (0xa723, 0xa724), - (0xa725, 0xa726), - (0xa727, 0xa728), - (0xa729, 0xa72a), - (0xa72b, 0xa72c), - (0xa72d, 0xa72e), - (0xa72f, 0xa732), - (0xa733, 0xa734), - (0xa735, 0xa736), - (0xa737, 0xa738), - (0xa739, 0xa73a), - (0xa73b, 0xa73c), - (0xa73d, 0xa73e), - (0xa73f, 0xa740), - (0xa741, 0xa742), - (0xa743, 0xa744), - (0xa745, 0xa746), - (0xa747, 0xa748), - (0xa749, 0xa74a), - (0xa74b, 0xa74c), - (0xa74d, 0xa74e), - (0xa74f, 0xa750), - (0xa751, 0xa752), - (0xa753, 0xa754), - (0xa755, 0xa756), - (0xa757, 0xa758), - (0xa759, 0xa75a), - (0xa75b, 0xa75c), - (0xa75d, 0xa75e), - (0xa75f, 0xa760), - (0xa761, 0xa762), - (0xa763, 0xa764), - (0xa765, 0xa766), - (0xa767, 0xa768), - (0xa769, 0xa76a), - (0xa76b, 0xa76c), - (0xa76d, 0xa76e), - (0xa76f, 0xa770), - (0xa771, 0xa779), - (0xa77a, 0xa77b), - (0xa77c, 0xa77d), - (0xa77f, 0xa780), - (0xa781, 0xa782), - (0xa783, 0xa784), - (0xa785, 0xa786), - (0xa787, 0xa789), - (0xa78c, 0xa78d), - (0xa78e, 0xa78f), - (0xa791, 0xa792), - (0xa793, 0xa794), - (0xa7a1, 0xa7a2), - (0xa7a3, 0xa7a4), - (0xa7a5, 0xa7a6), - (0xa7a7, 0xa7a8), - (0xa7a9, 0xa7aa), - (0xa7fa, 0xa828), - (0xa840, 0xa874), - (0xa880, 0xa8c5), - (0xa8d0, 0xa8da), - (0xa8e0, 0xa8f8), - (0xa8fb, 0xa8fc), - (0xa900, 0xa92e), - (0xa930, 0xa954), - (0xa980, 0xa9c1), - (0xa9cf, 0xa9da), - (0xaa00, 0xaa37), - (0xaa40, 0xaa4e), - (0xaa50, 0xaa5a), - (0xaa60, 0xaa77), - (0xaa7a, 0xaa7c), - (0xaa80, 0xaac3), - (0xaadb, 0xaade), - (0xaae0, 0xaaf0), - (0xaaf2, 0xaaf7), - (0xab01, 0xab07), - (0xab09, 0xab0f), - (0xab11, 0xab17), - (0xab20, 0xab27), - (0xab28, 0xab2f), - (0xabc0, 0xabeb), - (0xabec, 0xabee), - (0xabf0, 0xabfa), - (0xac00, 0xd7a4), - (0xfa0e, 0xfa10), - (0xfa11, 0xfa12), - (0xfa13, 0xfa15), - (0xfa1f, 0xfa20), - (0xfa21, 0xfa22), - (0xfa23, 0xfa25), - (0xfa27, 0xfa2a), - (0xfb1e, 0xfb1f), - (0xfe20, 0xfe27), - (0xfe73, 0xfe74), - (0x10000, 0x1000c), - (0x1000d, 0x10027), - (0x10028, 0x1003b), - (0x1003c, 0x1003e), - (0x1003f, 0x1004e), - (0x10050, 0x1005e), - (0x10080, 0x100fb), - (0x101fd, 0x101fe), - (0x10280, 0x1029d), - (0x102a0, 0x102d1), - (0x10300, 0x1031f), - (0x10330, 0x10341), - (0x10342, 0x1034a), - (0x10380, 0x1039e), - (0x103a0, 0x103c4), - (0x103c8, 0x103d0), - (0x10428, 0x1049e), - (0x104a0, 0x104aa), - (0x10800, 0x10806), - (0x10808, 0x10809), - (0x1080a, 0x10836), - (0x10837, 0x10839), - (0x1083c, 0x1083d), - (0x1083f, 0x10856), - (0x10900, 0x10916), - (0x10920, 0x1093a), - (0x10980, 0x109b8), - (0x109be, 0x109c0), - (0x10a00, 0x10a04), - (0x10a05, 0x10a07), - (0x10a0c, 0x10a14), - (0x10a15, 0x10a18), - (0x10a19, 0x10a34), - (0x10a38, 0x10a3b), - (0x10a3f, 0x10a40), - (0x10a60, 0x10a7d), - (0x10b00, 0x10b36), - (0x10b40, 0x10b56), - (0x10b60, 0x10b73), - (0x10c00, 0x10c49), - (0x11000, 0x11047), - (0x11066, 0x11070), - (0x11080, 0x110bb), - (0x110d0, 0x110e9), - (0x110f0, 0x110fa), - (0x11100, 0x11135), - (0x11136, 0x11140), - (0x11180, 0x111c5), - (0x111d0, 0x111da), - (0x11680, 0x116b8), - (0x116c0, 0x116ca), - (0x12000, 0x1236f), - (0x13000, 0x1342f), - (0x16800, 0x16a39), - (0x16f00, 0x16f45), - (0x16f50, 0x16f7f), - (0x16f8f, 0x16fa0), - (0x1b000, 0x1b002), - (0x20000, 0x2a6d7), - (0x2a700, 0x2b735), - (0x2b740, 0x2b81e), - ), - 'CONTEXTJ': ( - (0x200c, 0x200e), - ), - 'CONTEXTO': ( - (0xb7, 0xb8), - (0x375, 0x376), - (0x5f3, 0x5f5), - (0x660, 0x66a), - (0x6f0, 0x6fa), - (0x30fb, 0x30fc), - ), -} diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py b/Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py deleted file mode 100644 index 4479363cc..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py +++ /dev/null @@ -1,259 +0,0 @@ -# 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/Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py deleted file mode 100644 index 51208b69a..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/selectors.py +++ /dev/null @@ -1,524 +0,0 @@ -# Backport of selectors.py from Python 3.5+ to support Python < 3.4 -# Also has the behavior specified in PEP 475 which is to retry syscalls -# in the case of an EINTR error. This module is required because selectors34 -# does not follow this behavior and instead returns that no dile descriptor -# events have occurred rather than retry the syscall. The decision to drop -# support for select.devpoll is made to maintain 100% test coverage. - -import errno -import math -import select -from collections import namedtuple, Mapping - -import time -try: - monotonic = time.monotonic -except (AttributeError, ImportError): # Python 3.3< - monotonic = time.time - -EVENT_READ = (1 << 0) -EVENT_WRITE = (1 << 1) - -HAS_SELECT = True # Variable that shows whether the platform has a selector. -_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. - - -class SelectorError(Exception): - def __init__(self, errcode): - super(SelectorError, self).__init__() - self.errno = errcode - - def __repr__(self): - return "".format(self.errno) - - def __str__(self): - return self.__repr__() - - -def _fileobj_to_fd(fileobj): - """ Return a file descriptor from a file object. If - given an integer will simply return that integer back. """ - if isinstance(fileobj, int): - fd = fileobj - else: - try: - fd = int(fileobj.fileno()) - except (AttributeError, TypeError, ValueError): - raise ValueError("Invalid file object: {0!r}".format(fileobj)) - if fd < 0: - raise ValueError("Invalid file descriptor: {0}".format(fd)) - return fd - - -def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): - """ Wrapper function for syscalls that could fail due to EINTR. - All functions should be retried if there is time left in the timeout - in accordance with PEP 475. """ - timeout = kwargs.get("timeout", None) - if timeout is None: - expires = None - recalc_timeout = False - else: - timeout = float(timeout) - if timeout < 0.0: # Timeout less than 0 treated as no timeout. - expires = None - else: - expires = monotonic() + timeout - - args = list(args) - if recalc_timeout and "timeout" not in kwargs: - raise ValueError( - "Timeout must be in args or kwargs to be recalculated") - - result = _SYSCALL_SENTINEL - while result is _SYSCALL_SENTINEL: - try: - result = func(*args, **kwargs) - # OSError is thrown by select.select - # IOError is thrown by select.epoll.poll - # select.error is thrown by select.poll.poll - # Aren't we thankful for Python 3.x rework for exceptions? - except (OSError, IOError, select.error) as e: - # select.error wasn't a subclass of OSError in the past. - errcode = None - if hasattr(e, "errno"): - errcode = e.errno - elif hasattr(e, "args"): - errcode = e.args[0] - - # Also test for the Windows equivalent of EINTR. - is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and - errcode == errno.WSAEINTR)) - - if is_interrupt: - if expires is not None: - current_time = monotonic() - if current_time > expires: - raise OSError(errno=errno.ETIMEDOUT) - if recalc_timeout: - if "timeout" in kwargs: - kwargs["timeout"] = expires - current_time - continue - if errcode: - raise SelectorError(errcode) - else: - raise - return result - - -SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) - - -class _SelectorMapping(Mapping): - """ Mapping of file objects to selector keys """ - - def __init__(self, selector): - self._selector = selector - - def __len__(self): - return len(self._selector._fd_to_key) - - def __getitem__(self, fileobj): - try: - fd = self._selector._fileobj_lookup(fileobj) - return self._selector._fd_to_key[fd] - except KeyError: - raise KeyError("{0!r} is not registered.".format(fileobj)) - - def __iter__(self): - return iter(self._selector._fd_to_key) - - -class BaseSelector(object): - """ Abstract Selector class - - A selector supports registering file objects to be monitored - for specific I/O events. - - A file object is a file descriptor or any object with a - `fileno()` method. An arbitrary object can be attached to the - file object which can be used for example to store context info, - a callback, etc. - - A selector can use various implementations (select(), poll(), epoll(), - and kqueue()) depending on the platform. The 'DefaultSelector' class uses - the most efficient implementation for the current platform. - """ - def __init__(self): - # Maps file descriptors to keys. - self._fd_to_key = {} - - # Read-only mapping returned by get_map() - self._map = _SelectorMapping(self) - - def _fileobj_lookup(self, fileobj): - """ Return a file descriptor from a file object. - This wraps _fileobj_to_fd() to do an exhaustive - search in case the object is invalid but we still - have it in our map. Used by unregister() so we can - unregister an object that was previously registered - even if it is closed. It is also used by _SelectorMapping - """ - try: - return _fileobj_to_fd(fileobj) - except ValueError: - - # Search through all our mapped keys. - for key in self._fd_to_key.values(): - if key.fileobj is fileobj: - return key.fd - - # Raise ValueError after all. - raise - - def register(self, fileobj, events, data=None): - """ Register a file object for a set of events to monitor. """ - if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): - raise ValueError("Invalid events: {0!r}".format(events)) - - key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) - - if key.fd in self._fd_to_key: - raise KeyError("{0!r} (FD {1}) is already registered" - .format(fileobj, key.fd)) - - self._fd_to_key[key.fd] = key - return key - - def unregister(self, fileobj): - """ Unregister a file object from being monitored. """ - try: - key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - return key - - def modify(self, fileobj, events, data=None): - """ Change a registered file object monitored events and data. """ - # NOTE: Some subclasses optimize this operation even further. - try: - key = self._fd_to_key[self._fileobj_lookup(fileobj)] - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - if events != key.events: - self.unregister(fileobj) - key = self.register(fileobj, events, data) - - elif data != key.data: - # Use a shortcut to update the data. - key = key._replace(data=data) - self._fd_to_key[key.fd] = key - - return key - - def select(self, timeout=None): - """ Perform the actual selection until some monitored file objects - are ready or the timeout expires. """ - raise NotImplementedError() - - def close(self): - """ Close the selector. This must be called to ensure that all - underlying resources are freed. """ - self._fd_to_key.clear() - self._map = None - - def get_key(self, fileobj): - """ Return the key associated with a registered file object. """ - mapping = self.get_map() - if mapping is None: - raise RuntimeError("Selector is closed") - try: - return mapping[fileobj] - except KeyError: - raise KeyError("{0!r} is not registered".format(fileobj)) - - def get_map(self): - """ Return a mapping of file objects to selector keys """ - return self._map - - def _key_from_fd(self, fd): - """ Return the key associated to a given file descriptor - Return None if it is not found. """ - try: - return self._fd_to_key[fd] - except KeyError: - return None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - -# Almost all platforms have select.select() -if hasattr(select, "select"): - class SelectSelector(BaseSelector): - """ Select-based selector. """ - def __init__(self): - super(SelectSelector, self).__init__() - self._readers = set() - self._writers = set() - - def register(self, fileobj, events, data=None): - key = super(SelectSelector, self).register(fileobj, events, data) - if events & EVENT_READ: - self._readers.add(key.fd) - if events & EVENT_WRITE: - self._writers.add(key.fd) - return key - - def unregister(self, fileobj): - key = super(SelectSelector, self).unregister(fileobj) - self._readers.discard(key.fd) - self._writers.discard(key.fd) - return key - - def _select(self, r, w, timeout=None): - """ Wrapper for select.select because timeout is a positional arg """ - return select.select(r, w, [], timeout) - - def select(self, timeout=None): - # Selecting on empty lists on Windows errors out. - if not len(self._readers) and not len(self._writers): - return [] - - timeout = None if timeout is None else max(timeout, 0.0) - ready = [] - r, w, _ = _syscall_wrapper(self._select, True, self._readers, - self._writers, timeout) - r = set(r) - w = set(w) - for fd in r | w: - events = 0 - if fd in r: - events |= EVENT_READ - if fd in w: - events |= EVENT_WRITE - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - return ready - - -if hasattr(select, "poll"): - class PollSelector(BaseSelector): - """ Poll-based selector """ - def __init__(self): - super(PollSelector, self).__init__() - self._poll = select.poll() - - def register(self, fileobj, events, data=None): - key = super(PollSelector, self).register(fileobj, events, data) - event_mask = 0 - if events & EVENT_READ: - event_mask |= select.POLLIN - if events & EVENT_WRITE: - event_mask |= select.POLLOUT - self._poll.register(key.fd, event_mask) - return key - - def unregister(self, fileobj): - key = super(PollSelector, self).unregister(fileobj) - self._poll.unregister(key.fd) - return key - - def _wrap_poll(self, timeout=None): - """ Wrapper function for select.poll.poll() so that - _syscall_wrapper can work with only seconds. """ - if timeout is not None: - if timeout <= 0: - timeout = 0 - else: - # select.poll.poll() has a resolution of 1 millisecond, - # round away from zero to wait *at least* timeout seconds. - timeout = math.ceil(timeout * 1e3) - - result = self._poll.poll(timeout) - return result - - def select(self, timeout=None): - ready = [] - fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) - for fd, event_mask in fd_events: - events = 0 - if event_mask & ~select.POLLIN: - events |= EVENT_WRITE - if event_mask & ~select.POLLOUT: - events |= EVENT_READ - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - - return ready - - -if hasattr(select, "epoll"): - class EpollSelector(BaseSelector): - """ Epoll-based selector """ - def __init__(self): - super(EpollSelector, self).__init__() - self._epoll = select.epoll() - - def fileno(self): - return self._epoll.fileno() - - def register(self, fileobj, events, data=None): - key = super(EpollSelector, self).register(fileobj, events, data) - events_mask = 0 - if events & EVENT_READ: - events_mask |= select.EPOLLIN - if events & EVENT_WRITE: - events_mask |= select.EPOLLOUT - _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) - return key - - def unregister(self, fileobj): - key = super(EpollSelector, self).unregister(fileobj) - try: - _syscall_wrapper(self._epoll.unregister, False, key.fd) - except SelectorError: - # This can occur when the fd was closed since registry. - pass - return key - - def select(self, timeout=None): - if timeout is not None: - if timeout <= 0: - timeout = 0.0 - else: - # select.epoll.poll() has a resolution of 1 millisecond - # but luckily takes seconds so we don't need a wrapper - # like PollSelector. Just for better rounding. - timeout = math.ceil(timeout * 1e3) * 1e-3 - timeout = float(timeout) - else: - timeout = -1.0 # epoll.poll() must have a float. - - # We always want at least 1 to ensure that select can be called - # with no file descriptors registered. Otherwise will fail. - max_events = max(len(self._fd_to_key), 1) - - ready = [] - fd_events = _syscall_wrapper(self._epoll.poll, True, - timeout=timeout, - maxevents=max_events) - for fd, event_mask in fd_events: - events = 0 - if event_mask & ~select.EPOLLIN: - events |= EVENT_WRITE - if event_mask & ~select.EPOLLOUT: - events |= EVENT_READ - - key = self._key_from_fd(fd) - if key: - ready.append((key, events & key.events)) - return ready - - def close(self): - self._epoll.close() - super(EpollSelector, self).close() - - -if hasattr(select, "kqueue"): - class KqueueSelector(BaseSelector): - """ Kqueue / Kevent-based selector """ - def __init__(self): - super(KqueueSelector, self).__init__() - self._kqueue = select.kqueue() - - def fileno(self): - return self._kqueue.fileno() - - def register(self, fileobj, events, data=None): - key = super(KqueueSelector, self).register(fileobj, events, data) - if events & EVENT_READ: - kevent = select.kevent(key.fd, - select.KQ_FILTER_READ, - select.KQ_EV_ADD) - - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - - if events & EVENT_WRITE: - kevent = select.kevent(key.fd, - select.KQ_FILTER_WRITE, - select.KQ_EV_ADD) - - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - - return key - - def unregister(self, fileobj): - key = super(KqueueSelector, self).unregister(fileobj) - if key.events & EVENT_READ: - kevent = select.kevent(key.fd, - select.KQ_FILTER_READ, - select.KQ_EV_DELETE) - try: - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - except SelectorError: - pass - if key.events & EVENT_WRITE: - kevent = select.kevent(key.fd, - select.KQ_FILTER_WRITE, - select.KQ_EV_DELETE) - try: - _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) - except SelectorError: - pass - - return key - - def select(self, timeout=None): - if timeout is not None: - timeout = max(timeout, 0) - - max_events = len(self._fd_to_key) * 2 - ready_fds = {} - - kevent_list = _syscall_wrapper(self._kqueue.control, True, - None, max_events, timeout) - - for kevent in kevent_list: - fd = kevent.ident - event_mask = kevent.filter - events = 0 - if event_mask == select.KQ_FILTER_READ: - events |= EVENT_READ - if event_mask == select.KQ_FILTER_WRITE: - events |= EVENT_WRITE - - key = self._key_from_fd(fd) - if key: - if key.fd not in ready_fds: - ready_fds[key.fd] = (key, events & key.events) - else: - old_events = ready_fds[key.fd][1] - ready_fds[key.fd] = (key, (events | old_events) & key.events) - - return list(ready_fds.values()) - - def close(self): - self._kqueue.close() - super(KqueueSelector, self).close() - - -# Choose the best implementation, roughly: -# kqueue == epoll > poll > select. Devpoll not supported. (See above) -# select() also can't accept a FD > FD_SETSIZE (usually around 1024) -if 'KqueueSelector' in globals(): # Platform-specific: Mac OS and BSD - DefaultSelector = KqueueSelector -elif 'EpollSelector' in globals(): # Platform-specific: Linux - DefaultSelector = EpollSelector -elif 'PollSelector' in globals(): # Platform-specific: Linux - DefaultSelector = PollSelector -elif 'SelectSelector' in globals(): # Platform-specific: Windows - DefaultSelector = SelectSelector -else: # Platform-specific: AppEngine - def no_selector(_): - raise ValueError("Platform does not have a selector") - DefaultSelector = no_selector - HAS_SELECT = False diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py b/Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py deleted file mode 100644 index cb396e508..000000000 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/wait.py +++ /dev/null @@ -1,40 +0,0 @@ -from .selectors import ( - HAS_SELECT, - DefaultSelector, - EVENT_READ, - EVENT_WRITE -) - - -def _wait_for_io_events(socks, events, timeout=None): - """ Waits for IO events to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be interacted with immediately. """ - if not HAS_SELECT: - raise ValueError('Platform does not have a selector') - if not isinstance(socks, list): - # Probably just a single socket. - if hasattr(socks, "fileno"): - socks = [socks] - # Otherwise it might be a non-list iterable. - else: - socks = list(socks) - with DefaultSelector() as selector: - for sock in socks: - selector.register(sock, events) - return [key[0].fileobj for key in - selector.select(timeout) if key[1] & events] - - -def wait_for_read(socks, timeout=None): - """ Waits for reading to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be read from immediately. """ - return _wait_for_io_events(socks, EVENT_READ, timeout) - - -def wait_for_write(socks, timeout=None): - """ Waits for writing to be available from a list of sockets - or optionally a single socket if passed in. Returns a list of - sockets that can be written to immediately. """ - return _wait_for_io_events(socks, EVENT_WRITE, timeout) diff --git a/Contents/Libraries/Shared/requests/sessions.py b/Contents/Libraries/Shared/requests/sessions.py index 7983282a6..d73d700fa 100644 --- a/Contents/Libraries/Shared/requests/sessions.py +++ b/Contents/Libraries/Shared/requests/sessions.py @@ -8,22 +8,22 @@ requests (cookies, auth, proxies). """ import os -from collections import Mapping -from datetime import datetime +import sys +import time +from datetime import timedelta from .auth import _basic_auth_str -from .compat import cookielib, OrderedDict, urljoin, urlparse +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping 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 ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS from .exceptions import ( TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) -from .packages.urllib3._collections import RecentlyUsedContainer -from .structures import CaseInsensitiveDict +from .structures import CaseInsensitiveDict from .adapters import HTTPAdapter from .utils import ( @@ -36,7 +36,14 @@ # formerly defined here, reexposed here for backward compatibility from .models import REDIRECT_STATI -REDIRECT_CACHE_SIZE = 1000 +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time def merge_setting(request_setting, session_setting, dict_class=OrderedDict): @@ -86,42 +93,91 @@ def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses.""" + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" - i = 0 - hist = [] # keep track of history + hist = [] # keep track of history - while resp.is_redirect: + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: 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 + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] 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: + if len(resp.history) >= self.max_redirects: raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) # Release the connection back into the pool. resp.close() - url = resp.headers['location'] - # Handle redirection without scheme (see: RFC 1808 Section 4) if url.startswith('//'): parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (parsed_rurl.scheme, url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - # The scheme should be lower case... + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment url = parsed.geturl() # Facilitate relative 'location' headers, as allowed by RFC 7231. @@ -133,15 +189,12 @@ def resolve_redirects(self, resp, req, stream=False, timeout=None, 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 self.rebuild_method(prepared_request, resp) - # https://github.com/kennethreitz/requests/issues/1084 + # https://github.com/requests/requests/issues/1084 if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/kennethreitz/requests/issues/3490 + # https://github.com/requests/requests/issues/3490 purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') for header in purged_headers: prepared_request.headers.pop(header, None) @@ -179,21 +232,26 @@ def resolve_redirects(self, resp, req, stream=False, timeout=None, # Override the original request. req = prepared_request - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - i += 1 - yield resp + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp def rebuild_auth(self, prepared_request, response): """When being redirected we may want to strip authentication from the @@ -203,14 +261,10 @@ def rebuild_auth(self, prepared_request, response): headers = prepared_request.headers url = prepared_request.url - if 'Authorization' in headers: + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): # 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'] + 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 @@ -231,13 +285,16 @@ def rebuild_proxies(self, prepared_request, proxies): :rtype: dict """ + proxies = proxies if proxies is not None else {} headers = prepared_request.headers url = prepared_request.url scheme = urlparse(url).scheme - new_proxies = proxies.copy() if proxies is not None else {} + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') - if self.trust_env and not should_bypass_proxies(url): - environ_proxies = get_environ_proxies(url) + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) proxy = environ_proxies.get(scheme, environ_proxies.get('all')) @@ -263,7 +320,7 @@ def rebuild_method(self, prepared_request, response): """ method = prepared_request.method - # http://tools.ietf.org/html/rfc7231#section-6.4.4 + # https://tools.ietf.org/html/rfc7231#section-6.4.4 if response.status_code == codes.see_other and method != 'HEAD': method = 'GET' @@ -289,13 +346,13 @@ class Session(SessionRedirectMixin): >>> import requests >>> s = requests.Session() - >>> s.get('http://httpbin.org/get') + >>> s.get('https://httpbin.org/get') Or as a context manager:: >>> with requests.Session() as s: - >>> s.get('http://httpbin.org/get') + >>> s.get('https://httpbin.org/get') """ @@ -335,7 +392,8 @@ def __init__(self): #: SSL Verification default. self.verify = True - #: SSL client certificate default. + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. self.cert = None #: Maximum number of redirects allowed. If the request exceeds this @@ -359,9 +417,6 @@ def __init__(self): 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 @@ -409,20 +464,9 @@ def prepare_request(self, request): 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): + 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. @@ -430,8 +474,8 @@ def request(self, method, url, :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 data: (optional) Dictionary, list of tuples, 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 headers: (optional) Dictionary of HTTP Headers to send with the @@ -452,24 +496,25 @@ def request(self, method, url, hostname to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. - :param verify: (optional) whether the SSL cert will be verified. - A CA_BUNDLE path can also be provided. Defaults to ``True``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :rtype: requests.Response """ # 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, + 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) @@ -490,7 +535,7 @@ def request(self, method, url, return resp def get(self, url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. + r"""Sends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -501,7 +546,7 @@ def get(self, url, **kwargs): return self.request('GET', url, **kwargs) def options(self, url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. + r"""Sends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -512,7 +557,7 @@ def options(self, url, **kwargs): return self.request('OPTIONS', url, **kwargs) def head(self, url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. + r"""Sends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -523,10 +568,11 @@ def head(self, url, **kwargs): return self.request('HEAD', url, **kwargs) def post(self, url, data=None, json=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. + r"""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 data: (optional) Dictionary, list of tuples, 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. :rtype: requests.Response @@ -535,10 +581,11 @@ def post(self, url, data=None, json=None, **kwargs): 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. + r"""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 data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ @@ -546,18 +593,19 @@ def put(self, url, data=None, **kwargs): return self.request('PUT', url, data=data, **kwargs) def patch(self, url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. + r"""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 data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ - return self.request('PATCH', url, data=data, **kwargs) + return self.request('PATCH', url, data=data, **kwargs) def delete(self, url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. + r"""Sends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. @@ -567,8 +615,7 @@ def delete(self, url, **kwargs): return self.request('DELETE', url, **kwargs) def send(self, request, **kwargs): - """ - Send a given PreparedRequest. + """Send a given PreparedRequest. :rtype: requests.Response """ @@ -589,27 +636,18 @@ def send(self, request, **kwargs): stream = kwargs.get('stream') hooks = request.hooks - # Resolve URL in redirect cache, if available. - if allow_redirects: - 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 - # Get the appropriate adapter to use adapter = self.get_adapter(url=request.url) # Start time (approximately) of the request - start = datetime.utcnow() + start = preferred_clock() # Send the request r = adapter.send(request, **kwargs) # Total elapsed time of the request (approximately) - r.elapsed = datetime.utcnow() - start + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) # Response manipulation hooks r = dispatch_hook('response', hooks, r, **kwargs) @@ -637,6 +675,13 @@ def send(self, request, **kwargs): r = history.pop() r.history = history + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + if not stream: r.content @@ -651,7 +696,8 @@ def merge_environment_settings(self, url, proxies, stream, verify, cert): # Gather clues from the surrounding environment. if self.trust_env: # Set environment's proxies. - env_proxies = get_environ_proxies(url) or {} + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) for (k, v) in env_proxies.items(): proxies.setdefault(k, v) @@ -678,7 +724,7 @@ def get_adapter(self, url): """ for (prefix, adapter) in self.adapters.items(): - if url.lower().startswith(prefix): + if url.lower().startswith(prefix.lower()): return adapter # Nothing matches :-/ @@ -692,7 +738,7 @@ def close(self): def mount(self, prefix, adapter): """Registers a connection adapter to a prefix. - Adapters are sorted in descending order by key length. + Adapters are sorted in descending order by prefix length. """ self.adapters[prefix] = adapter keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] @@ -701,25 +747,24 @@ def mount(self, prefix, adapter): 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) + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} 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. + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + :rtype: Session """ - return Session() diff --git a/Contents/Libraries/Shared/requests/status_codes.py b/Contents/Libraries/Shared/requests/status_codes.py index db2986bb1..813e8c4e6 100644 --- a/Contents/Libraries/Shared/requests/status_codes.py +++ b/Contents/Libraries/Shared/requests/status_codes.py @@ -1,5 +1,22 @@ # -*- coding: utf-8 -*- +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + from .structures import LookupDict _codes = { @@ -84,8 +101,20 @@ codes = LookupDict(name='status_codes') -for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith('\\'): - setattr(codes, title.upper(), code) +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/Contents/Libraries/Shared/requests/structures.py b/Contents/Libraries/Shared/requests/structures.py index 05d2b3f57..da930e285 100644 --- a/Contents/Libraries/Shared/requests/structures.py +++ b/Contents/Libraries/Shared/requests/structures.py @@ -7,16 +7,14 @@ Data structures that power Requests. """ -import collections +from .compat import OrderedDict, Mapping, MutableMapping -from .compat import OrderedDict - -class CaseInsensitiveDict(collections.MutableMapping): +class CaseInsensitiveDict(MutableMapping): """A case-insensitive ``dict``-like object. Implements all methods and operations of - ``collections.MutableMapping`` as well as dict's ``copy``. Also + ``MutableMapping`` as well as dict's ``copy``. Also provides ``lower_items``. All keys are expected to be strings. The structure remembers the @@ -71,7 +69,7 @@ def lower_items(self): ) def __eq__(self, other): - if isinstance(other, collections.Mapping): + if isinstance(other, Mapping): other = CaseInsensitiveDict(other) else: return NotImplemented diff --git a/Contents/Libraries/Shared/requests/utils.py b/Contents/Libraries/Shared/requests/utils.py index 47325090c..8170a8d2c 100644 --- a/Contents/Libraries/Shared/requests/utils.py +++ b/Contents/Libraries/Shared/requests/utils.py @@ -8,35 +8,92 @@ that are also useful for external consumption. """ -import cgi import codecs -import collections +import contextlib import io import os import re import socket import struct +import sys +import tempfile import warnings +import zipfile -from . import __version__ +from .__version__ import __version__ from . import certs # to_native_string is unused here, but imported here for backwards compatibility from ._internal_utils import to_native_string from .compat import parse_http_list as _parse_list_header from .compat import ( quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types) -from .cookies import RequestsCookieJar, cookiejar_from_dict + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict from .structures import CaseInsensitiveDict from .exceptions import ( InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) -_hush_pyflakes = (RequestsCookieJar,) - NETRC_FILES = ('.netrc', '_netrc') DEFAULT_CA_BUNDLE_PATH = certs.where() +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + def dict_to_sequence(d): """Returns an internal sequence dictionary update.""" @@ -91,14 +148,16 @@ def super_len(o): else: if hasattr(o, 'seek') and total_length is None: # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 if total_length is None: total_length = 0 @@ -116,11 +175,11 @@ def get_netrc_auth(url, raise_errors=False): for f in NETRC_FILES: try: - loc = os.path.expanduser('~/{0}'.format(f)) + loc = os.path.expanduser('~/{}'.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 + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 return if os.path.exists(loc): @@ -165,6 +224,38 @@ def guess_filename(obj): return os.path.basename(name) +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + 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 @@ -175,7 +266,7 @@ def from_key_val_list(value): >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') - ValueError: need more than 1 value to unpack + ValueError: cannot encode objects that are not 2-tuples >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) @@ -211,7 +302,7 @@ def to_key_val_list(value): if isinstance(value, (str, bytes, bool, int)): raise ValueError('cannot encode objects that are not 2-tuples') - if isinstance(value, collections.Mapping): + if isinstance(value, Mapping): value = value.items() return list(value) @@ -356,6 +447,31 @@ def get_encodings_from_content(content): xml_re.findall(content)) +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + def get_encoding_from_headers(headers): """Returns encodings from given HTTP Header Dict. @@ -368,7 +484,7 @@ def get_encoding_from_headers(headers): if not content_type: return None - content_type, params = cgi.parse_header(content_type) + content_type, params = _parse_content_type_header(content_type) if 'charset' in params: return params['charset'].strip("'\"") @@ -443,8 +559,7 @@ def get_unicode_from_response(r): # The unreserved URI characters (RFC 3986) UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - + "0123456789-._~") + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") def unquote_unreserved(uri): @@ -494,7 +609,7 @@ def requote_uri(uri): def address_in_network(ip, net): - """This function allows you to check if on IP belongs to a network subnet + """This function allows you to check if an 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 @@ -554,53 +669,82 @@ def is_valid_cidr(string_network): return True -def should_bypass_proxies(url): +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): """ Returns whether we should bypass proxies or not. :rtype: bool """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). 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 + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True 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. + # the end of the hostname, both with and without the port. no_proxy = ( host for host in no_proxy.replace(' ', '').split(',') if host ) - ip = netloc.split(':')[0] - if is_ipv4_address(ip): + if is_ipv4_address(parsed.hostname): for proxy_ip in no_proxy: if is_valid_cidr(proxy_ip): - if address_in_network(ip, proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): return True - elif ip == proxy_ip: + elif parsed.hostname == proxy_ip: # If no_proxy ip was defined in plain IP notation instead of cidr notation & # matches the IP of the index return True else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + for host in no_proxy: - if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + if parsed.hostname.endswith(host) or host_with_port.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 + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False if bypass: return True @@ -608,13 +752,13 @@ def should_bypass_proxies(url): return False -def get_environ_proxies(url): +def get_environ_proxies(url, no_proxy=None): """ Return a dict of environment proxies. :rtype: dict """ - if should_bypass_proxies(url): + if should_bypass_proxies(url, no_proxy=no_proxy): return {} else: return getproxies() @@ -668,7 +812,7 @@ def default_headers(): def parse_header_links(value): - """Return a dict of parsed link headers proxies. + """Return a list of parsed link headers proxies. i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" @@ -679,6 +823,10 @@ def parse_header_links(value): replace_chars = ' \'"' + value = value.strip(replace_chars) + if not value: + return links + for val in re.split(', *<', value): try: url, params = val.split(';', 1) @@ -775,6 +923,7 @@ def get_auth_from_url(url): _CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') _CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + def check_header_validity(header): """Verifies that header value is a string which doesn't contain leading whitespace or return characters. This prevents unintended @@ -792,8 +941,8 @@ def check_header_validity(header): if not pat.match(value): raise InvalidHeader("Invalid return character or leading space in header: %s" % name) except TypeError: - raise InvalidHeader("Header value %s must be of type str or bytes, " - "not %s" % (value, type(value))) + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) def urldefragauth(url): @@ -812,6 +961,7 @@ def urldefragauth(url): return urlunparse((scheme, netloc, path, params, query, '')) + def rewind_body(prepared_request): """Move file pointer back to its recorded starting position so it can be read again on redirect. @@ -821,7 +971,7 @@ def rewind_body(prepared_request): try: body_seek(prepared_request._body_position) except (IOError, OSError): - raise UnrewindableBodyError("An error occured when rewinding request " + raise UnrewindableBodyError("An error occurred when rewinding request " "body for redirect.") else: raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/Contents/Libraries/Shared/requests_toolbelt/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/__init__.py new file mode 100644 index 000000000..e7c3ccb63 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/__init__.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +""" +requests-toolbelt +================= + +See https://toolbelt.readthedocs.io/ for documentation + +:copyright: (c) 2014 by Ian Cordasco and Cory Benfield +:license: Apache v2.0, see LICENSE for more details +""" + +from .adapters import SSLAdapter, SourceAddressAdapter +from .auth.guess import GuessAuth +from .multipart import ( + MultipartEncoder, MultipartEncoderMonitor, MultipartDecoder, + ImproperBodyPartContentException, NonMultipartContentTypeException + ) +from .streaming_iterator import StreamingIterator +from .utils.user_agent import user_agent + +__title__ = 'requests-toolbelt' +__authors__ = 'Ian Cordasco, Cory Benfield' +__license__ = 'Apache v2.0' +__copyright__ = 'Copyright 2014 Ian Cordasco, Cory Benfield' +__version__ = '0.9.1' +__version_info__ = tuple(int(i) for i in __version__.split('.')) + +__all__ = [ + 'GuessAuth', 'MultipartEncoder', 'MultipartEncoderMonitor', + 'MultipartDecoder', 'SSLAdapter', 'SourceAddressAdapter', + 'StreamingIterator', 'user_agent', 'ImproperBodyPartContentException', + 'NonMultipartContentTypeException', '__title__', '__authors__', + '__license__', '__copyright__', '__version__', '__version_info__', +] diff --git a/Contents/Libraries/Shared/requests_toolbelt/_compat.py b/Contents/Libraries/Shared/requests_toolbelt/_compat.py new file mode 100644 index 000000000..7927a382f --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/_compat.py @@ -0,0 +1,324 @@ +"""Private module full of compatibility hacks. + +Primarily this is for downstream redistributions of requests that unvendor +urllib3 without providing a shim. + +.. warning:: + + This module is private. If you use it, and something breaks, you were + warned +""" +import sys + +import requests + +try: + from requests.packages.urllib3 import fields + from requests.packages.urllib3 import filepost + from requests.packages.urllib3 import poolmanager +except ImportError: + from urllib3 import fields + from urllib3 import filepost + from urllib3 import poolmanager + +try: + from requests.packages.urllib3.connection import HTTPConnection + from requests.packages.urllib3 import connection +except ImportError: + try: + from urllib3.connection import HTTPConnection + from urllib3 import connection + except ImportError: + HTTPConnection = None + connection = None + + +if requests.__build__ < 0x020300: + timeout = None +else: + try: + from requests.packages.urllib3.util import timeout + except ImportError: + from urllib3.util import timeout + +if requests.__build__ < 0x021000: + gaecontrib = None +else: + try: + from requests.packages.urllib3.contrib import appengine as gaecontrib + except ImportError: + from urllib3.contrib import appengine as gaecontrib + +if requests.__build__ < 0x021200: + PyOpenSSLContext = None +else: + try: + from requests.packages.urllib3.contrib.pyopenssl \ + import PyOpenSSLContext + except ImportError: + try: + from urllib3.contrib.pyopenssl import PyOpenSSLContext + except ImportError: + PyOpenSSLContext = None + +PY3 = sys.version_info > (3, 0) + +if PY3: + from collections.abc import Mapping, MutableMapping + import queue + from urllib.parse import urlencode, urljoin +else: + from collections import Mapping, MutableMapping + import Queue as queue + from urllib import urlencode + from urlparse import urljoin + +try: + basestring = basestring +except NameError: + basestring = (str, bytes) + + +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' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = {} + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = (key, val) + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return ({k.lower(): v for k, v in self.itermerged()} == + {k.lower(): v for k, v in other.itermerged()}) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + """D.pop(k[,d]) -> v, remove specified key and return its value. + + If key is not found, d is returned if given, otherwise KeyError is + raised. + """ + # Using the MutableMapping function directly fails due to the private + # marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """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' + """ + key_lower = key.lower() + new_vals = key, val + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + # new_vals was not inserted, as there was a previous one + if isinstance(vals, list): + # If already several items got inserted, we have a list + vals.append(val) + else: + # vals should be a tuple then, i.e. only one item so far + # Need to convert the tuple to list for further extension + self._container[key_lower] = [vals[0], vals[1], val] + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(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.""" + try: + vals = self._container[key.lower()] + except KeyError: + return [] + else: + if isinstance(vals, tuple): + return [vals[1]] + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) + + +__all__ = ( + 'basestring', + 'connection', + 'fields', + 'filepost', + 'poolmanager', + 'timeout', + 'HTTPHeaderDict', + 'queue', + 'urlencode', + 'gaecontrib', + 'urljoin', + 'PyOpenSSLContext', +) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py new file mode 100644 index 000000000..7195f43e3 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +""" +requests-toolbelt.adapters +========================== + +See https://toolbelt.readthedocs.io/ for documentation + +:copyright: (c) 2014 by Ian Cordasco and Cory Benfield +:license: Apache v2.0, see LICENSE for more details +""" + +from .ssl import SSLAdapter +from .source import SourceAddressAdapter + +__all__ = ['SSLAdapter', 'SourceAddressAdapter'] diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py new file mode 100644 index 000000000..25a70a176 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/appengine.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""The App Engine Transport Adapter for requests. + +.. versionadded:: 0.6.0 + +This requires a version of requests >= 2.10.0 and Python 2. + +There are two ways to use this library: + +#. If you're using requests directly, you can use code like: + + .. code-block:: python + + >>> import requests + >>> import ssl + >>> import requests.packages.urllib3.contrib.appengine as ul_appengine + >>> from requests_toolbelt.adapters import appengine + >>> s = requests.Session() + >>> if ul_appengine.is_appengine_sandbox(): + ... s.mount('http://', appengine.AppEngineAdapter()) + ... s.mount('https://', appengine.AppEngineAdapter()) + +#. If you depend on external libraries which use requests, you can use code + like: + + .. code-block:: python + + >>> from requests_toolbelt.adapters import appengine + >>> appengine.monkeypatch() + +which will ensure all requests.Session objects use AppEngineAdapter properly. + +You are also able to :ref:`disable certificate validation ` +when monkey-patching. +""" +import requests +import warnings +from requests import adapters +from requests import sessions + +from .. import exceptions as exc +from .._compat import gaecontrib +from .._compat import timeout + + +class AppEngineMROHack(adapters.HTTPAdapter): + """Resolves infinite recursion when monkeypatching. + + This works by injecting itself as the base class of both the + :class:`AppEngineAdapter` and Requests' default HTTPAdapter, which needs to + be done because default HTTPAdapter's MRO is recompiled when we + monkeypatch, at which point this class becomes HTTPAdapter's base class. + In addition, we use an instantiation flag to avoid infinite recursion. + """ + _initialized = False + + def __init__(self, *args, **kwargs): + if not self._initialized: + self._initialized = True + super(AppEngineMROHack, self).__init__(*args, **kwargs) + + +class AppEngineAdapter(AppEngineMROHack, adapters.HTTPAdapter): + """The transport adapter for Requests to use urllib3's GAE support. + + Implements Requests's HTTPAdapter API. + + When deploying to Google's App Engine service, some of Requests' + functionality is broken. There is underlying support for GAE in urllib3. + This functionality, however, is opt-in and needs to be enabled explicitly + for Requests to be able to use it. + """ + + __attrs__ = adapters.HTTPAdapter.__attrs__ + ['_validate_certificate'] + + def __init__(self, validate_certificate=True, *args, **kwargs): + _check_version() + self._validate_certificate = validate_certificate + super(AppEngineAdapter, self).__init__(*args, **kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = _AppEnginePoolManager(self._validate_certificate) + + +class InsecureAppEngineAdapter(AppEngineAdapter): + """An always-insecure GAE adapter for Requests. + + This is a variant of the the transport adapter for Requests to use + urllib3's GAE support that does not validate certificates. Use with + caution! + + .. note:: + The ``validate_certificate`` keyword argument will not be honored here + and is not part of the signature because we always force it to + ``False``. + + See :class:`AppEngineAdapter` for further details. + """ + + def __init__(self, *args, **kwargs): + if kwargs.pop("validate_certificate", False): + warnings.warn("Certificate validation cannot be specified on the " + "InsecureAppEngineAdapter, but was present. This " + "will be ignored and certificate validation will " + "remain off.", exc.IgnoringGAECertificateValidation) + + super(InsecureAppEngineAdapter, self).__init__( + validate_certificate=False, *args, **kwargs) + + +class _AppEnginePoolManager(object): + """Implements urllib3's PoolManager API expected by requests. + + While a real PoolManager map hostnames to reusable Connections, + AppEngine has no concept of a reusable connection to a host. + So instead, this class constructs a small Connection per request, + that is returned to the Adapter and used to access the URL. + """ + + def __init__(self, validate_certificate=True): + self.appengine_manager = gaecontrib.AppEngineManager( + validate_certificate=validate_certificate) + + def connection_from_url(self, url): + return _AppEngineConnection(self.appengine_manager, url) + + def clear(self): + pass + + +class _AppEngineConnection(object): + """Implements urllib3's HTTPConnectionPool API's urlopen(). + + This Connection's urlopen() is called with a host-relative path, + so in order to properly support opening the URL, we need to store + the full URL when this Connection is constructed from the PoolManager. + + This code wraps AppEngineManager.urlopen(), which exposes a different + API than in the original urllib3 urlopen(), and thus needs this adapter. + """ + + def __init__(self, appengine_manager, url): + self.appengine_manager = appengine_manager + self.url = url + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, + timeout=timeout.Timeout.DEFAULT_TIMEOUT, + pool_timeout=None, release_conn=None, **response_kw): + # This function's url argument is a host-relative URL, + # but the AppEngineManager expects an absolute URL. + # So we saved out the self.url when the AppEngineConnection + # was constructed, which we then can use down below instead. + + # We once tried to verify our assumptions here, but sometimes the + # passed-in URL differs on url fragments, or "http://a.com" vs "/". + + # urllib3's App Engine adapter only uses Timeout.total, not read or + # connect. + if not timeout.total: + timeout.total = timeout._read or timeout._connect + + # Jump through the hoops necessary to call AppEngineManager's API. + return self.appengine_manager.urlopen( + method, + self.url, + body=body, + headers=headers, + retries=retries, + redirect=redirect, + timeout=timeout, + **response_kw) + + +def monkeypatch(validate_certificate=True): + """Sets up all Sessions to use AppEngineAdapter by default. + + If you don't want to deal with configuring your own Sessions, + or if you use libraries that use requests directly (ie requests.post), + then you may prefer to monkeypatch and auto-configure all Sessions. + + .. warning: : + + If ``validate_certificate`` is ``False``, certification validation will + effectively be disabled for all requests. + """ + _check_version() + # HACK: We should consider modifying urllib3 to support this cleanly, + # so that we can set a module-level variable in the sessions module, + # instead of overriding an imported HTTPAdapter as is done here. + adapter = AppEngineAdapter + if not validate_certificate: + adapter = InsecureAppEngineAdapter + + sessions.HTTPAdapter = adapter + adapters.HTTPAdapter = adapter + + +def _check_version(): + if gaecontrib is None: + raise exc.VersionMismatchError( + "The toolbelt requires at least Requests 2.10.0 to be " + "installed. Version {} was found instead.".format( + requests.__version__ + ) + ) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py new file mode 100644 index 000000000..6645d3498 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/fingerprint.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +"""Submodule containing the implementation for the FingerprintAdapter. + +This file contains an implementation of a Transport Adapter that validates +the fingerprints of SSL certificates presented upon connection. +""" +from requests.adapters import HTTPAdapter + +from .._compat import poolmanager + + +class FingerprintAdapter(HTTPAdapter): + """ + A HTTPS Adapter for Python Requests that verifies certificate fingerprints, + instead of certificate hostnames. + + Example usage: + + .. code-block:: python + + import requests + import ssl + from requests_toolbelt.adapters.fingerprint import FingerprintAdapter + + twitter_fingerprint = '...' + s = requests.Session() + s.mount( + 'https://twitter.com', + FingerprintAdapter(twitter_fingerprint) + ) + + The fingerprint should be provided as a hexadecimal string, optionally + containing colons. + """ + + __attrs__ = HTTPAdapter.__attrs__ + ['fingerprint'] + + def __init__(self, fingerprint, **kwargs): + self.fingerprint = fingerprint + + super(FingerprintAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + assert_fingerprint=self.fingerprint) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py new file mode 100644 index 000000000..f34ed1aa1 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/host_header_ssl.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +""" +requests_toolbelt.adapters.host_header_ssl +========================================== + +This file contains an implementation of the HostHeaderSSLAdapter. +""" + +from requests.adapters import HTTPAdapter + + +class HostHeaderSSLAdapter(HTTPAdapter): + """ + A HTTPS Adapter for Python Requests that sets the hostname for certificate + verification based on the Host header. + + This allows requesting the IP address directly via HTTPS without getting + a "hostname doesn't match" exception. + + Example usage: + + >>> s.mount('https://', HostHeaderSSLAdapter()) + >>> s.get("https://93.184.216.34", headers={"Host": "example.org"}) + + """ + + def send(self, request, **kwargs): + # HTTP headers are case-insensitive (RFC 7230) + host_header = None + for header in request.headers: + if header.lower() == "host": + host_header = request.headers[header] + break + + connection_pool_kwargs = self.poolmanager.connection_pool_kw + + if host_header: + connection_pool_kwargs["assert_hostname"] = host_header + elif "assert_hostname" in connection_pool_kwargs: + # an assert_hostname from a previous request may have been left + connection_pool_kwargs.pop("assert_hostname", None) + + return super(HostHeaderSSLAdapter, self).send(request, **kwargs) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py new file mode 100644 index 000000000..f8aef5dd5 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/socket_options.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +"""The implementation of the SocketOptionsAdapter.""" +import socket +import warnings +import sys + +import requests +from requests import adapters + +from .._compat import connection +from .._compat import poolmanager +from .. import exceptions as exc + + +class SocketOptionsAdapter(adapters.HTTPAdapter): + """An adapter for requests that allows users to specify socket options. + + Since version 2.4.0 of requests, it is possible to specify a custom list + of socket options that need to be set before establishing the connection. + + Example usage:: + + >>> import socket + >>> import requests + >>> from requests_toolbelt.adapters import socket_options + >>> s = requests.Session() + >>> opts = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 0)] + >>> adapter = socket_options.SocketOptionsAdapter(socket_options=opts) + >>> s.mount('http://', adapter) + + You can also take advantage of the list of default options on this class + to keep using the original options in addition to your custom options. In + that case, ``opts`` might look like:: + + >>> opts = socket_options.SocketOptionsAdapter.default_options + opts + + """ + + if connection is not None: + default_options = getattr( + connection.HTTPConnection, + 'default_socket_options', + [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + ) + else: + default_options = [] + warnings.warn(exc.RequestsVersionTooOld, + "This version of Requests is only compatible with a " + "version of urllib3 which is too old to support " + "setting options on a socket. This adapter is " + "functionally useless.") + + def __init__(self, **kwargs): + self.socket_options = kwargs.pop('socket_options', + self.default_options) + + super(SocketOptionsAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + if requests.__build__ >= 0x020400: + # NOTE(Ian): Perhaps we should raise a warning + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + socket_options=self.socket_options + ) + else: + super(SocketOptionsAdapter, self).init_poolmanager( + connections, maxsize, block + ) + + +class TCPKeepAliveAdapter(SocketOptionsAdapter): + """An adapter for requests that turns on TCP Keep-Alive by default. + + The adapter sets 4 socket options: + + - ``SOL_SOCKET`` ``SO_KEEPALIVE`` - This turns on TCP Keep-Alive + - ``IPPROTO_TCP`` ``TCP_KEEPINTVL`` 20 - Sets the keep alive interval + - ``IPPROTO_TCP`` ``TCP_KEEPCNT`` 5 - Sets the number of keep alive probes + - ``IPPROTO_TCP`` ``TCP_KEEPIDLE`` 60 - Sets the keep alive time if the + socket library has the ``TCP_KEEPIDLE`` constant + + The latter three can be overridden by keyword arguments (respectively): + + - ``idle`` + - ``interval`` + - ``count`` + + You can use this adapter like so:: + + >>> from requests_toolbelt.adapters import socket_options + >>> tcp = socket_options.TCPKeepAliveAdapter(idle=120, interval=10) + >>> s = requests.Session() + >>> s.mount('http://', tcp) + + """ + + def __init__(self, **kwargs): + socket_options = kwargs.pop('socket_options', + SocketOptionsAdapter.default_options) + idle = kwargs.pop('idle', 60) + interval = kwargs.pop('interval', 20) + count = kwargs.pop('count', 5) + socket_options = socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + ] + + # NOTE(Ian): OSX does not have these constants defined, so we + # set them conditionally. + if getattr(socket, 'TCP_KEEPINTVL', None) is not None: + socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, + interval)] + elif sys.platform == 'darwin': + # On OSX, TCP_KEEPALIVE from netinet/tcp.h is not exported + # by python's socket module + TCP_KEEPALIVE = getattr(socket, 'TCP_KEEPALIVE', 0x10) + socket_options += [(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval)] + + if getattr(socket, 'TCP_KEEPCNT', None) is not None: + socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, count)] + + if getattr(socket, 'TCP_KEEPIDLE', None) is not None: + socket_options += [(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, idle)] + + super(TCPKeepAliveAdapter, self).__init__( + socket_options=socket_options, **kwargs + ) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/source.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/source.py new file mode 100644 index 000000000..d3dda797a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/source.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +""" +requests_toolbelt.source_adapter +================================ + +This file contains an implementation of the SourceAddressAdapter originally +demonstrated on the Requests GitHub page. +""" +from requests.adapters import HTTPAdapter + +from .._compat import poolmanager, basestring + + +class SourceAddressAdapter(HTTPAdapter): + """ + A Source Address Adapter for Python Requests that enables you to choose the + local address to bind to. This allows you to send your HTTP requests from a + specific interface and IP address. + + Two address formats are accepted. The first is a string: this will set the + local IP address to the address given in the string, and will also choose a + semi-random high port for the local port number. + + The second is a two-tuple of the form (ip address, port): for example, + ``('10.10.10.10', 8999)``. This will set the local IP address to the first + element, and the local port to the second element. If ``0`` is used as the + port number, a semi-random high port will be selected. + + .. warning:: Setting an explicit local port can have negative interactions + with connection-pooling in Requests: in particular, it risks + the possibility of getting "Address in use" errors. The + string-only argument is generally preferred to the tuple-form. + + Example usage: + + .. code-block:: python + + import requests + from requests_toolbelt.adapters.source import SourceAddressAdapter + + s = requests.Session() + s.mount('http://', SourceAddressAdapter('10.10.10.10')) + s.mount('https://', SourceAddressAdapter(('10.10.10.10', 8999))) + """ + def __init__(self, source_address, **kwargs): + if isinstance(source_address, basestring): + self.source_address = (source_address, 0) + elif isinstance(source_address, tuple): + self.source_address = source_address + else: + raise TypeError( + "source_address must be IP address string or (ip, port) tuple" + ) + + super(SourceAddressAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + source_address=self.source_address) + + def proxy_manager_for(self, *args, **kwargs): + kwargs['source_address'] = self.source_address + return super(SourceAddressAdapter, self).proxy_manager_for( + *args, **kwargs) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py new file mode 100644 index 000000000..c4a76ae45 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/ssl.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.ssl_adapter +============================= + +This file contains an implementation of the SSLAdapter originally demonstrated +in this blog post: +https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/ + +""" +import requests + +from requests.adapters import HTTPAdapter + +from .._compat import poolmanager + + +class SSLAdapter(HTTPAdapter): + """ + A HTTPS Adapter for Python Requests that allows the choice of the SSL/TLS + version negotiated by Requests. This can be used either to enforce the + choice of high-security TLS versions (where supported), or to work around + misbehaving servers that fail to correctly negotiate the default TLS + version being offered. + + Example usage: + + >>> import requests + >>> import ssl + >>> from requests_toolbelt import SSLAdapter + >>> s = requests.Session() + >>> s.mount('https://', SSLAdapter(ssl.PROTOCOL_TLSv1)) + + You can replace the chosen protocol with any that are available in the + default Python SSL module. All subsequent requests that match the adapter + prefix will use the chosen SSL version instead of the default. + + This adapter will also attempt to change the SSL/TLS version negotiated by + Requests when using a proxy. However, this may not always be possible: + prior to Requests v2.4.0 the adapter did not have access to the proxy setup + code. In earlier versions of Requests, this adapter will not function + properly when used with proxies. + """ + + __attrs__ = HTTPAdapter.__attrs__ + ['ssl_version'] + + def __init__(self, ssl_version=None, **kwargs): + self.ssl_version = ssl_version + + super(SSLAdapter, self).__init__(**kwargs) + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = poolmanager.PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + ssl_version=self.ssl_version) + + if requests.__build__ >= 0x020400: + # Earlier versions of requests either don't have this method or, worse, + # don't allow passing arbitrary keyword arguments. As a result, only + # conditionally define this method. + def proxy_manager_for(self, *args, **kwargs): + kwargs['ssl_version'] = self.ssl_version + return super(SSLAdapter, self).proxy_manager_for(*args, **kwargs) diff --git a/Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py b/Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py new file mode 100644 index 000000000..21bfacb9e --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/adapters/x509.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +"""A X509Adapter for use with the requests library. + +This file contains an implementation of the X509Adapter that will +allow users to authenticate a request using an arbitrary +X.509 certificate without needing to convert it to a .pem file + +""" + +from OpenSSL.crypto import PKey, X509 +from cryptography import x509 +from cryptography.hazmat.primitives.serialization import (load_pem_private_key, + load_der_private_key) +from cryptography.hazmat.primitives.serialization import Encoding +from cryptography.hazmat.backends import default_backend + +from datetime import datetime +from requests.adapters import HTTPAdapter +import requests + +from .._compat import PyOpenSSLContext +from .. import exceptions as exc + +""" +importing the protocol constants from _ssl instead of ssl because only the +constants are needed and to handle issues caused by importing from ssl on +the 2.7.x line. +""" +try: + from _ssl import PROTOCOL_TLS as PROTOCOL +except ImportError: + from _ssl import PROTOCOL_SSLv23 as PROTOCOL + + +class X509Adapter(HTTPAdapter): + r"""Adapter for use with X.509 certificates. + + Provides an interface for Requests sessions to contact HTTPS urls and + authenticate with an X.509 cert by implementing the Transport Adapter + interface. This class will need to be manually instantiated and mounted + to the session + + :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 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. + + :param bytes cert_bytes: + bytes object containing contents of a cryptography.x509Certificate + object using the encoding specified by the ``encoding`` parameter. + :param bytes pk_bytes: + bytes object containing contents of a object that implements + ``cryptography.hazmat.primitives.serialization.PrivateFormat`` + using the encoding specified by the ``encoding`` parameter. + :param password: + string or utf8 encoded bytes containing the passphrase used for the + private key. None if unencrypted. Defaults to None. + :param encoding: + Enumeration detailing the encoding method used on the ``cert_bytes`` + parameter. Can be either PEM or DER. Defaults to PEM. + :type encoding: + :class: `cryptography.hazmat.primitives.serialization.Encoding` + + Usage:: + + >>> import requests + >>> from requests_toolbelt.adapters.x509 import X509Adapter + >>> s = requests.Session() + >>> a = X509Adapter(max_retries=3, + cert_bytes=b'...', pk_bytes=b'...', encoding='...' + >>> s.mount('https://', a) + """ + + def __init__(self, *args, **kwargs): + self._check_version() + cert_bytes = kwargs.pop('cert_bytes', None) + pk_bytes = kwargs.pop('pk_bytes', None) + password = kwargs.pop('password', None) + encoding = kwargs.pop('encoding', Encoding.PEM) + + password_bytes = None + + if cert_bytes is None or not isinstance(cert_bytes, bytes): + raise ValueError('Invalid cert content provided. ' + 'You must provide an X.509 cert ' + 'formatted as a byte array.') + if pk_bytes is None or not isinstance(pk_bytes, bytes): + raise ValueError('Invalid private key content provided. ' + 'You must provide a private key ' + 'formatted as a byte array.') + + if isinstance(password, bytes): + password_bytes = password + elif password: + password_bytes = password.encode('utf8') + + self.ssl_context = create_ssl_context(cert_bytes, pk_bytes, + password_bytes, encoding) + + super(X509Adapter, self).__init__(*args, **kwargs) + + def init_poolmanager(self, *args, **kwargs): + if self.ssl_context: + kwargs['ssl_context'] = self.ssl_context + return super(X509Adapter, self).init_poolmanager(*args, **kwargs) + + def proxy_manager_for(self, *args, **kwargs): + if self.ssl_context: + kwargs['ssl_context'] = self.ssl_context + return super(X509Adapter, self).proxy_manager_for(*args, **kwargs) + + def _check_version(self): + if PyOpenSSLContext is None: + raise exc.VersionMismatchError( + "The X509Adapter requires at least Requests 2.12.0 to be " + "installed. Version {} was found instead.".format( + requests.__version__ + ) + ) + + +def check_cert_dates(cert): + """Verify that the supplied client cert is not invalid.""" + + now = datetime.utcnow() + if cert.not_valid_after < now or cert.not_valid_before > now: + raise ValueError('Client certificate expired: Not After: ' + '{:%Y-%m-%d %H:%M:%SZ} ' + 'Not Before: {:%Y-%m-%d %H:%M:%SZ}' + .format(cert.not_valid_after, cert.not_valid_before)) + + +def create_ssl_context(cert_byes, pk_bytes, password=None, + encoding=Encoding.PEM): + """Create an SSL Context with the supplied cert/password. + + :param cert_bytes array of bytes containing the cert encoded + using the method supplied in the ``encoding`` parameter + :param pk_bytes array of bytes containing the private key encoded + using the method supplied in the ``encoding`` parameter + :param password array of bytes containing the passphrase to be used + with the supplied private key. None if unencrypted. + Defaults to None. + :param encoding ``cryptography.hazmat.primitives.serialization.Encoding`` + details the encoding method used on the ``cert_bytes`` and + ``pk_bytes`` parameters. Can be either PEM or DER. + Defaults to PEM. + """ + backend = default_backend() + + cert = None + key = None + if encoding == Encoding.PEM: + cert = x509.load_pem_x509_certificate(cert_byes, backend) + key = load_pem_private_key(pk_bytes, password, backend) + elif encoding == Encoding.DER: + cert = x509.load_der_x509_certificate(cert_byes, backend) + key = load_der_private_key(pk_bytes, password, backend) + else: + raise ValueError('Invalid encoding provided: Must be PEM or DER') + + if not (cert and key): + raise ValueError('Cert and key could not be parsed from ' + 'provided data') + check_cert_dates(cert) + ssl_context = PyOpenSSLContext(PROTOCOL) + ssl_context._ctx.use_certificate(X509.from_cryptography(cert)) + ssl_context._ctx.use_privatekey(PKey.from_cryptography_key(key)) + return ssl_context diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/auth/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py b/Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py new file mode 100644 index 000000000..285a6a763 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/_digest_auth_compat.py @@ -0,0 +1,29 @@ +"""Provide a compatibility layer for requests.auth.HTTPDigestAuth.""" +import requests + + +class _ThreadingDescriptor(object): + def __init__(self, prop, default): + self.prop = prop + self.default = default + + def __get__(self, obj, objtype=None): + return getattr(obj._thread_local, self.prop, self.default) + + def __set__(self, obj, value): + setattr(obj._thread_local, self.prop, value) + + +class _HTTPDigestAuth(requests.auth.HTTPDigestAuth): + init = _ThreadingDescriptor('init', True) + last_nonce = _ThreadingDescriptor('last_nonce', '') + nonce_count = _ThreadingDescriptor('nonce_count', 0) + chal = _ThreadingDescriptor('chal', {}) + pos = _ThreadingDescriptor('pos', None) + num_401_calls = _ThreadingDescriptor('num_401_calls', 1) + + +if requests.__build__ < 0x020800: + HTTPDigestAuth = requests.auth.HTTPDigestAuth +else: + HTTPDigestAuth = _HTTPDigestAuth diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/guess.py b/Contents/Libraries/Shared/requests_toolbelt/auth/guess.py new file mode 100644 index 000000000..ba6de504a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/guess.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +"""The module containing the code for GuessAuth.""" +from requests import auth +from requests import cookies + +from . import _digest_auth_compat as auth_compat, http_proxy_digest + + +class GuessAuth(auth.AuthBase): + """Guesses the auth type by the WWW-Authentication header.""" + def __init__(self, username, password): + self.username = username + self.password = password + self.auth = None + self.pos = None + + def _handle_basic_auth_401(self, r, kwargs): + if self.pos is not None: + r.request.body.seek(self.pos) + + # 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() + if not hasattr(prep, '_cookies'): + prep._cookies = cookies.RequestsCookieJar() + cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + self.auth = auth.HTTPBasicAuth(self.username, self.password) + prep = self.auth(prep) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + def _handle_digest_auth_401(self, r, kwargs): + self.auth = auth_compat.HTTPDigestAuth(self.username, self.password) + try: + self.auth.init_per_thread_state() + except AttributeError: + # If we're not on requests 2.8.0+ this method does not exist and + # is not relevant. + pass + + # Check that the attr exists because much older versions of requests + # set this attribute lazily. For example: + # https://github.com/kennethreitz/requests/blob/33735480f77891754304e7f13e3cdf83aaaa76aa/requests/auth.py#L59 + if (hasattr(self.auth, 'num_401_calls') and + self.auth.num_401_calls is None): + self.auth.num_401_calls = 1 + # Digest auth would resend the request by itself. We can take a + # shortcut here. + return self.auth.handle_401(r, **kwargs) + + def handle_401(self, r, **kwargs): + """Resends a request with auth headers, if needed.""" + + www_authenticate = r.headers.get('www-authenticate', '').lower() + + if 'basic' in www_authenticate: + return self._handle_basic_auth_401(r, kwargs) + + if 'digest' in www_authenticate: + return self._handle_digest_auth_401(r, kwargs) + + def __call__(self, request): + if self.auth is not None: + return self.auth(request) + + try: + self.pos = request.body.tell() + except AttributeError: + pass + + request.register_hook('response', self.handle_401) + return request + + +class GuessProxyAuth(GuessAuth): + """ + Guesses the auth type by WWW-Authentication and Proxy-Authentication + headers + """ + def __init__(self, username=None, password=None, + proxy_username=None, proxy_password=None): + super(GuessProxyAuth, self).__init__(username, password) + self.proxy_username = proxy_username + self.proxy_password = proxy_password + self.proxy_auth = None + + def _handle_basic_auth_407(self, r, kwargs): + if self.pos is not None: + r.request.body.seek(self.pos) + + r.content + r.raw.release_conn() + prep = r.request.copy() + if not hasattr(prep, '_cookies'): + prep._cookies = cookies.RequestsCookieJar() + cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + self.proxy_auth = auth.HTTPProxyAuth(self.proxy_username, + self.proxy_password) + prep = self.proxy_auth(prep) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + def _handle_digest_auth_407(self, r, kwargs): + self.proxy_auth = http_proxy_digest.HTTPProxyDigestAuth( + username=self.proxy_username, + password=self.proxy_password) + + try: + self.auth.init_per_thread_state() + except AttributeError: + pass + + return self.proxy_auth.handle_407(r, **kwargs) + + def handle_407(self, r, **kwargs): + proxy_authenticate = r.headers.get('Proxy-Authenticate', '').lower() + + if 'basic' in proxy_authenticate: + return self._handle_basic_auth_407(r, kwargs) + + if 'digest' in proxy_authenticate: + return self._handle_digest_auth_407(r, kwargs) + + def __call__(self, request): + if self.proxy_auth is not None: + request = self.proxy_auth(request) + + try: + self.pos = request.body.tell() + except AttributeError: + pass + + request.register_hook('response', self.handle_407) + return super(GuessProxyAuth, self).__call__(request) diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/handler.py b/Contents/Libraries/Shared/requests_toolbelt/auth/handler.py new file mode 100644 index 000000000..0b4051a80 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/handler.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.auth.handler +============================== + +This holds all of the implementation details of the Authentication Handler. + +""" + +from requests.auth import AuthBase, HTTPBasicAuth +from requests.compat import urlparse, urlunparse + + +class AuthHandler(AuthBase): + + """ + + The ``AuthHandler`` object takes a dictionary of domains paired with + authentication strategies and will use this to determine which credentials + to use when making a request. For example, you could do the following: + + .. code-block:: python + + from requests import HTTPDigestAuth + from requests_toolbelt.auth.handler import AuthHandler + + import requests + + auth = AuthHandler({ + 'https://api.github.com': ('sigmavirus24', 'fakepassword'), + 'https://example.com': HTTPDigestAuth('username', 'password') + }) + + r = requests.get('https://api.github.com/user', auth=auth) + # => + r = requests.get('https://example.com/some/path', auth=auth) + # => + + s = requests.Session() + s.auth = auth + r = s.get('https://api.github.com/user') + # => + + .. warning:: + + :class:`requests.auth.HTTPDigestAuth` is not yet thread-safe. If you + use :class:`AuthHandler` across multiple threads you should + instantiate a new AuthHandler for each thread with a new + HTTPDigestAuth instance for each thread. + + """ + + def __init__(self, strategies): + self.strategies = dict(strategies) + self._make_uniform() + + def __call__(self, request): + auth = self.get_strategy_for(request.url) + return auth(request) + + def __repr__(self): + return ''.format(self.strategies) + + def _make_uniform(self): + existing_strategies = list(self.strategies.items()) + self.strategies = {} + + for (k, v) in existing_strategies: + self.add_strategy(k, v) + + @staticmethod + def _key_from_url(url): + parsed = urlparse(url) + return urlunparse((parsed.scheme.lower(), + parsed.netloc.lower(), + '', '', '', '')) + + def add_strategy(self, domain, strategy): + """Add a new domain and authentication strategy. + + :param str domain: The domain you wish to match against. For example: + ``'https://api.github.com'`` + :param str strategy: The authentication strategy you wish to use for + that domain. For example: ``('username', 'password')`` or + ``requests.HTTPDigestAuth('username', 'password')`` + + .. code-block:: python + + a = AuthHandler({}) + a.add_strategy('https://api.github.com', ('username', 'password')) + + """ + # Turn tuples into Basic Authentication objects + if isinstance(strategy, tuple): + strategy = HTTPBasicAuth(*strategy) + + key = self._key_from_url(domain) + self.strategies[key] = strategy + + def get_strategy_for(self, url): + """Retrieve the authentication strategy for a specified URL. + + :param str url: The full URL you will be making a request against. For + example, ``'https://api.github.com/user'`` + :returns: Callable that adds authentication to a request. + + .. code-block:: python + + import requests + a = AuthHandler({'example.com', ('foo', 'bar')}) + strategy = a.get_strategy_for('http://example.com/example') + assert isinstance(strategy, requests.auth.HTTPBasicAuth) + + """ + key = self._key_from_url(url) + return self.strategies.get(key, NullAuthStrategy()) + + def remove_strategy(self, domain): + """Remove the domain and strategy from the collection of strategies. + + :param str domain: The domain you wish remove. For example, + ``'https://api.github.com'``. + + .. code-block:: python + + a = AuthHandler({'example.com', ('foo', 'bar')}) + a.remove_strategy('example.com') + assert a.strategies == {} + + """ + key = self._key_from_url(domain) + if key in self.strategies: + del self.strategies[key] + + +class NullAuthStrategy(AuthBase): + def __repr__(self): + return '' + + def __call__(self, r): + return r diff --git a/Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py b/Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py new file mode 100644 index 000000000..7e1f69ef7 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/auth/http_proxy_digest.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +"""The module containing HTTPProxyDigestAuth.""" +import re + +from requests import cookies, utils + +from . import _digest_auth_compat as auth + + +class HTTPProxyDigestAuth(auth.HTTPDigestAuth): + """HTTP digest authentication between proxy + + :param stale_rejects: The number of rejects indicate that: + the client may wish to simply retry the request + with a new encrypted response, without reprompting the user for a + new username and password. i.e., retry build_digest_header + :type stale_rejects: int + """ + _pat = re.compile(r'digest ', flags=re.IGNORECASE) + + def __init__(self, *args, **kwargs): + super(HTTPProxyDigestAuth, self).__init__(*args, **kwargs) + self.stale_rejects = 0 + + self.init_per_thread_state() + + @property + def stale_rejects(self): + thread_local = getattr(self, '_thread_local', None) + if thread_local is None: + return self._stale_rejects + return thread_local.stale_rejects + + @stale_rejects.setter + def stale_rejects(self, value): + thread_local = getattr(self, '_thread_local', None) + if thread_local is None: + self._stale_rejects = value + else: + thread_local.stale_rejects = value + + def init_per_thread_state(self): + try: + super(HTTPProxyDigestAuth, self).init_per_thread_state() + except AttributeError: + # If we're not on requests 2.8.0+ this method does not exist + pass + + def handle_407(self, r, **kwargs): + """Handle HTTP 407 only once, otherwise give up + + :param r: current response + :returns: responses, along with the new response + """ + if r.status_code == 407 and self.stale_rejects < 2: + s_auth = r.headers.get("proxy-authenticate") + if s_auth is None: + raise IOError( + "proxy server violated RFC 7235:" + "407 response MUST contain header proxy-authenticate") + elif not self._pat.match(s_auth): + return r + + self.chal = utils.parse_dict_header( + self._pat.sub('', s_auth, count=1)) + + # if we present the user/passwd and still get rejected + # https://tools.ietf.org/html/rfc2617#section-3.2.1 + if ('Proxy-Authorization' in r.request.headers and + 'stale' in self.chal): + if self.chal['stale'].lower() == 'true': # try again + self.stale_rejects += 1 + # wrong user/passwd + elif self.chal['stale'].lower() == 'false': + raise IOError("User or password is invalid") + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Proxy-Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + else: # give up authenticate + return r + + def __call__(self, r): + self.init_per_thread_state() + # if we have nonce, then just use it, otherwise server will tell us + if self.last_nonce: + r.headers['Proxy-Authorization'] = self.build_digest_header( + r.method, r.url + ) + r.register_hook('response', self.handle_407) + return r diff --git a/Contents/Libraries/Shared/requests_toolbelt/cookies/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/cookies/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py b/Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py new file mode 100644 index 000000000..332036384 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/cookies/forgetful.py @@ -0,0 +1,7 @@ +"""The module containing the code for ForgetfulCookieJar.""" +from requests.cookies import RequestsCookieJar + + +class ForgetfulCookieJar(RequestsCookieJar): + def set_cookie(self, *args, **kwargs): + return diff --git a/Contents/Libraries/Shared/requests_toolbelt/downloadutils/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py new file mode 100644 index 000000000..7253d96e0 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/stream.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +"""Utilities for dealing with streamed requests.""" +import os.path +import re + +from .. import exceptions as exc + +# Regular expressions stolen from werkzeug/http.py +# cd2c97bb0a076da2322f11adce0b2731f9193396 L62-L64 +_QUOTED_STRING_RE = r'"[^"\\]*(?:\\.[^"\\]*)*"' +_OPTION_HEADER_PIECE_RE = re.compile( + r';\s*(%s|[^\s;=]+)\s*(?:=\s*(%s|[^;]+))?\s*' % (_QUOTED_STRING_RE, + _QUOTED_STRING_RE) +) +_DEFAULT_CHUNKSIZE = 512 + + +def _get_filename(content_disposition): + for match in _OPTION_HEADER_PIECE_RE.finditer(content_disposition): + k, v = match.groups() + if k == 'filename': + # ignore any directory paths in the filename + return os.path.split(v)[1] + return None + + +def get_download_file_path(response, path): + """ + Given a response and a path, return a file path for a download. + + If a ``path`` parameter is a directory, this function will parse the + ``Content-Disposition`` header on the response to determine the name of the + file as reported by the server, and return a file path in the specified + directory. + + If ``path`` is empty or None, this function will return a path relative + to the process' current working directory. + + If path is a full file path, return it. + + :param response: A Response object from requests + :type response: requests.models.Response + :param str path: Directory or file path. + :returns: full file path to download as + :rtype: str + :raises: :class:`requests_toolbelt.exceptions.StreamingError` + """ + path_is_dir = path and os.path.isdir(path) + + if path and not path_is_dir: + # fully qualified file path + filepath = path + else: + response_filename = _get_filename( + response.headers.get('content-disposition', '') + ) + if not response_filename: + raise exc.StreamingError('No filename given to stream response to') + + if path_is_dir: + # directory to download to + filepath = os.path.join(path, response_filename) + else: + # fallback to downloading to current working directory + filepath = response_filename + + return filepath + + +def stream_response_to_file(response, path=None, chunksize=_DEFAULT_CHUNKSIZE): + """Stream a response body to the specified file. + + Either use the ``path`` provided or use the name provided in the + ``Content-Disposition`` header. + + .. warning:: + + If you pass this function an open file-like object as the ``path`` + parameter, the function will not close that file for you. + + .. warning:: + + This function will not automatically close the response object + passed in as the ``response`` parameter. + + If a ``path`` parameter is a directory, this function will parse the + ``Content-Disposition`` header on the response to determine the name of the + file as reported by the server, and return a file path in the specified + directory. If no ``path`` parameter is supplied, this function will default + to the process' current working directory. + + .. code-block:: python + + import requests + from requests_toolbelt import exceptions + from requests_toolbelt.downloadutils import stream + + r = requests.get(url, stream=True) + try: + filename = stream.stream_response_to_file(r) + except exceptions.StreamingError as e: + # The toolbelt could not find the filename in the + # Content-Disposition + print(e.message) + + You can also specify the filename as a string. This will be passed to + the built-in :func:`open` and we will read the content into the file. + + .. code-block:: python + + import requests + from requests_toolbelt.downloadutils import stream + + r = requests.get(url, stream=True) + filename = stream.stream_response_to_file(r, path='myfile') + + If the calculated download file path already exists, this function will + raise a StreamingError. + + Instead, if you want to manage the file object yourself, you need to + provide either a :class:`io.BytesIO` object or a file opened with the + `'b'` flag. See the two examples below for more details. + + .. code-block:: python + + import requests + from requests_toolbelt.downloadutils import stream + + with open('myfile', 'wb') as fd: + r = requests.get(url, stream=True) + filename = stream.stream_response_to_file(r, path=fd) + + print('{} saved to {}'.format(url, filename)) + + .. code-block:: python + + import io + import requests + from requests_toolbelt.downloadutils import stream + + b = io.BytesIO() + r = requests.get(url, stream=True) + filename = stream.stream_response_to_file(r, path=b) + assert filename is None + + :param response: A Response object from requests + :type response: requests.models.Response + :param path: *(optional)*, Either a string with the path to the location + to save the response content, or a file-like object expecting bytes. + :type path: :class:`str`, or object with a :meth:`write` + :param int chunksize: (optional), Size of chunk to attempt to stream + (default 512B). + :returns: The name of the file, if one can be determined, else None + :rtype: str + :raises: :class:`requests_toolbelt.exceptions.StreamingError` + """ + pre_opened = False + fd = None + filename = None + if path and callable(getattr(path, 'write', None)): + pre_opened = True + fd = path + filename = getattr(fd, 'name', None) + else: + filename = get_download_file_path(response, path) + if os.path.exists(filename): + raise exc.StreamingError("File already exists: %s" % filename) + fd = open(filename, 'wb') + + for chunk in response.iter_content(chunk_size=chunksize): + fd.write(chunk) + + if not pre_opened: + fd.close() + + return filename diff --git a/Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py new file mode 100644 index 000000000..ecc7d0cdd --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/downloadutils/tee.py @@ -0,0 +1,123 @@ +"""Tee function implementations.""" +import io + +_DEFAULT_CHUNKSIZE = 65536 + +__all__ = ['tee', 'tee_to_file', 'tee_to_bytearray'] + + +def _tee(response, callback, chunksize, decode_content): + for chunk in response.raw.stream(amt=chunksize, + decode_content=decode_content): + callback(chunk) + yield chunk + + +def tee(response, fileobject, chunksize=_DEFAULT_CHUNKSIZE, + decode_content=None): + """Stream the response both to the generator and a file. + + This will stream the response body while writing the bytes to + ``fileobject``. + + Example usage: + + .. code-block:: python + + resp = requests.get(url, stream=True) + with open('save_file', 'wb') as save_file: + for chunk in tee(resp, save_file): + # do stuff with chunk + + .. code-block:: python + + import io + + resp = requests.get(url, stream=True) + fileobject = io.BytesIO() + + for chunk in tee(resp, fileobject): + # do stuff with chunk + + :param response: Response from requests. + :type response: requests.Response + :param fileobject: Writable file-like object. + :type fileobject: file, io.BytesIO + :param int chunksize: (optional), Size of chunk to attempt to stream. + :param bool decode_content: (optional), If True, this will decode the + compressed content of the response. + :raises: TypeError if the fileobject wasn't opened with the right mode + or isn't a BytesIO object. + """ + # We will be streaming the raw bytes from over the wire, so we need to + # ensure that writing to the fileobject will preserve those bytes. On + # Python3, if the user passes an io.StringIO, this will fail, so we need + # to check for BytesIO instead. + if not ('b' in getattr(fileobject, 'mode', '') or + isinstance(fileobject, io.BytesIO)): + raise TypeError('tee() will write bytes directly to this fileobject' + ', it must be opened with the "b" flag if it is a file' + ' or inherit from io.BytesIO.') + + return _tee(response, fileobject.write, chunksize, decode_content) + + +def tee_to_file(response, filename, chunksize=_DEFAULT_CHUNKSIZE, + decode_content=None): + """Stream the response both to the generator and a file. + + This will open a file named ``filename`` and stream the response body + while writing the bytes to the opened file object. + + Example usage: + + .. code-block:: python + + resp = requests.get(url, stream=True) + for chunk in tee_to_file(resp, 'save_file'): + # do stuff with chunk + + :param response: Response from requests. + :type response: requests.Response + :param str filename: Name of file in which we write the response content. + :param int chunksize: (optional), Size of chunk to attempt to stream. + :param bool decode_content: (optional), If True, this will decode the + compressed content of the response. + """ + with open(filename, 'wb') as fd: + for chunk in tee(response, fd, chunksize, decode_content): + yield chunk + + +def tee_to_bytearray(response, bytearr, chunksize=_DEFAULT_CHUNKSIZE, + decode_content=None): + """Stream the response both to the generator and a bytearray. + + This will stream the response provided to the function, add them to the + provided :class:`bytearray` and yield them to the user. + + .. note:: + + This uses the :meth:`bytearray.extend` by default instead of passing + the bytearray into the ``readinto`` method. + + Example usage: + + .. code-block:: python + + b = bytearray() + resp = requests.get(url, stream=True) + for chunk in tee_to_bytearray(resp, b): + # do stuff with chunk + + :param response: Response from requests. + :type response: requests.Response + :param bytearray bytearr: Array to add the streamed bytes to. + :param int chunksize: (optional), Size of chunk to attempt to stream. + :param bool decode_content: (optional), If True, this will decode the + compressed content of the response. + """ + if not isinstance(bytearr, bytearray): + raise TypeError('tee_to_bytearray() expects bytearr to be a ' + 'bytearray') + return _tee(response, bytearr.extend, chunksize, decode_content) diff --git a/Contents/Libraries/Shared/requests_toolbelt/exceptions.py b/Contents/Libraries/Shared/requests_toolbelt/exceptions.py new file mode 100644 index 000000000..32ade215a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/exceptions.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +"""Collection of exceptions raised by requests-toolbelt.""" + + +class StreamingError(Exception): + """Used in :mod:`requests_toolbelt.downloadutils.stream`.""" + pass + + +class VersionMismatchError(Exception): + """Used to indicate a version mismatch in the version of requests required. + + The feature in use requires a newer version of Requests to function + appropriately but the version installed is not sufficient. + """ + pass + + +class RequestsVersionTooOld(Warning): + """Used to indicate that the Requests version is too old. + + If the version of Requests is too old to support a feature, we will issue + this warning to the user. + """ + pass + + +class IgnoringGAECertificateValidation(Warning): + """Used to indicate that given GAE validation behavior will be ignored. + + If the user has tried to specify certificate validation when using the + insecure AppEngine adapter, it will be ignored (certificate validation will + remain off), so we will issue this warning to the user. + + In :class:`requests_toolbelt.adapters.appengine.InsecureAppEngineAdapter`. + """ + pass diff --git a/Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py new file mode 100644 index 000000000..d3bced1c8 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/multipart/__init__.py @@ -0,0 +1,31 @@ +""" +requests_toolbelt.multipart +=========================== + +See https://toolbelt.readthedocs.io/ for documentation + +:copyright: (c) 2014 by Ian Cordasco and Cory Benfield +:license: Apache v2.0, see LICENSE for more details +""" + +from .encoder import MultipartEncoder, MultipartEncoderMonitor +from .decoder import MultipartDecoder +from .decoder import ImproperBodyPartContentException +from .decoder import NonMultipartContentTypeException + +__title__ = 'requests-toolbelt' +__authors__ = 'Ian Cordasco, Cory Benfield' +__license__ = 'Apache v2.0' +__copyright__ = 'Copyright 2014 Ian Cordasco, Cory Benfield' + +__all__ = [ + 'MultipartEncoder', + 'MultipartEncoderMonitor', + 'MultipartDecoder', + 'ImproperBodyPartContentException', + 'NonMultipartContentTypeException', + '__title__', + '__authors__', + '__license__', + '__copyright__', +] diff --git a/Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py b/Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py new file mode 100644 index 000000000..2f74d4700 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/multipart/decoder.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.multipart.decoder +=================================== + +This holds all the implementation details of the MultipartDecoder + +""" + +import sys +import email.parser +from .encoder import encode_with +from requests.structures import CaseInsensitiveDict + + +def _split_on_find(content, bound): + point = content.find(bound) + return content[:point], content[point + len(bound):] + + +class ImproperBodyPartContentException(Exception): + pass + + +class NonMultipartContentTypeException(Exception): + pass + + +def _header_parser(string, encoding): + major = sys.version_info[0] + if major == 3: + string = string.decode(encoding) + headers = email.parser.HeaderParser().parsestr(string).items() + return ( + (encode_with(k, encoding), encode_with(v, encoding)) + for k, v in headers + ) + + +class BodyPart(object): + """ + + The ``BodyPart`` object is a ``Response``-like interface to an individual + subpart of a multipart response. It is expected that these will + generally be created by objects of the ``MultipartDecoder`` class. + + Like ``Response``, there is a ``CaseInsensitiveDict`` object named headers, + ``content`` to access bytes, ``text`` to access unicode, and ``encoding`` + to access the unicode codec. + + """ + + def __init__(self, content, encoding): + self.encoding = encoding + headers = {} + # Split into header section (if any) and the content + if b'\r\n\r\n' in content: + first, self.content = _split_on_find(content, b'\r\n\r\n') + if first != b'': + headers = _header_parser(first.lstrip(), encoding) + else: + raise ImproperBodyPartContentException( + 'content does not contain CR-LF-CR-LF' + ) + self.headers = CaseInsensitiveDict(headers) + + @property + def text(self): + """Content of the ``BodyPart`` in unicode.""" + return self.content.decode(self.encoding) + + +class MultipartDecoder(object): + """ + + The ``MultipartDecoder`` object parses the multipart payload of + a bytestring into a tuple of ``Response``-like ``BodyPart`` objects. + + The basic usage is:: + + import requests + from requests_toolbelt import MultipartDecoder + + response = request.get(url) + decoder = MultipartDecoder.from_response(response) + for part in decoder.parts: + print(part.headers['content-type']) + + If the multipart content is not from a response, basic usage is:: + + from requests_toolbelt import MultipartDecoder + + decoder = MultipartDecoder(content, content_type) + for part in decoder.parts: + print(part.headers['content-type']) + + For both these usages, there is an optional ``encoding`` parameter. This is + a string, which is the name of the unicode codec to use (default is + ``'utf-8'``). + + """ + def __init__(self, content, content_type, encoding='utf-8'): + #: Original Content-Type header + self.content_type = content_type + #: Response body encoding + self.encoding = encoding + #: Parsed parts of the multipart response body + self.parts = tuple() + self._find_boundary() + self._parse_body(content) + + def _find_boundary(self): + ct_info = tuple(x.strip() for x in self.content_type.split(';')) + mimetype = ct_info[0] + if mimetype.split('/')[0].lower() != 'multipart': + raise NonMultipartContentTypeException( + "Unexpected mimetype in content-type: '{}'".format(mimetype) + ) + for item in ct_info[1:]: + attr, value = _split_on_find( + item, + '=' + ) + if attr.lower() == 'boundary': + self.boundary = encode_with(value.strip('"'), self.encoding) + + @staticmethod + def _fix_first_part(part, boundary_marker): + bm_len = len(boundary_marker) + if boundary_marker == part[:bm_len]: + return part[bm_len:] + else: + return part + + def _parse_body(self, content): + boundary = b''.join((b'--', self.boundary)) + + def body_part(part): + fixed = MultipartDecoder._fix_first_part(part, boundary) + return BodyPart(fixed, self.encoding) + + def test_part(part): + return (part != b'' and + part != b'\r\n' and + part[:4] != b'--\r\n' and + part != b'--') + + parts = content.split(b''.join((b'\r\n', boundary))) + self.parts = tuple(body_part(x) for x in parts if test_part(x)) + + @classmethod + def from_response(cls, response, encoding='utf-8'): + content = response.content + content_type = response.headers.get('content-type', None) + return cls(content, content_type, encoding) diff --git a/Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py b/Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py new file mode 100644 index 000000000..c5333be68 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/multipart/encoder.py @@ -0,0 +1,655 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.multipart.encoder +=================================== + +This holds all of the implementation details of the MultipartEncoder + +""" +import contextlib +import io +import os +from uuid import uuid4 + +import requests + +from .._compat import fields + + +class FileNotSupportedError(Exception): + """File not supported error.""" + + +class MultipartEncoder(object): + + """ + + The ``MultipartEncoder`` object is a generic interface to the engine that + will create a ``multipart/form-data`` body for you. + + The basic usage is: + + .. code-block:: python + + import requests + from requests_toolbelt import MultipartEncoder + + encoder = MultipartEncoder({'field': 'value', + 'other_field', 'other_value'}) + r = requests.post('https://httpbin.org/post', data=encoder, + headers={'Content-Type': encoder.content_type}) + + If you do not need to take advantage of streaming the post body, you can + also do: + + .. code-block:: python + + r = requests.post('https://httpbin.org/post', + data=encoder.to_string(), + headers={'Content-Type': encoder.content_type}) + + If you want the encoder to use a specific order, you can use an + OrderedDict or more simply, a list of tuples: + + .. code-block:: python + + encoder = MultipartEncoder([('field', 'value'), + ('other_field', 'other_value')]) + + .. versionchanged:: 0.4.0 + + You can also provide tuples as part values as you would provide them to + requests' ``files`` parameter. + + .. code-block:: python + + encoder = MultipartEncoder({ + 'field': ('file_name', b'{"a": "b"}', 'application/json', + {'X-My-Header': 'my-value'}) + ]) + + .. warning:: + + This object will end up directly in :mod:`httplib`. Currently, + :mod:`httplib` has a hard-coded read size of **8192 bytes**. This + means that it will loop until the file has been read and your upload + could take a while. This is **not** a bug in requests. A feature is + being considered for this object to allow you, the user, to specify + what size should be returned on a read. If you have opinions on this, + please weigh in on `this issue`_. + + .. _this issue: + https://github.com/requests/toolbelt/issues/75 + + """ + + def __init__(self, fields, boundary=None, encoding='utf-8'): + #: Boundary value either passed in by the user or created + self.boundary_value = boundary or uuid4().hex + + # Computed boundary + self.boundary = '--{}'.format(self.boundary_value) + + #: Encoding of the data being passed in + self.encoding = encoding + + # Pre-encoded boundary + self._encoded_boundary = b''.join([ + encode_with(self.boundary, self.encoding), + encode_with('\r\n', self.encoding) + ]) + + #: Fields provided by the user + self.fields = fields + + #: Whether or not the encoder is finished + self.finished = False + + #: Pre-computed parts of the upload + self.parts = [] + + # Pre-computed parts iterator + self._iter_parts = iter([]) + + # The part we're currently working with + self._current_part = None + + # Cached computation of the body's length + self._len = None + + # Our buffer + self._buffer = CustomBytesIO(encoding=encoding) + + # Pre-compute each part's headers + self._prepare_parts() + + # Load boundary into buffer + self._write_boundary() + + @property + def len(self): + """Length of the multipart/form-data body. + + requests will first attempt to get the length of the body by calling + ``len(body)`` and then by checking for the ``len`` attribute. + + On 32-bit systems, the ``__len__`` method cannot return anything + larger than an integer (in C) can hold. If the total size of the body + is even slightly larger than 4GB users will see an OverflowError. This + manifested itself in `bug #80`_. + + As such, we now calculate the length lazily as a property. + + .. _bug #80: + https://github.com/requests/toolbelt/issues/80 + """ + # If _len isn't already calculated, calculate, return, and set it + return self._len or self._calculate_length() + + def __repr__(self): + return ''.format(self.fields) + + def _calculate_length(self): + """ + This uses the parts to calculate the length of the body. + + This returns the calculated length so __len__ can be lazy. + """ + boundary_len = len(self.boundary) # Length of --{boundary} + # boundary length + header length + body length + len('\r\n') * 2 + self._len = sum( + (boundary_len + total_len(p) + 4) for p in self.parts + ) + boundary_len + 4 + return self._len + + def _calculate_load_amount(self, read_size): + """This calculates how many bytes need to be added to the buffer. + + When a consumer read's ``x`` from the buffer, there are two cases to + satisfy: + + 1. Enough data in the buffer to return the requested amount + 2. Not enough data + + This function uses the amount of unread bytes in the buffer and + determines how much the Encoder has to load before it can return the + requested amount of bytes. + + :param int read_size: the number of bytes the consumer requests + :returns: int -- the number of bytes that must be loaded into the + buffer before the read can be satisfied. This will be strictly + non-negative + """ + amount = read_size - total_len(self._buffer) + return amount if amount > 0 else 0 + + def _load(self, amount): + """Load ``amount`` number of bytes into the buffer.""" + self._buffer.smart_truncate() + part = self._current_part or self._next_part() + while amount == -1 or amount > 0: + written = 0 + if part and not part.bytes_left_to_write(): + written += self._write(b'\r\n') + written += self._write_boundary() + part = self._next_part() + + if not part: + written += self._write_closing_boundary() + self.finished = True + break + + written += part.write_to(self._buffer, amount) + + if amount != -1: + amount -= written + + def _next_part(self): + try: + p = self._current_part = next(self._iter_parts) + except StopIteration: + p = None + return p + + def _iter_fields(self): + _fields = self.fields + if hasattr(self.fields, 'items'): + _fields = list(self.fields.items()) + for k, v in _fields: + file_name = None + file_type = None + file_headers = None + if isinstance(v, (list, tuple)): + if len(v) == 2: + file_name, file_pointer = v + elif len(v) == 3: + file_name, file_pointer, file_type = v + else: + file_name, file_pointer, file_type, file_headers = v + else: + file_pointer = v + + field = fields.RequestField(name=k, data=file_pointer, + filename=file_name, + headers=file_headers) + field.make_multipart(content_type=file_type) + yield field + + def _prepare_parts(self): + """This uses the fields provided by the user and creates Part objects. + + It populates the `parts` attribute and uses that to create a + generator for iteration. + """ + enc = self.encoding + self.parts = [Part.from_field(f, enc) for f in self._iter_fields()] + self._iter_parts = iter(self.parts) + + def _write(self, bytes_to_write): + """Write the bytes to the end of the buffer. + + :param bytes bytes_to_write: byte-string (or bytearray) to append to + the buffer + :returns: int -- the number of bytes written + """ + return self._buffer.append(bytes_to_write) + + def _write_boundary(self): + """Write the boundary to the end of the buffer.""" + return self._write(self._encoded_boundary) + + def _write_closing_boundary(self): + """Write the bytes necessary to finish a multipart/form-data body.""" + with reset(self._buffer): + self._buffer.seek(-2, 2) + self._buffer.write(b'--\r\n') + return 2 + + def _write_headers(self, headers): + """Write the current part's headers to the buffer.""" + return self._write(encode_with(headers, self.encoding)) + + @property + def content_type(self): + return str( + 'multipart/form-data; boundary={}'.format(self.boundary_value) + ) + + def to_string(self): + """Return the entirety of the data in the encoder. + + .. note:: + + This simply reads all of the data it can. If you have started + streaming or reading data from the encoder, this method will only + return whatever data is left in the encoder. + + .. note:: + + This method affects the internal state of the encoder. Calling + this method will exhaust the encoder. + + :returns: the multipart message + :rtype: bytes + """ + + return self.read() + + def read(self, size=-1): + """Read data from the streaming encoder. + + :param int size: (optional), If provided, ``read`` will return exactly + that many bytes. If it is not provided, it will return the + remaining bytes. + :returns: bytes + """ + if self.finished: + return self._buffer.read(size) + + bytes_to_load = size + if bytes_to_load != -1 and bytes_to_load is not None: + bytes_to_load = self._calculate_load_amount(int(size)) + + self._load(bytes_to_load) + return self._buffer.read(size) + + +def IDENTITY(monitor): + return monitor + + +class MultipartEncoderMonitor(object): + + """ + An object used to monitor the progress of a :class:`MultipartEncoder`. + + The :class:`MultipartEncoder` should only be responsible for preparing and + streaming the data. For anyone who wishes to monitor it, they shouldn't be + using that instance to manage that as well. Using this class, they can + monitor an encoder and register a callback. The callback receives the + instance of the monitor. + + To use this monitor, you construct your :class:`MultipartEncoder` as you + normally would. + + .. code-block:: python + + from requests_toolbelt import (MultipartEncoder, + MultipartEncoderMonitor) + import requests + + def callback(monitor): + # Do something with this information + pass + + m = MultipartEncoder(fields={'field0': 'value0'}) + monitor = MultipartEncoderMonitor(m, callback) + headers = {'Content-Type': monitor.content_type} + r = requests.post('https://httpbin.org/post', data=monitor, + headers=headers) + + Alternatively, if your use case is very simple, you can use the following + pattern. + + .. code-block:: python + + from requests_toolbelt import MultipartEncoderMonitor + import requests + + def callback(monitor): + # Do something with this information + pass + + monitor = MultipartEncoderMonitor.from_fields( + fields={'field0': 'value0'}, callback + ) + headers = {'Content-Type': montior.content_type} + r = requests.post('https://httpbin.org/post', data=monitor, + headers=headers) + + """ + + def __init__(self, encoder, callback=None): + #: Instance of the :class:`MultipartEncoder` being monitored + self.encoder = encoder + + #: Optionally function to call after a read + self.callback = callback or IDENTITY + + #: Number of bytes already read from the :class:`MultipartEncoder` + #: instance + self.bytes_read = 0 + + #: Avoid the same problem in bug #80 + self.len = self.encoder.len + + @classmethod + def from_fields(cls, fields, boundary=None, encoding='utf-8', + callback=None): + encoder = MultipartEncoder(fields, boundary, encoding) + return cls(encoder, callback) + + @property + def content_type(self): + return self.encoder.content_type + + def to_string(self): + return self.read() + + def read(self, size=-1): + string = self.encoder.read(size) + self.bytes_read += len(string) + self.callback(self) + return string + + +def encode_with(string, encoding): + """Encoding ``string`` with ``encoding`` if necessary. + + :param str string: If string is a bytes object, it will not encode it. + Otherwise, this function will encode it with the provided encoding. + :param str encoding: The encoding with which to encode string. + :returns: encoded bytes object + """ + if not (string is None or isinstance(string, bytes)): + return string.encode(encoding) + return string + + +def readable_data(data, encoding): + """Coerce the data to an object with a ``read`` method.""" + if hasattr(data, 'read'): + return data + + return CustomBytesIO(data, encoding) + + +def total_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()) + + +@contextlib.contextmanager +def reset(buffer): + """Keep track of the buffer's current position and write to the end. + + This is a context manager meant to be used when adding data to the buffer. + It eliminates the need for every function to be concerned with the + position of the cursor in the buffer. + """ + original_position = buffer.tell() + buffer.seek(0, 2) + yield + buffer.seek(original_position, 0) + + +def coerce_data(data, encoding): + """Ensure that every object's __len__ behaves uniformly.""" + if not isinstance(data, CustomBytesIO): + if hasattr(data, 'getvalue'): + return CustomBytesIO(data.getvalue(), encoding) + + if hasattr(data, 'fileno'): + return FileWrapper(data) + + if not hasattr(data, 'read'): + return CustomBytesIO(data, encoding) + + return data + + +def to_list(fields): + if hasattr(fields, 'items'): + return list(fields.items()) + return list(fields) + + +class Part(object): + def __init__(self, headers, body): + self.headers = headers + self.body = body + self.headers_unread = True + self.len = len(self.headers) + total_len(self.body) + + @classmethod + def from_field(cls, field, encoding): + """Create a part from a Request Field generated by urllib3.""" + headers = encode_with(field.render_headers(), encoding) + body = coerce_data(field.data, encoding) + return cls(headers, body) + + def bytes_left_to_write(self): + """Determine if there are bytes left to write. + + :returns: bool -- ``True`` if there are bytes left to write, otherwise + ``False`` + """ + to_read = 0 + if self.headers_unread: + to_read += len(self.headers) + + return (to_read + total_len(self.body)) > 0 + + def write_to(self, buffer, size): + """Write the requested amount of bytes to the buffer provided. + + The number of bytes written may exceed size on the first read since we + load the headers ambitiously. + + :param CustomBytesIO buffer: buffer we want to write bytes to + :param int size: number of bytes requested to be written to the buffer + :returns: int -- number of bytes actually written + """ + written = 0 + if self.headers_unread: + written += buffer.append(self.headers) + self.headers_unread = False + + while total_len(self.body) > 0 and (size == -1 or written < size): + amount_to_read = size + if size != -1: + amount_to_read = size - written + written += buffer.append(self.body.read(amount_to_read)) + + return written + + +class CustomBytesIO(io.BytesIO): + def __init__(self, buffer=None, encoding='utf-8'): + buffer = encode_with(buffer, encoding) + super(CustomBytesIO, self).__init__(buffer) + + def _get_end(self): + current_pos = self.tell() + self.seek(0, 2) + length = self.tell() + self.seek(current_pos, 0) + return length + + @property + def len(self): + length = self._get_end() + return length - self.tell() + + def append(self, bytes): + with reset(self): + written = self.write(bytes) + return written + + def smart_truncate(self): + to_be_read = total_len(self) + already_read = self._get_end() - to_be_read + + if already_read >= to_be_read: + old_bytes = self.read() + self.seek(0, 0) + self.truncate() + self.write(old_bytes) + self.seek(0, 0) # We want to be at the beginning + + +class FileWrapper(object): + def __init__(self, file_object): + self.fd = file_object + + @property + def len(self): + return total_len(self.fd) - self.fd.tell() + + def read(self, length=-1): + return self.fd.read(length) + + +class FileFromURLWrapper(object): + """File from URL wrapper. + + The :class:`FileFromURLWrapper` object gives you the ability to stream file + from provided URL in chunks by :class:`MultipartEncoder`. + Provide a stateless solution for streaming file from one server to another. + You can use the :class:`FileFromURLWrapper` without a session or with + a session as demonstated by the examples below: + + .. code-block:: python + # no session + + import requests + from requests_toolbelt import MultipartEncoder, FileFromURLWrapper + + url = 'https://httpbin.org/image/png' + streaming_encoder = MultipartEncoder( + fields={ + 'file': FileFromURLWrapper(url) + } + ) + r = requests.post( + 'https://httpbin.org/post', data=streaming_encoder, + headers={'Content-Type': streaming_encoder.content_type} + ) + + .. code-block:: python + # using a session + + import requests + from requests_toolbelt import MultipartEncoder, FileFromURLWrapper + + session = requests.Session() + url = 'https://httpbin.org/image/png' + streaming_encoder = MultipartEncoder( + fields={ + 'file': FileFromURLWrapper(url, session=session) + } + ) + r = session.post( + 'https://httpbin.org/post', data=streaming_encoder, + headers={'Content-Type': streaming_encoder.content_type} + ) + + """ + + def __init__(self, file_url, session=None): + self.session = session or requests.Session() + requested_file = self._request_for_file(file_url) + self.len = int(requested_file.headers['content-length']) + self.raw_data = requested_file.raw + + def _request_for_file(self, file_url): + """Make call for file under provided URL.""" + response = self.session.get(file_url, stream=True) + content_length = response.headers.get('content-length', None) + if content_length is None: + error_msg = ( + "Data from provided URL {url} is not supported. Lack of " + "content-length Header in requested file response.".format( + url=file_url) + ) + raise FileNotSupportedError(error_msg) + elif not content_length.isdigit(): + error_msg = ( + "Data from provided URL {url} is not supported. content-length" + " header value is not a digit.".format(url=file_url) + ) + raise FileNotSupportedError(error_msg) + return response + + def read(self, chunk_size): + """Read file in chunks.""" + chunk_size = chunk_size if chunk_size >= 0 else self.len + chunk = self.raw_data.read(chunk_size) or b'' + self.len -= len(chunk) if chunk else 0 # left to read + return chunk diff --git a/Contents/Libraries/Shared/requests_toolbelt/sessions.py b/Contents/Libraries/Shared/requests_toolbelt/sessions.py new file mode 100644 index 000000000..362924ff4 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/sessions.py @@ -0,0 +1,70 @@ +import requests + +from ._compat import urljoin + + +class BaseUrlSession(requests.Session): + """A Session with a URL that all requests will use as a base. + + Let's start by looking at an example: + + .. code-block:: python + + >>> from requests_toolbelt import sessions + >>> s = sessions.BaseUrlSession( + ... base_url='https://example.com/resource/') + >>> r = s.get('sub-resource/', params={'foo': 'bar'}) + >>> print(r.request.url) + https://example.com/resource/sub-resource/?foo=bar + + Our call to the ``get`` method will make a request to the URL passed in + when we created the Session and the partial resource name we provide. + + We implement this by overriding the ``request`` method so most uses of a + Session are covered. (This, however, precludes the use of PreparedRequest + objects). + + .. note:: + + The base URL that you provide and the path you provide are **very** + important. + + Let's look at another *similar* example + + .. code-block:: python + + >>> from requests_toolbelt import sessions + >>> s = sessions.BaseUrlSession( + ... base_url='https://example.com/resource/') + >>> r = s.get('/sub-resource/', params={'foo': 'bar'}) + >>> print(r.request.url) + https://example.com/sub-resource/?foo=bar + + The key difference here is that we called ``get`` with ``/sub-resource/``, + i.e., there was a leading ``/``. This changes how we create the URL + because we rely on :mod:`urllib.parse.urljoin`. + + To override how we generate the URL, sub-class this method and override the + ``create_url`` method. + + Based on implementation from + https://github.com/kennethreitz/requests/issues/2554#issuecomment-109341010 + """ + + base_url = None + + def __init__(self, base_url=None): + if base_url: + self.base_url = base_url + super(BaseUrlSession, self).__init__() + + def request(self, method, url, *args, **kwargs): + """Send the request after generating the complete URL.""" + url = self.create_url(url) + return super(BaseUrlSession, self).request( + method, url, *args, **kwargs + ) + + def create_url(self, url): + """Create the URL based off this partial path.""" + return urljoin(self.base_url, url) diff --git a/Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py b/Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py new file mode 100644 index 000000000..64fd75f16 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/streaming_iterator.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +""" + +requests_toolbelt.streaming_iterator +==================================== + +This holds the implementation details for the :class:`StreamingIterator`. It +is designed for the case where you, the user, know the size of the upload but +need to provide the data as an iterator. This class will allow you to specify +the size and stream the data without using a chunked transfer-encoding. + +""" +from requests.utils import super_len + +from .multipart.encoder import CustomBytesIO, encode_with + + +class StreamingIterator(object): + + """ + This class provides a way of allowing iterators with a known size to be + streamed instead of chunked. + + In requests, if you pass in an iterator it assumes you want to use + chunked transfer-encoding to upload the data, which not all servers + support well. Additionally, you may want to set the content-length + yourself to avoid this but that will not work. The only way to preempt + requests using a chunked transfer-encoding and forcing it to stream the + uploads is to mimic a very specific interace. Instead of having to know + these details you can instead just use this class. You simply provide the + size and iterator and pass the instance of StreamingIterator to requests + via the data parameter like so: + + .. code-block:: python + + from requests_toolbelt import StreamingIterator + + import requests + + # Let iterator be some generator that you already have and size be + # the size of the data produced by the iterator + + r = requests.post(url, data=StreamingIterator(size, iterator)) + + You can also pass file-like objects to :py:class:`StreamingIterator` in + case requests can't determize the filesize itself. This is the case with + streaming file objects like ``stdin`` or any sockets. Wrapping e.g. files + that are on disk with ``StreamingIterator`` is unnecessary, because + requests can determine the filesize itself. + + Naturally, you should also set the `Content-Type` of your upload + appropriately because the toolbelt will not attempt to guess that for you. + """ + + def __init__(self, size, iterator, encoding='utf-8'): + #: The expected size of the upload + self.size = int(size) + + if self.size < 0: + raise ValueError( + 'The size of the upload must be a positive integer' + ) + + #: Attribute that requests will check to determine the length of the + #: body. See bug #80 for more details + self.len = self.size + + #: Encoding the input data is using + self.encoding = encoding + + #: The iterator used to generate the upload data + self.iterator = iterator + + if hasattr(iterator, 'read'): + self._file = iterator + else: + self._file = _IteratorAsBinaryFile(iterator, encoding) + + def read(self, size=-1): + return encode_with(self._file.read(size), self.encoding) + + +class _IteratorAsBinaryFile(object): + def __init__(self, iterator, encoding='utf-8'): + #: The iterator used to generate the upload data + self.iterator = iterator + + #: Encoding the iterator is using + self.encoding = encoding + + # The buffer we use to provide the correct number of bytes requested + # during a read + self._buffer = CustomBytesIO() + + def _get_bytes(self): + try: + return encode_with(next(self.iterator), self.encoding) + except StopIteration: + return b'' + + def _load_bytes(self, size): + self._buffer.smart_truncate() + amount_to_load = size - super_len(self._buffer) + bytes_to_append = True + + while amount_to_load > 0 and bytes_to_append: + bytes_to_append = self._get_bytes() + amount_to_load -= self._buffer.append(bytes_to_append) + + def read(self, size=-1): + size = int(size) + if size == -1: + return b''.join(self.iterator) + + self._load_bytes(size) + return self._buffer.read(size) diff --git a/Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py new file mode 100644 index 000000000..984f1e801 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/threaded/__init__.py @@ -0,0 +1,97 @@ +""" +This module provides the API for ``requests_toolbelt.threaded``. + +The module provides a clean and simple API for making requests via a thread +pool. The thread pool will use sessions for increased performance. + +A simple use-case is: + +.. code-block:: python + + from requests_toolbelt import threaded + + urls_to_get = [{ + 'url': 'https://api.github.com/users/sigmavirus24', + 'method': 'GET', + }, { + 'url': 'https://api.github.com/repos/requests/toolbelt', + 'method': 'GET', + }, { + 'url': 'https://google.com', + 'method': 'GET', + }] + responses, errors = threaded.map(urls_to_get) + +By default, the threaded submodule will detect the number of CPUs your +computer has and use that if no other number of processes is selected. To +change this, always use the keyword argument ``num_processes``. Using the +above example, we would expand it like so: + +.. code-block:: python + + responses, errors = threaded.map(urls_to_get, num_processes=10) + +You can also customize how a :class:`requests.Session` is initialized by +creating a callback function: + +.. code-block:: python + + from requests_toolbelt import user_agent + + def initialize_session(session): + session.headers['User-Agent'] = user_agent('my-scraper', '0.1') + session.headers['Accept'] = 'application/json' + + responses, errors = threaded.map(urls_to_get, + initializer=initialize_session) + +.. autofunction:: requests_toolbelt.threaded.map + +Inspiration is blatantly drawn from the standard library's multiprocessing +library. See the following references: + +- multiprocessing's `pool source`_ + +- map and map_async `inspiration`_ + +.. _pool source: + https://hg.python.org/cpython/file/8ef4f75a8018/Lib/multiprocessing/pool.py +.. _inspiration: + https://hg.python.org/cpython/file/8ef4f75a8018/Lib/multiprocessing/pool.py#l340 +""" +from . import pool +from .._compat import queue + + +def map(requests, **kwargs): + r"""Simple interface to the threaded Pool object. + + This function takes a list of dictionaries representing requests to make + using Sessions in threads and returns a tuple where the first item is + a generator of successful responses and the second is a generator of + exceptions. + + :param list requests: + Collection of dictionaries representing requests to make with the Pool + object. + :param \*\*kwargs: + Keyword arguments that are passed to the + :class:`~requests_toolbelt.threaded.pool.Pool` object. + :returns: Tuple of responses and exceptions from the pool + :rtype: (:class:`~requests_toolbelt.threaded.pool.ThreadResponse`, + :class:`~requests_toolbelt.threaded.pool.ThreadException`) + """ + if not (requests and all(isinstance(r, dict) for r in requests)): + raise ValueError('map expects a list of dictionaries.') + + # Build our queue of requests + job_queue = queue.Queue() + for request in requests: + job_queue.put(request) + + # Ensure the user doesn't try to pass their own job_queue + kwargs['job_queue'] = job_queue + + threadpool = pool.Pool(**kwargs) + threadpool.join_all() + return threadpool.responses(), threadpool.exceptions() diff --git a/Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py b/Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py new file mode 100644 index 000000000..1fe81461a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/threaded/pool.py @@ -0,0 +1,211 @@ +"""Module implementing the Pool for :mod:``requests_toolbelt.threaded``.""" +import multiprocessing +import requests + +from . import thread +from .._compat import queue + + +class Pool(object): + """Pool that manages the threads containing sessions. + + :param queue: + The queue you're expected to use to which you should add items. + :type queue: queue.Queue + :param initializer: + Function used to initialize an instance of ``session``. + :type initializer: collections.Callable + :param auth_generator: + Function used to generate new auth credentials for the session. + :type auth_generator: collections.Callable + :param int num_process: + Number of threads to create. + :param session: + :type session: requests.Session + """ + + def __init__(self, job_queue, initializer=None, auth_generator=None, + num_processes=None, session=requests.Session): + if num_processes is None: + num_processes = multiprocessing.cpu_count() or 1 + + if num_processes < 1: + raise ValueError("Number of processes should at least be 1.") + + self._job_queue = job_queue + self._response_queue = queue.Queue() + self._exc_queue = queue.Queue() + self._processes = num_processes + self._initializer = initializer or _identity + self._auth = auth_generator or _identity + self._session = session + self._pool = [ + thread.SessionThread(self._new_session(), self._job_queue, + self._response_queue, self._exc_queue) + for _ in range(self._processes) + ] + + def _new_session(self): + return self._auth(self._initializer(self._session())) + + @classmethod + def from_exceptions(cls, exceptions, **kwargs): + r"""Create a :class:`~Pool` from an :class:`~ThreadException`\ s. + + Provided an iterable that provides :class:`~ThreadException` objects, + this classmethod will generate a new pool to retry the requests that + caused the exceptions. + + :param exceptions: + Iterable that returns :class:`~ThreadException` + :type exceptions: iterable + :param kwargs: + Keyword arguments passed to the :class:`~Pool` initializer. + :returns: An initialized :class:`~Pool` object. + :rtype: :class:`~Pool` + """ + job_queue = queue.Queue() + for exc in exceptions: + job_queue.put(exc.request_kwargs) + + return cls(job_queue=job_queue, **kwargs) + + @classmethod + def from_urls(cls, urls, request_kwargs=None, **kwargs): + """Create a :class:`~Pool` from an iterable of URLs. + + :param urls: + Iterable that returns URLs with which we create a pool. + :type urls: iterable + :param dict request_kwargs: + Dictionary of other keyword arguments to provide to the request + method. + :param kwargs: + Keyword arguments passed to the :class:`~Pool` initializer. + :returns: An initialized :class:`~Pool` object. + :rtype: :class:`~Pool` + """ + request_dict = {'method': 'GET'} + request_dict.update(request_kwargs or {}) + job_queue = queue.Queue() + for url in urls: + job = request_dict.copy() + job.update({'url': url}) + job_queue.put(job) + + return cls(job_queue=job_queue, **kwargs) + + def exceptions(self): + """Iterate over all the exceptions in the pool. + + :returns: Generator of :class:`~ThreadException` + """ + while True: + exc = self.get_exception() + if exc is None: + break + yield exc + + def get_exception(self): + """Get an exception from the pool. + + :rtype: :class:`~ThreadException` + """ + try: + (request, exc) = self._exc_queue.get_nowait() + except queue.Empty: + return None + else: + return ThreadException(request, exc) + + def get_response(self): + """Get a response from the pool. + + :rtype: :class:`~ThreadResponse` + """ + try: + (request, response) = self._response_queue.get_nowait() + except queue.Empty: + return None + else: + return ThreadResponse(request, response) + + def responses(self): + """Iterate over all the responses in the pool. + + :returns: Generator of :class:`~ThreadResponse` + """ + while True: + resp = self.get_response() + if resp is None: + break + yield resp + + def join_all(self): + """Join all the threads to the master thread.""" + for session_thread in self._pool: + session_thread.join() + + +class ThreadProxy(object): + proxied_attr = None + + def __getattr__(self, attr): + """Proxy attribute accesses to the proxied object.""" + get = object.__getattribute__ + if attr not in self.attrs: + response = get(self, self.proxied_attr) + return getattr(response, attr) + else: + return get(self, attr) + + +class ThreadResponse(ThreadProxy): + """A wrapper around a requests Response object. + + This will proxy most attribute access actions to the Response object. For + example, if you wanted the parsed JSON from the response, you might do: + + .. code-block:: python + + thread_response = pool.get_response() + json = thread_response.json() + + """ + proxied_attr = 'response' + attrs = frozenset(['request_kwargs', 'response']) + + def __init__(self, request_kwargs, response): + #: The original keyword arguments provided to the queue + self.request_kwargs = request_kwargs + #: The wrapped response + self.response = response + + +class ThreadException(ThreadProxy): + """A wrapper around an exception raised during a request. + + This will proxy most attribute access actions to the exception object. For + example, if you wanted the message from the exception, you might do: + + .. code-block:: python + + thread_exc = pool.get_exception() + msg = thread_exc.message + + """ + proxied_attr = 'exception' + attrs = frozenset(['request_kwargs', 'exception']) + + def __init__(self, request_kwargs, exception): + #: The original keyword arguments provided to the queue + self.request_kwargs = request_kwargs + #: The captured and wrapped exception + self.exception = exception + + +def _identity(session_obj): + return session_obj + + +__all__ = ['ThreadException', 'ThreadResponse', 'Pool'] diff --git a/Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py b/Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py new file mode 100644 index 000000000..542813c1f --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/threaded/thread.py @@ -0,0 +1,53 @@ +"""Module containing the SessionThread class.""" +import threading +import uuid + +import requests.exceptions as exc + +from .._compat import queue + + +class SessionThread(object): + def __init__(self, initialized_session, job_queue, response_queue, + exception_queue): + self._session = initialized_session + self._jobs = job_queue + self._create_worker() + self._responses = response_queue + self._exceptions = exception_queue + + def _create_worker(self): + self._worker = threading.Thread( + target=self._make_request, + name=uuid.uuid4(), + ) + self._worker.daemon = True + self._worker._state = 0 + self._worker.start() + + def _handle_request(self, kwargs): + try: + response = self._session.request(**kwargs) + except exc.RequestException as e: + self._exceptions.put((kwargs, e)) + else: + self._responses.put((kwargs, response)) + finally: + self._jobs.task_done() + + def _make_request(self): + while True: + try: + kwargs = self._jobs.get_nowait() + except queue.Empty: + break + + self._handle_request(kwargs) + + def is_alive(self): + """Proxy to the thread's ``is_alive`` method.""" + return self._worker.is_alive() + + def join(self): + """Join this thread to the master thread.""" + self._worker.join() diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/__init__.py b/Contents/Libraries/Shared/requests_toolbelt/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py b/Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py new file mode 100644 index 000000000..c935783bd --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/deprecated.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +"""A collection of functions deprecated in requests.utils.""" +import re +import sys + +from requests import utils + +find_charset = re.compile( + br']', flags=re.I +).findall + +find_pragma = re.compile( + br']', flags=re.I +).findall + +find_xml = re.compile( + br'^<\?xml.*?encoding=["\']*(.+?)["\'>]' +).findall + + +def get_encodings_from_content(content): + """Return encodings from given content string. + + .. code-block:: python + + import requests + from requests_toolbelt.utils import deprecated + + r = requests.get(url) + encodings = deprecated.get_encodings_from_content(r) + + :param content: bytestring to extract encodings from + :type content: bytes + :return: encodings detected in the provided content + :rtype: list(str) + """ + encodings = (find_charset(content) + find_pragma(content) + + find_xml(content)) + if (3, 0) <= sys.version_info < (4, 0): + encodings = [encoding.decode('utf8') for encoding in encodings] + return encodings + + +def get_unicode_from_response(response): + """Return the requested content back in unicode. + + This will first attempt to retrieve the encoding from the response + headers. If that fails, it will use + :func:`requests_toolbelt.utils.deprecated.get_encodings_from_content` + to determine encodings from HTML elements. + + .. code-block:: python + + import requests + from requests_toolbelt.utils import deprecated + + r = requests.get(url) + text = deprecated.get_unicode_from_response(r) + + :param response: Response object to get unicode content from. + :type response: requests.models.Response + """ + tried_encodings = set() + + # Try charset from content-type + encoding = utils.get_encoding_from_headers(response.headers) + + if encoding: + try: + return str(response.content, encoding) + except UnicodeError: + tried_encodings.add(encoding.lower()) + + encodings = get_encodings_from_content(response.content) + + for _encoding in encodings: + _encoding = _encoding.lower() + if _encoding in tried_encodings: + continue + try: + return str(response.content, _encoding) + except UnicodeError: + tried_encodings.add(_encoding) + + # Fall back: + if encoding: + try: + return str(response.content, encoding, errors='replace') + except TypeError: + pass + return response.text diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/dump.py b/Contents/Libraries/Shared/requests_toolbelt/utils/dump.py new file mode 100644 index 000000000..23b35e75a --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/dump.py @@ -0,0 +1,197 @@ +"""This module provides functions for dumping information about responses.""" +import collections + +from requests import compat + + +__all__ = ('dump_response', 'dump_all') + +HTTP_VERSIONS = { + 9: b'0.9', + 10: b'1.0', + 11: b'1.1', +} + +_PrefixSettings = collections.namedtuple('PrefixSettings', + ['request', 'response']) + + +class PrefixSettings(_PrefixSettings): + def __new__(cls, request, response): + request = _coerce_to_bytes(request) + response = _coerce_to_bytes(response) + return super(PrefixSettings, cls).__new__(cls, request, response) + + +def _get_proxy_information(response): + if getattr(response.connection, 'proxy_manager', False): + proxy_info = {} + request_url = response.request.url + if request_url.startswith('https://'): + proxy_info['method'] = 'CONNECT' + + proxy_info['request_path'] = request_url + return proxy_info + return None + + +def _format_header(name, value): + return (_coerce_to_bytes(name) + b': ' + _coerce_to_bytes(value) + + b'\r\n') + + +def _build_request_path(url, proxy_info): + uri = compat.urlparse(url) + proxy_url = proxy_info.get('request_path') + if proxy_url is not None: + request_path = _coerce_to_bytes(proxy_url) + return request_path, uri + + request_path = _coerce_to_bytes(uri.path) + if uri.query: + request_path += b'?' + _coerce_to_bytes(uri.query) + + return request_path, uri + + +def _dump_request_data(request, prefixes, bytearr, proxy_info=None): + if proxy_info is None: + proxy_info = {} + + prefix = prefixes.request + method = _coerce_to_bytes(proxy_info.pop('method', request.method)) + request_path, uri = _build_request_path(request.url, proxy_info) + + # HTTP/1.1 + bytearr.extend(prefix + method + b' ' + request_path + b' HTTP/1.1\r\n') + + # Host: OR host header specified by user + headers = request.headers.copy() + host_header = _coerce_to_bytes(headers.pop('Host', uri.netloc)) + bytearr.extend(prefix + b'Host: ' + host_header + b'\r\n') + + for name, value in headers.items(): + bytearr.extend(prefix + _format_header(name, value)) + + bytearr.extend(prefix + b'\r\n') + if request.body: + if isinstance(request.body, compat.basestring): + bytearr.extend(prefix + _coerce_to_bytes(request.body)) + else: + # In the event that the body is a file-like object, let's not try + # to read everything into memory. + bytearr.extend(b'<< Request body is not a string-like type >>') + bytearr.extend(b'\r\n') + + +def _dump_response_data(response, prefixes, bytearr): + prefix = prefixes.response + # Let's interact almost entirely with urllib3's response + raw = response.raw + + # Let's convert the version int from httplib to bytes + version_str = HTTP_VERSIONS.get(raw.version, b'?') + + # HTTP/ + bytearr.extend(prefix + b'HTTP/' + version_str + b' ' + + str(raw.status).encode('ascii') + b' ' + + _coerce_to_bytes(response.reason) + b'\r\n') + + headers = raw.headers + for name in headers.keys(): + for value in headers.getlist(name): + bytearr.extend(prefix + _format_header(name, value)) + + bytearr.extend(prefix + b'\r\n') + + bytearr.extend(response.content) + + +def _coerce_to_bytes(data): + if not isinstance(data, bytes) and hasattr(data, 'encode'): + data = data.encode('utf-8') + # Don't bail out with an exception if data is None + return data if data is not None else b'' + + +def dump_response(response, request_prefix=b'< ', response_prefix=b'> ', + data_array=None): + """Dump a single request-response cycle's information. + + This will take a response object and dump only the data that requests can + see for that single request-response cycle. + + Example:: + + import requests + from requests_toolbelt.utils import dump + + resp = requests.get('https://api.github.com/users/sigmavirus24') + data = dump.dump_response(resp) + print(data.decode('utf-8')) + + :param response: + The response to format + :type response: :class:`requests.Response` + :param request_prefix: (*optional*) + Bytes to prefix each line of the request data + :type request_prefix: :class:`bytes` + :param response_prefix: (*optional*) + Bytes to prefix each line of the response data + :type response_prefix: :class:`bytes` + :param data_array: (*optional*) + Bytearray to which we append the request-response cycle data + :type data_array: :class:`bytearray` + :returns: Formatted bytes of request and response information. + :rtype: :class:`bytearray` + """ + data = data_array if data_array is not None else bytearray() + prefixes = PrefixSettings(request_prefix, response_prefix) + + if not hasattr(response, 'request'): + raise ValueError('Response has no associated request') + + proxy_info = _get_proxy_information(response) + _dump_request_data(response.request, prefixes, data, + proxy_info=proxy_info) + _dump_response_data(response, prefixes, data) + return data + + +def dump_all(response, request_prefix=b'< ', response_prefix=b'> '): + """Dump all requests and responses including redirects. + + This takes the response returned by requests and will dump all + request-response pairs in the redirect history in order followed by the + final request-response. + + Example:: + + import requests + from requests_toolbelt.utils import dump + + resp = requests.get('https://httpbin.org/redirect/5') + data = dump.dump_all(resp) + print(data.decode('utf-8')) + + :param response: + The response to format + :type response: :class:`requests.Response` + :param request_prefix: (*optional*) + Bytes to prefix each line of the request data + :type request_prefix: :class:`bytes` + :param response_prefix: (*optional*) + Bytes to prefix each line of the response data + :type response_prefix: :class:`bytes` + :returns: Formatted bytes of request and response information. + :rtype: :class:`bytearray` + """ + data = bytearray() + + history = list(response.history[:]) + history.append(response) + + for response in history: + dump_response(response, request_prefix, response_prefix, data) + + return data diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py b/Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py new file mode 100644 index 000000000..b0a909d24 --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/formdata.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +"""Implementation of nested form-data encoding function(s).""" +from .._compat import basestring +from .._compat import urlencode as _urlencode + + +__all__ = ('urlencode',) + + +def urlencode(query, *args, **kwargs): + """Handle nested form-data queries and serialize them appropriately. + + There are times when a website expects a nested form data query to be sent + but, the standard library's urlencode function does not appropriately + handle the nested structures. In that case, you need this function which + will flatten the structure first and then properly encode it for you. + + When using this to send data in the body of a request, make sure you + specify the appropriate Content-Type header for the request. + + .. code-block:: python + + import requests + from requests_toolbelt.utils import formdata + + query = { + 'my_dict': { + 'foo': 'bar', + 'biz': 'baz", + }, + 'a': 'b', + } + + resp = requests.get(url, params=formdata.urlencode(query)) + # or + resp = requests.post( + url, + data=formdata.urlencode(query), + headers={ + 'Content-Type': 'application/x-www-form-urlencoded' + }, + ) + + Similarly, you can specify a list of nested tuples, e.g., + + .. code-block:: python + + import requests + from requests_toolbelt.utils import formdata + + query = [ + ('my_list', [ + ('foo', 'bar'), + ('biz', 'baz'), + ]), + ('a', 'b'), + ] + + resp = requests.get(url, params=formdata.urlencode(query)) + # or + resp = requests.post( + url, + data=formdata.urlencode(query), + headers={ + 'Content-Type': 'application/x-www-form-urlencoded' + }, + ) + + For additional parameter and return information, see the official + `urlencode`_ documentation. + + .. _urlencode: + https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode + """ + expand_classes = (dict, list, tuple) + original_query_list = _to_kv_list(query) + + if not all(_is_two_tuple(i) for i in original_query_list): + raise ValueError("Expected query to be able to be converted to a " + "list comprised of length 2 tuples.") + + query_list = original_query_list + while any(isinstance(v, expand_classes) for _, v in query_list): + query_list = _expand_query_values(query_list) + + return _urlencode(query_list, *args, **kwargs) + + +def _to_kv_list(dict_or_list): + if hasattr(dict_or_list, 'items'): + return list(dict_or_list.items()) + return dict_or_list + + +def _is_two_tuple(item): + return isinstance(item, (list, tuple)) and len(item) == 2 + + +def _expand_query_values(original_query_list): + query_list = [] + for key, value in original_query_list: + if isinstance(value, basestring): + query_list.append((key, value)) + else: + key_fmt = key + '[%s]' + value_list = _to_kv_list(value) + query_list.extend((key_fmt % k, v) for k, v in value_list) + return query_list diff --git a/Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py b/Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py new file mode 100644 index 000000000..e9636a41c --- /dev/null +++ b/Contents/Libraries/Shared/requests_toolbelt/utils/user_agent.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +import collections +import platform +import sys + + +def user_agent(name, version, extras=None): + """Return an internet-friendly user_agent string. + + The majority of this code has been wilfully stolen from the equivalent + function in Requests. + + :param name: The intended name of the user-agent, e.g. "python-requests". + :param version: The version of the user-agent, e.g. "0.0.1". + :param extras: List of two-item tuples that are added to the user-agent + string. + :returns: Formatted user-agent string + :rtype: str + """ + if extras is None: + extras = [] + + return UserAgentBuilder( + name, version + ).include_extras( + extras + ).include_implementation( + ).include_system().build() + + +class UserAgentBuilder(object): + """Class to provide a greater level of control than :func:`user_agent`. + + This is used by :func:`user_agent` to build its User-Agent string. + + .. code-block:: python + + user_agent_str = UserAgentBuilder( + name='requests-toolbelt', + version='17.4.0', + ).include_implementation( + ).include_system( + ).include_extras([ + ('requests', '2.14.2'), + ('urllib3', '1.21.2'), + ]).build() + + """ + + format_string = '%s/%s' + + def __init__(self, name, version): + """Initialize our builder with the name and version of our user agent. + + :param str name: + Name of our user-agent. + :param str version: + The version string for user-agent. + """ + self._pieces = collections.deque([(name, version)]) + + def build(self): + """Finalize the User-Agent string. + + :returns: + Formatted User-Agent string. + :rtype: + str + """ + return " ".join([self.format_string % piece for piece in self._pieces]) + + def include_extras(self, extras): + """Include extra portions of the User-Agent. + + :param list extras: + list of tuples of extra-name and extra-version + """ + if any(len(extra) != 2 for extra in extras): + raise ValueError('Extras should be a sequence of two item tuples.') + + self._pieces.extend(extras) + return self + + def include_implementation(self): + """Append the implementation string to the user-agent string. + + This adds the the information that you're using CPython 2.7.13 to the + User-Agent. + """ + self._pieces.append(_implementation_tuple()) + return self + + def include_system(self): + """Append the information about the Operating System.""" + self._pieces.append(_platform_tuple()) + return self + + +def _implementation_tuple(): + """Return the tuple of interpreter name and version. + + Returns a string that provides both the name and the version of the Python + implementation currently running. For example, on CPython 2.7.5 it will + return "CPython/2.7.5". + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + 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' + + return (implementation, implementation_version) + + +def _implementation_string(): + return "%s/%s" % _implementation_tuple() + + +def _platform_tuple(): + try: + p_system = platform.system() + p_release = platform.release() + except IOError: + p_system = 'Unknown' + p_release = 'Unknown' + return (p_system, p_release) diff --git a/Contents/Libraries/Shared/scandir.py b/Contents/Libraries/Shared/scandir.py index 5444fac88..403f52d7b 100644 --- a/Contents/Libraries/Shared/scandir.py +++ b/Contents/Libraries/Shared/scandir.py @@ -42,7 +42,7 @@ "or ctypes, using slow generic fallback") __version__ = '1.6' -__all__ = ['scandir', 'walk'] +__all__ = ['scandir', 'scandir_generic', 'walk'] # Windows FILE_ATTRIBUTE constants for interpreting the # FIND_DATA.dwFileAttributes member diff --git a/Contents/Libraries/Shared/six.py b/Contents/Libraries/Shared/six.py index 190c0239c..47ecf52bd 100644 --- a/Contents/Libraries/Shared/six.py +++ b/Contents/Libraries/Shared/six.py @@ -1,6 +1,4 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson +# Copyright (c) 2010-2018 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 @@ -20,6 +18,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +"""Utilities for writing code that runs on Python 2 and 3""" + from __future__ import absolute_import import functools @@ -29,7 +29,7 @@ import types __author__ = "Benjamin Peterson " -__version__ = "1.10.0" +__version__ = "1.12.0" # Useful for very coarse version differentiation. @@ -241,6 +241,7 @@ class _MovedItems(_LazyModule): MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), @@ -262,10 +263,11 @@ class _MovedItems(_LazyModule): MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), @@ -337,10 +339,12 @@ class Module_six_moves_urllib_parse(_LazyModule): MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), MovedAttribute("uses_params", "urlparse", "urllib.parse"), @@ -416,6 +420,8 @@ class Module_six_moves_urllib_request(_LazyModule): MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) @@ -631,6 +637,7 @@ def u(s): import io StringIO = io.StringIO BytesIO = io.BytesIO + del io _assertCountEqual = "assertCountEqual" if sys.version_info[1] <= 1: _assertRaisesRegex = "assertRaisesRegexp" @@ -679,11 +686,15 @@ def assertRegex(self, *args, **kwargs): exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None else: def exec_(_code_, _globs_=None, _locs_=None): @@ -699,19 +710,28 @@ def exec_(_code_, _globs_=None, _locs_=None): exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb + try: + raise tp, value, tb + finally: + tb = None """) if sys.version_info[:2] == (3, 2): exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None """) elif sys.version_info[:2] > (3, 2): exec_("""def raise_from(value, from_value): - raise value from from_value + try: + raise value from from_value + finally: + value = None """) else: def raise_from(value, from_value): @@ -802,10 +822,14 @@ def with_metaclass(meta, *bases): # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. - class metaclass(meta): + class metaclass(type): def __new__(cls, name, this_bases, d): return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) return type.__new__(metaclass, 'temporary_class', (), {}) @@ -821,10 +845,71 @@ def wrapper(cls): orig_vars.pop(slots_var) orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + def python_2_unicode_compatible(klass): """ A decorator that defines __unicode__ and __str__ methods under Python 2. diff --git a/Contents/Libraries/Shared/subliminal/exceptions.py b/Contents/Libraries/Shared/subliminal/exceptions.py index 14d4f6412..ed46be1a4 100644 --- a/Contents/Libraries/Shared/subliminal/exceptions.py +++ b/Contents/Libraries/Shared/subliminal/exceptions.py @@ -27,3 +27,8 @@ class ServiceUnavailable(ProviderError): class DownloadLimitExceeded(ProviderError): """Exception raised by providers when download limit is exceeded.""" pass + + +class DownloadLimitPerDayExceeded(ProviderError): + """Exception raised by providers when download limit is exceeded.""" + pass diff --git a/Contents/Libraries/Shared/subliminal/extensions.py b/Contents/Libraries/Shared/subliminal/extensions.py index 495b68efc..17a559a41 100644 --- a/Contents/Libraries/Shared/subliminal/extensions.py +++ b/Contents/Libraries/Shared/subliminal/extensions.py @@ -94,7 +94,9 @@ def unregister(self, entry_point): 'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider', 'shooter = subliminal.providers.shooter:ShooterProvider', 'thesubdb = subliminal.providers.thesubdb:TheSubDBProvider', - 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider' + 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider', + 'ktuvit = subliminal.providers.ktuvit:KtuvitProvider' + 'wizdom = subliminal.providers.wizdom:WizdomProvider' ]) #: Refiner manager diff --git a/Contents/Libraries/Shared/subliminal/subtitle.py b/Contents/Libraries/Shared/subliminal/subtitle.py index 726b28e37..5c2c789b2 100644 --- a/Contents/Libraries/Shared/subliminal/subtitle.py +++ b/Contents/Libraries/Shared/subliminal/subtitle.py @@ -258,4 +258,4 @@ def fix_line_ending(content): :rtype: bytes """ - return content.replace(b'\r\n', b'\n').replace(b'\r', b'\n') + return content.replace(b'\r\n', b'\n') diff --git a/Contents/Libraries/Shared/subliminal/video.py b/Contents/Libraries/Shared/subliminal/video.py index a6efb8016..0db6c65c4 100644 --- a/Contents/Libraries/Shared/subliminal/video.py +++ b/Contents/Libraries/Shared/subliminal/video.py @@ -220,9 +220,13 @@ def fromguess(cls, name, guess): if 'title' not in guess: raise ValueError('Insufficient data to process the guess') + alternative_titles = [] + if 'alternative_title' in guess: + alternative_titles.append(u"%s %s" % (guess['title'], guess['alternative_title'])) + return cls(name, guess['title'], format=guess.get('format'), release_group=guess.get('release_group'), resolution=guess.get('screen_size'), video_codec=guess.get('video_codec'), - audio_codec=guess.get('audio_codec'), year=guess.get('year')) + audio_codec=guess.get('audio_codec'), year=guess.get('year'), alternative_titles=alternative_titles) @classmethod def fromname(cls, name): diff --git a/Contents/Libraries/Shared/subliminal_patch/__init__.py b/Contents/Libraries/Shared/subliminal_patch/__init__.py index 35efd82ad..e2d872246 100755 --- a/Contents/Libraries/Shared/subliminal_patch/__init__.py +++ b/Contents/Libraries/Shared/subliminal_patch/__init__.py @@ -13,6 +13,7 @@ from .score import compute_score from .video import Video import extensions +import http # patch subliminal's core functions subliminal.scan_video = subliminal.core.scan_video = scan_video diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py b/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py new file mode 100644 index 000000000..06dd91338 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/converters/assrt.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from babelfish import LanguageReverseConverter +from subliminal.exceptions import ConfigurationError + +class AssrtConverter(LanguageReverseConverter): + def __init__(self): + self.from_assrt = { u'简体': ('zho', None, 'Hans'), u'繁体': ('zho', None, 'Hant'), + u'簡體': ('zho', None, 'Hans'), u'繁體': ('zho', None, 'Hant'), + u'英文': ('eng',), + u'chs': ('zho', None, 'Hans'), u'cht': ('zho', None, 'Hant'), + u'chn': ('zho', None, 'Hans'), u'twn': ('zho', None, 'Hant')} + self.to_assrt = { ('zho', None, 'Hans'): u'chs', ('zho', None, 'Hant'): u'cht', ('eng',) : u'eng', + ('zho',): u'chs'} + self.codes = set(self.from_assrt.keys()) + + def convert(self, alpha3, country=None, script=None): + if (alpha3, country, script) in self.to_assrt: + return self.to_assrt[(alpha3, country, script)] + + raise ConfigurationError('Unsupported language for assrt: %s, %s, %s' % (alpha3, country, script)) + + def reverse(self, assrt): + if assrt in self.from_assrt: + return self.from_assrt[assrt] + + raise ConfigurationError('Unsupported language code for assrt: %s' % assrt) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py b/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py index 5f4e4c118..66b28de2d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/subscene.py @@ -1,8 +1,8 @@ # coding=utf-8 -from babelfish import Language, LanguageReverseConverter - +from babelfish import LanguageReverseConverter from subliminal.exceptions import ConfigurationError +from subzero.language import Language # alpha3 codes extracted from `https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes` @@ -12,6 +12,13 @@ 'Malay': 'msa', 'Pashto': 'pus', 'Punjabi': 'pan', 'Swahili': 'swa' } +from_subscene_with_country = { + 'Brazillian Portuguese': ('por', 'BR') +} + +to_subscene_with_country = {val: key for key, val in from_subscene_with_country.items()} + + to_subscene = {v: k for k, v in from_subscene.items()} exact_languages_alpha3 = [ @@ -34,12 +41,12 @@ 'mkd': 48, 'mal': 64, 'mni': 65, 'mon': 72, 'pus': 67, 'pol': 31, 'por': 32, 'pan': 66, 'rus': 34, 'srp': 35, 'sin': 58, 'slk': 36, 'slv': 37, 'som': 70, 'tgl': 53, 'tam': 59, 'tel': 63, 'tha': 40, - 'tur': 41, 'ukr': 56, 'urd': 42, 'yor': 71 + 'tur': 41, 'ukr': 56, 'urd': 42, 'yor': 71, 'pt-BR': 4 } # TODO: specify codes for unspecified_languages unspecified_languages = [ - 'Big 5 code', 'Brazillian Portuguese', 'Bulgarian/ English', + 'Big 5 code', 'Bulgarian/ English', 'Chinese BG code', 'Dutch/ English', 'English/ German', 'Hungarian/ English', 'Rohingya' ] @@ -50,6 +57,8 @@ supported_languages.update({Language(l) for l in to_subscene}) +supported_languages.update({Language(lang, cr) for lang, cr in to_subscene_with_country}) + class SubsceneConverter(LanguageReverseConverter): codes = {l.name for l in supported_languages} @@ -61,9 +70,15 @@ def convert(self, alpha3, country=None, script=None): if alpha3 in to_subscene: return to_subscene[alpha3] + if (alpha3, country) in to_subscene_with_country: + return to_subscene_with_country[(alpha3, country)] + raise ConfigurationError('Unsupported language for subscene: %s, %s, %s' % (alpha3, country, script)) def reverse(self, code): + if code in from_subscene_with_country: + return from_subscene_with_country[code] + if code in from_subscene: return (from_subscene[code],) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py new file mode 100644 index 000000000..cc5697b42 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/converters/supersubtitles.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from babelfish import LanguageReverseConverter, language_converters + + +class SuperSubtitlesConverter(LanguageReverseConverter): + def __init__(self): + self.alpha2_converter = language_converters['alpha2'] + self.from_supersubtitles = {'hu': ('hun', ), 'en': ('eng',)} + self.to_supersubtitles = {v: k for k, v in self.from_supersubtitles.items()} + self.codes = self.alpha2_converter.codes | set(self.from_supersubtitles.keys()) + + def convert(self, alpha3, country=None, script=None): + if (alpha3, country) in self.to_supersubtitles: + return self.to_supersubtitles[(alpha3, country)] + if (alpha3,) in self.to_supersubtitles: + return self.to_supersubtitles[(alpha3,)] + + return self.alpha2_converter.convert(alpha3, country, script) + + def reverse(self, supersubtitles): + if supersubtitles in self.from_supersubtitles: + return self.from_supersubtitles[supersubtitles] + + return self.alpha2_converter.reverse(supersubtitles) diff --git a/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py index b6f010149..761cf79a6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/converters/titlovi.py @@ -9,21 +9,21 @@ class TitloviConverter(LanguageReverseConverter): def __init__(self): - self.from_titlovi = {'ba': ('bos',), - 'en': ('eng',), - 'hr': ('hrv',), - 'mk': ('mkd',), - 'rs': ('srp', None, 'Latn'), - 'rsc': ('srp', None, 'Cyrl'), - 'si': ('slv',), + self.from_titlovi = {'Bosanski': ('bos',), + 'English': ('eng',), + 'Hrvatski': ('hrv',), + 'Makedonski': ('mkd',), + 'Srpski': ('srp',), + 'Cirilica': ('srp', None, 'Cyrl'), + 'Slovenski': ('slv',), } - self.to_titlovi = {('bos',): 'bosanski', - ('eng',): 'english', - ('hrv',): 'hrvatski', - ('mkd',): 'makedonski', - ('srp', None, 'Latn'): 'srpski', - ('srp', None, 'Cyrl'): 'cirilica', - ('slv',): 'slovenski' + self.to_titlovi = {('bos',): 'Bosanski', + ('eng',): 'English', + ('hrv',): 'Hrvatski', + ('mkd',): 'Makedonski', + ('srp',): 'Srpski', + ('srp', None, 'Cyrl'): 'Cirilica', + ('slv',): 'Slovenski' } self.codes = set(self.from_titlovi.keys()) @@ -33,10 +33,11 @@ def convert(self, alpha3, country=None, script=None): if (alpha3,) in self.to_titlovi: return self.to_titlovi[(alpha3,)] - logger.error(ConfigurationError('Unsupported language for titlovi: %s, %s, %s' % (alpha3, country, script))) + raise ConfigurationError('Unsupported language code for titlovi: %s, %s, %s' % (alpha3, country, script)) def reverse(self, titlovi): if titlovi in self.from_titlovi: return self.from_titlovi[titlovi] - logger.error(ConfigurationError('Unsupported language code for titlovi: %s' % titlovi)) + raise ConfigurationError('Unsupported language number for titlovi: %s' % titlovi) + diff --git a/Contents/Libraries/Shared/subliminal_patch/core.py b/Contents/Libraries/Shared/subliminal_patch/core.py index af401d57a..9877c377a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/core.py +++ b/Contents/Libraries/Shared/subliminal_patch/core.py @@ -28,10 +28,10 @@ from subliminal.video import VIDEO_EXTENSIONS, Video, Episode, Movie from subliminal.core import guessit, ProviderPool, io, is_windows_special_path, \ ThreadPoolExecutor, check_video -from subliminal_patch.exceptions import TooManyRequests +from subliminal_patch.exceptions import TooManyRequests, APIThrottled -from subzero.language import Language -from scandir import scandir +from subzero.language import Language, ENDSWITH_LANGUAGECODE_RE, FULL_LANGUAGE_LIST +from scandir import scandir, scandir_generic as _scandir_generic logger = logging.getLogger(__name__) @@ -62,7 +62,7 @@ class SZProviderPool(ProviderPool): def __init__(self, providers=None, provider_configs=None, blacklist=None, throttle_callback=None, pre_download_hook=None, post_download_hook=None, language_hook=None): #: Name of providers to use - self.providers = providers or provider_registry.names() + self.providers = providers #: Provider configuration self.provider_configs = provider_configs or {} @@ -108,10 +108,12 @@ def __delitem__(self, name): try: logger.info('Terminating provider %s', name) self.initialized_providers[name].terminate() - except (requests.Timeout, socket.timeout): + except (requests.Timeout, socket.timeout) as e: logger.error('Provider %r timed out, improperly terminated', name) - except: + self.throttle_callback(name, e) + except Exception as e: logger.exception('Provider %r terminated unexpectedly', name) + self.throttle_callback(name, e) del self.initialized_providers[name] @@ -183,15 +185,13 @@ def list_subtitles_provider(self, provider, video, languages): return out - except (requests.Timeout, socket.timeout): - logger.error('Provider %r timed out', provider) - - except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable), e: + except (requests.Timeout, socket.timeout) as e: + logger.exception('Provider %r timed out', provider) self.throttle_callback(provider, e) - return - except: + except Exception as e: logger.exception('Unexpected error in provider %r: %s', provider, traceback.format_exc()) + self.throttle_callback(provider, e) def list_subtitles(self, video, languages): """List subtitles. @@ -266,10 +266,11 @@ def download_subtitle(self, subtitle): requests.exceptions.ProxyError, requests.exceptions.SSLError, requests.Timeout, - socket.timeout): - logger.error('Provider %r connection error', subtitle.provider_name) + socket.timeout) as e: + logger.exception('Provider %r connection error', subtitle.provider_name) + self.throttle_callback(subtitle.provider_name, e) - except ResponseNotReady: + except ResponseNotReady as e: logger.error('Provider %r response error, reinitializing', subtitle.provider_name) try: self[subtitle.provider_name].terminate() @@ -277,20 +278,17 @@ def download_subtitle(self, subtitle): except: logger.error('Provider %r reinitialization error: %s', subtitle.provider_name, traceback.format_exc()) + self.throttle_callback(subtitle.provider_name, e) except rarfile.BadRarFile: logger.error('Malformed RAR file from provider %r, skipping subtitle.', subtitle.provider_name) logger.debug("RAR Traceback: %s", traceback.format_exc()) return False - except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable), e: - self.throttle_callback(subtitle.provider_name, e) - self.discarded_providers.add(subtitle.provider_name) - return False - - except: + except Exception as e: logger.exception('Unexpected error in provider %r, Traceback: %s', subtitle.provider_name, traceback.format_exc()) + self.throttle_callback(subtitle.provider_name, e) self.discarded_providers.add(subtitle.provider_name) return False @@ -309,7 +307,8 @@ def download_subtitle(self, subtitle): logger.error('Invalid subtitle') return False - subtitle.normalize() + if not os.environ.get("SZ_KEEP_ENCODING", False): + subtitle.normalize() return True @@ -347,6 +346,10 @@ def download_best_subtitles(self, subtitles, video, languages, min_score=0, hear for s in subtitles: # get the matches + if s.language not in languages: + logger.debug("%r: Skipping, language not searched for", s) + continue + try: matches = s.get_matches(video) except AttributeError: @@ -356,15 +359,16 @@ def download_best_subtitles(self, subtitles, video, languages, min_score=0, hear orig_matches = matches.copy() logger.debug('%r: Found matches %r', s, matches) + score, score_without_hash = compute_score(matches, s, video, hearing_impaired=use_hearing_impaired) unsorted_subtitles.append( - (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches, orig_matches)) + (s, score, score_without_hash, matches, orig_matches)) # sort subtitles by score - scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) + scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1, 2), reverse=True) # download best subtitles, falling back on the next on error downloaded_subtitles = [] - for subtitle, score, matches, orig_matches in scored_subtitles: + for subtitle, score, score_without_hash, matches, orig_matches in scored_subtitles: # check score if score < min_score: logger.info('%r: Score %d is below min_score (%d)', subtitle, score, min_score) @@ -392,7 +396,12 @@ def download_best_subtitles(self, subtitles, video, languages, min_score=0, hear if not subtitle.hash_verifiable and "hash" in matches: can_verify_series = False - if can_verify_series and not {"series", "season", "episode"}.issubset(orig_matches): + matches_series = False + if {"season", "episode"}.issubset(orig_matches) and \ + ("series" in orig_matches or "imdb_id" in orig_matches): + matches_series = True + + if can_verify_series and not matches_series: logger.debug("%r: Skipping subtitle with score %d, because it doesn't match our series/episode", subtitle, score) continue @@ -463,7 +472,7 @@ def list_subtitles(self, video, languages, blacklist=None): SZAsyncProviderPool = SZProviderPool -def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, skip_hashing=False): +def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, skip_hashing=False, hash_from=None): """Scan a video from a `path`. patch: @@ -489,7 +498,7 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski raise ValueError('%r is not a valid video extension' % os.path.splitext(path)[1]) dirpath, filename = os.path.split(path) - logger.info('Scanning video %r in %r', filename, dirpath) + logger.info('Determining basic video properties for %r in %r', filename, dirpath) # hint guessit the filename itself and its 2 parent directories if we're an episode (most likely # Series name/Season/filename), else only one @@ -510,38 +519,59 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski # guess hints["single_value"] = True + if "title" in hints: + hints["expected_title"] = [hints["title"]] + guessed_result = guessit(guess_from, options=hints) + logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False)) video = Video.fromguess(path, guessed_result) - - # trust plex's movie name - if video_type == "movie" and hints.get("expected_title"): - video.title = hints.get("expected_title")[0] - video.hints = hints - if dont_use_actual_file: + # get possibly alternative title from the filename itself + alt_guess = guessit(filename, options={k: v for k, v in hints.items() if k not in ('expected_title', 'title')}) + if "title" in alt_guess and alt_guess["title"] != guessed_result["title"]: + if video_type == "episode": + video.alternative_series.append(alt_guess["title"]) + else: + video.alternative_titles.append(alt_guess["title"]) + logger.debug("Adding alternative title: %s", alt_guess["title"]) + + if dont_use_actual_file and not hash_from: return video # size and hashes if not skip_hashing: - video.size = os.path.getsize(path) + hash_path = hash_from or path + video.size = os.path.getsize(hash_path) if video.size > 10485760: logger.debug('Size is %d', video.size) + osub_hash = None + + if "bsplayer" in providers: + video.hashes['bsplayer'] = osub_hash = hash_opensubtitles(hash_path) + if "opensubtitles" in providers: - video.hashes['opensubtitles'] = hash_opensubtitles(path) + video.hashes['opensubtitles'] = osub_hash = osub_hash or hash_opensubtitles(hash_path) + + if "opensubtitlescom" in providers: + video.hashes['opensubtitlescom'] = osub_hash = osub_hash or hash_opensubtitles(hash_path) if "shooter" in providers: - video.hashes['shooter'] = hash_shooter(path) + video.hashes['shooter'] = hash_shooter(hash_path) if "thesubdb" in providers: - video.hashes['thesubdb'] = hash_thesubdb(path) + video.hashes['thesubdb'] = hash_thesubdb(hash_path) if "napiprojekt" in providers: try: - video.hashes['napiprojekt'] = hash_napiprojekt(path) + video.hashes['napiprojekt'] = hash_napiprojekt(hash_path) except MemoryError: - logger.warning(u"Couldn't compute napiprojekt hash for %s", path) + logger.warning(u"Couldn't compute napiprojekt hash for %s", hash_path) + + if "napisy24" in providers: + # Napisy24 uses the same hash as opensubtitles + video.hashes['napisy24'] = osub_hash or hash_opensubtitles(hash_path) logger.debug('Computed hashes %r', video.hashes) else: @@ -550,21 +580,29 @@ def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, ski return video -def _search_external_subtitles(path, forced_tag=False, languages=None, only_one=False): +def _search_external_subtitles(path, languages=None, only_one=False, scandir_generic=False, match_strictness="strict"): dirpath, filename = os.path.split(path) dirpath = dirpath or '.' - fileroot, fileext = os.path.splitext(filename) + fn_no_ext, fileext = os.path.splitext(filename) + fn_no_ext_lower = fn_no_ext.lower() subtitles = {} - for entry in scandir(dirpath): + _scandir = _scandir_generic if scandir_generic else scandir + + for entry in _scandir(dirpath): + if (not entry.name or entry.name in ('\x0c', '$', ',', '\x7f')) and not scandir_generic: + logger.debug('Could not determine the name of the file, retrying with scandir_generic') + return _search_external_subtitles(path, languages, only_one, True) if not entry.is_file(follow_symlinks=False): continue p = entry.name # keep only valid subtitle filenames - if not p.startswith(fileroot) or not p.endswith(SUBTITLE_EXTENSIONS): + if not p.lower().endswith(SUBTITLE_EXTENSIONS): continue + # not p.lower().startswith(fileroot.lower()) or not + p_root, p_ext = os.path.splitext(p) if not INCLUDE_EXOTIC_SUBS and p_ext not in (".srt", ".ass", ".ssa", ".vtt"): continue @@ -578,27 +616,39 @@ def _search_external_subtitles(path, forced_tag=False, languages=None, only_one= if adv_tag in ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom']: p_root = split_tag[0] - # forced wanted but NIL + forced = False if adv_tag: forced = "forced" in adv_tag - if (forced_tag and not forced) or (not forced_tag and forced): - continue - # extract the potential language code - language_code = p_root[len(fileroot):].replace('_', '-')[1:] + # remove possible language code for matching + p_root_bare = ENDSWITH_LANGUAGECODE_RE.sub( + lambda m: "" if str(m.group(1)).lower() in FULL_LANGUAGE_LIST else m.group(0), p_root) + + p_root_lower = p_root_bare.lower() + + filename_matches = p_root_lower == fn_no_ext_lower + filename_contains = p_root_lower in fn_no_ext_lower + + if not filename_matches: + if match_strictness == "strict" or (match_strictness == "loose" and not filename_contains): + continue - # default language is undefined - language = Language('und') + language = None - # attempt to parse - if language_code: + # extract the potential language code + try: + language_code = p_root.rsplit(".", 1)[1].replace('_', '-') try: language = Language.fromietf(language_code) - except ValueError: + language.forced = forced + except (ValueError, LanguageReverseError): logger.error('Cannot parse language code %r', language_code) + language_code = None + except IndexError: + language_code = None - if not language and only_one: - language = list(languages)[0] + if not language and not language_code and only_one: + language = Language.rebuild(list(languages)[0], forced=forced) subtitles[p] = language @@ -607,7 +657,7 @@ def _search_external_subtitles(path, forced_tag=False, languages=None, only_one= return subtitles -def search_external_subtitles(path, forced_tag=False, languages=None, only_one=False): +def search_external_subtitles(path, languages=None, only_one=False, match_strictness="strict"): """ wrap original search_external_subtitles function to search multiple paths for one given video # todo: cleanup and merge with _search_external_subtitles @@ -626,8 +676,13 @@ def search_external_subtitles(path, forced_tag=False, languages=None, only_one=F logger.debug("external subs: scanning path %s", abspath) if os.path.isdir(os.path.dirname(abspath)): - subtitles.update(_search_external_subtitles(abspath, forced_tag=forced_tag, languages=languages, - only_one=only_one)) + try: + subtitles.update(_search_external_subtitles(abspath, languages=languages, + only_one=only_one, match_strictness=match_strictness)) + except OSError: + subtitles.update(_search_external_subtitles(abspath, languages=languages, + only_one=only_one, match_strictness=match_strictness, + scandir_generic=True)) logger.debug("external subs: found %s", subtitles) return subtitles @@ -755,7 +810,7 @@ def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=Fa tags.append("forced") if language: - subtitle_root += '.' + str(language) + subtitle_root += '.' + str(language.basename) if tags: subtitle_root += ".%s" % "-".join(tags) @@ -763,7 +818,7 @@ def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=Fa return subtitle_root + extension -def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=None, formats=("srt",), forced_tag=False, +def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=None, formats=("srt",), tags=None, path_decoder=None, debug_mods=False): """Save subtitles on filesystem. @@ -800,8 +855,8 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non continue # create subtitle path - subtitle_path = get_subtitle_path(file_path, None if single else subtitle.language, forced_tag=forced_tag, - tags=tags) + subtitle_path = get_subtitle_path(file_path, None if single else subtitle.language, + forced_tag=subtitle.language.forced, tags=tags) if directory is not None: subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1]) @@ -820,8 +875,12 @@ def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=Non logger.debug(u"Saving %r to %r", subtitle, subtitle_path) content = subtitle.get_modified_content(format=format, debug=debug_mods) if content: + if os.path.exists(subtitle_path): + os.remove(subtitle_path) + with open(subtitle_path, 'w') as f: f.write(content) + subtitle.storage_path = subtitle_path else: logger.error(u"Something went wrong when getting modified subtitle for %s", subtitle) diff --git a/Contents/Libraries/Shared/subliminal_patch/exceptions.py b/Contents/Libraries/Shared/subliminal_patch/exceptions.py index d75f49ab8..9b166a29a 100644 --- a/Contents/Libraries/Shared/subliminal_patch/exceptions.py +++ b/Contents/Libraries/Shared/subliminal_patch/exceptions.py @@ -5,3 +5,12 @@ class TooManyRequests(ProviderError): """Exception raised by providers when too many requests are made.""" pass + + +class APIThrottled(ProviderError): + pass + + +class ParseResponseError(ProviderError): + """Exception raised by providers when they are not able to parse the response.""" + pass diff --git a/Contents/Libraries/Shared/subliminal_patch/http.py b/Contents/Libraries/Shared/subliminal_patch/http.py index 4eee1e6c5..2ba824117 100644 --- a/Contents/Libraries/Shared/subliminal_patch/http.py +++ b/Contents/Libraries/Shared/subliminal_patch/http.py @@ -1,4 +1,7 @@ # coding=utf-8 +import json +from collections import OrderedDict + import certifi import ssl import os @@ -6,34 +9,187 @@ import logging import requests import xmlrpclib +import dns.resolver +import ipaddress +import re -from xmlrpclib import SafeTransport, Transport -from requests import Session, exceptions +from requests import exceptions +from urllib3.util import connection from retry.api import retry_call +from exceptions import APIThrottled +from dogpile.cache.api import NO_VALUE +from subliminal.cache import region +from subliminal_patch.pitcher import pitchers +from cloudscraper import CloudScraper + +try: + import brotli +except: + pass + +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse from subzero.lib.io import get_viable_encoding logger = logging.getLogger(__name__) -pem_file = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(unicode(__file__, get_viable_encoding()))), "..", certifi.where())) -try: - default_ssl_context = ssl.create_default_context(cafile=pem_file) -except AttributeError: - # < Python 2.7.9 - default_ssl_context = None +pem_file = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(unicode(__file__, get_viable_encoding()))), + "..", certifi.where())) -class CertifiSession(Session): - def __init__(self): +class TimeoutSession(requests.Session): + timeout = 10 + + def __init__(self, timeout=None): + super(TimeoutSession, self).__init__() + self.timeout = timeout or self.timeout + + def request(self, method, url, *args, **kwargs): + if kwargs.get('timeout') is None: + kwargs['timeout'] = self.timeout + + return super(TimeoutSession, self).request(method, url, *args, **kwargs) + + +class CertifiSession(TimeoutSession): + def __init__(self, verify=None): super(CertifiSession, self).__init__() - self.verify = pem_file + self.verify = verify or pem_file + + +class NeedsCaptchaException(Exception): + pass + + +class CFSession(CloudScraper): + def __init__(self, *args, **kwargs): + super(CFSession, self).__init__(*args, **kwargs) + self.debug = os.environ.get("CF_DEBUG", False) + + def _request(self, method, url, *args, **kwargs): + ourSuper = super(CloudScraper, self) + resp = ourSuper.request(method, url, *args, **kwargs) + + if resp.headers.get('Content-Encoding') == 'br': + if self.allow_brotli and resp._content: + resp._content = brotli.decompress(resp.content) + else: + logging.warning('Brotli content detected, But option is disabled, we will not continue.') + return resp + + # Debug request + if self.debug: + self.debugRequest(resp) + + # Check if Cloudflare anti-bot is on + try: + if self.isChallengeRequest(resp): + if resp.request.method != 'GET': + # Work around if the initial request is not a GET, + # Supersede with a GET then re-request the original METHOD. + CloudScraper.request(self, 'GET', resp.url) + resp = ourSuper.request(method, url, *args, **kwargs) + else: + # Solve Challenge + resp = self.sendChallengeResponse(resp, **kwargs) + + except ValueError, e: + if e.message == "Captcha": + parsed_url = urlparse(url) + domain = parsed_url.netloc + # solve the captcha + site_key = re.search(r'data-sitekey="(.+?)"', resp.content).group(1) + challenge_s = re.search(r'type="hidden" name="s" value="(.+?)"', resp.content).group(1) + challenge_ray = re.search(r'data-ray="(.+?)"', resp.content).group(1) + if not all([site_key, challenge_s, challenge_ray]): + raise Exception("cf: Captcha site-key not found!") + + pitcher = pitchers.get_pitcher()("cf: %s" % domain, resp.request.url, site_key, + user_agent=self.headers["User-Agent"], + cookies=self.cookies.get_dict(), + is_invisible=True) + + parsed_url = urlparse(resp.url) + logger.info("cf: %s: Solving captcha", domain) + result = pitcher.throw() + if not result: + raise Exception("cf: Couldn't solve captcha!") + + submit_url = '{}://{}/cdn-cgi/l/chk_captcha'.format(parsed_url.scheme, domain) + method = resp.request.method + + cloudflare_kwargs = { + 'allow_redirects': False, + 'headers': {'Referer': resp.url}, + 'params': OrderedDict( + [ + ('s', challenge_s), + ('g-recaptcha-response', result) + ] + ) + } + + return CloudScraper.request(self, method, submit_url, **cloudflare_kwargs) + + return resp + + def request(self, method, url, *args, **kwargs): + parsed_url = urlparse(url) + domain = parsed_url.netloc + + cache_key = "cf_data3_%s" % domain + + if not self.cookies.get("cf_clearance", "", domain=domain): + cf_data = region.get(cache_key) + if cf_data is not NO_VALUE: + cf_cookies, hdrs = cf_data + logger.debug("Trying to use old cf data for %s: %s", domain, cf_data) + for cookie, value in cf_cookies.iteritems(): + self.cookies.set(cookie, value, domain=domain) + + self.headers = hdrs + + ret = self._request(method, url, *args, **kwargs) + + try: + cf_data = self.get_cf_live_tokens(domain) + except: + pass + else: + if cf_data and "cf_clearance" in cf_data[0] and cf_data[0]["cf_clearance"]: + if cf_data != region.get(cache_key): + logger.debug("Storing cf data for %s: %s", domain, cf_data) + region.set(cache_key, cf_data) + elif cf_data[0]["cf_clearance"]: + logger.debug("CF Live tokens not updated") + + return ret + + def get_cf_live_tokens(self, domain): + for d in self.cookies.list_domains(): + if d.startswith(".") and d in ("." + domain): + cookie_domain = d + break + else: + raise ValueError( + "Unable to find Cloudflare cookies. Does the site actually have " + "Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?") + + return (OrderedDict(filter(lambda x: x[1], [ + ("__cfduid", self.cookies.get("__cfduid", "", domain=cookie_domain)), + ("cf_clearance", self.cookies.get("cf_clearance", "", domain=cookie_domain)) + ])), + self.headers + ) class RetryingSession(CertifiSession): proxied_functions = ("get", "post") def __init__(self): - super(CertifiSession, self).__init__() - self.verify = pem_file + super(RetryingSession, self).__init__() proxy = os.environ.get('SZ_HTTP_PROXY') if proxy: @@ -47,7 +203,7 @@ def retry_method(self, method, *args, **kwargs): # fixme: may be a little loud logger.debug("Using proxy %s for: %s", self.proxies["http"], args[0]) - return retry_call(getattr(super(CertifiSession, self), method), fargs=args, fkwargs=kwargs, tries=3, delay=5, + return retry_call(getattr(super(RetryingSession, self), method), fargs=args, fkwargs=kwargs, tries=3, delay=5, exceptions=(exceptions.ConnectionError, exceptions.ProxyError, exceptions.SSLError, @@ -67,6 +223,10 @@ def post(self, *args, **kwargs): return self.retry_method("post", *args, **kwargs) +class RetryingCFSession(RetryingSession, CFSession): + pass + + class SubZeroRequestsTransport(xmlrpclib.SafeTransport): """ Drop in Transport for xmlrpclib that uses Requests instead of httplib @@ -77,12 +237,20 @@ class SubZeroRequestsTransport(xmlrpclib.SafeTransport): # change our user agent to reflect Requests user_agent = "Python XMLRPC with Requests (python-requests.org)" proxies = None + xm_ver = 1 + session_var = "PHPSESSID" def __init__(self, use_https=True, verify=None, user_agent=None, timeout=10, *args, **kwargs): self.verify = pem_file if verify is None else verify self.use_https = use_https self.user_agent = user_agent if user_agent is not None else self.user_agent self.timeout = timeout + self.session = requests.Session() + self.session.headers['User-Agent'] = self.user_agent + # if 'requests' in self.session.headers['User-Agent']: + # # Set a random User-Agent if no custom User-Agent has been set + # self.session.headers = User_Agent(allow_brotli=False).headers + proxy = os.environ.get('SZ_HTTP_PROXY') if proxy: self.proxies = { @@ -96,25 +264,52 @@ def request(self, host, handler, request_body, verbose=0): """ Make an xmlrpc request. """ - headers = {'User-Agent': self.user_agent} url = self._build_url(host, handler) + cache_key = "xm%s_%s" % (self.xm_ver, host) + + old_sessvar = self.session.cookies.get(self.session_var, "") + if not old_sessvar: + data = region.get(cache_key) + if data is not NO_VALUE: + logger.debug("Trying to re-use headers/cookies for %s" % host) + self.session.cookies, self.session.headers = data + old_sessvar = self.session.cookies.get(self.session_var, "") + try: - resp = requests.post(url, data=request_body, headers=headers, - stream=True, timeout=self.timeout, proxies=self.proxies, - verify=self.verify) + resp = self.session.post(url, data=request_body, + stream=True, timeout=self.timeout, proxies=self.proxies, + verify=self.verify) + + if self.session_var in resp.cookies and resp.cookies[self.session_var] != old_sessvar: + logger.debug("Storing %s cookies" % host) + region.set(cache_key, [self.session.cookies, self.session.headers]) except ValueError: + logger.debug("Wiping cookies/headers cache (VE) for %s" % host) + region.delete(cache_key) raise except Exception: + logger.debug("Wiping cookies/headers cache (EX) for %s" % host) + region.delete(cache_key) raise # something went wrong else: try: resp.raise_for_status() - except requests.RequestException as e: - return {"status": str(resp.status_code)} + except requests.exceptions.HTTPError: + logger.debug("Wiping cookies/headers cache (RE) for %s" % host) + region.delete(cache_key) + raise - else: - self.verbose = verbose + try: + if 'x-ratelimit-remaining' in resp.headers and int(resp.headers['x-ratelimit-remaining']) <= 2: + raise APIThrottled() + except ValueError: + logger.info('Couldn\'t parse "x-ratelimit-remaining": %r' % resp.headers['x-ratelimit-remaining']) + + self.verbose = verbose + try: return self.parse_response(resp.raw) + except: + logger.debug("Bad response data: %r", resp.raw) def _build_url(self, host, handler): """ @@ -124,3 +319,74 @@ def _build_url(self, host, handler): scheme = 'https' if self.use_https else 'http' handler = handler[1:] if handler and handler[0] == "/" else handler return '%s://%s/%s' % (scheme, host, handler) + + +_orig_create_connection = connection.create_connection + + +dns_cache = {} + + +_custom_resolver = None +_custom_resolver_ips = None + + +def patch_create_connection(): + if hasattr(connection.create_connection, "_sz_patched"): + return + + def patched_create_connection(address, *args, **kwargs): + """Wrap urllib3's create_connection to resolve the name elsewhere""" + # resolve hostname to an ip address; use your own + # resolver here, as otherwise the system resolver will be used. + global _custom_resolver, _custom_resolver_ips, dns_cache + host, port = address + + try: + ipaddress.ip_address(unicode(host)) + except (ipaddress.AddressValueError, ValueError): + __custom_resolver_ips = os.environ.get("dns_resolvers", None) + + # resolver ips changed in the meantime? + if __custom_resolver_ips != _custom_resolver_ips: + _custom_resolver = None + _custom_resolver_ips = __custom_resolver_ips + dns_cache = {} + + custom_resolver = _custom_resolver + + if not custom_resolver: + if _custom_resolver_ips: + logger.debug("DNS: Trying to use custom DNS resolvers: %s", _custom_resolver_ips) + custom_resolver = dns.resolver.Resolver(configure=False) + custom_resolver.lifetime = os.environ.get("dns_resolvers_timeout", 8.0) + try: + custom_resolver.nameservers = json.loads(_custom_resolver_ips) + except: + logger.debug("DNS: Couldn't load custom DNS resolvers: %s", _custom_resolver_ips) + else: + _custom_resolver = custom_resolver + + if custom_resolver: + if host in dns_cache: + ip = dns_cache[host] + logger.debug("DNS: Using %s=%s from cache", host, ip) + return _orig_create_connection((ip, port), *args, **kwargs) + else: + try: + ip = custom_resolver.query(host)[0].address + logger.debug("DNS: Resolved %s to %s using %s", host, ip, custom_resolver.nameservers) + dns_cache[host] = ip + return _orig_create_connection((ip, port), *args, **kwargs) + except dns.exception.DNSException: + logger.warning("DNS: Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers) + + logger.debug("DNS: Falling back to default DNS or IP on %s", host) + return _orig_create_connection((host, port), *args, **kwargs) + + patch_create_connection._sz_patched = True + connection.create_connection = patched_create_connection + + +patch_create_connection() + diff --git a/Contents/Libraries/Shared/subliminal_patch/language.py b/Contents/Libraries/Shared/subliminal_patch/language.py index c79476291..83f70e155 100644 --- a/Contents/Libraries/Shared/subliminal_patch/language.py +++ b/Contents/Libraries/Shared/subliminal_patch/language.py @@ -20,6 +20,10 @@ def __init__(self): self.to_opensubtitles.update({ ('srp', None, "Latn"): 'scc', ('srp', None, "Cyrl"): 'scc', + ('chi', None, 'Hant'): 'zht' + }) + self.from_opensubtitles.update({ + 'zht': ('zho', None, 'Hant') }) def convert(self, alpha3, country=None, script=None): diff --git a/Contents/Libraries/Shared/subliminal_patch/pitcher.py b/Contents/Libraries/Shared/subliminal_patch/pitcher.py new file mode 100644 index 000000000..b2cef63b3 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/pitcher.py @@ -0,0 +1,257 @@ +# coding=utf-8 + +import os +import time +import logging +import json +from subliminal.cache import region +from dogpile.cache.api import NO_VALUE +from python_anticaptcha import AnticaptchaClient, NoCaptchaTaskProxylessTask, NoCaptchaTask, AnticaptchaException,\ + Proxy +from deathbycaptcha import SocketClient as DBCClient, DEFAULT_TOKEN_TIMEOUT + + +logger = logging.getLogger(__name__) + + +class PitcherRegistry(object): + pitchers = [] + pitchers_by_key = {} + + def register(self, cls): + idx = len(self.pitchers) + self.pitchers.append(cls) + key = "%s_%s" % (cls.name, cls.needs_proxy) + key_by_source = "%s_%s" % (cls.source, cls.needs_proxy) + self.pitchers_by_key[key] = idx + self.pitchers_by_key[key_by_source] = idx + return cls + + def get_pitcher(self, name_or_site=None, with_proxy=False): + name_or_site = name_or_site or os.environ.get("ANTICAPTCHA_CLASS") + if not name_or_site: + raise Exception("AntiCaptcha class not given, exiting") + + key = "%s_%s" % (name_or_site, with_proxy) + + if key not in self.pitchers_by_key: + raise Exception("Pitcher %s not found (proxy: %s)" % (name_or_site, with_proxy)) + + return self.pitchers[self.pitchers_by_key.get(key)] + + +registry = pitchers = PitcherRegistry() + + +class Pitcher(object): + name = None + source = None + needs_proxy = False + tries = 3 + job = None + client = None + client_key = None + website_url = None + website_key = None + website_name = None + solve_time = None + success = False + + def __init__(self, website_name, website_url, website_key, tries=3, client_key=None, *args, **kwargs): + self.tries = tries + self.client_key = client_key or os.environ.get("ANTICAPTCHA_ACCOUNT_KEY") + if not self.client_key: + raise Exception("AntiCaptcha key not given, exiting") + + self.website_name = website_name + self.website_key = website_key + self.website_url = website_url + self.success = False + self.solve_time = None + + def get_client(self): + raise NotImplementedError + + def get_job(self): + raise NotImplementedError + + def _throw(self): + self.client = self.get_client() + self.job = self.get_job() + + def throw(self): + t = time.time() + data = self._throw() + if self.success: + self.solve_time = time.time() - t + logger.info("%s: Solving took %ss", self.website_name, int(self.solve_time)) + return data + + +@registry.register +class AntiCaptchaProxyLessPitcher(Pitcher): + name = "AntiCaptchaProxyLess" + source = "anti-captcha.com" + host = "api.anti-captcha.com" + language_pool = "en" + tries = 5 + use_ssl = True + is_invisible = False + + def __init__(self, website_name, website_url, website_key, tries=3, host=None, language_pool=None, + use_ssl=True, is_invisible=False, *args, **kwargs): + super(AntiCaptchaProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries, *args, + **kwargs) + self.host = host or self.host + self.language_pool = language_pool or self.language_pool + self.use_ssl = use_ssl + self.is_invisible = is_invisible + + def get_client(self): + return AnticaptchaClient(self.client_key, self.language_pool, self.host, self.use_ssl) + + def get_job(self): + task = NoCaptchaTaskProxylessTask(website_url=self.website_url, website_key=self.website_key, + is_invisible=self.is_invisible) + return self.client.createTask(task) + + def _throw(self): + for i in range(self.tries): + try: + super(AntiCaptchaProxyLessPitcher, self)._throw() + self.job.join() + ret = self.job.get_solution_response() + if ret: + self.success = True + return ret + except AnticaptchaException as e: + if i >= self.tries - 1: + logger.error("%s: Captcha solving finally failed. Exiting", self.website_name) + return + + if e.error_code == 'ERROR_ZERO_BALANCE': + logger.error("%s: No balance left on captcha solving service. Exiting", self.website_name) + return + + elif e.error_code == 'ERROR_NO_SLOT_AVAILABLE': + logger.info("%s: No captcha solving slot available, retrying", self.website_name) + time.sleep(5.0) + continue + + elif e.error_code == 'ERROR_KEY_DOES_NOT_EXIST': + logger.error("%s: Bad AntiCaptcha API key", self.website_name) + return + + elif e.error_id is None and e.error_code == 250: + # timeout + if i < self.tries: + logger.info("%s: Captcha solving timed out, retrying", self.website_name) + time.sleep(1.0) + continue + else: + logger.error("%s: Captcha solving timed out three times; bailing out", self.website_name) + return + raise + + +@registry.register +class AntiCaptchaPitcher(AntiCaptchaProxyLessPitcher): + name = "AntiCaptcha" + proxy = None + needs_proxy = True + user_agent = None + cookies = None + + def __init__(self, *args, **kwargs): + self.proxy = Proxy.parse_url(kwargs.pop("proxy")) + self.user_agent = kwargs.pop("user_agent") + cookies = kwargs.pop("cookies", {}) + if isinstance(cookies, dict): + self.cookies = ";".join(["%s=%s" % (k, v) for k, v in cookies.iteritems()]) + + super(AntiCaptchaPitcher, self).__init__(*args, **kwargs) + + def get_job(self): + task = NoCaptchaTask(website_url=self.website_url, website_key=self.website_key, proxy=self.proxy, + user_agent=self.user_agent, cookies=self.cookies, is_invisible=self.is_invisible) + return self.client.createTask(task) + + +@registry.register +class DBCProxyLessPitcher(Pitcher): + name = "DeathByCaptchaProxyLess" + source = "deathbycaptcha.com" + username = None + password = None + + def __init__(self, website_name, website_url, website_key, + timeout=DEFAULT_TOKEN_TIMEOUT, tries=3, *args, **kwargs): + super(DBCProxyLessPitcher, self).__init__(website_name, website_url, website_key, tries=tries) + + self.username, self.password = self.client_key.split(":", 1) + self.timeout = timeout + + def get_client(self): + return DBCClient(self.username, self.password) + + def get_job(self): + pass + + @property + def payload_dict(self): + return { + "googlekey": self.website_key, + "pageurl": self.website_url + } + + def _throw(self): + super(DBCProxyLessPitcher, self)._throw() + payload = json.dumps(self.payload_dict) + for i in range(self.tries): + try: + #balance = self.client.get_balance() + data = self.client.decode(timeout=self.timeout, type=4, token_params=payload) + if data and data["is_correct"] and data["text"]: + self.success = True + return data["text"] + except: + raise + + +@registry.register +class DBCPitcher(DBCProxyLessPitcher): + name = "DeathByCaptcha" + proxy = None + needs_proxy = True + proxy_type = "HTTP" + + def __init__(self, *args, **kwargs): + self.proxy = kwargs.pop("proxy") + super(DBCPitcher, self).__init__(*args, **kwargs) + + @property + def payload_dict(self): + payload = super(DBCPitcher, self).payload_dict + payload.update({ + "proxytype": self.proxy_type, + "proxy": self.proxy + }) + return payload + + +def load_verification(site_name, session, callback=lambda x: None): + ccks = region.get("%s_data" % site_name, expiration_time=15552000) # 6m + if ccks != NO_VALUE: + cookies, user_agent = ccks + logger.debug("%s: Re-using previous user agent: %s", site_name.capitalize(), user_agent) + session.headers["User-Agent"] = user_agent + try: + session.cookies._cookies.update(cookies) + return callback(region) + except: + return False + return False + + +def store_verification(site_name, session): + region.set("%s_data" % site_name, (session.cookies._cookies, session.headers["User-Agent"])) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py index d779bcda0..3475d6689 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/addic7ed.py @@ -2,21 +2,30 @@ import logging import re import datetime +import types + import subliminal +import time + from random import randint -from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded -from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ - Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup, show_cells_re +from dogpile.cache.api import NO_VALUE +from requests import Session from subliminal.cache import region +from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError, \ + DownloadLimitPerDayExceeded +from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \ + Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup from subliminal.subtitle import fix_line_ending from subliminal_patch.utils import sanitize from subliminal_patch.exceptions import TooManyRequests - +from subliminal_patch.pitcher import pitchers, load_verification, store_verification from subzero.language import Language logger = logging.getLogger(__name__) +show_cells_re = re.compile(b'.*?', re.DOTALL) + #: Series header parsing regex series_year_re = re.compile(r'^(?P[ \w\'.:(),*&!?-]+?)(?: \((?P\d{4})\))?$') @@ -58,24 +67,166 @@ class Addic7edProvider(_Addic7edProvider): 'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha', 'tur', 'ukr', 'vie', 'zho' ]} | {Language.fromietf(l) for l in ["sr-Latn", "sr-Cyrl"]} + vip = False USE_ADDICTED_RANDOM_AGENTS = False hearing_impaired_verifiable = True subtitle_class = Addic7edSubtitle + server_url = 'https://www.addic7ed.com/' sanitize_characters = {'-', ':', '(', ')', '.', '/'} + last_show_ids_fetch_key = "addic7ed_last_id_fetch" - def __init__(self, username=None, password=None, use_random_agents=False): + def __init__(self, username=None, password=None, use_random_agents=False, is_vip=False): super(Addic7edProvider, self).__init__(username=username, password=password) self.USE_ADDICTED_RANDOM_AGENTS = use_random_agents + self.vip = is_vip + + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') def initialize(self): - # patch: add optional user agent randomization - super(Addic7edProvider, self).initialize() - if self.USE_ADDICTED_RANDOM_AGENTS: - from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST - logger.debug("addic7ed: using random user agents") - self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] - self.session.headers['Referer'] = self.server_url + self.session = Session() + self.session.headers['User-Agent'] = 'Subliminal/%s' % subliminal.__short_version__ + + from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST + logger.debug("Addic7ed: using random user agents") + self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] + self.session.headers['Referer'] = self.server_url + + # login + if self.username and self.password: + def check_verification(cache_region): + rr = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10, + headers={"Referer": self.server_url}) + if rr.status_code == 302: + logger.info('Addic7ed: Login expired') + cache_region.delete("addic7ed_data") + else: + logger.info('Addic7ed: Re-using old login') + self.logged_in = True + return True + + if load_verification("addic7ed", self.session, callback=check_verification): + return + + logger.info('Addic7ed: Logging in') + data = {'username': self.username, 'password': self.password, 'Submit': 'Log in', 'url': '', + 'remember': 'true'} + + tries = 0 + while tries <= 3: + tries += 1 + r = self.session.get(self.server_url + 'login.php', timeout=10, headers={"Referer": self.server_url}) + if "g-recaptcha" in r.content or "grecaptcha" in r.content: + logger.info('Addic7ed: Solving captcha. This might take a couple of minutes, but should only ' + 'happen once every so often') + + for g, s in (("g-recaptcha-response", r'g-recaptcha.+?data-sitekey=\"(.+?)\"'), + ("recaptcha_response", r'grecaptcha.execute\(\'(.+?)\',')): + site_key = re.search(s, r.content).group(1) + if site_key: + break + if not site_key: + logger.error("Addic7ed: Captcha site-key not found!") + return + + pitcher = pitchers.get_pitcher()("Addic7ed", self.server_url + 'login.php', site_key, + user_agent=self.session.headers["User-Agent"], + cookies=self.session.cookies.get_dict(), + is_invisible=True) + + result = pitcher.throw() + if not result: + if tries >= 3: + raise Exception("Addic7ed: Couldn't solve captcha!") + logger.info("Addic7ed: Couldn't solve captcha! Retrying") + time.sleep(4) + continue + + data[g] = result + + time.sleep(1) + r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10, + headers={"Referer": self.server_url + "login.php"}) + + if "relax, slow down" in r.content: + raise TooManyRequests(self.username) + + if "Wrong password" in r.content or "doesn't exist" in r.content: + raise AuthenticationError(self.username) + + if r.status_code != 302: + if tries >= 3: + logger.error("Addic7ed: Something went wrong when logging in") + raise AuthenticationError(self.username) + logger.info("Addic7ed: Something went wrong when logging in; retrying") + time.sleep(4) + continue + break + + store_verification("addic7ed", self.session) + + logger.debug('Addic7ed: Logged in') + self.logged_in = True + + time.sleep(2) + + def terminate(self): + self.session.close() + + def get_show_id(self, series, year=None, country_code=None, ignore_cache=False): + """Get the best matching show id for `series`, `year` and `country_code`. + + First search in the result of :meth:`_get_show_ids` and fallback on a search with :meth:`_search_show_id`. + + :param str series: series of the episode. + :param year: year of the series, if any. + :type year: int + :param country_code: country code of the series, if any. + :type country_code: str + :return: the show id, if found. + :rtype: int + """ + show_id = None + ids_to_look_for = {sanitize(series).lower(), sanitize(series.replace(".", "")).lower()} + show_ids = self._get_show_ids() + if ignore_cache or not show_ids: + show_ids = self._get_show_ids.refresh(self) + + logger.debug("Trying show ids: %s", ids_to_look_for) + for series_sanitized in ids_to_look_for: + # attempt with country + if not show_id and country_code: + logger.debug('Getting show id with country') + show_id = show_ids.get('%s %s' % (series_sanitized, country_code.lower())) + + # attempt with year + if not show_id and year: + logger.debug('Getting show id with year') + show_id = show_ids.get('%s %d' % (series_sanitized, year)) + + # attempt clean + if not show_id: + logger.debug('Getting show id') + show_id = show_ids.get(series_sanitized) + + if not show_id: + now = datetime.datetime.now() + last_fetch = region.get(self.last_show_ids_fetch_key) + + # re-fetch show ids once per day if any show ID not found + if not ignore_cache and last_fetch != NO_VALUE and last_fetch + datetime.timedelta(days=1) < now: + logger.info("Show id not found; re-fetching show ids") + return self.get_show_id(series, year=year, country_code=country_code, ignore_cache=True) + logger.debug("Not refreshing show ids, as the last fetch has been too recent") + + # search as last resort + # broken right now + # if not show_id: + # logger.warning('Series %s not found in show ids', series) + # show_id = self._search_show_id(series) + + return show_id @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) def _get_show_ids(self): @@ -87,6 +238,8 @@ def _get_show_ids(self): """ # get the show page logger.info('Getting show ids') + region.set(self.last_show_ids_fetch_key, datetime.datetime.now()) + r = self.session.get(self.server_url + 'shows.php', timeout=10) r.raise_for_status() @@ -95,14 +248,15 @@ def _get_show_ids(self): # Assuming the site's markup is bad, and stripping it down to only contain what's needed. show_cells = re.findall(show_cells_re, r.content) if show_cells: - soup = ParserBeautifulSoup(b''.join(show_cells), ['lxml', 'html.parser']) + soup = ParserBeautifulSoup(b''.join(show_cells).decode('utf-8', 'ignore'), ['lxml', 'html.parser']) else: # If RegEx fails, fall back to original r.content and use 'html.parser' soup = ParserBeautifulSoup(r.content, ['html.parser']) # populate the show ids show_ids = {} - for show in soup.select('td.version > h3 > a[href^="/show/"]'): + shows = soup.select('td > h3 > a[href^="/show/"]') + for show in shows: show_clean = sanitize(show.text, default_characters=self.sanitize_characters) try: show_id = int(show['href'][6:]) @@ -120,6 +274,9 @@ def _get_show_ids(self): logger.debug('Found %d show ids', len(show_ids)) + if not show_ids: + raise Exception("Addic7ed: No show IDs found!") + return show_ids @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) @@ -142,10 +299,26 @@ def _search_show_id(self, series, year=None): # make the search logger.info('Searching show ids with %r', params) - r = self.session.get(self.server_url + 'srch.php', params=params, timeout=10) - r.raise_for_status() + + # currently addic7ed searches via srch.php from the front page, then a re-search is needed which calls + # search.php + for endpoint in ("srch.php", "search.php",): + headers = None + if endpoint == "search.php": + headers = { + "referer": self.server_url + "srch.php" + } + r = self.session.get(self.server_url + endpoint, params=params, timeout=10, headers=headers) + r.raise_for_status() + + if r.content and "Sorry, your search" not in r.content: + break + + time.sleep(4) + if r.status_code == 304: raise TooManyRequests() + soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser']) suggestion = None @@ -174,7 +347,15 @@ def query(self, show_id, series, season, year=None, country=None): # get the page of the season of the show logger.info('Getting the page of show id %d, season %d', show_id, season) - r = self.session.get(self.server_url + 'show/%d' % show_id, params={'season': season}, timeout=10) + r = self.session.get(self.server_url + 'ajax_loadShow.php', + params={'show': show_id, 'season': season}, + timeout=10, + headers={ + "referer": "%sshow/%s" % (self.server_url, show_id), + "X-Requested-With": "XMLHttpRequest" + } + ) + r.raise_for_status() if r.status_code == 304: @@ -195,7 +376,7 @@ def query(self, show_id, series, season, year=None, country=None): # ignore incomplete subtitles status = cells[5].text - if status != 'Completed': + if "%" in status: logger.debug('Ignoring subtitle with status %s', status) continue @@ -221,6 +402,27 @@ def query(self, show_id, series, season, year=None, country=None): return subtitles def download_subtitle(self, subtitle): + last_dls = region.get("addic7ed_dls") + now = datetime.datetime.now() + one_day = datetime.timedelta(hours=24) + + def raise_limit(): + logger.info("Addic7ed: Downloads per day exceeded (%s)", cap) + raise DownloadLimitPerDayExceeded + + if not isinstance(last_dls, types.ListType): + last_dls = [] + else: + # filter all non-expired DLs + last_dls = filter(lambda t: t + one_day > now, last_dls) + region.set("addic7ed_dls", last_dls) + + cap = self.vip and 80 or 40 + amount = len(last_dls) + + if amount >= cap: + raise_limit() + # download the subtitle r = self.session.get(self.server_url + subtitle.download_link, headers={'Referer': subtitle.page_link}, timeout=10) @@ -232,7 +434,7 @@ def download_subtitle(self, subtitle): if not r.content: # Provider wrongful return a status of 304 Not Modified with an empty content # raise_for_status won't raise exception for that status code - logger.error('Unable to download subtitle. No data returned from provider') + logger.error('Addic7ed: Unable to download subtitle. No data returned from provider') return # detect download limit exceeded @@ -240,3 +442,10 @@ def download_subtitle(self, subtitle): raise DownloadLimitExceeded subtitle.content = fix_line_ending(r.content) + last_dls.append(datetime.datetime.now()) + region.set("addic7ed_dls", last_dls) + logger.info("Addic7ed: Used %s/%s downloads", amount + 1, cap) + + if amount + 1 >= cap: + raise_limit() + diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py b/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py index 6a2c7aec8..5fe3d28cc 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/argenteam.py @@ -23,9 +23,10 @@ class ArgenteamSubtitle(Subtitle): hearing_impaired_verifiable = False _release_info = None - def __init__(self, language, download_link, movie_kind, title, season, episode, year, release, version, source, + def __init__(self, language, page_link, download_link, movie_kind, title, season, episode, year, release, version, source, video_codec, tvdb_id, imdb_id, asked_for_episode=None, asked_for_release_group=None, *args, **kwargs): - super(ArgenteamSubtitle, self).__init__(language, download_link, *args, **kwargs) + super(ArgenteamSubtitle, self).__init__(language, page_link=page_link, *args, **kwargs) + self.page_link = page_link self.download_link = download_link self.movie_kind = movie_kind self.title = title @@ -135,7 +136,8 @@ class ArgenteamProvider(Provider, ProviderSubtitleArchiveMixin): provider_name = 'argenteam' languages = {Language.fromalpha2(l) for l in ['es']} video_types = (Episode, Movie) - API_URL = "http://argenteam.net/api/v1/" + BASE_URL = "https://argenteam.net/" + API_URL = BASE_URL + "api/v1/" subtitle_class = ArgenteamSubtitle hearing_impaired_verifiable = False language_list = list(languages) @@ -240,12 +242,15 @@ def query(self, title, video, titles=None): for r in content['releases']: for s in r['subtitles']: - sub = ArgenteamSubtitle(language, s['uri'], "episode" if is_episode else "movie", returned_title, + movie_kind = "episode" if is_episode else "movie" + page_link = self.BASE_URL + movie_kind + "/" + str(aid) + # use https and new domain + download_link = s['uri'].replace('http://www.argenteam.net/', self.BASE_URL) + sub = ArgenteamSubtitle(language, page_link, download_link, movie_kind, returned_title, season, episode, year, r.get('team'), r.get('tags'), r.get('source'), r.get('codec'), content.get("tvdb"), imdb_id, asked_for_release_group=video.release_group, - asked_for_episode=episode - ) + asked_for_episode=episode) subtitles.append(sub) if has_multiple_ids: diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py b/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py new file mode 100644 index 000000000..67300dd0b --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/assrt.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +import json +import logging +import os +import re + +from babelfish import language_converters +from guessit import guessit +from requests import Session + +from subliminal import Movie, Episode, ProviderError, __short_version__ +from subliminal.exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending +from subliminal_patch.providers import Provider +from subzero.language import Language + +logger = logging.getLogger(__name__) + +language_converters.register('assrt = subliminal_patch.converters.assrt:AssrtConverter') + +server_url = 'https://api.assrt.net/v1' +supported_languages = language_converters['assrt'].to_assrt.keys() + + +class AssrtSubtitle(Subtitle): + """Assrt Sbutitle.""" + provider_name = 'assrt' + guessit_options = { + 'allowed_languages': [ l[0] for l in supported_languages ], + 'allowed_countries': [ l[1] for l in supported_languages if len(l) > 1 ], + 'enforce_list': True + } + + def __init__(self, language, subtitle_id, video_name, session, token): + super(AssrtSubtitle, self).__init__(language) + self.session = session + self.token = token + self.subtitle_id = subtitle_id + self.video_name = video_name + self.url = None + self._detail = None + + def _get_detail(self): + if self._detail: + return self._detail + params = {'token': self.token, 'id': self.id} + r = self.session.get(server_url + '/sub/detail', params=params, timeout=10) + r.raise_for_status() + + result = r.json() + sub = result['sub']['subs'][0] + files = sub['filelist'] + + # first pass: guessit + for f in files: + logger.info('File %r', f) + guess = guessit(f['f'], self.guessit_options) + logger.info('GuessIt %r', guess) + langs = set() + if 'language' in guess: + langs.update(guess['language']) + if 'subtitle_language' in guess: + langs.update(guess['subtitle_language']) + if self.language in langs: + self._defail = f + return f + + # second pass: keyword matching + codes = language_converters['assrt'].codes + for f in files: + langs = set([ Language.fromassrt(k) for k in codes if k in f['f'] ]) + logger.info('%s: %r', f['f'], langs) + if self.language in langs: + self._defail = f + return f + + # fallback: pick up first file if nothing matches + return files[0] + + @property + def id(self): + return self.subtitle_id + + @property + def download_link(self): + detail = self._get_detail() + return detail['url'] + + def get_matches(self, video): + matches = guess_matches(video, guessit(self.video_name)) + return matches + + +class AssrtProvider(Provider): + """Assrt Provider.""" + languages = {Language(*l) for l in supported_languages} + + def __init__(self, token=None): + if not token: + raise ConfigurationError('Token must be specified') + self.token = token + + def initialize(self): + self.session = Session() + self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")} + + def terminate(self): + self.session.close() + + def query(self, languages, video): + # query the server + keywords = [] + if isinstance(video, Movie): + if video.title: + keywords.append(video.title) + if video.year: + keywords.append(str(video.year)) + elif isinstance(video, Episode): + if video.series: + keywords.append(video.series) + if video.season and video.episode: + keywords.append('S%02dE%02d' % (video.season, video.episode)) + elif video.episode: + keywords.append('E%02d' % video.episode) + query = ' '.join(keywords) + + params = {'token': self.token, 'q': query, 'is_file': 1} + logger.debug('Searching subtitles %r', params) + res = self.session.get(server_url + '/sub/search', params=params, timeout=10) + res.raise_for_status() + result = res.json() + + if result['status'] != 0: + logger.error('status error: %r', r) + return [] + + if not result['sub']['subs']: + logger.debug('No subtitle found') + + # parse the subtitles + pattern = re.compile(ur'lang(?P\w+)') + subtitles = [] + for sub in result['sub']['subs']: + if 'lang' not in sub: + continue + for key in sub['lang']['langlist'].keys(): + match = pattern.match(key) + try: + language = Language.fromassrt(match.group('code')) + if language in languages: + subtitles.append(AssrtSubtitle(language, sub['id'], sub['videoname'], self.session, self.token)) + except: + pass + + return subtitles + + def list_subtitles(self, video, languages): + return self.query(languages, video) + + def download_subtitle(self, subtitle): + logger.info('Downloading subtitle %r', subtitle) + r = self.session.get(subtitle.download_link, timeout=10) + r.raise_for_status() + + subtitle.content = fix_line_ending(r.content) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py b/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py new file mode 100644 index 000000000..f6eb20db4 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/bsplayer.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +import logging +import io +import os + +from requests import Session +from guessit import guessit +from subliminal_patch.providers import Provider +from subliminal_patch.subtitle import Subtitle +from subliminal.utils import sanitize_release_group +from subliminal.subtitle import guess_matches +from subzero.language import Language + +import gzip +import random +from time import sleep +from xml.etree import ElementTree + +logger = logging.getLogger(__name__) + + +class BSPlayerSubtitle(Subtitle): + """BSPlayer Subtitle.""" + provider_name = 'bsplayer' + hash_verifiable = True + + def __init__(self, language, filename, subtype, video, link): + super(BSPlayerSubtitle, self).__init__(language) + self.language = language + self.filename = filename + self.page_link = link + self.subtype = subtype + self.video = video + + @property + def id(self): + return self.page_link + + @property + def release_info(self): + return self.filename + + def get_matches(self, video): + matches = set() + matches |= guess_matches(video, guessit(self.filename)) + matches.add('hash') + + return matches + + +class BSPlayerProvider(Provider): + """BSPlayer Provider.""" + languages = {Language('por', 'BR')} | {Language(l) for l in [ + 'ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor', 'nld', 'pol', 'por', + 'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho' + ]} + SEARCH_THROTTLE = 8 + hash_verifiable = True + + # batantly based on kodi's bsplayer plugin + # also took from BSPlayer-Subtitles-Downloader + def __init__(self): + self.initialize() + + def initialize(self): + self.session = Session() + self.search_url = self.get_sub_domain() + self.token = None + self.login() + + def terminate(self): + self.session.close() + self.logout() + + def api_request(self, func_name='logIn', params='', tries=5): + headers = { + 'User-Agent': 'BSPlayer/2.x (1022.12360)', + 'Content-Type': 'text/xml; charset=utf-8', + 'Connection': 'close', + 'SOAPAction': '"http://api.bsplayer-subtitles.com/v1.php#{func_name}"'.format(func_name=func_name) + } + data = ( + '\n' + '' + '' + '{params}' + ).format(search_url=self.search_url, func_name=func_name, params=params) + logger.info('Sending request: %s.' % func_name) + for i in iter(range(tries)): + try: + self.session.headers.update(headers.items()) + res = self.session.post(self.search_url, data) + return ElementTree.fromstring(res.text) + + except Exception as ex: + logger.info("ERROR: %s." % ex) + if func_name == 'logIn': + self.search_url = self.get_sub_domain() + + sleep(1) + logger.info('ERROR: Too many tries (%d)...' % tries) + raise Exception('Too many tries...') + + def login(self): + # If already logged in + if self.token: + return True + + root = self.api_request( + func_name='logIn', + params=('' + '' + 'BSPlayer v2.67') + ) + res = root.find('.//return') + if res.find('status').text == 'OK': + self.token = res.find('data').text + logger.info("Logged In Successfully.") + return True + return False + + def logout(self): + # If already logged out / not logged in + if not self.token: + return True + + root = self.api_request( + func_name='logOut', + params='{token}'.format(token=self.token) + ) + res = root.find('.//return') + self.token = None + if res.find('status').text == 'OK': + logger.info("Logged Out Successfully.") + return True + return False + + def query(self, video, video_hash, language): + if not self.login(): + return [] + + if isinstance(language, (tuple, list, set)): + # language_ids = ",".join(language) + # language_ids = 'spa' + language_ids = ','.join(sorted(l.opensubtitles for l in language)) + + if video.imdb_id is None: + imdbId = '*' + else: + imdbId = video.imdb_id + sleep(self.SEARCH_THROTTLE) + root = self.api_request( + func_name='searchSubtitles', + params=( + '{token}' + '{movie_hash}' + '{movie_size}' + '{language_ids}' + '{imdbId}' + ).format(token=self.token, movie_hash=video_hash, + movie_size=video.size, language_ids=language_ids, imdbId=imdbId) + ) + res = root.find('.//return/result') + if res.find('status').text != 'OK': + return [] + + items = root.findall('.//return/data/item') + subtitles = [] + if items: + logger.info("Subtitles Found.") + for item in items: + subID = item.find('subID').text + subDownloadLink = item.find('subDownloadLink').text + subLang = Language.fromopensubtitles(item.find('subLang').text) + subName = item.find('subName').text + subFormat = item.find('subFormat').text + subtitles.append( + BSPlayerSubtitle(subLang, subName, subFormat, video, subDownloadLink) + ) + return subtitles + + def list_subtitles(self, video, languages): + return self.query(video, video.hashes['bsplayer'], languages) + + def get_sub_domain(self): + # s1-9, s101-109 + SUB_DOMAINS = ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', + 's101', 's102', 's103', 's104', 's105', 's106', 's107', 's108', 's109'] + API_URL_TEMPLATE = "http://{sub_domain}.api.bsplayer-subtitles.com/v1.php" + sub_domains_end = len(SUB_DOMAINS) - 1 + return API_URL_TEMPLATE.format(sub_domain=SUB_DOMAINS[random.randint(0, sub_domains_end)]) + + def download_subtitle(self, subtitle): + session = Session() + _addheaders = { + 'User-Agent': 'Mozilla/4.0 (compatible; Synapse)' + } + session.headers.update(_addheaders) + res = session.get(subtitle.page_link) + if res: + if res.text == '500': + raise ValueError('Error 500 on server') + + with gzip.GzipFile(fileobj=io.BytesIO(res.content)) as gf: + subtitle.content = gf.read() + subtitle.normalize() + + return subtitle + raise ValueError('Problems conecting to the server') diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py index aa436087f..85f070566 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/hosszupuska.py @@ -7,7 +7,8 @@ import os import time -from babelfish import Language, language_converters +from babelfish import language_converters +from subzero.language import Language from requests import Session from subliminal_patch.providers import Provider @@ -32,8 +33,9 @@ def fix_inconsistent_naming(title): :rtype: str """ - return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", - "Marvel's Jessica Jones": "Jessica Jones"}) + return _fix_inconsistent_naming(title, {"Stargate Origins": "Stargate: Origins", + "Marvel's Agents of S.H.I.E.L.D.": "Marvels+Agents+of+S.H.I.E.L.D", + "Mayans M.C.": "Mayans MC"}, True) logger = logging.getLogger(__name__) @@ -88,7 +90,7 @@ def id(self): def get_matches(self, video): matches = set() # series - if video.series and sanitize(self.series) == sanitize(video.series): + if video.series and ( sanitize(self.series) == sanitize(fix_inconsistent_naming(video.series)) or sanitize(self.series) == sanitize(video.series)): matches.add('series') # season if video.season and self.season == video.season: @@ -149,7 +151,7 @@ def query(self, series, season, episode, year=None, video=None): seasona = "%02d" % season episodea = "%02d" % episode series = fix_inconsistent_naming(series) - seriesa = series.replace(' ', '+').replace('\'', '') + seriesa = series.replace(' ', '+') # get the episode page logger.info('Getting the page for episode %s', episode) @@ -180,9 +182,9 @@ def query(self, series, season, episode, year=None, video=None): sub_year = sub_english_name = sub_version = None # Handle the case when '(' in subtitle - if datas[1].getText().count('(') == 2: + if datas[1].getText().count('(') == 1: sub_english_name = re.split('s(\d{1,2})e(\d{1,2})', datas[1].getText())[3] - if datas[1].getText().count('(') == 3: + if datas[1].getText().count('(') == 2: sub_year = re.findall(r"(?<=\()(\d{4})(?=\))", datas[1].getText().strip())[0] sub_english_name = re.split('s(\d{1,2})e(\d{1,2})', datas[1].getText().split('(')[0])[0] @@ -199,9 +201,9 @@ def query(self, series, season, episode, year=None, video=None): sub_downloadlink = datas[6].find_all('a')[1]['href'] sub_id = sub_downloadlink.split('=')[1].split('.')[0] - if datas[1].getText().count('(') == 2: + if datas[1].getText().count('(') == 1: sub_version = datas[1].getText().split('(')[1].split(')')[0] - if datas[1].getText().count('(') == 3: + if datas[1].getText().count('(') == 2: sub_version = datas[1].getText().split('(')[2].split(')')[0] # One subtitle can be used for several releases @@ -225,6 +227,7 @@ def list_subtitles(self, video, languages): return subs time.sleep(self.multi_result_throttle) + return [] def download_subtitle(self, subtitle): r = self.session.get(subtitle.page_link, timeout=10) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/ktuvit.py b/Contents/Libraries/Shared/subliminal_patch/providers/ktuvit.py new file mode 100644 index 000000000..622cd942e --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/ktuvit.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +import re +from requests import Session +from requests.cookies import RequestsCookieJar +import json +import logging +from subzero.language import Language +from bs4 import BeautifulSoup +from guessit import guessit + +from subliminal_patch.providers import Provider +from subliminal.providers import Episode, Movie +from subliminal_patch.utils import sanitize +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending +from subliminal.exceptions import ConfigurationError, AuthenticationError + +from string import hexdigits +from collections import defaultdict +import pbkdf2 +from base64 import b64decode, b64encode +from hashlib import sha256 +import pyaes + +__author__ = "Dor Nizar" + +logger = logging.getLogger(__name__) + + +class KtuvitSubtitle(Subtitle): + provider_name = 'ktuvit' + + def __init__(self, language, title_id, subtitle_id, series, season, episode, release, year): + super(KtuvitSubtitle, self).__init__(language, subtitle_id) + self.title_id = title_id + self.subtitle_id = subtitle_id + self.series = series + self.season = season + self.episode = episode + self.release = release + self.year = year + + def get_matches(self, video): + matches = set() + logger.debug("[{}]\n{}".format(self.__class__.__name__, self.__dict__)) + + # episode + if isinstance(video, Episode): + # series + if video.series and sanitize(self.series) == sanitize(video.series): + matches.add('series') + # season + if video.season and self.season == video.season: + matches.add('season') + # episode + if video.episode and self.episode == video.episode: + matches.add('episode') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'episode'})) + # movie + elif isinstance(video, Movie): + # title + if video.title and (sanitize(self.series) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + # year + if video.year and self.year == video.year: + matches.add('year') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'movie'})) + + logger.debug("Ktuvit subtitle criteria match:\n{}".format(matches)) + return matches + + @property + def id(self): + return self.subtitle_id + + +class KtuvitProvider(Provider): + subtitle_class = KtuvitSubtitle + languages = {Language.fromalpha2(l) for l in ['he']} + URL_SERVER = 'https://www.ktuvit.me/' + + URI_LOGIN = 'Login.aspx' + URI_LOGIN_POST = 'Services/MembershipService.svc/Login' + URI_SEARCH_TITLE = 'Services/ContentProvider.svc/GetSearchForecast' + URI_SEARCH_SERIES_SUBTITLE = 'Services/GetModuleAjax.ashx' + URI_SEARCH_MOVIE_SUBTITLE = "MovieInfo.aspx" + URI_REQ_SUBTITLE_ID = "Services/ContentProvider.svc/RequestSubtitleDownload" + URI_DOWNLOAD_SUBTITLE = "Services/DownloadFile.ashx" + + def __init__(self, username=None, password=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + self.session = None + self.username = username + self.password = password + self.encrypted_password = None + self.salt = None + + def encrypt_password(self): + logger.debug("password: {}".format(self.password)) + encrypted_password = KtuvitEncryptor(self.username, self.password, self.salt).encrypt() + if not encrypted_password: + logger.error("Could not encrypt password") + return False + self.encrypted_password = encrypted_password + return True + + def get_encryption_salt(self): + p = re.compile(r"var encryptionSalt = '(.*)';") + r = self.session.get(self.URL_SERVER + self.URI_LOGIN) + r.raise_for_status() + + logger.debug("Searching for encryptionSalt...") + script_list = [i for i in BeautifulSoup(r.content, 'html.parser').select('div#navbar script') if i.contents] + for item in script_list: + search_salt = p.search(item.contents[0]) + if search_salt: + self.salt = search_salt.group(1) + return True + logger.error("Could not get encryptionSalt") + return False + + def login(self): + if not self.get_encryption_salt(): + return False + if not self.encrypt_password(): + return False + data = { + "request": { + "Email": self.username, + "Password": self.encrypted_password + } + } + logger.debug("Trying to log in using: {}".format(json.dumps(data))) + r = self.session.post(self.URL_SERVER + self.URI_LOGIN_POST, json=data) + r_result = r.json() + login_results = "" + if 'd' in r_result: + try: + login_results = json.loads(r_result['d']) + except ValueError: + logger.error("Could not process JSON from login response") + return False + + if 'IsSuccess' not in login_results: + logger.error("Login response is different than expected") + return False + + if not login_results['IsSuccess']: + logger.error("Wrong username or password!") + raise AuthenticationError('Wrong username or password!') + return False + + if not r.cookies or type(r.cookies) is not RequestsCookieJar: + logger.error("Could not get the cookie response of the login") + return False + + if 'Login' not in r.cookies.keys(): + logger.error("Could not found login cookie!") + return False + + logger.info("Connected successfully to Ktuvit!") + return True + + def initialize(self): + logger.debug("Ktuvit initialize") + self.session = Session() + self.session.headers[ + 'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; ' \ + 'Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' + + if not self.login(): + return False + + def terminate(self): + logger.debug("Ktuvit terminate") + self.session.close() + + def _search_series(self, title): + logger.debug("Searching '{}'".format(title)) + title_request = { + "request": { + "SearchString": title, + "SearchType": "Film" + } + } + r = self.session.post(self.URL_SERVER + self.URI_SEARCH_TITLE, json=title_request, allow_redirects=False, + timeout=10) + r.raise_for_status() + series_found = r.json() + if 'd' in series_found: + try: + series_found = json.loads(series_found['d']) + except ValueError: + series_found = None + if 'Items' in series_found: + return series_found['Items'] + return [] + + def _search_subtitles(self, title_id, season=None, episode=None): + if season and episode: + params = { + 'moduleName': 'SubtitlesList', + 'SeriesID': title_id, + 'Season': season, + 'Episode': episode + } + r = self.session.get(url=self.URL_SERVER + self.URI_SEARCH_SERIES_SUBTITLE, params=params) + else: + params = { + 'ID': title_id, + } + r = self.session.get(url=self.URL_SERVER + self.URI_SEARCH_MOVIE_SUBTITLE, params=params) + + r.raise_for_status() + results = r.content + if not results: + return [] + subtitles = BeautifulSoup(results, 'html.parser').select('a.fa') + logger.debug("[BS4] Elements found:\n{}".format(subtitles)) + subtitle_list = [] + for i in subtitles: + subtitle_id = i.attrs['data-subtitle-id'] + release = i.findParent().findParent().text.strip().split('\n')[0] + subtitle_list.append((subtitle_id, release)) + + return subtitle_list # [(Subtitle ID, name), (....)] + + def _req_download_identifier(self, title_id, subtitle_id): + logger.debug("Request subtitle identifier for: title id: {}, subtitle id: {}".format(title_id, subtitle_id)) + data = { + 'request': { + 'FilmID': title_id, + 'SubtitleID': subtitle_id, + 'FontSize': 0, + 'FontColor': "", + 'PredefinedLayout': -1 + } + } + + r = self.session.post(self.URL_SERVER + self.URI_REQ_SUBTITLE_ID, json=data, allow_redirects=False, + timeout=10) + r.raise_for_status() + try: + r = json.loads(r.json()['d']) + except ValueError: + r = {} + + if 'DownloadIdentifier' not in r: + logger.error("Download Identifier not found") + return None + return r['DownloadIdentifier'] + + def _download_subtitles(self, download_id): + logger.debug("Downloading subtitles by download identifier - {}".format(download_id)) + data = {'DownloadIdentifier': download_id} + r = self.session.get(self.URL_SERVER + self.URI_DOWNLOAD_SUBTITLE, params=data, + timeout=10) + r.raise_for_status() + if not r.content: + logger.debug("Download subtitle failed") + return None + + logger.debug("Download subtitle success") + return r.content + + def query(self, title, season=None, episode=None, year=None): + subtitles = [] + titles = self._search_series(title) + if season and episode: + logger.debug("Searching for:\nTitle: {}\nSeason: {}\nEpisode: {}\nYear: {}".format(title, season, + episode, year)) + else: + logger.debug("Searching for:\nTitle: {}\nYear: {}\n".format(title, year)) + for title in titles: + logger.debug("Title Candidate: {}".format(title)) + title_id = title['ID'] + if season and episode: + result = self._search_subtitles(title_id, season, episode) + else: + result = self._search_subtitles(title_id) + + if not result: + continue + + for subtitle_id, release in result: + subtitles.append(self.subtitle_class(next(iter(self.languages)), title_id, subtitle_id, + title['EngName'], season, episode, release, year)) + + if subtitles: + logger.debug("Found Subtitle Candidates: {}".format(subtitles)) + return subtitles + + def list_subtitles(self, video, languages): + season = episode = year = title = None + + if isinstance(video, Episode): + logger.info("list_subtitles Series: {}, season: {}, episode: {}".format(video.series, + video.season, + video.episode)) + title = video.series + season = video.season + episode = video.episode + elif isinstance(video, Movie): + logger.info("list_subtitles Movie: {}, year: {}".format(video.title, video.year)) + title = video.title + year = video.year + + return [s for s in self.query(title, season, episode, year) if s.language in languages] + + def download_subtitle(self, subtitle): + # type: (KtuvitSubtitle) -> None + + logger.info('Downloading subtitle from Ktuvit: %r', subtitle) + download_id = self._req_download_identifier(subtitle.title_id, subtitle.subtitle_id) + if not download_id: + logger.debug('Unable to retrieve download identifier') + return None + + content = self._download_subtitles(download_id) + if not content: + logger.debug('Unable to download subtitle') + return None + + subtitle.content = fix_line_ending(content) + + +class KtuvitEncryptor: + def __init__(self, username, password, salt): + if not all((username, password, salt)): + raise Exception("Encryptor did not get all required arguments") + + self.encrypted_password = None + self.username = username + self.password = password + self.salt = salt + + @staticmethod + def rshift(val, n): + return (val % 0x100000000) >> n + + @staticmethod + def js_parseint(s, rad=10): + digits = '' + for c in str(s).strip(): + if c not in hexdigits: + break + digits += c + + return int(digits, rad) if digits else 0 + + @staticmethod + def to_signed32(n): + n = n & 0xffffffff + return n | (-(n & 0x80000000)) + + def stringify(self, words, length): + sigbytes = int(length / 2) + int((length % 2) > 0) + hex_chars = list() + + for i in xrange(0, sigbytes): + bite = self.rshift(words[self.rshift(i, 2)], (24 - (i % 4) * 8)) & 0xff + hex_chars.append(format(self.rshift(bite, 4), 'x')) + hex_chars.append(format(bite & 0x0f, 'x')) + return ''.join(hex_chars) + + def cryptojs_hexparse(self, s): + words = defaultdict(int) + for i in range(0, len(s), 2): + tmp1 = (self.js_parseint(s[i:i + 2], 16)) + tmp2 = (24 - (i % 8) * 4) + tmp3 = self.to_signed32(tmp1 << tmp2) + words[self.rshift(i, 3)] |= tmp3 + return self.stringify(words, len(s)) + + def cryptojs_pad_iv(self, iv): + return str.ljust(self.cryptojs_hexparse(iv), 32, '0').decode('hex') + + @staticmethod + def pbkdf2_encrypt(key, salt): + a = pbkdf2.PBKDF2(salt, key, 3000) + return a.read(16) + + @staticmethod + def pad(m): + return m + chr(16 - len(m) % 16) * (16 - len(m) % 16) + + def aes_encrypt(self, msg, key, iv): + if len(iv) != 16: + logger.error("iv (Len: {}) - {} is not 16 length".format(len(iv), iv)) + return False + msg = self.pad(msg) + + aes = pyaes.AESModeOfOperationCBC(key, iv=iv[:16]) + return b64encode(aes.encrypt(msg)) + + def encrypt(self): + if not self.salt: + logger.error("No salt was instantiated!") + return False + msg = self.password.encode('utf-8') + iv = self.cryptojs_pad_iv(self.username) + key = self.pbkdf2_encrypt(self.username, self.salt.encode('utf-8')) + + cipher = self.aes_encrypt(msg, key, iv) + if not cipher: + return False + + hash_sha256 = sha256(b64decode(cipher)) + self.encrypted_password = b64encode(hash_sha256.digest()) + logger.debug("Encrypted password: {}".format(self.encrypted_password)) + logger.debug("Original password: {}".format(self.password)) + return self.encrypted_password diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py index b705e6e6c..0661b5f4d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/legendastv.py @@ -1,10 +1,14 @@ # coding=utf-8 import logging import rarfile +import os from subliminal.exceptions import ConfigurationError from subliminal.providers.legendastv import LegendasTVSubtitle as _LegendasTVSubtitle, \ - LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize + LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize, region, type_map, \ + raise_for_status, json, SHOW_EXPIRATION_TIME, title_re, season_re, datetime, pytz, NO_VALUE, releases_key, \ + SUBTITLE_EXTENSIONS, language_converters +from subzero.language import Language logger = logging.getLogger(__name__) @@ -60,6 +64,7 @@ def get_matches(self, video, hearing_impaired=False): class LegendasTVProvider(_LegendasTVProvider): + languages = {Language(*l) for l in language_converters['legendastv'].to_legendastv.keys()} subtitle_class = LegendasTVSubtitle def __init__(self, username=None, password=None): @@ -78,6 +83,176 @@ def __init__(self, username=None, password=None): self.logged_in = False self.session = None + @staticmethod + def is_valid_title(title, title_id, sanitized_title, season, year, imdb_id): + """Check if is a valid title.""" + if title["imdb_id"] and title["imdb_id"] == imdb_id: + logger.debug(u'Matched title "%s" as IMDB ID %s', sanitized_title, title["imdb_id"]) + return True + + if title["title2"] and sanitize(title['title2']) == sanitized_title: + logger.debug(u'Matched title "%s" as "%s"', sanitized_title, title["title2"]) + return True + + return _LegendasTVProvider.is_valid_title(title, title_id, sanitized_title, season, year) + + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME, should_cache_fn=lambda value: value) + def search_titles(self, title, season, title_year, imdb_id): + """Search for titles matching the `title`. + + For episodes, each season has it own title + :param str title: the title to search for. + :param int season: season of the title + :param int title_year: year of the title + :return: found titles. + :rtype: dict + """ + titles = {} + sanitized_titles = [sanitize(title)] + ignore_characters = {'\'', '.'} + if any(c in title for c in ignore_characters): + sanitized_titles.append(sanitize(title, ignore_characters=ignore_characters)) + + for sanitized_title in sanitized_titles: + # make the query + if season: + logger.info('Searching episode title %r for season %r', sanitized_title, season) + else: + logger.info('Searching movie title %r', sanitized_title) + + r = self.session.get(self.server_url + 'legenda/sugestao/{}'.format(sanitized_title), timeout=10) + raise_for_status(r) + results = json.loads(r.text) + + # loop over results + for result in results: + source = result['_source'] + + # extract id + title_id = int(source['id_filme']) + + # extract type + title = {'type': type_map[source['tipo']], 'title2': None, 'imdb_id': None} + + # extract title, year and country + name, year, country = title_re.match(source['dsc_nome']).groups() + title['title'] = name + + if "dsc_nome_br" in source: + name2, ommit1, ommit2 = title_re.match(source['dsc_nome_br']).groups() + title['title2'] = name2 + + # extract imdb_id + if source['id_imdb'] != '0': + if not source['id_imdb'].startswith('tt'): + title['imdb_id'] = 'tt' + source['id_imdb'].zfill(7) + else: + title['imdb_id'] = source['id_imdb'] + + # extract season + if title['type'] == 'episode': + if source['temporada'] and source['temporada'].isdigit(): + title['season'] = int(source['temporada']) + else: + match = season_re.search(source['dsc_nome_br']) + if match: + title['season'] = int(match.group('season')) + else: + logger.debug('No season detected for title %d (%s)', title_id, name) + + # extract year + if year: + title['year'] = int(year) + elif source['dsc_data_lancamento'] and source['dsc_data_lancamento'].isdigit(): + # year is based on season air date hence the adjustment + title['year'] = int(source['dsc_data_lancamento']) - title.get('season', 1) + 1 + + # add title only if is valid + # Check against title without ignored chars + if self.is_valid_title(title, title_id, sanitized_titles[0], season, title_year, imdb_id): + logger.debug(u'Found title: %s', title) + titles[title_id] = title + + logger.debug('Found %d titles', len(titles)) + + return titles + + def query(self, language, title, season=None, episode=None, year=None, imdb_id=None): + # search for titles + titles = self.search_titles(title, season, year, imdb_id) + + subtitles = [] + # iterate over titles + for title_id, t in titles.items(): + + logger.info('Getting archives for title %d and language %d', title_id, language.legendastv) + archives = self.get_archives(title_id, language.legendastv, t['type'], season, episode) + if not archives: + logger.info('No archives found for title %d and language %d', title_id, language.legendastv) + + # iterate over title's archives + for a in archives: + + # compute an expiration time based on the archive timestamp + expiration_time = (datetime.utcnow().replace(tzinfo=pytz.utc) - a.timestamp).total_seconds() + + # attempt to get the releases from the cache + cache_key = releases_key.format(archive_id=a.id, archive_name=a.name) + releases = region.get(cache_key, expiration_time=expiration_time) + + # the releases are not in cache or cache is expired + if releases == NO_VALUE: + logger.info('Releases not found in cache') + + # download archive + self.download_archive(a) + + # extract the releases + releases = [] + for name in a.content.namelist(): + # discard the legendastv file + if name.startswith('Legendas.tv'): + continue + + # discard hidden files + if os.path.split(name)[-1].startswith('.'): + continue + + # discard non-subtitle files + if not name.lower().endswith(SUBTITLE_EXTENSIONS): + continue + + releases.append(name) + + # cache the releases + region.set(cache_key, releases) + + # iterate over releases + for r in releases: + subtitle = self.subtitle_class(language, t['type'], t['title'], t.get('year'), t.get('imdb_id'), + t.get('season'), a, r) + logger.debug('Found subtitle %r', subtitle) + subtitles.append(subtitle) + + return subtitles + + def list_subtitles(self, video, languages): + season = episode = None + if isinstance(video, Episode): + titles = [video.series] + video.alternative_series + season = video.season + episode = video.episode + else: + titles = [video.title] + video.alternative_titles + + for title in titles: + subtitles = [s for l in languages for s in + self.query(l, title, season=season, episode=episode, year=video.year, imdb_id=video.imdb_id)] + if subtitles: + return subtitles + + return [] + def download_subtitle(self, subtitle): super(LegendasTVProvider, self).download_subtitle(subtitle) subtitle.archive.content = None diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py b/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py index c33a9b6ae..255caa447 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/mixins.py @@ -5,6 +5,7 @@ import logging import traceback import types +import os from httplib import ResponseNotReady from guessit import guessit @@ -83,8 +84,14 @@ def get_subtitle_from_archive(self, subtitle, archive): # - episode and season match # - format matches (if it was matched before) # - release group matches (and we asked for one and it was matched, or it was not matched) + # - not asked for forced and "forced" not in filename is_episode = subtitle.asked_for_episode + if not subtitle.language.forced: + base, ext = os.path.splitext(sub_name_lower) + if base.endswith("forced") or "forced" in guess.get("release_group", ""): + continue + episodes = guess.get("episode") if is_episode and episodes and not isinstance(episodes, list): episodes = [episodes] @@ -141,7 +148,8 @@ def get_subtitle_from_archive(self, subtitle, archive): subs_fallback.append(sub_name) if not matching_sub and not subs_unsure and not subs_fallback: - raise ProviderError("None of expected subtitle found in archive") + logger.error("None of expected subtitle found in archive") + return elif subs_unsure: matching_sub = subs_unsure[0] diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py b/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py index e4fefae46..0b80f821d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/napiprojekt.py @@ -3,6 +3,7 @@ from subliminal.providers.napiprojekt import NapiProjektProvider as _NapiProjektProvider, \ NapiProjektSubtitle as _NapiProjektSubtitle, get_subhash +from subzero.language import Language logger = logging.getLogger(__name__) @@ -18,6 +19,7 @@ def __repr__(self): class NapiProjektProvider(_NapiProjektProvider): + languages = {Language.fromalpha2(l) for l in ['pl']} subtitle_class = NapiProjektSubtitle def query(self, language, hash): diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py b/Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py new file mode 100644 index 000000000..553e948f2 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/napisy24.py @@ -0,0 +1,124 @@ +import logging +import os +from io import BytesIO +from zipfile import ZipFile + +from requests import Session + +from subliminal_patch.subtitle import Subtitle +from subliminal_patch.providers import Provider +from subliminal import __short_version__ +from subliminal.exceptions import AuthenticationError, ConfigurationError +from subliminal.subtitle import fix_line_ending +from subzero.language import Language + +logger = logging.getLogger(__name__) + + +class Napisy24Subtitle(Subtitle): + '''Napisy24 Subtitle.''' + provider_name = 'napisy24' + + def __init__(self, language, hash, imdb_id, napis_id): + super(Napisy24Subtitle, self).__init__(language) + self.hash = hash + self.imdb_id = imdb_id + self.napis_id = napis_id + + @property + def id(self): + return self.hash + + def get_matches(self, video): + matches = set() + + # hash + if 'napisy24' in video.hashes and video.hashes['napisy24'] == self.hash: + matches.add('hash') + + # imdb_id + if video.imdb_id and self.imdb_id == video.imdb_id: + matches.add('imdb_id') + + return matches + + +class Napisy24Provider(Provider): + '''Napisy24 Provider.''' + languages = {Language(l) for l in ['pol']} + required_hash = 'napisy24' + api_url = 'http://napisy24.pl/run/CheckSubAgent.php' + + def __init__(self, username=None, password=None): + if all((username, password)): + self.username = username + self.password = password + else: + self.username = 'subliminal' + self.password = 'lanimilbus' + + self.session = None + + def initialize(self): + self.session = Session() + self.session.headers['User-Agent'] = 'Subliminal/%s' % __short_version__ + self.session.headers['Content-Type'] = 'application/x-www-form-urlencoded' + + def terminate(self): + self.session.close() + + def query(self, language, size, name, hash): + params = { + 'postAction': 'CheckSub', + 'ua': self.username, + 'ap': self.password, + 'fs': size, + 'fh': hash, + 'fn': os.path.basename(name), + 'n24pref': 1 + } + + response = self.session.post(self.api_url, data=params, timeout=10) + response.raise_for_status() + + response_content = response.content.split(b'||', 1) + n24_data = response_content[0].decode() + + if n24_data[:2] != 'OK': + if n24_data[:11] == 'login error': + raise AuthenticationError('Login failed') + logger.error('Unknown response: %s', response.content) + return None + + n24_status = n24_data[:4] + if n24_status == 'OK-0': + logger.info('No subtitles found') + return None + + subtitle_info = dict(p.split(':', 1) for p in n24_data.split('|')[1:]) + logger.debug('Subtitle info: %s', subtitle_info) + + if n24_status == 'OK-1': + logger.info('No subtitles found but got video info') + return None + elif n24_status == 'OK-2': + logger.info('Found subtitles') + elif n24_status == 'OK-3': + logger.info('Found subtitles but not from Napisy24 database') + return None + + subtitle_content = response_content[1] + + subtitle = Napisy24Subtitle(language, hash, 'tt%s' % subtitle_info['imdb'].zfill(7), subtitle_info['napisId']) + with ZipFile(BytesIO(subtitle_content)) as zf: + subtitle.content = fix_line_ending(zf.open(zf.namelist()[0]).read()) + + return subtitle + + def list_subtitles(self, video, languages): + subtitles = [self.query(l, video.size, video.name, video.hashes['napisy24']) for l in languages] + return [s for s in subtitles if s is not None] + + def download_subtitle(self, subtitle): + # there is no download step, content is already filled from listing subtitles + pass diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py index b00f182a7..ad3bf46c7 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitles.py @@ -1,22 +1,27 @@ # coding=utf-8 - +import base64 import logging import os import traceback +import zlib +import time +import requests from babelfish import language_converters from dogpile.cache.api import NO_VALUE from subliminal.exceptions import ConfigurationError, ServiceUnavailable from subliminal.providers.opensubtitles import OpenSubtitlesProvider as _OpenSubtitlesProvider,\ - OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, ServerProxy, Unauthorized, NoSession, \ + OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, Movie, ServerProxy, Unauthorized, NoSession, \ DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError from mixins import ProviderRetryMixin +from subliminal.subtitle import fix_line_ending from subliminal_patch.http import SubZeroRequestsTransport +from subliminal_patch.utils import sanitize from subliminal.cache import region from subliminal_patch.score import framerate_equal from subzero.language import Language -from ..exceptions import TooManyRequests +from ..exceptions import TooManyRequests, APIThrottled logger = logging.getLogger(__name__) @@ -41,6 +46,19 @@ def __init__(self, language, hearing_impaired, page_link, subtitle_id, matched_b def get_matches(self, video, hearing_impaired=False): matches = super(OpenSubtitlesSubtitle, self).get_matches(video) + # episode + if isinstance(video, Episode) and self.movie_kind == 'episode': + # series + if video.series and (sanitize(self.series_name) in ( + sanitize(name) for name in [video.series] + video.alternative_series)): + matches.add('series') + # movie + elif isinstance(video, Movie) and self.movie_kind == 'movie': + # title + if video.title and (sanitize(self.movie_name) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + sub_fps = None try: sub_fps = float(self.fps) @@ -70,6 +88,7 @@ def get_matches(self, video, hearing_impaired=False): class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider): only_foreign = False + also_foreign = False subtitle_class = OpenSubtitlesSubtitle hash_verifiable = True hearing_impaired_verifiable = True @@ -81,18 +100,19 @@ class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider): default_url = "//api.opensubtitles.org/xml-rpc" vip_url = "//vip-api.opensubtitles.org/xml-rpc" - languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes}# | { - #Language.fromietf("sr-latn"), Language.fromietf("sr-cyrl")} + languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes} + languages.update(set(Language.rebuild(l, forced=True) for l in languages)) - def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, skip_wrong_fps=True, - is_vip=False, use_ssl=True, timeout=15): - if any((username, password)) and not all((username, password)): + def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, also_foreign=False, + skip_wrong_fps=True, is_vip=False, use_ssl=True, timeout=15): + if not all((username, password)): raise ConfigurationError('Username and password must be specified') self.username = username or '' self.password = password or '' self.use_tag_search = use_tag_search self.only_foreign = only_foreign + self.also_foreign = also_foreign self.skip_wrong_fps = skip_wrong_fps self.token = None self.is_vip = is_vip @@ -125,8 +145,8 @@ def log_in(self, server_url=None): response = self.retry( lambda: checked( - self.server.LogIn(self.username, self.password, 'eng', - os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")) + lambda: self.server.LogIn(self.username, self.password, 'eng', + os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")) ) ) @@ -134,6 +154,7 @@ def log_in(self, server_url=None): logger.debug('Logged in with token %r', self.token[:10]+"X"*(len(self.token)-10)) region.set("os_token", self.token) + time.sleep(1) def use_token_or_login(self, func): if not self.token: @@ -142,6 +163,7 @@ def use_token_or_login(self, func): try: return func() except Unauthorized: + logger.debug("Token not valid, logging in again") self.log_in() return func() @@ -154,15 +176,16 @@ def initialize(self): logger.info('Logging in') - token = region.get("os_token", expiration_time=3600) + token = region.get("os_token") if token is not NO_VALUE: try: - logger.debug('Trying previous token') - checked(self.server.NoOperation(token)) + logger.debug('Trying previous token: %r', token[:10]+"X"*(len(token)-10)) + checked(lambda: self.server.NoOperation(token)) self.token = token - logger.debug("Using previous login token: %s", self.token) + logger.debug("Using previous login token: %r", token[:10]+"X"*(len(token)-10)) return - except: + except (NoSession, Unauthorized): + logger.debug('Token not valid.') pass try: @@ -176,20 +199,11 @@ def initialize(self): return logger.error("Login failed, please check your credentials") + raise def terminate(self): - try: - checked(self.server.LogOut(self.token)) - except: - logger.error("Logout failed: %s", traceback.format_exc()) - - try: - self.server.close() - except: - logger.error("Logout failed (server close): %s", traceback.format_exc()) - self.server = None - self.token = None + #self.token = None def list_subtitles(self, video, languages): """ @@ -202,26 +216,27 @@ def list_subtitles(self, video, languages): season = episode = None if isinstance(video, Episode): - query = video.series + query = [video.series] + video.alternative_series season = video.season episode = episode = min(video.episode) if isinstance(video.episode, list) else video.episode if video.is_special: season = None episode = None - query = u"%s %s" % (video.series, video.title) + query = [u"%s %s" % (series, video.title) for series in [video.series] + video.alternative_series] logger.info("%s: Searching for special: %r", self.__class__, query) # elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id: # query = video.name.split(os.sep)[-1] else: - query = video.title + query = [video.title] + video.alternative_titles return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id, query=query, season=season, episode=episode, tag=video.original_name, - use_tag_search=self.use_tag_search, only_foreign=self.only_foreign) + use_tag_search=self.use_tag_search, only_foreign=self.only_foreign, + also_foreign=self.also_foreign) def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None, tag=None, - use_tag_search=False, only_foreign=False): + use_tag_search=False, only_foreign=False, also_foreign=False): # fill the search criteria criteria = [] if hash and size: @@ -234,9 +249,11 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso else: criteria.append({'imdbid': imdb_id[2:]}) if query and season and episode: - criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode}) + for q in query: + criteria.append({'query': q.replace('\'', ''), 'season': season, 'episode': episode}) elif query: - criteria.append({'query': query.replace('\'', '')}) + for q in query: + criteria.append({'query': q.replace('\'', '')}) if not criteria: raise ValueError('Not enough information') @@ -247,7 +264,7 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso # query the server logger.info('Searching subtitles %r', criteria) response = self.use_token_or_login( - lambda: self.retry(lambda: checked(self.server.SearchSubtitles(self.token, criteria))) + lambda: self.retry(lambda: checked(lambda: self.server.SearchSubtitles(self.token, criteria))) ) subtitles = [] @@ -289,7 +306,14 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso continue # foreign/forced not wanted - if not only_foreign and foreign_parts_only: + elif not only_foreign and not also_foreign and foreign_parts_only: + continue + + # set subtitle language to forced if it's foreign_parts_only + elif (also_foreign or only_foreign) and foreign_parts_only: + language = Language.rebuild(language, forced=True) + + if language not in languages: continue query_parameters = _subtitle_item.get("QueryParameters") @@ -305,18 +329,41 @@ def query(self, languages, hash=None, size=None, imdb_id=None, query=None, seaso return subtitles def download_subtitle(self, subtitle): - return self.use_token_or_login(lambda: super(OpenSubtitlesProvider, self).download_subtitle(subtitle)) + logger.info('Downloading subtitle %r', subtitle) + response = self.use_token_or_login( + lambda: checked( + lambda: self.server.DownloadSubtitles(self.token, [str(subtitle.subtitle_id)]) + ) + ) + subtitle.content = fix_line_ending(zlib.decompress(base64.b64decode(response['data'][0]['data']), 47)) -def checked(response): - """Check a response status before returning it. +def checked(fn, raise_api_limit=False): + """Run :fn: and check the response status before returning it. - :param response: a response from a XMLRPC call to OpenSubtitles. + :param fn: the function to make an XMLRPC call to OpenSubtitles. :return: the response. :raise: :class:`OpenSubtitlesError` """ - status_code = int(response['status'][:3]) + response = None + try: + try: + response = fn() + except APIThrottled: + if not raise_api_limit: + logger.info("API request limit hit, waiting and trying again once.") + time.sleep(12) + return checked(fn, raise_api_limit=True) + raise + + except requests.RequestException as e: + status_code = e.response.status_code + else: + status_code = int(response['status'][:3]) + except: + status_code = None + if status_code == 401: raise Unauthorized if status_code == 406: @@ -330,10 +377,15 @@ def checked(response): if status_code == 415: raise DisabledUserAgent if status_code == 429: - raise TooManyRequests + if not raise_api_limit: + raise TooManyRequests + else: + raise APIThrottled if status_code == 503: - raise ServiceUnavailable + raise ServiceUnavailable(str(status_code)) if status_code != 200: - raise OpenSubtitlesError(response['status']) + if response and "status" in response: + raise OpenSubtitlesError(response['status']) + raise ServiceUnavailable("Unknown Error, empty response: %s: %r" % (status_code, response)) - return response \ No newline at end of file + return response diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py new file mode 100644 index 000000000..e25870267 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/opensubtitlescom.py @@ -0,0 +1,579 @@ +# -*- coding: utf-8 -*- +import logging +import os +import time +import datetime +import json +import types + +from requests import Session, ConnectionError, Timeout, ReadTimeout, RequestException +from simplejson import JSONDecodeError +from subzero.language import Language + +from babelfish import language_converters +from subliminal import Episode, Movie +from subliminal.score import get_equivalent_release_groups +from subliminal.utils import sanitize_release_group, sanitize +from subliminal_patch.exceptions import TooManyRequests, APIThrottled +from subliminal.exceptions import DownloadLimitExceeded, AuthenticationError, ConfigurationError, ServiceUnavailable, \ + ProviderError +from .mixins import ProviderRetryMixin +from subliminal_patch.subtitle import Subtitle +from subliminal.subtitle import fix_line_ending, SUBTITLE_EXTENSIONS +from subliminal_patch.providers import Provider +from subliminal_patch.subtitle import guess_matches +from subliminal_patch.utils import fix_inconsistent_naming +from subliminal.cache import region +from dogpile.cache.api import NO_VALUE +from guessit import guessit + +logger = logging.getLogger(__name__) + +SHOW_EXPIRATION_TIME = datetime.timedelta(weeks=1).total_seconds() +TOKEN_EXPIRATION_TIME = datetime.timedelta(hours=12).total_seconds() + +retry_amount = 3 + + +def fix_tv_naming(title): + """Fix TV show titles with inconsistent naming using dictionary, but do not sanitize them. + + :param str title: original title. + :return: new title. + :rtype: str + + """ + return fix_inconsistent_naming(title, {"Superman & Lois": "Superman and Lois", + }, True) + + +def fix_movie_naming(title): + return fix_inconsistent_naming(title, { + }, True) + + +custom_languages = { + 'pt': 'pt-PT', + 'zh': 'zh-CN', +} + + +def to_opensubtitlescom(lang): + if lang in custom_languages.keys(): + return custom_languages[lang] + else: + return lang + + +def from_opensubtitlescom(lang): + from_custom_languages = {v: k for k, v in custom_languages.items()} + if lang in from_custom_languages.keys(): + return from_custom_languages[lang] + else: + return lang + + +class OpenSubtitlesComSubtitle(Subtitle): + provider_name = 'opensubtitlescom' + hash_verifiable = True + hearing_impaired_verifiable = True + + def __init__(self, language, forced, hearing_impaired, page_link, file_id, releases, uploader, title, year, + hash_matched, file_hash=None, season=None, episode=None, imdb_match=False): + super(OpenSubtitlesComSubtitle, self).__init__(language, hearing_impaired, page_link) + language = Language.rebuild(language, hi=hearing_impaired, forced=forced) + + self.title = title + self.year = year + self.season = season + self.episode = episode + self.releases = releases + self.release_info = releases + self.language = language + self.hearing_impaired = hearing_impaired + self.forced = forced + self.file_id = file_id + self.page_link = page_link + self.download_link = None + self.uploader = uploader + self.matches = None + self.hash = file_hash + self.encoding = 'utf-8' + self.hash_matched = hash_matched + self.imdb_match = imdb_match + + @property + def id(self): + return self.file_id + + def get_matches(self, video): + matches = set() + type_ = "movie" if isinstance(video, Movie) else "episode" + + # handle movies and series separately + if type_ == "episode": + # series + matches.add('series') + # season + if video.season == self.season: + matches.add('season') + # episode + if video.episode == self.episode: + matches.add('episode') + # imdb + if self.imdb_match: + matches.add('series_imdb_id') + else: + # title + matches.add('title') + # imdb + if self.imdb_match: + matches.add('imdb_id') + + # rest is same for both groups + + # year + if video.year == self.year: + matches.add('year') + + # release_group + if (video.release_group and self.releases and + any(r in sanitize_release_group(self.releases) + for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))): + matches.add('release_group') + + if self.hash_matched: + matches.add('hash') + + # other properties + matches |= guess_matches(video, guessit(self.releases, {"type": type_})) + + self.matches = matches + + return matches + + +class OpenSubtitlesComProvider(ProviderRetryMixin, Provider): + """OpenSubtitlesCom Provider""" + server_url = 'https://api.opensubtitles.com/api/v1/' + + languages = {Language.fromopensubtitles(lang) for lang in language_converters['szopensubtitles'].codes} + languages.update(set(Language.rebuild(lang, forced=True) for lang in languages)) + languages.update(set(Language.rebuild(l, hi=True) for l in languages)) + + video_types = (Episode, Movie) + + def __init__(self, username=None, password=None, use_hash=True, include_ai_translated=False, api_key=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + if not api_key: + raise ConfigurationError('Api_key must be specified') + + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + self.session = Session() + self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2"), + 'Api-Key': api_key, + 'Content-Type': 'application/json'} + self.token = None + self.username = username + self.password = password + self.video = None + self.use_hash = use_hash + self.include_ai_translated = include_ai_translated + self._started = None + + def initialize(self): + self._started = time.time() + + if region.get("oscom_token", expiration_time=TOKEN_EXPIRATION_TIME) is NO_VALUE: + logger.debug("No cached token, we'll try to login again.") + self.login() + else: + self.token = region.get("oscom_token", expiration_time=TOKEN_EXPIRATION_TIME) + + def terminate(self): + self.session.close() + + def ping(self): + return self._started and (time.time() - self._started) < TOKEN_EXPIRATION_TIME + + def login(self, is_retry=False): + r = self.checked( + lambda: self.session.post(self.server_url + 'login', + json={"username": self.username, "password": self.password}, + allow_redirects=False, + timeout=30), + is_retry=is_retry) + + try: + self.token = r.json()['token'] + except (ValueError, JSONDecodeError): + log_request_response(r) + raise ProviderError("Cannot get token from provider login response") + else: + log_request_response(r, non_standard=False) + region.set("oscom_token", self.token) + + @staticmethod + def sanitize_external_ids(external_id): + if isinstance(external_id, types.StringTypes): + external_id = external_id.lower().lstrip('tt').lstrip('0') + sanitized_id = external_id[:-1].lstrip('0') + external_id[-1] + return int(sanitized_id) + + @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) + def search_titles(self, title): + title_id = None + + parameters = {'query': title.lower()} + logging.debug('Searching using this title: %s' % title) + + results = self.retry( + lambda: self.checked( + lambda: self.session.get(self.server_url + 'features', params=parameters, timeout=30), + validate_json=True, + json_key_name='data' + ), + amount=retry_amount + ) + + # deserialize results + results_dict = results.json()['data'] + + # loop over results + for result in results_dict: + if 'title' in result['attributes']: + if isinstance(self.video, Episode): + if fix_tv_naming(title).lower() == result['attributes']['title'].lower() and \ + (not self.video.year or self.video.year == int(result['attributes']['year'])): + title_id = result['id'] + break + else: + if fix_movie_naming(title).lower() == result['attributes']['title'].lower() and \ + (not self.video.year or self.video.year == int(result['attributes']['year'])): + title_id = result['id'] + break + else: + continue + + if title_id: + logging.debug('Found this title ID: %s' % title_id) + return self.sanitize_external_ids(title_id) + + if not title_id: + logger.debug('No match found for %s' % title) + + def query(self, languages, video): + self.video = video + if self.use_hash: + file_hash = self.video.hashes.get('opensubtitlescom') + logging.debug('Searching using this hash: %s' % hash) + else: + file_hash = None + + if isinstance(self.video, Episode): + title = self.video.series + else: + title = self.video.title + + imdb_id = None + if isinstance(self.video, Episode) and self.video.series_imdb_id: + imdb_id = self.sanitize_external_ids(self.video.series_imdb_id) + elif isinstance(self.video, Movie) and self.video.imdb_id: + imdb_id = self.sanitize_external_ids(self.video.imdb_id) + + title_id = None + if not imdb_id: + title_id = self.search_titles(title) + if not title_id: + return [] + + # be sure to remove duplicates using list(set()) + langs_list = sorted(list(set([to_opensubtitlescom(lang.basename).lower() for lang in languages]))) + + langs = ','.join(langs_list) + logging.debug('Searching for those languages: %s' % langs) + + # query the server + if isinstance(self.video, Episode): + res = self.retry( + lambda: self.checked( + lambda: self.session.get(self.server_url + 'subtitles', + params=(('ai_translated', 'exclude' if not self.include_ai_translated + else 'include'), + ('episode_number', self.video.episode), + ('imdb_id', imdb_id if not title_id else None), + ('languages', langs), + ('moviehash', file_hash), + ('parent_feature_id', title_id if title_id else None), + ('season_number', self.video.season)), + timeout=30), + validate_json=True, + json_key_name='data' + ), + amount=retry_amount + ) + else: + res = self.retry( + lambda: self.checked( + lambda: self.session.get(self.server_url + 'subtitles', + params=(('ai_translated', 'exclude' if not self.include_ai_translated + else 'include'), + ('id', title_id if title_id else None), + ('imdb_id', imdb_id if not title_id else None), + ('languages', langs), + ('moviehash', file_hash)), + timeout=30), + validate_json=True, + json_key_name='data' + ), + amount=retry_amount + ) + + subtitles = [] + + result = res.json() + + # filter out forced subtitles or not depending on the required languages + if all([lang.forced for lang in languages]): # only forced + result['data'] = [x for x in result['data'] if x['attributes']['foreign_parts_only']] + elif any([lang.forced for lang in languages]): # also forced + pass + else: # not forced + result['data'] = [x for x in result['data'] if not x['attributes']['foreign_parts_only']] + + logging.debug("Query returned %s subtitles" % len(result['data'])) + + if len(result['data']): + for item in result['data']: + # ignore AI translated subtitles + if 'ai_translated' in item['attributes'] and item['attributes']['ai_translated']: + logging.debug("Skipping AI translated subtitles") + continue + + # ignore machine translated subtitles + if 'machine_translated' in item['attributes'] and item['attributes']['machine_translated']: + logging.debug("Skipping machine translated subtitles") + continue + + if 'season_number' in item['attributes']['feature_details']: + season_number = item['attributes']['feature_details']['season_number'] + else: + season_number = None + + if 'episode_number' in item['attributes']['feature_details']: + episode_number = item['attributes']['feature_details']['episode_number'] + else: + episode_number = None + + if 'moviehash_match' in item['attributes']: + moviehash_match = item['attributes']['moviehash_match'] + else: + moviehash_match = False + + try: + year = int(item['attributes']['feature_details']['year']) + except TypeError: + year = item['attributes']['feature_details']['year'] + + if len(item['attributes']['files']): + subtitle = OpenSubtitlesComSubtitle( + language=Language.fromietf(from_opensubtitlescom(item['attributes']['language'])), + forced=item['attributes']['foreign_parts_only'], + hearing_impaired=item['attributes']['hearing_impaired'], + page_link=item['attributes']['url'], + file_id=item['attributes']['files'][0]['file_id'], + releases=item['attributes']['release'], + uploader=item['attributes']['uploader']['name'], + title=item['attributes']['feature_details']['movie_name'], + year=year, + season=season_number, + episode=episode_number, + hash_matched=moviehash_match, + imdb_match=True if imdb_id else False + ) + subtitle.get_matches(self.video) + subtitles.append(subtitle) + + return subtitles + + def list_subtitles(self, video, languages): + return self.query(languages, video) + + def download_subtitle(self, subtitle): + logger.info('Downloading subtitle %r', subtitle) + + headers = {'Accept': 'application/json', 'Content-Type': 'application/json', + 'Authorization': 'Bearer ' + self.token} + res = self.retry( + lambda: self.checked( + lambda: self.session.post(self.server_url + 'download', + json={'file_id': subtitle.file_id, 'sub_format': 'srt'}, + headers=headers, + timeout=30), + validate_json=True, + json_key_name='link' + ), + amount=retry_amount + ) + + download_data = res.json() + subtitle.download_link = download_data['link'] + + r = self.retry( + lambda: self.checked( + lambda: self.session.get(subtitle.download_link, timeout=30), + validate_content=True + ), + amount=retry_amount + ) + + if not r: + logger.debug('Could not download subtitle from %s' % subtitle.download_link) + subtitle.content = None + return + else: + subtitle_content = r.content + subtitle.content = fix_line_ending(subtitle_content) + + @staticmethod + def reset_token(): + logging.debug('Authentication failed: clearing cache and attempting to login.') + region.delete("oscom_token") + return + + def checked(self, fn, raise_api_limit=False, validate_json=False, json_key_name=None, validate_content=False, + is_retry=False): + """Run :fn: and check the response status before returning it. + + :param fn: the function to make an API call to OpenSubtitles.com. + :param raise_api_limit: if True we wait a little bit longer before running the call again. + :param validate_json: test if response is valid json. + :param json_key_name: test if returned json contain a specific key. + :param validate_content: test if response have a content (used with download). + :param is_retry: prevent additional retries with login endpoint. + :return: the response. + + """ + response = None + try: + try: + response = fn() + except APIThrottled: + if not raise_api_limit: + logger.info("API request limit hit, waiting and trying again once.") + time.sleep(15) + return self.checked(fn, raise_api_limit=True) + raise + except (ConnectionError, Timeout, ReadTimeout): + raise ServiceUnavailable('Unknown Error, empty response: {}: {}'.format(response.status_code, response)) + except Exception: + logging.exception('Unhandled exception raised.') + raise ProviderError('Unhandled exception raised. Check log.') + else: + status_code = response.status_code + except Exception: + status_code = None + else: + if status_code == 400: + try: + json_response = response.json() + message = json_response['message'] + except JSONDecodeError: + raise ProviderError('Invalid JSON returned by provider') + else: + log_request_response(response) + raise ConfigurationError(message) + elif status_code == 401: + log_request_response(response) + self.reset_token() + if is_retry: + raise AuthenticationError('Login failed') + else: + time.sleep(1) + self.login(is_retry=True) + self.checked(fn, raise_api_limit=raise_api_limit, validate_json=validate_json, + json_key_name=json_key_name, validate_content=validate_content, is_retry=True) + elif status_code == 403: + log_request_response(response) + raise ProviderError("Bazarr API key seems to be in problem") + elif status_code == 406: + try: + json_response = response.json() + download_count = json_response['requests'] + remaining_download = json_response['remaining'] + quota_reset_time = json_response['reset_time'] + except JSONDecodeError: + raise ProviderError('Invalid JSON returned by provider') + else: + log_request_response(response) + raise DownloadLimitExceeded("Daily download limit reached. {} subtitles have been " + "downloaded and {} remaining subtitles can be " + "downloaded. Quota will be reset in {}.".format(download_count, remaining_download, quota_reset_time)) + elif status_code == 410: + log_request_response(response) + raise ProviderError("Download as expired") + elif status_code == 429: + log_request_response(response) + raise TooManyRequests() + elif status_code == 500: + logging.debug("Server side exception raised while downloading from opensubtitles.com website. They " + "should mitigate this soon.") + return None + elif status_code == 502: + # this one should deal with Bad Gateway issue on their side. + raise APIThrottled() + elif 500 <= status_code <= 599: + raise ProviderError(response.reason) + + if status_code != 200: + log_request_response(response) + raise ProviderError('Bad status code: %s' % response.status_code) + + if validate_json: + try: + json_test = response.json() + except JSONDecodeError: + raise ProviderError('Invalid JSON returned by provider') + else: + if json_key_name not in json_test: + raise ProviderError('Invalid JSON returned by provider: no %s key in returned json.' % json_key_name) + + if validate_content: + if not hasattr(response, 'content'): + logging.error('Download link returned no content attribute.') + return False + elif not response.content: + logging.error('This download link returned empty content: %s' % response.url) + return False + + return response + + +def log_request_response(response, non_standard=True): + redacted_request_headers = response.request.headers + if 'Authorization' in redacted_request_headers and isinstance(redacted_request_headers['Authorization'], str): + redacted_request_headers['Authorization'] = redacted_request_headers['Authorization'][:-8]+8*'x' + + redacted_request_body = json.loads(response.request.body) + if 'password' in redacted_request_body: + redacted_request_body['password'] = 'redacted' + + redacted_response_body = json.loads(response.text) + if 'token' in redacted_response_body and isinstance(redacted_response_body['token'], str): + redacted_response_body['token'] = redacted_response_body['token'][:-8] + 8 * 'x' + + if non_standard: + logging.debug("opensubtitlescom returned a non standard response. Logging request/response for debugging " + "purpose.") + else: + logging.debug("opensubtitlescom returned a standard response. Logging request/response for debugging purpose.") + logging.debug("Request URL: %s" % response.request.url) + logging.debug("Request Headers: %s" % redacted_request_headers) + logging.debug("Request Body: %s" % json.dumps(redacted_request_body)) + logging.debug("Response Status Code: %s" % {response.status_code}) + logging.debug("Response Headers: %s" % response.headers) + logging.debug("Response Body: %s" % json.dumps(redacted_response_body)) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py index 67e029b6d..16b7c2d7e 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/podnapisi.py @@ -5,7 +5,6 @@ import io from zipfile import ZipFile -from lxml.etree import XMLSyntaxError from guessit import guessit from subliminal.subtitle import guess_matches @@ -24,11 +23,28 @@ from subliminal import Movie from subliminal.providers.podnapisi import PodnapisiProvider as _PodnapisiProvider, \ PodnapisiSubtitle as _PodnapisiSubtitle +from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming from subzero.language import Language logger = logging.getLogger(__name__) +def fix_inconsistent_naming(title): + """Fix titles with inconsistent naming using dictionary and sanitize them. + + :param str title: original title. + :return: new title. + :rtype: str + + """ + d = {} + nt = title.replace("Marvels", "").replace("Marvel's", "") + if nt != title: + d[title] = nt + + return _fix_inconsistent_naming(title, d) + + class PodnapisiSubtitle(_PodnapisiSubtitle): provider_name = 'podnapisi' hearing_impaired_verifiable = True @@ -53,8 +69,8 @@ def get_matches(self, video): # episode if isinstance(video, Episode): # series - if video.series and (sanitize(self.title) in ( - sanitize(name) for name in [video.series] + video.alternative_series)): + if video.series and (fix_inconsistent_naming(self.title) in ( + fix_inconsistent_naming(name) for name in [video.series] + video.alternative_series)): matches.add('series') # year if video.original_series and self.year is None or video.year and video.year == self.year: @@ -89,14 +105,17 @@ def get_matches(self, video): class PodnapisiProvider(_PodnapisiProvider, ProviderSubtitleArchiveMixin): languages = ({Language('por', 'BR'), Language('srp', script='Latn'), Language('srp', script='Cyrl')} | {Language.fromalpha2(l) for l in language_converters['alpha2'].codes}) + languages.update(set(Language.rebuild(l, forced=True) for l in languages)) server_url = 'https://podnapisi.net/subtitles/' only_foreign = False + also_foreign = False subtitle_class = PodnapisiSubtitle hearing_impaired_verifiable = True - def __init__(self, only_foreign=False): + def __init__(self, only_foreign=False, also_foreign=False): self.only_foreign = only_foreign + self.also_foreign = also_foreign if only_foreign: logger.info("Only searching for foreign/forced subtitles") @@ -110,7 +129,7 @@ def list_subtitles(self, video, languages): season = episode = None if isinstance(video, Episode): - titles = [video.series] + video.alternative_series + titles = [fix_inconsistent_naming(title) for title in [video.series] + video.alternative_series] season = video.season episode = video.episode else: @@ -119,13 +138,14 @@ def list_subtitles(self, video, languages): for title in titles: subtitles = [s for l in languages for s in self.query(l, title, video, season=season, episode=episode, year=video.year, - only_foreign=self.only_foreign)] + only_foreign=self.only_foreign, also_foreign=self.also_foreign)] if subtitles: return subtitles return [] - def query(self, language, keyword, video, season=None, episode=None, year=None, only_foreign=False): + def query(self, language, keyword, video, season=None, episode=None, year=None, only_foreign=False, + also_foreign=False): search_language = str(language).lower() # sr-Cyrl specialcase @@ -154,7 +174,7 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, try: content = self.session.get(self.server_url + 'search/old', params=params, timeout=10).content xml = etree.fromstring(content) - except XMLSyntaxError: + except etree.ParseError: logger.error("Wrong data returned: %r", content) break @@ -171,13 +191,19 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, if pid in pids: continue - language = Language.fromietf(subtitle_xml.find('language').text) + _language = Language.fromietf(subtitle_xml.find('language').text) hearing_impaired = 'n' in (subtitle_xml.find('flags').text or '') foreign = 'f' in (subtitle_xml.find('flags').text or '') if only_foreign and not foreign: continue - if not only_foreign and foreign: + elif not only_foreign and not also_foreign and foreign: + continue + + elif also_foreign and foreign: + _language = Language.rebuild(_language, forced=True) + + if language != _language: continue page_link = subtitle_xml.find('url').text @@ -191,12 +217,12 @@ def query(self, language, keyword, video, season=None, episode=None, year=None, r_year = int(subtitle_xml.find('year').text) if is_episode: - subtitle = self.subtitle_class(language, hearing_impaired, page_link, pid, releases, title, + subtitle = self.subtitle_class(_language, hearing_impaired, page_link, pid, releases, title, season=r_season, episode=r_episode, year=r_year, asked_for_release_group=video.release_group, asked_for_episode=episode) else: - subtitle = self.subtitle_class(language, hearing_impaired, page_link, pid, releases, title, + subtitle = self.subtitle_class(_language, hearing_impaired, page_link, pid, releases, title, year=r_year, asked_for_release_group=video.release_group) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py index 4dd363959..7f6e3911b 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscene.py @@ -4,22 +4,33 @@ import logging import os import time +import traceback -from random import randint -from zipfile import ZipFile +import requests + +import inflect +import re +import json +import HTMLParser +import urlparse +from zipfile import ZipFile from babelfish import language_converters from guessit import guessit -from requests import Session +from dogpile.cache.api import NO_VALUE from subliminal import Episode, ProviderError +from subliminal.exceptions import ConfigurationError, ServiceUnavailable from subliminal.utils import sanitize_release_group +from subliminal.cache import region +from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle, guess_matches from subliminal_patch.converters.subscene import language_ids, supported_languages -from subscene_api.subscene import search, Subtitle as APISubtitle +from subscene_api.subscene import search, Subtitle as APISubtitle, SITE_DOMAIN from subzero.language import Language +p = inflect.engine() language_converters.register('subscene = subliminal_patch.converters.subscene:SubsceneConverter') logger = logging.getLogger(__name__) @@ -95,7 +106,7 @@ def get_download_link(self, session): def get_video_filename(video): - return os.path.splitext(os.path.basename(video.name))[0] + return os.path.splitext(os.path.basename(video.original_name))[0] class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): @@ -105,21 +116,85 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): """ subtitle_class = SubsceneSubtitle languages = supported_languages + languages.update(set(Language.rebuild(l, forced=True) for l in languages)) + session = None skip_wrong_fps = False hearing_impaired_verifiable = True only_foreign = False + username = None + password = None + + search_throttle = 8 # seconds - search_throttle = 2 # seconds + def __init__(self, only_foreign=False, username=None, password=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') - def __init__(self, only_foreign=False): self.only_foreign = only_foreign + self.username = username + self.password = password def initialize(self): logger.info("Creating session") - self.session = Session() - from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST - self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)] + self.session = RetryingCFSession() + + prev_cookies = region.get("subscene_cookies2") + if prev_cookies != NO_VALUE: + logger.debug("Re-using old subscene cookies: %r", prev_cookies) + self.session.cookies.update(prev_cookies) + + else: + logger.debug("Logging in") + self.login() + + def login(self): + r = self.session.get("https://subscene.com/account/login") + if "Server Error" in r.content: + logger.error("Login unavailable; Maintenance?") + raise ServiceUnavailable("Login unavailable; Maintenance?") + + match = re.search(r"", r.content) + + if match: + h = HTMLParser.HTMLParser() + data = json.loads(h.unescape(match.group(1))) + login_url = urlparse.urljoin(data["siteUrl"], data["loginUrl"]) + time.sleep(1.0) + + r = self.session.post(login_url, + { + "username": self.username, + "password": self.password, + data["antiForgery"]["name"]: data["antiForgery"]["value"] + }) + pep_content = re.search(r"
" + r".+name=\"id_token\".+?value=\"(?P.+?)\".*?" + r"access_token\".+?value=\"(?P.+?)\".+?" + r"token_type.+?value=\"(?P.+?)\".+?" + r"expires_in.+?value=\"(?P.+?)\".+?" + r"scope.+?value=\"(?P.+?)\".+?" + r"state.+?value=\"(?P.+?)\".+?" + r"session_state.+?value=\"(?P.+?)\"", + r.content, re.MULTILINE | re.DOTALL) + + if pep_content: + r = self.session.post(SITE_DOMAIN, pep_content.groupdict()) + try: + r.raise_for_status() + except Exception: + raise ProviderError("Something went wrong when trying to log in: %s", traceback.format_exc()) + else: + cj = self.session.cookies.copy() + store_cks = ("scene", "idsrv", "idsrv.xsrf", "idsvr.clients", "idsvr.session", "idsvr.username") + for cn in self.session.cookies.iterkeys(): + if cn not in store_cks: + del cj[cn] + + logger.debug("Storing cookies: %r", cj) + region.set("subscene_cookies2", cj) + return + raise ProviderError("Something went wrong when trying to log in #1") def terminate(self): logger.info("Closing session") @@ -127,9 +202,26 @@ def terminate(self): def _create_filters(self, languages): self.filters = dict(HearingImpaired="2") - - self.filters["LanguageFilter"] = ",".join((str(language_ids[l.alpha3]) for l in languages - if l.alpha3 in language_ids)) + acc_filters = self.filters.copy() + if self.only_foreign: + self.filters["ForeignOnly"] = "True" + acc_filters["ForeignOnly"] = self.filters["ForeignOnly"].lower() + logger.info("Only searching for foreign/forced subtitles") + + selected_ids = [] + for l in languages: + lid = language_ids.get(l.basename, language_ids.get(l.alpha3, None)) + if lid: + selected_ids.append(str(lid)) + + acc_filters["SelectedIds"] = selected_ids + self.filters["LanguageFilter"] = ",".join(acc_filters["SelectedIds"]) + + last_filters = region.get("subscene_filters") + if last_filters != acc_filters: + region.set("subscene_filters", acc_filters) + logger.debug("Setting account filters to %r", acc_filters) + self.session.post("https://u.subscene.com/filter", acc_filters, allow_redirects=False) logger.debug("Filter created: '%s'" % self.filters) @@ -172,44 +264,84 @@ def download_subtitle(self, subtitle): def parse_results(self, video, film): subtitles = [] for s in film.subtitles: - subtitle = SubsceneSubtitle.from_api(s) + try: + subtitle = SubsceneSubtitle.from_api(s) + except NotImplementedError, e: + logger.info(e) + continue subtitle.asked_for_release_group = video.release_group if isinstance(video, Episode): subtitle.asked_for_episode = video.episode + if self.only_foreign: + subtitle.language = Language.rebuild(subtitle.language, forced=True) + subtitles.append(subtitle) logger.debug('Found subtitle %r', subtitle) return subtitles - def query(self, video): - vfn = get_video_filename(video) - logger.debug(u"Searching for: %s", vfn) - film = search(vfn, session=self.session) + def do_search(self, *args, **kwargs): + try: + return search(*args, **kwargs) + except requests.HTTPError: + region.delete("subscene_cookies2") + def query(self, video): + # vfn = get_video_filename(video) subtitles = [] - if film and film.subtitles: - subtitles = self.parse_results(video, film) + # logger.debug(u"Searching for: %s", vfn) + # film = search(vfn, session=self.session) + # + # if film and film.subtitles: + # logger.debug('Release results found: %s', len(film.subtitles)) + # subtitles = self.parse_results(video, film) + # else: + # logger.debug('No release results found') + + # time.sleep(self.search_throttle) # re-search for episodes without explicit release name if isinstance(video, Episode): - term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) - time.sleep(self.search_throttle) - logger.debug('Searching for alternative results: %s', term) - film = search(term, session=self.session) - if film and film.subtitles: - subtitles += self.parse_results(video, film) - - # packs - if video.season_fully_aired: - term = u"%s S%02i" % (video.series, video.season) - logger.debug('Searching for packs: %s', term) - time.sleep(self.search_throttle) - film = search(term, session=self.session) + titles = list(set([video.series] + video.alternative_series))[:2] + # term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) + more_than_one = len(titles) > 1 + for series in titles: + term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) + logger.debug('Searching for alternative results: %s', term) + film = self.do_search(term, session=self.session, release=False, throttle=self.search_throttle) + if film and film.subtitles: + logger.debug('Alternative results found: %s', len(film.subtitles)) + subtitles += self.parse_results(video, film) + else: + logger.debug('No alternative results found') + + # packs + # if video.season_fully_aired: + # term = u"%s S%02i" % (series, video.season) + # logger.debug('Searching for packs: %s', term) + # time.sleep(self.search_throttle) + # film = search(term, session=self.session, throttle=self.search_throttle) + # if film and film.subtitles: + # logger.debug('Pack results found: %s', len(film.subtitles)) + # subtitles += self.parse_results(video, film) + # else: + # logger.debug('No pack results found') + # else: + # logger.debug("Not searching for packs, because the season hasn't fully aired") + if more_than_one: + time.sleep(self.search_throttle) + else: + titles = list(set([video.title] + video.alternative_titles))[:2] + more_than_one = len(titles) > 1 + for title in titles: + logger.debug('Searching for movie results: %r', title) + film = self.do_search(title, year=video.year, session=self.session, limit_to=None, release=False, + throttle=self.search_throttle) if film and film.subtitles: subtitles += self.parse_results(video, film) - else: - logger.debug("Not searching for packs, because the season hasn't fully aired") + if more_than_one: + time.sleep(self.search_throttle) logger.info("%s subtitles found" % len(subtitles)) return subtitles diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py b/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py index a8b9844b4..5626c9935 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/subscenter.py @@ -2,6 +2,7 @@ from subliminal.providers.subscenter import SubsCenterProvider as _SubsCenterProvider, \ SubsCenterSubtitle as _SubsCenterSubtitle +from subzero.language import Language class SubsCenterSubtitle(_SubsCenterSubtitle): @@ -21,6 +22,7 @@ def __repr__(self): class SubsCenterProvider(_SubsCenterProvider): + languages = {Language.fromalpha2(l) for l in ['he']} subtitle_class = SubsCenterSubtitle hearing_impaired_verifiable = True server_url = 'http://www.subscenter.info/he/' diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py new file mode 100644 index 000000000..52c2d6be4 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/supersubtitles.py @@ -0,0 +1,389 @@ +# coding=utf-8 +import io +import six +import os +from pkg_resources import require +import logging +import re +import os +import time + +from babelfish import language_converters +from subzero.language import Language +from requests import Session + +from subliminal.subtitle import fix_line_ending +from subliminal_patch.providers import Provider +from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin +from subliminal.providers import ParserBeautifulSoup +from subliminal_patch.exceptions import ProviderError +from subliminal.score import get_equivalent_release_groups +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.utils import sanitize, sanitize_release_group +from subliminal.video import Episode, Movie +from zipfile import ZipFile, is_zipfile +from rarfile import RarFile, is_rarfile +from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming +from guessit import guessit + + +logger = logging.getLogger(__name__) + +language_converters.register('supersubtitles = subliminal_patch.converters.supersubtitles:SuperSubtitlesConverter') + + +class SuperSubtitlesSubtitle(Subtitle): + """SuperSubtitles Subtitle.""" + provider_name = 'supersubtitles' + + def __str__(self): + subtit = "Subtitle id: " + str(self.subtitle_id) \ + + " Series: " + self.series \ + + " Season: " + str(self.season) \ + + " Episode: " + str(self.episode) \ + + " Version: " + str(self.version) \ + + " Releases: " + str(self.releases) \ + + " DownloadLink: " + str(self.page_link) \ + + " Matches: " + str(self.matches) + if self.year: + subtit = subtit + " Year: " + str(self.year) + return subtit.encode('utf-8') + + def __init__(self, language, page_link, subtitle_id, series, season, episode, version, + releases, year, imdb_id, asked_for_episode=None, asked_for_release_group=None): + super(SuperSubtitlesSubtitle, self).__init__(language, page_link=page_link) + self.subtitle_id = subtitle_id + self.series = series + self.season = season + self.episode = episode + self.version = version + self.releases = releases + self.year = year + if year: + self.year = int(year) + + self.release_info = u", ".join(releases) + self.page_link = page_link + self.asked_for_release_group = asked_for_release_group + self.asked_for_episode = asked_for_episode + self.imdb_id = imdb_id + self.is_pack = True + + def numeric_id(self): + return self.subtitle_id + + def __repr__(self): + ep_addon = (" S%02dE%02d" % (self.season, self.episode)) if self.episode else "" + return '<%s %r [%s]>' % ( + self.__class__.__name__, u"%s%s%s [%s]" % (self.series, " (%s)" % self.year if self.year else "", ep_addon, + self.release_info), self.language) + + @property + def id(self): + return str(self.subtitle_id) + + def get_matches(self, video): + matches = guess_matches(video, guessit(self.release_info.encode("utf-8"))) + + # episode + if isinstance(video, Episode): + # series + if video.series and sanitize(self.series) == sanitize(video.series): + matches.add('series') + # season + if video.season and self.season == video.season: + matches.add('season') + # episode + if video.episode and self.episode == video.episode: + matches.add('episode') + # imdb_id + if video.series_imdb_id and self.imdb_id and str(self.imdb_id) == str(video.series_imdb_id): + matches.add('series_imdb_id') + matches.add('series') + matches.add('year') + # year + if ('series' in matches and video.original_series and self.year is None or + video.year and video.year == self.year): + matches.add('year') + # movie + elif isinstance(video, Movie): + # title + if video.title and (sanitize(self.series) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + # imdb_id + if video.imdb_id and self.imdb_id == video.imdb_id: + matches.add('imdb_id') + matches.add('title') + matches.add('year') + # year + if video.year and self.year == video.year: + matches.add('year') + + # release_group + if (video.release_group and self.version and + any(r in sanitize_release_group(self.version) + for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))): + matches.add('release_group') + # resolution + if video.resolution and self.version and video.resolution in self.version.lower(): + matches.add('resolution') + # format + if video.format and self.version and video.format.lower() in self.version.lower(): + matches.add('format') + + self.matches = matches + return matches + + +class SuperSubtitlesProvider(Provider, ProviderSubtitleArchiveMixin): + """SuperSubtitles Provider.""" + languages = {Language('hun', 'HU')} | {Language(l) for l in [ + 'hun', 'eng' + ]} + video_types = (Episode, Movie) + # https://www.feliratok.info/?search=&soriSorszam=&nyelv=&sorozatnev=The+Flash+%282014%29&sid=3212&complexsearch=true&knyelv=0&evad=4&epizod1=1&cimke=0&minoseg=0&rlsr=0&tab=all + server_url = 'https://www.feliratok.eu/' + subtitle_class = SuperSubtitlesSubtitle + hearing_impaired_verifiable = False + multi_result_throttle = 2 # seconds + + def initialize(self): + self.session = Session() + self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")} + + def terminate(self): + self.session.close() + + def get_language(self, text): + if text == 'Magyar': + return Language.fromsupersubtitles('hu') + if text == 'Angol': + return Language.fromsupersubtitles('en') + return None + + def find_imdb_id(self, sub_id): + """ + + """ + + url = self.server_url + "index.php?tipus=adatlap&azon=a_" + sub_id + # url = https://www.feliratok.info/index.php?tipus=adatlap&azon=a_1518600916 + logger.info('Get IMDB id from URL %s', url) + r = self.session.get(url, timeout=10).content + + soup = ParserBeautifulSoup(r, ['lxml']) + links = soup.find_all("a") + + for value in links: + if "imdb.com" in str(value): + # iMDB + imdb_id = re.findall(r'(?<=www\.imdb\.com/title/).*(?=/")', str(value))[0] + return imdb_id + + return None + + def find_id(self, series, year, original_title): + """ + We need to find the id of the series at the following url: + https://www.feliratok.info/index.php?term=SERIESNAME&nyelv=0&action=autoname + Where SERIESNAME is a searchable string. + The result will be something like this: + [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"} + ,{"name":"No Tomorrow (2016)","ID":"4179"}] + + """ + + # Search for exact name + url = self.server_url + "index.php?term=" + series + "&nyelv=0&action=autoname" + # url = self.server_url + "index.php?term=" + "fla"+ "&nyelv=0&action=autoname" + logger.info('Get series id from URL %s', url) + r = self.session.get(url, timeout=10) + + # r is something like this: + # [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"} + # ,{"name":"No Tomorrow (2016)","ID":"4179"}] + + results = r.json() + + # check all of the results: + for result in results: + try: + # "name":"Miles from Tomorrowland (2015)","ID":"3789" + result_year = re.findall(r"(?<=\()\d\d\d\d(?=\))", result['name'])[0] + except IndexError: + result_year = "" + + try: + # "name":"Miles from Tomorrowland (2015)","ID":"3789" + result_title = re.findall(r".*(?=\(\d\d\d\d\))", result['name'])[0] + result_id = result['ID'] + except IndexError: + continue + + result_title = result_title.strip().replace("�", "").replace(" ", ".") + + guessable = result_title.strip() + ".s01e01." + result_year + guess = guessit(guessable, {'type': "episode"}) + + if sanitize(original_title) == sanitize(guess['title']) and year and guess['year'] and year == guess['year']: + # Return the founded id + return result_id + + return None + + def query(self, series, video=None): + year = video.year + subtitle = None + if isinstance(video, Episode): + series = video.series + season = video.season + episode = video.episode + #seriesa = series.replace(' ', '+') + + # Get ID of series with original name + series_id = self.find_id(series, year, series) + if not series_id: + # If not founded try without ' char + modified_series = series.replace(' ', '+').replace('\'', '') + series_id = self.find_id(modified_series, year, series) + if not series_id and modified_series: + # If still not founded try with the longest word is series title + modified_series = modified_series.split('+') + modified_series = max(modified_series, key=len) + series_id = self.find_id(modified_series, year, series) + + if not series_id: + return None + + # https://www.feliratok.info/index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=2075&complexsearch=true&knyelv=0&evad=6&epizod1=16&cimke=0&minoseg=0&rlsr=0&tab=all + url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \ + str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str(season) + "&epizod1=" + str( + episode) + "&cimke=0&minoseg=0&rlsr=0&tab=all" + subtitle = self.process_subs(series, video, url) + + if not subtitle: + # No Subtitle found. Maybe already archived to season pack + url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \ + str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str( + season) + "&epizod1=&evadpakk=on&cimke=0&minoseg=0&rlsr=0&tab=all" + subtitle = self.process_subs(series, video, url) + + if isinstance(video, Movie): + title = series.replace(" ", "+") + + # https://www.feliratok.info/index.php?search=The+Hitman%27s+BodyGuard&soriSorszam=&nyelv=&tab=film + url = self.server_url + "index.php?search=" + title + "&soriSorszam=&nyelv=&tab=film" + subtitle = self.process_subs(series, video, url) + + return subtitle + + def process_subs(self, series, video, url): + + subtitles = [] + + logger.info('URL for subtitles %s', url) + r = self.session.get(url, timeout=10).content + + soup = ParserBeautifulSoup(r, ['lxml']) + tables = soup.find_all("table") + tables = tables[0].find_all("tr") + i = 0 + series_imdb_id = None + for table in tables: + if "vilagit" in str(table) and i > 1: + try: + sub_hun_name = table.findAll("div", {"class": "magyar"})[0] + if isinstance(video, Episode): + if "vad)" not in str(sub_hun_name): + #
A pletykaf�szek (3. �vad)
+ sub_hun_name = re.findall(r'(?<=
).*(?= -)', str(sub_hun_name))[0] + else: + #
A holnap legend�i - 3x11
+ sub_hun_name = re.findall(r'(?<=
).*(?= \()', str(sub_hun_name))[0] + if isinstance(video, Movie): + sub_hun_name = re.findall(r'(?<=
).*(?=Gossip Girl (Season 3) (DVDRip-REWARD)
] + sub_english_name = re.findall(r'(?<=
).*?(?= -)', str(sub_english))[0] + sub_season = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[0]).strip()) + sub_episode = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[1]).strip()) + + else: + # [
DC's Legends of Tomorrow - 3x11 - Here I Go Again (HDTV-AFG, HDTV-RMX, 720p-SVA, 720p-PSA
] + sub_english_name = \ + re.findall(r'(?<=
).*?(?=\(Season)', str(sub_english))[0] + sub_season = int(re.findall(r"(?<=Season )\d+(?=\))", str(sub_english))[0]) + sub_episode = int(video.episode) + if isinstance(video, Movie): + sub_english_name = re.findall(r'(?<=
).*?(?=\()', str(sub_english))[0] + + sub_version = (str(sub_english).split('(')[len(str(sub_english).split('(')) - 1]).split(')')[0] + # Angol + lang = table.findAll("small")[0] + sub_language = self.get_language(re.findall(r"(?<=).*(?=)", str(lang))[0]) + + # + link = str(table.findAll("a")[len(table.findAll("a")) - 1]).replace("amp;", "") + sub_downloadlink = self.server_url + re.findall(r'(?<=href="/).*(?=">)', link)[0] + + sub_id = re.findall(r"(?<=felirat\=).*(?=\"\>)", link)[0] + sub_year = video.year + sub_releases = [s.strip() for s in sub_version.split(',')] + + # For episodes we open the series page so all subtitles imdb_id must be the same. no need to check all + if isinstance(video, Episode) and series_imdb_id is not None: + sub_imdb_id = series_imdb_id + else: + sub_imdb_id = self.find_imdb_id(sub_id) + series_imdb_id = sub_imdb_id + + subtitle = SuperSubtitlesSubtitle(sub_language, sub_downloadlink, sub_id, sub_english_name.strip(), sub_season, + sub_episode, sub_version, sub_releases, sub_year, sub_imdb_id, + asked_for_episode, asked_for_release_group=video.release_group ) + subtitles.append(subtitle) + i = i + 1 + return subtitles + + def list_subtitles(self, video, languages): + if isinstance(video, Episode): + titles = [video.series] + video.alternative_series + elif isinstance(video, Movie): + titles = [video.title] + video.alternative_titles + + for title in titles: + subs = self.query(title, video=video) + if subs: + return subs + + time.sleep(self.multi_result_throttle) + return [] + + def download_subtitle(self, subtitle): + + # download as a zip + logger.info('Downloading subtitle %r', subtitle.subtitle_id) + r = self.session.get(subtitle.page_link, timeout=10) + r.raise_for_status() + + if ".rar" in subtitle.page_link: + logger.debug('Archive identified as rar') + archive_stream = io.BytesIO(r.content) + archive = RarFile(archive_stream) + subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + elif ".zip" in subtitle.page_link: + logger.debug('Archive identified as zip') + archive_stream = io.BytesIO(r.content) + archive = ZipFile(archive_stream) + subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + else: + subtitle.content = fix_line_ending(r.content) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py index 162330cb0..9be0a92f6 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/titlovi.py @@ -2,35 +2,35 @@ import io import logging -import math import re +from datetime import datetime +import dateutil.parser import rarfile -from bs4 import BeautifulSoup from zipfile import ZipFile, is_zipfile from rarfile import RarFile, is_rarfile from babelfish import language_converters, Script -from requests import Session +from requests import RequestException, codes as request_codes from guessit import guessit +from subliminal_patch.http import RetryingCFSession from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming -from subliminal.exceptions import ProviderError +from subliminal.exceptions import ProviderError, AuthenticationError, ConfigurationError from subliminal.score import get_equivalent_release_groups from subliminal.utils import sanitize_release_group from subliminal.subtitle import guess_matches from subliminal.video import Episode, Movie +from subliminal.subtitle import fix_line_ending + from subzero.language import Language +from dogpile.cache.api import NO_VALUE +from subliminal.cache import region # parsing regex definitions title_re = re.compile(r'(?P(?:.+(?= [Aa][Kk][Aa] ))|.+)(?:(?:.+)(?P<altitle>(?<= [Aa][Kk][Aa] ).+))?') -lang_re = re.compile(r'(?<=flags/)(?P<lang>.{2})(?:.)(?P<script>c?)(?:.+)') -season_re = re.compile(r'Sezona (?P<season>\d+)') -episode_re = re.compile(r'Epizoda (?P<episode>\d+)') -year_re = re.compile(r'(?P<year>\d+)') -fps_re = re.compile(r'fps: (?P<fps>.+)') def fix_inconsistent_naming(title): @@ -44,6 +44,7 @@ def fix_inconsistent_naming(title): return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow", "Marvel's Jessica Jones": "Jessica Jones"}) + logger = logging.getLogger(__name__) # Configure :mod:`rarfile` to use the same path separator as :mod:`zipfile` @@ -55,9 +56,9 @@ def fix_inconsistent_naming(title): class TitloviSubtitle(Subtitle): provider_name = 'titlovi' - def __init__(self, language, page_link, download_link, sid, releases, title, alt_title=None, season=None, - episode=None, year=None, fps=None, asked_for_release_group=None, asked_for_episode=None): - super(TitloviSubtitle, self).__init__(language, page_link=page_link) + def __init__(self, language, download_link, sid, releases, title, alt_title=None, season=None, + episode=None, year=None, rating=None, download_count=None, asked_for_release_group=None, asked_for_episode=None): + super(TitloviSubtitle, self).__init__(language) self.sid = sid self.releases = self.release_info = releases self.title = title @@ -66,11 +67,21 @@ def __init__(self, language, page_link, download_link, sid, releases, title, alt self.episode = episode self.year = year self.download_link = download_link - self.fps = fps + self.rating = rating + self.download_count = download_count self.matches = None self.asked_for_release_group = asked_for_release_group self.asked_for_episode = asked_for_episode + def __repr__(self): + if self.season and self.episode: + return '<%s "%s (%r)" s%.2de%.2d [%s:%s] ID:%r R:%.2f D:%r>' % ( + self.__class__.__name__, self.title, self.year, self.season, self.episode, self.language, self._guessed_encoding, self.sid, + self.rating, self.download_count) + else: + return '<%s "%s (%r)" [%s:%s] ID:%r R:%.2f D:%r>' % ( + self.__class__.__name__, self.title, self.year, self.language, self._guessed_encoding, self.sid, self.rating, self.download_count) + @property def id(self): return self.sid @@ -126,151 +137,144 @@ def get_matches(self, video): class TitloviProvider(Provider, ProviderSubtitleArchiveMixin): subtitle_class = TitloviSubtitle - languages = {Language.fromtitlovi(l) for l in language_converters['titlovi'].codes} | {Language.fromietf('sr')} - server_url = 'http://titlovi.com' - search_url = server_url + '/titlovi/?' - download_url = server_url + '/download/?type=1&mediaid=' + languages = {Language.fromtitlovi(l) for l in language_converters['titlovi'].codes} | {Language.fromietf('sr-Latn')} + api_url = 'https://kodi.titlovi.com/api/subtitles' + api_gettoken_url = api_url + '/gettoken' + api_search_url = api_url + '/search' - def initialize(self): - self.session = Session() + def __init__(self, username=None, password=None): + if not all((username, password)): + raise ConfigurationError('Username and password must be specified') + + self.username = username + self.password = password + + self.session = None + self.user_id = None + self.login_token = None + self.token_exp = None + + def initialize(self): + self.session = RetryingCFSession() + #load_verification("titlovi", self.session) + + token = region.get("titlovi_token") + if token is not NO_VALUE: + self.user_id, self.login_token, self.token_exp = token + if datetime.now() > self.token_exp: + logger.debug('Token expired') + self.log_in() + else: + logger.debug('Use cached token') + else: + logger.debug('Token not found in cache') + self.log_in() + + def log_in(self): + login_params = dict(username=self.username, password=self.password, json=True) + try: + response = self.session.post(self.api_gettoken_url, params=login_params) + if response.status_code == request_codes.ok: + resp_json = response.json() + self.login_token = resp_json.get('Token') + self.user_id = resp_json.get('UserId') + self.token_exp = dateutil.parser.parse(resp_json.get('ExpirationDate')) + + region.set("titlovi_token", [self.user_id, self.login_token, self.token_exp]) + logger.debug('New token obtained') + + elif response.status_code == request_codes.unauthorized: + raise AuthenticationError('Login failed') + + except RequestException as e: + logger.error(e) def terminate(self): self.session.close() - def query(self, languages, title, season=None, episode=None, year=None, video=None): - items_per_page = 10 - current_page = 1 + def query(self, languages, title, season=None, episode=None, year=None, imdb_id=None, video=None): + search_params = dict() + + used_languages = languages + lang_strings = [str(lang) for lang in used_languages] + + # handle possible duplicate use of Serbian Latin + if "sr" in lang_strings and "sr-Latn" in lang_strings: + logger.info('Duplicate entries <Language [sr]> and <Language [sr-Latn]> found, filtering languages') + used_languages = filter(lambda l: l != Language.fromietf('sr-Latn'), used_languages) + logger.info('Filtered language list %r', used_languages) # convert list of languages into search string - langs = '|'.join( - map(str, [l.titlovi if l != Language.fromietf('sr') else 'cirilica' for l in languages])) + langs = '|'.join(map(str, [l.titlovi for l in used_languages])) + # set query params - params = {'prijevod': title, 'jezik': langs} + search_params['query'] = title + search_params['lang'] = langs is_episode = False if season and episode: is_episode = True - params['s'] = season - params['e'] = episode - if year: - params['g'] = year + search_params['season'] = season + search_params['episode'] = episode + #if year: + # search_params['year'] = year + if imdb_id: + search_params['imdbID'] = imdb_id # loop through paginated results - logger.info('Searching subtitles %r', params) + logger.info('Searching subtitles %r', search_params) subtitles = [] - - while True: - # query the server - try: - r = self.session.get(self.search_url, params=params, timeout=10) - r.raise_for_status() - - soup = BeautifulSoup(r.content, 'lxml') - - # number of results - result_count = int(soup.select_one('.results_count b').string) - except: - result_count = None - - # exit if no results - if not result_count: - if not subtitles: - logger.debug('No subtitles found') - else: - logger.debug("No more subtitles found") - break - - # number of pages with results - pages = int(math.ceil(result_count / float(items_per_page))) - - # get current page - if 'pg' in params: - current_page = int(params['pg']) - - try: - sublist = soup.select('section.titlovi > ul.titlovi > li') - for sub in sublist: - # subtitle id - sid = sub.find(attrs={'data-id': True}).attrs['data-id'] - # get download link - download_link = self.download_url + sid - # title and alternate title - match = title_re.search(sub.a.string) - if match: - _title = match.group('title') - alt_title = match.group('altitle') - else: - continue - - # page link - page_link = self.server_url + sub.a.attrs['href'] - # subtitle language - match = lang_re.search(sub.select_one('.lang').attrs['src']) - if match: - try: - lang = Language.fromtitlovi(match.group('lang')) - script = match.group('script') - if script: - lang.script = Script(script) - except ValueError: - continue - - # relase year or series start year - match = year_re.search(sub.find(attrs={'data-id': True}).parent.i.string) - if match: - r_year = int(match.group('year')) - # fps - match = fps_re.search(sub.select_one('.fps').string) - if match: - fps = match.group('fps') - # releases - releases = str(sub.select_one('.fps').parent.contents[0].string) - - # handle movies and series separately - if is_episode: - # season and episode info - sxe = sub.select_one('.s0xe0y').string - r_season = None - r_episode = None - if sxe: - match = season_re.search(sxe) - if match: - r_season = int(match.group('season')) - match = episode_re.search(sxe) - if match: - r_episode = int(match.group('episode')) - - subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, - alt_title=alt_title, season=r_season, episode=r_episode, - year=r_year, fps=fps, - asked_for_release_group=video.release_group, - asked_for_episode=episode) - else: - subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title, - alt_title=alt_title, year=r_year, fps=fps, - asked_for_release_group=video.release_group) - logger.debug('Found subtitle %r', subtitle) - - # prime our matches so we can use the values later - subtitle.get_matches(video) - - # add found subtitles - subtitles.append(subtitle) - - finally: - soup.decompose() - - # stop on last page - if current_page >= pages: - break - - # increment current page - params['pg'] = current_page + 1 - logger.debug('Getting page %d', params['pg']) + query_results = [] + + try: + search_params['token'] = self.login_token + search_params['userid'] = self.user_id + search_params['json'] = True + + response = self.session.get(self.api_search_url, params=search_params) + resp_json = response.json() + if resp_json['SubtitleResults']: + query_results.extend(resp_json['SubtitleResults']) + + + except Exception as e: + logger.error(e) + + for sub in query_results: + + # title and alternate title + match = title_re.search(sub.get('Title')) + if match: + _title = match.group('title') + alt_title = match.group('altitle') + else: + continue + + # handle movies and series separately + if is_episode: + subtitle = self.subtitle_class(Language.fromtitlovi(sub.get('Lang')), sub.get('Link'), sub.get('Id'), sub.get('Release'), _title, + alt_title=alt_title, season=sub.get('Season'), episode=sub.get('Episode'), + year=sub.get('Year'), rating=sub.get('Rating'), + download_count=sub.get('DownloadCount'), + asked_for_release_group=video.release_group, + asked_for_episode=episode) + else: + subtitle = self.subtitle_class(Language.fromtitlovi(sub.get('Lang')), sub.get('Link'), sub.get('Id'), sub.get('Release'), _title, + alt_title=alt_title, year=sub.get('Year'), rating=sub.get('Rating'), + download_count=sub.get('DownloadCount'), + asked_for_release_group=video.release_group) + logger.debug('Found subtitle %r', subtitle) + + # prime our matches so we can use the values later + subtitle.get_matches(video) + + # add found subtitles + subtitles.append(subtitle) return subtitles def list_subtitles(self, video, languages): season = episode = None + if isinstance(video, Episode): title = video.series season = video.season @@ -280,6 +284,7 @@ def list_subtitles(self, video, languages): return [s for s in self.query(languages, fix_inconsistent_naming(title), season=season, episode=episode, year=video.year, + imdb_id=video.imdb_id, video=video)] def download_subtitle(self, subtitle): @@ -295,6 +300,43 @@ def download_subtitle(self, subtitle): logger.debug('Archive identified as zip') archive = ZipFile(archive_stream) else: + subtitle.content = r.content + if subtitle.is_valid(): + return + subtitle.content = None + raise ProviderError('Unidentified archive type') - subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + subs_in_archive = archive.namelist() + + # if Serbian lat and cyr versions are packed together, try to find right version + if len(subs_in_archive) > 1 and (subtitle.language == 'sr' or subtitle.language == 'sr-Cyrl'): + self.get_subtitle_from_bundled_archive(subtitle, subs_in_archive, archive) + else: + # use default method for everything else + subtitle.content = self.get_subtitle_from_archive(subtitle, archive) + + def get_subtitle_from_bundled_archive(self, subtitle, subs_in_archive, archive): + sr_lat_subs = [] + sr_cyr_subs = [] + sub_to_extract = None + + for sub_name in subs_in_archive: + _sub_name = sub_name.lower() + + if not ('.cyr' in _sub_name or '.cir' in _sub_name or 'cyr)' in _sub_name): + sr_lat_subs.append(sub_name) + + if ('.cyr' in sub_name or '.cir' in _sub_name) and not '.lat' in _sub_name.lower(): + sr_cyr_subs.append(sub_name) + + if subtitle.language == 'sr': + if len(sr_lat_subs) > 0: + sub_to_extract = sr_lat_subs[0] + + if subtitle.language == 'sr-Cyrl': + if len(sr_cyr_subs) > 0: + sub_to_extract = sr_cyr_subs[0] + + logger.info(u'Using %s from the archive', sub_to_extract) + subtitle.content = fix_line_ending(archive.read(sub_to_extract)) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py b/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py index d09a6adc5..7f359772d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py +++ b/Contents/Libraries/Shared/subliminal_patch/providers/tvsubtitles.py @@ -21,6 +21,10 @@ def __init__(self, language, page_link, subtitle_id, series, season, episode, ye class TVsubtitlesProvider(_TVsubtitlesProvider): + languages = {Language('por', 'BR')} | {Language(l) for l in [ + 'ara', 'bul', 'ces', 'dan', 'deu', 'ell', 'eng', 'fin', 'fra', 'hun', 'ita', 'jpn', 'kor', 'nld', 'pol', 'por', + 'ron', 'rus', 'spa', 'swe', 'tur', 'ukr', 'zho' + ]} subtitle_class = TVsubtitlesSubtitle @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) diff --git a/Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py b/Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py new file mode 100644 index 000000000..fd51dd55b --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/providers/wizdom.py @@ -0,0 +1,235 @@ +# -*- coding: utf-8 -*- +from requests import Session +import logging +from subzero.language import Language +from guessit import guessit + +from subliminal_patch.providers import Provider +from subliminal.providers import Episode, Movie +from subliminal_patch.utils import sanitize +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending + +from io import BytesIO +from zipfile import ZipFile + +__author__ = "Dor Nizar" + +logger = logging.getLogger(__name__) + + +class WizdomSubtitle(Subtitle): + provider_name = 'wizdom' + + def __init__(self, language, title_id, subtitle_id, series, season, episode, release, year, page_link): + super(WizdomSubtitle, self).__init__(language, subtitle_id) + self.title_id = title_id + self.subtitle_id = subtitle_id + self.series = series + self.season = season + self.episode = episode + self.release = release + self.year = year + self.page_link = page_link + + def get_matches(self, video): + matches = set() + logger.debug("[{}]\n{}".format(self.__class__.__name__, self.__dict__)) + + # episode + if isinstance(video, Episode): + # series + if video.series and sanitize(self.series) == sanitize(video.series): + matches.add('series') + # season + if video.season and self.season == video.season: + matches.add('season') + # episode + if video.episode and self.episode == video.episode: + matches.add('episode') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'episode'})) + # movie + elif isinstance(video, Movie): + # title + if video.title and (sanitize(self.series) in ( + sanitize(name) for name in [video.title] + video.alternative_titles)): + matches.add('title') + # year + if video.year and self.year == video.year: + matches.add('year') + # guess + matches |= guess_matches(video, guessit(self.release, {'type': 'movie'})) + + logger.debug("Wizdom subtitle criteria match:\n{}".format(matches)) + return matches + + @property + def id(self): + return self.subtitle_id + + +class WizdomProvider(Provider): + subtitle_class = WizdomSubtitle + languages = {Language.fromalpha2(lng) for lng in ['he']} + URL_JSON_SERVER = 'https://json.wizdom.xyz/' + URL_DOWNLOAD_SERVER = 'https://zip.wizdom.xyz/' + URL_WIZDOM_PAGELINK = 'https://wizdom.xyz/{}/{}' + + URL_SEARCH = URL_JSON_SERVER + "search.php?search={}" + URL_INFO = URL_JSON_SERVER + "{}.json" + URL_DOWNLOAD_SUBTITLE = URL_DOWNLOAD_SERVER + "{}.zip" + + def __init__(self): + self.session = None + + def initialize(self): + logger.info("Wizdom initialize") + self.session = Session() + self.session.headers[ + 'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; ' \ + 'Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' + return True + + def terminate(self): + logger.info("Wizdom terminate") + self.session.close() + + def _search_series(self, title, movie=False): + logger.debug("Searching '{}'".format(title)) + r = self.session.get(self.URL_SEARCH.format(title)) + if not r.ok: + logger.error("Bad response from server while searching: '{}']".format(title)) + return [] + try: + found = r.json() + except ValueError: + logger.error("Could not extract JSON from response") + return [] + + if movie: + series_list = [x for x in found if 'type' in x and x['type'] == 'movie'] + else: + series_list = [x for x in found if 'type' in x and x['type'] == 'tv'] + + logger.debug("Found the following titles: {}".format([x['title_en'] for x in series_list if 'title_en' in x])) + return series_list + + def _search_subtitles(self, title_id, season=None, episode=None): + r = self.session.get(self.URL_INFO.format(title_id)) + + if not r.ok: + logger.error("Bad response from server while searching subtitles [title_id={}]".format(title_id)) + return [] + if not r.content: + return [] + try: + results = r.json() + except ValueError: + return [] + + if 'subs' not in results: + return [] + + if season and episode: + s_season = str(season) + s_episode = str(episode) + if s_season in results['subs'] and s_episode in results['subs'][s_season]: + return results['subs'][s_season][s_episode] + else: + return results['subs'] + return [] + + def query(self, title, season=None, episode=None, year=None): + subtitles = [] + if season and episode: + logger.debug("Searching for:\nTitle: {}\nSeason: {}\nEpisode: {}\nYear: {}".format(title, season, + episode, year)) + titles = self._search_series(title) + else: + logger.debug("Searching for:\nTitle: {}\nYear: {}\n".format(title, year)) + titles = self._search_series(title, movie=True) + + for title in titles: + title_name = title['title_en'] + title_id = title['imdb'] + if season and episode: + results = self._search_subtitles(title_id, season, episode) + page_link = self.URL_WIZDOM_PAGELINK.format("tv", title_id) + else: + results = self._search_subtitles(title_id) + page_link = self.URL_WIZDOM_PAGELINK.format("movie", title_id) + + if not results: + logger.info("No subtitles found for: {}".format(title_name)) + continue + + for result in results: + subtitle_id, release = result['id'], result['version'] + subtitles.append(self.subtitle_class(next(iter(self.languages)), title_id, subtitle_id, + title_name, season, episode, release, year, page_link)) + + if subtitles: + logger.debug("Found Subtitle Candidates: {}".format([x.release for x in subtitles])) + return subtitles + + def list_subtitles(self, video, languages): + season = episode = year = title = None + + if isinstance(video, Episode): + logger.info("list_subtitles Series: {}, season: {}, episode: {}".format(video.series, + video.season, + video.episode)) + title = video.series + season = video.season + if video.episode == 0: + episode = 1 + else: + episode = video.episode + elif isinstance(video, Movie): + logger.info("list_subtitles Movie: {}, year: {}".format(video.title, video.year)) + title = video.title + year = video.year + + return [s for s in self.query(title, season, episode, year) if s.language in languages] + + def _download_subtitles(self, subtitle_id): + logger.debug("Downloading subtitle id - {}".format(subtitle_id)) + r = self.session.get(self.URL_DOWNLOAD_SUBTITLE.format(subtitle_id)) + + if not r.ok: + logger.error("Bad response from server while downloding zip [id={}]".format(subtitle_id)) + return None + if not r.content: + logger.error("Unable to download zip [id={}]".format(subtitle_id)) + return None + + return r.content + + def download_subtitle(self, subtitle): + # type: (WizdomSubtitle) -> None + + logger.info('Downloading subtitle from WizdomSubs: %r', subtitle) + + content = None + zip_content = self._download_subtitles(subtitle.subtitle_id) + if not zip_content: + return None + if not zip_content[:2] == "PK": + logger.warning("Response did not contain zip file") + return None + + zfile = ZipFile(BytesIO(zip_content)) + if not len(zfile.namelist()): + logger.warning("Response did not contain files inside the zip archive") + return None + + sub_files = [x for x in zfile.namelist() if x.endswith(('.srt', '.idx', '.sub'))] + if sub_files: + content = zfile.open(sub_files[0]).read() + + if not content: + logger.warning("File inside zip is empty") + return None + subtitle.content = fix_line_ending(content) + logger.info("Downloaded {} successfuly!".format(subtitle)) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py b/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py index d0a5cb628..8e5e6d3fa 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/drone.py @@ -19,11 +19,11 @@ class DroneAPIClient(object): _fill_attrs = None def __init__(self, version=1, session=None, headers=None, timeout=10, base_url=None, api_key=None, - ssl_no_verify=False): + ssl_no_verify=False, pem_file=None): headers = dict(headers or {}, **{"X-Api-Key": api_key}) #: Session for the requests - self.session = session or CertifiSession() + self.session = session or CertifiSession(verify=pem_file) if ssl_no_verify: self.session.verify = False @@ -63,12 +63,12 @@ def build_params(self, params): out[key] = quote(value) return out - def get(self, endpoint, **params): + def get(self, endpoint, requests_kwargs=None, **params): url = urljoin(self.api_url, endpoint) params = self.build_params(params) # perform the request - r = self.session.get(url, params=params) + r = self.session.get(url, params=params, **(requests_kwargs or {})) r.raise_for_status() # get the response as json @@ -79,8 +79,8 @@ def get(self, endpoint, **params): return j return [] - def status(self): - return self.get("system/status") + def status(self, **kwargs): + return self.get("system/status", requests_kwargs=kwargs) def update_video(self, video, scene_name): """ diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py b/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py index 0cd3df48c..332026d9d 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/filebot.py @@ -1,8 +1,11 @@ # coding=utf-8 +import logging from libfilebot import get_filebot_attrs from common import update_video +logger = logging.getLogger(__name__) + def refine(video, **kwargs): """ @@ -11,7 +14,12 @@ def refine(video, **kwargs): :param kwargs: :return: """ - orig_fn = get_filebot_attrs(video.name) + try: + orig_fn = get_filebot_attrs(video.name) - if orig_fn: - update_video(video, orig_fn) + if orig_fn: + update_video(video, orig_fn) + else: + logger.info(u"%s: Filebot didn't return an original filename", video.name) + except: + logger.exception(u"%s: Something went wrong when retrieving filebot attributes:", video.name) diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py index 9ecb5155b..f8cfba105 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/omdb.py @@ -4,11 +4,14 @@ import base64 import zlib from subliminal import __short_version__ -from subliminal.refiners.omdb import OMDBClient, refine +from subliminal.refiners.omdb import OMDBClient, refine as refine_orig, Episode, Movie +from subliminal_patch.http import TimeoutSession class SZOMDBClient(OMDBClient): def __init__(self, version=1, session=None, headers=None, timeout=10): + if not session: + session = TimeoutSession(timeout=timeout) super(SZOMDBClient, self).__init__(version=version, session=session, headers=headers, timeout=timeout) def get_params(self, params): @@ -63,5 +66,13 @@ def search(self, title, type=None, year=None, page=1): return j +def refine(video, **kwargs): + refine_orig(video, **kwargs) + if isinstance(video, Episode) and video.series_imdb_id: + video.series_imdb_id = video.series_imdb_id.strip() + elif isinstance(video, Movie) and video.imdb_id: + video.imdb_id = video.imdb_id.strip() + + omdb_client = SZOMDBClient(headers={'User-Agent': 'Subliminal/%s' % __short_version__}) subliminal.refiners.omdb.omdb_client = omdb_client diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py index be8cfe6dc..4dda710e3 100644 --- a/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/tvdb.py @@ -5,9 +5,12 @@ from subliminal.refiners.tvdb import Episode, logger, search_series, series_re, sanitize, get_series, \ get_series_episode, region, tvdb_client +from util import fix_session_bases TVDB_SEASON_EXPIRATION_TIME = datetime.timedelta(days=1).total_seconds() +fix_session_bases(tvdb_client.session) + @region.cache_on_arguments(expiration_time=TVDB_SEASON_EXPIRATION_TIME) def is_season_fully_aired(series_id, season): @@ -84,7 +87,10 @@ def refine(video, **kwargs): # parse series year series_year = None if result['firstAired']: - series_year = datetime.datetime.strptime(result['firstAired'], '%Y-%m-%d').year + try: + series_year = datetime.datetime.strptime(result['firstAired'], '%Y-%m-%d').year + except ValueError: + continue # discard mismatches on year if video.year and series_year and video.year != series_year: @@ -117,7 +123,7 @@ def refine(video, **kwargs): # exit if we don't have exactly 1 matching result if not matching_results: - logger.error('No matching series found') + logger.warning('No matching series found') return if len(matching_results) > 1: logger.error('Multiple matches found') diff --git a/Contents/Libraries/Shared/subliminal_patch/refiners/util.py b/Contents/Libraries/Shared/subliminal_patch/refiners/util.py new file mode 100644 index 000000000..f83701684 --- /dev/null +++ b/Contents/Libraries/Shared/subliminal_patch/refiners/util.py @@ -0,0 +1,10 @@ +# coding=utf-8 + +import types +from subliminal_patch.http import TimeoutSession + + +def fix_session_bases(obj): + obj.__class__ = type("PatchedTimeoutSession", (TimeoutSession,), + {"request": types.MethodType(TimeoutSession.request, obj)}) + return obj diff --git a/Contents/Libraries/Shared/subliminal_patch/score.py b/Contents/Libraries/Shared/subliminal_patch/score.py index 918f8f668..c70e61f15 100644 --- a/Contents/Libraries/Shared/subliminal_patch/score.py +++ b/Contents/Libraries/Shared/subliminal_patch/score.py @@ -60,6 +60,8 @@ def compute_score(matches, subtitle, video, hearing_impaired=None): episode_hash_valid_if = {"series", "season", "episode", "format"} movie_hash_valid_if = {"video_codec", "format"} + orig_matches = matches.copy() + # on hash match, discard everything else if subtitle.hash_verifiable: if 'hash' in matches: @@ -83,41 +85,47 @@ def compute_score(matches, subtitle, video, hearing_impaired=None): matches &= {'hash'} # handle equivalent matches + eq_matches = set() if is_episode: if 'title' in matches: logger.debug('Adding title match equivalent') - matches.add('episode') + eq_matches.add('episode') if 'series_imdb_id' in matches: logger.debug('Adding series_imdb_id match equivalent') - matches |= {'series', 'year'} + eq_matches |= {'series', 'year'} if 'imdb_id' in matches: logger.debug('Adding imdb_id match equivalents') - matches |= {'series', 'year', 'season', 'episode'} + eq_matches |= {'series', 'year', 'season', 'episode'} if 'tvdb_id' in matches: logger.debug('Adding tvdb_id match equivalents') - matches |= {'series', 'year', 'season', 'episode', 'title'} + eq_matches |= {'series', 'year', 'season', 'episode', 'title'} if 'series_tvdb_id' in matches: logger.debug('Adding series_tvdb_id match equivalents') - matches |= {'series', 'year'} + eq_matches |= {'series', 'year'} # specials if video.is_special and 'title' in matches and 'series' in matches \ and 'year' in matches: logger.debug('Adding special title match equivalent') - matches |= {'season', 'episode'} + eq_matches |= {'season', 'episode'} elif is_movie: if 'imdb_id' in matches: logger.debug('Adding imdb_id match equivalents') - matches |= {'title', 'year'} + eq_matches |= {'title', 'year'} + + matches |= eq_matches # handle hearing impaired if hearing_impaired is not None and subtitle.hearing_impaired == hearing_impaired: logger.debug('Matched hearing_impaired') matches.add('hearing_impaired') + orig_matches.add('hearing_impaired') # compute the score score = sum((scores.get(match, 0) for match in matches)) logger.info('%r: Computed score %r with final matches %r', subtitle, score, matches) - return score + score_without_hash = sum((scores.get(match, 0) for match in orig_matches | eq_matches if match != "hash")) + + return score, score_without_hash diff --git a/Contents/Libraries/Shared/subliminal_patch/subtitle.py b/Contents/Libraries/Shared/subliminal_patch/subtitle.py index 50a99c765..46b6f5960 100644 --- a/Contents/Libraries/Shared/subliminal_patch/subtitle.py +++ b/Contents/Libraries/Shared/subliminal_patch/subtitle.py @@ -16,8 +16,18 @@ from pysubs2.time import ms_to_times from subzero.modification import SubtitleModifications from subliminal import Subtitle as Subtitle_ -from subliminal.subtitle import Episode, Movie, sanitize_release_group, sanitize, get_equivalent_release_groups +from subliminal.subtitle import Episode, Movie, sanitize_release_group, get_equivalent_release_groups +from subliminal_patch.utils import sanitize from ftfy import fix_text +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE + +BOMS = ( + (BOM_UTF8, "UTF-8"), + (BOM_UTF32_BE, "UTF-32-BE"), + (BOM_UTF32_LE, "UTF-32-LE"), + (BOM_UTF16_BE, "UTF-16-BE"), + (BOM_UTF16_LE, "UTF-16-LE"), +) logger = logging.getLogger(__name__) @@ -38,17 +48,21 @@ class Subtitle(Subtitle_): plex_media_fps = None skip_wrong_fps = False wrong_fps = False + wrong_series = False + wrong_season_ep = False is_pack = False asked_for_release_group = None asked_for_episode = None pack_data = None _guessed_encoding = None + _is_valid = False def __init__(self, language, hearing_impaired=False, page_link=None, encoding=None, mods=None): super(Subtitle, self).__init__(language, hearing_impaired=hearing_impaired, page_link=page_link, encoding=encoding) self.mods = mods + self._is_valid = False def __repr__(self): return '<%s %r [%s:%s]>' % ( @@ -100,6 +114,9 @@ def normalize(self): # normalize line endings self.content = self.content.replace("\r\n", "\n").replace('\r', '\n') + def _check_bom(self, data): + return [encoding for bom, encoding in BOMS if data.startswith(bom)] + def guess_encoding(self): """Guess encoding using the language, falling back on chardet. @@ -114,11 +131,17 @@ def guess_encoding(self): encodings = ['utf-8'] + # check UTF BOMs + bom_encodings = self._check_bom(self.content) + if bom_encodings: + encodings = list(set(enc.lower() for enc in bom_encodings + encodings)) + # add language-specific encodings # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages if self.language.alpha3 == 'zho': - encodings.extend(['cp936', 'gb2312', 'cp950', 'gb18030', 'big5', 'big5hkscs']) + encodings.extend(['cp936', 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp_2', 'cp950', 'gb18030', 'big5', + 'big5hkscs', 'utf-16']) elif self.language.alpha3 == 'jpn': encodings.extend(['shift-jis', 'cp932', 'euc_jp', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', ]) @@ -127,7 +150,7 @@ def guess_encoding(self): # arabian/farsi elif self.language.alpha3 in ('ara', 'fas', 'per'): - encodings.append('windows-1256') + encodings.extend(['windows-1256', 'utf-16']) elif self.language.alpha3 == 'heb': encodings.extend(['windows-1255', 'iso-8859-8']) elif self.language.alpha3 == 'tur': @@ -195,12 +218,12 @@ def guess_encoding(self): logger.info('Falling back to bs4 detection') a = UnicodeDammit(self.content) - Log.Debug("bs4 detected encoding: %s" % a.original_encoding) + logger.info("bs4 detected encoding: %s", a.original_encoding) if a.original_encoding: self._guessed_encoding = a.original_encoding return a.original_encoding - raise ValueError(u"Couldn't guess the proper encoding for %s" % self) + raise ValueError(u"Couldn't guess the proper encoding for %s", self) self._guessed_encoding = encoding return encoding @@ -212,6 +235,9 @@ def is_valid(self): :rtype: bool """ + if self._is_valid: + return True + text = self.text if not text: return False @@ -222,6 +248,7 @@ def is_valid(self): except Exception: logger.error("PySRT-parsing failed, trying pysubs2") else: + self._is_valid = True return True # something else, try to return srt @@ -241,16 +268,22 @@ def is_valid(self): subs = pysubs2.SSAFile.from_string(text, fps=self.plex_media_fps) unicontent = self.pysubs2_to_unicode(subs) - self.content = unicontent.encode("utf-8") - self._guessed_encoding = "utf-8" + self.content = unicontent.encode(self._guessed_encoding) except: logger.exception("Couldn't convert subtitle %s to .srt format: %s", self, traceback.format_exc()) return False + self._is_valid = True return True @classmethod def pysubs2_to_unicode(cls, sub, format="srt"): + """ + this is a modified version of pysubs2.SubripFormat.to_file with special handling for drawing tags in ASS + :param sub: + :param format: + :return: + """ def ms_to_timestamp(ms, mssep=","): """Convert ms to 'HH:MM:SS,mmm'""" # XXX throw on overflow/underflow? @@ -262,9 +295,12 @@ def ms_to_timestamp(ms, mssep=","): def prepare_text(text, style): body = [] for fragment, sty in parse_tags(text, style, sub.styles): - fragment = fragment.replace(ur"\h", u" ") - fragment = fragment.replace(ur"\n", u"\n") - fragment = fragment.replace(ur"\N", u"\n") + fragment = fragment.replace(r"\h", u" ") + fragment = fragment.replace(r"\n", u"\n") + fragment = fragment.replace(r"\N", u"\n") + if sty.drawing: + raise pysubs2.ContentNotUsable + if format == "srt": if sty.italic: fragment = u"<i>%s</i>" % fragment @@ -296,7 +332,10 @@ def prepare_text(text, style): for i, line in enumerate(visible_lines, 1): start = ms_to_timestamp(line.start, mssep=mssep) end = ms_to_timestamp(line.end, mssep=mssep) - text = prepare_text(line.text, sub.styles.get(line.style, SSAStyle.DEFAULT_STYLE)) + try: + text = prepare_text(line.text, sub.styles.get(line.style, SSAStyle.DEFAULT_STYLE)) + except pysubs2.ContentNotUsable: + continue out.append(u"%d\n" % i) out.append(u"%s --> %s\n" % (start, end)) @@ -309,15 +348,17 @@ def get_modified_content(self, format="srt", debug=False): :return: string """ if not self.mods: - return fix_text(self.content.decode("utf-8"), **ftfy_defaults).encode(encoding="utf-8") + return fix_text(self.content.decode(encoding=self._guessed_encoding), **ftfy_defaults).encode( + encoding=self._guessed_encoding) submods = SubtitleModifications(debug=debug) if submods.load(content=self.text, language=self.language): logger.info("Applying mods: %s", self.mods) submods.modify(*self.mods) + self.mods = submods.mods_used content = fix_text(self.pysubs2_to_unicode(submods.f, format=format), **ftfy_defaults)\ - .encode(encoding="utf-8") + .encode(encoding=self._guessed_encoding) submods.f = None del submods return content @@ -328,6 +369,15 @@ class ModifiedSubtitle(Subtitle): id = None +MERGED_FORMATS = { + "TV": ("HDTV", "SDTV", "AHDTV", "UHDTV"), + "Air": ("SATRip", "DVB", "PPV"), + "Disk": ("DVD", "HD-DVD", "BluRay") +} + +MERGED_FORMATS_REV = dict((v.lower(), k.lower()) for k in MERGED_FORMATS for v in MERGED_FORMATS[k]) + + def guess_matches(video, guess, partial=False): """Get matches between a `video` and a `guess`. @@ -348,8 +398,14 @@ def guess_matches(video, guess, partial=False): matches = set() if isinstance(video, Episode): # series - if video.series and 'title' in guess and sanitize(guess['title']) == sanitize(video.series): - matches.add('series') + if video.series and 'title' in guess: + titles = guess["title"] + if not isinstance(titles, types.ListType): + titles = [titles] + + for title in titles: + if sanitize(title) in (sanitize(name) for name in [video.series] + video.alternative_series): + matches.add('series') # title if video.title and 'episode_title' in guess and sanitize(guess['episode_title']) == sanitize(video.title): matches.add('title') @@ -376,7 +432,8 @@ def guess_matches(video, guess, partial=False): if video.year and 'year' in guess and guess['year'] == video.year: matches.add('year') # title - if video.title and 'title' in guess and sanitize(guess['title']) == sanitize(video.title): + if video.title and 'title' in guess and sanitize(guess['title']) in ( + sanitize(name) for name in [video.title] + video.alternative_titles): matches.add('title') # release_group @@ -403,21 +460,25 @@ def guess_matches(video, guess, partial=False): formats = [formats] if video.format: - video_format = video.format - if video_format in ("HDTV", "SDTV", "TV"): - video_format = "TV" - logger.debug("Treating HDTV/SDTV the same") + video_format = video.format.lower() + _video_gen_format = MERGED_FORMATS_REV.get(video_format) + if _video_gen_format: + logger.debug("Treating %s as %s the same", video_format, _video_gen_format) for frmt in formats: - if frmt in ("HDTV", "SDTV"): - frmt = "TV" + _guess_gen_frmt = MERGED_FORMATS_REV.get(frmt.lower()) - if frmt.lower() == video_format.lower(): + if _guess_gen_frmt == _video_gen_format: matches.add('format') break + if "release_group" in matches and "format" not in matches: + logger.info("Release group matched but format didn't. Remnoving release group match.") + matches.remove("release_group") + # video_codec if video.video_codec and 'video_codec' in guess and guess['video_codec'] == video.video_codec: matches.add('video_codec') + # audio_codec if video.audio_codec and 'audio_codec' in guess and guess['audio_codec'] == video.audio_codec: matches.add('audio_codec') diff --git a/Contents/Libraries/Shared/subliminal_patch/utils.py b/Contents/Libraries/Shared/subliminal_patch/utils.py index d439272b0..410b7a2be 100644 --- a/Contents/Libraries/Shared/subliminal_patch/utils.py +++ b/Contents/Libraries/Shared/subliminal_patch/utils.py @@ -35,11 +35,12 @@ def sanitize(string, ignore_characters=None, default_characters={'-', ':', '(', return string.strip().lower() -def fix_inconsistent_naming(title, inconsistent_titles_dict=None): +def fix_inconsistent_naming(title, inconsistent_titles_dict=None, no_sanitize=False): """Fix titles with inconsistent naming using dictionary and sanitize them. :param str title: original title. :param dict inconsistent_titles_dict: dictionary of titles with inconsistent naming. + :param bool no_sanitize: indication to not sanitize title. :return: new title. :rtype: str @@ -54,5 +55,8 @@ def fix_inconsistent_naming(title, inconsistent_titles_dict=None): pattern = re.compile('|'.join(re.escape(key) for key in inconsistent_titles_dict.keys())) title = pattern.sub(lambda x: inconsistent_titles_dict[x.group()], title) + if no_sanitize: + return title + else: + return sanitize(title) # return fixed and sanitized title - return sanitize(title) diff --git a/Contents/Libraries/Shared/subliminal_patch/video.py b/Contents/Libraries/Shared/subliminal_patch/video.py index a230b6e55..a53b09ead 100644 --- a/Contents/Libraries/Shared/subliminal_patch/video.py +++ b/Contents/Libraries/Shared/subliminal_patch/video.py @@ -11,12 +11,16 @@ class Video(Video_): plexapi_metadata = None hints = None season_fully_aired = None + audio_languages = None + external_subtitle_languages = None def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None, - imdb_id=None, hashes=None, size=None, subtitle_languages=None): + imdb_id=None, hashes=None, size=None, subtitle_languages=None, audio_languages=None): super(Video, self).__init__(name, format=format, release_group=release_group, resolution=resolution, video_codec=video_codec, audio_codec=audio_codec, imdb_id=imdb_id, hashes=hashes, size=size, subtitle_languages=subtitle_languages) self.original_name = os.path.basename(name) self.plexapi_metadata = {} self.hints = {} + self.audio_languages = audio_languages or set() + self.external_subtitle_languages = set() diff --git a/Contents/Libraries/Shared/submod_test.py b/Contents/Libraries/Shared/submod_test.py index 933db8686..49dbee18d 100644 --- a/Contents/Libraries/Shared/submod_test.py +++ b/Contents/Libraries/Shared/submod_test.py @@ -6,7 +6,7 @@ from ftfy import fix_text -from babelfish import Language +from subzero.language import Language from subliminal_patch import Subtitle from subliminal_patch.subtitle import ftfy_defaults @@ -20,9 +20,11 @@ if debug: logging.basicConfig(level=logging.DEBUG) -sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes"]) +#sub = Subtitle(Language.fromietf("eng:forced"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=-500)", "shift_offset(ms=500)", "shift_offset(s=2,ms=800)"]) +sub = Subtitle(Language.fromietf("eng"), mods=["common", "remove_HI", "OCR_fixes", "fix_uppercase", "shift_offset(ms=0,s=1)"]) sub.content = open(fn).read() sub.normalize() +sub.is_valid() content = sub.get_modified_content(debug=True) #submod = SubMod(debug=debug) diff --git a/Contents/Libraries/Shared/subscene_api/subscene.py b/Contents/Libraries/Shared/subscene_api/subscene.py index b59783a4b..827110369 100644 --- a/Contents/Libraries/Shared/subscene_api/subscene.py +++ b/Contents/Libraries/Shared/subscene_api/subscene.py @@ -25,8 +25,12 @@ # imports import re + import enum import sys +import requests +import time +import logging is_PY2 = sys.version_info[0] < 3 if is_PY2: @@ -36,7 +40,12 @@ from contextlib import suppress from urllib2.request import Request, urlopen -from bs4 import BeautifulSoup +from dogpile.cache.api import NO_VALUE +from subliminal.cache import region +from bs4 import BeautifulSoup, NavigableString + + +logger = logging.getLogger(__name__) # constants HEADERS = { @@ -47,14 +56,23 @@ "Kit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36" +ENDPOINT_RE = re.compile(ur'(?uis)<form.+?action="/subtitles/(.+)">.*?<input type="text"') + + +class NewEndpoint(Exception): + pass + + # utils -def soup_for(url, session=None, user_agent=DEFAULT_USER_AGENT): +def soup_for(url, data=None, session=None, user_agent=DEFAULT_USER_AGENT): url = re.sub("\s", "+", url) if not session: r = Request(url, data=None, headers=dict(HEADERS, **{"User-Agent": user_agent})) html = urlopen(r).read().decode("utf-8") else: - html = session.get(url).text + ret = session.post(url, data=data) + ret.raise_for_status() + html = ret.text return BeautifulSoup(html, "html.parser") @@ -107,7 +125,7 @@ def from_rows(cls, rows): subtitles = [] for row in rows: - if row.td.a is not None: + if row.td.a is not None and row.td.get("class", ["lazy"])[0] != "empty": subtitles.append(cls.from_row(row)) return subtitles @@ -175,8 +193,12 @@ def from_url(cls, url, session=None): content = soup.find("div", "subtitles") header = content.find("div", "box clearfix") + cover = None - cover = header.find("div", "poster").img.get("src") + try: + cover = header.find("div", "poster").img.get("src") + except AttributeError: + pass title = header.find("div", "header").h2.text[:-12].strip() @@ -207,7 +229,7 @@ def section_exists(soup, section): return False -def get_first_film(soup, section, session=None): +def get_first_film(soup, section, year=None, session=None): tag_part = SectionsParts[section] tag = None @@ -220,21 +242,65 @@ def get_first_film(soup, section, session=None): if not tag: return - url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href") + url = None + + if not year: + url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href") + else: + for t in tag.findNext("ul").findAll("li"): + if isinstance(t, NavigableString) or not t.div: + continue + + if str(year) in t.div.a.string: + url = SITE_DOMAIN + t.div.a.get("href") + break + if not url: + # fallback to non-year results + logger.info("Falling back to non-year results as year wasn't found (%s)", year) + url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href") + return Film.from_url(url, session=session) -def search(term, session=None, limit_to=SearchTypes.Exact): - soup = soup_for("%s/subtitles/title?q=%s" % (SITE_DOMAIN, term), session=session) +def find_endpoint(session, content=None): + endpoint = region.get("subscene_endpoint2") + if endpoint is NO_VALUE: + if not content: + content = session.get(SITE_DOMAIN).text - if "Subtitle search by" in str(soup): - rows = soup.find("table").tbody.find_all("tr") - subtitles = Subtitle.from_rows(rows) - return Film(term, subtitles=subtitles) + m = ENDPOINT_RE.search(content) + if m: + endpoint = m.group(1).strip() + logger.debug("Switching main endpoint to %s", endpoint) + region.set("subscene_endpoint2", endpoint) + return endpoint + + +def search(term, release=True, session=None, year=None, limit_to=SearchTypes.Exact, throttle=0): + # note to subscene: if you actually start to randomize the endpoint, we'll have to query your server even more + + if release: + endpoint = "release" + else: + endpoint = find_endpoint(session) + time.sleep(throttle) + + if not endpoint: + logger.error("Couldn't find endpoint, exiting") + return + + soup = soup_for("%s/subtitles/%s" % (SITE_DOMAIN, endpoint), data={"query": term}, + session=session) + + if soup: + if "Subtitle search by" in str(soup): + rows = soup.find("table").tbody.find_all("tr") + subtitles = Subtitle.from_rows(rows) + return Film(term, subtitles=subtitles) - for junk, search_type in SearchTypes.__members__.items(): - if section_exists(soup, search_type): - return get_first_film(soup, search_type) + for junk, search_type in SearchTypes.__members__.items(): + if section_exists(soup, search_type): + return get_first_film(soup, search_type, year=year, session=session) - if limit_to == search_type: - return + if limit_to == search_type: + return diff --git a/Contents/Libraries/Shared/subzero/constants.py b/Contents/Libraries/Shared/subzero/constants.py index d541de9f2..cdfa242a6 100755 --- a/Contents/Libraries/Shared/subzero/constants.py +++ b/Contents/Libraries/Shared/subzero/constants.py @@ -2,7 +2,8 @@ OS_PLEX_USERAGENT = 'plexapp.com v9.0' -DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero'] +DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot', + 'cloudscraper'] PERSONAL_MEDIA_IDENTIFIER = "com.plexapp.agents.none" PLUGIN_IDENTIFIER_SHORT = "subzero" PLUGIN_IDENTIFIER = "com.plexapp.agents.%s" % PLUGIN_IDENTIFIER_SHORT diff --git a/Contents/Libraries/Shared/subzero/history_storage.py b/Contents/Libraries/Shared/subzero/history_storage.py index 4a20e8b2a..38d859d55 100644 --- a/Contents/Libraries/Shared/subzero/history_storage.py +++ b/Contents/Libraries/Shared/subzero/history_storage.py @@ -20,10 +20,11 @@ class SubtitleHistoryItem(object): lang_name = None lang_data = None score = None + thumb = None time = None mode = "a" - def __init__(self, item_title, rating_key, section_title=None, subtitle=None, mode="a", time=None): + def __init__(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None): self.item_title = item_title self.section_title = section_title self.rating_key = str(rating_key) @@ -33,6 +34,7 @@ def __init__(self, item_title, rating_key, section_title=None, subtitle=None, mo str(subtitle.language.country) if subtitle.language.country else None, \ str(subtitle.language.script) if subtitle.language.script else None self.score = subtitle.score + self.thumb = thumb self.time = time or datetime.datetime.now() self.mode = mode @@ -82,11 +84,12 @@ def __init__(self, storage, threadkit, size=100): self.storage = storage self.threadkit = threadkit - def add(self, item_title, rating_key, section_title=None, subtitle=None, mode="a", time=None): + def add(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None): with self.threadkit.Lock(key="sub_history_add"): items = self.items - item = SubtitleHistoryItem(item_title, rating_key, section_title=section_title, subtitle=subtitle, mode=mode, time=time) + item = SubtitleHistoryItem(item_title, rating_key, section_title=section_title, subtitle=subtitle, + thumb=thumb, mode=mode, time=time) # insert item items.insert(0, item) diff --git a/Contents/Libraries/Shared/subzero/language.py b/Contents/Libraries/Shared/subzero/language.py index a07952bba..b11f376e7 100644 --- a/Contents/Libraries/Shared/subzero/language.py +++ b/Contents/Libraries/Shared/subzero/language.py @@ -1,14 +1,47 @@ # coding=utf-8 -from babelfish.exceptions import LanguageError - -from babelfish import Language as Language_ +from __future__ import absolute_import +import types +import re +from babelfish.exceptions import LanguageError +from babelfish import Language as Language_, basestr, LANGUAGE_MATRIX +from six.moves import zip repl_map = { "dk": "da", "nld": "nl", + "english": "en", + "alb": "sq", + "arm": "hy", + "baq": "eu", + "bur": "my", + "chi": "zh", + "cze": "cs", + "dut": "nl", + "fre": "fr", + "geo": "ka", + "ger": "de", + "gre": "el", + "ice": "is", + "mac": "mk", + "mao": "mi", + "may": "ms", + "per": "fa", + "rum": "ro", + "slo": "sk", + "tib": "bo", } +CUSTOM_LIST = ["chs", "sc", "zhs", "hans", "gb", u"简", u"双语", + "cht", "tc", "zht", "hant", "big5", u"繁", u"雙語", + "spl", "ea", "pob", "pb"] + +ALPHA2_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha2, LANGUAGE_MATRIX)))) + list(repl_map.values()) +ALPHA3b_LIST = list(set(filter(lambda x: x, map(lambda x: x.alpha3, LANGUAGE_MATRIX)))) + \ + list(set(filter(lambda x: len(x) == 3, list(repl_map.keys())))) +FULL_LANGUAGE_LIST = ALPHA2_LIST + ALPHA3b_LIST +FULL_LANGUAGE_LIST.extend(CUSTOM_LIST) + def language_from_stream(l): if not l: @@ -21,18 +54,122 @@ def language_from_stream(l): raise LanguageError() +def wrap_forced(f): + def inner(*args, **kwargs): + """ + classmethod wrapper + :param args: args[0] = cls + :param kwargs: + :return: + """ + args = list(args) + cls = args[0] + args = args[1:] + s = args.pop(0) + forced = None + hi = None + if isinstance(s, (str,)): + base, forced = s.split(":") if ":" in s else (s, False) + else: + base = s + + instance = f(cls, base, *args, **kwargs) + if isinstance(instance, Language): + instance.forced = forced == "forced" + instance.hi = hi == "hi" + return instance + + return inner + + class Language(Language_): + forced = False + hi = False + + def __init__(self, language, country=None, script=None, unknown=None, forced=False, hi=False): + self.forced = forced + self.hi = hi + super(Language, self).__init__(language, country=country, script=script, unknown=unknown) + + def __getstate__(self): + return self.alpha3, self.country, self.script, self.hi, self.forced + + def __setstate__(self, forced): + self.alpha3, self.country, self.script, self.hi, self.forced = forced + + def __hash__(self): + return hash(str(self)) + + def __eq__(self, other): + if isinstance(other, basestr): + return str(self) == other + if not isinstance(other, Language): + return False + return (self.alpha3 == other.alpha3 and + self.country == other.country and + self.script == other.script and + bool(self.forced) == bool(other.forced) and + bool(self.hi) == bool(other.hi)) + + def __str__(self): + return super(Language, self).__str__() + (":forced" if self.forced else "") + + def __repr__(self): + info = ";".join("{}={}".format(k, v) for k, v in vars(self).items() if v) + return "<{}: {}>".format(self.__class__.__name__, info) + + @property + def basename(self): + return super(Language, self).__str__() + + def __getattr__(self, name): + ret = super(Language, self).__getattr__(name) + if isinstance(ret, Language): + ret.forced = self.forced + ret.hi = self.hi + return ret + + @classmethod + def rebuild(cls, instance, **replkw): + state = instance.__getstate__() + attrs = ("country", "script", "hi", "forced") + language = state[0] + kwa = dict(list(zip(attrs, state[1:]))) + kwa.update(replkw) + return cls(language, **kwa) + @classmethod + @wrap_forced + def fromcode(cls, code, converter): + return Language(*Language_.fromcode(code, converter).__getstate__()) + + @classmethod + @wrap_forced def fromietf(cls, ietf): - if ietf in repl_map: - ietf = repl_map[ietf] + ietf_lower = ietf.lower() + if ietf_lower in repl_map: + ietf = repl_map[ietf_lower] - return Language_.fromietf(ietf) + return Language(*Language_.fromietf(ietf).__getstate__()) @classmethod + @wrap_forced def fromalpha3b(cls, s): if s in repl_map: s = repl_map[s] - return Language_.fromietf(s) + return Language(*Language_.fromietf(s).__getstate__()) + + return Language(*Language_.fromalpha3b(s).__getstate__()) + + +IETF_MATCH = ".+\.([^-.]+)(?:-[A-Za-z]+)?$" +ENDSWITH_LANGUAGECODE_RE = re.compile("\.([^-.]{2,3})(?:-[A-Za-z]{2,})?$") + - return Language_.fromalpha3b(s) +def match_ietf_language(s, ietf=False): + language_match = re.match(".+\.([^\.]+)$" if not ietf + else IETF_MATCH, s) + if language_match and len(language_match.groups()) == 1: + language = language_match.groups()[0] + return language + return s diff --git a/Contents/Libraries/Shared/subzero/lib/dict.py b/Contents/Libraries/Shared/subzero/lib/dict.py index 3f327dcf4..929a9a642 100644 --- a/Contents/Libraries/Shared/subzero/lib/dict.py +++ b/Contents/Libraries/Shared/subzero/lib/dict.py @@ -107,6 +107,12 @@ def __init__(self, **entries): for key, value in entries.iteritems(): self.__dict__[key] = (Dicked(**value) if isinstance(value, dict) else value) + def has(self, key): + return self._entries is not None and key in self._entries + + def get(self, key, default=None): + return self._entries.get(key, default) if self._entries else default + def __repr__(self): return str(self) diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py index 443df8cdb..c56a0c809 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/data.py @@ -1,48 +1,60 @@ import re from collections import OrderedDict -data = {'dan': {'BeginLines': {'data': OrderedDict(), +data = {'bos': {'BeginLines': {'data': OrderedDict(), + 'pattern': None}, + 'EndLines': {'data': OrderedDict(), + 'pattern': None}, + 'PartialLines': {'data': OrderedDict([(u'da nadjem', u'na\u0107i'), (u'da nadjes', u'na\u0107i'), (u'da budes', u'biti'), (u'da ides', u'i\u0107i'), (u'da prodemo', u'pro\u0107i'), (u'da udem', u'u\u0107i'), (u'gdje ides', u'kamo ide\u0161'), (u'Gdje ides', u'Kamo ide\u0161'), (u'hocu da budem', u'\u017eelim biti'), (u'Hocu da budem', u'\u017delim biti'), (u'hocu da kazem', u'\u017eelim re\u0107i'), (u'hoces da kazes', u'\u017eeli\u0161 re\u0107i'), (u'hoce da kaze', u'\u017eeli re\u0107i'), (u'kao sto sam', u'kao \u0161to sam'), (u'me leda', u'me le\u0111a'), (u'medu nama', u'me\u0111u nama'), (u'moramo da idemo', u'moramo i\u0107i'), (u'moras da ides', u'mora\u0161 i\u0107i'), (u'na vecer', u'nave\u010der'), (u'Na vecer', u'Nave\u010der'), (u'ne cu', u'ne\u0107u'), (u'ne ces', u'ne\u0107e\u0161'), (u'ne\u0161to sto', u'ne\u0161to \u0161to'), (u'ono sto', u'ono \u0161to'), (u'Ono sto', u'Ono \u0161to'), (u'reci \u0107u', u're\u0107i \u0107u'), (u'sto ti se ne', u'\u0161to ti se ne'), (u'sto vise', u'\u0161to vi\u0161e'), (u'sve sto', u'sve \u0161to'), (u'Zao mi', u'\u017dao mi'), (u'zao mi', u'\u017eao mi'), (u'Zato sto', u'Zato \u0161to'), (u'zato sto', u'zato \u0161to'), (u'znas sto', u'zna\u0161 \u0161to'), (u'zna\u0161 sto', u'zna\u0161 \u0161to')]), + 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:da\\ nadjem|da\\ nadjes|da\\ budes|da\\ ides|da\\ prodemo|da\\ udem|gdje\\ ides|Gdje\\ ides|hocu\\ da\\ budem|Hocu\\ da\\ budem|hocu\\ da\\ kazem|hoces\\ da\\ kazes|hoce\\ da\\ kaze|kao\\ sto\\ sam|me\\ leda|medu\\ nama|moramo\\ da\\ idemo|moras\\ da\\ ides|na\\ vecer|Na\\ vecer|ne\\ cu|ne\\ ces|ne\\\u0161to\\ sto|ono\\ sto|Ono\\ sto|reci\\ \\\u0107u|sto\\ ti\\ se\\ ne|sto\\ vise|sve\\ sto|Zao\\ mi|zao\\ mi|Zato\\ sto|zato\\ sto|znas\\ sto|zna\\\u0161\\ sto)(?:(?=\\s)|(?=$)|(?=\\b))'}, + 'PartialWordsAlways': {'data': OrderedDict(), + 'pattern': None}, + 'WholeLines': {'data': OrderedDict(), + 'pattern': None}, + 'WholeWords': {'data': OrderedDict([(u'andele', u'an\u0111ele'), (u'andeli', u'an\u0111eli'), (u'bacas', u'baca\u0161'), (u'bas', u'ba\u0161'), (u'Bas', u'Ba\u0161'), (u'basta', u'vrt'), (u'Basta', u'Vrt'), (u'baste', u'vrtovi'), (u'Baste', u'Vrtovi'), (u'basti', u'vrtu'), (u'Basti', u'Vrtu'), (u'bastom', u'vrtom'), (u'Bastom', u'Vrtom'), (u'bastu', u'vrt'), (u'Bastu', u'Vrt'), (u'Bice', u'Bi\u0107e'), (u'bice', u'bi\u0107e'), (u'Bice\u0161', u'Bit \u0107e\u0161'), (u'Bicu', u'Bit \u0107u'), (u'bicu', u'bi\u0107u'), (u'blagonaklonoscu', u'blagonaklono\u0161\u0107u'), (u'blizi', u'bli\u017ei'), (u'bljesti', u'blije\u0161ti'), (u'Bljesti', u'Blije\u0161ti'), (u'bojis', u'boji\u0161'), (u'braca', u'bra\u0107a'), (u'Braca', u'Bra\u0107a'), (u'broncane', u'bron\u010dane'), (u'broncanu', u'bron\u010danu'), (u'budes', u'bude\u0161'), (u'caj', u'\u010daj'), (u'caja', u'\u010daja'), (u'Cak', u'\u010cak'), (u'cak', u'\u010dak'), (u'cale', u'tata'), (u'Cao', u'\u0106ao'), (u'cao', u'\u0107ao'), (u'cas', u'sat'), (u'casno', u'\u010dasno'), (u'Casno', u'\u010casno'), (u'castis', u'\u010dasti\u0161'), (u'casu', u'ca\u0161u'), (u'ca\u0161u', u'\u010da\u0161u'), (u'cebe', u'deku'), (u'cega', u'\u010dega'), (u'Cek', u'\u010cek'), (u'cek', u'\u010dek'), (u'cekali', u'\u010dekali'), (u'cekas', u'\u010deka\u0161'), (u'Cemu', u'\u010cemu'), (u'cemu', u'\u010demu'), (u'cerka', u'k\u0107i'), (u'Cerka', u'K\u0107i'), (u'cerke', u'k\u0107eri'), (u'Cerke', u'K\u0107eri'), (u'cerku', u'k\u0107er'), (u'Cerku', u'K\u0107er'), (u'ces', u'\u0107e\u0161'), (u'cesce', u'\u010de\u0161\u0107e'), (u'Cesce', u'\u010ce\u0161\u0107e'), (u'Ceskoj', u'\u010ce\u0161koj'), (u'cestitki', u'\u010destitki'), (u'cesto', u'\u010desto'), (u'Cesto', u'\u010cesto'), (u'cetiri', u'\u010detiri'), (u'Cetiri', u'\u010cetiri'), (u'cetri', u'\u010detiri'), (u'cetu', u'\u010detu'), (u'ceznja', u'\u010de\u017enja'), (u'ceznje', u'\u010de\u017enje'), (u'ceznji', u'\u010de\u017enji'), (u'ceznjom', u'\u010de\u017enjom'), (u'ceznju', u'\u010de\u017enju'), (u'ceznu', u'\u010deznu'), (u'ce\u0161', u'\u0107e\u0161'), (u'Cija', u'\u010cija'), (u'cija', u'\u010dija'), (u'cije', u'\u010dije'), (u'Ciji', u'\u010ciji'), (u'ciji', u'\u010diji'), (u'cijih', u'\u010dijih'), (u'Cijih', u'\u010cijih'), (u'cijim', u'\u010dijim'), (u'Cijim', u'\u010cijim'), (u'Cim', u'\u010cim'), (u'cim', u'\u010dim'), (u'cime', u'\u010dime'), (u'cinila', u'\u010dinila'), (u'cinili', u'\u010dinili'), (u'cinio', u'\u010dinio'), (u'cinis', u'\u010dini\u0161'), (u'ciniti', u'\u010diniti'), (u'cipka', u'\u010dipka'), (u'cipku', u'\u010dipku'), (u'cita', u'\u010dita'), (u'citao', u'\u010ditao'), (u'citas', u'\u010dita\u0161'), (u'citavu', u'\u010ditavu'), (u'cizme', u'\u010dizme'), (u'clan', u'\u010dlan'), (u'Clan', u'\u010clan'), (u'clanke', u'\u010dlanke'), (u'clanove', u'\u010dlanove'), (u'clanovi', u'\u010dlanovi'), (u'clanovima', u'\u010dlanovima'), (u'cmo', u'\u0107emo'), (u'corsokak', u'slijepa ulica'), (u'corsokaku', u'slijepoj ulici'), (u'cosak', u'ugao'), (u'cosku', u'uglu'), (u'covece', u'\u010dovje\u010de'), (u'covek', u'\u010dovjek'), (u'covjece', u'\u010dovje\u010de'), (u'covjecnost', u'\u010dovje\u010dnost'), (u'covjek', u'\u010dovjek'), (u'covjeka', u'\u010dovjeka'), (u'covjeku', u'\u010dovjeku'), (u'crpeci', u'crpe\u0107i'), (u'cte', u'\u0107ete'), (u'Cu', u'\u0106u'), (u'Ce\u0161', u'\u0106e\u0161'), (u'Ce', u'\u0106e'), (u'Cemo', u'\u0106emo'), (u'Cete', u'\u0106ete'), (u'cu', u'\u0107u'), (u'ce', u'\u0107e'), (u'cemo', u'\u0107emo'), (u'cete', u'\u0107ete'), (u'cudi', u'\u010dudi'), (u'Cudo', u'\u010cudo'), (u'cudo', u'\u010dudo'), (u'Cujte', u'\u010cujte'), (u'cula', u'\u010dula'), (u'culi', u'\u010duli'), (u'Culi', u'\u010culi'), (u'culima', u'\u010dulima'), (u'cuo', u'\u010duo'), (u'Cuo', u'\u010cuo'), (u'cupam', u'\u010dupam'), (u'cutanje', u'\u0161utnja'), (u'Cutanje', u'\u0160utnja'), (u'cutao', u'\u0161utio'), (u'Cutao', u'\u0160utio'), (u'cuti', u'\u010duti'), (u'cutljiv', u'\u0161utljiv'), (u'cutnja', u'\u0161utnja'), (u'cuvali', u'\u010duvali'), (u'cuveni', u'\u010duveni'), (u'dace', u'dat \u0107e'), (u'dacemo', u'dat \u0107emo'), (u'davo', u'vrag'), (u'definise', u'definira'), (u'definisi', u'definiraj'), (u'Desava', u'Doga\u0111a'), (u'desava', u'doga\u0111a'), (u'disemo', u'di\u0161emo'), (u'disi', u'di\u0161i'), (u'dobijes', u'dobije\u0161'), (u'dobivas', u'dobiva\u0161'), (u'doci', u'do\u0107i'), (u'dode', u'do\u0111e'), (u'dodem', u'do\u0111em'), (u'dodes', u'do\u0111e\u0161'), (u'dodete', u'do\u0111ete'), (u'dode\u0161', u'do\u0111e\u0161'), (u'Dodi', u'Do\u0111i'), (u'dodi', u'do\u0111i'), (u'dodite', u'do\u0111ite'), (u'Dodji', u'Do\u0111i'), (u'dodji', u'do\u0111i'), (u'Dodjite', u'Do\u0111ite'), (u'dodjite', u'do\u0111ite'), (u'Dodju', u'Do\u0111u'), (u'dodju', u'do\u0111u'), (u'dodu', u'do\u0111u'), (u'dolazis', u'dolazi\u0161'), (u'dopustao', u'dopu\u0161tao'), (u'dorucak', u'doru\u010dak'), (u'dorucku', u'doru\u010dku'), (u'Dosao', u'Do\u0161ao'), (u'dosao', u'do\u0161ao'), (u'drhteci', u'drhte\u0107i'), (u'drhte\u0107i', u'drhte\u0107i'), (u'Drhte\u0107i', u'Drhte\u0107i'), (u'drugacija', u'druga\u010dija'), (u'Drugacije', u'Druga\u010dije'), (u'drugacije', u'druga\u010dije'), (u'drugaciji', u'druga\u010diji'), (u'Drugaciji', u'Druga\u010diji'), (u'drukciji', u'druga\u010diji'), (u'drveca', u'drve\u0107a'), (u'drvece', u'drve\u0107e'), (u'drvecem', u'drve\u0107em'), (u'drvecu', u'drve\u0107u'), (u'drzi', u'dr\u017ei'), (u'Drzim', u'Dr\u017eim'), (u'dugmici', u'gumbi\u0107i'), (u'duze', u'du\u017ee'), (u'duzinom', u'du\u017einom'), (u'dzanki', u'ovisnik'), (u'Dzejk', u'Jake'), (u'Dzime', u'Jime'), (u'Dzone', u'Johne'), (u'flasom', u'fla\u0161om'), (u'flasu', u'fla\u0161u'), (u'fucka', u'fu\u0107ka'), (u'funkcionisu', u'funkcioniraju'), (u'gacice', u'ga\u0107ice'), (u'gadao', u'ga\u0111ao'), (u'gadis', u'gadi\u0161'), (u'Gadis', u'Gadi\u0161'), (u'gdica', u'g\u0111ica'), (u'gdice', u'g\u0111ice'), (u'gdici', u'g\u0111ici'), (u'gdicu', u'g\u0111icu'), (u'gdu', u'g\u0111u'), (u'glupaco', u'glupa\u010do'), (u'govoris', u'govori\u0161'), (u'gradani', u'gra\u0111ani'), (u'gradic', u'gradi\u0107'), (u'gradica', u'gradi\u0107a'), (u'gradicu', u'gradi\u0107u'), (u'grancica', u'gran\u010dica'), (u'grancicu', u'gran\u010dicu'), (u'gresci', u'gre\u0161ci'), (u'grese', u'grije\u0161e'), (u'greski', u'gre\u0161ci'), (u'gresku', u'gre\u0161ku'), (u'gubis', u'gubi\u0161'), (u'Hoces', u'Ho\u0107e\u0161'), (u'hoces', u'ho\u0107e\u0161'), (u'hocu', u'ho\u0107u'), (u'Hocu', u'Ho\u0107u'), (u'hodas', u'hoda\u0161'), (u'htjeo', u'htio'), (u'iceg', u'i\u010deg'), (u'icega', u'i\u010dega'), (u'icemu', u'i\u010demu'), (u'Ici', u'I\u0107i'), (u'ici', u'i\u0107i'), (u'Ides', u'Ide\u0161'), (u'ides', u'ide\u0161'), (u'iduce', u'idu\u0107e'), (u'iduceg', u'idu\u0107eg'), (u'iducem', u'idu\u0107em'), (u'Iduci', u'Idu\u0107i'), (u'iduci', u'idu\u0107i'), (u'ignorisi', u'ignoriraju'), (u'igras', u'igra\u0161'), (u'Ijudi', u'ljudi'), (u'imas', u'ima\u0161'), (u'imidz', u'imid\u017e'), (u'inace', u'ina\u010de'), (u'Inace', u'Ina\u010de'), (u'isao', u'i\u0161ao'), (u'Isao', u'I\u0161ao'), (u'iscupao', u'i\u0161\u010dupao'), (u'ise\u0107emo', u'izrezati'), (u'isla', u'i\u0161la'), (u'istjece', u'istje\u010de'), (u'istrazio', u'istrazio'), (u'Istrazio', u'Istrazio'), (u'isuvise', u'previ\u0161e'), (u'izaci', u'iza\u0107i'), (u'Izaci', u'Iza\u0107i'), (u'izade', u'iza\u0111e'), (u'Izade', u'Iza\u0111e'), (u'izadem', u'iza\u0111em'), (u'izades', u'iza\u0111e\u0161'), (u'izadete', u'iza\u0111ete'), (u'Izadi', u'Iza\u0111i'), (u'izadi', u'iza\u0111i'), (u'izasao', u'iza\u0161ao'), (u'izasla', u'iza\u0161la'), (u'izici', u'izi\u0107i'), (u'izluduje', u'izlu\u0111uje'), (u'izluduju', u'izlu\u0111uju'), (u'izmedu', u'izme\u0111u'), (u'Izmedu', u'Izme\u0111u'), (u'izostri', u'izo\u0161tri'), (u'izostrim', u'izo\u0161trim'), (u'izvuci', u'izvu\u0107i'), (u'i\u0161cupao', u'i\u0161\u010dupao'), (u'jebes', u'jebe\u0161'), (u'Jebes', u'Jebe\u0161'), (u'jos', u'jo\u0161'), (u'Jos', u'Jo\u0161'), (u'juce', u'ju\u010der'), (u'Juce', u'Ju\u010der'), (u'jucer', u'ju\u010der'), (u'Jucer', u'Ju\u010der'), (u'kaslja', u'ka\u0161lja'), (u'kaze', u'ka\u017ee'), (u'Kaze', u'Ka\u017ee'), (u'kazemo', u'ka\u017eemo'), (u'kazite', u'ka\u017eite'), (u'Kazite', u'Ka\u017eite'), (u'kazu', u'ka\u017eu'), (u'Kcer', u'K\u0107er'), (u'kcer', u'k\u0107er'), (u'kcerka', u'k\u0107i'), (u'Kcerka', u'K\u0107i'), (u'kcerkama', u'k\u0107erima'), (u'kcerku', u'k\u0107er'), (u'Kcerku', u'K\u0107er'), (u'kecap', u'ke\u010dap'), (u'kecapa', u'ke\u010dapa'), (u'kise', u'ki\u0161e'), (u'kisi', u'ki\u0161i'), (u'kleknes', u'klekne\u0161'), (u'kociji', u'ko\u010diji'), (u'kolaca', u'kola\u010da'), (u'kolace', u'kola\u010de'), (u'komadic', u'komadi\u0107'), (u'komsijama', u'susjedima'), (u'komsije', u'susjedi'), (u'komsiji', u'susjedu'), (u'komsiluk', u'susjedstvo'), (u'komsiluku', u'susjedstvu'), (u'kom\u0161ija', u'susjed'), (u'Kom\u0161ija', u'Susjed'), (u'Konkurise', u'Konkurira'), (u'konkurise', u'konkurira'), (u'konkurisem', u'konkuriram'), (u'konkurisu', u'konkuriraju'), (u'kontrolisu', u'kontroliraju'), (u'kosulja', u'ko\u0161ulja'), (u'kosulje', u'ko\u0161ulje'), (u'kosulji', u'ko\u0161ulji'), (u'kosulju', u'ko\u0161ulju'), (u'kovceg', u'kov\u010deg'), (u'kovcegu', u'kov\u010degu'), (u'krada', u'kra\u0111a'), (u'Krada', u'Kra\u0111a'), (u'Krece', u'Kre\u0107e'), (u'krece', u'kre\u0107e'), (u'Kreci', u'Kre\u0107i'), (u'kreci', u'kre\u0107i'), (u'krecu', u'kre\u0107u'), (u'kre\u0107es', u'kre\u0107e\u0161'), (u'krosnje', u'kro\u0161nje'), (u'krvaris', u'krvari\u0161'), (u'kuca', u'ku\u0107a'), (u'kucama', u'ku\u0107ama'), (u'kuce', u'ku\u0107e'), (u'kuci', u'ku\u0107i'), (u'kusa', u'ku\u0161a'), (u'kusas', u'ku\u0161a\u0161'), (u'ku\u010da', u'ku\u0107a'), (u'ku\u010di', u'ku\u0107i'), (u'lakocom', u'lako\u0107om'), (u'laz', u'la\u017e'), (u'lazac', u'la\u017eljivac'), (u'laze', u'la\u017ee'), (u'lazi', u'la\u017ei'), (u'lazne', u'la\u017ene'), (u'lazni', u'la\u017eni'), (u'lazov', u'la\u017eljivac'), (u'ledja', u'le\u0111a'), (u'ledjima', u'le\u0111ima'), (u'leprsa', u'lepr\u0161a'), (u'lezala', u'le\u017eala'), (u'lezali', u'le\u017eali'), (u'lezati', u'le\u017eati'), (u'lezis', u'le\u017ei\u0161'), (u'Lezis', u'Le\u017ei\u0161'), (u'lici', u'li\u010di'), (u'licim', u'li\u010dim'), (u'licis', u'li\u010di\u0161'), (u'licnost', u'li\u010dnost'), (u'licnosti', u'li\u010dnosti'), (u'lijecniku', u'lije\u010dniku'), (u'ljubis', u'ljubi\u0161'), (u'los', u'lo\u0161'), (u'losa', u'lo\u0161a'), (u'losu', u'lo\u0161u'), (u'majcine', u'maj\u010dine'), (u'masini', u'ma\u0161ini'), (u'medu', u'me\u0111u'), (u'Medutim', u'Me\u0111utim'), (u'medutim', u'me\u0111utim'), (u'mici', u'mi\u010di'), (u'Mici', u'Mi\u010di'), (u'micu', u'mi\u010du'), (u'mislis', u'misli\u0161'), (u'Mislis', u'Misli\u0161'), (u'mjesecevom', u'mjese\u010devom'), (u'mjesecine', u'mjese\u010dine'), (u'mjesecini', u'mjese\u010dini'), (u'mjesecinu', u'mjese\u010dinu'), (u'mladic', u'mladi\u0107'), (u'moc', u'mo\u0107'), (u'moci', u'mo\u0107i'), (u'motivisu', u'motiviraju'), (u'mozda', u'mo\u017eda'), (u'Mozda', u'Mo\u017eda'), (u'moze', u'mo\u017ee'), (u'mozete', u'mo\u017eete'), (u'mreza', u'mre\u017ea'), (u'mrezu', u'mre\u017eu'), (u'mrzis', u'mrzi\u0161'), (u'muce', u'mu\u010de'), (u'mucenik', u'mu\u010denik'), (u'mucne', u'mu\u010dne'), (u'muska', u'mu\u0161ka'), (u'muz', u'mu\u017e'), (u'muza', u'mu\u017ea'), (u'naci', u'na\u0107i'), (u'Naci', u'Na\u0107i'), (u'nacin', u'na\u010din'), (u'nadem', u'na\u0111em'), (u'Nadem', u'Na\u0111em'), (u'nademo', u'na\u0111emo'), (u'nades', u'na\u0111e\u0161'), (u'Nades', u'Na\u0111e\u0161'), (u'nadete', u'na\u0111ete'), (u'nadici', u'nadi\u0107i'), (u'nadje', u'na\u0111e'), (u'Nadje', u'Na\u0111e'), (u'nadjen', u'na\u0111en'), (u'nadjes', u'na\u0111e\u0161'), (u'Nadjes', u'Na\u0111e\u0161'), (u'nadjete', u'na\u0111ete'), (u'nagovestaj', u'nagovje\u0161taj'), (u'najvise', u'najvise'), (u'Najvise', u'Najvi\u0161e'), (u'naklonoscu', u'nakolono\u0161\u0107u'), (u'naocale', u'nao\u010dale'), (u'Napisite', u'Napi\u0161ite'), (u'nasa', u'na\u0161a'), (u'Nase', u'Na\u0161e'), (u'nase', u'na\u0161e'), (u'naseg', u'na\u0161eg'), (u'nasi', u'na\u0161i'), (u'Nasi', u'Na\u0161i'), (u'nasao', u'na\u0161ao'), (u'Nasao', u'Na\u0161ao'), (u'nasla', u'na\u0161la'), (u'Nasla', u'Na\u0161la'), (u'nasli', u'na\u0161li'), (u'Nasli', u'Na\u0161li'), (u'nasoj', u'na\u0161oj'), (u'nasrecu', u'na sre\u0107u'), (u'nastavis', u'nastavi\u0161'), (u'nasu', u'na\u0161u'), (u'nauce', u'nau\u010de'), (u'neceg', u'ne\u010deg'), (u'necega', u'ne\u010dega'), (u'necemo', u'ne\u0107emo'), (u'necemu', u'ne\u010demu'), (u'necije', u'ne\u010dije'), (u'neciji', u'ne\u010diji'), (u'necim', u'ne\u010dim'), (u'necovjecnost', u'ne\u010dovje\u010dnost'), (u'necovjecnosti', u'ne\u010dovje\u010dnosti'), (u'necu', u'ne\u0107u'), (u'Necu', u'Ne\u0107u'), (u'nekaze', u'ne ka\u017ee'), (u'nekoc', u'neko\u0107'), (u'Nemas', u'Nema\u0161'), (u'nemas', u'nema\u0161'), (u'Nesreca', u'Nesre\u0107a'), (u'nesto', u'ne\u0161to'), (u'Nesto', u'Ne\u0161to'), (u'new yorski', u'njujor\u0161ki'), (u'Nezan', u'Nje\u017ean'), (u'nezan', u'nje\u017ean'), (u'nezna', u'nje\u017ena'), (u'Neznam', u'Ne znam'), (u'Neznas', u'Ne znas'), (u'Neznajuci', u'Ne znaju\u0107i'), (u'Neznavsi', u'Ne znav\u0161i'), (u'neznam', u'ne znam'), (u'neznas', u'ne znas'), (u'neznajuci', u'ne znaju\u0107i'), (u'neznavsi', u'ne znav\u0161i'), (u'nezni', u'nje\u017eni'), (u'neznih', u'nje\u017enih'), (u'neznim', u'nje\u017enim'), (u'nezno', u'nje\u017eno'), (u'neznu', u'nje\u017enu'), (u'niceg', u'ni\u010deg'), (u'nicega', u'ni\u010dega'), (u'nicemu', u'ni\u010demu'), (u'nicija', u'ni\u010dija'), (u'niciji', u'ni\u010diji'), (u'nicim', u'ni\u010dim'), (u'njezno', u'nje\u017eno'), (u'nju jorski', u'njujor\u0161ki'), (u'noci', u'no\u0107i'), (u'nocnu', u'no\u0107nu'), (u'nosac', u'nosa\u010d'), (u'nosices', u'nosit \u0107e\u0161'), (u'nosis', u'nosi\u0161'), (u'noz', u'no\u017e'), (u'nozem', u'no\u017eem'), (u'Obecao', u'Obe\u0107ao'), (u'Obezbedjuju', u'Osiguravaju'), (u'obezbedjuju', u'osiguravaju'), (u'obide', u'obi\u0111e'), (u'objasnis', u'objasni\u0161'), (u'obozavalac', u'obo\u017eavatelj'), (u'obracas', u'obra\u0107a\u0161'), (u'obra\u0107as', u'obra\u0107a\u0161'), (u'obuce', u'obu\u010de'), (u'obucem', u'obu\u010dem'), (u'oceve', u'o\u010deve'), (u'ocito', u'o\u010dito'), (u'ocnjaci', u'o\u010dnjaci'), (u'odes', u'ode\u0161'), (u'odlazis', u'odlazi\u0161'), (u'odlezati', u'odle\u017eati'), (u'odlucim', u'odlu\u010dim'), (u'odmice', u'odmi\u010de'), (u'odraduje', u'odra\u0111uje'), (u'odreden', u'odre\u0111en'), (u'odreduje', u'odre\u0111uje'), (u'odredujemo', u'odre\u0111ujemo'), (u'odvec', u'odve\u0107'), (u'ogrtac', u'ogrta\u010d'), (u'ohrabrujuce', u'ohrabruju\u0107e'), (u'ojacam', u'oja\u010dam'), (u'okrece', u'okre\u0107e'), (u'opasac', u'opasa\u010d'), (u'operise', u'operira'), (u'operisemo', u'operiramo'), (u'operisete', u'operirate'), (u'operise\u0161', u'operira\u0161'), (u'osecaces', u'osje\u0107at \u0107e\u0161'), (u'osjecaces', u'osje\u0107at \u0107e\u0161'), (u'osjecam', u'osje\u0107am'), (u'osjecanja', u'osje\u0107anja'), (u'oslobada', u'osloba\u0111a'), (u'ostra', u'o\u0161tra'), (u'ostre', u'o\u0161tre'), (u'ostri', u'o\u0161tri'), (u'ostrom', u'o\u0161trom'), (u'ostru', u'o\u0161tru'), (u'osvrnes', u'osvrne\u0161'), (u'Osvrnes', u'Osvrne\u0161'), (u'otezala', u'ote\u017eala'), (u'otidi', u'oti\u0111i'), (u'otidji', u'oti\u0111i'), (u'otisao', u'oti\u0161ao'), (u'oziljak', u'o\u017eiljak'), (u'palaca', u'pala\u010da'), (u'palaci', u'pala\u010di'), (u'palacu', u'pala\u010du'), (u'papucama', u'papu\u010dama'), (u'parce', u'komadi\u0107'), (u'pateci', u'pate\u0107i'), (u'patis', u'pati\u0161'), (u'pcela', u'p\u010dela'), (u'pcele', u'p\u010dele'), (u'pecini', u'pe\u0107ini'), (u'pecinski', u'pe\u0107inski'), (u'peraca', u'pera\u010da'), (u'Peraci', u'Pera\u010di'), (u'pica', u'pi\u0107a'), (u'pice', u'pi\u0107e'), (u'picem', u'pi\u0107em'), (u'pijes', u'pije\u0161'), (u'pisacoj', u'pisa\u0107oj'), (u'pise', u'pi\u0161e'), (u'pisem', u'pi\u0161em'), (u'pisemo', u'pi\u0161emo'), (u'pises', u'pi\u0161e\u0161'), (u'pisite', u'pi\u0161ite'), (u'pisu', u'pi\u0161u'), (u'pitas', u'pita\u0161'), (u'placa', u'pla\u0107a'), (u'placam', u'pla\u0107am'), (u'placanje', u'pla\u0107anje'), (u'placanjem', u'pla\u0107anjem'), (u'place', u'pla\u010de'), (u'placem', u'pla\u010dem'), (u'placete', u'pla\u010dete'), (u'place\u0161', u'pla\u010de\u0161'), (u'placu', u'pla\u0107u'), (u'placuci', u'pla\u010du\u0107i'), (u'Plasi', u'Boji'), (u'plazi', u'pla\u017ei'), (u'plazu', u'pla\u017eu'), (u'plese', u'ple\u0161e'), (u'plesemo', u'ple\u0161emo'), (u'plesete', u'ple\u0161ete'), (u'plesu', u'ple\u0161u'), (u'ploca', u'plo\u010da'), (u'ploce', u'plo\u010de'), (u'pluca', u'plu\u0107a'), (u'plucima', u'plu\u0107ima'), (u'pobjeci', u'pobje\u0107i'), (u'pobjeduje', u'pobje\u0111uje'), (u'poceli', u'po\u010deli'), (u'poceo', u'po\u010deo'), (u'pocetak', u'po\u010detak'), (u'pocevsi', u'po\u010dev\u0161i'), (u'pocev\u0161i', u'po\u010dev\u0161i'), (u'poci', u'po\u0107i'), (u'pocinje', u'po\u010dinje'), (u'pociva', u'po\u010diva'), (u'pocivali', u'po\u010divali'), (u'pocivao', u'po\u010divao'), (u'pode', u'po\u0111e'), (u'podi', u'po\u0111i'), (u'podici', u'podi\u0107i'), (u'Podici', u'Podi\u0107i'), (u'podimo', u'po\u0111imo'), (u'Podimo', u'Po\u0111imo'), (u'podje', u'po\u0111e'), (u'Podje', u'Po\u0111e'), (u'Podji', u'Po\u0111i'), (u'podji', u'po\u0111i'), (u'podneses', u'podnese\u0161'), (u'podocnjacima', u'podo\u010dnjacima'), (u'podocnjake', u'podo\u010dnjake'), (u'podstice', u'poti\u010de'), (u'poduzeca', u'poduze\u0107a'), (u'poduzece', u'poduze\u0107e'), (u'poduzecu', u'poduze\u0107u'), (u'pojesce', u'pojest \u0107e'), (u'pojiliste', u'pojili\u0161te'), (u'pokazi', u'poka\u017ei'), (u'Pokazi', u'Poka\u017ei'), (u'pokrece', u'pokre\u0107e'), (u'pokusaj', u'poku\u0161aj'), (u'pokusam', u'poku\u0161am'), (u'pokusas', u'poku\u0161a\u0161'), (u'poletis', u'poleti\u0161'), (u'polozaja', u'polo\u017eaja'), (u'polozaju', u'polo\u017eaju'), (u'pomaci', u'pomaknuti'), (u'pomazes', u'poma\u017ee\u0161'), (u'pomislis', u'pomisli\u0161'), (u'pomognes', u'pomogne\u0161'), (u'poneses', u'ponese\u0161'), (u'ponovis', u'ponovi\u0161'), (u'poreci', u'pore\u0107i'), (u'porice', u'pori\u010de'), (u'posalji', u'po\u0161alji'), (u'Posalji', u'Po\u0161alji'), (u'posaljite', u'po\u0161aljite'), (u'posle', u'poslije'), (u'posluzili', u'poslu\u017eili'), (u'Posluzite', u'Poslu\u017eite'), (u'posluzite', u'poslu\u017eite'), (u'postaras', u'pobrine\u0161'), (u'posto', u'po\u0161to'), (u'Posto', u'Po\u0161to'), (u'potece', u'pote\u010de'), (u'potice', u'poti\u010de'), (u'potici', u'poti\u010di'), (u'potjece', u'potje\u010de'), (u'potjecem', u'potje\u010dem'), (u'potjeces', u'potje\u010de\u0161'), (u'potpises', u'potpi\u0161e\u0161'), (u'povedes', u'povede\u0161'), (u'pozuda', u'po\u017euda'), (u'pozude', u'po\u017eude'), (u'pozudi', u'po\u017eudi'), (u'pozudu', u'po\u017eudu'), (u'prakticno', u'prakti\u010dno'), (u'premasuje', u'prema\u0161uje'), (u'premasuju', u'prema\u0161uju'), (u'preporuca', u'preporu\u010duje'), (u'presao', u'pre\u0161ao'), (u'presjecen', u'presje\u010den'), (u'Previse', u'Previ\u0161e'), (u'previse', u'previ\u0161e'), (u'preziveo', u'pre\u017eivio'), (u'Priblizi', u'Pribli\u017ei'), (u'price', u'pri\u010de'), (u'prici', u'pri\u010di'), (u'pricu', u'pri\u010du'), (u'Pridji', u'Pri\u0111i'), (u'pridji', u'pri\u0111i'), (u'prijeci', u'prije\u0107i'), (u'prijedi', u'prije\u0111i'), (u'prilazis', u'prilazi\u0161'), (u'prisao', u'pri\u0161ao'), (u'priusti', u'priu\u0161ti'), (u'priustimo', u'priu\u0161timo'), (u'priustiti', u'priu\u0161titi'), (u'proci', u'pro\u0107i'), (u'prodavac', u'prodava\u010d'), (u'promasio', u'proma\u0161io'), (u'Promasio', u'Proma\u0161io'), (u'prosao', u'pro\u0161ao'), (u'prosla', u'pro\u0161la'), (u'Prosle', u'Pro\u0161le'), (u'prosle', u'pro\u0161le'), (u'prosli', u'pro\u0161li'), (u'Prosli', u'Pro\u0161li'), (u'proslim', u'pro\u0161lim'), (u'proslo', u'pro\u0161lo'), (u'Proslo', u'Pro\u0161lo'), (u'provedes', u'provede\u0161'), (u'provlaci', u'provla\u010di'), (u'provlacimo', u'provla\u010dimo'), (u'pticica', u'pti\u010dica'), (u'pticicu', u'pti\u010dicu'), (u'pucini', u'pu\u010dini'), (u'pupcanu', u'pup\u010danu'), (u'pusac', u'pu\u0161a\u010d'), (u'pusaci', u'pu\u0161a\u010di'), (u'pusi', u'pu\u0161i'), (u'pusimo', u'pu\u0161imo'), (u'pusite', u'pu\u0161ite'), (u'pustam', u'pu\u0161tam'), (u'racunare', u'ra\u010dunala'), (u'racunari', u'ra\u010dunala'), (u'radis', u'radi\u0161'), (u'Radis', u'Radi\u0161'), (u'raskosni', u'rasko\u0161ni'), (u'razumes', u'razumije\u0161'), (u'Razumes', u'Razumije\u0161'), (u'rec', u'rije\u010d'), (u'rece', u're\u010de'), (u'Receno', u'Re\u010deno'), (u'receno', u're\u010deno'), (u'recima', u'rije\u010dima'), (u'resimo', u'rije\u0161imo'), (u'rijec', u'rije\u010d'), (u'Rijeci', u'Rije\u010di'), (u'rijedji', u'rje\u0111i'), (u'rjedji', u'rje\u0111i'), (u'Rjesit', u'Rije\u0161it'), (u'rodena', u'ro\u0111ena'), (u'rodeni', u'ro\u0111eni'), (u'rodis', u'rodi\u0161'), (u'rodjen', u'ro\u0111en'), (u'rucno', u'ru\u010dno'), (u'ruza', u'ru\u017ea'), (u'ruzan', u'ru\u017ean'), (u'ruzu', u'ru\u017eu'), (u'sadrze', u'sadr\u017ee'), (u'sadrzi', u'sadr\u017ei'), (u'salje', u'\u0161alje'), (u'saljes', u'\u0161alje\u0161'), (u'salju', u'\u0161alju'), (u'sasila', u'sa\u0161ila'), (u'sasili', u'sa\u0161ili'), (u'sasio', u'sa\u0161io'), (u'sasiti', u'sa\u0161iti'), (u'savescu', u'savje\u0161\u0107u'), (u'savijescu', u'savje\u0161\u0107u'), (u'sedeces', u'sjedit \u0107e\u0161'), (u'sedis', u'sjedi\u0161'), (u'sedista', u'sjedala'), (u'sediste', u'sjedi\u0161te'), (u'sendvic', u'sendvi\u010d'), (u'sesir', u'\u0161e\u0161ir'), (u'sesirom', u'\u0161e\u0161irom'), (u'sest', u'\u0161est'), (u'setala', u'\u0161etala'), (u'setam', u'\u0161etam'), (u'setis', u'sjeti\u0161'), (u'seva', u'\u0161eva'), (u'sevu', u'\u0161evu'), (u'sezdeset', u'\u0161ezdeset'), (u'Sidji', u'Si\u0111i'), (u'sidji', u'si\u0111i'), (u'sijecanj', u'sije\u010danj'), (u'siroki', u'\u0161iroki'), (u'sjecaju', u'sje\u0107aju'), (u'sjecam', u'sje\u0107am'), (u'Sjecam', u'Sje\u0107am'), (u'sjecanja', u'sje\u0107anja'), (u'sjecanje', u'sje\u0107anje'), (u'skace', u'ska\u010de'), (u'skaci', u'ska\u010di'), (u'skacu', u'ska\u010du'), (u'sklanjas', u'sklanja\u0161'), (u'sklonoscu', u'sklono\u0161\u0107u'), (u'sklupcam', u'sklup\u010dam'), (u'skola', u'\u0161kola'), (u'Skola', u'\u0160kola'), (u'Skotska', u'\u0160kotska'), (u'Skotskoj', u'\u0160kotskoj'), (u'skrt', u'\u0161krt'), (u'skrte', u'\u0161krte'), (u'skrusena', u'skru\u0161ena'), (u'Skrusena', u'Skru\u0161ena'), (u'sledeca', u'sljede\u0107a'), (u'Sledece', u'Sljede\u0107e'), (u'sledeci', u'sljede\u0107i'), (u'Sledeci', u'Sljede\u0107i'), (u'slicno', u'sli\u010dno'), (u'sljedeci', u'sljede\u0107i'), (u'Sljedeci', u'Sljede\u0107i'), (u'slozila', u'slo\u017eila'), (u'slozili', u'slo\u017eili'), (u'slozio', u'slo\u017eio'), (u'sloziti', u'slo\u017eiti'), (u'slucaja', u'slu\u010daja'), (u'Smatras', u'Smatra\u0161'), (u'smatras', u'smatra\u0161'), (u'smece', u'sme\u0107e'), (u'smeda', u'sme\u0111a'), (u'smedem', u'sme\u0111em'), (u'smedi', u'sme\u0111i'), (u'smedoj', u'sme\u0111oj'), (u'smedu', u'sme\u0111u'), (u'smesak', u'smje\u0161ak'), (u'Smijes', u'Smije\u0161'), (u'smijes', u'smije\u0161'), (u'smionoscu', u'smiono\u0161\u0107u'), (u'smraci', u'smra\u010di'), (u'smracilo', u'smra\u010dilo'), (u'smrcu', u'smr\u0107u'), (u'snimacete', u'snimat \u0107ete'), (u'sokiras', u'\u0161okira\u0161'), (u'spases', u'spasi\u0161'), (u'Spases', u'Spasi\u0161'), (u'spavaca', u'spava\u0107a'), (u'spavacoj', u'spava\u0107oj'), (u'spominjes', u'spominje\u0161'), (u'spustamo', u'spu\u0161tamo'), (u'srdacan', u'srda\u010dan'), (u'srecom', u'sre\u0107om'), (u'sresce', u'srest \u0107e'), (u'sre\u0161ce', u'srest \u0107e'), (u'srljas', u'srlja\u0161'), (u'Sta', u'\u0160to'), (u'sta', u'\u0161to'), (u'stab', u'sto\u017eer'), (u'Stab', u'Sto\u017eer'), (u'stagod', u'\u0161to god'), (u'stampa', u'tisak'), (u'stampati', u'tiskati'), (u'stampi', u'tisku'), (u'stampom', u'tiskom'), (u'stampu', u'tisak'), (u'standa', u'\u0161tanda'), (u'standu', u'\u0161tandu'), (u'stavis', u'stavi\u0161'), (u'Stavise', u'\u0160tovi\u0161e'), (u'Stavi\u0107emo', u'Stavit \u0107emo'), (u'steceni', u'ste\u010deni'), (u'stezuci', u'ste\u017eu\u0107i'), (u'stici', u'sti\u0107i'), (u'stojis', u'stoji\u0161'), (u'Stojis', u'Stoji\u0161'), (u'stp', u'\u0161to'), (u'strasan', u'stra\u0161an'), (u'strasno', u'stra\u0161no'), (u'sudeci', u'sude\u0107i'), (u'sudenja', u'su\u0111enja'), (u'sudenje', u'su\u0111enje'), (u'sudenju', u'su\u0111enju'), (u'sugerisu', u'predla\u017eu'), (u'sumnjas', u'sumnja\u0161'), (u'sumska', u'\u0161umska'), (u'sumski', u'\u0161umski'), (u'sumskoj', u'\u0161umskoj'), (u'supak', u'\u0161upak'), (u'suraduj', u'sura\u0111uj'), (u'suraduje', u'sura\u0111uje'), (u'suradujemo', u'sura\u0111ujemo'), (u'suraduju', u'sura\u0111uju'), (u'Suraduj', u'Sura\u0111uj'), (u'Suraduje', u'Sura\u0111uje'), (u'Suradujemo', u'Sura\u0111ujemo'), (u'Suraduju', u'Sura\u0111uju'), (u'sustina', u'bit'), (u'sustine', u'biti'), (u'sustini', u'biti'), (u'Sustine', u'Biti'), (u'Sustini', u'Biti'), (u'Sustinom', u'Biti'), (u'sustinom', u'biti'), (u'sustinski', u'bitni'), (u'suti', u'\u0161uti'), (u'Suti', u'\u0160uti'), (u'svacije', u'sva\u010dije'), (u'svaciji', u'sva\u010diji'), (u'svaciju', u'sva\u010diju'), (u'svecan', u'sve\u010dan'), (u'svecani', u'sve\u010dani'), (u'svez', u'svje\u017e'), (u'sveza', u'svje\u017ea'), (u'svezu', u'svje\u017eu'), (u'svezi', u'svje\u017ei'), (u'sveze', u'svje\u017ee'), (u'svezim', u'svje\u017eim'), (u'svezom', u'svje\u017eom'), (u'svezoj', u'svje\u017eoj'), (u'svezinom', u'svje\u017einom'), (u'svezina', u'svje\u017eina'), (u'svezinu', u'svje\u017einu'), (u'svezini', u'svje\u017eini'), (u'svezine', u'svje\u017eine'), (u'Svida', u'Svi\u0111a'), (u'svidala', u'svi\u0111ala'), (u'svidalo', u'svi\u0111alo'), (u'svidam', u'svi\u0111am'), (u'svidao', u'svi\u0111ao'), (u'sviras', u'svira\u0161'), (u'taknes', u'takne\u0161'), (u'takode', u'tako\u0111er'), (u'takoder', u'tako\u0111er'), (u'takodje', u'tako\u0111er'), (u'Takodje', u'Tako\u0111er'), (u'tece', u'te\u010de'), (u'teska', u'te\u0161ka'), (u'Teska', u'Te\u0161ka'), (u'teske', u'te\u0161ke'), (u'teski', u'te\u0161ki'), (u'tesko', u'te\u0161ko'), (u'Tesko', u'Te\u0161ko'), (u'teskom', u'te\u0161kom'), (u'tezak', u'te\u017eak'), (u'Tezak', u'Te\u017eak'), (u'teze', u'te\u017ee'), (u'tezi', u'te\u017ei'), (u'Tezi', u'Te\u017ei'), (u'tezimo', u'te\u017eimo'), (u'Tezimo', u'Te\u017eimo'), (u'tezinu', u'te\u017einu'), (u'tezis', u'te\u017ei\u0161'), (u'Tezi\u0161', u'Te\u017ei\u0161'), (u'tisuce', u'tisu\u0107e'), (u'tisucu', u'tisu\u0107u'), (u'Tocak', u'Kota\u010d'), (u'tocak', u'kota\u010d'), (u'tocka', u'to\u010dka'), (u'tocku', u'to\u010dku'), (u'trajace', u'trajat \u0107e'), (u'Trajace', u'Trajat \u0107e'), (u'trazis', u'tra\u017ei\u0161'), (u'trcao', u'tr\u010dao'), (u'trce', u'tr\u010de'), (u'Trce', u'Tr\u010de'), (u'trci', u'tr\u010di'), (u'Trci', u'Tr\u010di'), (u'trcim', u'tr\u010dim'), (u'Trcim', u'Tr\u010dim'), (u'trcimo', u'tr\u010dimo'), (u'trebas', u'treba\u0161'), (u'Trebas', u'Treba\u0161'), (u'treci', u'tre\u0107i'), (u'tricarija', u'tri\u010darija'), (u'trudis', u'trudi\u0161'), (u'trunuce', u'trunut \u0107e'), (u'tuce', u'tu\u010de'), (u'tuces', u'tu\u010de\u0161'), (u'tucom', u'tu\u010dom'), (u'tucu', u'tu\u010dnjavu'), (u'tudje', u'tu\u0111e'), (u'tudjeg', u'tu\u0111eg'), (u'tudoj', u'tu\u0111oj'), (u'tudom', u'tu\u0111om'), (u'tudjem', u'tu\u0111em'), (u'tudem', u'tu\u0111em'), (u'tumaras', u'tumara\u0161'), (u'tvoris', u'tvori\u0161'), (u'ubedjuju', u'uvjeravaju'), (u'ubijes', u'ubije\u0161'), (u'Ubijes', u'Ubije\u0161'), (u'uceni', u'u\u010deni'), (u'uci', u'u\u0107i'), (u'ucine', u'u\u010dine'), (u'ucinimo', u'u\u010dinimo'), (u'ucinio', u'u\u010dinio'), (u'ucio', u'u\u010dio'), (u'Ucio', u'U\u010dio'), (u'udas', u'uda\u0161'), (u'udete', u'u\u0111ete'), (u'ude\u0161', u'ude\u0161'), (u'udi', u'u\u0111i'), (u'Udi', u'U\u0111i'), (u'Udje', u'U\u0111e'), (u'udje', u'u\u0111e'), (u'udjes', u'u\u0111e\u0161'), (u'ugriscu', u'ugrist \u0107u'), (u'ukljestena', u'uklije\u0161tena'), (u'ukljucujuci', u'uklju\u010duju\u0107i'), (u'umes', u'umije\u0161'), (u'umiruci', u'umiru\u0107i'), (u'umrecu', u'umrijet \u0107u'), (u'umres', u'umre\u0161'), (u'unistice', u'uni\u0161tit \u0107e'), (u'uopce', u'uop\u0107e'), (u'Uopce', u'Uop\u0107e'), (u'Uopste', u'Uop\u0107e'), (u'uopste', u'uop\u0107e'), (u'upoznas', u'upozna\u0161'), (u'uradis', u'u\u010dini\u0161'), (u'usao', u'u\u0161ao'), (u'Usao', u'U\u0161ao'), (u'usli', u'u\u0161li'), (u'Usmjerice', u'Usmjerit \u0107e'), (u'uspanicio', u'uspani\u010dio'), (u'utapas', u'utapa\u0161'), (u'utesi', u'utje\u0161i'), (u'utesim', u'utje\u0161im'), (u'uzinu', u'u\u017einu'), (u'uzivo', u'u\u017eivo'), (u'valda', u'valjda'), (u'vasa', u'va\u0161a'), (u'vaseg', u'va\u0161eg'), (u'Vaseg', u'Va\u0161eg'), (u'vasem', u'va\u0161em'), (u'vasi', u'va\u0161i'), (u'vasoj', u'va\u0161oj'), (u'vazi', u'vrijedi'), (u'Vec', u'Ve\u0107'), (u'vec', u've\u0107'), (u'vecan', u'vje\u010dan'), (u'vecera', u've\u010dera'), (u'Veceras', u'Ve\u010deras'), (u'veceras', u've\u010deras'), (u'vecere', u've\u010dere'), (u'veceri', u've\u010deri'), (u'veceru', u've\u010deru'), (u'vecih', u've\u0107ih'), (u'vecitim', u'vje\u010ditim'), (u'vecna', u'vje\u010dna'), (u'vecno', u'vje\u010dno'), (u'vecnost', u'vje\u010dnost'), (u'verovacu', u'vjerovat \u0107u'), (u'vice', u'vi\u010de'), (u'vicem', u'vi\u010dem'), (u'vicemo', u'vi\u010demo'), (u'vices', u'vi\u010de\u0161'), (u'vicete', u'vi\u010dete'), (u'viden', u'vi\u0111en'), (u'Viden', u'Vi\u0111en'), (u'vishe', u'vi\u0161e'), (u'vjencali', u'vjen\u010dali'), (u'vjencati', u'vjen\u010dati'), (u'vjerujes', u'vjeruje\u0161'), (u'Vjerujes', u'Vjeruje\u0161'), (u'vjetrenjace', u'vjetrenja\u010de'), (u'voce', u'vo\u0107e'), (u'vocka', u'vo\u0107ka'), (u'vocku', u'vo\u0107ku'), (u'vocnjak', u'vo\u0107njak'), (u'vocnjaku', u'vo\u0107njaku'), (u'vodic', u'vodi\u010d'), (u'vodju', u'vo\u0111u'), (u'vozac', u'voza\u010d'), (u'Vozac', u'Voza\u010d'), (u'vozaca', u'voza\u010da'), (u'vracam', u'vra\u0107am'), (u'vracen', u'vra\u010den'), (u'vrazja', u'vra\u017eja'), (u'vrazji', u'vra\u017eji'), (u'vreca', u'vre\u010da'), (u'vrece', u'vre\u0107e'), (u'vrecu', u'vre\u0107u'), (u'vredja', u'vrije\u0111a'), (u'vredjanje', u'vrije\u0111anje'), (u'vrtic', u'vrti\u0107'), (u'vrtica', u'vrti\u0107a'), (u'vrticu', u'vrti\u0107u'), (u'zacepe', u'za\u010depe'), (u'Zacepi', u'Za\u010depi'), (u'Zadrzi', u'Zadr\u017ei'), (u'zadrzi', u'zadr\u017ei'), (u'zaduzen', u'zadu\u017een'), (u'Zaduzen', u'Zadu\u017een'), (u'zagrlis', u'zagrli\u0161'), (u'zaljenja', u'\u017ealjenja'), (u'zaljenje', u'\u017ealjenje'), (u'zalosna', u'\u017ealosna'), (u'Zalosna', u'\u017dalosna'), (u'zaokruzi', u'zaokru\u017ei'), (u'zaokruzim', u'zaokru\u017eim'), (u'zaokruzimo', u'zaokru\u017eimo'), (u'zapoceli', u'zapo\u010deli'), (u'zarucen', u'zaru\u010den'), (u'zasto', u'za\u0161to'), (u'Zasto', u'Za\u0161to'), (u'zateci', u'zate\u0107i'), (u'zatvoris', u'zatvori\u0161'), (u'zdrebe', u'\u017edrijebe'), (u'Zele', u'\u017dele'), (u'zele', u'\u017eele'), (u'Zeleci', u'\u017dele\u0107i'), (u'zelila', u'\u017eeljela'), (u'Zelis', u'\u017deli\u0161'), (u'zelis', u'\u017eeli\u0161'), (u'zene', u'\u017eene'), (u'zenke', u'\u017eenke'), (u'zesce', u'\u017ee\u0161\u0107e'), (u'zezas', u'zeza\u0161'), (u'zita', u'\u017eita'), (u'zito', u'\u017eito'), (u'zitu', u'\u017eitu'), (u'ziv', u'\u017eiv'), (u'ziva', u'\u017eiva'), (u'zive', u'\u017eive'), (u'zivi', u'\u017eivi'), (u'zivis', u'\u017eivi\u0161'), (u'zivjeo', u'\u017eivio'), (u'Zivjeo', u'\u017divio'), (u'zmureo', u'\u017emirio'), (u'znacaj', u'zna\u010daj'), (u'znacaja', u'zna\u010daja'), (u'znace', u'zna\u010de'), (u'znace\u0161', u'znat \u0107e\u0161'), (u'znas', u'zna\u0161'), (u'Znas', u'Zna\u0161'), (u'zuris', u'zuri\u0161'), (u'zutoj', u'\u017eutoj'), (u'zvanican', u'slu\u017eben'), (u'\u0107es', u'\u0107e\u0161'), (u'\u0107te', u'\u0107ete'), (u'\u010cime', u'\u010cime'), (u'\u017eelis', u'\u017eeli\u0161'), (u'\u017diveo', u'\u017divio')]), + 'pattern': u'(?um)(\\b|^)(?:andele|andeli|bacas|bas|Bas|basta|Basta|baste|Baste|basti|Basti|bastom|Bastom|bastu|Bastu|Bice|bice|Bice\\\u0161|Bicu|bicu|blagonaklonoscu|blizi|bljesti|Bljesti|bojis|braca|Braca|broncane|broncanu|budes|caj|caja|Cak|cak|cale|Cao|cao|cas|casno|Casno|castis|casu|ca\\\u0161u|cebe|cega|Cek|cek|cekali|cekas|Cemu|cemu|cerka|Cerka|cerke|Cerke|cerku|Cerku|ces|cesce|Cesce|Ceskoj|cestitki|cesto|Cesto|cetiri|Cetiri|cetri|cetu|ceznja|ceznje|ceznji|ceznjom|ceznju|ceznu|ce\\\u0161|Cija|cija|cije|Ciji|ciji|cijih|Cijih|cijim|Cijim|Cim|cim|cime|cinila|cinili|cinio|cinis|ciniti|cipka|cipku|cita|citao|citas|citavu|cizme|clan|Clan|clanke|clanove|clanovi|clanovima|cmo|corsokak|corsokaku|cosak|cosku|covece|covek|covjece|covjecnost|covjek|covjeka|covjeku|crpeci|cte|Cu|Ce\\\u0161|Ce|Cemo|Cete|cu|ce|cemo|cete|cudi|Cudo|cudo|Cujte|cula|culi|Culi|culima|cuo|Cuo|cupam|cutanje|Cutanje|cutao|Cutao|cuti|cutljiv|cutnja|cuvali|cuveni|dace|dacemo|davo|definise|definisi|Desava|desava|disemo|disi|dobijes|dobivas|doci|dode|dodem|dodes|dodete|dode\\\u0161|Dodi|dodi|dodite|Dodji|dodji|Dodjite|dodjite|Dodju|dodju|dodu|dolazis|dopustao|dorucak|dorucku|Dosao|dosao|drhteci|drhte\\\u0107i|Drhte\\\u0107i|drugacija|Drugacije|drugacije|drugaciji|Drugaciji|drukciji|drveca|drvece|drvecem|drvecu|drzi|Drzim|dugmici|duze|duzinom|dzanki|Dzejk|Dzime|Dzone|flasom|flasu|fucka|funkcionisu|gacice|gadao|gadis|Gadis|gdica|gdice|gdici|gdicu|gdu|glupaco|govoris|gradani|gradic|gradica|gradicu|grancica|grancicu|gresci|grese|greski|gresku|gubis|Hoces|hoces|hocu|Hocu|hodas|htjeo|iceg|icega|icemu|Ici|ici|Ides|ides|iduce|iduceg|iducem|Iduci|iduci|ignorisi|igras|Ijudi|imas|imidz|inace|Inace|isao|Isao|iscupao|ise\\\u0107emo|isla|istjece|istrazio|Istrazio|isuvise|izaci|Izaci|izade|Izade|izadem|izades|izadete|Izadi|izadi|izasao|izasla|izici|izluduje|izluduju|izmedu|Izmedu|izostri|izostrim|izvuci|i\\\u0161cupao|jebes|Jebes|jos|Jos|juce|Juce|jucer|Jucer|kaslja|kaze|Kaze|kazemo|kazite|Kazite|kazu|Kcer|kcer|kcerka|Kcerka|kcerkama|kcerku|Kcerku|kecap|kecapa|kise|kisi|kleknes|kociji|kolaca|kolace|komadic|komsijama|komsije|komsiji|komsiluk|komsiluku|kom\\\u0161ija|Kom\\\u0161ija|Konkurise|konkurise|konkurisem|konkurisu|kontrolisu|kosulja|kosulje|kosulji|kosulju|kovceg|kovcegu|krada|Krada|Krece|krece|Kreci|kreci|krecu|kre\\\u0107es|krosnje|krvaris|kuca|kucama|kuce|kuci|kusa|kusas|ku\\\u010da|ku\\\u010di|lakocom|laz|lazac|laze|lazi|lazne|lazni|lazov|ledja|ledjima|leprsa|lezala|lezali|lezati|lezis|Lezis|lici|licim|licis|licnost|licnosti|lijecniku|ljubis|los|losa|losu|majcine|masini|medu|Medutim|medutim|mici|Mici|micu|mislis|Mislis|mjesecevom|mjesecine|mjesecini|mjesecinu|mladic|moc|moci|motivisu|mozda|Mozda|moze|mozete|mreza|mrezu|mrzis|muce|mucenik|mucne|muska|muz|muza|naci|Naci|nacin|nadem|Nadem|nademo|nades|Nades|nadete|nadici|nadje|Nadje|nadjen|nadjes|Nadjes|nadjete|nagovestaj|najvise|Najvise|naklonoscu|naocale|Napisite|nasa|Nase|nase|naseg|nasi|Nasi|nasao|Nasao|nasla|Nasla|nasli|Nasli|nasoj|nasrecu|nastavis|nasu|nauce|neceg|necega|necemo|necemu|necije|neciji|necim|necovjecnost|necovjecnosti|necu|Necu|nekaze|nekoc|Nemas|nemas|Nesreca|nesto|Nesto|new\\ yorski|Nezan|nezan|nezna|Neznam|Neznas|Neznajuci|Neznavsi|neznam|neznas|neznajuci|neznavsi|nezni|neznih|neznim|nezno|neznu|niceg|nicega|nicemu|nicija|niciji|nicim|njezno|nju\\ jorski|noci|nocnu|nosac|nosices|nosis|noz|nozem|Obecao|Obezbedjuju|obezbedjuju|obide|objasnis|obozavalac|obracas|obra\\\u0107as|obuce|obucem|oceve|ocito|ocnjaci|odes|odlazis|odlezati|odlucim|odmice|odraduje|odreden|odreduje|odredujemo|odvec|ogrtac|ohrabrujuce|ojacam|okrece|opasac|operise|operisemo|operisete|operise\\\u0161|osecaces|osjecaces|osjecam|osjecanja|oslobada|ostra|ostre|ostri|ostrom|ostru|osvrnes|Osvrnes|otezala|otidi|otidji|otisao|oziljak|palaca|palaci|palacu|papucama|parce|pateci|patis|pcela|pcele|pecini|pecinski|peraca|Peraci|pica|pice|picem|pijes|pisacoj|pise|pisem|pisemo|pises|pisite|pisu|pitas|placa|placam|placanje|placanjem|place|placem|placete|place\\\u0161|placu|placuci|Plasi|plazi|plazu|plese|plesemo|plesete|plesu|ploca|ploce|pluca|plucima|pobjeci|pobjeduje|poceli|poceo|pocetak|pocevsi|pocev\\\u0161i|poci|pocinje|pociva|pocivali|pocivao|pode|podi|podici|Podici|podimo|Podimo|podje|Podje|Podji|podji|podneses|podocnjacima|podocnjake|podstice|poduzeca|poduzece|poduzecu|pojesce|pojiliste|pokazi|Pokazi|pokrece|pokusaj|pokusam|pokusas|poletis|polozaja|polozaju|pomaci|pomazes|pomislis|pomognes|poneses|ponovis|poreci|porice|posalji|Posalji|posaljite|posle|posluzili|Posluzite|posluzite|postaras|posto|Posto|potece|potice|potici|potjece|potjecem|potjeces|potpises|povedes|pozuda|pozude|pozudi|pozudu|prakticno|premasuje|premasuju|preporuca|presao|presjecen|Previse|previse|preziveo|Priblizi|price|prici|pricu|Pridji|pridji|prijeci|prijedi|prilazis|prisao|priusti|priustimo|priustiti|proci|prodavac|promasio|Promasio|prosao|prosla|Prosle|prosle|prosli|Prosli|proslim|proslo|Proslo|provedes|provlaci|provlacimo|pticica|pticicu|pucini|pupcanu|pusac|pusaci|pusi|pusimo|pusite|pustam|racunare|racunari|radis|Radis|raskosni|razumes|Razumes|rec|rece|Receno|receno|recima|resimo|rijec|Rijeci|rijedji|rjedji|Rjesit|rodena|rodeni|rodis|rodjen|rucno|ruza|ruzan|ruzu|sadrze|sadrzi|salje|saljes|salju|sasila|sasili|sasio|sasiti|savescu|savijescu|sedeces|sedis|sedista|sediste|sendvic|sesir|sesirom|sest|setala|setam|setis|seva|sevu|sezdeset|Sidji|sidji|sijecanj|siroki|sjecaju|sjecam|Sjecam|sjecanja|sjecanje|skace|skaci|skacu|sklanjas|sklonoscu|sklupcam|skola|Skola|Skotska|Skotskoj|skrt|skrte|skrusena|Skrusena|sledeca|Sledece|sledeci|Sledeci|slicno|sljedeci|Sljedeci|slozila|slozili|slozio|sloziti|slucaja|Smatras|smatras|smece|smeda|smedem|smedi|smedoj|smedu|smesak|Smijes|smijes|smionoscu|smraci|smracilo|smrcu|snimacete|sokiras|spases|Spases|spavaca|spavacoj|spominjes|spustamo|srdacan|srecom|sresce|sre\\\u0161ce|srljas|Sta|sta|stab|Stab|stagod|stampa|stampati|stampi|stampom|stampu|standa|standu|stavis|Stavise|Stavi\\\u0107emo|steceni|stezuci|stici|stojis|Stojis|stp|strasan|strasno|sudeci|sudenja|sudenje|sudenju|sugerisu|sumnjas|sumska|sumski|sumskoj|supak|suraduj|suraduje|suradujemo|suraduju|Suraduj|Suraduje|Suradujemo|Suraduju|sustina|sustine|sustini|Sustine|Sustini|Sustinom|sustinom|sustinski|suti|Suti|svacije|svaciji|svaciju|svecan|svecani|svez|sveza|svezu|svezi|sveze|svezim|svezom|svezoj|svezinom|svezina|svezinu|svezini|svezine|Svida|svidala|svidalo|svidam|svidao|sviras|taknes|takode|takoder|takodje|Takodje|tece|teska|Teska|teske|teski|tesko|Tesko|teskom|tezak|Tezak|teze|tezi|Tezi|tezimo|Tezimo|tezinu|tezis|Tezi\\\u0161|tisuce|tisucu|Tocak|tocak|tocka|tocku|trajace|Trajace|trazis|trcao|trce|Trce|trci|Trci|trcim|Trcim|trcimo|trebas|Trebas|treci|tricarija|trudis|trunuce|tuce|tuces|tucom|tucu|tudje|tudjeg|tudoj|tudom|tudjem|tudem|tumaras|tvoris|ubedjuju|ubijes|Ubijes|uceni|uci|ucine|ucinimo|ucinio|ucio|Ucio|udas|udete|ude\\\u0161|udi|Udi|Udje|udje|udjes|ugriscu|ukljestena|ukljucujuci|umes|umiruci|umrecu|umres|unistice|uopce|Uopce|Uopste|uopste|upoznas|uradis|usao|Usao|usli|Usmjerice|uspanicio|utapas|utesi|utesim|uzinu|uzivo|valda|vasa|vaseg|Vaseg|vasem|vasi|vasoj|vazi|Vec|vec|vecan|vecera|Veceras|veceras|vecere|veceri|veceru|vecih|vecitim|vecna|vecno|vecnost|verovacu|vice|vicem|vicemo|vices|vicete|viden|Viden|vishe|vjencali|vjencati|vjerujes|Vjerujes|vjetrenjace|voce|vocka|vocku|vocnjak|vocnjaku|vodic|vodju|vozac|Vozac|vozaca|vracam|vracen|vrazja|vrazji|vreca|vrece|vrecu|vredja|vredjanje|vrtic|vrtica|vrticu|zacepe|Zacepi|Zadrzi|zadrzi|zaduzen|Zaduzen|zagrlis|zaljenja|zaljenje|zalosna|Zalosna|zaokruzi|zaokruzim|zaokruzimo|zapoceli|zarucen|zasto|Zasto|zateci|zatvoris|zdrebe|Zele|zele|Zeleci|zelila|Zelis|zelis|zene|zenke|zesce|zezas|zita|zito|zitu|ziv|ziva|zive|zivi|zivis|zivjeo|Zivjeo|zmureo|znacaj|znacaja|znace|znace\\\u0161|znas|Znas|zuris|zutoj|zvanican|\\\u0107es|\\\u0107te|\\\u010cime|\\\u017eelis|\\\u017diveo)(\\b|$)'}}, + 'dan': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'IVI', u'M'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'IVI', u'M'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'Haner', u'Han er'), (u'JaveL', u'Javel'), (u'Pa//e', u'Palle'), (u'bffte', u'bitte'), (u'Utro//gt', u'Utroligt'), (u'Kommerdu', u'Kommer du'), (u'smi/er', u'smiler'), (u'/eg', u'leg'), (u'harvinger', u'har vinger'), (u'/et', u'let'), (u'erjeres', u'er jeres'), (u'hardet', u'har det'), (u't\xe6nktjer', u't\xe6nkt jer'), (u'erjo', u'er jo'), (u'sti/', u'stil'), (u'Iappe', u'lappe'), (u'Beklagel\xe7', u'Beklager,'), (u'vardet', u'var det'), (u'afden', u'af den'), (u'snupperjeg', u'snupper jeg'), (u'ikkejeg', u'ikke jeg'), (u'bliverjeg', u'bliver jeg'), (u'hartravit', u'har travlt'), (u'pandekagef/ag', u'pandekageflag'), (u'Stormvarsell', u'Stormvarsel!'), (u'stormvejn', u'stormvejr.'), (u'morgenkomp/et', u'morgenkomplet'), (u'/yv', u'lyv'), (u'varjo', u'var jo'), (u'/eger', u'leger'), (u'harjeg', u'har jeg'), (u'havdejeg', u'havde jeg'), (u'hvorjeg', u'hvor jeg'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'g\xe5rvi', u'g\xe5r vi'), (u'atjeg', u'at jeg'), (u'isine', u'i sine'), (u'f\xe5rjeg', u'f\xe5r jeg'), (u'k\xe6rtighed', u'k\xe6rlighed'), (u'skullejeg', u'skulle jeg'), (u'laest', u'l\xe6st'), (u'laese', u'l\xe6se'), (u'g\xf8rjeg', u'g\xf8r jeg'), (u'g\xf8rvi', u'g\xf8r vi'), (u'angrerjo', u'angrer jo'), (u'Hvergang', u'Hver gang'), (u'erder', u'er der'), (u'villetilgive', u'ville tilgive'), (u'\ufb01eme', u'fjeme'), (u'genopst\xe5ri', u'genopst\xe5r i'), (u'svigtejer', u'svigte jer'), (u'kommernu', u'kommer nu'), (u'n\xe5rman', u'n\xe5r man'), (u'erfire', u'er fire'), (u'Hvorfor\ufb01nderdu', u'Hvorfor \ufb01nder du'), (u'undertigt', u'underligt'), (u'itroen', u'i troen'), (u'erl\xf8gnt', u'er l\xf8gn!'), (u'g\xf8rden', u'g\xf8r den'), (u'forhelvede', u'for helvede'), (u'hjpe', u'hj\xe6lpe'), (u'togeti', u'toget i'), (u'M\xe5jeg', u'M\xe5 jeg'), (u'savnerjer', u'savner jer'), (u'erjeg', u'er jeg'), (u'vaere', u'v\xe6re'), (u'geme', u'gerne'), (u'trorp\xe5', u'tror p\xe5'), (u'forham', u'for ham'), (u'afham', u'af ham'), (u'harjo', u'har jo'), (u'ovema\ufb01et', u'overnattet'), (u'begae\ufb01ighed', u'beg\xe6rlighed'), (u'sy\u2019g', u'syg'), (u'Imensjeg', u'Imens jeg'), (u'bliverdu', u'bliver du'), (u'\ufb01ser', u'fiser'), (u'manipuierer', u'manipulerer'), (u'forjeg', u'for jeg'), (u'iivgivendefor', u'livgivende for'), (u'formig', u'for mig'), (u'Hardu', u'Har du'), (u'fornold', u'forhold'), (u'defrelste', u'de frelste'), (u'S\xe5jeg', u'S\xe5 jeg'), (u'varjeg', u'var jeg'), (u'g\xf8rved', u'g\xf8r ved'), (u'kalderjeg', u'kalder jeg'), (u'\ufb02ytte', u'flytte'), (u'handlerdet', u'handler det'), (u'trorjeg', u'tror jeg'), (u'\ufb02ytter', u'flytter'), (u'soverjeg', u'sover jeg'), (u'\ufb01nderud', u'\ufb01nder ud'), (u'naboerp\xe5', u'naboer p\xe5'), (u'ervildt', u'er vildt'), (u'v\xe6reher', u'v\xe6re her'), (u'hyggerjer', u'hygger jer'), (u'borjo', u'bor jo'), (u'kommerikke', u'kommer ikke'), (u'folkynde', u'forkynde'), (u'farglad', u'far glad'), (u'misterjeg', u'mister jeg'), (u'\ufb01nt', u'fint'), (u'Harl', u'Har I'), (u'bedejer', u'bede jer'), (u'synesjeg', u'synes jeg'), (u'vartil', u'var til'), (u'eren', u'er en'), (u'\\Al', u'Vil'), (u'\\A', u'Vi'), (u'fjeme', u'fjerne'), (u'Iigefyldt', u'lige fyldt'), (u'ertil', u'er til'), (u'fa\ufb01igt', u'farligt'), (u'\ufb01nder', u'finder'), (u'\ufb01ndes', u'findes'), (u'irettesae\ufb01else', u'irettes\xe6ttelse'), (u'ermed', u'er med'), (u'\xe8n', u'\xe9n'), (u'gikjoi', u'gik jo i'), (u'Hvisjeg', u'Hvis jeg'), (u'ovema\ufb01er', u'overnatter'), (u'hoident', u'holdent'), (u'\\Adne', u'Vidne'), (u'fori', u'for i'), (u'vei', u'vel'), (u'savnerjerjo', u'savner jer jo'), (u'elskerjer', u'elsker jer'), (u'harl\xf8jet', u'har l\xf8jet'), (u'eri', u'er i'), (u'\ufb01ende', u'fjende'), (u'derjo', u'der jo'), (u'sigerjo', u'siger jo'), (u'menerjeg', u'mener jeg'), (u'Harjeg', u'Har jeg'), (u'sigerjeg', u'siger jeg'), (u'splitterjeg', u'splitter jeg'), (u'erjournalist', u'er journalist'), (u'erjoumalist', u'er journalist'), (u'Forjeg', u'For jeg'), (u'g\xe2rjeg', u'g\xe5r jeg'), (u'N\xe2rjeg', u'N\xe5r jeg'), (u'a\ufb02lom', u'afkom'), (u'farerjo', u'farer jo'), (u'tagerjeg', u'tager jeg'), (u'Virkerjeg', u'Virker jeg'), (u'morerjer', u'morer jer'), (u'kommerjo', u'kommer jo'), (u'istand', u'i stand'), (u'b\xf8m', u'b\xf8rn'), (u'frygterjeg', u'frygter jeg'), (u'kommerjeg', u'kommer jeg'), (u'eriournalistelev', u'er journalistelev'), (u'harfat', u'har fat'), (u'f\xe5r\ufb01ngre', u'f\xe5r \ufb01ngre'), (u'sl\xe2rjeg', u'sl\xe5r jeg'), (u'bam', u'barn'), (u'erjournalistelev', u'er journalistelev'), (u'politietjo', u'politiet jo'), (u'elskerjo', u'elsker jo'), (u'vari', u'var i'), (u'fornemmerjeres', u'fornemmer jeres'), (u'udkl\xe6kketl', u'udkl\xe6kket!'), (u'\xed', u'i'), (u'nyi', u'ny i'), (u'Iumijelse', u'forn\xf8jelse'), (u'vures', u'vores'), (u'I/Vash\xedngtan', u'Washington'), (u'opleverjeg', u'oplever jeg'), (u'PANTEL\xc3NER', u'PANTEL\xc5NER'), (u'Gudmurgen', u'Godmorgen'), (u'SKYDEV\xc3BEN', u'SKYDEV\xc5BEN'), (u'P\xc3LIDELIG', u'P\xc5LIDELIG'), (u'avertalte', u'overtalte'), (u'Oms\xedder', u'Omsider'), (u'lurteb\xe5d', u'lorteb\xe5d'), (u'Telrslning', u'Tekstning'), (u'miU\xf8', u'milj\xf8'), (u'g\xe5ri', u'g\xe5r i'), (u'Fan/el', u'Farvel'), (u'abe\ufb01\xe6s', u'abefj\xe6s'), (u'hartalt', u'har talt'), (u'\\\xc5rkelig', u'Virkelig'), (u'beklagerjeg', u'beklager jeg'), (u'N\xe5rjeg', u'N\xe5r jeg'), (u'rnaend', u'm\xe6nd'), (u'vaskebjorn', u'vaskebj\xf8rn'), (u'Ivil', u'I vil'), (u'besog', u'bes\xf8g'), (u'Vaer', u'V\xe6r'), (u'Undersogte', u'Unders\xf8gte'), (u'modte', u'm\xf8dte'), (u'toj', u't\xf8j'), (u'fodt', u'f\xf8dt'), (u'gore', u'g\xf8re'), (u'provede', u'pr\xf8vede'), (u'forste', u'f\xf8rste'), (u'igang', u'i gang'), (u'ligenu', u'lige nu'), (u'clet', u'det'), (u'Strombell', u'Strombel!'), (u'tmvlt', u'travlt'), (u'studererjournalistik', u'studerer journalistik'), (u'inforrnererjeg', u'informerer jeg'), (u'omk\ufb01ng', u'omkring'), (u'tilAsg\xe5rd', u'til Asg\xe5rd'), (u'Kederjeg', u'Keder jeg'), (u'jaettetamp', u'j\xe6ttetamp'), (u'erjer', u'er jer'), (u'atjulehygge', u'at julehygge'), (u'Ueneste', u'tjeneste'), (u'foltsaetter', u'forts\xe6tter'), (u'A/ice', u'Alice'), (u'tvivlerjeg', u'tvivler jeg'), (u'henterjer', u'henter jer'), (u'forst\xe5rjeg', u'forst\xe5r jeg'), (u'hvisjeg', u'hvis jeg'), (u'/\xe6rt', u'l\xe6rt'), (u'vfgtrgt', u'vigtigt'), (u'hurtigtjeg', u'hurtigt jeg'), (u'kenderjo', u'kender jo'), (u'seiv', u'selv'), (u'/\xe6gehuset', u'l\xe6gehuset'), (u'herjo', u'her jo'), (u'stolerjeg', u'stoler jeg'), (u'digi', u'dig i'), (u'taberi', u'taber i'), (u'sl\xe5rjeres', u'sl\xe5r jeres'), (u'laere', u'l\xe6re'), (u'tr\xe6nerwushu', u'tr\xe6ner wushu'), (u'efterjeg', u'efter jeg'), (u'e\ufb01er', u'efter'), (u'dui', u'du i'), (u'a\ufb01en', u'aften'), (u'bliveri', u'bliver i'), (u'acceptererjer', u'accepterer jer'), (u'drikkerjo', u'drikker jo'), (u'\ufb01anjin', u'Tianjin'), (u'erl\xe6nge', u'er l\xe6nge'), (u'erikke', u'er ikke'), (u'medjer', u'med jer'), (u'Tmykke', u'Tillykke'), (u"'\ufb01anjins", u'Tianjins'), (u'Mesteri', u'Mester i'), (u'sagdetil', u'sagde til'), (u'indei', u'inde i'), (u'o\ufb01e', u'ofte'), (u"'\ufb01lgiv", u'Tilgiv'), (u'Lf\xe5r', u'I f\xe5r'), (u'viserjer', u'viser jer'), (u'Rejsjerblot', u'Rejs jer blot'), (u"'\ufb01llad", u'Tillad'), (u'iiiie\ufb01nger', u'lille\ufb01nger'), (u'VILOMFATTE', u'VIL OMFATTE'), (u'mo\ufb01o', u'motto'), (u'g\xf8rjer', u'g\xf8r jer'), (u'gifi', u'gift'), (u'hardu', u'har du'), (u'gi\ufb01', u'gift'), (u'Iaeggerjeg', u'l\xe6gger jeg'), (u'iet', u'i et'), (u'sv/yte', u'svigte'), (u'ti/', u'til'), (u'Wdal', u'Vidal'), (u'\ufb01\xe5et', u'f\xe5et'), (u'Hvo/for', u'Hvorfor'), (u'hellerikke', u'heller ikke'), (u'Wlle', u'Ville'), (u'dr/ver', u'driver'), (u'V\\\ufb02lliam', u'William'), (u'V\\\ufb02lliams', u'Williams'), (u'Vk\ufb01lliam', u'William'), (u'v\xe5dejakke', u'v\xe5de jakke'), (u'k\xe6\ufb02l', u'k\xe6ft!'), (u'sagdejeg', u'sagde jeg'), (u'oven/ejet', u'overvejet'), (u'karameisauce', u'karamelsauce'), (u'Lf\xf8lgej\xf8disk', u'If\xf8lge j\xf8disk'), (u'blevjo', u'blev jo'), (u'asiateri', u'asiater i'), (u'erV\\\ufb02lliam', u'er William'), (u'lidt\ufb02ov', u'lidt \ufb02ov'), (u'sagdejo', u'sagde jo'), (u'erlige', u'er lige'), (u'Vt\ufb01lliam', u'William'), (u'W\ufb01II', u'Will'), (u'a\ufb02darede', u'afklarede'), (u'hj\xe6iperjeg', u'hj\xe6lper jeg'), (u'laderjeg', u'lader jeg'), (u'H\xe2ndledsbeskyttere', u'H\xe5ndledsbeskyttere'), (u'Lsabels', u'Isabels'), (u'G\xf8rjeg', u'G\xf8r jeg'), (u'm\xe2jeg', u'm\xe5 jeg'), (u'ogjeg', u'og jeg'), (u'gjordejeg', u'gjorde jeg'), (u'villejeg', u'ville jeg'), (u'Vl\ufb02lliams', u'Williams'), (u'Dajeg', u'Da jeg'), (u'iorden', u'i orden'), (u'fandtjeg', u'fandt jeg'), (u'Tilykke', u'Tillykke'), (u'k\xf8rerjer', u'k\xf8rer jer'), (u'g\xf8fjeg', u'g\xf8r jeg'), (u'Selvflgelig', u'Selvf\xf8lgelig'), (u'fdder', u'fadder'), (u'bnfaldt', u'b\xf8nfaldt'), (u't\\/ehovedede', u'tvehovedede'), (u'EIler', u'Eller'), (u'ringerjeg', u'ringer jeg'), (u'blevv\xe6k', u'blev v\xe6k'), (u'st\xe1rjeg', u'st\xe5r jeg'), (u'varforbi', u'var forbi'), (u'harfortalt', u'har fortalt'), (u'iflere', u'i flere'), (u't\xf8rjeg', u't\xf8r jeg'), (u'kunnejeg', u'kunne jeg'), (u'm\xe1', u'm\xe5'), (u'hart\xe6nkt', u'har t\xe6nkt'), (u'F\xe1rjeg', u'F\xe5r jeg'), (u'afdelingervar', u'afdelinger var'), (u'0rd', u'ord'), (u'p\xe1st\xe1', u'p\xe5st\xe5'), (u'gr\xe1haret', u'gr\xe5haret'), (u'varforbl\xf8ffende', u'var forbl\xf8ffende'), (u'holdtjeg', u'holdt jeg'), (u'h\xe6ngerjo', u'h\xe6nger jo'), (u'fikjeg', u'fik jeg'), (u'f\xe1r', u'f\xe5r'), (u'Hvorforf\xf8lerjeg', u'Hvorfor f\xf8ler jeg'), (u'harfeber', u'har feber'), (u'\xe1ndssvagt', u'\xe5ndssvagt'), (u'0g', u'Og'), (u'vartre', u'var tre'), (u'abner', u'\xe5bner'), (u'garjeg', u'g\xe5r jeg'), (u'sertil', u'ser til'), (u'hvorfin', u'hvor fin'), (u'harfri', u'har fri'), (u'forstarjeg', u'forst\xe5r jeg'), (u'S\xe4', u'S\xe5'), (u'hvorfint', u'hvor fint'), (u'm\xe6rkerjeg', u'm\xe6rker jeg'), (u'ogsa', u'ogs\xe5'), (u'n\xe1rjeg', u'n\xe5r jeg'), (u'Jas\xe1', u'Jas\xe5'), (u'b\xe1ndoptager', u'b\xe5ndoptager'), (u'bed\xe1rende', u'bed\xe5rende'), (u's\xe1', u's\xe5'), (u'n\xe1r', u'n\xe5r'), (u'kunnejo', u'kunne jo'), (u'Brammertil', u'Brammer til'), (u'serjeg', u'ser jeg'), (u'gikjeg', u'gik jeg'), (u'udholderjeg', u'udholder jeg'), (u'm\xe1neder', u'm\xe5neder'), (u'vartr\xe6t', u'var tr\xe6t'), (u'd\xe1rligt', u'd\xe5rligt'), (u'klaretjer', u'klaret jer'), (u'pavirkelig', u'p\xe5virkelig'), (u'spekulererjeg', u'spekulerer jeg'), (u'fors\xf8gerjeg', u'fors\xf8ger jeg'), (u'huskerjeg', u'husker jeg'), (u'ifavnen', u'i favnen'), (u'skullejo', u'skulle jo'), (u'vartung', u'var tung'), (u'varfuldst\xe6ndig', u'var fuldst\xe6ndig'), (u'Paskedag', u'P\xe5skedag'), (u'turi', u'tur i'), (u'spillerschumanns', u'spiller Schumanns'), (u'forst\xe1rjeg', u'forst\xe5r jeg'), (u'istedet', u'i stedet'), (u'n\xe1rfrem', u'n\xe5r frem'), (u'habertrods', u'h\xe5ber trods'), (u'forf\xf8rste', u'for f\xf8rste'), (u'varto', u'var to'), (u'overtil', u'over til'), (u'forfem', u'for fem'), (u'holdtjo', u'holdt jo'), (u'passerjo', u'passer jo'), (u'ellerto', u'eller to'), (u'hartrods', u'har trods'), (u'harfuldst\xe6ndig', u'har fuldst\xe6ndig'), (u'g\xe5rjeg', u'g\xe5r jeg'), (u'giderjeg', u'gider jeg'), (u'forjer', u'for jer'), (u'erindrerjeg', u'erindrer jeg'), (u't\xe6nkerjeg', u't\xe6nker jeg'), (u'GAEt', u'G\xc5ET'), (u'h\xf8rerjo', u'h\xf8rer jo'), (u'forladerjeg', u'forlader jeg'), (u'kosterjo', u'koster jo'), (u'fort\xe6llerjeg', u'fort\xe6ller jeg'), (u'Forstyrrerjeg', u'Forstyrrer jeg'), (u'tjekkerjeg', u'tjekker jeg'), (u'erjurist', u'er jurist'), (u'tlLBUD', u'TILBUD'), (u'serjo', u'se rjo'), (u'bederjeg', u'beder jeg'), (u'bilderjeg', u'bilder jeg'), (u'ULVEtlME', u'ULVETlME'), (u'sk\xe6rerjo', u'sk\xe6rer jo'), (u'afjer', u'af jer'), (u'ordnerjeg', u'ordner jeg'), (u'giverjeg', u'giver jeg'), (u'rejservi', u'rejser vi'), (u'fangerjeg', u'fanger jeg'), (u'erjaloux', u'er jaloux'), (u'glemmerjeg', u'glemmer jeg'), (u'Beh\xf8verjeg', u'Beh\xf8ver jeg'), (u'harvi', u'har vi'), (u'ertyndere', u'er tyndere'), (u'f\xe5rtordenvejr', u'f\xe5r tordenvejr'), (u'varf\xe6rdig', u'var f\xe6rdig'), (u'h\xf8rerfor', u'h\xf8rer for'), (u'varvel', u'var vel'), (u'erforbi', u'er forbi'), (u'AIle', u'Alle'), (u'l\xe6serjo', u'l\xe6ser jo'), (u'Edgarer', u'Edgar er'), (u'hartaget', u'har taget'), (u'derer', u'der er'), (u'stikkerfrem', u'stikker frem'), (u'haraldrig', u'har aldrig'), (u'ellerfar', u'eller far'), (u'erat', u'er at'), (u'turtil', u'tur til'), (u'erf\xe6rdig', u'er f\xe6rdig'), (u'f\xf8lerjeg', u'f\xf8ler jeg'), (u'jerfra', u'jer fra'), (u'eralt', u'er alt'), (u'harfaktisk', u'har faktisk'), (u'harfundet', u'har fundet'), (u'harvendt', u'har vendt'), (u'Kunstneraf', u'Kunstner af'), (u'ervel', u'er vel'), (u'st\xe5ransigt', u'st\xe5r ansigt'), (u'Erjeg', u'Er jeg'), (u'venterjeg', u'venter jeg'), (u'Hvorvar', u'Hvor var'), (u'varfint', u'var fint'), (u'ervarmt', u'er varmt'), (u'g\xe5rfint', u'g\xe5r fint'), (u'flyverforbi', u'flyver forbi'), (u'Dervar', u'Der var'), (u'dervar', u'der var'), (u'mener\xe5ndeligt', u'mener \xe5ndeligt'), (u'forat', u'for at'), (u'herovertil', u'herover til'), (u'soverfor', u'sover for'), (u'begyndtejeg', u'begyndte jeg'), (u'vendertilbage', u'vender tilbage'), (u'erforf\xe6rdelig', u'er forf\xe6rdelig'), (u'g\xf8raltid', u'g\xf8r altid'), (u'ertilbage', u'er tilbage'), (u'harv\xe6ret', u'har v\xe6ret'), (u'bagoverellertil', u'bagover eller til'), (u'hertaler', u'her taler'), (u'v\xe5gnerjeg', u'v\xe5gner jeg'), (u'vartomt', u'var tomt'), (u'g\xe5rfrem', u'g\xe5r frem'), (u'talertil', u'taler til'), (u'ertryg', u'er tryg'), (u'ansigtervendes', u'ansigter vendes'), (u'hervirkeligt', u'her virkeligt'), (u'herer', u'her er'), (u'dr\xf8mmerjo', u'dr\xf8mmer jo'), (u'erfuldkommen', u'er fuldkommen'), (u'hveren', u'hver en'), (u'erfej', u'er fej'), (u'datterforg\xe6ves', u'datter forg\xe6ves'), (u'fors\xf8gerjo', u'fors\xf8ger jo'), (u'ertom', u'er tom'), (u'vareftermiddag', u'var eftermiddag'), (u'vartom', u'var tom'), (u'angerellerforventninger', u'anger eller forventninger'), (u'k\xf8rtejeg', u'k\xf8rte jeg'), (u'Hvorforfort\xe6ller', u'Hvorfor fort\xe6ller'), (u'g\xe5rtil', u'g\xe5r til'), (u'ringerefter', u'ringer efter'), (u's\xf8gertilflugt', u's\xf8ger tilflugt'), (u'ertvunget', u'er tvunget'), (u'megetjeg', u'meget jeg'), (u'varikke', u'var ikke'), (u'Derermange', u'Der e rmange'), (u'dervilhindre', u'der vil hindre'), (u'ers\xe5', u'er s\xe5'), (u'Detforst\xe5rLeggodt', u'Det forst\xe5r jeg godt'), (u'ergodt', u'er godt'), (u'vorventen', u'vor venten'), (u'tagerfejl', u'tager fejl'), (u'ellerer', u'eller er'), (u'laverjeg', u'laver jeg'), (u'0mgang', u'omgang'), (u'afst\xe1r', u'afst\xe5r'), (u'p\xe1', u'p\xe5'), (u'rejserjeg', u'rejser jeg'), (u'ellertage', u'eller tage'), (u'takkerjeg', u'takker jeg'), (u'ertilf\xe6ldigvis', u'er tilf\xe6ldigvis'), (u'fremstar', u'fremst\xe5r'), (u'ert\xe6t', u'er t\xe6t'), (u'ijeres', u'i jeres'), (u'Sagdejeg', u'Sagde jeg'), (u'overi', u'over i'), (u'plukkerjordb\xe6r', u'plukker jordb\xe6r'), (u'klarerjeg', u'klarer jeg'), (u'jerfire', u'jer fire'), (u't\xe1beligste', u't\xe5beligste'), (u'sigertvillingerne', u'siger tvillingerne'), (u'erfaktisk', u'er faktisk'), (u'g\xe1r', u'g\xe5r'), (u'harvasket', u'har vasket'), (u'harplukketjordb\xe6rtil', u'har plukket jordb\xe6r til'), (u'plukketjordb\xe6r', u'plukket jordb\xe6r'), (u'klaverfireh\xe6ndigt', u'klaver fireh\xe6ndigt'), (u'erj\xe6vnaldrende', u'er j\xe6vnaldrende'), (u'tierjeg', u'tier jeg'), (u'Hvorerden', u'Hvor er den'), (u'0veraltjeg', u'overalt jeg'), (u'g\xe5rp\xe5', u'g\xe5r p\xe5'), (u'finderjeg', u'finder jeg'), (u'serhans', u'ser hans'), (u'tiderbliver', u'tider bliver'), (u'ellertrist', u'eller trist'), (u'forst\xe5rjeres', u'forst\xe5r jeres'), (u'Hvorsj\xe6len', u'Hvor sj\xe6len'), (u'finderro', u'finder ro'), (u'sidderjeg', u'sidder jeg'), (u'tagerjo', u'tager jo'), (u'efterjeres', u'efter jeres'), (u'10O', u'100'), (u'besluttedejeg', u'besluttede jeg'), (u'varsket', u'var sket'), (u'uadskillige', u'uadskillelige'), (u'harjetlag', u'har jetlag'), (u'lkke', u'Ikke'), (u'lntet', u'Intet'), (u'afsl\xf8rerjeg', u'afsl\xf8rer jeg'), (u'm\xe5jeg', u'm\xe5 jeg'), (u'Vl', u'VI'), (u'atbygge', u'at bygge'), (u'detmakabre', u'det makabre'), (u'vilikke', u'vil ikke'), (u'talsmandbekr\xe6fter', u'talsmand bekr\xe6fter'), (u'vedatrenovere', u'ved at renovere'), (u'fors\xf8geratforst\xe5', u'fors\xf8ger at forst\xe5'), (u'ersket', u'er sket'), (u'morderp\xe5', u'morder p\xe5'), (u'frifodiRosewood', u'fri fod i Rosewood'), (u'holdtpressem\xf8de', u'holdt pressem\xf8de'), (u'lngen', u'Ingen'), (u'lND', u'IND'), (u'henterjeg', u'henter jeg'), (u'lsabel', u'Isabel'), (u'lsabels', u'Isabels'), (u'vinderjo', u'vinder jo'), (u'r\xf8dmerjo', u'r\xf8dmer jo'), (u'etjakkes\xe6t', u'et jakkes\xe6t'), (u'gl\xe6derjeg', u'gl\xe6der jeg'), (u'lgen', u'Igen'), (u'ls\xe6r', u'Is\xe6r'), (u'iparken', u'i parken'), (u'n\xe5rl', u'n\xe5r I'), (u'tilA1', u'til A1'), (u'FBl', u'FBI'), (u'viljo', u'vil jo'), (u'detp\xe5', u'det p\xe5'), (u'KIar', u'Klar'), (u'PIan', u'Plan'), (u'EIIer', u'Eller'), (u'FIot', u'Flot'), (u'AIIe', u'Alle'), (u'AIt', u'Alt'), (u'KIap', u'Klap'), (u'PIaza', u'Plaza'), (u'SIap', u'Slap'), (u'I\xe5', u'l\xe5'), (u'BIing', u'Bling'), (u'GIade', u'Glade'), (u'Iejrb\xe5lssange', u'lejrb\xe5lssange'), (u'bedtjer', u'bedt jer'), (u'h\xf8rerjeg', u'h\xf8rer jeg'), (u'F\xe5rjeg', u'F\xe5r jeg'), (u'fikJames', u'fik James'), (u'atsnakke', u'at snakke'), (u'varkun', u'var kun'), (u'retterjeg', u'retter jeg'), (u'ernormale', u'er normale'), (u'viljeg', u'vil jeg'), (u'S\xe6tjer', u'S\xe6t jer'), (u'udsatham', u'udsat ham')]), - 'pattern': u"(?um)(\\b|^)(?:Haner|JaveL|Pa\\/\\/e|bffte|Utro\\/\\/gt|Kommerdu|smi\\/er|\\/eg|harvinger|\\/et|erjeres|hardet|t\\\xe6nktjer|erjo|sti\\/|Iappe|Beklagel\\\xe7|vardet|afden|snupperjeg|ikkejeg|bliverjeg|hartravit|pandekagef\\/ag|Stormvarsell|stormvejn|morgenkomp\\/et|\\/yv|varjo|\\/eger|harjeg|havdejeg|hvorjeg|n\\\xe5rjeg|g\\\xe5rvi|atjeg|isine|f\\\xe5rjeg|k\\\xe6rtighed|skullejeg|laest|laese|g\\\xf8rjeg|g\\\xf8rvi|angrerjo|Hvergang|erder|villetilgive|\\\ufb01eme|genopst\\\xe5ri|svigtejer|kommernu|n\\\xe5rman|erfire|Hvorfor\\\ufb01nderdu|undertigt|itroen|erl\\\xf8gnt|g\\\xf8rden|forhelvede|hjpe|togeti|M\\\xe5jeg|savnerjer|erjeg|vaere|geme|trorp\\\xe5|forham|afham|harjo|ovema\\\ufb01et|begae\\\ufb01ighed|sy\\\u2019g|Imensjeg|bliverdu|\\\ufb01ser|manipuierer|forjeg|iivgivendefor|formig|Hardu|fornold|defrelste|S\\\xe5jeg|varjeg|g\\\xf8rved|kalderjeg|\\\ufb02ytte|handlerdet|trorjeg|\\\ufb02ytter|soverjeg|\\\ufb01nderud|naboerp\\\xe5|ervildt|v\\\xe6reher|hyggerjer|borjo|kommerikke|folkynde|farglad|misterjeg|\\\ufb01nt|Harl|bedejer|synesjeg|vartil|eren|\\\\Al|\\\\A|fjeme|Iigefyldt|ertil|fa\\\ufb01igt|\\\ufb01nder|\\\ufb01ndes|irettesae\\\ufb01else|ermed|\\\xe8n|gikjoi|Hvisjeg|ovema\\\ufb01er|hoident|\\\\Adne|fori|vei|savnerjerjo|elskerjer|harl\\\xf8jet|eri|\\\ufb01ende|derjo|sigerjo|menerjeg|Harjeg|sigerjeg|splitterjeg|erjournalist|erjoumalist|Forjeg|g\\\xe2rjeg|N\\\xe2rjeg|a\\\ufb02lom|farerjo|tagerjeg|Virkerjeg|morerjer|kommerjo|istand|b\\\xf8m|frygterjeg|kommerjeg|eriournalistelev|harfat|f\\\xe5r\\\ufb01ngre|sl\\\xe2rjeg|bam|erjournalistelev|politietjo|elskerjo|vari|fornemmerjeres|udkl\\\xe6kketl|\\\xed|nyi|Iumijelse|vures|I\\/Vash\\\xedngtan|opleverjeg|PANTEL\\\xc3NER|Gudmurgen|SKYDEV\\\xc3BEN|P\\\xc3LIDELIG|avertalte|Oms\\\xedder|lurteb\\\xe5d|Telrslning|miU\\\xf8|g\\\xe5ri|Fan\\/el|abe\\\ufb01\\\xe6s|hartalt|\\\\\\\xc5rkelig|beklagerjeg|N\\\xe5rjeg|rnaend|vaskebjorn|Ivil|besog|Vaer|Undersogte|modte|toj|fodt|gore|provede|forste|igang|ligenu|clet|Strombell|tmvlt|studererjournalistik|inforrnererjeg|omk\\\ufb01ng|tilAsg\\\xe5rd|Kederjeg|jaettetamp|erjer|atjulehygge|Ueneste|foltsaetter|A\\/ice|tvivlerjeg|henterjer|forst\\\xe5rjeg|hvisjeg|\\/\\\xe6rt|vfgtrgt|hurtigtjeg|kenderjo|seiv|\\/\\\xe6gehuset|herjo|stolerjeg|digi|taberi|sl\\\xe5rjeres|laere|tr\\\xe6nerwushu|efterjeg|e\\\ufb01er|dui|a\\\ufb01en|bliveri|acceptererjer|drikkerjo|\\\ufb01anjin|erl\\\xe6nge|erikke|medjer|Tmykke|\\'\\\ufb01anjins|Mesteri|sagdetil|indei|o\\\ufb01e|\\'\\\ufb01lgiv|Lf\\\xe5r|viserjer|Rejsjerblot|\\'\\\ufb01llad|iiiie\\\ufb01nger|VILOMFATTE|mo\\\ufb01o|g\\\xf8rjer|gifi|hardu|gi\\\ufb01|Iaeggerjeg|iet|sv\\/yte|ti\\/|Wdal|\\\ufb01\\\xe5et|Hvo\\/for|hellerikke|Wlle|dr\\/ver|V\\\\\\\ufb02lliam|V\\\\\\\ufb02lliams|Vk\\\ufb01lliam|v\\\xe5dejakke|k\\\xe6\\\ufb02l|sagdejeg|oven\\/ejet|karameisauce|Lf\\\xf8lgej\\\xf8disk|blevjo|asiateri|erV\\\\\\\ufb02lliam|lidt\\\ufb02ov|sagdejo|erlige|Vt\\\ufb01lliam|W\\\ufb01II|a\\\ufb02darede|hj\\\xe6iperjeg|laderjeg|H\\\xe2ndledsbeskyttere|Lsabels|G\\\xf8rjeg|m\\\xe2jeg|ogjeg|gjordejeg|villejeg|Vl\\\ufb02lliams|Dajeg|iorden|fandtjeg|Tilykke|k\\\xf8rerjer|g\\\xf8fjeg|Selvflgelig|fdder|bnfaldt|t\\\\\\/ehovedede|EIler|ringerjeg|blevv\\\xe6k|st\\\xe1rjeg|varforbi|harfortalt|iflere|t\\\xf8rjeg|kunnejeg|m\\\xe1|hart\\\xe6nkt|F\\\xe1rjeg|afdelingervar|0rd|p\\\xe1st\\\xe1|gr\\\xe1haret|varforbl\\\xf8ffende|holdtjeg|h\\\xe6ngerjo|fikjeg|f\\\xe1r|Hvorforf\\\xf8lerjeg|harfeber|\\\xe1ndssvagt|0g|vartre|abner|garjeg|sertil|hvorfin|harfri|forstarjeg|S\\\xe4|hvorfint|m\\\xe6rkerjeg|ogsa|n\\\xe1rjeg|Jas\\\xe1|b\\\xe1ndoptager|bed\\\xe1rende|s\\\xe1|n\\\xe1r|kunnejo|Brammertil|serjeg|gikjeg|udholderjeg|m\\\xe1neder|vartr\\\xe6t|d\\\xe1rligt|klaretjer|pavirkelig|spekulererjeg|fors\\\xf8gerjeg|huskerjeg|ifavnen|skullejo|vartung|varfuldst\\\xe6ndig|Paskedag|turi|spillerschumanns|forst\\\xe1rjeg|istedet|n\\\xe1rfrem|habertrods|forf\\\xf8rste|varto|overtil|forfem|holdtjo|passerjo|ellerto|hartrods|harfuldst\\\xe6ndig|g\\\xe5rjeg|giderjeg|forjer|erindrerjeg|t\\\xe6nkerjeg|GAEt|h\\\xf8rerjo|forladerjeg|kosterjo|fort\\\xe6llerjeg|Forstyrrerjeg|tjekkerjeg|erjurist|tlLBUD|serjo|bederjeg|bilderjeg|ULVEtlME|sk\\\xe6rerjo|afjer|ordnerjeg|giverjeg|rejservi|fangerjeg|erjaloux|glemmerjeg|Beh\\\xf8verjeg|harvi|ertyndere|f\\\xe5rtordenvejr|varf\\\xe6rdig|h\\\xf8rerfor|varvel|erforbi|AIle|l\\\xe6serjo|Edgarer|hartaget|derer|stikkerfrem|haraldrig|ellerfar|erat|turtil|erf\\\xe6rdig|f\\\xf8lerjeg|jerfra|eralt|harfaktisk|harfundet|harvendt|Kunstneraf|ervel|st\\\xe5ransigt|Erjeg|venterjeg|Hvorvar|varfint|ervarmt|g\\\xe5rfint|flyverforbi|Dervar|dervar|mener\\\xe5ndeligt|forat|herovertil|soverfor|begyndtejeg|vendertilbage|erforf\\\xe6rdelig|g\\\xf8raltid|ertilbage|harv\\\xe6ret|bagoverellertil|hertaler|v\\\xe5gnerjeg|vartomt|g\\\xe5rfrem|talertil|ertryg|ansigtervendes|hervirkeligt|herer|dr\\\xf8mmerjo|erfuldkommen|hveren|erfej|datterforg\\\xe6ves|fors\\\xf8gerjo|ertom|vareftermiddag|vartom|angerellerforventninger|k\\\xf8rtejeg|Hvorforfort\\\xe6ller|g\\\xe5rtil|ringerefter|s\\\xf8gertilflugt|ertvunget|megetjeg|varikke|Derermange|dervilhindre|ers\\\xe5|Detforst\\\xe5rLeggodt|ergodt|vorventen|tagerfejl|ellerer|laverjeg|0mgang|afst\\\xe1r|p\\\xe1|rejserjeg|ellertage|takkerjeg|ertilf\\\xe6ldigvis|fremstar|ert\\\xe6t|ijeres|Sagdejeg|overi|plukkerjordb\\\xe6r|klarerjeg|jerfire|t\\\xe1beligste|sigertvillingerne|erfaktisk|g\\\xe1r|harvasket|harplukketjordb\\\xe6rtil|plukketjordb\\\xe6r|klaverfireh\\\xe6ndigt|erj\\\xe6vnaldrende|tierjeg|Hvorerden|0veraltjeg|g\\\xe5rp\\\xe5|finderjeg|serhans|tiderbliver|ellertrist|forst\\\xe5rjeres|Hvorsj\\\xe6len|finderro|sidderjeg|tagerjo|efterjeres|10O|besluttedejeg|varsket|uadskillige|harjetlag|lkke|lntet|afsl\\\xf8rerjeg|m\\\xe5jeg|Vl|atbygge|detmakabre|vilikke|talsmandbekr\\\xe6fter|vedatrenovere|fors\\\xf8geratforst\\\xe5|ersket|morderp\\\xe5|frifodiRosewood|holdtpressem\\\xf8de|lngen|lND|henterjeg|lsabel|lsabels|vinderjo|r\\\xf8dmerjo|etjakkes\\\xe6t|gl\\\xe6derjeg|lgen|ls\\\xe6r|iparken|n\\\xe5rl|tilA1|FBl|viljo|detp\\\xe5|KIar|PIan|EIIer|FIot|AIIe|AIt|KIap|PIaza|SIap|I\\\xe5|BIing|GIade|Iejrb\\\xe5lssange|bedtjer|h\\\xf8rerjeg|F\\\xe5rjeg|fikJames|atsnakke|varkun|retterjeg|ernormale|viljeg|S\\\xe6tjer|udsatham)(\\b|$)"}}, + 'WholeWords': {'data': OrderedDict([(u'Haner', u'Han er'), (u'JaveL', u'Javel'), (u'Pa//e', u'Palle'), (u'bffte', u'bitte'), (u'Utro//gt', u'Utroligt'), (u'Kommerdu', u'Kommer du'), (u'smi/er', u'smiler'), (u'/eg', u'leg'), (u'harvinger', u'har vinger'), (u'/et', u'let'), (u'erjeres', u'er jeres'), (u'hardet', u'har det'), (u't\xe6nktjer', u't\xe6nkt jer'), (u'erjo', u'er jo'), (u'sti/', u'stil'), (u'Iappe', u'lappe'), (u'Beklagel\xe7', u'Beklager,'), (u'vardet', u'var det'), (u'afden', u'af den'), (u'snupperjeg', u'snupper jeg'), (u'ikkejeg', u'ikke jeg'), (u'bliverjeg', u'bliver jeg'), (u'hartravit', u'har travlt'), (u'pandekagef/ag', u'pandekageflag'), (u'Stormvarsell', u'Stormvarsel!'), (u'stormvejn', u'stormvejr.'), (u'morgenkomp/et', u'morgenkomplet'), (u'/yv', u'lyv'), (u'varjo', u'var jo'), (u'/eger', u'leger'), (u'harjeg', u'har jeg'), (u'havdejeg', u'havde jeg'), (u'hvorjeg', u'hvor jeg'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'g\xe5rvi', u'g\xe5r vi'), (u'atjeg', u'at jeg'), (u'isine', u'i sine'), (u'f\xe5rjeg', u'f\xe5r jeg'), (u'k\xe6rtighed', u'k\xe6rlighed'), (u'skullejeg', u'skulle jeg'), (u'laest', u'l\xe6st'), (u'laese', u'l\xe6se'), (u'g\xf8rjeg', u'g\xf8r jeg'), (u'g\xf8rvi', u'g\xf8r vi'), (u'angrerjo', u'angrer jo'), (u'Hvergang', u'Hver gang'), (u'erder', u'er der'), (u'villetilgive', u'ville tilgive'), (u'\ufb01eme', u'fjeme'), (u'genopst\xe5ri', u'genopst\xe5r i'), (u'svigtejer', u'svigte jer'), (u'kommernu', u'kommer nu'), (u'n\xe5rman', u'n\xe5r man'), (u'erfire', u'er fire'), (u'Hvorfor\ufb01nderdu', u'Hvorfor \ufb01nder du'), (u'undertigt', u'underligt'), (u'itroen', u'i troen'), (u'erl\xf8gnt', u'er l\xf8gn!'), (u'g\xf8rden', u'g\xf8r den'), (u'forhelvede', u'for helvede'), (u'hjpe', u'hj\xe6lpe'), (u'togeti', u'toget i'), (u'M\xe5jeg', u'M\xe5 jeg'), (u'savnerjer', u'savner jer'), (u'erjeg', u'er jeg'), (u'vaere', u'v\xe6re'), (u'geme', u'gerne'), (u'trorp\xe5', u'tror p\xe5'), (u'forham', u'for ham'), (u'afham', u'af ham'), (u'harjo', u'har jo'), (u'ovema\ufb01et', u'overnattet'), (u'begae\ufb01ighed', u'beg\xe6rlighed'), (u'sy\u2019g', u'syg'), (u'Imensjeg', u'Imens jeg'), (u'bliverdu', u'bliver du'), (u'\ufb01ser', u'fiser'), (u'manipuierer', u'manipulerer'), (u'forjeg', u'for jeg'), (u'iivgivendefor', u'livgivende for'), (u'formig', u'for mig'), (u'Hardu', u'Har du'), (u'fornold', u'forhold'), (u'defrelste', u'de frelste'), (u'S\xe5jeg', u'S\xe5 jeg'), (u'varjeg', u'var jeg'), (u'g\xf8rved', u'g\xf8r ved'), (u'kalderjeg', u'kalder jeg'), (u'\ufb02ytte', u'flytte'), (u'handlerdet', u'handler det'), (u'trorjeg', u'tror jeg'), (u'\ufb02ytter', u'flytter'), (u'soverjeg', u'sover jeg'), (u'\ufb01nderud', u'\ufb01nder ud'), (u'naboerp\xe5', u'naboer p\xe5'), (u'ervildt', u'er vildt'), (u'v\xe6reher', u'v\xe6re her'), (u'hyggerjer', u'hygger jer'), (u'borjo', u'bor jo'), (u'kommerikke', u'kommer ikke'), (u'folkynde', u'forkynde'), (u'farglad', u'far glad'), (u'misterjeg', u'mister jeg'), (u'\ufb01nt', u'fint'), (u'Harl', u'Har I'), (u'bedejer', u'bede jer'), (u'synesjeg', u'synes jeg'), (u'vartil', u'var til'), (u'eren', u'er en'), (u'\\Al', u'Vil'), (u'\\A', u'Vi'), (u'fjeme', u'fjerne'), (u'Iigefyldt', u'lige fyldt'), (u'ertil', u'er til'), (u'fa\ufb01igt', u'farligt'), (u'\ufb01nder', u'finder'), (u'\ufb01ndes', u'findes'), (u'irettesae\ufb01else', u'irettes\xe6ttelse'), (u'ermed', u'er med'), (u'\xe8n', u'\xe9n'), (u'gikjoi', u'gik jo i'), (u'Hvisjeg', u'Hvis jeg'), (u'ovema\ufb01er', u'overnatter'), (u'hoident', u'holdent'), (u'\\Adne', u'Vidne'), (u'fori', u'for i'), (u'vei', u'vel'), (u'savnerjerjo', u'savner jer jo'), (u'elskerjer', u'elsker jer'), (u'harl\xf8jet', u'har l\xf8jet'), (u'eri', u'er i'), (u'\ufb01ende', u'fjende'), (u'derjo', u'der jo'), (u'sigerjo', u'siger jo'), (u'menerjeg', u'mener jeg'), (u'Harjeg', u'Har jeg'), (u'sigerjeg', u'siger jeg'), (u'splitterjeg', u'splitter jeg'), (u'erjournalist', u'er journalist'), (u'erjoumalist', u'er journalist'), (u'Forjeg', u'For jeg'), (u'g\xe2rjeg', u'g\xe5r jeg'), (u'N\xe2rjeg', u'N\xe5r jeg'), (u'a\ufb02lom', u'afkom'), (u'farerjo', u'farer jo'), (u'tagerjeg', u'tager jeg'), (u'Virkerjeg', u'Virker jeg'), (u'morerjer', u'morer jer'), (u'kommerjo', u'kommer jo'), (u'istand', u'i stand'), (u'b\xf8m', u'b\xf8rn'), (u'frygterjeg', u'frygter jeg'), (u'kommerjeg', u'kommer jeg'), (u'eriournalistelev', u'er journalistelev'), (u'harfat', u'har fat'), (u'f\xe5r\ufb01ngre', u'f\xe5r \ufb01ngre'), (u'sl\xe2rjeg', u'sl\xe5r jeg'), (u'bam', u'barn'), (u'erjournalistelev', u'er journalistelev'), (u'politietjo', u'politiet jo'), (u'elskerjo', u'elsker jo'), (u'vari', u'var i'), (u'fornemmerjeres', u'fornemmer jeres'), (u'udkl\xe6kketl', u'udkl\xe6kket!'), (u'\xed', u'i'), (u'nyi', u'ny i'), (u'Iumijelse', u'forn\xf8jelse'), (u'vures', u'vores'), (u'I/Vash\xedngtan', u'Washington'), (u'opleverjeg', u'oplever jeg'), (u'PANTEL\xc3NER', u'PANTEL\xc5NER'), (u'Gudmurgen', u'Godmorgen'), (u'SKYDEV\xc3BEN', u'SKYDEV\xc5BEN'), (u'P\xc3LIDELIG', u'P\xc5LIDELIG'), (u'avertalte', u'overtalte'), (u'Oms\xedder', u'Omsider'), (u'lurteb\xe5d', u'lorteb\xe5d'), (u'Telrslning', u'Tekstning'), (u'miU\xf8', u'milj\xf8'), (u'g\xe5ri', u'g\xe5r i'), (u'Fan/el', u'Farvel'), (u'abe\ufb01\xe6s', u'abefj\xe6s'), (u'hartalt', u'har talt'), (u'\\\xc5rkelig', u'Virkelig'), (u'beklagerjeg', u'beklager jeg'), (u'N\xe5rjeg', u'N\xe5r jeg'), (u'rnaend', u'm\xe6nd'), (u'vaskebjorn', u'vaskebj\xf8rn'), (u'Ivil', u'I vil'), (u'besog', u'bes\xf8g'), (u'Vaer', u'V\xe6r'), (u'Undersogte', u'Unders\xf8gte'), (u'modte', u'm\xf8dte'), (u'toj', u't\xf8j'), (u'fodt', u'f\xf8dt'), (u'gore', u'g\xf8re'), (u'provede', u'pr\xf8vede'), (u'forste', u'f\xf8rste'), (u'igang', u'i gang'), (u'ligenu', u'lige nu'), (u'clet', u'det'), (u'Strombell', u'Strombel!'), (u'tmvlt', u'travlt'), (u'studererjournalistik', u'studerer journalistik'), (u'inforrnererjeg', u'informerer jeg'), (u'omk\ufb01ng', u'omkring'), (u'tilAsg\xe5rd', u'til Asg\xe5rd'), (u'Kederjeg', u'Keder jeg'), (u'jaettetamp', u'j\xe6ttetamp'), (u'erjer', u'er jer'), (u'atjulehygge', u'at julehygge'), (u'Ueneste', u'tjeneste'), (u'foltsaetter', u'forts\xe6tter'), (u'A/ice', u'Alice'), (u'tvivlerjeg', u'tvivler jeg'), (u'henterjer', u'henter jer'), (u'forst\xe5rjeg', u'forst\xe5r jeg'), (u'hvisjeg', u'hvis jeg'), (u'/\xe6rt', u'l\xe6rt'), (u'vfgtrgt', u'vigtigt'), (u'hurtigtjeg', u'hurtigt jeg'), (u'kenderjo', u'kender jo'), (u'seiv', u'selv'), (u'/\xe6gehuset', u'l\xe6gehuset'), (u'herjo', u'her jo'), (u'stolerjeg', u'stoler jeg'), (u'digi', u'dig i'), (u'taberi', u'taber i'), (u'sl\xe5rjeres', u'sl\xe5r jeres'), (u'laere', u'l\xe6re'), (u'tr\xe6nerwushu', u'tr\xe6ner wushu'), (u'efterjeg', u'efter jeg'), (u'e\ufb01er', u'efter'), (u'dui', u'du i'), (u'a\ufb01en', u'aften'), (u'bliveri', u'bliver i'), (u'acceptererjer', u'accepterer jer'), (u'drikkerjo', u'drikker jo'), (u'\ufb01anjin', u'Tianjin'), (u'erl\xe6nge', u'er l\xe6nge'), (u'erikke', u'er ikke'), (u'medjer', u'med jer'), (u'Tmykke', u'Tillykke'), (u"'\ufb01anjins", u'Tianjins'), (u'Mesteri', u'Mester i'), (u'sagdetil', u'sagde til'), (u'indei', u'inde i'), (u'o\ufb01e', u'ofte'), (u"'\ufb01lgiv", u'Tilgiv'), (u'Lf\xe5r', u'I f\xe5r'), (u'viserjer', u'viser jer'), (u'Rejsjerblot', u'Rejs jer blot'), (u"'\ufb01llad", u'Tillad'), (u'iiiie\ufb01nger', u'lille\ufb01nger'), (u'VILOMFATTE', u'VIL OMFATTE'), (u'mo\ufb01o', u'motto'), (u'g\xf8rjer', u'g\xf8r jer'), (u'gifi', u'gift'), (u'hardu', u'har du'), (u'gi\ufb01', u'gift'), (u'Iaeggerjeg', u'l\xe6gger jeg'), (u'iet', u'i et'), (u'sv/yte', u'svigte'), (u'ti/', u'til'), (u'Wdal', u'Vidal'), (u'\ufb01\xe5et', u'f\xe5et'), (u'Hvo/for', u'Hvorfor'), (u'hellerikke', u'heller ikke'), (u'Wlle', u'Ville'), (u'dr/ver', u'driver'), (u'V\\\ufb02lliam', u'William'), (u'V\\\ufb02lliams', u'Williams'), (u'Vk\ufb01lliam', u'William'), (u'v\xe5dejakke', u'v\xe5de jakke'), (u'k\xe6\ufb02l', u'k\xe6ft!'), (u'sagdejeg', u'sagde jeg'), (u'oven/ejet', u'overvejet'), (u'karameisauce', u'karamelsauce'), (u'Lf\xf8lgej\xf8disk', u'If\xf8lge j\xf8disk'), (u'blevjo', u'blev jo'), (u'asiateri', u'asiater i'), (u'erV\\\ufb02lliam', u'er William'), (u'lidt\ufb02ov', u'lidt \ufb02ov'), (u'sagdejo', u'sagde jo'), (u'erlige', u'er lige'), (u'Vt\ufb01lliam', u'William'), (u'W\ufb01II', u'Will'), (u'a\ufb02darede', u'afklarede'), (u'hj\xe6iperjeg', u'hj\xe6lper jeg'), (u'laderjeg', u'lader jeg'), (u'H\xe2ndledsbeskyttere', u'H\xe5ndledsbeskyttere'), (u'Lsabels', u'Isabels'), (u'G\xf8rjeg', u'G\xf8r jeg'), (u'm\xe2jeg', u'm\xe5 jeg'), (u'ogjeg', u'og jeg'), (u'gjordejeg', u'gjorde jeg'), (u'villejeg', u'ville jeg'), (u'Vl\ufb02lliams', u'Williams'), (u'Dajeg', u'Da jeg'), (u'iorden', u'i orden'), (u'fandtjeg', u'fandt jeg'), (u'Tilykke', u'Tillykke'), (u'k\xf8rerjer', u'k\xf8rer jer'), (u'g\xf8fjeg', u'g\xf8r jeg'), (u'Selvflgelig', u'Selvf\xf8lgelig'), (u'fdder', u'fadder'), (u'bnfaldt', u'b\xf8nfaldt'), (u't\\/ehovedede', u'tvehovedede'), (u'EIler', u'Eller'), (u'ringerjeg', u'ringer jeg'), (u'blevv\xe6k', u'blev v\xe6k'), (u'st\xe1rjeg', u'st\xe5r jeg'), (u'varforbi', u'var forbi'), (u'harfortalt', u'har fortalt'), (u'iflere', u'i flere'), (u't\xf8rjeg', u't\xf8r jeg'), (u'kunnejeg', u'kunne jeg'), (u'm\xe1', u'm\xe5'), (u'hart\xe6nkt', u'har t\xe6nkt'), (u'F\xe1rjeg', u'F\xe5r jeg'), (u'afdelingervar', u'afdelinger var'), (u'0rd', u'ord'), (u'p\xe1st\xe1', u'p\xe5st\xe5'), (u'gr\xe1haret', u'gr\xe5haret'), (u'varforbl\xf8ffende', u'var forbl\xf8ffende'), (u'holdtjeg', u'holdt jeg'), (u'h\xe6ngerjo', u'h\xe6nger jo'), (u'fikjeg', u'fik jeg'), (u'f\xe1r', u'f\xe5r'), (u'Hvorforf\xf8lerjeg', u'Hvorfor f\xf8ler jeg'), (u'harfeber', u'har feber'), (u'\xe1ndssvagt', u'\xe5ndssvagt'), (u'0g', u'Og'), (u'vartre', u'var tre'), (u'abner', u'\xe5bner'), (u'garjeg', u'g\xe5r jeg'), (u'sertil', u'ser til'), (u'hvorfin', u'hvor fin'), (u'harfri', u'har fri'), (u'forstarjeg', u'forst\xe5r jeg'), (u'S\xe4', u'S\xe5'), (u'hvorfint', u'hvor fint'), (u'm\xe6rkerjeg', u'm\xe6rker jeg'), (u'ogsa', u'ogs\xe5'), (u'n\xe1rjeg', u'n\xe5r jeg'), (u'Jas\xe1', u'Jas\xe5'), (u'b\xe1ndoptager', u'b\xe5ndoptager'), (u'bed\xe1rende', u'bed\xe5rende'), (u's\xe1', u's\xe5'), (u'n\xe1r', u'n\xe5r'), (u'kunnejo', u'kunne jo'), (u'Brammertil', u'Brammer til'), (u'serjeg', u'ser jeg'), (u'gikjeg', u'gik jeg'), (u'udholderjeg', u'udholder jeg'), (u'm\xe1neder', u'm\xe5neder'), (u'vartr\xe6t', u'var tr\xe6t'), (u'd\xe1rligt', u'd\xe5rligt'), (u'klaretjer', u'klaret jer'), (u'pavirkelig', u'p\xe5virkelig'), (u'spekulererjeg', u'spekulerer jeg'), (u'fors\xf8gerjeg', u'fors\xf8ger jeg'), (u'huskerjeg', u'husker jeg'), (u'ifavnen', u'i favnen'), (u'skullejo', u'skulle jo'), (u'vartung', u'var tung'), (u'varfuldst\xe6ndig', u'var fuldst\xe6ndig'), (u'Paskedag', u'P\xe5skedag'), (u'turi', u'tur i'), (u'spillerschumanns', u'spiller Schumanns'), (u'forst\xe1rjeg', u'forst\xe5r jeg'), (u'istedet', u'i stedet'), (u'n\xe1rfrem', u'n\xe5r frem'), (u'habertrods', u'h\xe5ber trods'), (u'forf\xf8rste', u'for f\xf8rste'), (u'varto', u'var to'), (u'overtil', u'over til'), (u'forfem', u'for fem'), (u'holdtjo', u'holdt jo'), (u'passerjo', u'passer jo'), (u'ellerto', u'eller to'), (u'hartrods', u'har trods'), (u'harfuldst\xe6ndig', u'har fuldst\xe6ndig'), (u'g\xe5rjeg', u'g\xe5r jeg'), (u'giderjeg', u'gider jeg'), (u'forjer', u'for jer'), (u'erindrerjeg', u'erindrer jeg'), (u't\xe6nkerjeg', u't\xe6nker jeg'), (u'GAEt', u'G\xc5ET'), (u'h\xf8rerjo', u'h\xf8rer jo'), (u'forladerjeg', u'forlader jeg'), (u'kosterjo', u'koster jo'), (u'fort\xe6llerjeg', u'fort\xe6ller jeg'), (u'Forstyrrerjeg', u'Forstyrrer jeg'), (u'tjekkerjeg', u'tjekker jeg'), (u'erjurist', u'er jurist'), (u'tlLBUD', u'TILBUD'), (u'serjo', u'se rjo'), (u'bederjeg', u'beder jeg'), (u'bilderjeg', u'bilder jeg'), (u'ULVEtlME', u'ULVETlME'), (u'sk\xe6rerjo', u'sk\xe6rer jo'), (u'afjer', u'af jer'), (u'ordnerjeg', u'ordner jeg'), (u'giverjeg', u'giver jeg'), (u'rejservi', u'rejser vi'), (u'fangerjeg', u'fanger jeg'), (u'erjaloux', u'er jaloux'), (u'glemmerjeg', u'glemmer jeg'), (u'Beh\xf8verjeg', u'Beh\xf8ver jeg'), (u'harvi', u'har vi'), (u'ertyndere', u'er tyndere'), (u'f\xe5rtordenvejr', u'f\xe5r tordenvejr'), (u'varf\xe6rdig', u'var f\xe6rdig'), (u'h\xf8rerfor', u'h\xf8rer for'), (u'varvel', u'var vel'), (u'erforbi', u'er forbi'), (u'AIle', u'Alle'), (u'l\xe6serjo', u'l\xe6ser jo'), (u'Edgarer', u'Edgar er'), (u'hartaget', u'har taget'), (u'derer', u'der er'), (u'stikkerfrem', u'stikker frem'), (u'haraldrig', u'har aldrig'), (u'ellerfar', u'eller far'), (u'erat', u'er at'), (u'turtil', u'tur til'), (u'erf\xe6rdig', u'er f\xe6rdig'), (u'f\xf8lerjeg', u'f\xf8ler jeg'), (u'jerfra', u'jer fra'), (u'eralt', u'er alt'), (u'harfaktisk', u'har faktisk'), (u'harfundet', u'har fundet'), (u'harvendt', u'har vendt'), (u'Kunstneraf', u'Kunstner af'), (u'ervel', u'er vel'), (u'st\xe5ransigt', u'st\xe5r ansigt'), (u'Erjeg', u'Er jeg'), (u'venterjeg', u'venter jeg'), (u'Hvorvar', u'Hvor var'), (u'varfint', u'var fint'), (u'ervarmt', u'er varmt'), (u'g\xe5rfint', u'g\xe5r fint'), (u'flyverforbi', u'flyver forbi'), (u'Dervar', u'Der var'), (u'dervar', u'der var'), (u'mener\xe5ndeligt', u'mener \xe5ndeligt'), (u'forat', u'for at'), (u'herovertil', u'herover til'), (u'soverfor', u'sover for'), (u'begyndtejeg', u'begyndte jeg'), (u'vendertilbage', u'vender tilbage'), (u'erforf\xe6rdelig', u'er forf\xe6rdelig'), (u'g\xf8raltid', u'g\xf8r altid'), (u'ertilbage', u'er tilbage'), (u'harv\xe6ret', u'har v\xe6ret'), (u'bagoverellertil', u'bagover eller til'), (u'hertaler', u'her taler'), (u'v\xe5gnerjeg', u'v\xe5gner jeg'), (u'vartomt', u'var tomt'), (u'g\xe5rfrem', u'g\xe5r frem'), (u'talertil', u'taler til'), (u'ertryg', u'er tryg'), (u'ansigtervendes', u'ansigter vendes'), (u'hervirkeligt', u'her virkeligt'), (u'herer', u'her er'), (u'dr\xf8mmerjo', u'dr\xf8mmer jo'), (u'erfuldkommen', u'er fuldkommen'), (u'hveren', u'hver en'), (u'erfej', u'er fej'), (u'datterforg\xe6ves', u'datter forg\xe6ves'), (u'fors\xf8gerjo', u'fors\xf8ger jo'), (u'ertom', u'er tom'), (u'vareftermiddag', u'var eftermiddag'), (u'vartom', u'var tom'), (u'angerellerforventninger', u'anger eller forventninger'), (u'k\xf8rtejeg', u'k\xf8rte jeg'), (u'Hvorforfort\xe6ller', u'Hvorfor fort\xe6ller'), (u'g\xe5rtil', u'g\xe5r til'), (u'ringerefter', u'ringer efter'), (u's\xf8gertilflugt', u's\xf8ger tilflugt'), (u'ertvunget', u'er tvunget'), (u'megetjeg', u'meget jeg'), (u'varikke', u'var ikke'), (u'Derermange', u'Der e rmange'), (u'dervilhindre', u'der vil hindre'), (u'ers\xe5', u'er s\xe5'), (u'Detforst\xe5rLeggodt', u'Det forst\xe5r jeg godt'), (u'ergodt', u'er godt'), (u'vorventen', u'vor venten'), (u'tagerfejl', u'tager fejl'), (u'ellerer', u'eller er'), (u'laverjeg', u'laver jeg'), (u'0mgang', u'omgang'), (u'afst\xe1r', u'afst\xe5r'), (u'p\xe1', u'p\xe5'), (u'rejserjeg', u'rejser jeg'), (u'ellertage', u'eller tage'), (u'takkerjeg', u'takker jeg'), (u'ertilf\xe6ldigvis', u'er tilf\xe6ldigvis'), (u'fremstar', u'fremst\xe5r'), (u'ert\xe6t', u'er t\xe6t'), (u'ijeres', u'i jeres'), (u'Sagdejeg', u'Sagde jeg'), (u'overi', u'over i'), (u'plukkerjordb\xe6r', u'plukker jordb\xe6r'), (u'klarerjeg', u'klarer jeg'), (u'jerfire', u'jer fire'), (u't\xe1beligste', u't\xe5beligste'), (u'sigertvillingerne', u'siger tvillingerne'), (u'erfaktisk', u'er faktisk'), (u'g\xe1r', u'g\xe5r'), (u'harvasket', u'har vasket'), (u'harplukketjordb\xe6rtil', u'har plukket jordb\xe6r til'), (u'plukketjordb\xe6r', u'plukket jordb\xe6r'), (u'klaverfireh\xe6ndigt', u'klaver fireh\xe6ndigt'), (u'erj\xe6vnaldrende', u'er j\xe6vnaldrende'), (u'tierjeg', u'tier jeg'), (u'Hvorerden', u'Hvor er den'), (u'0veraltjeg', u'overalt jeg'), (u'g\xe5rp\xe5', u'g\xe5r p\xe5'), (u'finderjeg', u'finder jeg'), (u'serhans', u'ser hans'), (u'tiderbliver', u'tider bliver'), (u'ellertrist', u'eller trist'), (u'forst\xe5rjeres', u'forst\xe5r jeres'), (u'Hvorsj\xe6len', u'Hvor sj\xe6len'), (u'finderro', u'finder ro'), (u'sidderjeg', u'sidder jeg'), (u'tagerjo', u'tager jo'), (u'efterjeres', u'efter jeres'), (u'10O', u'100'), (u'besluttedejeg', u'besluttede jeg'), (u'varsket', u'var sket'), (u'uadskillige', u'uadskillelige'), (u'harjetlag', u'har jetlag'), (u'lkke', u'Ikke'), (u'lntet', u'Intet'), (u'afsl\xf8rerjeg', u'afsl\xf8rer jeg'), (u'm\xe5jeg', u'm\xe5 jeg'), (u'Vl', u'VI'), (u'atbygge', u'at bygge'), (u'detmakabre', u'det makabre'), (u'vilikke', u'vil ikke'), (u'talsmandbekr\xe6fter', u'talsmand bekr\xe6fter'), (u'vedatrenovere', u'ved at renovere'), (u'fors\xf8geratforst\xe5', u'fors\xf8ger at forst\xe5'), (u'ersket', u'er sket'), (u'morderp\xe5', u'morder p\xe5'), (u'frifodiRosewood', u'fri fod i Rosewood'), (u'holdtpressem\xf8de', u'holdt pressem\xf8de'), (u'lngen', u'Ingen'), (u'lND', u'IND'), (u'henterjeg', u'henter jeg'), (u'lsabel', u'Isabel'), (u'lsabels', u'Isabels'), (u'vinderjo', u'vinder jo'), (u'r\xf8dmerjo', u'r\xf8dmer jo'), (u'etjakkes\xe6t', u'et jakkes\xe6t'), (u'gl\xe6derjeg', u'gl\xe6der jeg'), (u'lgen', u'Igen'), (u'ls\xe6r', u'Is\xe6r'), (u'iparken', u'i parken'), (u'n\xe5rl', u'n\xe5r I'), (u'tilA1', u'til A1'), (u'FBl', u'FBI'), (u'viljo', u'vil jo'), (u'detp\xe5', u'det p\xe5'), (u'KIar', u'Klar'), (u'PIan', u'Plan'), (u'EIIer', u'Eller'), (u'FIot', u'Flot'), (u'AIIe', u'Alle'), (u'AIt', u'Alt'), (u'KIap', u'Klap'), (u'PIaza', u'Plaza'), (u'SIap', u'Slap'), (u'I\xe5', u'l\xe5'), (u'BIing', u'Bling'), (u'GIade', u'Glade'), (u'Iejrb\xe5lssange', u'lejrb\xe5lssange'), (u'bedtjer', u'bedt jer'), (u'h\xf8rerjeg', u'h\xf8rer jeg'), (u'F\xe5rjeg', u'F\xe5r jeg'), (u'fikJames', u'fik James'), (u'atsnakke', u'at snakke'), (u'varkun', u'var kun'), (u'retterjeg', u'retter jeg'), (u'ernormale', u'er normale'), (u'viljeg', u'vil jeg'), (u'S\xe6tjer', u'S\xe6t jer'), (u'udsatham', u'udsat ham'), (u'afen', u'af en'), (u'p\xe5jorden', u'p\xe5 jorden'), (u'afdem', u'af dem'), (u'kmt', u'km/t')]), + 'pattern': u"(?um)(\\b|^)(?:Haner|JaveL|Pa\\/\\/e|bffte|Utro\\/\\/gt|Kommerdu|smi\\/er|\\/eg|harvinger|\\/et|erjeres|hardet|t\\\xe6nktjer|erjo|sti\\/|Iappe|Beklagel\\\xe7|vardet|afden|snupperjeg|ikkejeg|bliverjeg|hartravit|pandekagef\\/ag|Stormvarsell|stormvejn|morgenkomp\\/et|\\/yv|varjo|\\/eger|harjeg|havdejeg|hvorjeg|n\\\xe5rjeg|g\\\xe5rvi|atjeg|isine|f\\\xe5rjeg|k\\\xe6rtighed|skullejeg|laest|laese|g\\\xf8rjeg|g\\\xf8rvi|angrerjo|Hvergang|erder|villetilgive|\\\ufb01eme|genopst\\\xe5ri|svigtejer|kommernu|n\\\xe5rman|erfire|Hvorfor\\\ufb01nderdu|undertigt|itroen|erl\\\xf8gnt|g\\\xf8rden|forhelvede|hjpe|togeti|M\\\xe5jeg|savnerjer|erjeg|vaere|geme|trorp\\\xe5|forham|afham|harjo|ovema\\\ufb01et|begae\\\ufb01ighed|sy\\\u2019g|Imensjeg|bliverdu|\\\ufb01ser|manipuierer|forjeg|iivgivendefor|formig|Hardu|fornold|defrelste|S\\\xe5jeg|varjeg|g\\\xf8rved|kalderjeg|\\\ufb02ytte|handlerdet|trorjeg|\\\ufb02ytter|soverjeg|\\\ufb01nderud|naboerp\\\xe5|ervildt|v\\\xe6reher|hyggerjer|borjo|kommerikke|folkynde|farglad|misterjeg|\\\ufb01nt|Harl|bedejer|synesjeg|vartil|eren|\\\\Al|\\\\A|fjeme|Iigefyldt|ertil|fa\\\ufb01igt|\\\ufb01nder|\\\ufb01ndes|irettesae\\\ufb01else|ermed|\\\xe8n|gikjoi|Hvisjeg|ovema\\\ufb01er|hoident|\\\\Adne|fori|vei|savnerjerjo|elskerjer|harl\\\xf8jet|eri|\\\ufb01ende|derjo|sigerjo|menerjeg|Harjeg|sigerjeg|splitterjeg|erjournalist|erjoumalist|Forjeg|g\\\xe2rjeg|N\\\xe2rjeg|a\\\ufb02lom|farerjo|tagerjeg|Virkerjeg|morerjer|kommerjo|istand|b\\\xf8m|frygterjeg|kommerjeg|eriournalistelev|harfat|f\\\xe5r\\\ufb01ngre|sl\\\xe2rjeg|bam|erjournalistelev|politietjo|elskerjo|vari|fornemmerjeres|udkl\\\xe6kketl|\\\xed|nyi|Iumijelse|vures|I\\/Vash\\\xedngtan|opleverjeg|PANTEL\\\xc3NER|Gudmurgen|SKYDEV\\\xc3BEN|P\\\xc3LIDELIG|avertalte|Oms\\\xedder|lurteb\\\xe5d|Telrslning|miU\\\xf8|g\\\xe5ri|Fan\\/el|abe\\\ufb01\\\xe6s|hartalt|\\\\\\\xc5rkelig|beklagerjeg|N\\\xe5rjeg|rnaend|vaskebjorn|Ivil|besog|Vaer|Undersogte|modte|toj|fodt|gore|provede|forste|igang|ligenu|clet|Strombell|tmvlt|studererjournalistik|inforrnererjeg|omk\\\ufb01ng|tilAsg\\\xe5rd|Kederjeg|jaettetamp|erjer|atjulehygge|Ueneste|foltsaetter|A\\/ice|tvivlerjeg|henterjer|forst\\\xe5rjeg|hvisjeg|\\/\\\xe6rt|vfgtrgt|hurtigtjeg|kenderjo|seiv|\\/\\\xe6gehuset|herjo|stolerjeg|digi|taberi|sl\\\xe5rjeres|laere|tr\\\xe6nerwushu|efterjeg|e\\\ufb01er|dui|a\\\ufb01en|bliveri|acceptererjer|drikkerjo|\\\ufb01anjin|erl\\\xe6nge|erikke|medjer|Tmykke|\\'\\\ufb01anjins|Mesteri|sagdetil|indei|o\\\ufb01e|\\'\\\ufb01lgiv|Lf\\\xe5r|viserjer|Rejsjerblot|\\'\\\ufb01llad|iiiie\\\ufb01nger|VILOMFATTE|mo\\\ufb01o|g\\\xf8rjer|gifi|hardu|gi\\\ufb01|Iaeggerjeg|iet|sv\\/yte|ti\\/|Wdal|\\\ufb01\\\xe5et|Hvo\\/for|hellerikke|Wlle|dr\\/ver|V\\\\\\\ufb02lliam|V\\\\\\\ufb02lliams|Vk\\\ufb01lliam|v\\\xe5dejakke|k\\\xe6\\\ufb02l|sagdejeg|oven\\/ejet|karameisauce|Lf\\\xf8lgej\\\xf8disk|blevjo|asiateri|erV\\\\\\\ufb02lliam|lidt\\\ufb02ov|sagdejo|erlige|Vt\\\ufb01lliam|W\\\ufb01II|a\\\ufb02darede|hj\\\xe6iperjeg|laderjeg|H\\\xe2ndledsbeskyttere|Lsabels|G\\\xf8rjeg|m\\\xe2jeg|ogjeg|gjordejeg|villejeg|Vl\\\ufb02lliams|Dajeg|iorden|fandtjeg|Tilykke|k\\\xf8rerjer|g\\\xf8fjeg|Selvflgelig|fdder|bnfaldt|t\\\\\\/ehovedede|EIler|ringerjeg|blevv\\\xe6k|st\\\xe1rjeg|varforbi|harfortalt|iflere|t\\\xf8rjeg|kunnejeg|m\\\xe1|hart\\\xe6nkt|F\\\xe1rjeg|afdelingervar|0rd|p\\\xe1st\\\xe1|gr\\\xe1haret|varforbl\\\xf8ffende|holdtjeg|h\\\xe6ngerjo|fikjeg|f\\\xe1r|Hvorforf\\\xf8lerjeg|harfeber|\\\xe1ndssvagt|0g|vartre|abner|garjeg|sertil|hvorfin|harfri|forstarjeg|S\\\xe4|hvorfint|m\\\xe6rkerjeg|ogsa|n\\\xe1rjeg|Jas\\\xe1|b\\\xe1ndoptager|bed\\\xe1rende|s\\\xe1|n\\\xe1r|kunnejo|Brammertil|serjeg|gikjeg|udholderjeg|m\\\xe1neder|vartr\\\xe6t|d\\\xe1rligt|klaretjer|pavirkelig|spekulererjeg|fors\\\xf8gerjeg|huskerjeg|ifavnen|skullejo|vartung|varfuldst\\\xe6ndig|Paskedag|turi|spillerschumanns|forst\\\xe1rjeg|istedet|n\\\xe1rfrem|habertrods|forf\\\xf8rste|varto|overtil|forfem|holdtjo|passerjo|ellerto|hartrods|harfuldst\\\xe6ndig|g\\\xe5rjeg|giderjeg|forjer|erindrerjeg|t\\\xe6nkerjeg|GAEt|h\\\xf8rerjo|forladerjeg|kosterjo|fort\\\xe6llerjeg|Forstyrrerjeg|tjekkerjeg|erjurist|tlLBUD|serjo|bederjeg|bilderjeg|ULVEtlME|sk\\\xe6rerjo|afjer|ordnerjeg|giverjeg|rejservi|fangerjeg|erjaloux|glemmerjeg|Beh\\\xf8verjeg|harvi|ertyndere|f\\\xe5rtordenvejr|varf\\\xe6rdig|h\\\xf8rerfor|varvel|erforbi|AIle|l\\\xe6serjo|Edgarer|hartaget|derer|stikkerfrem|haraldrig|ellerfar|erat|turtil|erf\\\xe6rdig|f\\\xf8lerjeg|jerfra|eralt|harfaktisk|harfundet|harvendt|Kunstneraf|ervel|st\\\xe5ransigt|Erjeg|venterjeg|Hvorvar|varfint|ervarmt|g\\\xe5rfint|flyverforbi|Dervar|dervar|mener\\\xe5ndeligt|forat|herovertil|soverfor|begyndtejeg|vendertilbage|erforf\\\xe6rdelig|g\\\xf8raltid|ertilbage|harv\\\xe6ret|bagoverellertil|hertaler|v\\\xe5gnerjeg|vartomt|g\\\xe5rfrem|talertil|ertryg|ansigtervendes|hervirkeligt|herer|dr\\\xf8mmerjo|erfuldkommen|hveren|erfej|datterforg\\\xe6ves|fors\\\xf8gerjo|ertom|vareftermiddag|vartom|angerellerforventninger|k\\\xf8rtejeg|Hvorforfort\\\xe6ller|g\\\xe5rtil|ringerefter|s\\\xf8gertilflugt|ertvunget|megetjeg|varikke|Derermange|dervilhindre|ers\\\xe5|Detforst\\\xe5rLeggodt|ergodt|vorventen|tagerfejl|ellerer|laverjeg|0mgang|afst\\\xe1r|p\\\xe1|rejserjeg|ellertage|takkerjeg|ertilf\\\xe6ldigvis|fremstar|ert\\\xe6t|ijeres|Sagdejeg|overi|plukkerjordb\\\xe6r|klarerjeg|jerfire|t\\\xe1beligste|sigertvillingerne|erfaktisk|g\\\xe1r|harvasket|harplukketjordb\\\xe6rtil|plukketjordb\\\xe6r|klaverfireh\\\xe6ndigt|erj\\\xe6vnaldrende|tierjeg|Hvorerden|0veraltjeg|g\\\xe5rp\\\xe5|finderjeg|serhans|tiderbliver|ellertrist|forst\\\xe5rjeres|Hvorsj\\\xe6len|finderro|sidderjeg|tagerjo|efterjeres|10O|besluttedejeg|varsket|uadskillige|harjetlag|lkke|lntet|afsl\\\xf8rerjeg|m\\\xe5jeg|Vl|atbygge|detmakabre|vilikke|talsmandbekr\\\xe6fter|vedatrenovere|fors\\\xf8geratforst\\\xe5|ersket|morderp\\\xe5|frifodiRosewood|holdtpressem\\\xf8de|lngen|lND|henterjeg|lsabel|lsabels|vinderjo|r\\\xf8dmerjo|etjakkes\\\xe6t|gl\\\xe6derjeg|lgen|ls\\\xe6r|iparken|n\\\xe5rl|tilA1|FBl|viljo|detp\\\xe5|KIar|PIan|EIIer|FIot|AIIe|AIt|KIap|PIaza|SIap|I\\\xe5|BIing|GIade|Iejrb\\\xe5lssange|bedtjer|h\\\xf8rerjeg|F\\\xe5rjeg|fikJames|atsnakke|varkun|retterjeg|ernormale|viljeg|S\\\xe6tjer|udsatham|afen|p\\\xe5jorden|afdem|kmt)(\\b|$)"}}, 'deu': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'IVI', u'M'), (u'IVl', u'M'), (u'I\\/I', u'M'), (u'I\\/l', u'M'), (u'lVI', u'M'), (u'lVl', u'M'), (u'l\\/I', u'M'), (u'l\\/l', u'M'), (u'\xa4', u'o'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'IVI', u'M'), (u'IVl', u'M'), (u'I\\/I', u'M'), (u'I\\/l', u'M'), (u'lVI', u'M'), (u'lVl', u'M'), (u'l\\/I', u'M'), (u'l\\/l', u'M'), (u'\xa4', u'o')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, 'WholeWords': {'data': OrderedDict([(u'/a', u'Ja'), (u'/ch', u'Ich'), (u'/d/of', u'Idiot'), (u'/ebte', u'lebte'), (u'/eid', u'leid'), (u'/hn', u'ihn'), (u'/hnen', u'Ihnen'), (u'/hr', u'Ihr'), (u'/hre', u'Ihre'), (u'/hren', u'Ihren'), (u'/m', u'im'), (u'/mmer', u'immer'), (u'/n', u'In'), (u'/ndividuen', u'Individuen'), (u'/nn', u'Inn'), (u'/oe', u'Joe'), (u'/sf', u'ist'), (u'/sf/0/1n', u'Ist John'), (u'/ungs', u'Jungs'), (u'/Vfinuten', u'Minuten'), (u'/\xe9nger', u'l\xe4nger'), (u'/\xe9uft', u'l\xe4uft'), (u'0/1', u'Oh'), (u'0/me', u'ohne'), (u'0/vne', u'ohne'), (u'00om', u'000 m'), (u'100m', u'100 m'), (u'120m', u'120 m'), (u'13Oj\xa7hrie', u'130-j\xe4hrige'), (u'145m', u'145 m'), (u'150m', u'150 m'), (u'160m', u'160 m'), (u'165m', u'165 m'), (u'19m', u'19 m'), (u'20m', u'20 m'), (u'27m', u'27 m'), (u'30m', u'30 m'), (u'37m', u'37 m'), (u'38m', u'38 m'), (u'3km', u'3 km'), (u'5/ch', u'sich'), (u'5/cher', u'sicher'), (u'5/cherer', u'sicherer'), (u'5/e', u'Sie'), (u'5/nd', u'Sind'), (u'500m', u'500 m'), (u'5ulSere', u'\xe4u\xdfere'), (u'60m', u'60 m'), (u'6de', u'\xf6de'), (u'6dere', u'\xf6dere'), (u'6ffne', u'\xf6ffne'), (u'6ffnen', u'\xf6ffnen'), (u'6ffnet', u'\xd6ffnet'), (u'6fter', u'\xf6fter'), (u'750m', u'750 m'), (u'85m', u'85 m'), (u'90m', u'90 m'), (u'a//em', u'allem'), (u'A//es', u'Alles'), (u'abbeif$en', u'abbei\xdfen'), (u'abdrficken', u'abdr\xfccken'), (u'aBen', u'a\xdfen'), (u'abergl\xe9iubischen', u'abergl\xe4ubischen'), (u'aberja', u'aber ja'), (u'aberjemand', u'aber jemand'), (u'Aberjetzt', u'Aber jetzt'), (u'abf\xe9hrt', u'abf\xe4hrt'), (u'abf\xe9illt', u'abf\xe4llt'), (u'abgef\xe9rbt', u'abgef\xe4rbt'), (u'abgeh\xe9ngt', u'abgeh\xe4ngt'), (u'abgeh\xe9rt', u'abgeh\xf6rt'), (u'abgelost', u'abgel\xf6st'), (u'abgesprengli', u'abgesprengt!'), (u'abgestfirztl', u'abgest\xfcrzt'), (u'abgestilrzt', u'abgest\xfcrzt'), (u'abgestofien', u'abgesto\xdfen'), (u'abgew\xe9hlt', u'abgew\xe4hlt'), (u'abgew\xe9hnen', u'abgew\xf6hnen'), (u'abgew\xe9hnt', u'abgew\xf6hnt'), (u'abge\xe9nderten', u'abge\xe4nderten'), (u'abh\xe9ingt', u'abh\xe4ngt'), (u'abh\xe9ngen', u'abh\xe4ngen'), (u'abh\xe9ngig', u'abh\xe4ngig'), (u'abh\xe9ngiges', u'abh\xe4ngiges'), (u'Abh\xe9rstationen', u'Abh\xf6rstationen'), (u'Abjetzt', u'Ab jetzt'), (u'abkfihlen', u'abk\xfchlen'), (u'Abkfirzung', u'Abk\xfcrzung'), (u'abkommlich', u'abk\xf6mmlich'), (u'Ablegenl', u'Ablegen!'), (u'ablfisen', u'abl\xf6sen'), (u'ablosen', u'abl\xf6sen'), (u'Ablosung', u'Abl\xf6sung'), (u'abreif$en', u'abrei\xdfen'), (u'Abrijcken', u'Abr\xfccken'), (u'abr\xe9umen', u'abr\xe4umen'), (u'Absch/ed', u'Abschied'), (u'abschiefien', u'abschie\xdfen'), (u'abschlief$en', u'abschlie\xdfen'), (u'abschliefien', u'abschlie\xdfen'), (u'abschwiiren', u'abschw\xf6ren'), (u'abstoflsend', u'absto\xdfend'), (u'Abtrijnnige', u'Abtr\xfcnnige'), (u'abwiirgt', u'abw\xfcrgt'), (u'abw\xe9gen', u'abw\xe4gen'), (u'abzuh\xe9ren', u'abzuh\xf6ren'), (u'abzuschwiiren', u'abzuschw\xf6ren'), (u'abzusfofien', u'abzusto\xdfen'), (u'ACh', u'Ach'), (u'Achtungl', u'Achtung!'), (u'Achzen', u'\xc4chzen'), (u'ACHZT', u'\xc4CHZT'), (u'Acic', u'Acid'), (u'ADDRESSDATEI', u'ADRESSDATEI'), (u'Adi\xf6s', u'Adi\xf3s'), (u'Admiralitat', u'Admiralit\xe4t'), (u'Admiralit\xe9it', u'Admiralit\xe4t'), (u'Admiralit\xe9t', u'Admiralit\xe4t'), (u'Aff\xe9re', u'Aff\xe4re'), (u'Aff\xe9ren', u'Aff\xe4ren'), (u'AFl', u'AFI'), (u'aggresivem', u'aggressivem'), (u'Agypten', u'\xc4gypten'), (u'aher', u'aber'), (u'AI/en/vichtigste', u'Allerwichtigste'), (u'Ain/vays', u'Airways'), (u'AIs', u'Als'), (u'Aktivit\xe9iten', u'Aktivit\xe4ten'), (u'Aktivit\xe9ten', u'Aktivit\xe4ten'), (u'AKTMERT', u'AKTIVIERT'), (u'Alarmsfufe', u'Alarmstufe'), (u'albem', u'albern'), (u'Albtriiume', u'Albtr\xe4ume'), (u'ale', u'als'), (u'alleinl', u'allein!'), (u'allejubeln', u'alle jubeln'), (u'allern\xe9chsten', u'allern\xe4chsten'), (u'Allmiichtigerl', u'Allm\xe4chtiger!'), (u'Allm\xe9chtige', u'Allm\xe4chtige'), (u'Allm\xe9chtiger', u'Allm\xe4chtiger'), (u'allm\xe9hlich', u'allm\xe4hlich'), (u'Allm\xe9ichtiger', u'Allm\xe4chtiger'), (u'Allsparkl', u'Allspark!'), (u'allt\xe9iglichen', u'allt\xe4glichen'), (u'ALTESTE', u'\xc4LTESTE'), (u'Altester', u'\xc4ltester'), (u'Alzte', u'\xc4rzte'), (u"Amerx'kaner", u'Amerikaner'), (u'amfisierst', u'am\xfcsierst'), (u'Amiilsierst', u'Am\xfcsierst'), (u'amiisieren', u'am\xfcsieren'), (u'amiisierenl', u'am\xfcsieren!'), (u'amiisierte', u'am\xfcsierte'), (u'Amijsant', u'Am\xfcsant'), (u'amlllsant', u'am\xfcsant'), (u'amlllsiert', u'am\xfcsiert'), (u'amtlsant', u'am\xfcsant'), (u'Amusanf', u'Am\xfcsant'), (u'amusant', u'am\xfcsant'), (u'Amusiert', u'Am\xfcsiert'), (u'Anderst', u'\xc4nderst'), (u'Anderung', u'\xc4nderung'), (u'Anderungen', u'\xc4nderungen'), (u"anfa'ngt", u'anf\xe4ngt'), (u'Anffihrer', u'Anf\xfchrer'), (u'Anffingerl', u'Anf\xe4nger!'), (u'Anfiihrer', u'Anf\xfchrer'), (u'anfijhlt', u'anf\xfchlt'), (u'Anfingerl', u'Anf\xe4nger!'), (u'Anfuhrer', u'Anf\xfchrer'), (u'Anfuhrern', u'Anf\xfchrern'), (u'Anf\xe9inger', u'Anf\xe4nger'), (u'Anf\xe9ingergliick', u'Anf\xe4ngergl\xfcck'), (u'Anf\xe9nge', u'Anf\xe4nge'), (u'anf\xe9ngst', u'anf\xe4ngst'), (u'anf\xe9ngt', u'anf\xe4ngt'), (u'angebrfillt', u'angebr\xfcllt'), (u'angebrullt', u'angebr\xfcllt'), (u'angefiihrt', u'angef\xfchrt'), (u'ANGEHCHDRIGE', u'ANGEH\xd6RIGE'), (u'angehfirt', u'angeh\xf6rt'), (u'Angehtirigen', u'Angeh\xf6rigen'), (u'angeh\xe9ren', u'angeh\xf6ren'), (u'angeh\xe9rt', u'angeh\xf6rt'), (u'angel\xe9chelt', u'angel\xe4chelt'), (u'angerilhrt', u'anger\xfchrt'), (u'anger\ufb02hrt', u'anger\xfchrt'), (u'angeschweifit', u'angeschwei\xdft'), (u'angespruht', u'angespr\xfcht'), (u'angetiltert', u'anget\xfctert'), (u'Angriffspl\xe9nen', u'Angriffspl\xe4nen'), (u'Angstschweili', u'Angstschwei\xdf'), (u'anhiiren', u'anh\xf6ren'), (u'Anh\xe9inger', u'Anh\xe4nger'), (u'anh\xe9lt', u'anh\xe4lt'), (u'anh\xe9ngen', u'anh\xe4ngen'), (u'anh\xe9ren', u'anh\xf6ren'), (u'ankijndigen', u'ank\xfcndigen'), (u'anliigen', u'anl\xfcgen'), (u'anlugen', u'anl\xfcgen'), (u'anmal3ende', u'anma\xdfende'), (u'ann\xe9hern', u'ann\xe4hern'), (u'anriihrst', u'anr\xfchrst'), (u'anrijuhren', u'anr\xfchren'), (u'anst\xe9indig', u'anst\xe4ndig'), (u'anst\xe9indiger', u'anst\xe4ndiger'), (u'anst\xe9indiges', u'anst\xe4ndiges'), (u'anst\xe9ndig', u'anst\xe4ndig'), (u'anst\xe9ndige', u'anst\xe4ndige'), (u'anst\xe9ndigen', u'anst\xe4ndigen'), (u'Anst\xe9ndiges', u'Anst\xe4ndiges'), (u'Antik\xe9rper', u'Antik\xf6rper'), (u'Antiquit\xe9t', u'Antiquit\xe4t'), (u'Antistrahlenger\xe9t', u'Antistrahlenger\xe4t'), (u'antwortenl', u'antworten!'), (u'Anwe/sung', u'Anweisung'), (u'Anwe/sungen', u'Anweisungen'), (u'Anw\xe9iltin', u'Anw\xe4ltin'), (u'Anw\xe9lte', u'Anw\xe4lte'), (u'Anw\xe9ltin', u'Anw\xe4ltin'), (u'Anzilge', u'Anz\xfcge'), (u'Anztinden', u'Anz\xfcnden'), (u'Anzuge', u'Anz\xfcge'), (u'Anzugen', u'Anz\xfcgen'), (u'anzuhiiren', u'anzuh\xf6ren'), (u'anzuhoren', u'anzuh\xf6ren'), (u'anzundenl', u'anz\xfcnden!'), (u'anzupiibeln', u'anzup\xf6beln'), (u'An\xe9sthesie', u'An\xe4sthesie'), (u'An\xe9sthesieprofessor', u'An\xe4sthesieprofessor'), (u'An\xe9sthesieteam', u'An\xe4sthesieteam'), (u'An\xe9sthesist', u'An\xe4sthesist'), (u'An\xe9sthesisten', u'An\xe4sthesisten'), (u'An\xe9sthetikum', u'An\xe4sthetikum'), (u'ARBEITERI', u'ARBEITER:'), (u'Arbeitsfl\ufb02gel', u'Arbeitsfl\xfcgel'), (u'Armeefunkger\xe9t', u'Armeefunkger\xe4t'), (u'Armel', u'\xc4rmel'), (u'Arschkichern', u'Arschl\xf6chern'), (u'Arschliicher', u'Arschl\xf6cher'), (u'Arschliichern', u'Arschl\xf6chern'), (u'Arschl\xe9cher', u'Arschl\xf6cher'), (u'Arschl\xe9chern', u'Arschl\xf6chern'), (u'Arzte', u'\xc4rzte'), (u'Arzten', u'\xc4rzten'), (u'Arztin', u'\xc4rztin'), (u'Atemger\xe9usche', u'Atemger\xe4usche'), (u'Atlantikkiiste', u'Atlantikk\xfcste'), (u'Atlantikkuste', u'Atlantikk\xfcste'), (u'ATMOSPHARE', u'ATMOSPH\xc4RE'), (u'Atmosph\xe9re', u'Atmosph\xe4re'), (u'Atmosph\xe9renbereich', u'Atmosph\xe4renbereich'), (u'Atmosph\xe9reneinflugsequenz', u'Atmosph\xe4reneinflugsequenz'), (u'Atmosph\xe9reneintritt', u'Atmosph\xe4reneintritt'), (u'Attenfaiter', u'Attent\xe4ter'), (u'Attent\xe9iter', u'Attent\xe4ter'), (u'Attent\xe9ter', u'Attent\xe4ter'), (u'Attent\xe9ters', u'Attent\xe4ters'), (u'Attraktivit\xe9t', u'Attraktivit\xe4t'), (u'auBen', u'au\xdfen'), (u'Aubenblick', u'Augenblick'), (u'AuBenbord', u'Au\xdfenbord'), (u'AuBenwelt', u'Au\xdfenwelt'), (u'auBer', u'au\xdfer'), (u'AuBerdem', u'Au\xdferdem'), (u'auBerhalb', u'au\xdferhalb'), (u'auc/1', u'auch'), (u'auchl', u'auch!'), (u'Auf$erdem', u'Au\xdferdem'), (u'auf3er', u'au\xdfer'), (u'aufAugenh6he', u'auf Augenh\xf6he'), (u'aufblilhende', u'aufbl\xfchende'), (u"auff'a'ngt", u'auff\xe4ngt'), (u'Auff\xe9lliges', u'Auff\xe4lliges'), (u'aufgebltiht', u'aufgebl\xfcht'), (u'aufgeftlhrt', u'aufgef\xfchrt'), (u'aufgeh\xe9ingt', u'aufgeh\xe4ngt'), (u'aufgeh\xe9rt', u'aufgeh\xf6rt'), (u'aufgekl\xe9rt', u'aufgekl\xe4rt'), (u'aufger\xe9umt', u'aufger\xe4umt'), (u'aufgespiefit', u'aufgespie\xdft'), (u'aufgewiihlter', u'aufgew\xfchlter'), (u'aufgez\xe9hlt', u'aufgez\xe4hlt'), (u'Aufh6ren', u'Aufh\xf6ren'), (u'aufhbren', u'aufh\xf6ren'), (u'aufhdrf', u'aufh\xf6rt'), (u'aufhfiren', u'aufh\xf6ren'), (u'aufhiiren', u'aufh\xf6ren'), (u'Aufhoren', u'Aufh\xf6ren'), (u'Aufh\xe9iren', u'Aufh\xf6ren'), (u'aufh\xe9ngen', u'aufh\xe4ngen'), (u'Aufh\xe9ren', u'Aufh\xf6ren'), (u'aufh\xe9renl', u'aufh\xf6ren'), (u'aufi', u'auf,'), (u'Aufienministerium', u'Au\xdfenministerium'), (u'aufier', u'au\xdfer'), (u'Aufierdem', u'Au\xdferdem'), (u'aufiergew\xe9hnliche', u'au\xdfergew\xf6hnliche'), (u'aufierhalb', u'au\xdferhalb'), (u'Aufierirdischer', u'Au\xdferirdischer'), (u'Aufierlich', u'\xc4u\xdferlich'), (u'aufierordentlich', u'au\xdferordentlich'), (u'Aufkenposten', u'Au\xdfenposten'), (u'aufkisen', u'aufl\xf6sen'), (u'aufkl\xe9ren', u'aufkl\xe4ren'), (u'Aufkl\xe9rung', u'Aufkl\xe4rung'), (u'aufl', u'auf!'), (u'Aufl6sung', u'Aufl\xf6sung'), (u'aufliisen', u'aufl\xf6sen'), (u'auflser', u'au\xdfer'), (u'aufl\xe9sen', u'aufl\xf6sen'), (u'aufmiibeln', u'aufm\xf6beln'), (u'aufraumte', u'aufr\xe4umte'), (u'aufr\xe9umen', u'aufr\xe4umen'), (u'aufschlief$en', u'aufschlie\xdfen'), (u'Aufschlull', u'Aufschluss'), (u'aufSer', u'au\xdfer'), (u'aufSIJBigkeiten', u'auf S\xfc\xdfigkeiten'), (u'aufspturen', u'aufsp\xfcren'), (u'aufstellenl', u'aufstellen!'), (u'Aufst\xe9ndige', u'Aufst\xe4ndische'), (u'aufTanis', u'auf Tanis'), (u'Auftr\xe9ge', u'Auftr\xe4ge'), (u'aufvv\xe9ndigen', u'aufw\xe4ndigen'), (u'aufw\xe9ichst', u'aufw\xe4chst'), (u'aufw\xe9rmen', u'aufw\xe4rmen'), (u'aufZ>er', u'au\xdfer'), (u'Aufztlge', u'Aufz\xfcge'), (u'aufzuhiivren', u'aufzuh\xf6ren'), (u'aufzukl\xe9ren', u'aufzukl\xe4ren'), (u'aufzuldsen', u'aufzul\xf6sen'), (u'aufzur\xe9umen', u'aufzur\xe4umen'), (u'aufz\xe9hlen', u'aufz\xe4hlen'), (u'auf\xe9er', u'au\xdfer'), (u'auf\ufb02iegen', u'auffliegen'), (u'Augenm\xe9igen', u'Augenm\xe4gen'), (u"aul'5er", u'au\xdfer'), (u'aul3er', u'au\xdfer'), (u'Aul3erdem', u'Au\xdferdem'), (u'aul5er', u'au\xdfer'), (u'aulier', u'au\xdfer'), (u'Aulierdem', u'Au\xdferdem'), (u'auliergewfihnlich', u'au\xdfergew\xf6hnlich'), (u'aulierhalb', u'au\xdferhalb'), (u'Aulierirdischen', u'Au\xdferirdischen'), (u'auller', u'au\xdfer'), (u'aullerhalb', u'au\xdferhalb'), (u'AulSer', u'Au\xdfer'), (u'AulSerdem', u'Au\xdferdem'), (u'ausdriicken', u'ausdr\xfccken'), (u'ausdriickt', u'ausdr\xfcckt'), (u'ausdrijcken', u'ausdr\xfccken'), (u'ausdrucklicher', u'ausdr\xfccklicher'), (u'Ausdr\ufb02cken', u'Ausdr\xfccken'), (u'Ausen/v\xe9hlte', u'Auserw\xe4hlte'), (u'Ausen/v\xe9hlter', u'Auserw\xe4hlter'), (u'auserw\xe9hlt', u'auserw\xe4hlt'), (u'Ausffillen', u'Ausf\xfcllen'), (u'ausfijhren', u'ausf\xfchren'), (u'ausfijhrt', u'ausf\xfchrt'), (u'ausfuhren', u'ausf\xfchren'), (u'ausfullt', u'ausf\xfcllt'), (u'ausgef\ufb02llt', u'ausgef\xfcllt'), (u'ausgeliischt', u'ausgel\xf6scht'), (u'ausgeliist', u'ausgel\xf6st'), (u'ausgel\xe9ist', u'ausgel\xf6st'), (u'ausgel\xe9scht', u'ausgel\xf6scht'), (u'ausgel\xe9st', u'ausgel\xf6st'), (u'ausgeriickt', u'ausger\xfcckt'), (u'ausgerijstet', u'ausger\xfcstet'), (u'AUSGEWAHLT', u'AUSGEW\xc4HLT'), (u'ausgew\xe9hlt', u'ausgew\xe4hlt'), (u'Ausg\xe9ngen', u'Ausg\xe4ngen'), (u'aush6hlen', u'aush\xf6hlen'), (u'aushiilt', u'aush\xe4lt'), (u'Aushilfspunkerl', u'Aushilfspunker!'), (u'aush\xe9lt', u'aush\xe4lt'), (u'ausilben', u'aus\xfcben'), (u'Auskunfte', u'Ausk\xfcnfte'), (u'ausl', u'aus!'), (u'Ausl\xe9nder', u'Ausl\xe4nder'), (u'Ausl\xe9nderl', u'Ausl\xe4nder'), (u'ausl\xe9schen', u'ausl\xf6schen'), (u'ausl\xe9sen', u'ausl\xf6sen'), (u'Ausl\xe9ser', u'Ausl\xf6ser'), (u'AusmaB', u'Ausma\xdf'), (u'ausprobie\ufb02', u'ausprobiert'), (u'Ausriistung', u'Ausr\xfcstung'), (u'ausrusten', u'ausr\xfcsten'), (u'Ausrustung', u'Ausr\xfcstung'), (u'Ausschullware', u'Ausschussware'), (u'ausschwinnenl', u'ausschw\xe4rmen!'), (u'auszudriicken', u'auszudr\xfccken'), (u'auszuschliefien', u'auszuschlie\xdfen'), (u'auszuw\xe9hlen', u'auszuw\xe4hlen'), (u'Autorit\xe9t', u'Autorit\xe4t'), (u'Autoschlilssel', u'Autoschl\xfcssel'), (u'Autoschl\ufb02ssel', u'Autoschl\xfcssel'), (u'au\ufb02/viihlt', u'aufw\xfchlt'), (u'Au\ufb02ergewiihnlich', u'Au\xdfergew\xf6hnlich'), (u'Azevedol', u'Azevedo!'), (u'A\ufb02es', u'Alles'), (u'B/ick', u'Blick'), (u'b/olog/sch', u'biologisch'), (u'b/sschen', u'bisschen'), (u'B6se', u'B\xf6se'), (u'B6sem', u'B\xf6sem'), (u'B6ser', u'B\xf6ser'), (u'Babym\xe9dchen', u'Babym\xe4dchen'), (u'Ballastst\xe9ffchen', u'Ballastst\xf6ffchen'), (u'Ballm\xe9dchen', u'Ballm\xe4dchen'), (u'Ballm\xe9idchen', u'Ballm\xe4dchen'), (u'Ballonverk\xe9ufer', u'Ballonverk\xe4ufer'), (u'Balzenl', u'Balzen!'), (u'Bankijberfall', u'Bank\xfcberfall'), (u'Barbarenilberfall', u'Barbaren\xfcberfall'), (u'Barenk\xe9nig', u'Barenk\xf6nig'), (u'basfeln', u'basteln'), (u'Bastianol', u'Bastiano!'), (u'Bastlano', u'Bastiano'), (u'Bauchfellentztmdung', u'Bauchfellentz\xfcndung'), (u'Bauchkr\xe9mpfe', u'Bauchkr\xe4mpfe'), (u'bauf\xe9llig', u'bauf\xe4llig'), (u'bauf\xe9llige', u'bauf\xe4llige'), (u'Baumst\xe9mme', u'Baumst\xe4mme'), (u'Baupl\xe9ne', u'Baupl\xe4ne'), (u'Bbses', u'B\xf6ses'), (u'be/de', u'beide'), (u'bedecktl', u'bedeckt!'), (u'Bedilrfnisse', u'Bed\xfcrfnisse'), (u'Bedilrfnissen', u'Bed\xfcrfnissen'), (u'Bedllirfnisse', u'Bed\xfcrfnisse'), (u'bedrijckt', u'bedr\xfcckt'), (u'bedr\xe9ngen', u'bedr\xe4ngen'), (u'bedr\xe9ngt', u'bedr\xe4ngt'), (u'bedr\xe9ngten', u'bedr\xe4ngten'), (u'Beeilungf', u'Beeilung!'), (u'Beeilungl', u'Beeilung!'), (u'Beerdingungsinsiiiui', u'Beerdigungsinstitut'), (u'Beerdingungsinstitut', u'Beerdigungsinstitut'), (u'Befehll', u'Befehl!'), (u'beffirdert', u'bef\xf6rdert'), (u'Beffirderung', u'Bef\xf6rderung'), (u'befiirchte', u'bef\xfcrchte'), (u'befiirchteten', u'bef\xfcrchteten'), (u'befiirdert', u'bef\xf6rdert'), (u'befiirderte', u'bef\xf6rderte'), (u'Befiirderung', u'Bef\xf6rderung'), (u'befilrchtete', u'bef\xfcrchtete'), (u'befllirchte', u'bef\xfcrchte'), (u'befurworte', u'bef\xfcrworte'), (u'befurwortet', u'bef\xfcrwortet'), (u'bef\xe9rdere', u'bef\xf6rdere'), (u'bef\xe9rdert', u'bef\xf6rdert'), (u'Bef\xe9rderung', u'Bef\xf6rderung'), (u'beg/ng', u'beging'), (u'begl\ufb02ckt', u'begl\xfcckt'), (u'begniigt', u'begn\xfcgt'), (u'begrfindetes', u'begr\xfcndetes'), (u'Begriiliungsruf', u'Begr\xfc\xdfungsruf'), (u'begrijfien', u'begr\xfc\xdfen'), (u'Begrilfiung', u'Begr\xfc\xdfung'), (u'Begrilfkung', u'Begr\xfc\xdfung'), (u"begrL'llZ>en", u'begr\xfc\xdfen'), (u'BegrUBungsruf', u'Begr\xfc\xdfungsruf'), (u'begrUf$t', u'begr\xfc\xdft'), (u'begrufie', u'begr\xfc\xdfe'), (u'begrufit', u'begr\xfc\xdft'), (u'Begrundung', u'Begr\xfcndung'), (u'Beh6rden', u'Beh\xf6rden'), (u'beh\xe9lt', u'beh\xe4lt'), (u'Beh\xe9lter', u'Beh\xe4lter'), (u'beh\xe9mmert', u'beh\xe4mmert'), (u'beiB', u'bei\xdf'), (u'beiBen', u'bei\xdfen'), (u'beiBt', u'bei\xdft'), (u'beif$t', u'bei\xdft'), (u'beif2>en', u'bei\xdfen'), (u'beifken', u'bei\xdfen'), (u'beiflsen', u'bei\xdfen'), (u'beijenen', u'bei jenen'), (u'Beiliring', u'Bei\xdfring'), (u'BEKAMPFEN', u'BEK\xc4MPFEN'), (u'bekannf', u'bekannt'), (u'bekanntermafken', u'bekannterma\xdfen'), (u'bek\xe9me', u'bek\xe4me'), (u'bek\xe9mpfen', u'bek\xe4mpfen'), (u'Bek\xe9mpfung', u'Bek\xe4mpfung'), (u'bel', u'bei'), (u'belde', u'beide'), (u'beliellsen', u'belie\xdfen'), (u'belm', u'beim'), (u'Beltlftungstunnels', u'Bel\xfcftungstunnels'), (u'Beluftungstunnel', u'Bel\xfcftungstunnel'), (u'Beluftungstunnell', u'Bel\xfcftungstunnel!'), (u'bel\xe9stigen', u'bel\xe4stigen'), (u'Bemiihe', u'Bem\xfche'), (u'Bemiihen', u'Bem\xfchen'), (u"bemL'lhe", u'bem\xfche'), (u'bemtuht', u'bem\xfcht'), (u'bemuhen', u'bem\xfchen'), (u'bemuhten', u'bem\xfchten'), (u'Ben\xe9tigen', u'Ben\xf6tigen'), (u'ben\xe9tigt', u'ben\xf6tigt'), (u'ben\xe9tigten', u'ben\xf6tigten'), (u'Beobachtar', u'Beobachter'), (u'bereft', u'bereit'), (u'bereitf\xe9ndet', u'bereitf\xe4ndet'), (u'beriichtigtsten', u'ber\xfcchtigtsten'), (u'beriichtlgten', u'ber\xfcchtigten'), (u'beriihmt', u'ber\xfchmt'), (u'Beriihmtheiten', u'Ber\xfchmtheiten'), (u'beriihren', u'ber\xfchren'), (u'Beriihrend', u'Ber\xfchrend'), (u'beriihrt', u'ber\xfchrt'), (u'Beriihrtl', u'Ber\xfchrt!'), (u'berijhrt', u'ber\xfchrt'), (u'berilhmter', u'ber\xfchmter'), (u'berilhrt', u'ber\xfchrt'), (u'Berilhrung', u'Ber\xfchrung'), (u'Berks/1/re', u'Berkshire'), (u"BerL'lhre", u'Ber\xfchre'), (u'berllichtigter', u'ber\xfcchtigter'), (u'berllihren', u'ber\xfchren'), (u'berllihrt', u'ber\xfchrt'), (u'berlllhmten', u'ber\xfchmten'), (u'Bern/e', u'Bernie'), (u'beruhrt', u'ber\xfchrt'), (u'beruhrte', u'ber\xfchrte'), (u'ber\ufb02hmter', u'ber\xfchmter'), (u'besafi', u'besa\xdf'), (u"Besch'a'ftigt", u'Besch\xe4ftigt'), (u'bescheifien', u'beschei\xdfen'), (u'beschiftigt', u'besch\xe4ftigt'), (u'beschiiftigt', u'besch\xe4ftigt'), (u'beschiitzen', u'besch\xfctzen'), (u'beschiitzt', u'besch\xfctzt'), (u'beschiltze', u'besch\xfctze'), (u'beschiltzen', u'besch\xfctzen'), (u'beschleun/gt', u'beschleunigt'), (u'beschliefkt', u'beschlie\xdft'), (u'beschlie\ufb02tloszuziehen', u'beschlie\xdft loszuziehen'), (u'beschllitzet', u'besch\xfctzet'), (u'beschllitzt', u'besch\xfctzt'), (u'beschr\xe9nkt', u'beschr\xe4nkt'), (u'Beschr\xe9nkungen', u'Beschr\xe4nkungen'), (u'beschtitze', u'besch\xfctze'), (u'beschutzen', u'besch\xfctzen'), (u'besch\xe9digt', u'besch\xe4digt'), (u'besch\xe9ftigen', u'besch\xe4ftigen'), (u'besch\xe9ftigt', u'besch\xe4ftigt'), (u'besch\xe9ftigte', u'besch\xe4ftigte'), (u'besch\xe9ftigten', u'besch\xe4ftigten'), (u'besch\xe9iftige', u'besch\xe4ftige'), (u'besch\xe9iftigt', u'besch\xe4ftigt'), (u'Besch\xe9imen', u'Besch\xe4men'), (u'besch\xe9mendste', u'besch\xe4mendste'), (u'besch\xe9oligen', u'besch\xe4digen'), (u'besch\ufb02tzen', u'besch\xfctzen'), (u'Besch\ufb02tzer', u'Besch\xfctzer'), (u'Besf\xe9f/gen', u'Best\xe4tigen'), (u'Besitztijmer', u'Besitzt\xfcmer'), (u'BESTATIGE', u'BEST\xc4TIGE'), (u'BESTATIGT', u'BEST\xc4TIGT'), (u'bestenl', u'besten!'), (u'bestiirzt', u'best\xfcrzt'), (u'bestiitigen', u'best\xe4tigen'), (u'bestltigt', u'best\xe4tigt'), (u"bestx'mmt", u'bestimmt'), (u'best\xe9indige', u'best\xe4ndige'), (u'best\xe9itigt', u'best\xe4tigt'), (u'Best\xe9itigung', u'Best\xe4tigung'), (u'Best\xe9itigungen', u'Best\xe4tigungen'), (u'Best\xe9tige', u'Best\xe4tige'), (u'Best\xe9tigen', u'Best\xe4tigen'), (u'best\xe9tigt', u'best\xe4tigt'), (u'Best\xe9tigung', u'Best\xe4tigung'), (u'bes\xe9inftigen', u'bes\xe4nftigen'), (u'bes\xe9inftigt', u'bes\xe4nftigt'), (u'bes\xe9nftigen', u'bes\xe4nftigen'), (u'Betiiubt', u'Bet\xe4ubt'), (u'betriibt', u'betr\xfcbt'), (u'betriigen', u'betr\xfcgen'), (u'Betriiger', u'Betr\xfcger'), (u'betriigt', u'betr\xfcgt'), (u'betrijgen', u'betr\xfcgen'), (u'Betrijgerl', u'Betr\xfcger!'), (u'betrilgen', u'betr\xfcgen'), (u'betrtlgerischer', u'betr\xfcgerischer'), (u'betr\xe9chtliches', u'betr\xe4chtliches'), (u'Betr\xe9ge', u'Betr\xe4ge'), (u'betr\xe9gt', u'betr\xe4gt'), (u'Bettw\xe9ische', u'Bettw\xe4sche'), (u'Beviilkerung', u'Bev\xf6lkerung'), (u'bevorwir', u'bevor wir'), (u'bev\xe9lkern', u'bev\xf6lkern'), (u'bewegf', u'bewegt'), (u'Bew\xe9hrungsauflage', u'Bew\xe4hrungsauflage'), (u'bew\xe9ihrte', u'bew\xe4hrte'), (u'bew\xe9iltigen', u'bew\xe4ltigen'), (u'bew\xe9issern', u'bew\xe4ssern'), (u'bew\xe9lkten', u'bew\xf6lkten'), (u'bew\xe9ltigen', u'bew\xe4ltigen'), (u'Bew\xe9ltigung', u'Bew\xe4ltigung'), (u'bew\xe9ssern', u'bew\xe4ssern'), (u'Bew\xe9sserungssysteme', u'Bew\xe4sserungssysteme'), (u'Bezirksgelinde', u'Bezirksgel\xe4nde'), (u'bezuglich', u'bez\xfcglich'), (u'be\xe9ingstigende', u'be\xe4ngstigende'), (u'be\xe9ngstigend', u'be\xe4ngstigend'), (u'be\xe9ngstigender', u'be\xe4ngstigender'), (u'bffnen', u'\xf6ffnen'), (u'Bficher', u'B\xfccher'), (u'Bfiro', u'B\xfcro'), (u'bfirsten', u'b\xfcrsten'), (u'bfise', u'b\xf6se'), (u'bfisen', u'b\xf6sen'), (u'bfiser', u'b\xf6ser'), (u'bfises', u'b\xf6ses'), (u'bfiseste', u'b\xf6seste'), (u'bfisesten', u'b\xf6sesten'), (u'bgsonderen', u'besonderen'), (u'BI6de', u'Bl\xf6de'), (u'Bierbfichse', u'Bierb\xfcchse'), (u'Biicher', u'B\xfccher'), (u'Biicherei', u'B\xfccherei'), (u'Biick', u'B\xfcck'), (u'Biiffel', u'B\xfcffel'), (u'BIiHlt', u'Bl\xfcht'), (u'Biihne', u'B\xfchne'), (u'Biilcherei', u'B\xfccherei'), (u'BIind', u'Blind'), (u'Biirger', u'B\xfcrger'), (u'Biirgerrechte', u'B\xfcrgerrechte'), (u'Biiro', u'B\xfcro'), (u'Biiros', u'B\xfcros'), (u'Biirotiir', u'B\xfcrot\xfcr'), (u'biirsten', u'b\xfcrsten'), (u'Biise', u'B\xf6se'), (u'Biisen', u'B\xf6sen'), (u'biises', u'b\xf6ses'), (u'Bijchern', u'B\xfcchern'), (u'Bijhne', u'B\xfchne'), (u'Bijndnis', u'B\xfcndnis'), (u'Bijrger', u'B\xfcrger'), (u'Bijrgermeister', u'B\xfcrgermeister'), (u'Bijro', u'B\xfcro'), (u'Bijrokraten', u'B\xfcrokraten'), (u'Bijrzel', u'B\xfcrzel'), (u'Bilchern', u'B\xfcchern'), (u'Bildseitenverh\xe9ltnis', u'Bildseitenverh\xe4ltnis'), (u'Bilndel', u'B\xfcndel'), (u'Bilro', u'B\xfcro'), (u'BIood', u'Blood'), (u'BIQIS', u'Blo\xdf'), (u'Bischiife', u'Bisch\xf6fe'), (u'Bischiifen', u'Bisch\xf6fen'), (u'Bisch\xe9fe', u'Bisch\xf6fe'), (u'bistja', u'bist ja'), (u'bistjetzt', u'bist jetzt'), (u'Bittejetzt', u'Bitte jetzt'), (u'bittersiJl3es', u'bitters\xfc\xdfes'), (u'Bittesch\xe9n', u'Bittesch\xf6n'), (u'BIue', u'Blue'), (u'bi\xdfchen', u'bisschen'), (u'BL1hne', u'B\xfchne'), (u'Bl6cke', u'Bl\xf6cke'), (u'bl6d', u'bl\xf6d'), (u'bl6de', u'bl\xf6de'), (u'bl6den', u'bl\xf6den'), (u'bl6der', u'bl\xf6der'), (u'bl6des', u'bl\xf6des'), (u'Bl6dian', u'Bl\xf6dian'), (u'Bl6dmann', u'Bl\xf6dmann'), (u'Bl6dsinn', u'Bl\xf6dsinn'), (u'Blauaugel', u'Blauauge!'), (u'Blddes', u'Bl\xf6des'), (u'Ble/bf', u'Bleibt'), (u'bleibenl', u'bleiben!'), (u'blelbenl', u'blelben!'), (u'Blfidmann', u'Bl\xf6dmann'), (u'Blfidsinn', u'Bl\xf6dsinn'), (u'Blfimchen', u'Bl\xfcmchen'), (u'BLicher', u'B\xfccher'), (u'BLihne', u'B\xfchne'), (u'Bliid', u'Bl\xf6d'), (u'bliide', u'bl\xf6de'), (u'bliiden', u'bl\xf6den'), (u'bliidere', u'bl\xf6dere'), (u'bliides', u'bl\xf6des'), (u'Bliidmann', u'Bl\xf6dmann'), (u'Bliidsinn', u'Bl\xf6dsinn'), (u'bliiht', u'bl\xfcht'), (u'bliirgerlichen', u'b\xfcrgerlichen'), (u'Blijmchen', u'Bl\xfcmchen'), (u'Bllck', u'Blick'), (u'Bllindel', u'B\xfcndel'), (u'Blllroklammer', u'B\xfcroklammer'), (u'bln', u'bin'), (u'bloB', u'blo\xdf'), (u'bloBen', u'blo\xdfen'), (u'bloBstellen', u'blo\xdfstellen'), (u'blockiertl', u'blockiert!'), (u'BLODE', u'BL\xd6DE'), (u'blof$', u'blo\xdf'), (u'blofl', u'blo\xdf'), (u'Blol2>', u'Blo\xdf'), (u'blol3', u'blo\xdf'), (u'blol3>', u'blo\xdf'), (u'blol3stellen', u'blo\xdfstellen'), (u'bloli', u'blo\xdf'), (u'blolistellen', u'blo\xdfstellen'), (u'blolls', u'blo\xdf'), (u'bls', u'bis'), (u'Blst', u'Bist'), (u'bltte', u'bitte'), (u'Blumenstr\xe9iulichen', u'Blumenstr\xe4u\xdfchen'), (u'Blument\xe9pfen', u'Blument\xf6pfen'), (u'Blutgetr\xe4nkte', u'Blut getr\xe4nkte'), (u'Blutgetr\xe9nkte', u'Blutgetr\xe4nkte'), (u'blutjungl', u'blutjung!'), (u'blutriinstig', u'blutr\xfcnstig'), (u'Blutvergiefien', u'Blutvergie\xdfen'), (u'bl\xe9d', u'bl\xf6d'), (u'Bl\xe9de', u'Bl\xf6de'), (u'bl\xe9den', u'bl\xf6den'), (u'bl\xe9der', u'bl\xf6der'), (u'Bl\xe9des', u'Bl\xf6des'), (u'Bl\xe9dheit', u'Bl\xf6dheit'), (u'Bl\xe9dmann', u'Bl\xf6dmann'), (u'Bl\xe9dsinn', u'Bl\xf6dsinn'), (u'Bl\xe9iser', u'Bl\xe4ser'), (u'Bl\xe9ser', u'Bl\xe4ser'), (u'bl\xe9st', u'bl\xe4st'), (u'Bnjicke', u'Br\xfccke'), (u'Bodensch\xe9tze', u'Bodensch\xe4tze'), (u'Bogenschiefien', u'Bogenschie\xdfen'), (u'Bogenschiefienl', u'Bogenschie\xdfen!'), (u'Bogenschiefiens', u'Bogenschie\xdfens'), (u'Bogenschiitze', u'Bogensch\xfctze'), (u'Bogenschiitzen', u'Bogensch\xfctzen'), (u'Bogenschijtze', u'Bogensch\xfctze'), (u'Bogenschijtzen', u'Bogensch\xfctzen'), (u'Bogenschutzen', u'Bogensch\xfctzen'), (u'Bogenschutzenl', u'Bogensch\xfctzen!'), (u'BOnjour', u'Bonjour'), (u'bosartige', u'b\xf6sartige'), (u'Bracken', u'Brocken'), (u'Briicke', u'Br\xfccke'), (u'Briicken', u'Br\xfccken'), (u'Briider', u'Br\xfcder'), (u'Briihe', u'Br\xfche'), (u'Briillen', u'Br\xfcllen'), (u'briillt', u'br\xfcllt'), (u'Brijcke', u'Br\xfccke'), (u'Brijderlichkeit', u'Br\xfcderlichkeit'), (u'brijllen', u'br\xfcllen'), (u'Brilcke', u'Br\xfccke'), (u'Brilder', u'Br\xfcder'), (u'Brilllen', u'Br\xfcllen'), (u'brillltjeden', u'br\xfcllt jeden'), (u'Brilnette', u'Br\xfcnette'), (u'Brilsten', u'Br\xfcsten'), (u'brilten', u'br\xfcten'), (u"BrL'lcke", u'Br\xfccke'), (u"brL'lllen", u'br\xfcllen'), (u'brlliderliche', u'br\xfcderliche'), (u'Brllidern', u'Br\xfcdern'), (u'Brlliste', u'Br\xfcste'), (u'Broschijre', u'Brosch\xfcre'), (u'Broschilren', u'Brosch\xfcren'), (u'Broschuren', u'Brosch\xfcren'), (u'Brucke', u'Br\xfccke'), (u'Brucken', u'Br\xfccken'), (u'Brudern', u'Br\xfcdern'), (u'Bruhe', u'Br\xfche'), (u'brullen', u'br\xfcllen'), (u'brullt', u'br\xfcllt'), (u'Brutalitiit', u'Brutalit\xe4t'), (u'Brutzelhtihnchen', u'Brutzelh\xfchnchen'), (u'Br\xe9chtet', u'Br\xe4chtet'), (u'Br\xe9iutigam', u'Br\xe4utigam'), (u'Br\xe9sel', u'Br\xf6sel'), (u'Br\xe9tchen', u'Br\xf6tchen'), (u'br\xe9uchte', u'br\xe4uchte'), (u'br\xe9uchten', u'br\xe4uchten'), (u'br\xe9unen', u'br\xe4unen'), (u'Br\xe9ute', u'Br\xe4ute'), (u'Br\ufb02cke', u'Br\xfccke'), (u'Br\ufb02der', u'Br\xfcder'), (u'Btiro', u'B\xfcro'), (u'Btiser', u'B\xf6ser'), (u'Bucher', u'B\xfccher'), (u'Buchern', u'B\xfcchern'), (u'Budgetkiirzung', u'Budgetk\xfcrzung'), (u'BUFO', u'B\xfcro'), (u'Bugschutzgerate', u'Bugschutzger\xe4te'), (u'Buhnenbild', u'B\xfchnenbild'), (u'Bullel', u'Bulle!'), (u'Buml', u'Bum!'), (u'Bundnis', u'B\xfcndnis'), (u'Burger', u'B\xfcrger'), (u'Burgerrechtlerin', u'B\xfcrgerrechtlerin'), (u'Buro', u'B\xfcro'), (u'BURO', u'B\xdcRO'), (u'Burol', u'B\xfcro!'), (u'Burottlr', u'B\xfcrot\xfcr'), (u'Busche', u'B\xfcsche'), (u'B\xe9ickchen', u'B\xe4ckchen'), (u'B\xe9ickerei', u'B\xe4ckerei'), (u'B\xe9ille', u'B\xe4lle'), (u'B\xe9inder', u'B\xe4nder'), (u'B\xe9ir', u'B\xe4r'), (u'B\xe9irgermeister', u'B\xfcrgermeister'), (u'B\xe9iro', u'B\xfcro'), (u'b\xe9ise', u'b\xf6se'), (u'B\xe9iume', u'B\xe4ume'), (u'B\xe9nder', u'B\xe4nder'), (u'B\xe9r', u'B\xe4r'), (u'B\xe9ren', u'B\xe4ren'), (u'B\xe9renhasser', u'B\xe4renhasser'), (u'B\xe9renhunger', u'B\xe4renhunger'), (u'B\xe9renj\xe9ger', u'B\xe4renj\xe4ger'), (u'B\xe9renk\xe9nig', u'B\xe4renk\xf6nig'), (u'B\xe9renlaute', u'B\xe4renlaute'), (u'B\xe9renrolle', u'B\xe4renrolle'), (u'B\xe9renschnitzereien', u'B\xe4renschnitzereien'), (u'B\xe9renstimmen', u'B\xe4renstimmen'), (u'B\xe9rin', u'B\xe4rin'), (u'B\xe9risch', u'B\xe4risch'), (u'B\xe9rs', u'B\xe4rs'), (u'B\xe9rte', u'B\xe4rte'), (u'b\xe9s', u'b\xf6s'), (u'b\xe9se', u'b\xf6se'), (u'b\xe9sen', u'b\xf6sen'), (u'B\xe9ses', u'B\xf6ses'), (u'B\xe9ume', u'B\xe4ume'), (u'B\xe9umen', u'B\xe4umen'), (u'B\ufb02chern', u'B\xfcchern'), (u'B\ufb02ste', u'B\xfcste'), (u'Cafe', u'Caf\xe9'), (u'Caf\xe4', u'Caf\xe9'), (u'CASAREN', u'C\xc4SAREN'), (u'Charakterm\xe9ngel', u'Charakterm\xe4ngel'), (u'Charakterst\xe9rke', u'Charakterst\xe4rke'), (u'Chrlntlna', u'Christina'), (u'Ciden', u'\xf6den'), (u'Ciffnet', u'\xd6ffnet'), (u'Cihrchen', u'\xd6hrchen'), (u'Citro\xe9n', u'Citro\xebn'), (u'clamit', u'damit'), (u'class', u'dass'), (u'Clbernimmt', u'\xfcbernimmt'), (u'cler', u'der'), (u'Coimbrasl', u'Coimbras!'), (u'CommanderWill', u'Commander Will'), (u'Corenillal', u'Corenilla!'), (u'Cowboyscheifi', u'Cowboyschei\xdf'), (u'C\xe9sar', u'C\xe4sar'), (u'D/e', u'Die'), (u'd/ese', u'diese'), (u'd/esem', u'diesem'), (u'd/esen', u'diesen'), (u'D/eser', u'Dieser'), (u'D/eses', u'Dieses'), (u'D/sko', u'Disko'), (u'dabel', u'dabei'), (u'dachfen', u'dachten'), (u'daffir', u'daf\xfcr'), (u'dafiir', u'daf\xfcr'), (u'Dafijr', u'Daf\xfcr'), (u'Dafijur', u'Daf\xfcr'), (u'Dafilr', u'Daf\xfcr'), (u"dafL'lr", u'daf\xfcr'), (u'dafLir', u'daf\xfcr'), (u'dafljr', u'daf\xfcr'), (u'dafllir', u'daf\xfcr'), (u'Daflllrwar', u'Daf\xfcr war'), (u'daftir', u'daf\xfcr'), (u'dafUr', u'daf\xfcr'), (u'dafzjir', u'daf\xfcr'), (u'dajemand', u'da jemand'), (u'dal', u'da!'), (u'Damenh\xe9nde', u'Damenh\xe4nde'), (u'damitl', u'damit!'), (u'damlt', u'damit'), (u'DANEMARK', u'D\xc4NEMARK'), (u'darfiber', u'dar\xfcber'), (u'Dariiber', u'Dar\xfcber'), (u'darijber', u'dar\xfcber'), (u'Darilber', u'Dar\xfcber'), (u"dart/'ber", u'dar\xfcber'), (u'dartlber', u'dar\xfcber'), (u'DARUBER', u'DAR\xdcBER'), (u'DarUber', u'Dar\xfcber'), (u'dasjetzt', u'das jetzt'), (u'dasl', u'das!'), (u'Dateniibermittlung', u'Daten\xfcbermittlung'), (u'dauem', u'dauern'), (u'dauerf', u'dauert'), (u'dazugeh\xe9ren', u'dazugeh\xf6ren'), (u'Da\xdf', u'Dass'), (u'Da\ufb02lr', u'Daf\xfcr'), (u'Ddrfern', u'D\xf6rfern'), (u'def', u'der'), (u'Defekf/v', u'Detektiv'), (u'deinerZelle', u'deiner Zelle'), (u'deln', u'dein'), (u'delne', u'deine'), (u'demfiltigen', u'dem\xfctigen'), (u'Demijtigung', u'Dem\xfctigung'), (u'demllitige', u'dem\xfctige'), (u'demllitigen', u'dem\xfctigen'), (u'denkwurdiger', u'denkw\xfcrdiger'), (u'denkw\ufb02rdiger', u'denkw\xfcrdiger'), (u'derAbgeordnete', u'der Abgeordnete'), (u'derAusgabe', u'der Ausgabe'), (u'derAusl6ser', u'der Ausl\xf6ser'), (u"DerjL'lngste", u'Der j\xfcngste'), (u'derjunge', u'der junge'), (u'dermaben', u'derma\xdfen'), (u'derTyp', u'der Typ'), (u'derWeg', u'der Weg'), (u'derWelle', u'der Welle'), (u'DerWL1rfel', u'Der W\xfcrfel'), (u'DerZauberer', u'Der Zauberer'), (u'de__n', u'den'), (u'dfeserr', u'diesem'), (u'dffentlichen', u'\xf6ffentlichen'), (u'dffnen', u'\xf6ffnen'), (u'Dfimonen', u'D\xe4monen'), (u'dfinn', u'd\xfcnn'), (u'dichl', u'dich!'), (u'diej\xfcngste', u'die J\xfcngste'), (u'dienstunfahig', u'dienstunf\xe4hig'), (u'Dieselkapit\xe9in', u'Dieselkapit\xe4n'), (u'Dieselkapit\xe9n', u'Dieselkapit\xe4n'), (u'Dieselmotorenl', u'Dieselmotoren!'), (u'dieserAufnahme', u'dieser Aufnahme'), (u'Dieserjunge', u'Dieser junge'), (u'Diiit', u'Di\xe4t'), (u'diirfe', u'd\xfcrfe'), (u'Diirfen', u'D\xfcrfen'), (u'diirft', u'd\xfcrft'), (u'diirfte', u'd\xfcrfte'), (u'dijfien', u'd\xfcrfen'), (u'dijnn', u'd\xfcnn'), (u'dijrfen', u'd\xfcrfen'), (u'Dijrfte', u'D\xfcrfte'), (u'dijstere', u'd\xfcstere'), (u'dilmmer', u'd\xfcmmer'), (u'dilrfen', u'd\xfcrfen'), (u'dilrft', u'd\xfcrft'), (u'dilrften', u'd\xfcrften'), (u'dilrftig', u'd\xfcrftig'), (u'Dine', u'D\xe4ne'), (u'dirja', u'dir ja'), (u'dirjemand', u'dir jemand'), (u'dirjetzt', u'dir jetzt'), (u'dirJulie', u'dir Julie'), (u'dirl', u'dir!'), (u'dirwehzutun', u'dir wehzutun'), (u'Di\xe9t', u'Di\xe4t'), (u'Di\xe9tberaterin', u'Di\xe4tberaterin'), (u'Di\xe9tbier', u'Di\xe4tbier'), (u'dlch', u'dich'), (u'Dle', u'Die'), (u'dles', u'dies'), (u'Dlese', u'Diese'), (u'Dlfit', u'Di\xe4t'), (u'Dlitplan', u'Di\xe4tplan'), (u'dllirfen', u'd\xfcrfen'), (u'dllirft', u'd\xfcrft'), (u'dllirstet', u'd\xfcrstet'), (u'dlr', u'dir'), (u'doc/1', u'doch'), (u'dochl', u'doch!'), (u'dolthin', u'dorthin'), (u'Doppelgfiner', u'Doppelg\xe4nger'), (u'Doppelgfinger', u'Doppelg\xe4nger'), (u'Doppelg\xe9inger', u'Doppelg\xe4nger'), (u'Doppelg\xe9nger', u'Doppelg\xe4nger'), (u'Doppelzijngig', u'Doppelz\xfcngig'), (u'doppelztmgiger', u'doppelz\xfcngiger'), (u'dor', u'der'), (u"Dr'a'ngt", u'Dr\xe4ngt'), (u'drachengriinen', u'drachengr\xfcnen'), (u'Drahte', u'Dr\xe4hte'), (u'dranl', u'dran!'), (u'drau/3en', u'drau\xdfen'), (u'drau/Sen', u'drau\xdfen'), (u'drauBen', u'drau\xdfen'), (u'drauf$en', u'drau\xdfen'), (u'draufdrilcken', u'draufdr\xfccken'), (u'draufgestllirzt', u'draufgest\xfcrzt'), (u'draufg\xe9ngerisch', u'draufg\xe4ngerisch'), (u'draufien', u'drau\xdfen'), (u'draufken', u'drau\xdfen'), (u'drauflsenl', u'drau\xdfen!'), (u'drauf\xe9en', u'drau\xdfen'), (u'drauilen', u'drau\xdfen'), (u'draul3en', u'drau\xdfen'), (u'draul5en', u'drau\xdfen'), (u'draulien', u'drau\xdfen'), (u'draullen', u'drau\xdfen'), (u'draulSen', u'drau\xdfen'), (u'Dreckl\xe9chern', u'Dreckl\xf6chern'), (u'Drecksmiihle', u'Drecksm\xfchle'), (u'Drecks\xe9cke', u'Drecks\xe4cke'), (u'drfiben', u'dr\xfcben'), (u'Drfick', u'Dr\xfcck'), (u'Drfingeln', u'Dr\xe4ngeln'), (u'drih', u'dritt'), (u'driiben', u'dr\xfcben'), (u'driicken', u'dr\xfccken'), (u'driickt', u'dr\xfcckt'), (u'drijben', u'dr\xfcben'), (u'drijber', u'dr\xfcber'), (u'drijck', u'dr\xfcck'), (u'drijckt', u'dr\xfcckt'), (u'drilben', u'dr\xfcben'), (u'drilber', u'dr\xfcber'), (u'drilcken', u'dr\xfccken'), (u'drLiber', u'dr\xfcber'), (u'drlliben', u'dr\xfcben'), (u'drlllben', u'dr\xfcben'), (u'Drogenabh\xe9ngige', u'Drogenabh\xe4ngige'), (u'Drticken', u'Dr\xfccken'), (u'druben', u'dr\xfcben'), (u'drubenl', u'dr\xfcben!'), (u'druber', u'dr\xfcber'), (u'Druckkn\xe9pfe', u'Druckkn\xf6pfe'), (u'drunterliegt', u'drunter liegt'), (u'Dr\xe9nage', u'Dr\xe4nage'), (u'dr\xe9ngeln', u'dr\xe4ngeln'), (u'dr\xe9ngen', u'dr\xe4ngen'), (u'dr\xe9ngt', u'dr\xe4ngt'), (u'dr\ufb02ben', u'dr\xfcben'), (u'dtirft', u'd\xfcrft'), (u'dtlrfen', u'd\xfcrfen'), (u'Dudels\xe9cken', u'Dudels\xe4cken'), (u"dUFf\u20acl'1", u'd\xfcrfen'), (u'dul', u'du!'), (u'dull', u'dass'), (u'Dummk6pfe', u'Dummk\xf6pfe'), (u'Dummkiipfe', u'Dummk\xf6pfe'), (u'Dunnschiss', u'D\xfcnnschiss'), (u'durchdrficken', u'durchdr\xfccken'), (u'durchdr\xe9ngen', u'durchdr\xe4ngen'), (u'Durchfiihrung', u'Durchf\xfchrung'), (u'durchfuhren', u'durchf\xfchren'), (u'durchgefiihlt', u'durchgef\xfchrt'), (u'durchgefijhrt', u'durchgef\xfchrt'), (u'durchgefuhrt', u'durchgef\xfchrt'), (u'durchgef\ufb02hrt', u'durchgef\xfchrt'), (u'Durchg\xe9nge', u'Durchg\xe4nge'), (u'Durchladenl', u'Durchladen!'), (u'durchlfichere', u'durchl\xf6chere'), (u'durchsetzungsf\xe9higer', u'durchsetzungsf\xe4higer'), (u'durchst\xe9bern', u'durchst\xf6bern'), (u'durchwilhlt', u'durchw\xfchlt'), (u'durchzufilhren', u'durchzuf\xfchren'), (u'durchzufuhren', u'durchzuf\xfchren'), (u'Durfen', u'D\xfcrfen'), (u'durft', u'd\xfcrft'), (u'dusterer', u'd\xfcsterer'), (u'D\xe9cher', u'D\xe4cher'), (u'D\xe9imon', u'D\xe4mon'), (u'D\xe9imonen', u'D\xe4monen'), (u'D\xe9inemark', u'D\xe4nemark'), (u'D\xe9inemarks', u'D\xe4nemarks'), (u'D\xe9inen', u'D\xe4nen'), (u'd\xe9inisches', u'd\xe4nisches'), (u'd\xe9mlich', u'd\xe4mlich'), (u'D\xe9mliche', u'D\xe4mliche'), (u'd\xe9mlichen', u'd\xe4mlichen'), (u'd\xe9mlicher', u'd\xe4mlicher'), (u'd\xe9mlichl', u'd\xe4mlich'), (u'd\xe9mmert', u'd\xe4mmert'), (u'D\xe9monenb\xe9ren', u'D\xe4monenb\xe4ren'), (u'd\xe9monischen', u'd\xe4monischen'), (u'D\xe9rme', u'D\xe4rme'), (u'D\xe9rrfleisch', u'D\xf6rrfleisch'), (u'D\xe9umchen', u'D\xe4umchen'), (u'd\ufb02rfen', u'd\xfcrfen'), (u'E//e', u'Elle'), (u'e/n', u'ein'), (u'e/ne', u'eine'), (u'e/nem', u'einem'), (u'e/nen', u'einen'), (u'e/ner', u'einer'), (u'e/nes', u'eines'), (u'e/ns', u'eins'), (u'e/nsf', u'einst'), (u'E9YPt', u'Egypt'), (u'Ea/vtes', u'Echtes'), (u'ebenbfirtig', u'ebenb\xfcrtig'), (u'ebenburtige', u'ebenb\xfcrtige'), (u'Ec/vte', u'Echte'), (u'echfen', u'echten'), (u'edelm\ufb02tig', u'edelm\xfctig'), (u'efn', u'ein'), (u'efwas', u'etwas'), (u'Eheminner', u'Ehem\xe4nner'), (u'Ehem\xe9nnern', u'Ehem\xe4nnern'), (u'Ehezerstfirerin', u'Ehezerst\xf6rerin'), (u'Ehrenbijrger', u'Ehrenb\xfcrger'), (u'EHRENBURGERSCHAFT', u'EHRENB\xdcRGERSCHAFT'), (u'Ehreng\xe9iste', u'Ehreng\xe4ste'), (u'Eichhfirnchen', u'Eichh\xf6rnchen'), (u'Eichhiirnchen', u'Eichh\xf6rnchen'), (u'Eichh\xe9rnchens', u'Eichh\xf6rnchens'), (u'eifersfichtig', u'eifers\xfcchtig'), (u'eifersiichtig', u'eifers\xfcchtig'), (u'eifers\ufb02chtig', u'eifers\xfcchtig'), (u'eigenh\xe9ndig', u'eigenh\xe4ndig'), (u'eigenmlchtig', u'eigenm\xe4chtig'), (u'eigenntltziges', u'eigenn\xfctziges'), (u'Eihnlich', u'\xe4hnlich'), (u'Eimen/veise', u'Eimerweise'), (u'Einbruche', u'Einbr\xfcche'), (u'eindriicken', u'eindr\xfccken'), (u'Eindring/Inge', u'Eindringlinge'), (u'eindrucken', u'eindr\xfccken'), (u'einejunge', u'eine junge'), (u'einerfr\ufb02hen', u'einer fr\xfchen'), (u'einervorfuhrung', u'einer Vorf\xfchrung'), (u'einfiihren', u'einf\xfchren'), (u'Einfiihrung', u'Einf\xfchrung'), (u'einfilgen', u'einf\xfcgen'), (u'einfilhlsamsten', u'einf\xfchlsamsten'), (u'einflllgen', u'einf\xfcgen'), (u'Einflusse', u'Einfl\xfcsse'), (u'einfugen', u'einf\xfcgen'), (u'einfuhrten', u'einf\xfchrten'), (u'Einfuhrung', u'Einf\xfchrung'), (u'Einf\xe9ltige', u'Einf\xe4ltige'), (u'eingefiigt', u'eingef\xfcgt'), (u'eingef\ufb02gt', u'eingef\xfcgt'), (u'eingehiillt', u'eingeh\xfcllt'), (u'eingepr\xe9gt', u'eingepr\xe4gt'), (u'einger\xe9iumt', u'einger\xe4umt'), (u'einger\xe9umt', u'einger\xe4umt'), (u'eingeschl\xe9fert', u'eingeschl\xe4fert'), (u'eingeschr\xe9nkt', u'eingeschr\xe4nkt'), (u'eingesch\xe9itzt', u'eingesch\xe4tzt'), (u'eingesch\xe9tzt', u'eingesch\xe4tzt'), (u'eingesturzt', u'eingest\xfcrzt'), (u'eingieBt', u'eingie\xdft'), (u'eingschaltet', u'eingeschaltet'), (u'Einh\xe9rnern', u'Einh\xf6rner'), (u'einlegenl', u'einlegen!'), (u'einl\xe9dt', u'einl\xe4dt'), (u'einl\xe9sen', u'einl\xf6sen'), (u'Einsatzfahigkeit', u'Einsatzf\xe4higkeit'), (u'Einschiichterung', u'Einsch\xfcchterung'), (u'Einschliefklich', u'Einschlie\xdflich'), (u'Einschlielilich', u'Einschlie\xdflich'), (u'einstellenl', u'einstellen!'), (u'Eins\xe9tze', u'Eins\xe4tze'), (u'eint\xe9nig', u'eint\xf6nig'), (u'Einzelg\xe9ngerin', u'Einzelg\xe4ngerin'), (u'einzusch\xe9tzen', u'einzusch\xe4tzen'), (u'Eisstiirme', u'Eisst\xfcrme'), (u'Elektrizit\xe9t', u'Elektrizit\xe4t'), (u'elfenbeingetfinte', u'elfenbeinget\xf6nte'), (u'elit\xe9rer', u'elit\xe4rer'), (u'Eln', u'Ein'), (u'Elne', u'Eine'), (u'elnem', u'einem'), (u'Elnen', u'Einen'), (u'elner', u'einer'), (u'Elnes', u'Eines'), (u'empfindungsf\xe9higen', u'empfindungsf\xe4higen'), (u'Empf\xe9inger', u'Empf\xe4nger'), (u'empf\xe9ngt', u'empf\xe4ngt'), (u'Empiirend', u'Emp\xf6rend'), (u'Empiirendste', u'Emp\xf6rendste'), (u'empiirt', u'emp\xf6rt'), (u'emst', u'ernst'), (u'en/varten', u'erwarten'), (u'En/vartungen', u'Erwartungen'), (u'en/v\xe9hnt', u'erw\xe4hnt'), (u'Enchant\xe4', u'Enchant\xe9'), (u'endgiiltig', u'endg\xfcltig'), (u'endgultig', u'endg\xfcltig'), (u'endgultigen', u'endg\xfcltigen'), (u'endg\ufb02ltig', u'endg\xfcltig'), (u'endlichl', u'endlich!'), (u'ENERIGE', u'ENERGIE'), (u'enfternt', u'entfernt'), (u'Engl\xe9nder', u'Engl\xe4nder'), (u'Engl\xe9nderin', u'Engl\xe4nderin'), (u'eniillen', u'erf\xfcllen'), (u'entbl6Bte', u'entbl\xf6\xdfte'), (u'entbl6f$en', u'entbl\xf6\xdfen'), (u'entfiihre', u'entf\xfchre'), (u'entfiihrt', u'entf\xfchrt'), (u'entfiihrte', u'entf\xfchrte'), (u'Entfiihrung', u'Entf\xfchrung'), (u'Entftihrung', u'Entf\xfchrung'), (u'ENTFUHRUNGSVERDACHTIGER', u'ENTF\xdcHRUNGSVERD\xc4CHTIGER'), (u'enthllt', u'enth\xe4lt'), (u'enthUllt', u'enth\xfcllt'), (u'enth\xe9lt', u'enth\xe4lt'), (u'entliiften', u'entl\xfcften'), (u'Entliiftungen', u'Entl\xfcftungen'), (u'Entlijlftungen', u'Entl\xfcftungen'), (u'entluften', u'entl\xfcften'), (u'entl\xe9sst', u'entl\xe4sst'), (u'Entreilit', u'Entrei\xdft'), (u'entriistet', u'entr\xfcstet'), (u'entr\xe9itseln', u'entr\xe4tseln'), (u'Entschlrfen', u'Entsch\xe4rfen'), (u'Entschlull', u'Entschluss'), (u'ENTSCHLUSSELN', u'ENTSCHL\xdcSSELN'), (u'Entschlussen', u'Entschl\xfcssen'), (u'entsch\xe9rfen', u'entsch\xe4rfen'), (u'enttausche', u'entt\xe4usche'), (u'enttiiuscht', u'entt\xe4uscht'), (u'Enttluscht', u'Entt\xe4uscht'), (u'Enttluschungen', u'Entt\xe4uschungen'), (u'entt\xe9iuschen', u'entt\xe4uschen'), (u'entt\xe9uschen', u'entt\xe4uschen'), (u'entt\xe9uschst', u'entt\xe4uschst'), (u'entt\xe9uscht', u'entt\xe4uscht'), (u'Entv\\/Urfe', u'Entw\xfcrfe'), (u'Entwicklungsl\xe9ndern', u'Entwicklungsl\xe4ndern'), (u'entzllickt', u'entz\xfcckt'), (u'entzllindet', u'entz\xfcndet'), (u'entzuckend', u'entz\xfcckend'), (u'entzundet', u'entz\xfcndet'), (u'enzv\xe9rmt', u'erw\xe4rmt'), (u'Er6ffnen', u'Er\xf6ffnen'), (u'erb\xe9rml/ch', u'erb\xe4rmlich'), (u'erb\xe9rmlich', u'erb\xe4rmlich'), (u'Erb\xe9rmliches', u'Erb\xe4rmliches'), (u'Erdnijsse', u'Erdn\xfcsse'), (u'erdriickt', u'erdr\xfcckt'), (u'erd\xe9ihnliche', u'erd\xe4hnliche'), (u'erfebst', u'erlebst'), (u'erffillen', u'erf\xfcllen'), (u'erfiffnet', u'er\xf6ffnet'), (u'erfiille', u'erf\xfclle'), (u'erfiillen', u'erf\xfcllen'), (u'erfiillt', u'erf\xfcllt'), (u'erfijllt', u'erf\xfcllt'), (u'erfillle', u'erf\xfclle'), (u'erfilllen', u'erf\xfcllen'), (u'erfilllt', u'erf\xfcllt'), (u'erfllille', u'erf\xfclle'), (u'erfllillt', u'erf\xfcllt'), (u'erflllllen', u'erf\xfcllen'), (u'Erfolgl', u'Erfolg!'), (u'erfullen', u'erf\xfcllen'), (u'erfullt', u'erf\xfcllt'), (u'erf\xe9hrst', u'erf\xe4hrst'), (u'erf\xe9hrt', u'erf\xe4hrt'), (u'erf\ufb02llen', u'erf\xfcllen'), (u'ergrllindet', u'ergr\xfcndet'), (u'erhalfen', u'erhalten'), (u'Erhdhe', u'Erh\xf6he'), (u'erhiihter', u'erh\xf6hter'), (u'erhiiren', u'erh\xf6ren'), (u'ERHKLT', u'ERH\xc4LT'), (u'erhllt', u'erh\xe4lt'), (u'erh\xe9hen', u'erh\xf6hen'), (u'erh\xe9ht', u'erh\xf6ht'), (u'erh\xe9ilt', u'erh\xe4llt'), (u'erh\xe9lt', u'erh\xe4lt'), (u'erh\xe9rt', u'erh\xf6rt'), (u'erh\xe9rte', u'erh\xf6rte'), (u'eriiffnet', u'er\xf6ffnet'), (u'erja', u'er ja'), (u'erjetzt', u'er jetzt'), (u'erjung', u'er jung'), (u"erkl'a'ren", u'erkl\xe4ren'), (u"erkl'air's", u"erkl\xe4r's"), (u'erklaren', u'erkl\xe4ren'), (u'erklfire', u'erkl\xe4re'), (u'Erklfirung', u'Erkl\xe4rung'), (u'erklirt', u'erkl\xe4rt'), (u'erkllre', u'erkl\xe4re'), (u'erkllrt', u'erkl\xe4rt'), (u'erkllrte', u'erkl\xe4rte'), (u'erkllrten', u'erkl\xe4rten'), (u'Erkllrung', u'Erkl\xe4rung'), (u'erkl\xe9ir', u'erkl\xe4r'), (u'erkl\xe9ire', u'erkl\xe4re'), (u'erkl\xe9iren', u'erkl\xe4ren'), (u'erkl\xe9r', u'erkl\xe4r'), (u"erkl\xe9r's", u"erkl\xe4r's"), (u'erkl\xe9rbar', u'erkl\xe4rbar'), (u'Erkl\xe9re', u'Erkl\xe4re'), (u'erkl\xe9ren', u'erkl\xe4ren'), (u'erkl\xe9rt', u'erkl\xe4rt'), (u'Erkl\xe9rung', u'Erkl\xe4rung'), (u'erk\xe9ltest', u'erkaltest'), (u"erlC'>st", u'erl\xf6st'), (u'erldse', u'erl\xf6se'), (u'Erled/gen', u'Erledigen'), (u'erlieB', u'erlie\xdf'), (u'erlnnem', u'erinnern'), (u'erl\xe9scht', u'erl\xf6scht'), (u'erl\xe9sen', u'erl\xf6sen'), (u'erl\xe9st', u'erl\xf6st'), (u'Erl\xe9sung', u'Erl\xf6sung'), (u'ermbglichen', u'erm\xf6glichen'), (u'Erm\xe9chtige', u'Erm\xe4chtige'), (u'erm\xe9glicht', u'erm\xf6glicht'), (u'erm\xe9glichte', u'erm\xf6glichte'), (u'ernlllchtert', u'ern\xfcchtert'), (u'ern\xe9hren', u'ern\xe4hren'), (u'Ern\xe9hrung', u'Ern\xe4hrung'), (u'eroffnet', u'er\xf6ffnet'), (u'Erpressungsscheilie', u'Erpressungsschei\xdfe'), (u'err\xe9tst', u'err\xe4tst'), (u'erschieB', u'erschie\xdf'), (u'erschieBen', u'erschie\xdfen'), (u'erschiefien', u'erschie\xdfen'), (u'erschiefit', u'erschie\xdft'), (u'erschiefke', u'erschie\xdfe'), (u'erschielie', u'erschie\xdfe'), (u'Erschielit', u'Erschie\xdft'), (u'erschiipft', u'ersch\xf6pft'), (u'erschiittert', u'ersch\xfcttert'), (u'erschilttert', u'ersch\xfcttert'), (u'erschl\xe9gt', u'erschl\xe4gt'), (u'ERTCHDNT', u'ERT\xd6NT'), (u'ERTCNT', u'ERT\xd6NT'), (u'ERTGNT', u'ERT\xd6NT'), (u'ertiffnen', u'er\xf6ffnen'), (u'ertr\xe9gst', u'ertr\xe4gst'), (u'ertr\xe9inken', u'ertr\xe4nken'), (u'ert\xe9nt', u'ert\xf6nt'), (u'ervvartez', u'erwartet'), (u'ervvilrgen', u'erw\xfcrgen'), (u'ervv\xe9hnen', u'erw\xe4hnen'), (u'ervv\xe9ihnen', u'erw\xe4hnen'), (u'ervv\xe9ihnt', u'erw\xe4hnt'), (u'ervv\xe9ihnte', u'erw\xe4hnte'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u"erw'a'hnt", u'erw\xe4hnt'), (u'Erwar', u'Er war'), (u'erwe/sen', u'erweisen'), (u'Erwfirmung', u'Erw\xe4rmung'), (u'Erwird', u'Er wird'), (u'Erwtirde', u'Er w\xfcrde'), (u'erw\xe9gt', u'erw\xe4gt'), (u'Erw\xe9gung', u'Erw\xe4gung'), (u'Erw\xe9hne', u'Erw\xe4hne'), (u'erw\xe9hnen', u'erw\xe4hnen'), (u'erw\xe9hnt', u'erw\xe4hnt'), (u'erw\xe9hnte', u'erw\xe4hnte'), (u'Erw\xe9hnung', u'Erw\xe4hnung'), (u'erw\xe9ihlt', u'erw\xe4hlt'), (u'erw\xe9ihnt', u'erw\xe4hnt'), (u'erw\xe9rmt', u'erw\xe4rmt'), (u"erz'a'hlt", u'erz\xe4hlt'), (u'Erzdiiizese', u'Erzdi\xf6zese'), (u'erzfihlen', u'erz\xe4hlen'), (u'Erzfihler', u'Erz\xe4hler'), (u'erzihlenl', u'erz\xe4hlen!'), (u'erziihlen', u'erz\xe4hlen'), (u'erziihlt', u'erz\xe4hlt'), (u'erziirnt', u'erz\xfcrnt'), (u'erzilrnt', u'erz\xfcrnt'), (u'erzllirnt', u'erz\xfcrnt'), (u'erzurnen', u'erz\xfcrnen'), (u'erz\xe9hl', u'erz\xe4hl'), (u'erz\xe9hle', u'erz\xe4hle'), (u'Erz\xe9hlen', u'Erz\xe4hlen'), (u'erz\xe9hlerische', u'erz\xe4hlerische'), (u'erz\xe9hlerischen', u'erz\xe4hlerischen'), (u'erz\xe9hlerischer', u'erz\xe4hlerischer'), (u'Erz\xe9hlkunste', u'Erz\xe4hlk\xfcnste'), (u'erz\xe9hlst', u'erz\xe4hlst'), (u'erz\xe9hlt', u'erz\xe4hlt'), (u'erz\xe9hlte', u'erz\xe4hlte'), (u'Erz\xe9hlung', u'Erz\xe4hlung'), (u'Erz\xe9ihl', u'Erz\xe4hl'), (u'Erz\xe9ihle', u'Erz\xe4hle'), (u'erz\xe9ihlen', u'erz\xe4hlen'), (u'erz\xe9ihlst', u'erz\xe4hlst'), (u'erz\xe9ihlt', u'erz\xe4hlt'), (u'erz\xe9ihlte', u'erz\xe4hlte'), (u'er\xe9ffnen', u'er\xf6ffnen'), (u'er\xe9ffnet', u'er\xf6ffnet'), (u'er\xe9ffnete', u'er\xf6ffnete'), (u'Er\xe9ffnungsaufnahme', u'Er\xf6ffnungsaufnahme'), (u'Er\xe9ffnungssequenz', u'Er\xf6ffnungssequenz'), (u'Er\xe9ffnungsszene', u'Er\xf6ffnungsszene'), (u'Er\ufb02lllen', u'Erf\xfcllen'), (u'etemity', u'eternity'), (u'etvva', u'etwa'), (u'euc/1', u'euch'), (u'Europ\xe9er', u'Europ\xe4er'), (u'europ\xe9ische', u'europ\xe4ische'), (u"ex'nfac'/7", u'einfach'), (u'Examenspriifungen', u'Examenspr\xfcfungen'), (u'Exekutivzust\xe9noligkeit', u'Exekutivzust\xe4ndigkeit'), (u'Explosionenl', u'Explosionen!'), (u'Extrablattl', u'Extrablatt!'), (u'F/nden', u'Finden'), (u'F/ugba/I', u'Flugball'), (u'Fahnrich', u'F\xe4hnrich'), (u'fahrlissiges', u'fahrl\xe4ssiges'), (u'Fairbankverlieh', u'Fairbank verlieh'), (u'Fallef', u'Falle!'), (u'fallengelassen', u'fallen gelassen'), (u'Fallschirmj\xe9gereinheiten', u'Fallschirmj\xe4gereinheiten'), (u'Fam/Z/e', u'Familie'), (u'Fa\xdf', u'Fass'), (u'FBl', u'FBI'), (u'Fe/nd', u'Feind'), (u'fehlschl\xe9gt', u'fehlschl\xe4gt'), (u'Feindberllihrung', u'Feindber\xfchrung'), (u'Feind\xfcbewvachung', u'Feind\xfcberwachung'), (u'feltig', u'fertig'), (u'femen', u'fernen'), (u'fernh\xe9ilt', u'fernh\xe4lt'), (u'Festhaltenl', u'Festhalten!'), (u'Fettw\xe9nste', u'Fettw\xe4nste'), (u'Feuen/vehr', u'Feuerwehr'), (u'Feuerliischer', u'Feuerl\xf6scher'), (u'Feuervvehrrnann', u'Feuerwehrrnann'), (u'Feuerwehrl', u'Feuerwehr!'), (u'Feuerwfirmen', u'Feuer w\xe4rmen'), (u'Feue\ufb02', u'Feuer!'), (u"ff'Ul'1\u20acf'\u20acl'1", u'fr\xfcheren'), (u'Ffiegen', u'Fliegen'), (u'ffihft', u'f\xfchlt'), (u'ffihren', u'f\xfchren'), (u'ffinf', u'f\xfcnf'), (u'ffir', u'f\xfcr'), (u'ffirchte', u'f\xfcrchte'), (u'ffirs', u'f\xfcrs'), (u'ffittere', u'f\xfcttere'), (u'FI6he', u'Fl\xf6he'), (u'Fiasenm\xe9iher', u'Rasenm\xe4her'), (u'fibel', u'\xfcbel'), (u'fiber', u'\xfcber'), (u'fiberdressierter', u'\xfcberdressierter'), (u'fibergezogen', u'\xfcbergezogen'), (u'fiberhaupt', u'\xfcberhaupt'), (u'fiberholt', u'\xfcberholt'), (u'fiberlegt', u'\xfcberlegt'), (u'fibernachtet', u'\xfcbernachtet'), (u'fiberspannt', u'\xfcberspannt'), (u'fibertreiben', u'\xfcbertreiben'), (u'fiberzfichtete', u'\xfcberz\xfcchtete'), (u'fibrig', u'\xfcbrig'), (u'Fieferenz', u'Referenz'), (u'Fieifi', u'Rei\xdf'), (u'fiffentlichkeit', u'\xd6ffentlichkeit'), (u'fiffnen', u'\xf6ffnen'), (u'fiffnest', u'\xf6ffnest'), (u'fifter', u'\xf6fter'), (u'Fihigkeit', u'F\xe4higkeit'), (u'fihneln', u'\xe4hneln'), (u'Fihrt', u'F\xe4hrt'), (u'fiihl', u'f\xfchl'), (u'fiihle', u'f\xfchle'), (u'fiihlen', u'f\xfchlen'), (u'fiihlst', u'f\xfchlst'), (u'fiihlt', u'f\xfchlt'), (u'Fiihlte', u'F\xfchlte'), (u'Fiihre', u'F\xfchre'), (u'Fiihren', u'F\xfchren'), (u'Fiihrerin', u'F\xfchrerin'), (u'Fiihrerschein', u'F\xfchrerschein'), (u'fiihrfe', u'f\xfchrte'), (u'fiihrt', u'f\xfchrt'), (u'fiihrte', u'f\xfchrte'), (u'Fiihrungsf\xe9ihigkeiten', u'F\xfchrungsf\xe4higkeiten'), (u'Fiihrungsprogramm', u'F\xfchrungsprogramm'), (u'Fiihrungsstil', u'F\xfchrungsstil'), (u'Fiilcksicht', u'R\xfccksicht'), (u'fiillen', u'f\xfcllen'), (u'fiinden', u'f\xe4nden'), (u'fiinf', u'f\xfcnf'), (u'fiinfhundert', u'f\xfcnfhundert'), (u'fiinfzehn', u'f\xfcnfzehn'), (u'fiir', u'f\xfcr'), (u'fiirchte', u'f\xfcrchte'), (u'fiirchten', u'f\xfcrchten'), (u'fiirchterlich', u'f\xfcrchterlich'), (u'fiirchterlichl', u'f\xfcrchterlich!'), (u'fiirchterllches', u'f\xfcrchterliches'), (u'fiirchtet', u'f\xfcrchtet'), (u'fiirchteten', u'f\xfcrchteten'), (u'fiirjeden', u'f\xfcr jeden'), (u'Fiirmchen', u'F\xf6rmchen'), (u'fiirs', u'f\xfcrs'), (u'Fijgen', u'F\xfcgen'), (u'fijhl', u'f\xfchl'), (u'fijhle', u'f\xfchle'), (u'fijhlen', u'f\xfchlen'), (u'fijhlst', u'f\xfchlst'), (u'fijhlt', u'f\xfchlt'), (u'fijhren', u'f\xfchren'), (u'Fijhrer', u'F\xfchrer'), (u'fijhrt', u'f\xfchrt'), (u'Fijhrungsqualit\xe9iten', u'F\xfchrungsqualit\xe4ten'), (u'FiJl3en', u'F\xfc\xdfen'), (u'Fijlie', u'F\xfc\xdfe'), (u'fijlr', u'f\xfcr'), (u'Fijnf', u'F\xfcnf'), (u'Fijnfziger', u'F\xfcnfziger'), (u'fijr', u'f\xfcr'), (u'fijrchte', u'f\xfcrchte'), (u'fijrchten', u'f\xfcrchten'), (u'Fijrjedenl', u'F\xfcr jeden!'), (u'fijrs', u'f\xfcrs'), (u'fiJrVorteile', u'f\xfcr Vorteile'), (u'fijttern', u'f\xfcttern'), (u'fijur', u'f\xfcr'), (u'filhl', u'f\xfchl'), (u'filhle', u'f\xfchle'), (u'filhlen', u'f\xfchlen'), (u'filhlte', u'f\xfchlte'), (u'filhre', u'f\xfchre'), (u'filhren', u'f\xfchren'), (u'Filhrern', u'F\xfchrern'), (u'Filhrerschein', u'F\xfchrerschein'), (u'filhrst', u'f\xfchrst'), (u'filhrt', u'f\xfchrt'), (u'filhrte', u'f\xfchrte'), (u'filhrten', u'f\xfchrten'), (u'Filhrung', u'F\xfchrung'), (u'Fillle', u'F\xfclle'), (u'Filll\xe9en', u'F\xfc\xdfen'), (u'Filmemachen', u'Filme machen'), (u'Filml', u'Film!'), (u'filnf', u'f\xfcnf'), (u'Filn\ufb02', u'F\xfcnf!'), (u'Filr', u'F\xfcr'), (u"filr'ne", u"f\xfcr'ne"), (u'filrchten', u'f\xfcrchten'), (u'filrchterlich', u'f\xfcrchterlich'), (u'filrs', u'f\xfcrs'), (u'filter', u'\xe4lter'), (u'findem', u'\xe4ndern'), (u'findenlassen', u'finden lassen'), (u'Fingerabdrijcke', u'Fingerabdr\xfccke'), (u'Fingerabdrilcke', u'Fingerabdr\xfccke'), (u'Fingerniigeln', u'Fingern\xe4geln'), (u'Fingern\xe9gel', u'Fingern\xe4gel'), (u'Fingern\xe9geln', u'Fingern\xe4geln'), (u'fingstlich', u'\xe4ngstlich'), (u'Fiothaarige', u'Rothaarige'), (u'Firmen\xe9rzte', u'Firmen\xe4rzte'), (u'Fischk\xe9pfe', u'Fischk\xf6pfe'), (u'FIUssigkeitsgleichgewicht', u'Fl\xfcssigkeitsgleichgewicht'), (u'Fiusten', u'F\xe4usten'), (u'FIynn', u'Flynn'), (u'fjffnen', u'\xf6ffnen'), (u"fL'1'r", u'f\xfcr'), (u"fL'1hle", u'f\xfchle'), (u"FL'1r", u'F\xfcr'), (u"fL'ir", u'f\xfcr'), (u"fL'lr", u'f\xfcr'), (u'fL1r', u'f\xfcr'), (u'Fl6he', u'Fl\xf6he'), (u'Flclse', u'Rose'), (u'fleifkige', u'flei\xdfige'), (u'fleifkiges', u'flei\xdfiges'), (u'fleil3ig', u'flei\xdfig'), (u'Fleischb\xe9llchen', u'Fleischb\xe4llchen'), (u"Fleischkl6l'Sen", u'Fleischkl\xf6\xdfen'), (u'Flfige', u'Fl\xfcge'), (u'Flfigell', u'Fl\xfcgel!'), (u'flfistert', u'fl\xfcstert'), (u'Flhigkeiten', u'F\xe4higkeiten'), (u'Flhnrich', u'F\xe4hnrich'), (u'Flhnriche', u'F\xe4hnriche'), (u'flieBen', u'flie\xdfen'), (u'Fliefiband', u'Flie\xdfband'), (u'Fliefiheck', u'Flie\xdfheck'), (u'Flieflsb\xe9nder', u'Flie\xdfb\xe4nder'), (u'flielit', u'flie\xdft'), (u'flielSt', u'flie\xdft'), (u'FLif$e', u'F\xfc\xdfe'), (u'fLihlt', u'f\xfchlt'), (u'fliichtige', u'fl\xfcchtige'), (u'Fliigel', u'Fl\xfcgel'), (u'flijchtig', u'fl\xfcchtig'), (u'Flijgel', u'Fl\xfcgel'), (u'Flijgelfedernl', u'Fl\xfcgelfedern!'), (u'Flilssige', u'Fl\xfcssige'), (u'flilstert', u'fl\xfcstert'), (u'fLir', u'f\xfcr'), (u'fljhrt', u'f\xfchrt'), (u'Fljr', u'F\xfcr'), (u"flJr'n", u"f\xfcr'n"), (u'fllihrst', u'f\xfchrst'), (u'Fllihrt', u'F\xfchrt'), (u'fllinf', u'f\xfcnf'), (u'fllinften', u'f\xfcnften'), (u'Fllinkchen', u'F\xfcnkchen'), (u'Fllir', u'F\xfcr'), (u'fllirchte', u'f\xfcrchte'), (u'fllirchten', u'f\xfcrchten'), (u'fllirchterlichen', u'f\xfcrchterlichen'), (u'fllirchtet', u'f\xfcrchtet'), (u'Fllirsten', u'F\xfcrsten'), (u'Fllitterungszeitenl', u'F\xfctterungszeiten!'), (u'flllgte', u'f\xfcgte'), (u'flllgten', u'f\xfcgten'), (u'flllhrten', u'fl\xfchrten'), (u'Flllhrung', u'F\xfchrung'), (u'Fllligel', u'Fl\xfcgel'), (u'flllistern', u'fl\xfcstern'), (u'fllllstert', u'fl\xfcstert'), (u'flllrchte', u'f\xfcrchte'), (u'flllrchten', u'f\xfcrchten'), (u'flllrjede', u'f\xfcr jede'), (u'Flohtransporterl', u'Flohtransporter!'), (u'Floli', u'Flo\xdf'), (u'Flottenalzt', u'Flottenarzt'), (u'Flottenstiitzpunkt', u'Flottenst\xfctzpunkt'), (u'Flottenstutzpunkt', u'Flottenst\xfctzpunkt'), (u'Flrma', u'Firma'), (u'fltlsterte', u'fl\xfcsterte'), (u'Fluchtig', u'Fl\xfcchtig'), (u'Flughdhe', u'Flugh\xf6he'), (u'Flughiihe', u'Flugh\xf6he'), (u'Flugh\xe9ifen', u'Flugh\xe4fen'), (u'Flugunf\xe9ihig', u'Flugunf\xe4hig'), (u'flugunf\xe9ihigen', u'flugunf\xe4higen'), (u'Flugunf\xe9ihigl', u'Flugunf\xe4hig!'), (u'Flugzeugl', u'Flugzeug!'), (u'FLUSSIGER', u'FL\xdcSSIGER'), (u'Flustereffekt', u'Fl\xfcstereffekt'), (u'Flustern', u'Fl\xfcstern'), (u'FLUSTERT', u'FL\xdcSTERT'), (u'fl\ufb02stern', u'fl\xfcstern'), (u'fl\ufb02sterten', u'fl\xfcsterten'), (u'Folgendesz', u'Folgendes:'), (u'fortgespiilt', u'fortgesp\xfclt'), (u'fortspiilen', u'fortsp\xfclen'), (u'fortw\xe9hrend', u'fortw\xe4hrend'), (u'Fr/ed/10/', u'Friedhof'), (u'Fr5ulein', u'Fr\xe4ulein'), (u'Fr6hliche', u'Fr\xf6hliche'), (u'Frachfmodule', u'Frachtmodule'), (u'Frafi', u'Fra\xdf'), (u'fragfe', u'fragte'), (u"Fral'S", u'Fra\xdf'), (u'fralken', u'fra\xdfen'), (u'Franzfisisch', u'Franz\xf6sisch'), (u'Franziisin', u'Franz\xf6sin'), (u'franziisische', u'franz\xf6sische'), (u'franziisischen', u'franz\xf6sischen'), (u'franziisischer', u'franz\xf6sischer'), (u'franziisisches', u'franz\xf6sisches'), (u'Franz\xe9sisch', u'Franz\xf6sisch'), (u'franz\xe9sische', u'franz\xf6sische'), (u'franz\xe9sischen', u'franz\xf6sischen'), (u'franz\xe9sischer', u'franz\xf6sischer'), (u'Franz\xe9sisches', u'Franz\xf6sisches'), (u'FRAULEIN', u'FR\xc4ULEIN'), (u'fre/em', u'freiem'), (u'freffen', u'treffen'), (u'freilieB', u'freilie\xdf'), (u'freimiitigen', u'freim\xfctigen'), (u'Fressger\xe9usche', u'Fressger\xe4usche'), (u'Frfichtekuchen', u'Fr\xfcchtekuchen'), (u'frfih', u'fr\xfch'), (u'frfiher', u'fr\xfcher'), (u'Friedh\xe9fe', u'Friedh\xf6fe'), (u'Friichtchen', u'Fr\xfcchtchen'), (u'friih', u'fr\xfch'), (u'friihen', u'fr\xfchen'), (u'friiher', u'fr\xfcher'), (u'friihere', u'fr\xfchere'), (u'friihliche', u'fr\xf6hliche'), (u'friihlichen', u'fr\xf6hlichen'), (u'Friihstiick', u'Fr\xfchst\xfcck'), (u'friilher', u'fr\xfcher'), (u'friilhesten', u'fr\xfchesten'), (u'Frijchte', u'Fr\xfcchte'), (u'frijh', u'fr\xfch'), (u'frijher', u'fr\xfcher'), (u'frijherer', u'fri\xfcherer'), (u'frilh', u'fr\xfch'), (u'frilhen', u'fr\xfchen'), (u'Frilher', u'Fr\xfcher'), (u'frilhere', u'fr\xfchere'), (u'Frilhst\ufb02ck', u'Fr\xfchst\xfcck'), (u'Fris6r', u'Fris\xf6r'), (u"frL'lher", u'fr\xfcher'), (u'Frljihling', u'Fr\xfchling'), (u'Frllichte', u'Fr\xfcchte'), (u'frllih', u'fr\xfch'), (u'frlliher', u'fr\xfcher'), (u'Frllihstiickskiiche', u'Fr\xfchst\xfccksk\xfcche'), (u'fro/1', u'froh'), (u'FROHLICHE', u'FR\xd6HLICHE'), (u'frtih', u'fr\xfch'), (u'Frtiher', u'Fr\xfcher'), (u'Frtihliche', u'Fr\xf6hliche'), (u'Frtihstticksei', u'Fr\xfchst\xfccksei'), (u'Frtlh', u'Fr\xfch'), (u'FrUh', u'Fr\xfch'), (u'FRUHE', u'FR\xdcHE'), (u'fruhe', u'fr\xfche'), (u'fruhen', u'fr\xfchen'), (u'Fruher', u'Fr\xfcher'), (u'fruheren', u'fr\xfcheren'), (u'Fruhling', u'Fr\xfchling'), (u'Fruhlingsrolle', u'Fr\xfchlingsrolle'), (u'FrUhstUck', u'Fr\xfchstuck'), (u'Fruhstuck', u'Fr\xfchst\xfcck'), (u'frUhstUcken', u'fr\xfchst\xfccken'), (u'fr\xe9hliches', u'fr\xf6hliches'), (u'fr\xe9ihfiches', u'fr\xf6hliches'), (u'fr\xe9ihlich', u'fr\xf6hlich'), (u'Fr\xe9iulein', u'Fr\xe4ulein'), (u'fr\xe9nen', u'fr\xf6nen'), (u'Fr\xe9sche', u'Fr\xf6sche'), (u'Fr\xe9ulein', u'Fr\xe4ulein'), (u'ftihlen', u'f\xfchlen'), (u'Ftillhorn', u'F\xfcllhorn'), (u'Ftir', u'F\xfcr'), (u'Ftirs', u'F\xfcrs'), (u'Ftlhrung', u'F\xfchrung'), (u'ftlrchte', u'f\xfcrchte'), (u'ftmf', u'f\xfcnf'), (u'Fu/3', u'Fu\xdf'), (u'FuB', u'Fu\xdf'), (u'FuBballspieler', u'Fu\xdfballspieler'), (u'FUBen', u'F\xfc\xdfen'), (u'Fuf$', u'Fu\xdf'), (u'Fufi', u'Fu\xdf'), (u'Fufiabdrucke', u'Fu\xdfabdr\xfccke'), (u'Fufiballtraining', u'Fu\xdfballtraining'), (u'FufL', u'Fu\xdf'), (u'Fuflsball', u'Fu\xdfball'), (u'Fuflsballszene', u'Fu\xdfballszene'), (u"fUhl't", u'f\xfchrt'), (u'fuhle', u'f\xfchle'), (u'fuhlst', u'f\xfchlst'), (u'fUhlt', u'f\xfchlt'), (u'fUhre', u'f\xfchre'), (u'fUhrt', u'f\xfchrt'), (u'fuhrte', u'f\xfchrte'), (u'fuhrten', u'f\xfchrten'), (u'Fuhrung', u'F\xfchrung'), (u'Fuhrungsf\xe9higkeiten', u'F\xfchrungsf\xe4higkeiten'), (u'Fuhrungsoffizier', u'F\xfchrungsoffizier'), (u'Fuhrungsqualit\xe9t', u'F\xfchrungsqualit\xe4t'), (u'FUI3en', u'F\xfc\xdfen'), (u'Fuli', u'Fu\xdf'), (u'Fuliball', u'Fu\xdfball'), (u'Fulisohlen', u'Fu\xdfsohlen'), (u'FUller', u'F\xfcller'), (u'fUllten', u'f\xfcllten'), (u'fumt', u'f\xfchlt'), (u'Fundbiiro', u'Fundb\xfcro'), (u'FUnf', u'F\xfcnf'), (u'Funftbeste', u'F\xfcnftbeste'), (u'Funkchen', u'F\xfcnkchen'), (u'Funkger\xe9it', u'Funkger\xe4t'), (u'Funkger\xe9ite', u'Funkger\xe4te'), (u'Funkger\xe9t', u'Funkger\xe4t'), (u'funktionstilchtig', u'funktionst\xfcchtig'), (u'FUR', u'F\xdcR'), (u'Fur', u'F\xfcr'), (u"fUrAusweichmanc'\xa7ver", u'f\xfcr Ausweichman\xf6ver'), (u'furchteinfl6Bend', u'furchteinfl\xf6\xdfend'), (u'furchteinfl6Bende', u'furchteinfl\xf6\xdfende'), (u'furchten', u'f\xfcrchten'), (u'Furchtest', u'F\xfcrchtest'), (u'furchtet', u'f\xfcrchtet'), (u'furchteten', u'f\xfcrchteten'), (u'fureinander', u'f\xfcreinander'), (u'furjeden', u'f\xfcr jeden'), (u'furjemanden', u'f\xfcr jemanden'), (u'furjudische', u'fur j\xfcdische'), (u'furs', u'f\xfcrs'), (u'FUrWalter', u'F\xfcr Walter'), (u'fut', u'tut'), (u'Fu\ufb02ballspiel', u'Fu\xdfballspiel'), (u'F\xa7hnlein', u'F\xe4hnlein'), (u'f\xe9//t', u'f\xe4llt'), (u'f\xe9hig', u'f\xe4hig'), (u'F\xe9higkeit', u'F\xe4higkeit'), (u'F\xe9higkeiten', u'F\xe4higkeiten'), (u'f\xe9hnen', u'f\xf6hnen'), (u'F\xe9hnens', u'F\xf6hnens'), (u'F\xe9hnerei', u'F\xf6hnerei'), (u'F\xe9hnleinmiitter', u'F\xe4hnleinm\xfctter'), (u'F\xe9hre', u'F\xe4hre'), (u'f\xe9hrst', u'f\xe4hrst'), (u'f\xe9hrt', u'f\xe4hrt'), (u'F\xe9ihigkeit', u'F\xe4higkeit'), (u'F\xe9ihigkeiten', u'F\xe4higkeiten'), (u'f\xe9ihrt', u'f\xe4hrt'), (u'f\xe9illst', u'f\xe4llst'), (u'f\xe9illt', u'f\xe4llt'), (u'F\xe9ilschung', u'F\xe4lschung'), (u'F\xe9ingt', u'F\xe4ngt'), (u'f\xe9ir', u'f\xfcr'), (u'F\xe9lle', u'F\xe4lle'), (u'F\xe9llen', u'F\xe4llen'), (u'f\xe9lligl', u'f\xe4llig'), (u'F\xe9llt', u'F\xe4llt'), (u"f\xe9llt's", u"f\xe4llt's"), (u'F\xe9lschen', u'F\xe4lschen'), (u'F\xe9lschung', u'F\xe4lschung'), (u'f\xe9nde', u'f\xe4nde'), (u'F\xe9ngst', u'F\xe4ngst'), (u'F\xe9ngt', u'F\xe4ngt'), (u'f\xe9rben', u'f\xe4rben'), (u'f\xe9rbt', u'f\xe4rbt'), (u'f\xe9rdern', u'f\xf6rdern'), (u'f\xe9rmlich', u'f\xf6rmlich'), (u'F\xe9ustlinge', u'F\xe4ustlinge'), (u"f\xfcr'ne", u"f\xfcr 'ne"), (u'f\xfcrchlerlichen', u'f\xfcrchterlichen'), (u'f\xfcrjede', u'f\xfcr jede'), (u'f\xfcrjeden', u'f\xfcr jeden'), (u'F\ufb02hrungsprogramm', u'F\xfchrungsprogramm'), (u'F\ufb02hrungsstil', u'F\xfchrungsstil'), (u'f\ufb02llen', u'f\xfcllen'), (u'f\ufb02llt', u'f\xe4llt'), (u'f\ufb02nf', u'f\xfcnf'), (u'F\ufb02r', u'F\xfcr'), (u'f\ufb02rchte', u'f\xfcrchte'), (u'f\ufb02rjeden', u'f\xfcr jeden'), (u'g/bf', u'gibt'), (u'g/bsf', u'gibst'), (u'G5ste', u'G\xe4ste'), (u'G6nn', u'G\xf6nn'), (u"G6t'lllche", u'G\xf6ttliche'), (u'G6tter', u'G\xf6tter'), (u'G6ttern', u'G\xf6ttern'), (u'Gamilonl', u'Gamilon!'), (u'ganzlich', u'g\xe4nzlich'), (u'gardel', u'garde!'), (u'Gasbrfiter', u'Gasbr\xe4ter'), (u'gauze', u'ganze'), (u'GCJKTEN', u'G\xd6KTEN'), (u'ge6lt', u'ge\xf6lt'), (u'gebauf', u'gebaut'), (u'Gebiez', u'Gebiet'), (u'Gebi\xe9ude', u'Geb\xe4ude'), (u'gebliebenl', u'geblieben!'), (u'GEBRAUCHTWAGENIPOLIZEIITAXI', u'GEBRAUCHTWAGEN/POLIZEI/TAXI'), (u'Gebr\xe9u', u'Gebr\xe4u'), (u'gebs', u"geb's"), (u'gebuhrend', u'geb\xfchrend'), (u'Geb\xe9ick', u'Geb\xe4ck'), (u'Geb\xe9iude', u'Geb\xe4ude'), (u'geb\xe9rdet', u'geb\xe4rdet'), (u'Geb\xe9rmutter', u'Geb\xe4rmutter'), (u'Geb\xe9rmutterhals', u'Geb\xe4rmutterhals'), (u'Geb\xe9ude', u'Geb\xe4ude'), (u'Geb\xe9udedach', u'Geb\xe4udedach'), (u'Geb\xe9uden', u'Geb\xe4uden'), (u'Geb\xe9udes', u'Geb\xe4udes'), (u'gedemiitigt', u'gedem\xfctigt'), (u'gedemijtigt', u'gedem\xfctigt'), (u'gedemllitigt', u'gedem\xfctigt'), (u'gedrtickt', u'gedr\xfcckt'), (u'gedr\xe9ngt', u'gedr\xe4ngt'), (u'Ged\xe9chtnisverlustes', u'Ged\xe4chtnisverlustes'), (u'Ged\xe9ichtnis', u'Ged\xe4chtnis'), (u'ged\xe9mpft', u'ged\xe4mpft'), (u"gef'a'hrlich", u'gef\xe4hrlich'), (u"gef'a'llt", u'gef\xe4llt'), (u'gef5IIt', u'gef\xe4llt'), (u'gefahrdet', u'gef\xe4hrdet'), (u'gefahrlich', u'gef\xe4hrlich'), (u'gefallsllichtige', u'gefalls\xfcchtige'), (u'GEFANGNISTECHNOLOGIE', u'GEF\xc4NGNISTECHNOLOGIE'), (u'Gefechtsausrustung', u'Gefechtsausr\xfcstung'), (u'Geffihl', u'Gef\xfchl'), (u'geffihrt', u'gef\xfchrt'), (u'geffillt', u'gef\xe4llt'), (u'Gefihrliche', u'Gef\xe4rliche'), (u'Gefiihl', u'Gef\xfchl'), (u'Gefiihle', u'Gef\xfchle'), (u'Gefiihlen', u'Gef\xfchlen'), (u'Gefiihlslebens', u'Gef\xfchlslebens'), (u'gefiihlsmiliigen', u'gef\xfchlsm\xe4\xdfigen'), (u'gefiihrt', u'gef\xfchrt'), (u'gefiillst', u'gef\xe4llst'), (u'gefiillt', u'gef\xfcllt'), (u'gefiirchtet', u'gef\xfcrchtet'), (u'Gefijhl', u'Gef\xfchl'), (u'Gefijhle', u'Gef\xfchle'), (u'gefijhlt', u'gef\xfchlt'), (u'gefijllte', u'gef\xfcllte'), (u'Gefilhl', u'Gef\xfchl'), (u'Gefilhle', u'Gef\xfchle'), (u'gefillt', u'gef\xe4llt'), (u'Gefingnis', u'Gef\xe4ngnis'), (u"gefL'lllten", u'gef\xfcllten'), (u'Geflilster', u'Gefl\xfcster'), (u'gefllihllos', u'gef\xfchllos'), (u'Geflllhlsduselige', u'Gef\xfchlsduselige'), (u'GEFLUSTERT', u'GEFL\xdcSTERT'), (u'Geftuhle', u'Gef\xfchle'), (u'Gefuhl', u'Gef\xfchl'), (u'Gefuhle', u'Gef\xfchle'), (u'Gefuhlen', u'Gef\xfchlen'), (u'gefuhlt', u'gef\xfchlt'), (u'gefuhlvolle', u'gef\xfchlvolle'), (u'gefurchtet', u'gef\xfcrchtet'), (u'Gef\xe9hrde', u'Gef\xe4hrde'), (u'gef\xe9hrden', u'gef\xe4hrden'), (u'gef\xe9hrdet', u'gef\xe4hrdet'), (u'Gef\xe9hrdung', u'Gef\xe4hrdung'), (u'gef\xe9hrlich', u'gef\xe4hrlich'), (u'gef\xe9hrliche', u'gef\xe4hrliche'), (u'gef\xe9hrlicher', u'gef\xe4hrlicher'), (u'gef\xe9hrlicheren', u'gef\xe4hrlicheren'), (u'Gef\xe9hrliches', u'Gef\xe4hrliches'), (u'Gef\xe9hrt', u'Gef\xe4hrt'), (u'gef\xe9ihrden', u'gef\xe4hrden'), (u'gef\xe9ihrdet', u'gef\xe4hrdet'), (u'gef\xe9ihrlich', u'gef\xe4hrlich'), (u'Gef\xe9ihrte', u'Gef\xe4hrte'), (u'Gef\xe9ihrten', u'Gef\xe4hrten'), (u'gef\xe9illt', u'gef\xe4llt'), (u"Gef\xe9illt's", u"Gef\xe4llt's"), (u'gef\xe9llf', u'gef\xe4llt'), (u'gef\xe9llfs', u"gef\xe4llt's"), (u'gef\xe9llig', u'gef\xe4llig'), (u'gef\xe9lligst', u'gef\xe4lligst'), (u'gef\xe9llst', u'gef\xe4llst'), (u'Gef\xe9llt', u'Gef\xe4llt'), (u"Gef\xe9llt's", u"Gef\xe4llt's"), (u'gef\xe9lscht', u'gef\xe4lscht'), (u'Gef\xe9ngnis', u'Gef\xe4ngnis'), (u'Gef\xe9ngnisregeln', u'Gef\xe4ngnisregeln'), (u'Gef\xe9ngnisse', u'Gef\xe4ngnisse'), (u'Gef\xe9ngnissen', u'Gef\xe4ngnissen'), (u'Gef\xe9ngnisses', u'Gef\xe4ngnisses'), (u'Gef\xe9ngniswagen', u'Gef\xe4ngniswagen'), (u'gef\ufb02gig', u'gef\xfcgig'), (u'gegenfiber', u'gegen\xfcber'), (u'gegeniiber', u'gegen\xfcber'), (u'gegeniibertritt', u'gegen\xfcbertritt'), (u'gegeniiberzusfehen', u'gegen\xfcberzustehen'), (u'gegenijber', u'gegen\xfcber'), (u'gegenlliber', u'gegen\xfcber'), (u'gegenlliberstehen', u'gegen\xfcberstehen'), (u'Gegenstrfimung', u'Gegenstr\xf6mung'), (u'Gegenstr\xe9mung', u'Gegenstr\xf6mung'), (u'Gegensttlck', u'Gegenst\xfcck'), (u'Gegenst\xe9nde', u'Gegenst\xe4nde'), (u'gegenuber', u'gegen\xfcber'), (u'Gegenverschwiirung', u'Gegenverschw\xf6rung'), (u'gegenw\xe9rtigen', u'gegenw\xe4rtigen'), (u'gegriindet', u'gegr\xfcndet'), (u'gegrijfit', u'gegr\xfc\xdft'), (u'gegrilfit', u'gegr\xfc\xdft'), (u'GegrUl3t', u'Gegr\xfc\xdft'), (u'gegrundet', u'gegr\xfcndet'), (u'geh6ren', u'geh\xf6ren'), (u'geh6rt', u'geh\xf6rt'), (u'gehdrt', u'geh\xf6rt'), (u'GeheilS', u'Gehei\xdf'), (u'geheilSen', u'gehei\xdfen'), (u'gehejetzt', u'gehe jetzt'), (u'gehf', u'geht'), (u'gehfiirt', u'geh\xf6rt'), (u'gehfire', u'geh\xf6re'), (u'gehfiren', u'geh\xf6ren'), (u'gehfirt', u'geh\xf6rt'), (u'gehiipft', u'geh\xfcpft'), (u'Gehiir', u'Geh\xf6r'), (u'gehiire', u'geh\xf6re'), (u'gehiiren', u'geh\xf6ren'), (u'gehiirst', u'geh\xf6rst'), (u'gehiirt', u'geh\xf6rt'), (u'Gehim', u'Gehirn'), (u'Gehirnsch\xe9den', u'Gehirnsch\xe4den'), (u'gehlngt', u'geh\xe4ngt'), (u'gehore', u'geh\xf6re'), (u'gehoren', u'geh\xf6ren'), (u'gehort', u'geh\xf6rt'), (u"geht'sl", u"geht's!"), (u'Gehtirt', u'Geh\xf6rt'), (u'gehtjetzt', u'geht jetzt'), (u'geh\xe9irt', u'geh\xf6rt'), (u'Geh\xe9iuteten', u'Geh\xe4uteten'), (u'geh\xe9r', u'geh\xf6r'), (u'geh\xe9re', u'geh\xf6re'), (u'geh\xe9ren', u'geh\xf6ren'), (u'geh\xe9rst', u'geh\xf6rst'), (u'Geh\xe9rt', u'Geh\xf6rt'), (u'geh\xe9rten', u'geh\xf6rten'), (u'geh\xe9rtf', u'geh\xf6rt!'), (u'geiiffnet', u'ge\xf6ffnet'), (u'geilbt', u'ge\xfcbt'), (u'geistesgestort', u'geistesgest\xf6rt'), (u'Gei\ufb02blatt', u'Gei\xdfblatt'), (u'Gei\ufb02blattstaude', u'Gei\xdfblattstaude'), (u'gekiisst', u'gek\xfcsst'), (u'gekiisstl', u'gek\xfcsst!'), (u'gekijndigt', u'gek\xfcndigt'), (u'gekijsst', u'gek\xfcsst'), (u'gekilsst', u'gek\xfcsst'), (u'gekimpfl', u'gek\xe4mpft'), (u'gekimpft', u'gek\xe4mpft'), (u'geklautl', u'geklaut!'), (u'gekliirt', u'gekl\xe4rt'), (u'gekllrt', u'gekl\xe4rt'), (u'gekl\xe9rt', u'gekl\xe4rt'), (u'gekriint', u'gekr\xf6nt'), (u'gekrijmmt', u'gekr\xfcmmt'), (u'GEKUHLTER', u'GEK\xdcHLTER'), (u'gekurzt', u'gek\xfcrzt'), (u'gek\xe9mpft', u'gek\xe4mpft'), (u'gelaufenl', u'gelaufen!'), (u'gelegf', u'gelegt'), (u'gelegtwurde', u'gelegt wurde'), (u'geliist', u'gel\xf6st'), (u'gelilftet', u'gel\xfcftet'), (u'gelndert', u'ge\xe4ndert'), (u'Gelst', u'Geist'), (u'Geltungsbedurfnis', u'Geltungsbed\xfcrfnis'), (u'GELUBDE', u'GEL\xdcBDE'), (u'Gel\xe9chter', u'Gel\xe4chter'), (u'gel\xe9hmt', u'gel\xe4hmt'), (u'gel\xe9ischt', u'gel\xf6scht'), (u'Gel\xe9nde', u'Gel\xe4nde'), (u'gel\xe9nge', u'gel\xe4nge'), (u'gel\xe9st', u'gel\xf6st'), (u'gem', u'gern'), (u'gemafiregelt', u'gema\xdfregelt'), (u'Geme', u'Gerne'), (u'gemfitliches', u'gem\xfctliches'), (u'Gemiise', u'Gem\xfcse'), (u'gemiitlich', u'gem\xfctlich'), (u'Gemijlse', u'Gem\xfcse'), (u'Gemilt', u'Gem\xfct'), (u'gemiltlicher', u'gem\xfctlicher'), (u'GemLise', u'Gem\xfcse'), (u'Gemut', u'Gem\xfct'), (u'gem\xe9fi', u'gem\xe4\xdf'), (u'Gem\xe9fk', u'Gem\xe4\xdf'), (u'gem\xe9ht', u'gem\xe4ht'), (u'Gem\xe9ili', u'Gem\xe4\xdf'), (u'Gem\xe9lde', u'Gem\xe4lde'), (u'Gem\xe9lden', u'Gem\xe4lden'), (u'Genaul', u'Genau!'), (u'genieBt', u'genie\xdft'), (u'genief$en', u'genie\xdfen'), (u'Geniefien', u'Genie\xdfen'), (u'geniefk', u'genie\xdf'), (u'genielien', u'genie\xdfen'), (u'genielken', u'genie\xdfen'), (u'genie\ufb02en', u'genie\xdfen'), (u'genligen', u'gen\xfcgen'), (u'genlligend', u'gen\xfcgend'), (u'genlligt', u'gen\xfcgt'), (u'genlllgend', u'gen\xfcgend'), (u'genugt', u'gen\xfcgt'), (u'genugte', u'gen\xfcgte'), (u'georfef', u'geortet'), (u'gepfluckt', u'gepfl\xfcckt'), (u'gepriifter', u'gepr\xfcfter'), (u'gepruft', u'gepr\xfcft'), (u'Gep\xe9ck', u'Gep\xe4ck'), (u'gerfit', u'ger\xe4t'), (u'Geriichte', u'Ger\xfcchte'), (u'Geriite', u'Ger\xe4te'), (u'Gerijcht', u'Ger\xfccht'), (u'Gerllicht', u'Ger\xfccht'), (u'gerllistet', u'ger\xfcstet'), (u'gernhaben', u'gern-haben'), (u'gernntgt', u'ger\xf6ntgt'), (u'ger\xe9it', u'ger\xe4t'), (u'Ger\xe9iusch', u'Ger\xe4usch'), (u'Ger\xe9t', u'Ger\xe4t'), (u'Ger\xe9te', u'Ger\xe4te'), (u'Ger\xe9tschaften', u'Ger\xe4tschaften'), (u'ger\xe9umt', u'ger\xe4umt'), (u'Ger\xe9usch', u'Ger\xe4usch'), (u'Ger\xe9usche', u'Ger\xe4usche'), (u'ger\xe9uschvoll', u'ger\xe4uschvoll'), (u'geschafff', u'geschafft'), (u'GESCHAFTSFUHRER', u'GESCH\xc4FTSF\xdcHRER'), (u'gescha\ufb02i', u'geschafft'), (u'Geschfift', u'Gesch\xe4ft'), (u'geschfimt', u'gesch\xe4mt'), (u'Geschift', u'Gesch\xe4ft'), (u'Geschifte', u'Gesch\xe4fte'), (u'Geschiftsleute', u'Gesch\xe4ftsleute'), (u'Geschiftswelt', u'Gesch\xe4ftswelt'), (u'geschiidigt', u'gesch\xe4digt'), (u'Geschiift', u'Gesch\xe4ft'), (u'Geschiiftsleben', u'Gesch\xe4ftsleben'), (u'geschijtzten', u'gesch\xfctzten'), (u'Geschiltz', u'Gesch\xfctz'), (u'Geschiltze', u'Gesch\xfctze'), (u'Geschiltzrohre', u'Gesch\xfctzrohre'), (u'Geschiltzturm', u'Gesch\xfctzturm'), (u'geschlijpftl', u'geschl\xfcpft!'), (u'Geschllitzstellungen', u'Gesch\xfctzstellungen'), (u'geschnfiffelt', u'geschn\xfcffelt'), (u'Geschtitz', u'Gesch\xfctz'), (u'Geschtltz', u'Gesch\xfctz'), (u'Geschutz', u'Gesch\xfctz'), (u'Geschutze', u'Gesch\xfctze'), (u'Geschwiir', u'Geschw\xfcr'), (u'Geschwllir', u'Geschw\xfcr'), (u'Geschwur', u'Geschw\xfcr'), (u'geschw\xe9cht', u'geschw\xe4cht'), (u'geschw\xe9ingert', u'geschw\xe4ngert'), (u'Geschw\xe9tz', u'Geschw\xe4tz'), (u'Gesch\xe9ft', u'Gesch\xe4ft'), (u'Gesch\xe9fte', u'Gesch\xe4fte'), (u'Gesch\xe9ftige', u'Gesch\xe4ftige'), (u'gesch\xe9ftlich', u'gesch\xe4ftlich'), (u'Gesch\xe9fts', u'Gesch\xe4fts'), (u'Gesch\xe9ftsleben', u'Gesch\xe4ftsleben'), (u'Gesch\xe9ift', u'Gesch\xe4ft'), (u'Gesch\xe9ifte', u'Gesch\xe4fte'), (u'gesch\xe9iftsm\xe9ifiig', u'gesch\xe4ftsm\xe4\xdfig'), (u'gesch\xe9itzt', u'gesch\xe4tzt'), (u'gesch\xe9nolet', u'gesch\xe4ndet'), (u'Gesch\ufb02tze', u'Gesch\xfctze'), (u'Gesetzeshiiter', u'Gesetzesh\xfcter'), (u'Gesichtl', u'Gesicht!'), (u'Gesichtsausdrijcke', u'Gesichtsausdr\xfccke'), (u'Gesiiff', u'Ges\xf6ff'), (u'gesiindigt', u'ges\xfcndigt'), (u'gespiirt', u'gesp\xfcrt'), (u'Gesprach', u'Gespr\xe4ch'), (u'GESPRACH', u'GESPR\xc4CH'), (u'GESPRACHE', u'GESPR\xc4CHE'), (u'Gespr\xe9ch', u'Gespr\xe4ch'), (u'Gespr\xe9che', u'Gespr\xe4che'), (u'Gespr\xe9iche', u'Gespr\xe4che'), (u'Gespr\xe9ichsthema', u'Gespr\xe4chsthema'), (u'Gespur', u'Gesp\xfcr'), (u'gestiirt', u'gest\xf6rt'), (u'gestijrzt', u'gest\xfcrzt'), (u'gestijtzte', u'gest\xfctzte'), (u'gestof$en', u'gesto\xdfen'), (u'gestolken', u'gesto\xdfen'), (u'Gestriipp', u'Gestr\xfcpp'), (u'Gestrijpp', u'Gestr\xfcpp'), (u'GESTURZT', u'GEST\xdcRZT'), (u'gest\xe9irt', u'gest\xf6rt'), (u'Gest\xe9ndnis', u'Gest\xe4ndnis'), (u'gest\xe9rt', u'gest\xf6rt'), (u'gest\ufb02rzt', u'gest\xfcrzt'), (u'Gesundheitsbehijrde', u'Gesundheitsbeh\xf6rde'), (u'Gesundheitsftlrsorge', u'Gesundheitsf\xfcrsorge'), (u'Ges\xe9fitaschel', u'Ges\xe4\xdftasche!'), (u'Ges\xe9iffstaschenl', u'Ges\xe4\xdftaschen!'), (u'get6tet', u'get\xf6tet'), (u'Getiise', u'Get\xf6se'), (u'getiitet', u'get\xf6tet'), (u"getr'a'umt", u'getr\xe4umt'), (u'getr\xe9umt', u'getr\xe4umt'), (u'get\xe9tet', u'get\xf6tet'), (u'get\xe9tetf', u'get\xf6tet!'), (u'get\xe9uscht', u'get\xe4uscht'), (u'gev\xe9gelt', u'gev\xf6gelt'), (u'gew6hnt', u'gew\xf6hnt'), (u'GEWACHSHAUS', u'GEW\xc4CHSHAUS'), (u'gewaltt\xe9tig', u'gewaltt\xe4tig'), (u'gewarnf', u'gewarnt'), (u'Gewerkschaftsfunktion\xe9ren', u'Gewerkschaftsfunktion\xe4ren'), (u'gewfinscht', u'gew\xfcnscht'), (u'Gewiasenskon\ufb02ikte', u'Gewissenskon\ufb02ikte'), (u'gewiihlt', u'gew\xe4hlt'), (u'gewiihnen', u'gew\xf6hnen'), (u'gewiihnlich', u'gew\xf6hnlich'), (u'gewiihnlicher', u'gew\xf6hnlicher'), (u'gewiihnliches', u'gew\xf6hnliches'), (u'gewiihnt', u'gew\xf6hnt'), (u'gewiinscht', u'gew\xfcnscht'), (u'gewijhnlichen', u'gew\xf6hnlichen'), (u'gewijnscht', u'gew\xfcnscht'), (u'gewissermafien', u'gewisserma\xdfen'), (u'gewissermallsen', u'gewisserma\xdfen'), (u'gewlllnscht', u'gew\xfcnscht'), (u'Gewohnheitstiter', u'Gewohnheitst\xe4ter'), (u'gewtinscht', u'gew\xfcnscht'), (u'gewunscht', u'gew\xfcnscht'), (u'gewunschten', u'gew\xfcnschten'), (u'Gew\xe9chshaus', u'Gew\xe4chshaus'), (u'gew\xe9hlt', u'gew\xe4hlt'), (u'gew\xe9hnen', u'gew\xf6hnen'), (u'gew\xe9hnlicher', u'gew\xf6hnlicher'), (u'gew\xe9hnst', u'gew\xf6hnst'), (u'gew\xe9hnt', u'gew\xf6hnt'), (u'Gew\xe9hren', u'Gew\xe4hren'), (u'gew\xe9hrt', u'gew\xe4hrt'), (u'Gew\xe9isser', u'Gew\xe4sser'), (u'Gew\xe9ssern', u'Gew\xe4ssern'), (u'gezfichtet', u'gez\xfcchtet'), (u'gezilndet', u'gez\xfcndet'), (u'gez\xe9hlt', u'gez\xe4hlt'), (u'gez\xe9ihlt', u'gez\xe4hlt'), (u'gez\xe9ihmt', u'gez\xe4hmt'), (u'ge\xe9ndert', u'ge\xe4ndert'), (u"GF6l'1Z6fUf", u'Grenze f\xfcr'), (u'Gfirtel', u'G\xfcrtel'), (u'Gfirtner', u'G\xe4rtner'), (u'Gfiste', u'G\xe4ste'), (u'Gfitter', u'G\xf6tter'), (u'Ghrchen', u'\xd6hrchen'), (u'gibtjede', u'gibt jede'), (u'gibtk', u"gibt's"), (u'gibts', u"gibt's"), (u'gieBen', u'gie\xdfen'), (u'GieBkanne', u'Gie\xdfkanne'), (u'gief$t', u'gie\xdft'), (u'giefit', u'gie\xdft'), (u'gielit', u'gie\xdft'), (u'gignalton', u'Signalton'), (u'giinstiger', u'g\xfcnstiger'), (u'Giire', u'G\xf6re'), (u'Giite', u'G\xfcte'), (u'giitiger', u'g\xfctiger'), (u'Giitter', u'G\xf6tter'), (u'Giittliche', u'G\xf6ttliche'), (u'giittlichen', u'g\xf6ttlichen'), (u'Gijte', u'G\xfcte'), (u'Gijtel', u'G\xfcte!'), (u'Gilrtel', u'G\xfcrtel'), (u'Gilte', u'G\xfcte'), (u'Giltiger', u'G\xfctiger'), (u'Gitarrenkl\xe9nge', u'Gitarrenkl\xe4nge'), (u'Gite', u'G\xfcte'), (u'GIUck', u'Gl\xfcck'), (u"GIUCKliCl'1", u'Gl\xfccklich'), (u"GL'lte", u'G\xfcte'), (u'Glaubwurdigkeit', u'Glaubw\xfcrdigkeit'), (u'Glaubwurdigkeitl', u'Glaubw\xfcrdigkeit!'), (u'glaubw\ufb02rdig', u'glaubw\xfcrdig'), (u'glb', u'gib'), (u'glbt', u'gibt'), (u'Gle/ch', u'Gleich'), (u'gleichgiiltig', u'gleichg\xfcltig'), (u'gleichm\xe9mig', u'gleichm\xe4\xdfig'), (u'Glfick', u'Gl\xfcck'), (u'glficklich', u'gl\xfccklich'), (u'Glfickspilz', u'Gl\xfcckspilz'), (u'Gliick', u'Gl\xfcck'), (u'Gliickchen', u'Gl\xf6ckchen'), (u'gliicklich', u'gl\xfccklich'), (u'gliicklicher', u'gl\xfccklicher'), (u'Gliicksbringer', u'Gl\xfccksbringer'), (u'Gliickssfr\xe9hne', u'Gl\xfccksstr\xe4hne'), (u'Gliickwunsch', u'Gl\xfcckwunsch'), (u'gliilcklich', u'gl\xfccklich'), (u'Glijck', u'Gl\xfcck'), (u'glijcklich', u'gl\xfccklich'), (u'Glilck', u'Gl\xfcck'), (u'glilcklich', u'gl\xfccklich'), (u'Glilckwunsch', u'Gl\xfcckwunsch'), (u'Glillck', u'Gl\xfcck'), (u'gllinstig', u'g\xfcnstig'), (u'gllinstigem', u'g\xfcnstigem'), (u'gllinstigen', u'g\xfcnstigen'), (u'glljcklich', u'gl\xfccklich'), (u'glllicklich', u'gl\xfccklich'), (u'glllickliche', u'gl\xfcckliche'), (u'Glllte', u'G\xfcte'), (u'Glorifiziertl', u'Glorifiziert!'), (u'glticklich', u'gl\xfccklich'), (u'Gltickszahlen', u'Gl\xfcckszahlen'), (u'gltlckliohes', u'gl\xfcckliches'), (u'Gluck', u'Gl\xfcck'), (u'glucklich', u'gl\xfccklich'), (u'gluckliche', u'gl\xfcckliche'), (u'GLUCKSELIGKEIT', u'GL\xdcCKSELIGKEIT'), (u'Gluckwunsch', u'Gl\xfcckwunsch'), (u'Gluok', u'Gl\xfcck'), (u'gluoklich', u'gl\xfccklich'), (u'Glupsch\xe9ugige', u'Glupsch\xe4ugige'), (u'glutheilie', u'gluthei\xdfe'), (u'gl\xe9inzende', u'gl\xe4nzende'), (u'gl\xe9nzende', u'gl\xe4nzende'), (u'gl\xe9nzte', u'gl\xe4nzte'), (u'Gl\xe9ser', u'Gl\xe4ser'), (u'gl\xe9ubige', u'gl\xe4ubige'), (u'Gl\xe9ubigen', u'Gl\xe4ubigen'), (u'Gl\ufb02ck', u'Gl\xfcck'), (u'Gl\ufb02cklich', u'Gl\xfccklich'), (u'Gl\ufb02ckstag', u'Gl\xfcckstag'), (u'Gl\ufb02ckwilnsche', u'Gl\xfcckw\xfcnsche'), (u'gnidig', u'gn\xe4dig'), (u'Gnllnden', u'Gr\xfcnden'), (u'gn\xe9dig', u'gn\xe4dig'), (u'gn\xe9dige', u'gn\xe4dige'), (u'gn\xe9digen', u'gn\xe4digen'), (u'Gn\xe9digste', u'Gn\xe4digste'), (u'gn\xe9idig', u'gn\xe4dig'), (u'Goff', u'Gott'), (u'Golfballweili', u'Golfballwei\xdf'), (u'gonnst', u'g\xf6nnst'), (u'gottesfllirchtiger', u'gottesf\xfcrchtiger'), (u'Gottverdammt', u'Gott verdammt'), (u'Go\ufb02', u'Gott'), (u'Gr6Be', u'Gr\xf6\xdfe'), (u'gr6Ber', u'gr\xf6\xdfer'), (u'gr6Bere', u'gr\xf6\xdfere'), (u'gr6Beren', u'gr\xf6\xdferen'), (u'Gr6Bte', u'Gr\xf6\xdfte'), (u'Gr6Bten', u'Gr\xf6\xdften'), (u'gr6Bter', u'gr\xf6\xdfter'), (u'gr6Btes', u'gr\xf6\xdftes'), (u'gr6f$te', u'gr\xf6\xdfte'), (u'gr6f$ten', u'gr\xf6\xdften'), (u'gr6f5ten', u'gr\xf6\xdften'), (u'gr6I3ter', u'gr\xf6\xdfter'), (u'gr6ISten', u'gr\xf6\xdften'), (u'Gr6l3e', u'Gr\xf6\xdfe'), (u'gr6l3ter', u'gr\xf6\xdfter'), (u'Grabst\xe9tte', u'Grabst\xe4tte'), (u'gratulierel', u'gratuliere!'), (u'grClf$en', u'gr\xfc\xdfen'), (u'grfilieren', u'gr\xf6\xdferen'), (u'Grfiner', u'Gr\xfcner'), (u'griil3e', u'gr\xfc\xdfe'), (u'griiliere', u'gr\xf6\xdfere'), (u'griiliten', u'gr\xf6\xdften'), (u'griin', u'gr\xfcn'), (u'Griinde', u'Gr\xfcnde'), (u'Griinden', u'Gr\xfcnden'), (u'griindlich', u'gr\xfcndlich'), (u'Griine', u'Gr\xfcne'), (u'griinen', u'gr\xfcnen'), (u'Griiner', u'Gr\xfcner'), (u'griin\xe9iugige', u'gr\xfcn\xe4ugige'), (u'griin\xe9iugiges', u'gr\xfcn\xe4ugiges'), (u'grii\ufb02te', u'gr\xf6\xdfte'), (u'Grijbeln', u'Gr\xfcbeln'), (u'griJBen', u'gr\xfc\xdfen'), (u'grijn', u'gr\xfcn'), (u'Grijnde', u'Gr\xfcnde'), (u'grijnden', u'gr\xfcnden'), (u'grijndlich', u'gr\xfcndlich'), (u'grijnes', u'gr\xfcnes'), (u'Grijnfutter', u'Gr\xfcnfutter'), (u'Grilbelt', u'Gr\xfcbelt'), (u'grilfken', u'gr\xfc\xdfen'), (u'Grillh\xe9hnchen', u'Grillh\xe4hnchen'), (u'Grilnde', u'Gr\xfcnde'), (u'Grilnden', u'Gr\xfcnden'), (u'grilndet', u'gr\xfcndet'), (u'grilndlich', u'gr\xfcndlich'), (u'grilndlicherf', u'gr\xfcndlicher!'), (u'grilndlichl', u'gr\xfcndlich!'), (u'grilne', u'gr\xfcne'), (u'Grilnschn\xe9bel', u'Gr\xfcnschn\xe4bel'), (u'grim', u'gr\xfcn'), (u'Grime', u'Gr\xf6\xdfe'), (u'grinco', u'gringo'), (u'Grllinde', u'Gr\xfcnde'), (u'grllinden', u'gr\xfcnden'), (u'grllindlich', u'gr\xfcndlich'), (u'grlllnes', u'gr\xfcnes'), (u'Gro/3artig', u'Gro\xdfartig'), (u'gro/3es', u'gro\xdfes'), (u'gro/3zUgig', u'gro\xdfz\xfcgig'), (u'Gro/Bstadt', u'Gro\xdfstadt'), (u'gro/Ken', u'gro\xdfen'), (u'groB', u'gro\xdf'), (u'groBartig', u'gro\xdfartig'), (u'GroBe', u'Gro\xdfe'), (u'GroBes', u'Gro\xdfes'), (u'GroBmutter', u'Gro\xdfmutter'), (u'GroBteil', u'Gro\xdfteil'), (u'groBziJgiger', u'gro\xdfz\xfcgiger'), (u'grof$', u'gro\xdf'), (u'grof$artig', u'gro\xdfartig'), (u'grof$artigen', u'gro\xdfartigen'), (u'grof$e', u'gro\xdfe'), (u'grof$er', u'gro\xdfer'), (u'grof$es', u'gro\xdfes'), (u'grof3', u'gro\xdf'), (u'grof3>artige', u'gro\xdfartige'), (u'Grof3e', u'Gro\xdfe'), (u'grof3en', u'gro\xdfen'), (u'grof3erAlien', u'gro\xdfer Alien'), (u'grof5es', u'gro\xdfes'), (u'Grofbvaters', u'Gro\xdfvaters'), (u'grofi', u'gro\xdf'), (u'Grofiangriffs', u'Gro\xdfangriffs'), (u'Grofiartig', u'Gro\xdfartig'), (u'grofiartige', u'gro\xdfartige'), (u'grofiartigen', u'gro\xdfartigen'), (u'grofiartiger', u'gro\xdfartiger'), (u'Grofiartiges', u'Gro\xdfartiges'), (u'Grofibritannien', u'Gro\xdfbritannien'), (u'Grofidiebstahl', u'Gro\xdfdiebstahl'), (u'Grofie', u'Gro\xdfe'), (u'grofier', u'gro\xdfer'), (u'grofies', u'gro\xdfes'), (u'grofiten', u'gr\xf6\xdften'), (u'grofk', u'gro\xdf'), (u'Grofkartig', u'Gro\xdfartig'), (u'grofke', u'gro\xdfe'), (u'Grofken', u'Gro\xdfen'), (u'Grofker', u'Gro\xdfer'), (u'Grofkvater', u'Gro\xdfvater'), (u'grofLe', u'gro\xdfe'), (u'grofler', u'gro\xdfer'), (u'groflsartig', u'gro\xdfartig'), (u'groflsartige', u'gro\xdfartige'), (u'Groflse', u'Gro\xdfe'), (u'groflsen', u'gro\xdfen'), (u'Grofser', u'Gro\xdfer'), (u'grol', u'gro\xdf'), (u"grol'3>en", u'gro\xdfen'), (u'grol2>', u'gro\xdf'), (u'grol2>en', u'gro\xdfen'), (u'grol3>es', u'gro\xdfes'), (u'grol3e', u'gro\xdfe'), (u'grol3er', u'gro\xdfer'), (u'Grol3raum', u'Gro\xdfraum'), (u'groli', u'gro\xdf'), (u'Groliartig', u'Gro\xdfartig'), (u'groliartige', u'gro\xdfartige'), (u'groliartigen', u'gro\xdfartigen'), (u'grolie', u'gro\xdfe'), (u'grolien', u'gro\xdfen'), (u'groliherzig', u'gro\xdfherzig'), (u'Grolimutter', u'Gro\xdfmutter'), (u'Grolisegel', u'Gro\xdfsegel'), (u'Grolkvater', u'Gro\xdfvater'), (u'groller', u'gro\xdfer'), (u'Grollser', u'Gro\xdfer'), (u'grollzugig', u'gro\xdfz\xfcgig'), (u'grolS', u'gro\xdf'), (u'grolSe', u'gro\xdfe'), (u'GrolSeltern', u'Gro\xdfeltern'), (u'grolSer', u'gro\xdfer'), (u'GrolSvater', u'Gro\xdfvater'), (u'grolZ~', u'gro\xdfe'), (u'gror$er', u'gro\xdfer'), (u'grorker', u'gro\xdfer'), (u'grosses', u'gro\xdfes'), (u'GROSSTE', u'GR\xd6SSTE'), (u'gro\ufb02', u'gro\xdf'), (u'gro\ufb02e', u'gro\xdfe'), (u'Gro\ufb02stadtkind', u'Gro\xdfstadtkind'), (u'Gro\ufb02vater', u'Gro\xdfvater'), (u'Grtin', u'Gr\xfcn'), (u'Grtmde', u'Gr\xfcnde'), (u'GruB', u'Gru\xdf'), (u'Grubenausg\xe9nge', u'Grubenausg\xe4nge'), (u'Gruf$', u'Gru\xdf'), (u'grUf$en', u'gr\xfc\xdfen'), (u'grufit', u'gr\xfc\xdft'), (u'Gruli', u'Gru\xdf'), (u'Grulikarte', u'Gru\xdfkarte'), (u'Grulikarten', u'Gru\xdfkarten'), (u'Grun', u'Gr\xfcn'), (u'grundlich', u'gr\xfcndlich'), (u'Grundstiick', u'Grundst\xfcck'), (u'grunds\xe9tzlich', u'grunds\xe4tzlich'), (u'grune', u'gr\xfcne'), (u'grunen', u'gr\xfcnen'), (u'Gr\xe9ben', u'Gr\xe4ben'), (u'gr\xe9bst', u'gr\xe4bst'), (u'gr\xe9fier', u'gr\xf6\xdfer'), (u'gr\xe9fkte', u'gr\xf6\xdfte'), (u'gr\xe9flserer', u'gr\xf6\xdferer'), (u'Gr\xe9ifite', u'Gr\xf6\xdfte'), (u'gr\xe9illten', u'gr\xf6\xdften'), (u'gr\xe9sslich', u'gr\xe4sslich'), (u'Gr\xe9uel', u'Gr\xe4uel'), (u'gr\ufb02ndlich', u'gr\xfcndlich'), (u'gr\ufb02ne', u'gr\xfcne'), (u'gull', u'gut!'), (u'Gummist\xe9psel', u'Gummist\xf6psel'), (u'Gumml', u'Gummi'), (u'GUNSTIGSTEN', u'G\xdcNSTIGSTEN'), (u'Gurtell', u'G\xfcrtel!'), (u'gutaussehend', u'gut aussehend'), (u'gutaussehender', u'gut aussehender'), (u'GUte', u'G\xfcte'), (u'gutgebaut', u'gut gebaut'), (u'gutgehen', u'gut gehen'), (u'Gutmijtigkeit', u'Gutm\xfctigkeit'), (u'g\xe9be', u'g\xe4be'), (u'g\xe9ben', u'g\xe4ben'), (u'g\xe9ibe', u'g\xe4be'), (u'G\xe9ittern', u'G\xf6ttern'), (u'G\xe9lisch', u'G\xe4lisch'), (u'G\xe9lische', u'G\xe4lische'), (u'g\xe9lisches', u'g\xe4lisches'), (u'G\xe9nsehaut', u'G\xe4nsehaut'), (u'G\xe9nsen', u'G\xe4nsen'), (u'G\xe9nze', u'G\xe4nze'), (u'G\xe9rfen', u'G\xe4rten'), (u'G\xe9rtnern', u'G\xe4rtnern'), (u'G\xe9ste', u'G\xe4ste'), (u'G\xe9stezimmer', u'G\xe4stezimmer'), (u'G\xe9tter', u'G\xf6tter'), (u'G\xe9tterspeise', u'G\xf6tterspeise'), (u'G\xe9ttin', u'G\xf6ttin'), (u'G\xe9ttliche', u'G\xf6ttliche'), (u'g\xe9ttlichen', u'g\xf6ttlichen'), (u'G\xe9tze', u'G\xf6tze'), (u'G\u20acfUhl6', u'Gef\xfchle'), (u'G\u20acStFUpp', u'Gestr\xfcpp'), (u"h<'>'r't", u'h\xf6rt'), (u"h<'5r", u'h\xf6r'), (u"h'a'lt", u'h\xe4lt'), (u"H'a'nde", u'H\xe4nde'), (u"H'a'nden", u'H\xe4nden'), (u"H'a'ttest", u'H\xe4ttest'), (u'H/', u'Hi'), (u'H/er', u'Hier'), (u'h/nfer', u'hinter'), (u'h5tte', u'h\xe4tte'), (u'H6fe', u'H\xf6fe'), (u'h6flich', u'h\xf6flich'), (u'H6fling', u'H\xf6fling'), (u'H6hen', u'H\xf6hen'), (u'h6her', u'h\xf6her'), (u'h6here', u'h\xf6here'), (u'H6HERER', u'H\xd6HERER'), (u'H6hle', u'H\xf6hle'), (u'H6l1e', u'H\xf6rte'), (u'H6lle', u'H\xf6lle'), (u'H6llen', u'H\xf6llen'), (u'h6lte', u'h\xf6rte'), (u'H6r', u'H\xf6r'), (u'h6re', u'h\xf6re'), (u'h6ren', u'h\xf6ren'), (u'H6rer', u'H\xf6rer'), (u'H6rner', u'H\xf6rner'), (u'h6rst', u'h\xf6rst'), (u'h6rt', u'h\xf6rt'), (u'h6rte', u'h\xf6rte'), (u'Ha/s', u'Hals'), (u'Haarbijrstel', u'Haarb\xfcrste!'), (u'Haarhfirste', u'Haarb\xfcrste'), (u'Haarl', u'Haar!'), (u'Haarstr\xe9hne', u'Haarstr\xe4hne'), (u"hab'jemanden", u"hab' jemanden"), (u'Hah', u'H\xe4h'), (u'halbstlllndiges', u'halbst\xfcndiges'), (u'halbvervvandelt', u'halbverwandelt'), (u'halfef', u'haltet'), (u'Hallfjchen', u'Hall\xf6chen'), (u'hallol', u'hallo!'), (u'Halsb\xe9nder', u'Halsb\xe4nder'), (u'Halsl', u'Hals!'), (u'haltenl', u'halten!'), (u'Haltjohnny', u'Halt Johnny'), (u'Hammersch\xe9del', u'Hammersch\xe4del'), (u'Handfl\xe9che', u'Handfl\xe4che'), (u'Handlungsstr\xe9nge', u'Handlungsstr\xe4nge'), (u'harfe', u'harte'), (u'hartn\xe9ickig', u'hartn\xe4ckig'), (u'Hasenful', u'Hasenfu\xdf'), (u'Hasenfull', u'Hasenfu\xdf'), (u'hassq', u'hasse'), (u'Hastja', u'Hast ja'), (u'hatjetzt', u'hat jetzt'), (u'hatta', u'hatte'), (u'Haupfbus', u'Hauptbus'), (u'Hauptaktion\xe9ire', u'Hauptaktion\xe4re'), (u'Hauptaktion\xe9irinnen', u'Hauptaktion\xe4rinnen'), (u'Hauptkabell', u'Hauptkabel!'), (u'haupts\xe9chlich', u'haupts\xe4chlich'), (u'haupts\xe9ichlich', u'haupts\xe4chlich'), (u'Haupttrib\ufb02ne', u'Haupttrib\xfcne'), (u'Hauptverschwiirer', u'Hauptverschw\xf6rer'), (u'Hauptwasserrohrwar', u'Hauptwasserrohr war'), (u'Hausfirzte', u'Haus\xe4rzte'), (u'Haush\xe9lterin', u'Haush\xe4lterin'), (u'Hausschlilssel', u'Hausschl\xfcssel'), (u'Haustilr', u'Haust\xfcr'), (u'Hausubervvachung', u'Haus\xfcberwachung'), (u'ha\xdft', u'hasst'), (u'Hbr', u'H\xf6r'), (u"hc'5ren", u'h\xf6ren'), (u"hc'\xa7r", u'h\xf6r'), (u'hdchsfens', u'h\xf6chstens'), (u'Hdchstleistung', u'H\xf6chstleistung'), (u'hdher', u'h\xf6her'), (u'Hdlle', u'H\xf6lle'), (u'Hdllenfeuer', u'H\xf6llenfeuer'), (u'hdre', u'h\xf6re'), (u'hdren', u'h\xf6ren'), (u'hdrsf', u'h\xf6rst'), (u'hdrten', u'horten'), (u'He/nr/ch', u'Heinrich'), (u'hedeutest', u'bedeutest'), (u'hegrfille', u'begr\xfc\xdfe'), (u'heiB', u'hei\xdf'), (u'heiBe', u'hei\xdfe'), (u'heiBen', u'hei\xdfen'), (u'HeiBer', u'Hei\xdfer'), (u'heiBes', u'hei\xdfes'), (u'heiBt', u'hei\xdft'), (u'heif$', u'hei\xdf'), (u'heif$e', u'hei\xdfe'), (u'heif$es', u'hei\xdfes'), (u'Heif$t', u'Hei\xdft'), (u'heif3>en', u'hei\xdfen'), (u'heif3t', u'hei\xdft'), (u'heif5en', u'hei\xdfen'), (u'heifie', u'hei\xdfe'), (u'heifiem', u'hei\xdfem'), (u'heifien', u'hei\xdfen'), (u'heifit', u'hei\xdft'), (u'heifkt', u'hei\xdft'), (u'heifLt', u'hei\xdft'), (u'heifZ>e', u'hei\xdfe'), (u"heil'$", u'hei\xdf'), (u"heil'$en", u'hei\xdfen'), (u"heil'$t", u'hei\xdft'), (u"heil'Se", u'hei\xdfe'), (u'heil2>en', u'hei\xdfen'), (u'heil2>t', u'hei\xdft'), (u'heil3en', u'hei\xdfen'), (u'heil3t', u'hei\xdft'), (u'heil5e', u'hei\xdfe'), (u'heil5t', u'hei\xdft'), (u'heili', u'hei\xdf'), (u'heilies', u'hei\xdfes'), (u'heilit', u'hei\xdft'), (u'heillst', u'hei\xdft'), (u'heilZ~', u'hei\xdft'), (u'heir$', u'hei\xdf'), (u'heisst', u'hei\xdft'), (u'Helllger', u'Heiliger'), (u'Helzlichen', u'Herzlichen'), (u"Hen'je", u'Herrje'), (u'herabstofien', u'herabsto\xdfen'), (u'heransttlrmtet', u'heranst\xfcrmtet'), (u'heraush\xe9ngendem', u'heraush\xe4ngendem'), (u'herhfiren', u'herh\xf6ren'), (u'herh\xe9ren', u'herh\xf6ren'), (u'heriiber', u'her\xfcber'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herumf\xe9hrt', u'herumf\xe4hrt'), (u'herumkehren', u'herum kehren'), (u'herumlluft', u'heruml\xe4uft'), (u'herumzuwijhlen', u'herumzuw\xfchlen'), (u'Herzrhythmusst\xe9rungen', u'Herzrhythmusst\xf6rungen'), (u'Herzschlielierei', u'Herzschlie\xdferei'), (u'Herzstlllck', u'Herzst\xfcck'), (u'Heuta', u'Heute'), (u'Hexenhtltte', u'Hexenh\xfctte'), (u'HeY\xb7', u'Hey.'), (u'Hfibscheste', u'H\xfcbscheste'), (u'hfiherer', u'h\xf6herer'), (u'hfihsch', u'h\xfcbsch'), (u'Hfilfte', u'H\xe4fte'), (u'Hfille', u'H\xf6lle'), (u'hfilt', u'h\xe4lt'), (u'hfiltst', u'h\xe4ltst'), (u'Hfin', u'H\xf6rt'), (u'hfipft', u'h\xfcpft'), (u'Hfir', u'H\xf6r'), (u'hfiren', u'h\xf6ren'), (u'hfirst', u'h\xf6rst'), (u'hfirt', u'h\xf6rt'), (u'hfitte', u'h\xe4tte'), (u'hfitten', u'h\xe4tten'), (u'hie/3', u'hie\xdf'), (u'hieB', u'hie\xdf'), (u'hiefL', u'hie\xdf'), (u'hiel3', u'hie\xdf'), (u'hiells', u'hie\xdf'), (u'hierhergereist', u'hierher gereist'), (u'hierherzuriick', u'hierher zur\xfcck'), (u'hierijber', u'hier\xfcber'), (u'hierjede', u'hier jede'), (u'hierjeder', u'hier jeder'), (u'hierl', u'hier!'), (u'hierL', u'hie\xdf'), (u'hierwar', u'hier war'), (u'hierzum', u'hier-zum'), (u'hie\ufb02', u'hie\xdf'), (u'Hiibsch', u'H\xfcbsch'), (u'Hiibsche', u'H\xfcbsche'), (u'Hiibscher', u'H\xfcbscher'), (u'hiibschl', u'h\xfcbsch!'), (u'hiichst', u'h\xf6chst'), (u'hiichstens', u'h\xf6chstens'), (u'hiichster', u'h\xf6chster'), (u'hiichstpersiinlich', u'h\xf6chstpers\xf6nlich'), (u'Hiifen', u'H\xf6fen'), (u'hiifischen', u'h\xf6fischen'), (u'Hiifling', u'H\xf6fling'), (u'Hiigel', u'H\xfcgel'), (u'Hiihe', u'H\xf6he'), (u'Hiihepunkt', u'H\xf6hepunkt'), (u'hiiher', u'h\xf6her'), (u'hiihere', u'h\xf6here'), (u'Hiihlen', u'H\xf6hlen'), (u'Hiihnchen', u'H\xfchnchen'), (u'Hiihner', u'H\xfchner'), (u'Hiihnerkl\xe9fkchen', u'H\xfchnerkl\xf6\xdfchen'), (u'Hiilfte', u'H\xe4lfte'), (u'Hiille', u'H\xf6lle'), (u'Hiillenstreitmacht', u'H\xf6llenstreitmacht'), (u'hiillischen', u'h\xf6llischen'), (u'hiipfen', u'h\xfcpfen'), (u'Hiir', u'H\xf6r'), (u'hiire', u'h\xf6re'), (u'Hiiren', u'H\xf6ren'), (u'Hiirer', u'H\xf6rer'), (u'Hiiret', u'H\xf6ret'), (u'Hiirjetzt', u'H\xf6r jetzt'), (u'Hiirt', u'H\xf6rt'), (u'hiirte', u'h\xf6rte'), (u'hiirtest', u'h\xf6rtest'), (u'Hiissliches', u'H\xe4ssliches'), (u'Hiite', u'H\xfcte'), (u'Hiiten', u'H\xfcten'), (u'hiitet', u'h\xfctet'), (u'Hiitte', u'H\xe4tte'), (u'hiitten', u'h\xe4tten'), (u'Hiitten', u'H\xfctten'), (u'hijbsch', u'h\xfcbsch'), (u'hijbschen', u'h\xfcbschen'), (u'hijbsches', u'h\xfcbsches'), (u'Hijfte', u'H\xfcfte'), (u'Hijften', u'H\xfcften'), (u'Hijgel', u'H\xfcgel'), (u'Hijgels', u'H\xfcgels'), (u'Hijpfburgl', u'H\xfcpfburg!'), (u'hijpfe', u'h\xfcpfe'), (u'hijpfen', u'h\xfcpfen'), (u'hijre', u'h\xf6re'), (u'Hijren', u'H\xf6ren'), (u'Hijrer', u'H\xf6rer'), (u'hilbsch', u'h\xfcbsch'), (u'hilbsche', u'h\xfcbsche'), (u'hilbschen', u'h\xfcbschen'), (u'hilbscher', u'h\xfcbscher'), (u'Hilfel', u'Hilfe!'), (u'HILFSPERSONALI', u'HILFSPERSONAL:'), (u'Hilgel', u'H\xfcgel'), (u'hillig', u'billig'), (u'Hilt', u'H\xe4lt'), (u'hil\ufb02', u'hilft'), (u'Him', u'Hirn'), (u'Himmell', u'Himmel!'), (u'hineintr\xe9umen', u'hineintr\xe4umen'), (u'hinfijhrt', u'hinf\xfchrt'), (u'hingefiihrt', u'hingef\xfchrt'), (u'hingehdren', u'hingeh\xf6ren'), (u'hingehiiren', u'hingeh\xf6ren'), (u'hinilber', u'hin\xfcber'), (u'hinreiliend', u'hinrei\xdfend'), (u'hinschmeifit', u'hinschmei\xdft'), (u'HintenN\xe4ldler', u'Hinterw\xe4ldler'), (u'Hintergrundl\xe9rm', u'Hintergrundl\xe4rm'), (u'hinterhfiltig', u'hinterh\xe4ltig'), (u'hinterh\xe9iltiger', u'hinterh\xe4ltiger'), (u'Hinterh\xe9iltigl', u'Hinterh\xe4ltig!'), (u'hinterh\xe9ltige', u'hinterh\xe4ltige'), (u'hinterh\xe9ltiger', u'hinterh\xe4ltiger'), (u'Hinterk\xe9pfen', u'Hinterk\xf6pfen'), (u'hinterlieBe', u'hinterlie\xdfe'), (u'hinterl\xe9sst', u'hinterl\xe4sst'), (u'Hintersttlbchen', u'Hinterst\xfcbchen'), (u'Hintertur', u'Hintert\xfcr'), (u'hinwollen', u'hin wollen'), (u'hinzufuhren', u'hinzuf\xfchren'), (u'hinzuf\ufb02gten', u'hinzuf\xfcgten'), (u'Hirnrnel', u'Himmel'), (u'hirteste', u'h\xe4rteste'), (u'hisslich', u'h\xe4sslich'), (u'Hi\xe9tte', u'H\xe4tte'), (u'Hler', u'Her'), (u'hler', u'hier'), (u'hllf', u'hilf'), (u'hllibsch', u'h\xfcbsch'), (u'Hllindinnen', u'H\xfcndinnen'), (u'Hlllpf', u'H\xfcpf'), (u'hln', u'hin'), (u'Hlnbllck', u'Hinblick'), (u'hltte', u'h\xe4tte'), (u'Hltten', u'H\xe4tten'), (u'Hochfrequenzst\xe9rungenl', u'Hochfrequenzst\xf6rungen!'), (u'hochl', u'hoch!'), (u'Hochsicherheitsgef\xe9ngnis', u'Hochsicherheitsgef\xe4ngnis'), (u'Hochstens', u'H\xf6chstens'), (u'Hochzeitskostiime', u'Hochzeitskost\xfcme'), (u'Hohek', u'Hoheit'), (u'Hohepunkt', u'H\xf6hepunkt'), (u'hohere', u'h\xf6here'), (u'HoHo', u'Hoho'), (u'Holle', u'H\xf6lle'), (u'Holzsttlck', u'Holzst\xfcck'), (u'hor', u'h\xf6r'), (u'Horen', u'H\xf6ren'), (u'Hosenscheifker', u'Hosenschei\xdfer'), (u'Hosenscheiiker', u'Hosenschei\xdfer'), (u'Hosenschei\ufb02er', u'Hosenschei\xdfer'), (u'Hotelg\xe9ste', u'Hotelg\xe4ste'), (u'HQHE', u'H\xd6HE'), (u'htibscher', u'h\xfcbscher'), (u'Htihnchen', u'H\xfchnchen'), (u'Htipfen', u'H\xfcpfen'), (u'Htipfenl', u'H\xfcpfen!'), (u'htiren', u'h\xf6ren'), (u'hubsch', u'h\xfcbsch'), (u'hubsche', u'h\xfcbsche'), (u'hubschen', u'h\xfcbschen'), (u'Hubscher', u'H\xfcbscher'), (u'hubscheres', u'h\xfcbscheres'), (u'Hubsches', u'H\xfcbsches'), (u'Huhner', u'H\xfchner'), (u'humon/oll', u'humorvoll'), (u'Hundchen', u'H\xfcndchen'), (u'Hundebullel', u'Hundebulle!'), (u'Hunden\xe9pfe', u'Hunden\xe4pfe'), (u'Hundescheilie', u'Hundeschei\xdfe'), (u'Hundl', u'Hund!'), (u'HUNG', u'H\xfclle'), (u'hunte', u'bunte'), (u'Hurensiihne', u'Hurens\xf6hne'), (u'Hurensohnl', u'Hurensohn!'), (u'Huterin', u'H\xfcterin'), (u'HUtte', u'H\xfctte'), (u'Hypoglyk\xe9mie', u'Hypoglyk\xe4mie'), (u'h\xe9', u'h\xe4'), (u'H\xe9chste', u'H\xf6chste'), (u'h\xe9chsten', u'h\xf6chsten'), (u'H\xe9chstens', u'H\xf6chstens'), (u'H\xe9chstpers\xe9nlich', u'H\xf6chstpers\xf6nlich'), (u'H\xe9fen', u'H\xe4fen'), (u'h\xe9flich', u'h\xf6flich'), (u'H\xe9ftling', u'H\xe4ftling'), (u'H\xe9ftlinge', u'H\xe4ftlinge'), (u'H\xe9ftlingsr\xe9te', u'H\xe4ftlingsr\xe4te'), (u'H\xe9hef', u'H\xf6he!'), (u'H\xe9hepunkt', u'H\xf6hepunkt'), (u'h\xe9her', u'h\xf6her'), (u'h\xe9heren', u'h\xf6heren'), (u'H\xe9i', u'H\xe4'), (u'H\xe9ifen', u'H\xe4fen'), (u'H\xe9ilften', u'H\xe4lften'), (u'h\xe9iltst', u'h\xe4ltst'), (u'H\xe9inde', u'H\xe4nde'), (u'h\xe9ing', u'h\xe4ng'), (u'h\xe9ingen', u'h\xe4ngen'), (u'h\xe9ingt', u'h\xe4ngt'), (u'h\xe9ir', u'h\xf6r'), (u'h\xe9irter', u'h\xe4rter'), (u'h\xe9itt', u'h\xe4tt'), (u'H\xe9itte', u'H\xe4tte'), (u'h\xe9itten', u'h\xe4tten'), (u'h\xe9ittest', u'h\xe4ttest'), (u'h\xe9iufig', u'h\xe4ufig'), (u'H\xe9lfte', u'H\xe4lfte'), (u'H\xe9lle', u'H\xf6lle'), (u'H\xe9llen', u'H\xf6llen'), (u'H\xe9llenloch', u'H\xf6llenloch'), (u'h\xe9llisch', u'h\xf6llisch'), (u'h\xe9llische', u'h\xf6llische'), (u'h\xe9lt', u'h\xe4lt'), (u'H\xe9ltst', u'H\xe4ltst'), (u'h\xe9lzernes', u'h\xf6lzernes'), (u'h\xe9misch', u'h\xe4misch'), (u'H\xe9mmer', u'H\xe4mmer'), (u'h\xe9mmernde', u'h\xe4mmernde'), (u'H\xe9moglobin', u'H\xe4moglobin'), (u'H\xe9morrhoiden', u'H\xe4morrhoiden'), (u'H\xe9ndchen', u'H\xe4ndchen'), (u'H\xe9nde', u'H\xe4nde'), (u'H\xe9ndedruck', u'H\xe4ndedruck'), (u'H\xe9nden', u'H\xe4nden'), (u'H\xe9ndlerin', u'H\xe4ndlerin'), (u'h\xe9ng', u'h\xe4ng'), (u'h\xe9ngen', u'h\xe4ngen'), (u'h\xe9ngend', u'h\xe4ngend'), (u'h\xe9ngst', u'h\xe4ngst'), (u'h\xe9ngt', u'h\xe4ngt'), (u'H\xe9r', u'H\xf6r'), (u'h\xe9re', u'h\xf6re'), (u'h\xe9ren', u'h\xf6ren'), (u'H\xe9rgesch\xe9idigte', u'H\xf6rgesch\xe4digte'), (u'h\xe9rst', u'h\xf6rst'), (u'h\xe9rt', u'h\xf6rt'), (u'h\xe9rte', u'h\xf6rte'), (u'h\xe9rten', u'h\xf6rten'), (u'h\xe9rter', u'h\xe4rter'), (u'H\xe9rzu', u'H\xf6r zu'), (u'H\xe9schen', u'Haschen'), (u'h\xe9sslich', u'h\xe4sslich'), (u'h\xe9sslicher', u'h\xe4sslicher'), (u'h\xe9sslichl', u'h\xe4sslich'), (u'h\xe9sslichste', u'h\xe4sslichste'), (u'h\xe9tt', u'h\xe4tt'), (u'H\xe9tte', u'H\xe4tte'), (u'h\xe9tten', u'h\xe4tten'), (u"h\xe9tten's", u"h\xe4tten's"), (u'h\xe9ttest', u'h\xe4ttest'), (u'H\xe9ttet', u'H\xe4ttet'), (u'H\xe9ufi', u'H\xe4ufi'), (u'h\xe9ufig', u'h\xe4ufig'), (u'h\xe9ufiger', u'h\xe4ufiger'), (u'H\xe9ufigkeit', u'H\xe4ufigkeit'), (u'h\xe9ufigsten', u'h\xe4ufigsten'), (u'H\xe9user', u'H\xe4user'), (u'H\xe9usern', u'H\xe4usern'), (u'h\xe9ute', u'h\xe4ute'), (u'H\u20acY', u'Hey'), (u'H\ufb02geln', u'H\xfcgeln'), (u"i'\xa7ffne", u'\xd6ffne'), (u'I/egen', u'liegen'), (u'I5sst', u'l\xe4sst'), (u'I5stern', u'l\xe4stern'), (u'I6sen', u'l\xf6sen'), (u'Ia\xdf', u'lass'), (u'Ia\xdft', u'lasst'), (u'Icll', u'Ich'), (u'identifizieet', u'identifiziert'), (u'IDENTITAT', u'IDENTIT\xc4T'), (u'IE', u'I\xdf'), (u'Iebendigl', u'lebendig!'), (u'Iebenslinglich', u'lebensl\xe4glich'), (u'Iebtjetzt', u'lebt jetzt'), (u'Ieck', u'leck'), (u'Iehn', u'lehn'), (u'Ieid\u201a', u'leid\u201a'), (u'Ieinenlose', u'leinenlose'), (u'Ienistische', u'leninistische'), (u'Ietztendlich', u'letztendlich'), (u'Ifigt', u'l\xfcgt'), (u'Ihrdllirft', u'Ihr d\xfcrft'), (u'ihrja', u'ihr ja'), (u'ihrjemals', u'ihr jemals'), (u'ihrjetzt', u'ihr jetzt'), (u'ihrjeweiliges', u'ihr jeweiliges'), (u'ihrVater', u'ihr Vater'), (u'ihrvorstrafenregister', u'ihr Vorstrafenregister'), (u'ihrwahres', u'ihr wahres'), (u'Ihrwerdet', u'Ihr werdet'), (u'ihrzwei', u'ihr zwei'), (u'iibel', u'\xfcbel'), (u'iibemehmen', u'\xfcbernehmen'), (u'iiber', u'\xfcber'), (u'iiberall', u'\xfcberall'), (u'iiberallhin', u'\xfcberallhin'), (u'iiberdauern', u'\xfcberdauern'), (u'iiberdauerte', u'\xfcberdauerte'), (u'iibereinstimmte', u'\xfcbereinstimme'), (u'iiberfallen', u'\xfcberfallen'), (u'iiberfiel', u'\xfcberfiel'), (u'iibergeben', u'\xfcbergeben'), (u'iiberhaupt', u'\xfcberhaupt'), (u'iiberhiirt', u'\xfcberh\xf6rt'), (u'iiberholt', u'\xfcberholt'), (u'iiberholter', u'\xfcberholter'), (u'iiberkam', u'\xfcberkam'), (u'iiberlassen', u'\xfcberlassen'), (u'iiberleben', u'\xfcberleben'), (u'iiberlebt', u'\xfcberlebt'), (u'iiberlegen', u'\xfcberlegen'), (u'iiberlegten', u'\xfcberlegten'), (u'iibernahmen', u'\xfcbernahmen'), (u'iibernehme', u'\xfcbernehme'), (u'iibernehmen', u'\xfcbernehmen'), (u'iibernimmt', u'\xfcbernimmt'), (u'iibernommen', u'\xfcbernommen'), (u'iiberpriife', u'\xfcberpr\xfcfe'), (u'iiberpriifen', u'\xfcberpr\xfcfen'), (u'iiberpriift', u'\xfcberpr\xfcft'), (u'iiberpriiften', u'\xfcberpr\xfcften'), (u'iiberqueren', u'\xfcberqueren'), (u'iiberragen', u'\xfcberragen'), (u'iiberrascht', u'\xfcberrascht'), (u'iiberraschte', u'\xfcberraschte'), (u'iiberreden', u'\xfcberreden'), (u'iiberschritten', u'\xfcberschritten'), (u'iibersetzen', u'\xfcbersetzen'), (u'iibersetzt', u'\xfcbersetzt'), (u'iibersteigt', u'\xfcbersteigt'), (u'iibertragen', u'\xfcbertragen'), (u'iibertreffen', u'\xfcbertreffen'), (u'iibertreib', u'\xfcbertreib'), (u'iibertreiben', u'\xfcbertreiben'), (u'iibertrieben', u'\xfcbertrieben'), (u'iiberzeugen', u'\xfcberzeugen'), (u'iiberzeugt', u'\xfcberzeugt'), (u'iiblich', u'\xfcblich'), (u'iibliche', u'\xfcbliche'), (u'iibrig', u'\xfcbrig'), (u'IieB', u'lie\xdf'), (u'Iiebte', u'liebte'), (u"Iief's", u"lief's"), (u'Iiehe', u'liebe'), (u'Iie\ufb02est', u'lie\xdfest'), (u'iiffentlichen', u'\xf6ffentlichen'), (u'iiffentliches', u'\xf6ffentliches'), (u'iiffnest', u'\xf6ffnest'), (u'iifter', u'\xf6fter'), (u'iihnllchkelt', u'\xc4hnllchkelt'), (u'Iisst', u'l\xe4sst'), (u'ijbel', u'\xfcbel'), (u'ijben', u'\xfcben'), (u'ijberall', u'\xfcberall'), (u'ijberhaupt', u'\xfcberhaupt'), (u'ijberlegene', u'\xfcberlegene'), (u'ijbernehme', u'\xfcbernehme'), (u'ijbernimmst', u'\xfcbernimmst'), (u'ijberprijfen', u'\xfcberpr\xfcfen'), (u'ijberreden', u'\xfcberreden'), (u'ijbertrage', u'\xfcbertrage'), (u'ijberwunden', u'\xfcberwunden'), (u'ijberzeugen', u'\xfcberzeugen'), (u'ijberzogen', u'\xfcberzogen'), (u'Il6her', u'h\xf6her'), (u'IleiB', u'hei\xdf'), (u'Ill', u'III'), (u'Illfie', u'Wie'), (u'Ilrger', u'\xc4rger'), (u'Ilufierste', u'\xc4u\xdferste'), (u'immerja', u'immer ja'), (u'immerjung', u'immer jung'), (u'immerweinen', u'immer weinen'), (u'immerw\xe4hrende', u'immer w\xe4hrende'), (u'immerw\xe9hrende', u'immerw\xe4hrende'), (u'Improvisiation', u'Improvisation'), (u'Impulswellengeschutz', u'Impulswellengesch\xfctz'), (u'INBRUNSTIGE', u'INBR\xdcNSTIGE'), (u'instfindig', u'inst\xe4ndig'), (u'intramuskul\xe9r', u'intramuskul\xe4r'), (u'INVASIONSFLOTFE', u'INVASIONSFLOTTE'), (u'Iosgeliist', u'losgel\xf6st'), (u'Iosgel\xe9st', u'losgel\xf6st'), (u'Ioszuliisen', u'loszul\xf6sen'), (u'ip', u'in'), (u'irn', u'im'), (u'irrefuhren', u'irref\xfchren'), (u'irrefuhrende', u'irref\xfchrende'), (u'istja', u'ist ja'), (u'istjedoch', u'ist jedoch'), (u'istjemand', u'ist jemand'), (u'istjetzt', u'ist jetzt'), (u'istJohnny', u'ist Johnny'), (u'istjung', u'ist jung'), (u'istweg', u'ist weg'), (u'ITIUSSEFI', u'm\xfcssen'), (u'ITIUSSGI7', u'm\xfcssen'), (u'ITTITTRZ', u'Danke.'), (u'Ivl\xe9gliche', u'M\xf6gliche'), (u'I\xe9cheln', u'l\xe4cheln'), (u'I\xe9cherlich', u'l\xe4cherlich'), (u'I\xe9cherlichen', u'l\xe4cherlichen'), (u'I\xe9hmt', u'l\xe4hmt'), (u'I\xe9iuft', u'l\xe4uft'), (u'I\xe9nger', u'l\xe4nger'), (u'I\xe9sst', u'l\xe4sst'), (u'I\xe9sste', u'l\xe4sste'), (u'I\xe9uft', u'l\xe4uft'), (u'J0Shua', u'Joshua'), (u'Jackettkaufen', u'Jackett kaufen'), (u'jahr', u'Jahr'), (u'jahre', u'Jahre'), (u'jahren', u'Jahren'), (u'JAHRIGE', u'J\xc4HRIGE'), (u'jal', u'ja!'), (u'jemandenl', u'jemanden!'), (u'jetztl', u'jetzt!'), (u'jiidisch', u'j\xfcdisch'), (u'Jiingem', u'J\xfcngern'), (u'jiingerwar', u'j\xfcnger war'), (u'Jiingste', u'J\xfcngste'), (u'jilnger', u'j\xfcnger'), (u'Jlllngling', u'J\xfcngling'), (u'job', u'Job'), (u'Jogglng', u'Jogging'), (u'john', u'John'), (u'johnny', u'Johnny'), (u'journalisten', u'Journalisten'), (u'Jullo', u'Julie'), (u'JUNGFRAULICHE', u'JUNGFR\xc4ULICHE'), (u'jungfr\xe9uliche', u'jungfr\xe4uliche'), (u'jungfr\xe9ulichen', u'jungfr\xe4ulichen'), (u'jungfr\xe9ulicher', u'jungfr\xe4ulicher'), (u'Jungfr\xe9ulichkeit', u'Jungfr\xe4ulichkeit'), (u'Jungsl', u'Jungs!'), (u'Jungste', u'J\xfcngste'), (u'Jurlgs', u'Jungs'), (u'Justitzministeriums', u'Justizministeriums'), (u'J\xe9ger', u'J\xe4ger'), (u'J\xe9hrige', u'J\xe4hrige'), (u'j\xe9hrigen', u'j\xe4hrigen'), (u'j\xe9hriger', u'j\xe4hriger'), (u'j\xe9hrlich', u'j\xe4hrlich'), (u'J\xe9iger', u'J\xe4ger'), (u'j\xe9ihrigen', u'j\xe4hrigen'), (u'j\xe9mmerlich', u'j\xe4mmerlich'), (u"k'a'mpfen", u'k\xe4mpfen'), (u'K/no', u'Kino'), (u'K/Varte', u'Warte'), (u'K/Velle', u'Welle'), (u'K5NIGIN', u'K\xd6NIGIN'), (u'K6der', u'K\xf6der'), (u'K6ln', u'K\xf6ln'), (u'K6nig', u'K\xf6nig'), (u'K6nige', u'K\xf6nige'), (u'K6nigin', u'K\xf6nigin'), (u'k6nnen', u'k\xf6nnen'), (u"k6nnen's", u"k\xf6nnen's"), (u'k6nnest', u'k\xf6nntest'), (u'k6nnt', u'k\xf6nnt'), (u'K6nnte', u'K\xf6nnte'), (u"k6nnte's", u"k\xf6nnte's"), (u'k6nnten', u'k\xf6nnten'), (u'k6nntest', u'k\xf6nntest'), (u'K6pfe', u'K\xf6pfe'), (u'K6rper', u'K\xf6rper'), (u'K6rpers', u'K\xf6rpers'), (u'K6stlich', u'K\xf6stlich'), (u'Kabelm\xe9nner', u'Kabelm\xe4nner'), (u'kalf', u'kalt'), (u'kaltblijtig', u'kaltbl\xfctig'), (u'kampfen', u'k\xe4mpfen'), (u'Kampfj\xe9ger', u'Kampfj\xe4ger'), (u'Kanarienviigeln', u'Kanarienv\xf6geln'), (u"kann'sja", u"kann's ja"), (u'kannstja', u'kannst ja'), (u'Kan\xe9len', u'Kan\xe4len'), (u'Kapitan', u'Kapit\xe4n'), (u'Kapitln', u'Kapit\xe4n'), (u'Kapitlnen', u'Kapit\xe4nen'), (u'Kapitlns', u'Kapit\xe4ns'), (u'Kapit\xe9in', u'Kapit\xe4n'), (u'Kapit\xe9inleutnant', u'Kapit\xe4nleutnant'), (u'Kapit\xe9ins', u'Kapit\xe4ns'), (u'Kapit\xe9n', u'Kapit\xe4n'), (u'Kapit\xe9nleutnant', u'Kapit\xe4nleutnant'), (u'Kapit\xe9ns', u'Kapit\xe4ns'), (u"Kapt'n", u"K\xe4pt'n"), (u'kaputthaust', u'kaputt haust'), (u'Kartoffelsch\xe9len', u'Kartoffelsch\xe4len'), (u'Kassettenger\xe9it', u'Kassettenger\xe4t'), (u'kbnnen', u'k\xf6nnen'), (u'kbnnten', u'k\xf6nnten'), (u'kdnnen', u'k\xf6nnen'), (u'kdnnfe', u'k\xf6nnte'), (u'kdnnte', u'k\xf6nnte'), (u'ke/ne', u'keine'), (u'Kefn', u'Kein'), (u'Keh/1', u'Kehrt'), (u'Keithl', u'Keith!'), (u'keln', u'kein'), (u'kelne', u'keine'), (u'Keri', u'Kerl'), (u'kfime', u'k\xe4me'), (u'Kfimmer', u'K\xfcmmer'), (u'kfimmere', u'k\xfcmmere'), (u'kfimmern', u'k\xfcmmern'), (u'kfimmert', u'k\xfcmmert'), (u'kfimpft', u'k\xe4mpft'), (u'kfimpften', u'k\xe4mpften'), (u'Kfinig', u'K\xf6nig'), (u'Kfinnen', u'K\xf6nnen'), (u'kfinnte', u'k\xf6nnte'), (u'Kfinnten', u'K\xf6nnten'), (u'Kfinntest', u'K\xf6nntest'), (u'Kfiss', u'K\xfcss'), (u'Kfisschen', u'K\xfcsschen'), (u'Kfissen', u'K\xfcssen'), (u'Kfjnnte', u'K\xf6nnte'), (u'Khnlichkeit', u'\xc4hnlichkeit'), (u'KIar', u'Klar'), (u'Kifig', u'K\xe4fig'), (u'Kiiche', u'K\xfcche'), (u'Kiichenhelfer', u'K\xfcchenhelfer'), (u'Kiichln', u'K\xf6chin'), (u'Kiihe', u'K\xfche'), (u'Kiihlbox', u'K\xfchlbox'), (u'kiihler', u'k\xfchler'), (u'Kiihlschrank', u'K\xfchlschrank'), (u'kiimmem', u'k\xfcmmern'), (u'kiimmer', u'k\xfcmmer'), (u'kiimmere', u'k\xfcmmere'), (u'Kiimmern', u'K\xfcmmern'), (u'kiindigen', u'k\xfcndigen'), (u'Kiinig', u'K\xf6nig'), (u'Kiinige', u'K\xf6nige'), (u'Kiinigen', u'K\xf6nigen'), (u'Kiinigin', u'K\xf6nigin'), (u'Kiiniginnen', u'K\xf6niginnen'), (u'kiinigliche', u'k\xf6nigliche'), (u'kiiniglichen', u'k\xf6niglichen'), (u'kiiniglicher', u'k\xf6niglicher'), (u'Kiinigreichs', u'K\xf6nigreichs'), (u'Kiinigs', u'K\xf6nigs'), (u'Kiinigtum', u'K\xf6nigtum'), (u'kiinne', u'k\xf6nne'), (u'kiinnen', u'k\xf6nnen'), (u'kiinnt', u'k\xf6nnt'), (u'Kiinnte', u'K\xf6nnte'), (u'kiinnten', u'k\xf6nnten'), (u'kiinntest', u'k\xf6nntest'), (u'kiinntet', u'k\xf6nntet'), (u'Kiinstler', u'K\xfcnstler'), (u'kiinstlerischen', u'k\xfcnstlerischen'), (u'kiipfen', u'k\xf6pfen'), (u'Kiirper', u'K\xf6rper'), (u'Kiirperfunktionen', u'K\xf6rperfunktionen'), (u'Kiirperhaltung', u'K\xf6rperhaltung'), (u'kiirperliche', u'k\xf6rperliche'), (u'Kiirperliches', u'K\xf6rperliches'), (u'Kiirpersprache', u'K\xf6rpersprache'), (u'Kiirperverletzung', u'K\xf6rperverletzung'), (u'kiirzen', u'k\xfcrzen'), (u'kiirzerzutreten', u'k\xfcrzerzutreten'), (u'kiirzeste', u'k\xfcrzeste'), (u'Kiisschen', u'K\xfcsschen'), (u'Kiissen', u'K\xfcssen'), (u'Kiisst', u'K\xfcsst'), (u'Kiiste', u'K\xfcste'), (u'kiistlich', u'k\xf6stlich'), (u'Kijche', u'K\xfcche'), (u'Kijhlschrank', u'K\xfchlschrank'), (u'Kijmmere', u'K\xfcmmere'), (u'kijmmern', u'k\xfcmmern'), (u'kijmmernl', u'k\xfcmmern!'), (u'kijmmerst', u'k\xfcmmerst'), (u'kijmmerten', u'k\xfcmmerten'), (u'kijndigt', u'k\xfcndigt'), (u'kijnnen', u'k\xf6nnen'), (u'kijnnt', u'k\xf6nnt'), (u'kijnnte', u'k\xf6nnte'), (u'kijnnten', u'k\xf6nnten'), (u'Kijnstler', u'K\xfcnstler'), (u'Kijrbis', u'K\xfcrbis'), (u'kijrzlich', u'k\xfcrzlich'), (u'kijrzliche', u'k\xfcrzliche'), (u'Kijrzungen', u'K\xfcrzungen'), (u'kijsst', u'k\xfcsst'), (u'Kijste', u'K\xfcste'), (u'Kilche', u'K\xfcche'), (u'Kilchlein', u'K\xfcchlein'), (u'kilhlen', u'k\xfchlen'), (u'kilhler', u'k\xfchler'), (u'Kilhlkreislauf', u'K\xfchlkreislauf'), (u'Kilhlschrank', u'K\xfchlschrank'), (u'Kilmmern', u'K\xfcmmern'), (u'Kilmmert', u'K\xfcmmert'), (u'kilndigen', u'k\xfcndigen'), (u'kilnstliche', u'k\xfcnstliche'), (u'kilss', u'k\xfcss'), (u'kilsse', u'k\xfcsse'), (u'kilssen', u'k\xfcssen'), (u'Kinderm\xe9dchen', u'Kinderm\xe4dchen'), (u'Kinderspiell', u'Kinderspiel!'), (u'Kindsk\xe9pfe', u'Kindsk\xf6pfe'), (u'kiokflip', u'kickflip'), (u'KIotz', u'Klotz'), (u"KL'lr", u'K\xfcr'), (u"KL'lste", u'K\xfcste'), (u'Klapsmiihle', u'Klapsm\xfchle'), (u'Klassem\xe9dchen', u'Klassem\xe4dchen'), (u'kle/ne', u'kleine'), (u'Kleidergr6Be', u'Kleidergr\xf6\xdfe'), (u'Kleidergrfilie', u'Kleidergr\xf6\xdfe'), (u'Kleinerl', u'Kleiner!'), (u'kleinwiichsige', u'kleinw\xfcchsige'), (u'kleinwilchsiges', u'kleinw\xfcchsiges'), (u'klijger', u'kl\xfcger'), (u'klijgsten', u'kl\xfcgsten'), (u'klilger', u'kl\xfcger'), (u"kLinft'gen", u"k\xfcnft'gen"), (u'klirst', u'kl\xe4rst'), (u'kljmmere', u'k\xfcmmere'), (u'Kllirze', u'K\xfcrze'), (u'kllissen', u'k\xfcssen'), (u'Klliste', u'K\xfcste'), (u'Klllche', u'K\xfcche'), (u'klllhnsten', u'k\xfchnsten'), (u'kllllger', u'kl\xfcger'), (u'Klobtlrsten', u'Klob\xfcrsten'), (u'klop\ufb02l', u'klopft!'), (u"Klpt'n", u"K\xe4pt'n"), (u"Klpt'nl", u"K\xe4pt'n!"), (u"Klpt'ns", u"K\xe4pt'ns"), (u'Klse', u'K\xe4se'), (u'Klseschnuffelei', u'K\xe4seschn\xfcffelei'), (u'Kltigste', u'Kl\xfcgste'), (u'Klugschei\ufb02er', u'Klugschei\xdfer'), (u'kl\xe9ffen', u'kl\xe4ffen'), (u'Kl\xe9iren', u'Kl\xe4ren'), (u'Kl\xe9ranlage', u'Kl\xe4ranlage'), (u'Kl\xe9re', u'Kl\xe4re'), (u'kl\xe9ren', u'kl\xe4ren'), (u'Kn6pf', u'Kn\xf6pf'), (u'Knallttite', u'Knallt\xfcte'), (u'Knastwill', u'Knast will'), (u'Knderung', u'\xc4nderung'), (u'Knochengrfinde', u'Knochengr\xfcnde'), (u'Knofen', u'Knoten'), (u'Knuller', u'Kn\xfcller'), (u'Knupf', u'Kn\xfcpf'), (u'Knupfe', u'Kn\xfcpfe'), (u'knupfen', u'kn\xfcpfen'), (u'knzjipfe', u'kn\xfcpfe'), (u'Kn\xe9dell', u'Kn\xf6del!'), (u'kn\xe9pf', u'kn\xf6pf'), (u'Kn\xe9pfe', u'Kn\xf6pfe'), (u'Kn\xe9sten', u'Kn\xe4sten'), (u'Kofferraumschliissel', u'Kofferraumschl\xfcssel'), (u'Kohlens\xe9ure', u'Kohlens\xe4ure'), (u'Komaf\xe9lle', u'Komaf\xe4lle'), (u'Komaf\xe9llen', u'Komaf\xe4llen'), (u'Kombiise', u'Komb\xfcse'), (u'Kombuse', u'Komb\xfcse'), (u'Komiidie', u'Kom\xf6die'), (u'kommerz/ellen', u'kommerziellen'), (u'kommjetzt', u'komm jetzt'), (u'Kompatibilitfits', u'Kompatibilit\xe4ts'), (u'Kompatibilit\xe9its', u'Kompatibilit\xe4ts'), (u'Kompatiblit5ts', u'Kompatiblit\xe4ts'), (u'Kom\xe9die', u'Kom\xf6die'), (u'KONIGIN', u'K\xd6NIGIN'), (u'konne', u'k\xf6nne'), (u'konnen', u'k\xf6nnen'), (u'konnt', u'k\xf6nnt'), (u'konsen/ativ', u'konservativ'), (u'Kopfabreifimann', u'Kopfabrei\xdfmann'), (u'Kopfgeldj\xe9ger', u'Kopfgeldj\xe4ger'), (u'Kopfgeldj\xe9gern', u'Kopfgeldj\xe4gern'), (u'Kopfm\xe9fiig', u'Kopfm\xe4\xdfig'), (u'Kopfnijsse', u'Kopfn\xfcsse'), (u'kostengtlnstige', u'kosteng\xfcnstige'), (u'Kostiim', u'Kost\xfcm'), (u'Kostiimdesigner', u'Kost\xfcmdesigner'), (u'Kostiimdesignerin', u'Kost\xfcmdesignerin'), (u'Kostiimdrama', u'Kost\xfcmdrama'), (u'Kostiime', u'Kost\xfcme'), (u'Kostiims', u'Kost\xfcms'), (u'Kostume', u'Kost\xfcme'), (u'Kost\ufb02m', u'Kost\xfcm'), (u'kr/egen', u'kriegen'), (u'kr6ne', u'kr\xf6ne'), (u'kr6nen', u'kr\xf6nen'), (u'Kr6ten', u'Kr\xf6ten'), (u'Krafte', u'Kr\xe4fte'), (u'Kraftwfirfel', u'Kraftw\xfcrfel'), (u'Kranf\ufb02hrer', u'Kranf\xfchrer'), (u'Kreativit\xe9t', u'Kreativit\xe4t'), (u'Kreuzverhor', u'Kreuzverh\xf6r'), (u'krfiftiger', u'kr\xe4ftiger'), (u'Krfiutertee', u'Kr\xe4utertee'), (u'Kriegserkl\xe9rungen', u'Kriegserkl\xe4rungen'), (u'Kriegsfuhrung', u'Kriegsf\xfchrung'), (u'Kriegsschauplatze', u'Kriegsschaupl\xe4tze'), (u'Kriifte', u'Kr\xe4fte'), (u'Kriinung', u'Kr\xf6nung'), (u'Kriinungsfeier', u'Kr\xf6nungsfeier'), (u'Krijppel', u'Kr\xfcppel'), (u'Krijte', u'Kr\xf6te'), (u'Kronjuwell', u'Kronjuwel!'), (u'KROTE', u'KR\xd6TE'), (u'Krsche', u'\xc4rsche'), (u'Kr\xe9fte', u'Kr\xe4fte'), (u'Kr\xe9ften', u'Kr\xe4ften'), (u'Kr\xe9ftigsten', u'Kr\xe4ftigsten'), (u'Kr\xe9he', u'Kr\xe4he'), (u'kr\xe9ht', u'kr\xe4ht'), (u'kr\xe9ichzt', u'kr\xe4chzt'), (u'Kr\xe9ifte', u'Kr\xe4fte'), (u'Kr\xe9iutertee', u'Kr\xe4utertee'), (u'Kr\xe9mpfe', u'Kr\xe4mpfe'), (u'kr\xe9nte', u'kr\xf6nte'), (u'Kr\xe9te', u'Kr\xf6te'), (u'Kr\xe9tes', u'Kr\xf6tes'), (u'Kr\xe9utern', u'Kr\xe4utern'), (u'Kr\xe9utersenf', u'Kr\xe4utersenf'), (u'Ktiche', u'K\xfcche'), (u'Ktinige', u'K\xf6nige'), (u'ktinntest', u'k\xf6nntest'), (u'Ktisschen', u'K\xfcsschen'), (u'ktlmmere', u'k\xfcmmere'), (u'ktznnen', u'k\xf6nnen'), (u'Kuche', u'K\xfcche'), (u'KUCHE', u'K\xdcCHE'), (u'Kuckucksger\xe9usch', u'Kuckucksger\xe4usch'), (u"KUl'ZSCl'1lUSS9", u'K\xfcrzschl\xfcsse'), (u'kulz', u'kurz'), (u'kummer', u'k\xfcmmer'), (u'Kummere', u'K\xfcmmere'), (u'kummern', u'k\xfcmmern'), (u'kummert', u'k\xfcmmert'), (u'Kumpell', u'Kumpel!'), (u'Kunststficke', u'Kunstst\xfccke'), (u'Kunststticke', u'Kunstst\xfccke'), (u'Kuriosit\xe9ten', u'Kuriosit\xe4ten'), (u'kurzeste', u'k\xfcrzeste'), (u'kurzte', u'k\xfcrzte'), (u'Kurzwellenfunkger\xe9te', u'Kurzwellenfunkger\xe4te'), (u'Kurzzeitgediichtnis', u'Kurzzeitged\xe4chtnis'), (u'Kurzzeitged\xe9chtnis', u'Kurzzeitged\xe4chtnis'), (u'KUS1I\u20ac', u'K\xfcste'), (u'Kuschelhengstl', u'Kuschelhengst!'), (u'KUSSE', u'K\xdcSSE'), (u'KUSSGH', u'k\xfcssen'), (u'kusste', u'k\xfcsste'), (u'KUSTE', u'K\xdcSTE'), (u'Kuste', u'K\xfcste'), (u'K\xe9fer', u'K\xe4fer'), (u'K\xe9fig', u'K\xe4fig'), (u'k\xe9ime', u'k\xe4me'), (u'k\xe9impfen', u'k\xe4mpfen'), (u'k\xe9impfend', u'k\xe4mpfend'), (u'k\xe9impft', u'k\xe4mpft'), (u'k\xe9impfte', u'k\xe4mpfte'), (u'k\xe9impften', u'k\xe4mpften'), (u'k\xe9impftest', u'k\xe4mpftest'), (u'k\xe9impfwie', u'k\xe4mpf wie'), (u'K\xe9inguru', u'K\xe4nguru'), (u'k\xe9innen', u'k\xf6nnen'), (u'k\xe9innte', u'k\xf6nnte'), (u'K\xe9irper', u'K\xf6rper'), (u'K\xe9ise', u'K\xe4se'), (u'K\xe9isebrunnen', u'K\xe4sebrunnen'), (u'K\xe9lte', u'K\xe4lte'), (u'k\xe9lter', u'k\xe4lter'), (u'k\xe9lteste', u'k\xe4lteste'), (u'k\xe9me', u'k\xe4me'), (u'k\xe9men', u'k\xe4men'), (u'k\xe9mpfe', u'k\xe4mpfe'), (u'K\xe9mpfen', u'K\xe4mpfen'), (u'K\xe9mpfer', u'K\xe4mpfer'), (u'k\xe9mpferische', u'k\xe4mpferische'), (u'k\xe9mpfst', u'k\xe4mpfst'), (u'k\xe9mpft', u'k\xe4mpft'), (u'k\xe9mpfte', u'k\xe4mpfte'), (u'k\xe9mpften', u'k\xe4mpften'), (u'k\xe9mt', u'k\xe4mt'), (u'K\xe9nig', u'K\xf6nig'), (u'K\xe9nige', u'K\xf6nige'), (u'K\xe9nigin', u'K\xf6nigin'), (u'K\xe9niginl', u'K\xf6nigin!'), (u'K\xe9niginnen', u'K\xf6niginnen'), (u'k\xe9niglich', u'k\xf6niglich'), (u'k\xe9nigliche', u'k\xf6nigliche'), (u'k\xe9niglichen', u'k\xf6niglichen'), (u'k\xe9nigliches', u'k\xf6nigliches'), (u'K\xe9nigreich', u'K\xf6nigreich'), (u'K\xe9nigreichs', u'K\xf6nigreichs'), (u'K\xe9nigs', u'K\xf6nigs'), (u'K\xe9nigsfamilie', u'K\xf6nigsfamilie'), (u'k\xe9nne', u'k\xf6nne'), (u'k\xe9nnen', u'k\xf6nnen'), (u'k\xe9nnt', u'k\xf6nnt'), (u'k\xe9nnte', u'k\xf6nnte'), (u'K\xe9nnten', u'K\xf6nnten'), (u'K\xe9nntest', u'K\xf6nntest'), (u'K\xe9nntet', u'K\xf6nntet'), (u'K\xe9pfchen', u'K\xf6pfchen'), (u'K\xe9pfe', u'K\xf6pfe'), (u'K\xe9pfen', u'K\xf6pfen'), (u'k\xe9pft', u'k\xf6pft'), (u"K\xe9pt'n", u"K\xe4pt'n"), (u'K\xe9rbchen', u'K\xf6rbchen'), (u'K\xe9rbchengr\xe9fie', u'K\xf6rbchengr\xf6\xdfe'), (u'K\xe9rben', u'K\xf6rben'), (u'K\xe9rper', u'K\xf6rper'), (u'K\xe9rperfunktionen', u'K\xf6rperfunktionen'), (u'k\xe9rperlich', u'k\xf6rperlich'), (u'k\xe9rperliche', u'k\xf6rperliche'), (u'K\xe9rperproportionen', u'K\xf6rperproportionen'), (u'K\xe9rpersprache', u'K\xf6rpersprache'), (u'K\xe9rpertyp', u'K\xf6rpertyp'), (u'K\xe9rperverletzung', u'K\xf6rperverletzung'), (u'K\xe9rper\xe9ffnungen', u'K\xf6rper\xf6ffnungen'), (u'K\xe9se', u'K\xe4se'), (u'K\xe9sebrett', u'K\xe4sebrett'), (u'K\xe9secracker', u'K\xe4secracker'), (u'k\xe9stlich', u'k\xf6stlich'), (u'K\xe9ter', u'K\xf6ter'), (u'K\xe9tern', u'K\xf6tern'), (u'K\ufb02mmere', u'K\xfcmmere'), (u'k\ufb02mmern', u'k\xfcmmern'), (u"L'a'cherlich", u'L\xe4cherlich'), (u"L'a'ndern", u'L\xe4ndern'), (u"l'a'sst", u'l\xe4sst'), (u"l'a'uft", u'l\xe4uft'), (u'l/chtes', u'lichtes'), (u'l/Vings', u'Wings'), (u'L5cheln', u'L\xe4cheln'), (u'L6ffel', u'L\xf6ffel'), (u'L6schen', u'L\xf6schen'), (u'L6se', u'L\xf6se'), (u'l6sen', u'l\xf6sen'), (u'L6wen', u'L\xf6wen'), (u'L6win', u'L\xf6win'), (u'LADIESMANZ17', u'LADIESMAN217'), (u'Landh\xe9user', u'Landh\xe4user'), (u'Landstra\ufb02e', u'Landstra\xdfe'), (u'Lands\xe9iugetier', u'Lands\xe4ugetier'), (u'langl', u'lang!'), (u'langweiligl', u'langweilig!'), (u'Lasergestutzte', u'Lasergest\xfctzte'), (u'Laserzielger\xe9t', u'Laserzielger\xe4t'), (u'Lattenzaunwei\ufb02', u'Lattenzaunwei\xdf'), (u'Laudal', u'Lauda!'), (u'laufl', u'lauf!'), (u'Lau\ufb02', u'Lauf!'), (u'La\xdf', u'Lass'), (u'lch', u'Ich'), (u'ldee', u'Idee'), (u'ldeen', u'Ideen'), (u'ldelia', u'Idelia'), (u'ldentifikation', u'Identifikation'), (u'ldentifikationsnummer', u'Identifikationsnummer'), (u'ldentifikationssignal', u'Identifikationssignal'), (u'ldentifizierung', u'Identifizierung'), (u"ldentit'a'tsscheibe", u'ldentit\xe4tsscheibe'), (u'ldioten', u'Idioten'), (u'ldloten', u'Idioten'), (u'Le/d', u'Leid'), (u'Lebenl', u'Leben!'), (u'lebensf\xe9hig', u'lebensf\xe4hig'), (u'lebensl\xe9nglich', u'lebensl\xe4nglich'), (u'lebensmijlde', u'lebensm\xfcde'), (u'Lebersch\xe9den', u'Lebersch\xe4den'), (u'leergegessen', u'leer gegessen'), (u'legend\xe9re', u'legend\xe4re'), (u'legend\xe9ren', u'legend\xe4ren'), (u'Legion\xe9r', u'Legion\xe4r'), (u'Legion\xe9re', u'Legion\xe4re'), (u'Lehe', u'Lebe'), (u'Leichensch\xe9ndung', u'Leichensch\xe4ndung'), (u'leichtjemanden', u'leicht jemanden'), (u'leidl', u'leid!'), (u'Leistuljg', u'Leistung'), (u'Lelbwfichter', u'Leibw\xe4chter'), (u'Leld', u'Leid'), (u'lemen', u'lernen'), (u'Lenks\xe9ule', u'Lenks\xe4ule'), (u'lfidt', u'l\xe4dt'), (u'lfigt', u'l\xfcgt'), (u'lfinger', u'l\xe4nger'), (u'lfiuft', u'l\xe4uft'), (u'Lfiuterung', u'L\xe4uterung'), (u'lgitt', u'Igitt'), (u'lgnorier', u'Ignorier'), (u'lhm', u'Ihm'), (u'lhn', u'Ihn'), (u'lhnen', u'Ihnen'), (u'lhnenl', u'Ihnen!'), (u'lhr', u'Ihr'), (u'lhre', u'Ihre'), (u'lhrem', u'Ihrem'), (u'lhren', u'Ihren'), (u'lhrer', u'Ihrer'), (u'lhrerverffigung', u'Ihrer Verf\xfcgung'), (u'lhres', u'Ihres'), (u'lhrfehlt', u'Ihr fehlt'), (u'lhrjemalsjemanden', u'lhr jemals jemanden'), (u'lhrVerteidiger', u'lhr Verteidiger'), (u'Libel', u'\xfcbel'), (u'Libelwollen', u'\xfcbelwollen'), (u'Liben', u'\xfcben'), (u'Liber', u'\xfcber'), (u'Liberall', u'\xfcberall'), (u'Liberdenken', u'\xfcberdenken'), (u'Liberdrllissig', u'\xfcberdr\xfcssig'), (u'Liberfallen', u'\xfcberfallen'), (u'Libergebrannt', u'\xfcbergebrannt'), (u'Liberhaupt', u'\xfcberhaupt'), (u'Liberlasst', u'\xfcberlasst'), (u'Liberleben', u'\xdcberleben'), (u'Liberlegen', u'\xfcberlegen'), (u'Liberlegt', u'\xfcberlegt'), (u'Libernimmt', u'\xfcbernimmt'), (u'Liberpriift', u'\xfcberpr\xfcft'), (u'Liberreden', u'\xfcberreden'), (u'Libersteht', u'\xfcbersteht'), (u'Liberstllirzen', u'\xfcberst\xfcrzen'), (u'Liberwachen', u'\xfcberwachen'), (u'Liberwacht', u'\xfcberwacht'), (u'Liberwinden', u'\xfcberwinden'), (u'Liberw\xe9ltigen', u'\xfcberw\xe4ltigen'), (u'Liberw\xe9ltigt', u'\xfcberw\xe4ltigt'), (u'Liberzeugt', u'\xfcberzeugt'), (u'Lible', u'\xfcble'), (u'Liblich', u'\xfcblich'), (u'Libliche', u'\xdcbliche'), (u'Librig', u'\xfcbrig'), (u'lie/3', u'lie\xdf'), (u'lie/Se', u'lie\xdfe'), (u'lieB', u'lie\xdf'), (u'lieBe', u'lie\xdfe'), (u'liebenswilrdig', u'liebensw\xfcrdig'), (u'liebenswurdiger', u'liebensw\xfcrdiger'), (u'Liebesgestiindnis', u'Liebesgest\xe4ndnis'), (u'Lieblingsbesch\xe9ftigung', u'Lieblingsbesch\xe4ftigung'), (u'Lieblingsrockerl', u'Lieblingsrocker!'), (u'Lieblingss\xe9tze', u'Lieblingss\xe4tze'), (u'lief2>en', u'lie\xdfen'), (u'Liefergebiihren', u'Liefergeb\xfchren'), (u'lieflsen', u'lie\xdfen'), (u'liegenlassen', u'liegen lassen'), (u'Liehe', u'Liebe'), (u'lieli', u'lie\xdf'), (u'lielien', u'lie\xdfen'), (u'Liellen', u'Lie\xdfen'), (u'liells', u'lie\xdf'), (u'lien', u'lie\xdf'), (u'Liicher', u'L\xf6cher'), (u'Liige', u'L\xfcge'), (u'Liigner', u'L\xfcgner'), (u'liinger', u'l\xe4nger'), (u'liischen', u'l\xf6schen'), (u'liischt', u'l\xf6scht'), (u'Liisst', u'L\xe4sst'), (u'liist', u'l\xf6st'), (u'Liisung', u'L\xf6sung'), (u'Liisungen', u'L\xf6sungen'), (u'Liiwen', u'L\xf6wen'), (u'Lii\ufb02ung', u'L\xfcftung'), (u'lijgen', u'l\xfcgen'), (u'Lijgner', u'L\xfcgner'), (u'Lilgner', u'L\xfcgner'), (u'lilgst', u'l\xfcgst'), (u'lilgt', u'l\xfcgt'), (u'Lilterer', u'\xc4lterer'), (u'LIMOUSINENSERVICE10I06', u'LIMOUSINENSERVICE 10:06'), (u'linger', u'l\xe4nger'), (u"lke's", u"Ike's"), (u'lkone', u'Ikone'), (u"lL'lgt", u'l\xfcgt'), (u'Llberstehen', u'\xfcberstehen'), (u'Llebe', u'Liebe'), (u'llebt', u'liebt'), (u'lllfie', u'Wie'), (u'lllfillensstark', u'Willensstark'), (u"lllfillie's", u"Willie's"), (u'lllfir', u'Wir'), (u'Lllignerl', u'L\xfcgner!'), (u'llligtl', u'l\xfcgt!'), (u'lllusionen', u'Illusionen'), (u'llngst', u'l\xe4ngst'), (u'llztlicher', u'\xe4rztlicher'), (u'lm', u'Im'), (u'lmbiss', u'Imbiss'), (u'lmmer', u'Immer'), (u'lmmigranten', u'Immigranten'), (u'lmpuls', u'Impuls'), (u'lmpulsantrieb', u'Impulsantrieb'), (u'lndianer', u'Indianer'), (u'lndianerin', u'Indianerin'), (u'lndianerm\xe9dchen', u'Indianerm\xe4dchen'), (u'lndianertanz', u'Indianertanz'), (u'lndikation', u'Indikation'), (u'lndividualit\xe9t', u'Individualit\xe4t'), (u'lndividuen', u'Individuen'), (u'lndividuum', u'Individuum'), (u'lnduktion', u'Induktion'), (u'lneffizienz', u'Ineffizienz'), (u'lnformationen', u'Informationen'), (u'lnfos', u'Infos'), (u'lngenieur', u'Ingenieur'), (u'lngenieure', u'Ingenieure'), (u'lnhalt', u'Inhalt'), (u'lnhalte', u'Inhalte'), (u'lnnenraum', u'Innenraum'), (u'lnnenr\xe9ume', u'Innenr\xe4ume'), (u'lnsekt', u'Insekt'), (u'lnsekten', u'Insekten'), (u'lnsel', u'Insel'), (u'lnserat', u'Inserat'), (u'lnspektion', u'Inspektion'), (u'lnstinkt', u'Instinkt'), (u'lnstinkte', u'Instinkte'), (u'lnstitut', u'Institut'), (u'lnstrumente', u'Instrumente'), (u'lnstrumentenwagen', u'Instrumentenwagen'), (u'lnsubordination', u'Insubordination'), (u'lntellektuellste', u'Intellektuellste'), (u'lntelligenz', u'Intelligenz'), (u'lntensivstation', u'Intensivstation'), (u'lnteraktion', u'Interaktion'), (u'lnteresse', u'Interesse'), (u'lnteressen', u'Interessen'), (u'lnternat', u'Internat'), (u'lntrigantin', u'Intrigantin'), (u'lntrigantl', u'Intrigant!'), (u'lntrigen', u'Intrigen'), (u'lnverness', u'Inverness'), (u'lnvestition', u'Investition'), (u'lnvestoren', u'Investoren'), (u'lnzucht', u'Inzucht'), (u'lo', u'Io'), (u'Lordk\xe9mmerer', u'Lordk\xe4mmerer'), (u'losf', u'los!'), (u'losl', u'los!'), (u'losw\ufb02rde', u'losw\xfcrde'), (u'Lou/e', u'Louie'), (u'Loyalit\xe9t', u'Loyalit\xe4t'), (u'lrak', u'Irak'), (u'lraner', u'Iraner'), (u'lren', u'Iren'), (u'Lrgendetvvas', u'Irgendetwas'), (u'lrland', u'Irland'), (u'lronhide', u'Ironhide'), (u'lronie', u'Ironie'), (u'lrre', u'Irre'), (u'lrren', u'Irren'), (u'lrrenanstalt', u'Irrenanstalt'), (u'lrrenhaus', u'Irrenhaus'), (u'lrrer', u'Irrer'), (u'lrrgarten', u'Irrgarten'), (u'lrrlicht', u'Irrlicht'), (u'lrrlichter', u'Irrlichter'), (u'lrrsinn', u'Irrsinn'), (u'lrrsinns', u'Irrsinns'), (u'lrrtum', u'Irrtum'), (u'lscandar', u'Iscandar'), (u'lscandars', u'Iscandars'), (u'lsolierband', u'Isolierband'), (u'lss', u'Iss'), (u'lstja', u'Ist ja'), (u'ltaker', u'Itaker'), (u'ltakerflossen', u'Itakerflossen'), (u'ltalo', u'Italo'), (u'Ltiffel', u'L\xf6ffel'), (u'ltlgen', u'l\xfcgen'), (u'Lufijagen', u'Luft jagen'), (u'Luftballonsl', u'Luftballons!'), (u'Luftjagen', u'Luft jagen'), (u'Luftunterst\ufb02tzung', u'Luftunterst\xfctzung'), (u'LUgen', u'L\xfcgen'), (u'lvl\xe9idchen', u'M\xe4dchen'), (u'lwan', u'Iwan'), (u"l\xa7uft's", u"l\xe4uft's"), (u'L\xe9chelmfinderl', u'L\xe4chelm\xfcnder!'), (u'l\xe9cheln', u'l\xe4cheln'), (u'l\xe9chelt', u'l\xe4chelt'), (u'L\xe9cher', u'L\xf6cher'), (u'L\xe9cherlich', u'L\xe4cherlich'), (u'l\xe9cherliches', u'l\xe4cherliches'), (u'L\xe9chle', u'L\xe4chle'), (u'l\xe9dt', u'l\xe4dt'), (u'L\xe9ffel', u'L\xf6ffel'), (u'l\xe9ge', u'l\xe4ge'), (u'L\xe9icheln', u'L\xe4cheln'), (u'L\xe9icherlich', u'L\xe4cherlich'), (u'l\xe9ichle', u'l\xe4chle'), (u'L\xe9indchen', u'L\xe4ndchen'), (u'l\xe9ingst', u'l\xe4ngst'), (u'l\xe9isen', u'l\xf6sen'), (u'l\xe9issig', u'l\xe4ssig'), (u'l\xe9isst', u'l\xe4sst'), (u'L\xe9iuft', u'L\xe4uft'), (u'L\xe9jsung', u'L\xf6sung'), (u'L\xe9mmchen', u'L\xe4mmchen'), (u'L\xe9mmer', u'L\xe4mmer'), (u'L\xe9nder', u'L\xe4nder'), (u'L\xe9ndern', u'L\xe4ndern'), (u'L\xe9nge', u'L\xe4nge'), (u'L\xe9ngen', u'L\xe4ngen'), (u'l\xe9nger', u'l\xe4nger'), (u'l\xe9ngst', u'l\xe4ngst'), (u'l\xe9ngste', u'l\xe4ngste'), (u'L\xe9rm', u'L\xe4rm'), (u'L\xe9rmbeschwerden', u'L\xe4rmbeschwerden'), (u'l\xe9schen', u'l\xf6schen'), (u'L\xe9se', u'L\xf6se'), (u'L\xe9segeld', u'L\xf6segeld'), (u'l\xe9sst', u'l\xe4sst'), (u'l\xe9st', u'l\xf6st'), (u'l\xe9ste', u'l\xf6ste'), (u'l\xe9sten', u'l\xf6sten'), (u'l\xe9stig', u'listig'), (u'L\xe9sung', u'L\xf6sung'), (u'l\xe9ufig', u'l\xe4ufig'), (u'l\xe9ufst', u'l\xe4ufst'), (u'L\xe9uft', u'L\xe4uft'), (u'l\xe9uten', u'l\xe4uten'), (u'l\xe9utet', u'l\xe4utet'), (u'L\xe9we', u'L\xf6we'), (u'L\ufb02gner', u'L\xfcgner'), (u"M'a'dchen", u'M\xe4dchen'), (u'm/ese', u'miese'), (u'M/ffsommernachfsfraum', u'Mittsommernachtstraum'), (u'M/r', u'Mir'), (u'M0I8KUI', u'Molek\xfcl'), (u'm6belt', u'm\xf6belt'), (u'm6chte', u'm\xf6chte'), (u'm6chtest', u'm\xf6chtest'), (u'm6gen', u'm\xf6gen'), (u'm6glich', u'm\xf6glich'), (u'm6glichen', u'm\xf6glichen'), (u'm6glicher', u'm\xf6glicher'), (u'm6gt', u'm\xf6gt'), (u'M6rder', u'M\xf6rder'), (u'MaB', u'Ma\xdf'), (u'MaBgabe', u'Ma\xdfgabe'), (u'mac/1e', u'mache'), (u'mac/7', u'nach'), (u'machs', u"mach's"), (u'Machtiibernahme', u'Macht\xfcbernahme'), (u'madenschw\xe9inziger', u'madenschw\xe4nziger'), (u'Mafinahme', u'Ma\xdfnahme'), (u'Magengeschwiire', u'Magengeschw\xfcre'), (u'Magengeschwilr', u'Magengeschw\xfcr'), (u'Magengeschwtir', u'Magengeschw\xfcr'), (u'Magnolienbliiten', u'Magnolienbl\xfcten'), (u'Majesfait', u'Majest\xe4t'), (u'Majest\xe9it', u'Majest\xe4t'), (u'Majest\xe9t', u'Majest\xe4t'), (u'Majest\xe9ten', u'Majest\xe4ten'), (u'Mal2>en', u'Ma\xdfen'), (u'Mal3en', u'Ma\xdfen'), (u'malf', u'mal!'), (u'Malinahme', u'Ma\xdfnahme'), (u'mall', u'mal!'), (u'Mallregelten', u'Ma\xdfregelten'), (u'Mandverstation', u'Man\xf6verstation'), (u'Manfiver', u'Man\xf6ver'), (u'Maniiver', u'Man\xf6ver'), (u'Manikfire', u'Manik\xfcre'), (u'Mannscha\ufb02', u'Mannschaft'), (u"Mansclle\ufb02'enkm'5pfe", u'Manschettenkn\xf6pfe'), (u'Man\xe9iver', u'Man\xf6ver'), (u'Man\xe9ver', u'Man\xf6ver'), (u'man\xe9vrieren', u'man\xf6vrieren'), (u'man\xe9vrierf\xe9hig', u'man\xf6vrierf\xe4hig'), (u'Man\xe9vriermodus', u'Man\xf6vriermodus'), (u'Margoliserklfirung', u'Margoliserkl\xe4rung'), (u'Margoliserkl\xe9rung', u'Margoliserkl\xe4rung'), (u'marsch\xe9hnliche', u'marsch\xe4hnliche'), (u'Massagestllihlen', u'Massagest\xfchlen'), (u'Massenzerst\xe9rung', u'Massenzerst\xf6rung'), (u'Massenzerst\xe9rungswaffen', u'Massenzerst\xf6rungswaffen'), (u'Mater/al', u'Material'), (u'Maxiriicke', u'Maxir\xf6cke'), (u'Mayonaise', u'Mayonnaise'), (u'mbglichst', u'm\xf6glichst'), (u'Mdge', u'M\xf6ge'), (u'mdglichen/veise', u'm\xf6glicherweise'), (u'mdglicherweise', u'm\xf6glicherweise'), (u'Mdglichkeit', u'M\xf6glichkeit'), (u'me/n', u'mein'), (u'mehrZeit', u'mehr Zeit'), (u"mein'ja", u"mein' ja"), (u'meinerjetzigen', u'meiner jetzigen'), (u'Meinungs\xe9ufierung', u'Meinungs\xe4u\xdferung'), (u'Meisterbr\xe9u', u'Meisterbr\xe4u'), (u'Meisterstijck', u'Meisterst\xfcck'), (u'meistgehasste', u'meist gehasste'), (u'meln', u'mein'), (u'melne', u'meine'), (u'Mend', u'Mond'), (u'Menschenh\xe9indler', u'Menschenh\xe4ndler'), (u'Menstruationsst\xe9rungen', u'Menstruationsst\xf6rungen'), (u'Merkwiirdig', u'Merkw\xfcrdig'), (u'Merkwiirdige', u'Merkw\xfcrdige'), (u'merkwiirdiger', u'merkw\xfcrdiger'), (u'merkwilrdig', u'merkw\xfcrdig'), (u'merkwlllrdige', u'merkw\xfcrdige'), (u'merkwurdig', u'merkw\xfcrdig'), (u'merkwurolig', u'merkw\xfcrdig'), (u'merkw\ufb02rdig', u'merkw\xfcrdig'), (u'Messger\xe9t', u'Messger\xe4t'), (u'mfichte', u'm\xf6chte'), (u'Mfichten', u'M\xf6chten'), (u'Mfidchen', u'M\xe4dchen'), (u'Mfidchenl', u'M\xe4dchen!'), (u'Mfidels', u'M\xe4dels'), (u'mfigen', u'm\xf6gen'), (u'Mfigliche', u'M\xf6gliche'), (u'mfiglichen', u'm\xf6glichen'), (u'mfiglicherweise', u'm\xf6glicherweise'), (u'Mfill', u'M\xfcll'), (u'Mfillhalde', u'M\xfcllhalde'), (u'Mfinchen', u'M\xfcnchen'), (u'Mfinder', u'M\xfcnder'), (u'Mfinnern', u'M\xe4nnern'), (u'Mfissen', u'M\xfcssen'), (u'mfisst', u'm\xfcsst'), (u'mfisste', u'm\xfcsste'), (u'Mfjrder', u'M\xf6rder'), (u'Midchen', u'M\xe4dchen'), (u'Migrane', u'Migr\xe4ne'), (u'Migr\xe9ne', u'Migr\xe4ne'), (u'Migr\ufb02ne', u'Migr\xe4ne'), (u'miichte', u'm\xf6chte'), (u'Miichtegern', u'M\xf6chtegern'), (u'Miichten', u'M\xf6chten'), (u'miichtest', u'm\xf6chtest'), (u'miide', u'm\xfcde'), (u'Miidels', u'M\xe4dels'), (u'miides', u'm\xfcdes'), (u'miige', u'm\xf6ge'), (u'miigen', u'm\xf6gen'), (u'miiglich', u'm\xf6glich'), (u'miigliche', u'm\xf6gliche'), (u'miiglichen', u'm\xf6glichen'), (u'miigliches', u'm\xf6gliches'), (u'Miiglichkeit', u'M\xf6glichkeit'), (u'Miiglichkeiten', u'M\xf6glichkeiten'), (u'miigt', u'm\xf6gt'), (u'Miill', u'M\xfcll'), (u'Miillhalde', u'M\xfcllhalde'), (u'Miilltonnen', u'M\xfclltonnen'), (u'miilssen', u'm\xfcssen'), (u'miirderisch', u'm\xf6rderisch'), (u'miisse', u'm\xfcsse'), (u'Miissen', u'M\xfcssen'), (u'miisst', u'm\xfcsst'), (u'miisste', u'm\xfcsste'), (u'Miiuse', u'M\xe4use'), (u'mijchte', u'm\xf6chte'), (u'Mijcken', u'M\xfccken'), (u'Mijhe', u'M\xfche'), (u'Mijnzen', u'M\xfcnzen'), (u'mijssen', u'm\xfcssen'), (u'mijsst', u'm\xfcsst'), (u'mijsste', u'm\xfcsste'), (u'mijsstest', u'm\xfcsstest'), (u'Milchstrafie', u'Milchstra\xdfe'), (u'Milhe', u'M\xfche'), (u'Milhle', u'M\xfchle'), (u'MILITAR', u'MILIT\xc4R'), (u'Militiirprogramme', u'Milit\xe4rprogramme'), (u'Militir', u'Milit\xe4r'), (u'militlrische', u'milit\xe4rische'), (u'Milit\xe9irkodex', u'Milit\xe4rkodex'), (u'Milit\xe9r', u'Milit\xe4r'), (u'Milit\xe9rakademie', u'Milit\xe4rakademie'), (u'Milit\xe9rdienst', u'Milit\xe4rdienst'), (u'milit\xe9rischen', u'milit\xe4rischen'), (u'Milit\xe9rkodex', u'Milit\xe4rkodex'), (u'Milit\xe9rluftraum', u'Milit\xe4rluftraum'), (u'Milit\xe9rnetzwerk', u'Milit\xe4rnetzwerk'), (u'Milit\xe9rs', u'Milit\xe4rs'), (u'Milit\xe9rsystem', u'Milit\xe4rsystem'), (u'Millbilligung', u'Missbilligung'), (u'Millefs', u"Miller's"), (u'Millgeburt', u'Missgeburt'), (u'Milliard\xe9iren', u'Milliard\xe4ren'), (u'Million\xe9rssohn', u'Million\xe4rssohn'), (u'Milli\xe9quivalent', u'Milli\xe4quivalent'), (u'Millltonne', u'M\xfclltonne'), (u'millverstanden', u'missverstanden'), (u'milssen', u'm\xfcssen'), (u'milsst', u'm\xfcsst'), (u'milsste', u'm\xfcsste'), (u'milssten', u'm\xfcssten'), (u'Miltter', u'M\xfctter'), (u'Minenraumen', u'Minenr\xe4umen'), (u'Miniriicke', u'Minir\xf6cke'), (u'mirglauben', u'mir glauben'), (u'mirja', u'mir ja'), (u'mirje', u'mir je'), (u'mirjeglichen', u'mir jeglichen'), (u'mirjemals', u'mir jemals'), (u'mirjemand', u'mir jemand'), (u'mirjetzt', u'mir jetzt'), (u'mirso', u'mir so'), (u'mirvon', u'mir von'), (u'mirzu', u'mir zu'), (u'Miserabell', u'Miserabel!'), (u'missf\xe9llt', u'missf\xe4llt'), (u'Missverstfindnisl', u'Missverst\xe4ndnis!'), (u'Missverstiindnis', u'Missverst\xe4ndnis'), (u'Missverst\xe9ndnis', u'Missverst\xe4ndnis'), (u'Missverst\xe9ndnissen', u'Missverst\xe4ndnissen'), (u'Mistkerlel', u'Mistkerle!'), (u'Mistkiiter', u'Mistk\xf6ter'), (u'Miststiick', u'Mistst\xfcck'), (u'Mistst\ufb02cke', u'Mistst\xfccke'), (u'Mitbijrger', u'Mitb\xfcrger'), (u'Mitbilrger', u'Mitb\xfcrger'), (u'mitfiihlend', u'mitf\xfchlend'), (u'mitfiihlender', u'mitf\xfchlender'), (u'mitfuhlend', u'mitf\xfchlend'), (u'Mitgefiihl', u'Mitgef\xfchl'), (u'Mitgefuhl', u'Mitgef\xfchl'), (u'mitgehiirt', u'mitgeh\xf6rt'), (u'mitgez\xe9hlt', u'mitgez\xe4hlt'), (u'mitjedem', u'mit jedem'), (u'mitjemandem', u'mit jemandem'), (u'mittlen/veile', u'mittlerweile'), (u"ML'1nze", u'M\xfcnze'), (u'mlch', u'mich'), (u'Mldchen', u'M\xe4dchen'), (u'mLissen', u'm\xfcssen'), (u'Mljnder', u'M\xfcnder'), (u'Mllillschlucker', u'M\xfcllschlucker'), (u'Mllindel', u'M\xfcndel'), (u'Mllindung', u'M\xfcndung'), (u'mllissen', u'm\xfcssen'), (u'mllisst', u'm\xfcsst'), (u'Mlllhe', u'M\xfche'), (u'Mllllon', u'Million'), (u'Mllllonen', u'Millionen'), (u'mlllsst', u'm\xfcsst'), (u'Mllltterjedoch', u'M\xfctter jedoch'), (u'Mlnnern', u'M\xe4nnern'), (u'mlr', u'mir'), (u'mlrl', u'mir!'), (u'mlt', u'mit'), (u'moglich', u'm\xf6glich'), (u'Moglichkeit', u'M\xf6glichkeit'), (u'Moglichkeiten', u'M\xf6glichkeiten'), (u'Molekijle', u'Molek\xfcle'), (u"MolekL'lle", u'Molek\xfcle'), (u'Mondeinhiirner', u'Mondeinh\xf6rner'), (u'Mondeinhiirnerl', u'Mondeinh\xf6rner!'), (u'Mondeinh\xe9irner', u'Mondeinh\xf6rner'), (u'Mondk\xe9ilber', u'Mondk\xe4lber'), (u'Monl', u'Mom'), (u'MONTONEI', u'MONTONE:'), (u'Mordsiiberraschung', u'Mords\xfcberraschung'), (u'Mordverd\xe9chtiger', u'Mordverd\xe4chtiger'), (u'Morsealphabetl', u'Morsealphabet!'), (u'Motorger\xe9usch', u'Motorger\xe4usch'), (u'Motorger\xe9usche', u'Motorger\xe4usche'), (u"Mousset\ufb02e's", u"Moussette's"), (u'Mowen', u'M\xf6wen'), (u'Mtihe', u'M\xfche'), (u'Mtillschlucker', u'M\xfcllschlucker'), (u'mtissen', u'm\xfcssen'), (u'mtissenl', u'm\xfcssen!'), (u'Mtitzel', u'M\xfctze!'), (u'mtlde', u'm\xfcde'), (u'mtlsste', u'm\xfcsste'), (u'muBt', u'musst'), (u'Mucken', u'M\xfccken'), (u'mucksm\xe9uschenstill', u'mucksm\xe4uschenstill'), (u'mude', u'm\xfcde'), (u'Muhe', u'M\xfche'), (u'MUII', u'M\xfcll'), (u'mull', u'muss'), (u'MULL', u'M\xdcLL'), (u'mullte', u'musste'), (u'Mundl', u'Mund!'), (u'Mundung', u'M\xfcndung'), (u'Munzfernsprecher', u'M\xfcnzfernsprecher'), (u'Muskatnijsse', u'Muskatn\xfcsse'), (u'Muskelkumpelsl', u'Muskelkumpels!'), (u'muskul\xe9ren', u'muskul\xe4ren'), (u'mussen', u'm\xfcssen'), (u'MUSSEN', u'M\xdcSSEN'), (u"mUssen's", u"m\xfcssen's"), (u"muss_'\xa7e", u'musste'), (u'Musterschuler', u'Mustersch\xfcler'), (u'Mutterja', u'Mutter ja'), (u'mutterlich', u'm\xfctterlich'), (u'Mutze', u'M\xfctze'), (u'mu\xdf', u'muss'), (u'mu\xdft', u'musst'), (u'mu\xdfte', u'musste'), (u"mx't", u'mit'), (u'Mzlinnern', u'M\xe4nnern'), (u'M\xe9bel', u'M\xf6bel'), (u'm\xe9cht', u'm\xf6cht'), (u'M\xe9chte', u'M\xe4chte'), (u'm\xe9chte', u'm\xf6chte'), (u'M\xe9chtegern', u'M\xf6chtegern'), (u'm\xe9chten', u'm\xf6chten'), (u'm\xe9chtest', u'm\xf6chtest'), (u'm\xe9chtet', u'm\xf6chtet'), (u'm\xe9chtig', u'm\xe4chtig'), (u'm\xe9chtige', u'm\xe4chtige'), (u'm\xe9chtigen', u'm\xe4chtigen'), (u'm\xe9chtiger', u'm\xe4chtiger'), (u'm\xe9chtiges', u'm\xe4chtiges'), (u'm\xe9chtigste', u'm\xe4chtigste'), (u'm\xe9chtigsten', u'm\xe4chtigsten'), (u'M\xe9dchen', u'M\xe4dchen'), (u'M\xe9dchenh\xe9nden', u'M\xe4dchenh\xe4nden'), (u'M\xe9dchens', u'M\xe4dchens'), (u'M\xe9del', u'M\xe4del'), (u'M\xe9dels', u'M\xe4dels'), (u'M\xe9delsl', u'M\xe4dels!'), (u'M\xe9fiigung', u'M\xe4\xdfigung'), (u'm\xe9ge', u'm\xf6ge'), (u'M\xe9gen', u'M\xf6gen'), (u'M\xe9glich', u'M\xf6glich'), (u'm\xe9gliche', u'm\xf6gliche'), (u'M\xe9glichen', u'M\xf6glichen'), (u'M\xe9gliches', u'M\xf6gliches'), (u'M\xe9glichkeit', u'M\xf6glichkeit'), (u'M\xe9glichkeiten', u'M\xf6glichkeiten'), (u'm\xe9glichst', u'm\xf6glichst'), (u'm\xe9gt', u'm\xf6gt'), (u'm\xe9ichtig', u'm\xe4chtig'), (u'm\xe9ichtige', u'm\xe4chtige'), (u'm\xe9ichtigen', u'm\xe4chtigen'), (u'm\xe9ichtiger', u'm\xe4chtiger'), (u'M\xe9idchen', u'M\xe4dchen'), (u'M\xe9idel', u'M\xe4del'), (u'M\xe9inner', u'M\xe4nner'), (u'M\xe9innl', u'M\xe4nnl'), (u'm\xe9innlicher', u'm\xe4nnlicher'), (u'M\xe9irder', u'M\xf6rder'), (u'M\xe9irz', u'M\xe4rz'), (u'M\xe9nnchen', u'M\xe4nnchen'), (u'M\xe9nnchens', u'M\xe4nnchens'), (u'M\xe9nner', u'M\xe4nner'), (u'M\xe9nnerfreundschaft', u'M\xe4nnerfreundschaft'), (u'M\xe9nnern', u'M\xe4nnern'), (u'M\xe9nnersache', u'M\xe4nnersache'), (u'm\xe9nnlich', u'm\xe4nnlich'), (u'm\xe9nnliche', u'm\xe4nnliche'), (u'M\xe9ntel', u'M\xe4ntel'), (u'M\xe9olel', u'M\xe4del'), (u'M\xe9olels', u'M\xe4dels'), (u'M\xe9rchen', u'M\xe4rchen'), (u'M\xe9rchenl', u'M\xe4rchen!'), (u'M\xe9rchenprinzen', u'M\xe4rchenprinzen'), (u'M\xe9rder', u'M\xf6rder'), (u'M\xe9rtyrer', u'M\xe4rtyrer'), (u'M\xe9rz', u'M\xe4rz'), (u'M\xe9tresse', u'M\xe4tresse'), (u'M\xe9uschen', u'M\xe4uschen'), (u'M\xe9use', u'M\xe4use'), (u'M\xe9usehtipfer', u'M\xe4useh\xfcpfer'), (u'M\xe9usen', u'M\xe4usen'), (u'M\xe9userennen', u'M\xe4userennen'), (u'm\xfc\xdft', u'm\xfcsst'), (u'm\ufb02de', u'm\xfcde'), (u'm\ufb02ssen', u'm\xfcssen'), (u"n'a'chste", u'n\xe4chste'), (u"n'a'hert", u'n\xe4hert'), (u'n/chfs', u'nichts'), (u'n/chi', u'nicht'), (u'N/ck', u'Nick'), (u'n/e', u'nie'), (u'N6', u'N\xf6'), (u'n6tig', u'n\xf6tig'), (u'nac/1', u'nach'), (u'Nachf', u'Nacht'), (u'nachllssig', u'nachl\xe4ssig'), (u'nachl\xe9ssig', u'nachl\xe4ssig'), (u'nachl\xe9sst', u'nachl\xe4sst'), (u'nachprufen', u'nachpr\xfcfen'), (u'Nachschlussel', u'Nachschl\xfcssel'), (u'Nachste', u'N\xe4chste'), (u'NAHERT', u'N\xc4HERT'), (u'NAHERTE', u'N\xc4HERTE'), (u'Nat/on', u'Nation'), (u'natfirlich', u'nat\xfcrlich'), (u'Natiilrlich', u'Nat\xfcrlich'), (u'Natiirlich', u'Nat\xfcrlich'), (u'Natiirllch', u'Nat\xfcrlich'), (u'natijrlich', u'nat\xfcrlich'), (u'natijrlichen', u'nat\xfcrlichen'), (u'natilrlich', u'nat\xfcrlich'), (u'natilrliche', u'nat\xfcrliche'), (u"natL'lrlich", u'nat\xfcrlich'), (u'Natllirlich', u'Nat\xfcrlich'), (u'Nattirlich', u'Nat\xfcrlich'), (u'Nattlrlich', u'Nat\xfcrlich'), (u'Nattlrliohl', u'Nat\xfcrlich!'), (u'Naturlich', u'Naturloch'), (u'naturlich', u'nat\xfcrlich'), (u'naturlichen', u'nat\xfcrlichen'), (u'naturlichsten', u'nat\xfcrlichsten'), (u'Navajoweifi', u'Navajowei\xdf'), (u'ndtige', u'n\xf6tige'), (u'ne/n', u'nein'), (u'Nebengeb\xe9ude', u'Nebengeb\xe4ude'), (u'Nebengesch\xe9ift', u'Nebengesch\xe4ft'), (u'neffes', u'nettes'), (u'Nehmf', u'Nehmt'), (u'neinl', u'nein!'), (u'Neln', u'Nein'), (u'nerv6s', u'nerv\xf6s'), (u'Nervens\xe9ge', u'Nervens\xe4ge'), (u'Nervens\xe9ige', u'Nervens\xe4ge'), (u'nerviis', u'nerv\xf6s'), (u'Nerv\xe9s', u'Nerv\xf6s'), (u'ner\\/t', u'nervt'), (u'Neuankiimmlinge', u'Neuank\xf6mmlinge'), (u'neuromuskul\xe9ren', u'neuromuskul\xe4ren'), (u'Neuzug\xe9inge', u'Neuzug\xe4nge'), (u'Nfichster', u'N\xe4chster'), (u'NIANN', u'MANN'), (u'nichsten', u'n\xe4chsten'), (u'nichtim', u'nicht im'), (u'nichtjemand', u'nicht jemand'), (u'Nichtjetzt', u'Nicht jetzt'), (u'Nichtsl', u'Nichts!'), (u'nichtzurilckgelassen', u'nicht zur\xfcckgelassen'), (u'nic_l_1t', u'nicht'), (u'niederk\xe9mpfen', u'niederk\xe4mpfen'), (u'niederliells', u'niederlie\xdf'), (u'niedlichl', u'niedlich!'), (u'niher', u'n\xe4her'), (u'niichsten', u'n\xe4chsten'), (u'niichstes', u'n\xe4chstes'), (u'niirgeln', u'n\xf6rgeln'), (u'niitig', u'n\xf6tig'), (u'niitige', u'n\xf6tige'), (u'Nijssen', u'N\xfcssen'), (u'Nijsternl', u'N\xfcstern!'), (u'nijtzlich', u'n\xfctzlich'), (u'nilchtern', u'n\xfcchtern'), (u'niltzen', u'n\xfctzen'), (u'Nlagnaten', u'Magnaten'), (u'Nlannern', u'M\xe4nnern'), (u'nlchste', u'n\xe4chste'), (u'nlchsthoheren', u'n\xe4chsth\xf6heren'), (u'nlcht', u'nicht'), (u'nle', u'nie'), (u'Nlemalsl', u'Niemals!'), (u'Nlhe', u'N\xe4he'), (u'nlir', u'mir'), (u'nllitzen', u'n\xfctzen'), (u'Nl\xe9inner', u'M\xe4nner'), (u'noc/1', u'noch'), (u"Not/'all", u'Notfall'), (u'Notfalll', u'Notfall!'), (u'notig', u'n\xf6tig'), (u'notigen', u'n\xf6tigen'), (u'Notliige', u'Notl\xfcge'), (u'Notziindung', u'Notz\xfcndung'), (u'NUFI', u'Nur:'), (u'Nunja', u'Nun ja'), (u'Nurdich', u'Nur dich'), (u'nureins', u'nur eins'), (u'nurflustern', u'nur fl\xfcstern'), (u'Nurjetzt', u'Nur jetzt'), (u'nurl', u'nur 1'), (u'nurwunscht', u'nur w\xfcnscht'), (u'Nurzu', u'Nur zu'), (u'nus', u'aus'), (u'NUSSS', u'N\xfcsse'), (u'nutzlich', u'n\xfctzlich'), (u"Nx'emand", u'Niemand'), (u'N\xe9chste', u'N\xe4chste'), (u'n\xe9chsten', u'n\xe4chsten'), (u'N\xe9chster', u'N\xe4chster'), (u'n\xe9chstes', u'n\xe4chstes'), (u'N\xe9chte', u'N\xe4chte'), (u'N\xe9chten', u'N\xe4chten'), (u'n\xe9chtlichen', u'n\xe4chtlichen'), (u'N\xe9gel', u'N\xe4gel'), (u'N\xe9h', u'N\xe4h'), (u'N\xe9he', u'N\xe4he'), (u'n\xe9henf', u'n\xe4hert'), (u'n\xe9her', u'n\xe4her'), (u'n\xe9here', u'n\xe4here'), (u'N\xe9hern', u'N\xe4hern'), (u'n\xe9hernde', u'n\xe4hernde'), (u'n\xe9hert', u'n\xe4hert'), (u'n\xe9herte', u'n\xe4herte'), (u'n\xe9hren', u'n\xe4hren'), (u'n\xe9ht', u'n\xe4ht'), (u'N\xe9hten', u'N\xe4hten'), (u'N\xe9ichste', u'N\xe4chste'), (u'n\xe9ichsten', u'n\xe4chsten'), (u'N\xe9ichstes', u'N\xe4chstes'), (u'N\xe9ihe', u'N\xe4he'), (u'n\xe9iher', u'n\xe4her'), (u'n\xe9ihern', u'n\xe4hern'), (u'n\xe9ihert', u'n\xe4hert'), (u'N\xe9ihten', u'N\xe4hten'), (u'n\xe9imlich', u'n\xe4mlich'), (u'n\xe9mlich', u'n\xe4mlich'), (u'N\xe9pfe', u'N\xe4pfe'), (u'n\xe9rdlich', u'n\xf6rdlich'), (u'n\xe9rgelnde', u'n\xf6rgelnde'), (u'N\xe9rrin', u'N\xe4rrin'), (u'N\xe9schen', u'N\xe4schen'), (u'n\xe9tig', u'n\xf6tig'), (u'n\xe9tige', u'n\xf6tige'), (u'n\xe9tiges', u'n\xf6tiges'), (u'O8', u'08'), (u'obdachlosl', u'obdachlos!'), (u'Obefil\xe9iche', u'Oberfl\xe4che'), (u'OBERFLACHENSCHWERKRAFT', u'OBERFL\xc4CHENSCHWERKRAFT'), (u'Oberfl\xe9che', u'Oberfl\xe4che'), (u'Oberfl\xe9chen', u'Oberfl\xe4chen'), (u'oberfl\xe9chlich', u'oberfl\xe4chlich'), (u'oberfl\xe9chliche', u'oberfl\xe4chliche'), (u'Oberm\xe9inner', u'Oberm\xe4nner'), (u'Ober\ufb02fiche', u'Oberfl\xe4che'), (u"of/'en", u'offen'), (u'Offenslchtllch', u'Offensichtlich'), (u'Offentliches', u'\xd6ffentliches'), (u'Offentlichkeit', u'\xd6ffentlichkeit'), (u'Offne', u'\xd6ffne'), (u'Offnen', u'\xd6ffnen'), (u'Offnet', u'\xd6ffnet'), (u'ofi', u'oft'), (u'Ofiiziere', u'Offiziere'), (u'Ofiiziers', u'Offiziers'), (u'Oftweg', u'Oft weg'), (u'Of\ufb02cer', u'Officer'), (u'Ohnejede', u'Ohne jede'), (u'ohnm\xe9chtig', u'ohnm\xe4chtig'), (u'ohnm\xe9ichtig', u'ohnm\xe4chtig'), (u'OI', u'\xd6l'), (u'olas', u'das'), (u'oles', u'des'), (u'Oltanks', u'\xd6ltanks'), (u'OO', u'00'), (u'Orgelt\xe9ne', u'Orgelt\xf6ne'), (u'ORTI', u'ORT:'), (u'Ortl', u'Ort!'), (u'Ostfltlgel', u'Ostfl\xfcgel'), (u'Paliontologie', u'Pal\xe4ontologie'), (u'pallt', u'passt'), (u'Pal\xe9sten', u'Pal\xe4sten'), (u'Panfike/chen', u'Partikelchen'), (u'Papierbl\xe9tter', u'Papierbl\xe4tter'), (u'Papiertiite', u'Papiert\xfcte'), (u'Papiertilcher', u'Papiert\xfccher'), (u'Parfyknaller', u'Partyknaller'), (u'Partyhiite', u'Partyh\xfcte'), (u'Partyhijte', u'Partyh\xfcte'), (u'Passendervveise', u'Passenderweise'), (u'Paulgenauso', u'Paul genauso'), (u'pa\xdf', u'pass'), (u'pa\xdft', u'passt'), (u'peinliohl', u'peinlich'), (u'persdnlich', u'pers\xf6nlich'), (u'persfinlich', u'pers\xf6nlich'), (u'persiinlich', u'pers\xf6nlich'), (u'persiinliche', u'pers\xf6nliche'), (u'persiinlicher', u'pers\xf6nlicher'), (u'Persiinllchkeltsspaltun', u'Pers\xf6nllchkeltsspaltung'), (u'persijnliche', u'pers\xf6nliche'), (u'personlich', u'pers\xf6nlich'), (u'Personlichkeit', u'Pers\xf6nlichkeit'), (u'pers\xe9nlich', u'pers\xf6nlich'), (u'pers\xe9nliche', u'pers\xf6nliche'), (u'pers\xe9nlicher', u'pers\xf6nlicher'), (u'Pers\xe9nliches', u'Pers\xf6nliches'), (u'Pers\xe9nlichkeit', u'Pers\xf6nlichkeit'), (u'pe\ufb02g', u'peng'), (u'Pfadfindervvappen', u'Pfadfinderwappen'), (u'Pfad\ufb02ndeml', u'Pfad\ufb02ndern!'), (u'Pffitzen', u'Pf\xfctzen'), (u'Pfiitchen', u'Pf\xf6tchen'), (u'Pfippchen', u'P\xfcppchen'), (u"pflL'lgen", u'pfl\xfcgen'), (u'Pfllitze', u'Pf\xfctze'), (u'pflugte', u'pfl\xfcgte'), (u'Pfundbijro', u'Pfundb\xfcro'), (u'ph\xe9nomenal', u'ph\xe4nomenal'), (u'PIatz', u'Platz'), (u'Piimpel', u'P\xf6mpel'), (u'Piinlttchenltrawatte', u'P\xfcnktchenkrawatte'), (u'Pijppchen', u'P\xfcppchen'), (u'Pijppchenl', u'P\xfcppchen!'), (u'Planetenf', u'Planeten!'), (u'planm\xe9fiigen', u'planm\xe4\xdfigen'), (u'Plastikfr\xe9iuleinl', u'Plastikfr\xe4ulein!'), (u'plattmachen', u'platt machen'), (u'Plfitzchen', u'Pl\xe4tzchen'), (u'plfitzlich', u'pl\xf6tzlich'), (u'pliitzlich', u'pl\xf6tzlich'), (u'pliitzllch', u'pl\xf6tzlich'), (u'Pllllnderer', u'Pl\xfcnderer'), (u'plotzlich', u'pl\xf6tzlich'), (u'pl\xe9dieren', u'pl\xe4dieren'), (u'Pl\xe9ine', u'Pl\xe4ne'), (u'Pl\xe9inen', u'Pl\xe4nen'), (u'Pl\xe9itzchen', u'Pl\xe4tzchen'), (u'Pl\xe9itze', u'Pl\xe4tze'), (u'Pl\xe9ne', u'Pl\xe4ne'), (u'Pl\xe9tzchen', u'Pl\xe4tzchen'), (u'Pl\xe9tze', u'Platze'), (u'Pl\xe9tzel', u'Pl\xe4tze!'), (u'pl\xe9tzlich', u'pl\xf6tzlich'), (u'pl\xe9tzliche', u'pl\xf6tzliche'), (u'Pofkawoche', u'Polkawoche'), (u'Polizistl', u'Polizist!'), (u'pompiise', u'pomp\xf6se'), (u'popul\xe9r', u'popul\xe4r'), (u'potth\xe9sslich', u'potth\xe4sslich'), (u'prasentleren', u'pr\xe4sentieren'), (u'prfignant', u'pr\xe4gnant'), (u'Prfisentation', u'Pr\xe4sentation'), (u'Prfisi', u'Pr\xe4si'), (u'priide', u'pr\xfcde'), (u'Priife', u'Pr\xfcfe'), (u'priifen', u'pr\xfcfen'), (u'prijfen', u'pr\xfcfen'), (u"Priorit2a't", u'Priorit\xe4t'), (u'PRIORITKT', u'PRIORIT\xc4T'), (u'PRIORITKTSZUGANG', u'PRIORIT\xc4TSZUGANG'), (u'Priorit\xe9itszugang', u'Priorit\xe4tszugang'), (u'Priorit\xe9t', u'Priorit\xe4t'), (u'Prisident', u'Pr\xe4sident'), (u'Privatgem\xe9chern', u'Privatgem\xe4chern'), (u'Privatsph\xe9re', u'Privatsph\xe4re'), (u'Probfeme', u'Probleme'), (u'Profitinzerinnen', u'Profit\xe4nzerinnen'), (u'Protege', u'Prot\xe9g\xe9'), (u'prude', u'pr\xfcde'), (u'Pruf', u'Pr\xfcf'), (u'prufen', u'pr\xfcfen'), (u'Prugelei', u'Pr\xfcgelei'), (u'prugeln', u'pr\xfcgeln'), (u'pr\xe9chtig', u'pr\xe4chtig'), (u'Pr\xe9fekt', u'Pr\xe4fekt'), (u'pr\xe9historischer', u'pr\xe4historischer'), (u'pr\xe9ichtiger', u'pr\xe4chtiger'), (u'pr\xe9ichtiges', u'pr\xe4chtiges'), (u'Pr\xe9imie', u'Pr\xe4mie'), (u'pr\xe9ipotente', u'pr\xe4potente'), (u'pr\xe9isentiert', u'pr\xe4sentiert'), (u'Pr\xe9isidenten', u'Pr\xe4sidenten'), (u'Pr\xe9itorianer', u'Pr\xe4torianer'), (u'Pr\xe9mie', u'Pr\xe4mie'), (u'Pr\xe9operative', u'Pr\xe4operative'), (u'pr\xe9sentiere', u'pr\xe4sentiere'), (u'pr\xe9sentieren', u'pr\xe4sentieren'), (u'Pr\xe9sentiert', u'Pr\xe4sentiert'), (u'Pr\xe9senz', u'Pr\xe4senz'), (u'Pr\xe9sident', u'Pr\xe4sident'), (u'Pr\xe9sidenten', u'Pr\xe4sidenten'), (u'Pr\xe9sidentin', u'Pr\xe4sidentin'), (u'Pr\xe9sidentschaft', u'Pr\xe4sidentschaft'), (u'Pr\xe9torianer', u'Pr\xe4torianer'), (u'pr\xe9zise', u'pr\xe4zise'), (u'pr\xe9ziser', u'pr\xe4ziser'), (u'Pr\ufb02fungen', u'Pr\xfcfungen'), (u'Pubert\xe9it', u'Pubert\xe4t'), (u'Publlkuml', u'Publlkum!'), (u'PUPPCHEN', u'P\xdcPPCHEN'), (u'PUpst', u'Pupst'), (u'Purzelb\xe9ume', u'Purzelb\xe4ume'), (u'P\xe9ckchen', u'P\xe4ckchen'), (u'p\xe9idagogisch', u'p\xe4dagogisch'), (u'P\xe9irchen', u'P\xe4rchen'), (u'P\xe9rchen', u'P\xe4rchen'), (u'p\ufb02egen', u'pflegen'), (u'P\ufb02icht', u'Pflicht'), (u'p\ufb02ichtbewullt', u'pflichtbewusst'), (u'Qas', u'Das'), (u'Qualit\xe9tskontrolle', u'Qualit\xe4tskontrolle'), (u'Quten', u'guten'), (u'qu\xe9ilen', u'qu\xe4len'), (u'qu\xe9ilt', u'qu\xe4lt'), (u'Qu\xe9l', u'Qu\xe4l'), (u'Qu\xe9lt', u'Qu\xe4lt'), (u"R'a'che", u'R\xe4che'), (u'R/ck', u'Rick'), (u'R/nge', u'Ringe'), (u'R6mer', u'R\xf6mer'), (u'rachsiichtiger', u'rachs\xfcchtiger'), (u'ranghfiheren', u'rangh\xf6heren'), (u'rangh\xe9heren', u'rangh\xf6heren'), (u'ranzukommen', u'ran-zukommen'), (u'Rasenm\xe9herunfall', u'Rasenm\xe4herunfall'), (u'Rasterllibertragung', u'Raster\xfcbertragung'), (u'Rasterubertragung', u'Raster\xfcbertragung'), (u'Ratschl\xe9ige', u'Ratschl\xe4ge'), (u'Rattenf\xe9nger', u'Rattenf\xe4nger'), (u'Rauc/7', u'Rauch'), (u'Rauc/vender', u'Rauchender'), (u'rauhen', u'rauen'), (u'RAUMFAHRE', u'RAUMF\xc4HRE'), (u'Raumf\xe9hre', u'Raumf\xe4hre'), (u'Raumsschiff', u'Raumschiff'), (u'rausf\xe9hrt', u'rausf\xe4hrt'), (u'rausgeprtigeltl', u'rausgepr\xfcgelt!'), (u'rausliefien', u'rauslie\xdfen'), (u'rauszuschmeifien', u'rauszuschmei\xdfen'), (u'rau\ufb02', u'rau!'), (u'Re/se', u'Reise'), (u'Realit\xe9it', u'Realit\xe4t'), (u'Realit\xe9t', u'Realit\xe4t'), (u'Rechtgl\xe9ubige', u'Rechtgl\xe4ubige'), (u'rechtm\xe9fkigen', u'rechtm\xe4\xdfigen'), (u'RECHTSANWALTE', u'RECHTSANW\xc4LTE'), (u'rechtsl', u'rechts!'), (u'Reffer', u'Retter'), (u'regelm\xe9fiige', u'regelm\xe4\xdfige'), (u'Regenh\xe9igen', u'Regenb\xf6gen'), (u'Regenm\xe9ntel', u'Regenm\xe4ntel'), (u'Regierungsgehirnw\xe9ischesignal', u'Regierungsgehirnw\xe4schesignal'), (u'regul\xe9re', u'regul\xe4re'), (u'reiB', u'rei\xdf'), (u'reiBt', u'rei\xdft'), (u'Reichtfimer', u'Reicht\xfcmer'), (u'Reichtllimern', u'Reicht\xfcmern'), (u'reif$', u'rei\xdf'), (u'reif$en', u'rei\xdfen'), (u'Reifiverschluss', u'Rei\xdfverschluss'), (u'Reil3t', u'Rei\xdft'), (u'reil5', u'rei\xdf'), (u'Reili', u'Rei\xdf'), (u'reilien', u'rei\xdfen'), (u'Reilin\xe9gel', u'Rei\xdfn\xe4gel'), (u'Reillt', u'Rei\xdft'), (u'reilZ>', u'rei\xdf'), (u'reingeh\xe9ngt', u'reingeh\xe4ngt'), (u'Reingelegtl', u'Reingelegt!'), (u'reinhupft', u'reinh\xfcpft'), (u'reinl', u'rein!'), (u'reinstilrmen', u'reinst\xfcrmen'), (u'reiohen', u'reichen'), (u'REISSVERSCHLUSSGERAUSCH', u'REISSVERSCHLUSSGER\xc4USCH'), (u'rei\ufb02', u'rei\xdf'), (u'rei\ufb02en', u'rei\xdfen'), (u'relch', u'reich'), (u'religi6s', u'religi\xf6s'), (u'religiiiser', u'religi\xf6ser'), (u'religi\xe9s', u'religi\xf6s'), (u'Rels', u'Reis'), (u'Rentenbezuge', u'Rentenbez\xfcge'), (u'Repr\xe9sentantin', u'Repr\xe4sentantin'), (u'Rettungsflofi', u'Rettungsflo\xdf'), (u'Rev/er', u'Revier'), (u'rfiber', u'r\xfcber'), (u'rfiberwachsen', u'r\xfcberwachsen'), (u'Rfickseite', u'R\xfcckseite'), (u'rfihrselige', u'r\xfchrselige'), (u'rfilpse', u'r\xfclpse'), (u'Rfissel', u'R\xfcssel'), (u'RGMISCHE', u'R\xd6MISCHE'), (u'Richer', u'R\xe4cher'), (u'Riesenhfipfer', u'Riesenh\xfcpfer'), (u'Riesenspafi', u'Riesenspa\xdf'), (u'Riesentijr', u'Riesent\xfcr'), (u'riiber', u'r\xfcber'), (u'Riicheln', u'R\xf6cheln'), (u'riichelt', u'r\xf6chelt'), (u'Riick', u'R\xfcck'), (u'Riickblickend', u'R\xfcckblickend'), (u'Riicken', u'R\xfccken'), (u'Riickenlage', u'R\xfcckenlage'), (u'Riickenwind', u'R\xfcckenwind'), (u'riicksichtslos', u'r\xfccksichtslos'), (u'Riicksichtslosigkeit', u'R\xfccksichtslosigkeit'), (u'Riicksitz', u'R\xfccksitz'), (u'Riickw\xe9irts', u'R\xfcckw\xe4rts'), (u'Riickzug', u'R\xfcckzug'), (u'Riick\ufb02ug', u'R\xfcck\ufb02ug'), (u'riihrt', u'r\xfchrt'), (u'Riilpsen', u'R\xfclpsen'), (u'riilpst', u'r\xfclpst'), (u'Riimischen', u'R\xf6mischen'), (u'Riistung', u'R\xfcstung'), (u'Riiumlichkeiten', u'R\xe4umlichkeiten'), (u'Rijbe', u'R\xfcbe'), (u'rijber', u'r\xfcber'), (u'rijckgfingig', u'r\xfcckg\xe4ngig'), (u'rijckw\xe9irts', u'r\xfcckw\xe4rts'), (u'Rijsseltierl', u'R\xfcsseltier!'), (u'Rilbe', u'R\xfcbe'), (u'rilber', u'r\xfcber'), (u'rilberkommen', u'r\xfcberkommen'), (u'Rilckkehr', u'R\xfcckkehr'), (u'rilcksichtsloses', u'r\xfccksichtsloses'), (u'rilckw\xe9rts', u'r\xfcckw\xe4rts'), (u'Rillpsen', u'R\xfclpsen'), (u'Riol', u'Rio!'), (u'Rivalit\xe9t', u'Rivalit\xe4t'), (u"rL'lber", u'r\xfcber'), (u"RL'lhr", u'R\xfchr'), (u'rllicken', u'r\xfccken'), (u'rllickt', u'r\xfcckt'), (u'Rlllckgrat', u'R\xfcckgrat'), (u'Rlnge', u'Ringe'), (u'Rlumgerate', u'R\xe4umger\xe4te'), (u'ROMISCHE', u'R\xd6MISCHE'), (u'ROMISCHEN', u'R\xd6MISCHEN'), (u'rosa\xe9ugiges', u'rosa\xe4ugiges'), (u'rotiugiger', u'rot\xe4ugiger'), (u'Rotk\xe9ppchen', u'Rotk\xe4ppchen'), (u'Rott\xe9nen', u'Rott\xf6nen'), (u'Routinetlberprijfung', u'Routine\xfcberpr\xfcfung'), (u'Rticken', u'R\xfccken'), (u'rticksichtslos', u'r\xfccksichtslos'), (u'rtlber', u'r\xfcber'), (u'Rtlckseite', u'R\xfcckseite'), (u'ruber', u'r\xfcber'), (u'Ruberrutschen', u'R\xfcberrutschen'), (u'Ruckblende', u'R\xfcckblende'), (u'Ruckblick', u'R\xfcckblick'), (u'Rucken', u'R\xfccken'), (u'Ruckenlage', u'R\xfcckenlage'), (u'Ruckenwind', u'R\xfcckenwind'), (u'Ruckfall', u'R\xfcckfall'), (u'Ruckfrage', u'R\xfcckfrage'), (u'Ruckgriff', u'R\xfcckgriff'), (u'Ruckkehr', u'R\xfcckkehr'), (u'Rucksitz', u'R\xfccksitz'), (u'Ruckzugl', u'R\xfcckzug!'), (u'ruhlg', u'ruhig'), (u'ruhrenl', u'r\xfchren!'), (u'Ruhrt', u'R\xfchrt'), (u'Rul3', u'Ru\xdf'), (u'Rumgebrfillel', u'Rumgebr\xfclle!'), (u'rumhingen', u'rumh\xe4ngen'), (u'rumh\xe9ngen', u'rumh\xe4ngen'), (u'rumh\xe9ngst', u'rumh\xe4ngst'), (u'ruml\xe9uft', u'ruml\xe4uft'), (u'rumwuhlen', u'rumw\xfchlen'), (u'rumzuf\ufb02hren', u'rumzuf\xfchren'), (u'rum\xe9rgern', u'rum\xe4rgern'), (u'runterffihrt', u'runterf\xe4hrt'), (u'runtergespillt', u'runtergesp\xfclt'), (u'runtergesp\ufb02lt', u'runtergesp\xfclt'), (u'Runterl', u'Runter!'), (u'runterspillen', u'runtersp\xfclen'), (u'runterspllllen', u'runtersp\xfclen'), (u'runtersp\xfclt', u'runter-sp\xfclt'), (u'runtervverfen', u'runterwerfen'), (u'Rupem', u'Rupert!'), (u'Rustung', u'R\xfcstung'), (u'r\xe9che', u'r\xe4che'), (u'r\xe9chen', u'r\xe4chen'), (u'R\xe9cher', u'R\xe4cher'), (u'r\xe9cht', u'r\xe4cht'), (u'R\xe9der', u'R\xe4der'), (u'R\xe9dern', u'R\xe4dern'), (u'R\xe9hre', u'R\xf6hre'), (u'R\xe9idern', u'R\xe4dern'), (u'R\xe9itsel', u'R\xe4tsel'), (u'r\xe9itseln', u'r\xe4tseln'), (u'r\xe9itst', u'r\xe4tst'), (u'R\xe9iume', u'R\xe4ume'), (u'R\xe9mern', u'R\xf6mern'), (u'r\xe9mische', u'r\xf6mische'), (u'r\xe9mischen', u'r\xf6mischen'), (u'r\xe9mischer', u'r\xf6mischer'), (u'R\xe9nder', u'R\xe4nder'), (u'R\xe9nke', u'R\xe4nke'), (u'R\xe9nken', u'R\xe4nken'), (u'R\xe9ntgenaufnahme', u'R\xf6ntgenaufnahme'), (u'R\xe9ntgenbild', u'R\xf6ntgenbild'), (u'R\xe9son', u'R\xe4son'), (u'r\xe9t', u'r\xe4t'), (u'R\xe9tsel', u'R\xe4tsel'), (u'r\xe9tselhaft', u'r\xe4tselhaft'), (u'R\xe9tselhaftes', u'R\xe4tselhaftes'), (u'R\xe9ume', u'R\xe4ume'), (u'R\xe9umen', u'R\xe4umen'), (u'R\xe9umlichkeiten', u'R\xe4umlichkeiten'), (u'R\xe9umt', u'R\xe4umt'), (u'r\xe9uspert', u'r\xe4uspert'), (u'R\ufb02be', u'R\xfcbe'), (u'r\ufb02bergeguckt', u'r\xfcbergekuckt'), (u'R\ufb02ckkehr', u'R\xfcckkehr'), (u'S/e', u'Sie'), (u's/nd', u'sind'), (u'S5tze', u'S\xe4tze'), (u'S6hne', u'S\xf6hne'), (u'saB', u'sa\xdf'), (u'Sachverstlndiger', u'Sachverst\xe4ndiger'), (u'sagf', u'sagt'), (u'sagfen', u'sagten'), (u'Sammlerstiicken', u'Sammlerst\xfccken'), (u'Sands\xe9cke', u'Sands\xe4cke'), (u'Sanftmiltigen', u'Sanftm\xfctigen'), (u'Sanierungsbeh\xe9rde', u'Sanierungsbeh\xf6rde'), (u'Sanit\xe9ter', u'Sanit\xe4ter'), (u'Sargn\xe9gel', u'Sargn\xe4gel'), (u'sari', u'sa\xdf'), (u'Satellitenschijssel', u'Satellitensch\xfcssel'), (u'Satellitenschusseln', u'Satellitensch\xfcsseln'), (u'Satellitenuberwachung', u'Satelliten\xfcberwachung'), (u'Saugf\ufb02flsen', u'Saugf\xfc\xdfen'), (u'sc/10/1', u'schon'), (u'sc/16/1', u'sch\xf6n'), (u'sch/cken', u'schicken'), (u'Sch/ffe', u'Schiffe'), (u'sch6n', u'sch\xf6n'), (u'Schadeniiberpriifung', u'Schaden\xfcberpr\xfcfung'), (u'Schadenuberprtlfung', u'Schaden\xfcberpr\xfcfung'), (u'Scharfschijtze', u'Scharfsch\xfctze'), (u'schbn', u'sch\xf6n'), (u"schc'\xa7n", u'sch\xf6n'), (u'Schdn', u'Sch\xf6n'), (u'schdnen', u'sch\xf6nen'), (u'Schecksl', u'Schecks!'), (u'ScheiB', u'Schei\xdf'), (u'ScheiBe', u'Schei\xdfe'), (u'scheiBegal', u'schei\xdfegal'), (u'Scheif$e', u'Schei\xdfe'), (u'scheiffsel', u'schei\xdfe!'), (u'Scheifi', u'Schei\xdf'), (u'Scheifiding', u'Schei\xdfding'), (u'scheifie', u'schei\xdfe'), (u'Scheifiel', u'Schei\xdfe!'), (u'Scheifier', u'Schei\xdfer'), (u'Scheifihelm', u'Schei\xdfhelm'), (u'Scheifiloch', u'Schei\xdfloch'), (u'Scheifipascha', u'Schei\xdfpascha'), (u'Scheifisofa', u'Schei\xdfsofa'), (u'Scheifiweiber', u'Schei\xdfweiber'), (u'Scheifle', u'Schei\xdfe'), (u'Scheiiislangweilig', u'Schei\xdflangweilig'), (u"Scheil'$e", u'Schei\xdfe'), (u'Scheil3>er', u'Schei\xdfer'), (u'Scheil3e', u'Schei\xdfe'), (u'Scheili', u'Schei\xdf'), (u'Scheilie', u'Schei\xdfe'), (u'scheilien', u'schei\xdfen'), (u'Scheille', u'Schei\xdfe'), (u'Scheillel', u'Schei\xdfe!'), (u'ScheilSe', u'Schei\xdfe'), (u'ScheilZ>', u'Schei\xdf'), (u'Scheir$oling', u'Schei\xdfding'), (u'scheissegal', u'schei\xdfegal'), (u'Scheisskarre', u'Schei\xdfkarre'), (u'Schei\ufb02e', u'Schei\xdfe'), (u'scheme', u'schei\xdfe'), (u'scheuf$lich', u'scheu\xdflich'), (u'Scheulilich', u'Scheu\xdflich'), (u'schfichtern', u'sch\xfcchtern'), (u'schfimen', u'sch\xe4men'), (u'schfin', u'sch\xf6n'), (u'Schfine', u'Sch\xf6ne'), (u'schfinen', u'sch\xf6nen'), (u'Schfines', u'Sch\xf6nes'), (u'schfirfer', u'sch\xe4rfer'), (u'Schfissel', u'Sch\xfcssel'), (u'Schfitzchen', u'Sch\xe4tzchen'), (u'schfjnes', u'sch\xf6nes'), (u'Schideln', u'Sch\xe4deln'), (u'schief$en', u'schie\xdfen'), (u'Schief3>en', u'Schie\xdfen'), (u'Schiefien', u'Schie\xdfen'), (u'schiefit', u'schie\xdft'), (u'schiefZ>t', u'schie\xdft'), (u"schiel'5", u'schie\xdf'), (u'Schiel3t', u'Schie\xdft'), (u'schiellen', u'schie\xdfen'), (u'Schielmbung', u'Schie\xdf\xfcbung'), (u'schie\ufb02en', u'schie\xdfen'), (u'schie\ufb02t', u'schie\xdft'), (u'Schiffs\xe9rzte', u'Schiffs\xe4rzte'), (u'Schiffzerstfiren', u'Schiff zerst\xf6ren'), (u'Schifies', u'Schiffes'), (u'Schiidel', u'Sch\xe4del'), (u'schiilzen', u'sch\xe4tzen'), (u'schiin', u'sch\xf6n'), (u'schiine', u'sch\xf6ne'), (u'Schiinen', u'Sch\xf6nen'), (u'Schiiner', u'Sch\xf6ner'), (u'schiines', u'sch\xf6nes'), (u'Schiinheit', u'Sch\xf6nheit'), (u'Schiipfer', u'Sch\xf6pfer'), (u'Schiipfung', u'Sch\xf6pfung'), (u'Schiisse', u'Sch\xfcsse'), (u'Schiitt', u'Sch\xfctt'), (u'Schiittelfrost', u'Sch\xfcttelfrost'), (u'schiitten', u'sch\xfctten'), (u'schiittet', u'sch\xfcttet'), (u'schiitze', u'sch\xe4tze'), (u'schiitzen', u'sch\xfctzen'), (u'schiitzt', u'sch\xfctzt'), (u'schijn', u'sch\xf6n'), (u'Schijnes', u'Sch\xf6nes'), (u'schijng', u'sch\xf6n!'), (u'Schijssel', u'Sch\xfcssel'), (u'schijttelt', u'sch\xfcttelt'), (u'Schijtze', u'Sch\xfctze'), (u'schijtzen', u'sch\xfctzen'), (u'Schildkr\xe9te', u'Schildkr\xf6te'), (u'Schilrze', u'Sch\xfcrze'), (u'Schilsse', u'Sch\xfcsse'), (u'schiltten', u'sch\xfctten'), (u'schiltzen', u'sch\xfctzen'), (u'schimte', u'sch\xe4mte'), (u'Schizophrenia', u'Schizophrenie'), (u'Schi\xe9tze', u'Sch\xe4tze'), (u'Schlachtgetllimmels', u'Schlachtget\xfcmmels'), (u'Schlachtschifl', u'Schlachtschiff'), (u'schlafenl', u'schlafen!'), (u'Schlafk\xe9fern', u'Schlafk\xe4fern'), (u'Schlafmiitzenl', u'Schlafm\xfctzen!'), (u'Schlafm\ufb02tzel', u'Schlafm\xfctze!'), (u'Schlangeng\xe9ttin', u'Schlangeng\xf6ttin'), (u'Schlappschw\xe9nze', u'Schlappschw\xe4nze'), (u'Schlaumeierl', u'Schlaumeier!'), (u'schlechf', u'schlecht'), (u'Schlelistiinde', u'Schie\xdfst\xe4nde'), (u'Schlellen', u'Schie\xdfen'), (u'Schle\ufb02t', u'Schie\xdft'), (u'Schlfilsselparty', u'Schl\xfcsselparty'), (u'Schlfisse', u'Schl\xfcsse'), (u'SchlieBe', u'Schlie\xdfe'), (u'schlieBen', u'schlie\xdfen'), (u'schlieBIich', u'schlie\xdflich'), (u'schlieBlich', u'schlie\xdflich'), (u'SchlieBt', u'Schlie\xdft'), (u'schlief$en', u'schlie\xdfen'), (u'Schlief$lich', u'Schlie\xdflich'), (u'schlief2>lich', u'schlie\xdflich'), (u'schlief3t', u'schlie\xdft'), (u'Schliefie', u'Schlie\xdfe'), (u'schliefien', u'schlie\xdfen'), (u'Schliefilich', u'Schlie\xdflich'), (u'schlieflslich', u'schlie\xdflich'), (u'schliel3en', u'schlie\xdfen'), (u'schliel3lich', u'schlie\xdflich'), (u'Schliel5t', u'Schlie\xdft'), (u'schlielie', u'schlie\xdfe'), (u'schlielien', u'schlie\xdfen'), (u'schlielilich', u'schlie\xdflich'), (u'schliellsen', u'schlie\xdfen'), (u'SchlielSt', u'Schlie\xdft'), (u'Schliissel', u'Schl\xfcssel'), (u'Schliissell', u'Schl\xfcssel!'), (u'Schliisselmoment', u'Schl\xfcsselmoment'), (u'Schliisseln', u'Schl\xfcsseln'), (u'Schlijsse', u'Schl\xfcsse'), (u'Schlijssel', u'Schl\xfcssel'), (u'Schlijsselloch', u'Schl\xfcsselloch'), (u'Schlilssel', u'Schl\xfcssel'), (u'Schlilssell', u'Schl\xfcssel'), (u'Schlilsselparty', u'Schl\xfcsselparty'), (u'schlimmsterAlbtraum', u'schlimmster Albtraum'), (u'Schlle\ufb02en', u'Schlie\xdfen'), (u'Schllisse', u'Sch\xfcsse'), (u'schllitze', u'sch\xfctze'), (u'schllitzen', u'sch\xfctzen'), (u'Schlllissell', u'Schl\xfcssel!'), (u'Schlull', u'Schluss'), (u'Schlupfern', u'Schl\xfcpfern'), (u'Schlusselmoment', u'Schl\xfcsselmoment'), (u'Schlusselszenen', u'Schl\xfcsselszenen'), (u'Schlusselw\xe9rter', u'Schlusselw\xf6rter'), (u'Schlussl', u'Schluss!'), (u'Schlu\xdf', u'Schluss'), (u'Schl\xe9chter', u'Schl\xe4chter'), (u'schl\xe9fst', u'schl\xe4fst'), (u'Schl\xe9ft', u'Schl\xe4ft'), (u'Schl\xe9ge', u'Schl\xe4ge'), (u'Schl\xe9ger', u'Schl\xe4ger'), (u'Schl\xe9gerei', u'Schl\xe4gerei'), (u'schl\xe9gt', u'schl\xe4gt'), (u'schl\xe9ift', u'schl\xe4ft'), (u'schl\xe9igst', u'schl\xe4gst'), (u'Schl\ufb02ssel', u'Schl\xfcssel'), (u'Schmatzger\xe9usche', u'Schmatzger\xe4usche'), (u'SchmeiBt', u'Schmei\xdft'), (u'Schmeif$', u'Schmei\xdf'), (u'Schmeif$t', u'Schmei\xdft'), (u'Schmeifien', u'Schmei\xdfen'), (u'schmeifit', u'schmei\xdft'), (u'Schmeilit', u'Schmei\xdft'), (u'Schmei\ufb02', u'Schmei\xdf'), (u'Schmier\xe9l', u'Schmier\xf6l'), (u'schmiicken', u'schm\xfccken'), (u'schmilztl', u'schmilzt!'), (u'schmi\ufb02', u'schmiss'), (u'Schmuckk\xe9stchen', u'Schmuckk\xe4stchen'), (u'Schmuckstiick', u'Schmuckst\xfcck'), (u'Schnappschijsse', u'Schnappsch\xfcsse'), (u'Schnauzel', u'Schnauze!'), (u'Schneegest\xe9ber', u'Schneegest\xf6ber'), (u'Schneidez\xe9hnen', u'Schneidez\xe4hnen'), (u'Schneidez\xe9ihne', u'Schneidez\xe4hne'), (u'schnellf', u'schnell!'), (u'Schnfiffeln', u'Schn\xfcffeln'), (u'schnfiffelnl', u'schn\xfcffeln!'), (u'schnfiffelst', u'schn\xfcffelst'), (u'Schnfirsenkel', u'Schn\xfcrsenkel'), (u'schniiffele', u'schn\xfcffele'), (u'schnijffelt', u'schn\xfcffelt'), (u'Schnilffeln', u'Schn\xfcffeln'), (u'schnilrt', u'schn\xfcrt'), (u'Schnitzereigesch\xe9ft', u'Schnitzereigesch\xe4ft'), (u'Schniuzer', u'Schn\xe4uzer'), (u'Schnuoki', u'Schnucki'), (u'Schn\xe9ppchen', u'Schn\xe4ppchen'), (u'SchoB', u'Scho\xdf'), (u'Schofk', u'Scho\xdf'), (u'ScholShund', u'Scho\xdfhund'), (u'Schones', u'Sch\xf6nes'), (u'schonl', u'schon!'), (u'schopferische', u'sch\xf6pferische'), (u'scho\xdf', u'schoss'), (u'Schrankw\xe9nde', u'Schrankw\xe4nde'), (u'Schraubenschlijssel', u'Schraubenschl\xfcssel'), (u'schrecklichl', u'schrecklich!'), (u'Schriftist', u'Schrift ist'), (u'Schriftstijcks', u'Schriftst\xfccks'), (u'schr\xe9ge', u'schr\xe4ge'), (u'Schr\xe9ges', u'Schr\xe4ges'), (u'Schr\xe9nke', u'Schr\xe4nke'), (u'Schr\xe9nken', u'Schr\xe4nken'), (u'schtin', u'sch\xf6n'), (u'schtine', u'sch\xf6ne'), (u'Schtisse', u'Sch\xfcsse'), (u'schuchtern', u'sch\xfcchtern'), (u'Schuchterne', u'Sch\xfcchterne'), (u'Schuhl', u'Schuh!'), (u'Schuldgeftihlen', u'Schuldgef\xfchlen'), (u'Schulterl', u'Schulter!'), (u'Schutzen', u'Sch\xfctzen'), (u'Schutzr\xe9ume', u'Schutzr\xe4ume'), (u'SCHUTZT', u'SCH\xdcTZT'), (u"Schw6r's", u"Schw\xf6r's"), (u'Schwachkop\ufb02', u'Schwachkop!'), (u'Schwanzlutscherl', u'Schwanzlutscher!'), (u'Schwarzh\xe9ndler', u'Schwarzh\xe4ndler'), (u'Schwarzweills', u'Schwarzwei\xdf'), (u'schwei\ufb02durchnisst', u'schwei\xdfdurchn\xe4sst'), (u'schwerh\xe9rig', u'schwerh\xf6rig'), (u'schwiicht', u'schw\xe4cht'), (u'schwiire', u'schw\xf6re'), (u'schwiiren', u'schw\xf6ren'), (u'Schwimmanziige', u'Schwimmanz\xfcge'), (u'schwi\xe9rmten', u'schw\xe4rmten'), (u'schwnre', u'schw\xf6re'), (u'Schw\xe9che', u'Schw\xe4che'), (u'Schw\xe9chen', u'Schw\xe4chen'), (u'schw\xe9cher', u'schw\xe4cher'), (u'schw\xe9cheren', u'schw\xe4cheren'), (u'schw\xe9chsten', u'schw\xe4chsten'), (u'Schw\xe9icheanfall', u'Schw\xe4cheanfall'), (u'Schw\xe9ichen', u'Schw\xe4chen'), (u'schw\xe9icher', u'schw\xe4cher'), (u'Schw\xe9ichling', u'Schw\xe4chling'), (u'Schw\xe9irmerei', u'Schw\xe4rmerei'), (u'schw\xe9irzeste', u'schw\xe4rzeste'), (u'Schw\xe9mme', u'Schw\xe4mme'), (u'schw\xe9re', u'schw\xf6re'), (u'schw\xe9ren', u'schw\xf6ren'), (u'Schw\xe9rme', u'Schw\xe4rme'), (u'schw\xe9rmt', u'schw\xe4rmt'), (u'schw\xe9rmte', u'schw\xe4rmte'), (u'Schw\xe9tzer', u'Schw\xe4tzer'), (u'sch\xe9biger', u'sch\xe4biger'), (u'Sch\xe9del', u'Sch\xe4del'), (u'Sch\xe9den', u'Sch\xe4den'), (u'Sch\xe9inder', u'Sch\xe4nder'), (u'sch\xe9ine', u'sch\xf6ne'), (u'sch\xe9inen', u'sch\xf6nen'), (u'Sch\xe9iner', u'Sch\xf6ner'), (u'sch\xe9irfen', u'sch\xe4rfen'), (u'sch\xe9le', u'sch\xe4le'), (u'sch\xe9me', u'sch\xe4me'), (u'Sch\xe9n', u'Sch\xf6n'), (u'sch\xe9ne', u'sch\xf6ne'), (u'Sch\xe9nen', u'Sch\xf6nen'), (u'Sch\xe9ner', u'Sch\xf6ner'), (u'Sch\xe9nes', u'Sch\xf6nes'), (u'Sch\xe9nheit', u'Sch\xf6nheit'), (u'sch\xe9nl', u'sch\xf6n!'), (u'sch\xe9nste', u'sch\xf6nste'), (u'sch\xe9nsten', u'sch\xf6nsten'), (u'sch\xe9nstes', u'sch\xf6nstes'), (u'Sch\xe9tzchen', u'Sch\xe4tzchen'), (u'Sch\xe9tze', u'Sch\xe4tze'), (u'sch\xe9tzen', u'sch\xe4tzen'), (u'sch\xe9tzt', u'sch\xe4tzt'), (u'Sch\xe9tzung', u'Sch\xe4tzung'), (u'Sch\xe9umen', u'Sch\xe4umen'), (u'sch\ufb02chtern', u'sch\xfcchtern'), (u"SCl'1lUSS6l", u'Schl\xfcssel'), (u'Scllrift', u'Schrift'), (u'scmoss', u'SCHLOSS'), (u'se/n', u'sein'), (u'Se/wen', u'Sehen'), (u'sehenl', u'sehen!'), (u'Sehenswlllrdigkeiten', u'Sehensw\xfcrdigkeiten'), (u'Sehnsilchte', u'Sehns\xfcchte'), (u'sehrangespannt', u'sehr angespannt'), (u'sehrjung', u'sehr jung'), (u'Sehrwohl', u'Sehr wohl'), (u'sehrzufrieden', u'sehr zufrieden'), (u'sehtjetzt', u'seht jetzt'), (u'Seidenglattl', u'Seidenglatt!'), (u'seidjetzt', u'seid jetzt'), (u'Seitwann', u'Seit wann'), (u'SEKRETARIN', u'SEKRET\xc4RIN'), (u'Sekretiir', u'Sekret\xe4r'), (u'Sekretir', u'Sekret\xe4r'), (u'Sekret\xe9irin', u'Sekret\xe4rin'), (u'Sekret\xe9rin', u'Sekret\xe4rin'), (u'sel/g', u'selig'), (u'selbstl', u'selbst!'), (u'selbststiindig', u'selbstst\xe4ndig'), (u'selbstsuchtige', u'selbsts\xfcchtige'), (u'selbstverstindlich', u'selbstverst\xe4ndlich'), (u'Selbstverstlndlich', u'Selbstverst\xe4ndlich'), (u'Selbstverst\xe9indlich', u'Selbstverst\xe4ndlich'), (u'Selbstverst\xe9ndlich', u'Selbstverst\xe4ndlich'), (u'seld', u'seid'), (u'selhst', u'selbst'), (u'SeligerVater', u'Seliger Vater'), (u'seln', u'sein'), (u'Selt', u'Seit'), (u'sentimalen', u'sentimentalen'), (u'seri\xe9ser', u'seri\xf6ser'), (u'Sexualit\xe9t', u'Sexualit\xe4t'), (u'Sfe', u'Sie'), (u'Sfidamerikas', u'S\xfcdamerikas'), (u'Sfidwind', u'S\xfcdwind'), (u'Sfifies', u'S\xfc\xdfes'), (u'Sfihne', u'S\xf6hne'), (u'Sfildner', u'S\xf6ldner'), (u'Sfilie', u'S\xfc\xdfe'), (u'Sfilieste', u'S\xfc\xdfeste'), (u'Sfi\ufb02igkeiten', u'S\xfc\xdfigkeiten'), (u'sfnd', u'sind'), (u'SICHERHEITSBEHORDE', u'SICHERHEITSBEH\xd6RDE'), (u'Sicherheitsgrijnden', u'Sicherheitsgr\xfcnden'), (u'Sichtubervvachung', u'Sicht\xfcberwachung'), (u'Sichtunterstutzung', u'Sichtunterst\xfctzung'), (u'Sieja', u'Sie ja'), (u'Sifihnchen', u'S\xf6hnchen'), (u'Signalst\xe9rke', u'Signalst\xe4rke'), (u'Siiden', u'S\xfcden'), (u'Siidfrankreich', u'S\xfcdfrankreich'), (u'siidliche', u's\xfcdliche'), (u'siil$', u's\xfc\xdf'), (u'siili', u's\xfc\xdf'), (u'Siilie', u'S\xfc\xdfe'), (u'siilier', u's\xfc\xdfer'), (u"SIim's", u"Slim's"), (u'Siinde', u'S\xfcnde'), (u'Siinden', u'S\xfcnden'), (u'Siinder', u'S\xfcnder'), (u'siindigen', u's\xfcndigen'), (u'sii\ufb02en', u's\xfc\xdfen'), (u'siJB', u's\xfc\xdf'), (u'SiJBe', u'S\xfc\xdfe'), (u'siJchtige', u's\xfcchtige'), (u'sijlien', u'si\xfc\xdfen'), (u'sijliesten', u's\xfc\xdfesten'), (u'Sijsser', u'S\xfc\xdfer'), (u'Sildtunnel', u'S\xfcdtunnel'), (u'Silfie', u'S\xfc\xdfe'), (u'Silfier', u'S\xfc\xdfer'), (u'Silfies', u'S\xfc\xdfes'), (u'silfker', u's\xfc\xdfer'), (u'Silnden', u'S\xfcnden'), (u'Silndenbock', u'S\xfcndenbock'), (u'sindja', u'sind ja'), (u'Sirl', u'Sir!'), (u'Sj_r', u'Sir'), (u'Skilaufen', u'Ski laufen'), (u'skrupelloserAnw\xe9lte', u'skrupelloser Anw\xe4lte'), (u"sL'lf$e", u's\xfc\xdfe'), (u'sL1B', u's\xfc\xdf'), (u'slch', u'sich'), (u'sle', u'sie'), (u'slebe', u'siebe'), (u'sLif$', u's\xfc\xdf'), (u'SLif$e', u'S\xfc\xdfe'), (u'SLif$er', u'S\xfc\xdfer'), (u'sLif$es', u's\xfc\xdfes'), (u'SLilSe', u'S\xfc\xdfe'), (u'Slliden', u'S\xfcden'), (u'Sllinde', u'S\xfcnde'), (u'sllindigen', u's\xfcndigen'), (u'Slnd', u'Sind'), (u'Slr', u'Sir'), (u'Slrs', u'Sirs'), (u'SoBen', u'So\xdfen'), (u'sofortl', u'sofort!'), (u'soh\xe9nen', u'sch\xf6nen'), (u'Solien', u'So\xdfen'), (u'sollenl', u'sollen!'), (u'SONDERMULL', u'SONDERM\xdcLL'), (u'sorgf\xe9iltig', u'sorgf\xe4ltig'), (u'sorgf\xe9ltig', u'sorgf\xe4ltig'), (u'souver\xe9ine', u'souver\xe4ne'), (u'souver\xe9inen', u'souver\xe4nen'), (u'souver\xe9ner', u'souver\xe4ner'), (u"sp'a'ter", u'sp\xe4ter'), (u'sp/elen', u'spielen'), (u'SpaB', u'Spa\xdf'), (u'Spaf$', u'Spa\xdf'), (u'Spaf2>', u'Spa\xdf'), (u'Spaffs', u'Spa\xdf'), (u'Spafi', u'Spa\xdf'), (u'Spafls', u'Spa\xdf'), (u'SpafS', u'Spa\xdf'), (u"Spal'5", u'Spa\xdf'), (u'Spal2>', u'Spa\xdf'), (u'Spal3', u'Spa\xdf'), (u'Spali', u'Spa\xdf'), (u'Spall', u'Spa\xdf'), (u'Spass', u'Spa\xdf'), (u'spat', u'sp\xe4t'), (u'spektakular', u'spektakul\xe4r'), (u'Spell', u'Sp\xe4\xdf'), (u'Spells', u'Sp\xe4\xdf'), (u'Spell\xbb', u'Spa\xdf'), (u'Spezialit\xe9t', u'Spezialit\xe4t'), (u'spfit', u'sp\xe4t'), (u'SpieB', u'Spie\xdf'), (u'spief$ig', u'spie\xdfig'), (u'Spielzeuggeschfiftn', u'Spielzeuggesch\xe4ft--'), (u'spiilte', u'sp\xfclte'), (u'spiiren', u'sp\xfcren'), (u'spiirt', u'sp\xfcrt'), (u'spiit', u'sp\xe4t'), (u'spijre', u'sp\xfcre'), (u'spijren', u'sp\xfcren'), (u'spijrt', u'sp\xfcrt'), (u'Spillmeier', u'Sp\xfclmeier'), (u'spilre', u'sp\xfcre'), (u'spilren', u'sp\xfcren'), (u'spit', u'sp\xe4t'), (u'Spitzenfriihstiick', u'Spitzenfr\xfchst\xfcck'), (u"spLir's", u"sp\xfcr's"), (u'splliren', u'sp\xfcren'), (u'splter', u'sp\xe4ter'), (u'Sportilbertragung', u'Sport\xfcbertragung'), (u'Sportsfraund', u'Sportsfreund'), (u'Sprachpijppchen', u'Sprachp\xfcppchen'), (u'SPRACHPUPPCHEN', u'SPRACHP\xdcPPCHEN'), (u'Spriichlein', u'Spr\xfcchlein'), (u'Sprilht', u'Spr\xfcht'), (u'spr\xe9che', u'spr\xe4che'), (u'spr\xe9chen', u'spr\xe4chen'), (u'spr\xe9chet', u'spr\xe4chet'), (u'Spr\ufb02che', u'Spr\xfcche'), (u'spr\ufb02ht', u'spr\xfcht'), (u'spUl', u'sp\xfcl'), (u'spUr', u'sp\xfcr'), (u'spurbare', u'sp\xfcrbare'), (u'spUrt', u'sp\xfcrt'), (u'sp\xa7ter', u'sp\xe4ter'), (u'Sp\xe4\xdf', u'Spa\xdf'), (u'sp\xe9it', u'sp\xe4t'), (u'sp\xe9iter', u'sp\xe4ter'), (u'sp\xe9t', u'sp\xe4t'), (u'Sp\xe9ter', u'Sp\xe4ter'), (u'Sp\xe9tzchen', u'Sp\xe4tzchen'), (u'Sp\xe9tzchenl', u'Sp\xe4tzchen!'), (u'ssh', u'sah'), (u'st6Bt', u'st\xf6\xdft'), (u'st6hnt', u'st\xf6hnt'), (u'st6lSt', u'st\xf6\xdft'), (u'St6rt', u'St\xf6rt'), (u'ST@HNT', u'ST\xd6HNT'), (u'Staatsaff\xe9ren', u'Staatsaff\xe4ren'), (u'staatsbllirgerliches', u'staatsb\xfcrgerliches'), (u'Staatsgesch\xe9fte', u'Staatsgesch\xe4fte'), (u'Standardan\xe9sthesie', u'Standardan\xe4sthesie'), (u'standig', u'st\xe4ndig'), (u'STARSCREAMI', u'STARSCREAM:'), (u'station\xe9r', u'station\xe4r'), (u'Statusmeldungl', u'Statusmeldung!'), (u'stdrte', u'st\xf6rte'), (u'stecktjede', u'steckt jede'), (u'Stehenbleiben', u'Stehen bleiben'), (u'Stehvermiigen', u'Stehverm\xf6gen'), (u'Steigbilgeldinger', u'Steigb\xfcgeldinger'), (u'Steinh\xe9user', u'Steinh\xe4user'), (u'Sternenkijsse', u'Sternenk\xfcsse'), (u'Steuererkl\xe9rung', u'Steuererkl\xe4rung'), (u'Steuererkl\xe9rungen', u'Steuererkl\xe4rungen'), (u'Steuerprtifer', u'Steuerpr\xfcfer'), (u'Steuerprtifung', u'Steuerpr\xfcfung'), (u'Steuersiitzen', u'Steuers\xe4tzen'), (u'stfipseln', u'st\xf6pseln'), (u'stfiren', u'st\xf6ren'), (u'stfirker', u'st\xe4rker'), (u'Stfirt', u'St\xf6rt'), (u'stfirzt', u'st\xfcrzt'), (u'stieB', u'stie\xdf'), (u'Stiefbriider', u'Stiefbr\xfcder'), (u'Stiicke', u'St\xfccke'), (u'Stiihle', u'St\xfchle'), (u'Stiihlen', u'St\xfchlen'), (u'stiihnt', u'st\xf6hnt'), (u'Stiillen', u'St\xe4llen'), (u'Stiire', u'St\xf6re'), (u'stiiren', u'st\xf6ren'), (u'Stiirme', u'St\xfcrme'), (u'stiirmischen', u'st\xfcrmischen'), (u'Stiirsignale', u'St\xf6rsignale'), (u'stiirt', u'st\xf6rt'), (u'Stiirung', u'St\xf6rung'), (u'stiirzen', u'st\xfcrzen'), (u'Stiitzpunkt', u'St\xfctzpunkt'), (u'Stijck', u'St\xfcck'), (u'Stijckchen', u'St\xfcckchen'), (u'Stijcke', u'St\xfccke'), (u'stijhle', u'st\xfchle'), (u'stijrme', u'st\xfcrme'), (u'stijrzen', u'st\xfcrzen'), (u'Stilck', u'St\xfcck'), (u'Stilcke', u'St\xfccke'), (u'Stillckchen', u'St\xfcckchen'), (u'Stillst\xe9nde', u'Stillst\xe4nde'), (u'Stilvolll', u'Stilvoll!'), (u'stinden', u'st\xe4nden'), (u'Stldseite', u'S\xfcdseite'), (u'stleg', u'stieg'), (u'Stllihle', u'St\xfchle'), (u'Stllirmen', u'St\xfcrmen'), (u'stllirzt', u'st\xfcrzt'), (u'stlllrzen', u'st\xfcrzen'), (u'Stl\ufb02', u'Stift'), (u'sto/3en', u'sto\xdfen'), (u'StoB', u'Sto\xdf'), (u'stoBe', u'sto\xdfe'), (u'stof$en', u'sto\xdfen'), (u'Stofi', u'Sto\xdf'), (u'STOHNT', u'ST\xd6HNT'), (u'Stol3zahn', u'Sto\xdfzahn'), (u'Stol3zeit', u'Sto\xdfzeit'), (u'stolie', u'sto\xdfe'), (u'Storung', u'St\xf6rung'), (u'Str6men', u'Str\xf6men'), (u'str6mt', u'str\xf6mt'), (u'StraBe', u'Stra\xdfe'), (u'StraBen', u'Stra\xdfen'), (u'StraBenk6tern', u'Stra\xdfenk\xf6tern'), (u'Straf$e', u'Stra\xdfe'), (u'Strafiengang', u'Stra\xdfengang'), (u'Strafienratten', u'Stra\xdfenratten'), (u'Strafienschlacht', u'Stra\xdfenschlacht'), (u'Straflsenecke', u'Stra\xdfenecke'), (u'Straflsenmaler', u'Stra\xdfenmaler'), (u'Straflsenschilder', u'Stra\xdfenschilder'), (u'Straft\xe9ter', u'Straft\xe4ter'), (u'Strahlenschutzger\xe9t', u'Strahlenschutzger\xe4t'), (u'Strahlungsintensit\xe9t', u'Strahlungsintensit\xe4t'), (u'Stral3en', u'Stra\xdfen'), (u'Stral5e', u'Stra\xdfe'), (u'Stralie', u'Stra\xdfe'), (u'Straliengang', u'Stra\xdfengang'), (u'Stralienk\xe9ter', u'Stra\xdfenk\xf6ter'), (u'Straliensperre', u'Stra\xdfensperre'), (u'Streitkr\xe9fte', u'Streitkr\xe4fte'), (u'Streitkr\xe9ften', u'Streitkr\xe4ften'), (u'Streit\xe9xte', u'Streit\xe4xte'), (u'strfimten', u'str\xf6mten'), (u'Striimen', u'Str\xf6men'), (u'Striimungen', u'Str\xf6mungen'), (u'Stromschliige', u'Stromschl\xe4ge'), (u'Stromschnellenl', u'Stromschnellen!'), (u'Stromung', u'Str\xf6mung'), (u'Strullerl', u'Struller!'), (u'Str\xe9mung', u'Str\xf6mung'), (u'Str\xe9mungen', u'Str\xf6mungen'), (u'sturzte', u'st\xfcrzte'), (u'STUTZPUNKT', u'ST\xdcTZPUNKT'), (u'St\xe9be', u'St\xe4be'), (u'st\xe9hnt', u'st\xf6hnt'), (u'st\xe9hnte', u'st\xf6hnte'), (u'St\xe9idtchen', u'St\xe4dtchen'), (u'St\xe9idte', u'St\xe4dte'), (u'st\xe9indig', u'st\xe4ndig'), (u'St\xe9irke', u'St\xe4rke'), (u'st\xe9irker', u'st\xe4rker'), (u'St\xe9irkeres', u'St\xe4rkeres'), (u'st\xe9llst', u'st\xf6\xdft'), (u'St\xe9ndchen', u'St\xe4ndchen'), (u'St\xe9nder', u'St\xe4nder'), (u'St\xe9ndig', u'St\xe4ndig'), (u'st\xe9pseln', u'st\xf6pseln'), (u'st\xe9ren', u'st\xf6ren'), (u'St\xe9rke', u'St\xe4rke'), (u'St\xe9rken', u'St\xe4rken'), (u'st\xe9rker', u'st\xe4rker'), (u'St\xe9rkere', u'St\xe4rkere'), (u'st\xe9rkeres', u'st\xe4rkeres'), (u'st\xe9rkste', u'st\xe4rkste'), (u'st\xe9rst', u'st\xf6rst'), (u'st\xe9rt', u'st\xf6rt'), (u'St\xe9rung', u'St\xf6rung'), (u'St\xe9tten', u'St\xe4tten'), (u'St\ufb02ck', u'St\xfcck'), (u'St\ufb02hlen', u'St\xfchlen'), (u'sUB', u's\xfc\xdf'), (u'sUBe', u's\xfc\xdfe'), (u'Suchfeam', u'Suchteam'), (u'SUden', u'S\xfcden'), (u'Sudseite', u'S\xfcdseite'), (u'Sudwest', u'S\xfcdwest'), (u'sUf$', u's\xfc\xdf'), (u'SUf$e', u'S\xfc\xdfe'), (u'suMM\u2020', u'SUMMT'), (u'Suohet', u'Suchet'), (u'Superkr\xe9fte', u'Superkr\xe4fte'), (u'superl\xe9cherlich', u'superl\xe4cherlich'), (u"s\xa2'il3", u's\xfc\xdf'), (u'S\xe9cke', u'S\xe4cke'), (u'S\xe9ge', u'S\xe4ge'), (u's\xe9he', u's\xe4he'), (u'S\xe9hne', u'S\xf6hne'), (u'S\xe9hnen', u'S\xf6hnen'), (u'S\xe9icke', u'S\xe4cke'), (u'S\xe9inger', u'S\xe4nger'), (u'S\xe9iulen', u'S\xe4ulen'), (u'S\xe9ldner', u'S\xf6ldner'), (u's\xe9mfl/che', u's\xe4mtliche'), (u's\xe9mtliche', u's\xe4mtliche'), (u's\xe9mtlichen', u's\xe4mtlichen'), (u'S\xe9nger', u'S\xe4nger'), (u'S\xe9ngerin', u'S\xe4ngerin'), (u's\xe9ubern', u's\xe4ubern'), (u's\xe9uft', u's\xe4uft'), (u's\xe9ugen', u's\xe4ugen'), (u'S\xe9ulen', u'S\xe4ulen'), (u'S\xe9urewannen', u'S\xe4urewannen'), (u'S\ufb02dh\xe9ingen', u'S\xfcdh\xe4ngen'), (u'T6chter', u'T\xf6chter'), (u'T6pfchen', u'T\xf6pfchen'), (u'T6rn', u'T\xf6rn'), (u'T6rtchen', u'T\xf6rtchen'), (u't6te', u't\xf6te'), (u'T6ten', u'T\xf6ten'), (u't6tet', u't\xf6tet'), (u'TANZERINNEN', u'T\xc4NZERINNEN'), (u'Tater', u'T\xe4ter'), (u'tats\xe9chlich', u'tats\xe4chlich'), (u'tats\xe9chliche', u'tats\xe4chliche'), (u'tats\xe9ichlich', u'tats\xe4chlich'), (u'Tatverd\xe9ichtigen', u'Tatverd\xe4chtigen'), (u'Tauchg\xe9inge', u'Tauchg\xe4nge'), (u'Tauchg\xe9nge', u'Tauchg\xe4nge'), (u'Tauschgesch\xe9fte', u'Tauschgesch\xe4fte'), (u'Tauschgesch\xe9\ufb02e', u'Tauschgesch\xe4fte'), (u'Tbrn', u'T\xf6rn'), (u'tbten', u't\xf6ten'), (u'tdten', u't\xf6ten'), (u'tdtete', u't\xf6tete'), (u'Telefongespr\xe9che', u'Telefongespr\xe4che'), (u'Tempelsch\xe9nderf', u'Tempelsch\xe4nder!'), (u'TemPO', u'Tempo'), (u'TESTGELANDE', u'TESTGEL\xc4NDE'), (u'Testvorf\ufb02hrungen', u'Testvorf\xfchrungen'), (u'tfidlich', u't\xf6dlich'), (u'tfiitet', u't\xf6tet'), (u'Tfir', u'T\xfcr'), (u'tfirkischen', u't\xfcrkischen'), (u'Tfite', u'T\xfcte'), (u'Theaterstfick', u'Theaterst\xfcck'), (u'Therapiel', u'Therapie!'), (u'Thermalger\xe9t', u'Thermalger\xe4t'), (u'Thronr\xe9uber', u'Thronr\xe4uber'), (u'Thronr\xe9uberin', u'Thronr\xe4uberin'), (u'Tiefkilhlung', u'Tiefk\xfchlung'), (u'Tiefktih/system', u'Tiefk\xfchlsystem'), (u'Tiefktihleind\xe9mmung', u'Tiefk\xfchleind\xe4mmung'), (u'TIEFKUHL', u'TIEFK\xdcHL'), (u'Tiefkuhlstasis', u'Tiefk\xfchlstasis'), (u'Tiefkuhlung', u'Tiefk\xfchlung'), (u'tiglich', u't\xe4glich'), (u'tiichtige', u't\xfcchtige'), (u'tiint', u't\xf6nt'), (u'Tiipfchen', u'T\xf6pfchen'), (u'Tiipfchennummer', u'T\xf6pfchennummer'), (u'Tiir', u'T\xfcr'), (u'Tiiren', u'T\xfcren'), (u'Tiirl', u'T\xfcr!'), (u'Tiirme', u'T\xfcrme'), (u'tiite', u't\xf6te'), (u'Tiite', u'T\xfcte'), (u'tiiten', u't\xf6ten'), (u'tiitet', u't\xf6tet'), (u'tiitete', u't\xf6tete'), (u'TiJr', u'T\xfcr'), (u'Tijrme', u'T\xfcrme'), (u'Tilr', u'T\xfcr'), (u'Tilrglocke', u'T\xfcrglocke'), (u'Tilrklingel', u'T\xfcrklingel'), (u'Tilr\xe9ffner', u'T\xfcr\xf6ffner'), (u'Tippger\xe9usch', u'Tippger\xe4usch'), (u'Tischlenuerkstatt', u'Tischlerwerkstatt'), (u"TL'lr", u'T\xfcr'), (u'tlglich', u't\xe4glich'), (u'Tllir', u'T\xfcr'), (u'Tllirkei', u'T\xfcrkei'), (u'Tlllpfelchen', u'T\xfcpfelchen'), (u'TOILETTENSPULUNG', u'TOILETTENSP\xdcLUNG'), (u'Tonl', u'Ton'), (u'Toreroabs\xe9tze', u'Toreroabs\xe4tze'), (u'Tortenb\xe9ickerin', u'Tortenb\xe4ckerin'), (u'Tragfidie', u'Trag\xf6die'), (u'Tragiidie', u'Trag\xf6die'), (u'Trag\xe9die', u'Trag\xf6die'), (u'Trainingsijbung', u'Trainings\xfcbung'), (u'TRAUMKCRPER', u'TRAUMK\xd6RPER'), (u'treffan', u'treffen'), (u'trfiumen', u'tr\xe4umen'), (u'Tribiinen', u'Trib\xfcnen'), (u"trif'f't", u'trifft'), (u'trigt', u'tr\xe4gt'), (u'Triibsal', u'Tr\xfcbsal'), (u'Triimmem', u'Tr\xfcmmern'), (u'triistllch', u'tr\xf6stlich'), (u'Triistungen', u'Tr\xf6stungen'), (u'Triiume', u'Tr\xe4ume'), (u'Trilmmer', u'Tr\xfcmmer'), (u'triume', u'tr\xe4ume'), (u'Trockenger\xe9ite', u'Trockenger\xe4te'), (u'Trockenger\xe9te', u'Trockenger\xe4te'), (u'Tropfsteinhiihle', u'Tropfsteinh\xf6hle'), (u'Trottell', u'Trottel!'), (u'Trubsal', u'Tr\xfcbsal'), (u'tr\xe9ge', u'tr\xe4ge'), (u'Tr\xe9gerschiff', u'Tr\xe4gerschiff'), (u'tr\xe9gt', u'tr\xe4gt'), (u'Tr\xe9igerschiff', u'Tr\xe4gerschiff'), (u'tr\xe9igt', u'tr\xe4gt'), (u'tr\xe9ium', u'tr\xe4um'), (u'tr\xe9iume', u'tr\xe4ume'), (u'tr\xe9iumen', u'tr\xe4umen'), (u'tr\xe9iumt', u'tr\xe4umt'), (u'tr\xe9llert', u'tr\xe4llert'), (u'Tr\xe9ne', u'Tr\xe4ne'), (u'Tr\xe9nen', u'Tr\xe4nen'), (u'Tr\xe9um', u'Tr\xe4um'), (u'tr\xe9ume', u'tr\xe4ume'), (u'Tr\xe9umen', u'Tr\xe4umen'), (u'Tr\xe9umer', u'Tr\xe4umer'), (u'tr\xe9umst', u'tr\xe4umst'), (u'Tr\xe9umt', u'Tr\xe4umt'), (u'Tschiiss', u'Tsch\xfcss'), (u'Tschiissl', u'Tsch\xfcss!'), (u'tschijss', u'tsch\xfcss'), (u'Tschtiss', u'Tsch\xfcss'), (u'tsch\xfc\xdf', u'tsch\xfcss'), (u'Tsch\ufb02s', u'Tsch\xfcs'), (u'Ttir', u'T\xfcr'), (u'ttlckisch', u't\xfcckisch'), (u'Ttlte', u'T\xfcte'), (u'tubul\xe9re', u'tubul\xe4re'), (u'Tupperschiissel', u'Tuppersch\xfcssel'), (u'TUR', u'T\xdcR'), (u'TUr', u'T\xfcr'), (u'Turen', u'T\xfcren'), (u'TURKEI', u'T\xdcRKEI'), (u'Turmwiichter', u'Turmw\xe4chter'), (u'tutjetzt', u'tut jetzt'), (u'typlschl', u'typlsch!'), (u'T\xe9chter', u'T\xf6chter'), (u't\xe9d/ichen', u't\xf6dlichen'), (u't\xe9dlich', u't\xf6dlich'), (u't\xe9dliche', u't\xf6dliche'), (u't\xe9dlichen', u't\xf6dlichen'), (u't\xe9glich', u't\xe4glich'), (u't\xe9glichen', u't\xe4glichen'), (u't\xe9iglich', u't\xe4glich'), (u't\xe9itowieren', u't\xe4towieren'), (u't\xe9itowierte', u't\xe4towierte'), (u'T\xe9itowierung', u'T\xe4towierung'), (u't\xe9iuschen', u't\xe4uschen'), (u'T\xe9ler', u'T\xe4ler'), (u'T\xe9lpell', u'T\xf6lpel!'), (u'T\xe9nze', u'T\xe4nze'), (u'T\xe9nzerin', u'T\xe4nzerin'), (u'T\xe9pfchen', u'T\xf6pfchen'), (u'T\xe9pfchenquatsch', u'T\xf6pfchenquatsch'), (u'T\xe9pfchensache', u'T\xf6pfchensache'), (u't\xe9te', u't\xf6te'), (u'T\xe9ten', u'T\xf6ten'), (u't\xe9test', u't\xe4test'), (u't\xe9tet', u't\xf6tet'), (u't\xe9tete', u't\xf6tete'), (u't\xe9towieren', u't\xe4towieren'), (u't\xe9towierte', u't\xe4towierte'), (u'T\xe9towierung', u'T\xe4towierung'), (u'T\xe9towierungen', u'T\xe4towierungen'), (u't\xe9uschen', u't\xe4uschen'), (u't\xe9uscht', u't\xe4uscht'), (u'T\xe9uschung', u'T\xe4uschung'), (u'T\xe9uschungsman\xe9ver', u'T\xe4uschungsman\xf6ver'), (u"Ub6FpFUfl'T1al", u'\xfcberpr\xfcf'), (u"Ub6l'pl'Uf\u20ac", u'\xdcberpr\xfcfe'), (u'Ube', u'\xdcbe'), (u'Ubel', u'\xfcbel'), (u'Ubelkeit', u'\xdcbelkeit'), (u'Ubelt\xe9ter', u'\xdcbelt\xe4ter'), (u'Uben', u'\xdcben'), (u'Uben/vachen', u'\xdcberwachen'), (u'Uben/vacher', u'\xdcberwacher'), (u'Uben/vacht', u'\xdcberwacht'), (u'Uben/vachungen', u'\xdcberwachungen'), (u'Uben/vachungsgesetz', u'\xdcberwachungsgesetz'), (u'Uben/vinden', u'\xfcberwinden'), (u'Uber', u'\xfcber'), (u'UBER', u'\xdcBER'), (u'Uberall', u'\xfcberall'), (u'Uberanstrenge', u'\xfcberanstrenge'), (u'Uberanstrengung', u'\xdcberanstrengung'), (u'Uberarbeiten', u'\xdcberarbeiten'), (u'UberAuf$erirdische', u'\xfcber Au\xdferirdische'), (u'Uberaus', u'\xfcberaus'), (u'Uberbleibsel', u'\xdcberbleibsel'), (u'Uberblick', u'\xdcberblick'), (u'Uberbringe', u'\xfcberbringe'), (u'Uberdauern', u'\xfcberdauern'), (u'Uberdecken', u'\xfcberdecken'), (u'Ubereinstimmung', u'\xdcbereinstimmung'), (u'Uberfahren', u'\xfcberfahren'), (u'Uberfall', u'\xdcberfall'), (u'Uberflilssig', u'\xfcberfl\xfcssig'), (u'Ubergabe', u'\xdcbergabe'), (u'Ubergaben', u'\xdcbergaben'), (u'Ubergabepunkt', u'\xdcbergabepunkt'), (u'Ubergangen', u'\xfcbergangen'), (u'Ubergangsweise', u'\xfcbergangsweise'), (u'Ubergeben', u'\xfcbergeben'), (u'Ubergehen', u'\xfcbergehen'), (u'Uberhaupt', u'\xdcberhaupt'), (u'Uberholt', u'\xdcberholt'), (u'Uberholter', u'\xfcberholter'), (u'Uberh\xe9rt', u'\xfcberh\xf6rt'), (u'Uberjemanden', u'\xfcber jemanden'), (u'Uberlagerungs', u'\xdcberlagerungs'), (u'Uberlandleitungen', u'\xdcberlandleitungen'), (u'Uberlass', u'\xdcberlass'), (u'Uberlasse', u'\xfcberlasse'), (u'Uberlassen', u'\xfcberlassen'), (u'Uberlassenl', u'\xfcberlassen!'), (u'Uberlasteten', u'\xdcberlasteten'), (u'Uberleben', u'\xdcberleben'), (u'Uberlebende', u'\xdcberlebende'), (u'Uberlebenden', u'\xdcberlebenden'), (u'Uberlebenschancen', u'\xdcberlebenschancen'), (u'Uberlebenswichtigen', u'\xfcberlebenswichtigen'), (u'Uberlebt', u'\xfcberlebt'), (u'Uberleg', u'\xfcberleg'), (u'Uberlegen', u'\xdcberlegen'), (u'Uberlegenheit', u'\xdcberlegenheit'), (u'uberlegt', u'\xfcberlegt'), (u'Uberlegten', u'\xfcberlegten'), (u'Uberleiten', u'\xfcberleiten'), (u'Uberleitung', u'\xdcberleitung'), (u'Uberlieferungen', u'\xdcberlieferungen'), (u'Uberl\xe9sst', u'\xfcberl\xe4sst'), (u'Uberm', u'\xfcberm'), (u'Ubermorgen', u'\xdcbermorgen'), (u'Ubernachtungsgast', u'\xdcbernachtungsgast'), (u'Ubernahm', u'\xfcbernahm'), (u'Ubernahme', u'\xdcbernahme'), (u'Ubernahmen', u'\xfcbernahmen'), (u'Ubernehme', u'\xfcbernehme'), (u'Ubernehmen', u'\xfcbernehmen'), (u'Ubernimmst', u'\xfcbernimmst'), (u'ubernimmt', u'\xfcbernimmt'), (u'Ubernommen', u'\xfcbernommen'), (u'Uberpriifen', u'\xfcberpr\xfcfen'), (u'Uberprilfen', u'\xfcberpr\xfcfen'), (u'Uberprliifen', u'\xdcberpr\xfcfen'), (u'Uberprufe', u'\xfcberpr\xfcfe'), (u'Uberprufen', u'\xfcberpr\xfcfen'), (u'Uberpruft', u'\xfcberpr\xfcft'), (u'Uberraschend', u'\xdcberraschend'), (u'Uberrascht', u'\xdcberrascht'), (u'Uberraschte', u'\xdcberraschte'), (u'Uberraschter', u'\xfcberraschter'), (u'Uberraschung', u'\xdcberraschung'), (u'Uberraschungen', u'\xdcberraschungen'), (u'Uberraschungl', u'\xdcberraschung!'), (u'Uberreagiert', u'\xfcberreagiert'), (u'Uberreden', u'\xfcberreden'), (u'Uberredet', u'\xdcberredet'), (u'Uberreste', u'\xdcberreste'), (u'Uberrumpeln', u'\xfcberrumpeln'), (u'Uberrumple', u'\xdcberrumple'), (u'Ubers', u'\xfcbers'), (u'Uberschl\xe9gt', u'\xdcberschl\xe4gt'), (u'Uberschreiten', u'\xdcberschreiten'), (u'Uberschritten', u'\xfcberschritten'), (u'Uberschwemmung', u'\xdcberschwemmung'), (u'Ubersehen', u'\xfcbersehen'), (u'Ubersensibilit\xe9t', u'\xdcbersensibilit\xe4t'), (u'Ubersetzung', u'\xdcbersetzung'), (u'Uberspannte', u'\xfcberspannte'), (u'Uberspielt', u'\xfcberspielt'), (u'Uberstehen', u'\xdcberstehen'), (u'Ubersteigerten', u'\xfcbersteigerten'), (u'Ubersteigt', u'\xfcbersteigt'), (u'Uberstunden', u'\xdcberstunden'), (u'Ubertraf', u'\xfcbertraf'), (u'UBERTRAGEN', u'\xdcBERTRAGEN'), (u'Ubertragen', u'\xfcbertragen'), (u'UBERTRAGUNG', u'\xdcBERTRAGUNG'), (u'ubertreibe', u'\xfcbertreibe'), (u'Ubertreiben', u'\xfcbertreiben'), (u'Ubertrieben', u'\xfcbertrieben'), (u'Ubertriebene', u'\xdcbertriebene'), (u'ubertriebener', u'\xfcbertriebener'), (u'Ubertrifft', u'\xdcbertrifft'), (u'Ubervvachen', u'\xfcberwachen'), (u'Ubervvacht', u'\xfcberwacht'), (u'Ubervvachung', u'\xdcberwachung'), (u'Ubervvachungs', u'\xdcberwachungs'), (u'Ubervvachungsstaat', u'\xdcberwachungsstaat'), (u'Ubervvachungsstaats', u'\xdcberwachungsstaats'), (u'Ubervvachungsvideos', u'\xdcberwachungsvideos'), (u'Ubervv\xe9iltigend', u'\xfcberw\xe4ltigend'), (u'Uberwachen', u'\xfcberwachen'), (u'Uberwacher', u'\xdcberwacher'), (u'Uberwachung', u'\xdcberwachung'), (u'Uberzeuge', u'\xfcberzeuge'), (u'Uberzeugen', u'\xfcberzeugen'), (u'Uberzeugend', u'\xfcberzeugend'), (u'Uberzeugt', u'\xfcberzeugt'), (u'Uberzeugung', u'\xdcberzeugung'), (u'Uberzeugungen', u'\xdcberzeugungen'), (u'Uberziehen', u'\xfcberziehen'), (u'Uberzuleiten', u'\xfcberzuleiten'), (u'ublem', u'\xfcblem'), (u'Ubler', u'\xdcbler'), (u'Ubles', u'\xdcbles'), (u'Ublich', u'\xfcblich'), (u'Ubliche', u'\xdcbliche'), (u'ublichen', u'\xfcblichen'), (u'Ubrig', u'\xfcbrig'), (u'Ubrige', u'\xdcbrige'), (u'Ubrigen', u'\xdcbrigen'), (u'Ubrigens', u'\xfcbrigens'), (u'Ubrlgens', u'\xdcbrigens'), (u'Ubrllccol', u'Ubriacco!'), (u'Ubung', u'\xdcbung'), (u'Ubungsbedingungen', u'\xdcbungsbedingungen'), (u'Ubungsschiisse', u'\xdcbungssch\xfcsse'), (u'Ubungsschusse', u'\xdcbungssch\xfcsse'), (u"Ub\u20acf'pf'Uf\u20acl'1", u'\xfcberpr\xfcfen'), (u'Uher', u'\xdcber'), (u'ultrakiistlichl', u'ultrak\xf6stlich!'), (u'umgeriistet', u'umger\xfcstet'), (u'umg\xe9nglich', u'umg\xe4nglich'), (u'umhdren', u'umh\xf6ren'), (u'umh\xe9ngt', u'umh\xe4ngt'), (u'Umschlfigen', u'Umschl\xe4gen'), (u'umschlieBt', u'umschlie\xdft'), (u'Umst\xe9inden', u'Umst\xe4nden'), (u'Umst\xe9nde', u'Umst\xe4nde'), (u'Umst\xe9nden', u'Umst\xe4nden'), (u'umst\xe9ndlich', u'umst\xe4ndlich'), (u'umweltsch\xe9dlich', u'umweltsch\xe4dlich'), (u'unabhiingiges', u'unabh\xe4ngiges'), (u'unabh\xe9ingig', u'unabh\xe4ngig'), (u'unabh\xe9ngig', u'unabh\xe4ngig'), (u'unabl\xe9ssig', u'unabl\xe4ssig'), (u'Unauff\xe9lligeres', u'Unauff\xe4lligeres'), (u'unaufhalfsam', u'unaufhaltsam'), (u'unaufhiirlich', u'unaufh\xf6rlich'), (u'unaufh\xe9rlich', u'unaufh\xf6rlich'), (u'unaufi\xe9llig', u'unauff\xe4llig'), (u'unberijhrbar', u'unber\xfchrbar'), (u'unberllihrten', u'unber\xfchrten'), (u'unbesch\xe9digt', u'unbesch\xe4digt'), (u'Uncl', u'Und'), (u'undja', u'und ja'), (u'undjeder', u'und jeder'), (u'undjemand', u'und jemand'), (u'undjetzt', u'und jetzt'), (u'undlassenihn', u'und lassen ihn'), (u'undlhnen', u'und Ihnen'), (u'undurchfuhrbar', u'undurchf\xfchrbar'), (u'uneingeschr\xe9nkten', u'uneingeschr\xe4nkten'), (u'unergrilndliche', u'unergr\xfcndliche'), (u'unerhort', u'unerh\xf6rt'), (u'unerhorte', u'unerh\xf6rte'), (u'unerkl\xe9rliche', u'unerkl\xe4rliche'), (u'unerkl\xe9rlichen', u'unerkl\xe4rlichen'), (u'unertr\xe9glich', u'unertr\xe4glich'), (u"unf'a'hig", u'unf\xe4hig'), (u'Unfahigkeit', u'Unf\xe4higkeit'), (u'unfersfellen', u'unterstellen'), (u'unfiirmigen', u'unf\xf6rmigen'), (u'unf\xe9hig', u'unf\xe4hig'), (u'unf\xe9higste', u'unf\xe4higste'), (u'unf\xe9ihigste', u'unf\xe4higste'), (u'Unf\xe9ille', u'Unf\xe4lle'), (u'Unf\xe9lle', u'Unf\xe4lle'), (u'ungef\xe9hr', u'ungef\xe4hr'), (u'ungef\xe9hre', u'ungef\xe4hre'), (u'Ungef\xe9ihr', u'Ungef\xe4hr'), (u'ungef\xe9ihrlich', u'ungef\xe4hrlich'), (u'ungemutlich', u'ungem\xfctlich'), (u'ungenugend', u'ungen\xfcgend'), (u'ungestbrt', u'ungest\xf6rt'), (u'ungewfihnliche', u'ungew\xf6hnliche'), (u'Ungewfjhnliches', u'Ungew\xf6hnliches'), (u'ungewiihnlich', u'ungew\xf6hnlich'), (u'Ungewijhnliches', u'Ungew\xf6hnliches'), (u'ungew\xe9hnlich', u'ungew\xf6hnlich'), (u'ungew\xe9hnliche', u'ungew\xf6hnliche'), (u'ungew\xe9hnlichste', u'ungew\xf6hnlichste'), (u'ungfinstigen', u'ung\xfcnstigen'), (u'ungiiltig', u'ung\xfcltig'), (u'ungilnstig', u'ung\xfcnstig'), (u'Unglaubliohl', u'Unglaublich!'), (u'unglaubwurdig', u'unglaubw\xfcrdig'), (u'Unglfiubige', u'Ungl\xe4ubige'), (u'Ungliicklicherweise', u'Ungl\xfccklicherweise'), (u'Unglilck', u'Ungl\xfcck'), (u"Ungll'Jcklichervveise", u'Ungl\xfccklicherweise'), (u'Unglllick', u'Ungl\xfcck'), (u'unglllicklich', u'ungl\xfccklich'), (u'ungllllckliche', u'ungl\xfcckliche'), (u'unglucklich', u'ungl\xfccklich'), (u'Ungl\xe9ubiger', u'Ungl\xe4ubiger'), (u'ungultig', u'ung\xfcltig'), (u'ungunstigen', u'ung\xfcnstigen'), (u'unheimlichl', u'unheimlich!'), (u'UNHORBARES', u'UNH\xd6RBARES'), (u'unh\xe9flich', u'unh\xf6flich'), (u'Universitlt', u'Universit\xe4t'), (u'Universit\xe9t', u'Universit\xe4t'), (u'unlfisbare', u'unl\xf6sbare'), (u'unm6glich', u'unm\xf6glich'), (u'unmfiglich', u'unm\xf6glich'), (u'Unmiiglich', u'Unm\xf6glich'), (u'Unmiigliche', u'Unm\xf6gliche'), (u'unmijglich', u'unm\xf6glich'), (u'unmissverst\xe9ndlich', u'unmissverst\xe4ndlich'), (u'unmoglich', u'unm\xf6glich'), (u'Unmtioglich', u'Unm\xf6glich'), (u'Unm\xe9glich', u'Unm\xf6glich'), (u'unm\xe9glioh', u'unm\xf6glich'), (u'unnatiirliche', u'unnat\xfcrliche'), (u'unnaturliche', u'unnat\xfcrliche'), (u'unnfitigen', u'unn\xf6tigen'), (u'unniitig', u'unn\xf6tig'), (u'unnllitz', u'unn\xfctz'), (u'unn\xe9tig', u'unn\xf6tig'), (u'unn\xe9tigen', u'unn\xf6tigen'), (u'unol', u'und'), (u'unp\xe9sslich', u'unp\xe4sslich'), (u'UNREGELMASSIG', u'UNREGELM\xc4SSIG'), (u'Unregelm\xe9fiigkeiten', u'Unregelm\xe4\xdfigkeiten'), (u'unschliissig', u'unschl\xfcssig'), (u'unserejungen', u'unsere jungen'), (u'unsererAnw\xe9lte', u'unserer Anw\xe4lte'), (u'unsererjungfr\xe9ulichen', u'unserer jungfr\xe4ulichen'), (u'unsjede', u'uns jede'), (u'uns\xe9glich', u'uns\xe4glich'), (u'Untenuelt', u'Unterwelt'), (u'unterdriickten', u'unterdr\xfcckten'), (u'Unterdrilckung', u'\xdcnterdr\xfcckung'), (u'unterdrtlckte', u'unterdr\xfcckte'), (u'Unterdr\ufb02ckung', u'Unterdr\xfcckung'), (u'Unterhaltskostenl', u'Unterhaltskosten!'), (u'Unterhaltungsm\xe9fiig', u'Unterhaltungsm\xe4\xdfig'), (u'unterhfilt', u'unterh\xe4lt'), (u'unterh\xe9lt', u'unterh\xe4lt'), (u'unterschitzt', u'untersch\xe4tzt'), (u'untersch\xe9tzte', u'untersch\xe4tzte'), (u'unterstiitzt', u'unterst\xfctzt'), (u'Unterstiitzung', u'Unterst\xfctzung'), (u'unterstijtzt', u'unterst\xfctzt'), (u'Unterstiltzung', u'Unterst\xfctzung'), (u'Unterstllitzung', u'Unterst\xfctzung'), (u'unterstutzen', u'unterst\xfctzen'), (u'unterstutzt', u'unterst\xfctzt'), (u'Unterstutzten', u'Unterst\xfctzten'), (u'Unterstutzung', u'Unterst\xfctzung'), (u'Untersuchungsausschijsse', u'Untersuchungsaussch\xfcsse'), (u'Unterw\xe9sche', u'Unterw\xe4sche'), (u'untr\xe9stlich', u'untr\xf6stlich'), (u'Unt\xe9tigkeit', u'Unt\xe4tigkeit'), (u'unumg\xe9nglich', u'unumg\xe4nglich'), (u'unverm\xe9hlt', u'unverm\xe4hlt'), (u'Unverschfimtheitl', u'Unversch\xe4mtheit'), (u'unversch\xe9mte', u'unversch\xe4mte'), (u'Unversch\xe9mtheitl', u'Unversch\xe4mtheit'), (u'UNVERSTANDLICH', u'UNVERST\xc4NDLICH'), (u'UNVERSTANDLICHE', u'UNVERST\xc4NDLICHE'), (u'UNVERSTANDLICHER', u'UNVERST\xc4NDLICHER'), (u'UNVERSTANDLICHES', u'UNVERST\xc4NDLICHES'), (u'Unverst\xe9ndliche', u'Unverst\xe4ndliche'), (u'unverst\xe9ndlichen', u'unverst\xe4ndlichen'), (u'unverst\xe9ndliches', u'unverst\xe4ndliches'), (u'unverzlliglich', u'unverz\xfcglich'), (u'unver\xe9ndert', u'unver\xe4ndert'), (u'Unzerbrechliohen', u'Unzerbrechlichen'), (u'unzurechnungsfahig', u'unzurechnungsf\xe4hig'), (u'unzuverlassiger', u'unzuverl\xe4ssiger'), (u'Unzuverl\xe9ssiger', u'Unzuverl\xe4ssiger'), (u'unzuverl\xe9ssiges', u'unzuverl\xe4ssiges'), (u'unz\xe9hlige', u'unz\xe4hlige'), (u'unz\xe9hligen', u'unz\xe4hligen'), (u'unz\xe9ihlige', u'unz\xe4hlige'), (u'Urgrofivaters', u'Urgro\xdfvaters'), (u'Urlaubsuberschreitung', u'Urlaubs\xfcberschreitung'), (u'Ursprijnglich', u'Urspr\xfcnglich'), (u'ursprtmglich', u'urspr\xfcnglich'), (u'Ursprunglich', u'Urspr\xfcnglich'), (u'Ururgrofivater', u'Ururgro\xdfvater'), (u'v/el', u'viel'), (u'v/er', u'vier'), (u'v/erfe', u'vierte'), (u'v/erfes', u'viertes'), (u'V6gel', u'V\xf6gel'), (u'v6IIig', u'v\xf6llig'), (u'V6lker', u'V\xf6lker'), (u'V6llig', u'V\xf6llig'), (u'v6lllg', u'v\xf6llig'), (u'vdllig', u'v\xf6llig'), (u'Ve/Teidigungskr\xe9fte', u'Verteidigungskr\xe4fte'), (u'Velzeih', u'Verzeih'), (u'Velzeihung', u'Verzeihung'), (u'velzichte', u'verzichte'), (u'Ven/vandter', u'Verwandter'), (u'ven/v\xe9hntl', u'verw\xf6hnt!'), (u'Ventilationsfiffnung', u'Ventilations\xf6ffnung'), (u'Ventilatorsch\xe9chte', u'Ventilatorsch\xe4chte'), (u'VERACHTLICH', u'VER\xc4CHTLICH'), (u'verandert', u'ver\xe4ndert'), (u'Verbiindeten', u'Verb\xfcndeten'), (u'Verbilndeter', u'Verb\xfcndeter'), (u'verbliidet', u'verbl\xf6det'), (u'Verbliidung', u'Verbl\xf6dung'), (u'verbllirgen', u'verb\xfcrgen'), (u'verbrachfe', u'verbrachte'), (u'Verbrec/ver', u'Verbrecher'), (u'Verbtmdeter', u'Verb\xfcndeter'), (u'Verbundeten', u'Verb\xfcndeten'), (u'Verb\ufb02nolete', u'Verb\xfcndete'), (u'verdiichtigen', u'verd\xe4chtigen'), (u'verdiinnt', u'verd\xfcnnt'), (u'verdllistern', u'verd\xfcstern'), (u'verdr\ufb02ckt', u'verdr\xfcckt'), (u'verdunnt', u'verd\xfcnnt'), (u'verd\xe9chtig', u'verd\xe4chtig'), (u'Verd\xe9chtigen', u'Verd\xe4chtigen'), (u'verd\xe9chtiger', u'verd\xe4chtiger'), (u'verffilgbares', u'verf\xfcgbares'), (u'Verfiigung', u'Verf\xfcgung'), (u'verfiihren', u'verf\xfchren'), (u'verfiihrt', u'verf\xfchrt'), (u'verfiittem', u'verf\xfcttern'), (u'Verfijgung', u'Verf\xfcgung'), (u'verfilgst', u'verf\xfcgst'), (u'verfilgte', u'verf\xfcgte'), (u'Verfilgung', u'Verf\xfcgung'), (u'Verfilhrungskilnste', u'Verf\xfchrungsk\xfcnste'), (u'verflligen', u'verf\xfcgen'), (u'verfllihrt', u'verf\xfchrt'), (u'Verflllgung', u'Verf\xfcgung'), (u'verfolgf', u'verfolgt'), (u'verfolgtl', u'verfolgt!'), (u'VERFUGBAR', u'VERF\xdcGBAR'), (u'verfugt', u'verf\xfcgt'), (u'vergafk', u'verga\xdf'), (u'Vergniigen', u'Vergn\xfcgen'), (u'Vergniigens', u'Vergn\xfcgens'), (u'Vergniigungsausflug', u'Vergn\xfcgungsausflug'), (u'Vergnijgen', u'Vergn\xfcgen'), (u'Vergnilgen', u'Vergn\xfcgen'), (u'Vergnlligen', u'Vergn\xfcgen'), (u'Vergntigen', u'Vergn\xfcgen'), (u'Vergnugen', u'Vergn\xfcgen'), (u'vergnugt', u'vergn\xfcgt'), (u'vergnugte', u'vergn\xfcgte'), (u'Vergnugungsausflug', u'Vergn\xfcgungsausflug'), (u'vergr6Bern', u'vergr\xf6\xdfern'), (u'vergr\xe9fiern', u'vergr\xf6\xdfern'), (u'Vergr\xe9fierung', u'Vergr\xf6\xdferung'), (u'verg\xe9nglich', u'verg\xe4nglich'), (u'verhiirt', u'verh\xf6rt'), (u'Verhiitung', u'Verh\xfctung'), (u'Verhor', u'Verh\xf6r'), (u'verhort', u'verh\xf6rt'), (u'verhorten', u'verh\xf6rten'), (u'verh\xe9ilt', u'verh\xe4lt'), (u'verh\xe9lt', u'verh\xe4lt'), (u'Verh\xe9ltnis', u'Verh\xe4ltnis'), (u'Verh\xe9ltnisse', u'Verh\xe4ltnisse'), (u'verh\xe9ltst', u'verh\xe4ltst'), (u'veriindert', u'ver\xe4ndert'), (u'Verinderungen', u'Ver\xe4nderungen'), (u'verkilnden', u'verk\xfcnden'), (u'verkilndet', u'verk\xfcndet'), (u'verkniipft', u'verkn\xfcpft'), (u"verknUpf't", u'verkn\xfcpft'), (u'verkunde', u'verk\xfcnde'), (u'verkunden', u'verk\xfcnden'), (u'verkundet', u'verk\xfcndet'), (u'VERKUNDIGUNG', u'VERK\xdcNDIGUNG'), (u'Verk\xe9ufer', u'Verk\xe4ufer'), (u'verletztl', u'verletzt!'), (u'verlieB', u'verlie\xdf'), (u'verlielien', u'verlie\xdfen'), (u'verlorenl', u'verloren!'), (u'verl\xe9ingert', u'verl\xe4ngert'), (u'Verl\xe9ingerungskabel', u'Verl\xe4ngerungskabel'), (u'verl\xe9isst', u'verl\xe4sst'), (u'verl\xe9sst', u'verl\xe4sst'), (u'verl\xe9uft', u'verl\xe4uft'), (u"verm'aihlen", u'verm\xe4hlen'), (u'verm/ssf', u'vermisst'), (u'vermiibelt', u'verm\xf6belt'), (u'Vermiigt', u'Verm\xf6gt'), (u'Verm\xe9gen', u'Verm\xf6gen'), (u'verm\xe9hle', u'verm\xe4hle'), (u'verm\xe9hlen', u'verm\xe4hlen'), (u'verm\xe9hlt', u'verm\xe4hlt'), (u'Verm\xe9ihlung', u'Verm\xe4hlung'), (u'vernachl\xe9ssigt', u'vernachl\xe4ssigt'), (u'Vernachl\xe9ssigung', u'Vernachl\xe4ssigung'), (u'vernfinftig', u'vern\xfcnftig'), (u'vernfinftige', u'vern\xfcnftige'), (u'vernilnftig', u'vern\xfcnftig'), (u'vernllmftigsten', u'vern\xfcnftigsten'), (u'verntmftige', u'vern\xfcnftige'), (u'vernunftig', u'vern\xfcnftig'), (u'vernunftigsten', u'vern\xfcnftigsten'), (u'vern\ufb02nftig', u'vern\xfcnftig'), (u'verpa\xdft', u'verpasst'), (u'verpesfefe', u'verpestete'), (u'verprilgle', u'verpr\xfcgle'), (u'verprugeln', u'verpr\xfcgeln'), (u'Verp\ufb02ichtungen', u'Verpflichtungen'), (u'verrat', u'verr\xe4t'), (u'verrfickter', u'verr\xfcckter'), (u'verriickt', u'verr\xfcckt'), (u'Verriickte', u'Verr\xfcckte'), (u'Verriickten', u'Verr\xfcckten'), (u'Verriickter', u'Verr\xfcckter'), (u'verriicktes', u'verr\xfccktes'), (u'verrijckt', u'verr\xfcckt'), (u'verrijckte', u'verr\xfcckte'), (u'verrilckt', u'verr\xfcckt'), (u'Verrilckte', u'Verr\xfcckte'), (u'Verrilckter', u'Verr\xfcckter'), (u'Verrilcktes', u'Verr\xfccktes'), (u"verrL'lckt", u'verr\xfcckt'), (u'verrljckt', u'verr\xfcckt'), (u'verrllickt', u'verr\xfcckt'), (u'Verrllickte', u'Verr\xfcckte'), (u'Verrllickter', u'Verr\xfcckter'), (u'verrlllckte', u'verr\xfcckte'), (u'verrtickt', u'verr\xfcckt'), (u'verrUckt', u'verr\xfcckt'), (u'Verruckte', u'Verr\xfcckte'), (u'verruckten', u'verr\xfcckten'), (u'Verruckter', u'Verr\xfcckter'), (u'Verr\xe9iter', u'Verr\xe4ter'), (u'verr\xe9itst', u'verr\xe4itst'), (u'verr\xe9t', u'verr\xe4t'), (u'Verr\xe9ter', u'Verr\xe4ter'), (u'Verr\xe9terin', u'Verr\xe4terin'), (u'verr\xe9terisch', u'verr\xe4terisch'), (u'verr\xe9terischen', u'verr\xe4terischen'), (u'verr\ufb02ckt', u'verr\xfcckt'), (u'versaumt', u'vers\xe4umt'), (u'Verscheifier', u'Verschei\xdfer'), (u'verschiichtert', u'versch\xfcchtert'), (u'verschiitten', u'versch\xfctten'), (u'verschlucktl', u'verschluckt!'), (u'VERSCHLUSSELN', u'VERSCHL\xdcSSELN'), (u'VERSCHLUSSELT', u'VERSCHL\xdcSSELT'), (u'Verschlusselung', u'Verschl\xfcsselung'), (u'Verschnauferst', u'Verschnauf erst'), (u'Verschwdrung', u'Verschw\xf6rung'), (u'verschweilit', u'verschwei\xdft'), (u'Verschwiirer', u'Verschw\xf6rer'), (u'verschwiirerisch', u'verschw\xf6rerisch'), (u'Verschwiirern', u'Verschw\xf6rern'), (u'Verschwiirung', u'Verschw\xf6rung'), (u'Verschwiirungen', u'Verschw\xf6rungen'), (u'Verschw\xe9rer', u'Verschw\xf6rer'), (u'Verschw\xe9rung', u'Verschw\xf6rung'), (u'Verschw\xe9rungstheoretiker', u'Verschw\xf6rungstheoretiker'), (u'versch\xe9rft', u'versch\xe4rft'), (u'versfanden', u'verstanden'), (u'Versfehen', u'Verstehen'), (u'versiihnlich', u'vers\xf6hnlich'), (u'Versiihnung', u'Vers\xf6hnung'), (u'verslumte', u'vers\xe4umte'), (u'Verspfitung', u'Versp\xe4tung'), (u'verspiire', u'versp\xfcre'), (u'verspilre', u'versp\xfcre'), (u'verspiten', u'versp\xe4ten'), (u'versprijht', u'verspr\xfcht'), (u'verst0I3en', u'versto\xdfen'), (u'verst6Bt', u'verst\xf6\xdft'), (u'Verst6ISt', u'Verst\xf6\xdft'), (u'verst6l3t', u'verst\xf6\xdft'), (u'verstehejetzt', u'verstehe jetzt'), (u'Verstiindnis', u'Verst\xe4ndnis'), (u'verstiirkt', u'verst\xe4rkt'), (u'Verstiirkung', u'Verst\xe4rkung'), (u'verstilmmelst', u'verst\xfcmmelst'), (u'verstoBen', u'Versto\xdfen'), (u'verstofken', u'versto\xdfen'), (u'verstolien', u'versto\xdfen'), (u'verstummelt', u'verst\xfcmmelt'), (u'verstunde', u'verst\xfcnde'), (u'verstundest', u'verst\xfcndest'), (u'verst\xe9fkt', u'verst\xf6\xdft'), (u'verst\xe9indlich', u'verst\xe4ndlich'), (u'Verst\xe9irkung', u'Verst\xe4rkung'), (u'Verst\xe9ndigen', u'Verst\xe4ndigen'), (u'Verst\xe9ndigt', u'Verst\xe4ndigt'), (u'verst\xe9ndlich', u'verst\xe4ndlich'), (u'Verst\xe9ndnis', u'Verst\xe4ndnis'), (u'verst\xe9rken', u'verst\xe4rken'), (u'verst\xe9rkt', u'verst\xe4rkt'), (u'verst\xe9rkte', u'verst\xe4rkte'), (u'verst\xe9rkter', u'verst\xe4rkter'), (u'Verst\xe9rkung', u'Verst\xe4rkung'), (u'verst\xe9rt', u'verst\xf6rt'), (u'vers\xe9hnen', u'vers\xf6hnen'), (u'vers\xe9hnt', u'vers\xf6hnt'), (u'vers\xe9umen', u'vers\xe4umen'), (u'vers\xe9umt', u'vers\xe4umt'), (u'VERTRAGSLANGE', u'VERTRAGSL\xc4NGE'), (u'vertrauenswiirdig', u'vertrauensw\xfcrdig'), (u'vertrauenswtlrdig', u'vertrauensw\xfcrdig'), (u'vertrauenswtlrdigen', u'vertrauensw\xfcrdigen'), (u'vertr\xe9umte', u'vertr\xe4umte'), (u'vervvanzt', u'verwanzt'), (u'verwiistete', u'verw\xfcstete'), (u'verwllisten', u'verw\xfcsten'), (u'verwustet', u'verw\xfcstet'), (u'verw\xe9hnten', u'verw\xf6hnten'), (u'verw\xe9ihnen', u'verw\xf6hnen'), (u'verw\xe9ssert', u'verw\xe4ssert'), (u'verz\xe9gere', u'verz\xf6gere'), (u'Verz\xe9gerte', u'Verz\xf6gerte'), (u'Verz\xe9gerung', u'Verz\xf6gerung'), (u'ver\xe9ffentliche', u'ver\xf6ffentliche'), (u'ver\xe9ffentlichen', u'ver\xf6ffentlichen'), (u'ver\xe9ffentlicht', u'ver\xf6ffentlicht'), (u'ver\xe9indert', u'ver\xe4ndert'), (u'Ver\xe9inderung', u'Ver\xe4nderung'), (u'ver\xe9ndern', u'ver\xe4ndern'), (u'ver\xe9ndert', u'ver\xe4ndert'), (u'ver\xe9nderte', u'ver\xe4nderte'), (u'ver\xe9nderten', u'ver\xe4nderten'), (u'Ver\xe9nderung', u'Ver\xe4nderung'), (u'Ver\xe9nderungen', u'Ver\xe4nderungen'), (u'ver\xe9ngstigtes', u'ver\xe4ngstigtes'), (u'ver\xe9ppelt', u'ver\xe4ppelt'), (u'ver\xe9rgert', u'ver\xe4rgert'), (u'vewvendet', u'verwendet'), (u'vfillig', u'v\xf6llig'), (u'VGFKUFZGH', u'verk\xfcrzen'), (u'VI/illkommen', u'Willkommen'), (u'VI/itwicky', u'Witwicky'), (u'vial', u'viel'), (u'Videoiiben/vachung', u'Video\xfcberwachung'), (u'Vie/e', u'Viele'), (u'Vielfrafi', u'Vielfra\xdf'), (u'vielf\xe9ltig', u'vielf\xe4ltig'), (u'Vielleichtja', u'Vielleicht ja'), (u'vielversprechend', u'viel versprechend'), (u'Vieraugengespr\xe9ch', u'Vieraugengespr\xe4ch'), (u'vieriunge', u'vier junge'), (u'vierj\xe9hriges', u'vierj\xe4hriges'), (u'vierk\xe9pfige', u'vierk\xf6pfige'), (u'Viigel', u'V\xf6gel'), (u'viillig', u'v\xf6llig'), (u'viilliges', u'v\xf6lliges'), (u'Viterchen', u'V\xe4terchen'), (u'Vizepr\xe9isident', u'Vizepr\xe4sident'), (u'vlel', u'viel'), (u'Vlellelcht', u'Vielleicht'), (u'Vogelscheifke', u'Vogelschei\xdfe'), (u'Vogelscheilie', u'Vogelschei\xdfe'), (u'Volksm\xe9rchen', u'Volksm\xe4rchen'), (u'vollerjeder', u'voller jeder'), (u'vollmachen', u'voll machen'), (u'vollst\xe9ndig', u'vollst\xe4ndig'), (u'vollst\xe9ndige', u'vollst\xe4ndige'), (u'Volltrefferl', u'Volltreffer!'), (u'vollz\xe9hlig', u'vollz\xe4hlig'), (u'Volumenl', u'Volumen!'), (u'von/vagten', u'vorwagten'), (u'von/v\xe9irts', u'vorw\xe4rts'), (u'vonn6ten', u'vonn\xf6ten'), (u'Vonn\xe9irts', u'Vorw\xe4rts'), (u'Vordertiir', u'Vordert\xfcr'), (u'Vorderturl', u'Vordert\xfcr!'), (u'vordr\xe9ngelnl', u'vordr\xe4ngeln!'), (u'vorfibergehend', u'vor\xfcbergehend'), (u'Vorfuhrungen', u'Vorf\xfchrungen'), (u'vorgef\ufb02hrt', u'vorgef\xfchrt'), (u'Vorgiinge', u'Vorg\xe4nge'), (u'Vorg\xe9nger', u'Vorg\xe4nger'), (u'Vorg\xe9ngern', u'Vorg\xe4ngern'), (u'Vorh\xe9nge', u'Vorh\xe4nge'), (u'vorijbergehend', u'vor\xfcbergehend'), (u'vorilber', u'vor\xfcber'), (u'vorilbergehende', u'vor\xfcbergehende'), (u'vorkniipfen', u'vorkn\xf6pfen'), (u'Vorl\xe9ufer', u'Vorl\xe4ufer'), (u'Vorl\xe9ufig', u'Vorl\xe4ufig'), (u'Vorraus', u'Voraus'), (u'Vorschl\xe9ge', u'Vorschl\xe4ge'), (u'vorschriftsm\xe9fiig', u'vorschriftsm\xe4\xdfig'), (u'vorschriftsm\xe9iliig', u'vorschriftsm\xe4\xdfig'), (u'Vorsichtsmaflnahme', u'Vorsichtsma\xdfnahme'), (u'Vorstellungsgespr\xe9ch', u'Vorstellungsgespr\xe4ch'), (u'Vorstellungsgespr\xe9che', u'Vorstellungsgespr\xe4che'), (u'Vorstof$', u'Vorsto\xdf'), (u'Vortlbergehende', u'Vor\xfcbergehende'), (u'vort\xe9uschen', u'vort\xe4uschen'), (u'vorubergehend', u'vor\xfcbergehend'), (u'vorvv\xe9rts', u'vorw\xe4rts'), (u'Vorwfirts', u'Vorw\xe4rts'), (u'vorw\xe9rts', u'vorw\xe4rts'), (u'vorzfiglichl', u'vorz\xfcglich!'), (u'vor\ufb02ber', u'vor\xfcber'), (u'Vor\ufb02bergehend', u'Vor\xfcbergehend'), (u'VVACHMANN', u'WACHMANN'), (u'Vvaffen', u'Waffen'), (u'Vvagen', u'Wagen'), (u'VVarte', u'Warte'), (u'VVeif3>t', u'Wei\xdft'), (u"VVeil'2>t", u'Wei\xdft'), (u'VVir', u'Wir'), (u'VVM', u'WM'), (u'v\\/as', u'was'), (u'V\\/e', u'We'), (u'V\xe9gel', u'V\xf6gel'), (u'v\xe9geln', u'v\xf6geln'), (u'v\xe9gelt', u'v\xf6gelt'), (u'v\xe9llig', u'v\xf6llig'), (u"w/'r", u'wir'), (u'W/e', u'Wie'), (u'w/eder', u'wieder'), (u'W/nkel', u'Winkel'), (u'w/r', u'wir'), (u'w/rd', u'wird'), (u'w/rkl/ch', u'wirklich'), (u'W0', u'Wo'), (u'w5r', u'w\xe4r'), (u"w5r's", u"w\xe4r's"), (u'W6lfe', u'W\xf6lfe'), (u'W6lfen', u'W\xf6lfen'), (u'W99', u'Weg'), (u'Waffenschr\xe9nke', u'Waffenschr\xe4nke'), (u'wafs', u"w\xe4r's"), (u'wahrend', u'w\xe4hrend'), (u'WAHRENDDESSEN', u'W\xc4HRENDDESSEN'), (u'Wahrheitl', u'Wahrheit!'), (u'wail', u'weil'), (u'Walbl', u'Wal\xf6l'), (u'Walsinghaml', u'Walsingham!'), (u'wankelmiltig', u'wankelm\xfctig'), (u'ware', u'w\xe4re'), (u'WAREST', u'W\xc4REST'), (u'Warfe', u'Warte'), (u'warja', u'war ja'), (u'Waschbrettb\xe9uche', u'Waschbrettb\xe4uche'), (u'Waschb\xe9ir', u'Waschb\xe4r'), (u'Waschb\xe9iren', u'Waschb\xe4ren'), (u'Wasseranschlljssen', u'Wasseranschl\xfcssen'), (u'Wattekn\xe9uel', u'Wattekn\xe4uel'), (u'Wattest\xe9bchen', u'Wattest\xe4bchen'), (u"we're", u'w\xe4re'), (u"We'ro", u"We're"), (u'we/B', u'wei\xdf'), (u'We/Bf', u'Wei\xdft'), (u'we/fere', u'weitere'), (u'Wechsell', u'Wechsel!'), (u'weggebfirstet', u'weggeb\xfcrstet'), (u'weggespllllt', u'weggesp\xfclt'), (u'weggesplllltl', u'weggesp\xfclt!'), (u'weggesp\ufb02lt', u'weggesp\xfclt'), (u'wegl', u'weg!'), (u'wegreiflsen', u'wegrei\xdfen'), (u'wegschieBen', u'wegschie\xdfen'), (u'Wegtratan', u'Wegtreten'), (u'wegzuwefien', u'wegzuwerfen'), (u'wei/3', u'wei\xdf'), (u'WeiB', u'Wei\xdf'), (u'weiBe', u'wei\xdfe'), (u'weiBen', u'wei\xdfen'), (u'weiBer', u'wei\xdfer'), (u'weiBes', u'wei\xdfes'), (u'WeiBfresse', u'Wei\xdffresse'), (u'weiBt', u'wei\xdft'), (u'Weif$', u'Wei\xdf'), (u'Weif$t', u'Wei\xdft'), (u'weif2>', u'wei\xdf'), (u'weif3', u'wei\xdf'), (u'weif3>', u'wei\xdf'), (u'Weif3t', u'Wei\xdft'), (u'weif5', u'wei\xdf'), (u'Weifbe', u'Wei\xdfe'), (u'weifbt', u'wei\xdft'), (u'Weifi', u'Wei\xdf'), (u'Weifie', u'Wei\xdfe'), (u'weifies', u'wei\xdfes'), (u'Weifist', u'Wei\xdft'), (u'Weifit', u'Wei\xdft'), (u'weifk', u'wei\xdf'), (u'weifken', u'wei\xdfen'), (u'Weifker', u'Wei\xdfer'), (u'weifkes', u'wei\xdfes'), (u'weifkt', u'wei\xdft'), (u'weifL', u'wei\xdf'), (u'weifLt', u'wei\xdft'), (u'weifl\xbb', u'wei\xdf'), (u'weifS', u'wei\xdf'), (u'WeifSt', u'Wei\xdft'), (u'weifZ>', u'wei\xdf'), (u'WeifZ>t', u'Wei\xdft'), (u'weif\xe9t', u'wei\xdft'), (u'Weihnachtseink\xe9ufe', u'Weihnachtseink\xe4ufe'), (u'Weihnachtsm\xe9nner', u'Weihnachtsm\xe4nner'), (u"weil'5", u'wei\xdf'), (u"weil'5t", u'wei\xdft'), (u'weil3', u'wei\xdf'), (u'Weil3t', u'Wei\xdft'), (u'weil5', u'wei\xdf'), (u'Weil5t', u'Wei\xdft'), (u'weili', u'wei\xdf'), (u'weilit', u'wei\xdft'), (u'weilke', u'wei\xdfe'), (u'Weill', u'Wei\xdf'), (u'weills', u'wei\xdf'), (u'weillst', u'wei\xdft'), (u'weillt', u'weisst'), (u'weilS', u'wei\xdf'), (u'weilSe', u'wei\xdfe'), (u'WeilSglut', u'Wei\xdfglut'), (u'weilZ>', u'wei\xdf'), (u'weilZ~', u'wei\xdf'), (u'weiss', u'wei\xdf'), (u'weissen', u'wei\xdfen'), (u'weisst', u'wei\xdft'), (u'weiterhiipfen', u'weiterh\xfcpfen'), (u'Weiterpessen', u'Weiterpressen'), (u'weitl\xe9ufige', u'weitl\xe4ufige'), (u'weitweg', u'weit weg'), (u'WelBt', u'Wei\xdft'), (u'well', u'weil'), (u'Well', u'Welt'), (u'Wellit', u'Wei\xdft'), (u'welllt', u'wei\xdft'), (u'welt', u'weit'), (u'WELTBEVOLKERUNG', u'WELTBEV\xd6LKERUNG'), (u'Wel\ufb02t', u'Wei\xdft'), (u'Werdja', u'Werd ja'), (u'Werkst\xe9tten', u'Werkst\xe4tten'), (u'Werkzeugg\ufb02rtel', u'Werkzeugg\xfcrtel'), (u'wertschfitzen', u'wertsch\xe4tzen'), (u'Westflilgel', u'Westfl\xfcgel'), (u'Westkilste', u'Westk\xfcste'), (u'Wettk\xe9mpfe', u'Wettk\xe4mpfe'), (u'Wettk\xe9mpfen', u'Wettk\xe4mpfen'), (u'Wettk\xe9mpfer', u'Wettk\xe4mpfer'), (u'Wfinsche', u'W\xfcnsche'), (u'wfinschen', u'w\xfcnschen'), (u'Wfird', u'W\xfcrd'), (u'wfirde', u'w\xfcrde'), (u'Wfirden', u'W\xfcrden'), (u'wfirdest', u'w\xfcrdest'), (u'wfire', u'w\xe4re'), (u'Wfirme', u'W\xe4rme'), (u'Wfisste', u'W\xfcsste'), (u'wfitete', u'w\xfctete'), (u'wfssen', u'wissen'), (u'Widen/v\xe9rtig', u'Widerw\xe4rtig'), (u"widerf'a'hrt", u'widerf\xe4hrt'), (u'widerspriichliche', u'widerspr\xfcchliche'), (u'Widerw\xe9irtig', u'Widerw\xe4rtig'), (u'wiedergew\xe9ihltl', u'wiedergew\xe4hlt'), (u'wiederhaben', u'wieder-haben'), (u'Wiederh\xe9ren', u'Wiederh\xf6ren'), (u'Wieheifiternoch', u'Wiehei\xdfternoch'), (u'Wieheiliternoch', u'Wiehei\xdfternoch'), (u'wihlerisch', u'w\xe4hlerisch'), (u'wihlerlsch', u'w\xe4hlerisch'), (u'wiihlen', u'w\xfchlen'), (u'wiihlte', u'w\xe4hlte'), (u'wiihrend', u'w\xe4hrend'), (u'wiilrdest', u'w\xfcrdest'), (u'Wiinde', u'W\xe4nde'), (u'wiinsch', u'w\xfcnsch'), (u'Wiinsche', u'W\xfcnsche'), (u'Wiinschen', u'W\xfcnschen'), (u'wiinschst', u'w\xfcnschst'), (u'wiinscht', u'w\xfcnscht'), (u'wiinschte', u'w\xfcnschte'), (u'wiirde', u'w\xfcrde'), (u'Wiirden', u'W\xfcrden'), (u'Wiirdest', u'W\xfcrdest'), (u'wiirdet', u'w\xfcrdet'), (u'wiirdigst', u'w\xfcrdigst'), (u'Wiire', u'W\xe4re'), (u'wiiren', u'w\xe4ren'), (u'Wiirfel', u'W\xfcrfel'), (u'wiirfeln', u'w\xfcrfeln'), (u'Wiirfels', u'W\xfcrfels'), (u'wiirs', u"w\xe4r's"), (u'Wiirstchen', u'W\xfcrstchen'), (u'wiischt', u'w\xe4scht'), (u'Wiisste', u'W\xfcsste'), (u'wiissten', u'w\xfcssten'), (u'wiisstest', u'w\xfcsstest'), (u'Wiiste', u'W\xfcste'), (u'wiitenden', u'w\xfctenden'), (u'wijnsche', u'w\xfcnsche'), (u'wijnschen', u'w\xfcnschen'), (u'wijnschte', u'w\xfcnschte'), (u'wijrd', u'w\xfcrd'), (u'wijrde', u'w\xfcrde'), (u'wijrden', u'w\xfcrden'), (u'wijrdest', u'w\xfcrdest'), (u'wijrdiger', u'w\xfcrdiger'), (u'Wijrg', u'W\xfcrg'), (u'wijsste', u'w\xfcsste'), (u'wijtend', u'w\xfctend'), (u'wildl', u'wild!'), (u'wilnsch', u'w\xfcnsch'), (u'wilnsche', u'w\xfcnsche'), (u'wilnschen', u'w\xfcnschen'), (u'wilnscht', u'w\xfcnscht'), (u'wilnschte', u'w\xfcnschte'), (u'wilrd', u'w\xfcrd'), (u'Wilrde', u'W\xfcrde'), (u'Wilrden', u'W\xfcrden'), (u'Wilrdest', u'W\xfcrdest'), (u'wilrdig', u'w\xfcrdig'), (u'Wilrfel', u'W\xfcrfel'), (u'Wilrfelenergie', u'W\xfcrfelenergie'), (u'wilsste', u'w\xfcsste'), (u'wilssten', u'w\xfcssten'), (u'Wilstling', u'W\xfcstling'), (u'wiltend', u'w\xfctend'), (u'Windelhundl', u'Windelhund!'), (u'Windhundk\xe9rper', u'Windhundk\xf6rper'), (u'winner', u'w\xe4rmer'), (u'Wire', u'W\xe4re'), (u'wires', u'wir es'), (u'Wirfangen', u'Wir fangen'), (u'wirja', u'wir ja'), (u'wirje', u'wir je'), (u'wirjede', u'wir jede'), (u'wirjeden', u'wir jeden'), (u'wirjetzt', u'wir jetzt'), (u'Wirnisse', u'Wirrnisse'), (u'Wirsind', u'Wir sind'), (u'wirtragen', u'wir tragen'), (u'Wirtschaftspriifer', u'Wirtschaftspr\xfcfer'), (u'Wirverfolgen', u'Wir verfolgen'), (u'wirvom', u'wir vom'), (u'Wirwaren', u'Wir waren'), (u'Wirwarten', u'Wir warten'), (u'Wirwerden', u'Wir werden'), (u'Wirwissen', u'Wir wissen'), (u'Wirwollen', u'Wir wollen'), (u'Wirwollten', u'Wir wollten'), (u'Wirzeigten', u'Wir zeigten'), (u'wirzu', u'wir zu'), (u'Witzl', u'Witz!'), (u'WKHRENDDESSEN', u'W\xc4HRENDDESSEN'), (u"wL'lrden", u'w\xfcrden'), (u'wle', u'wie'), (u'Wleso', u'Wieso'), (u'Wlhlen', u'W\xe4hlen'), (u'wllinsch', u'w\xfcnsch'), (u'wllinschst', u'w\xfcnschst'), (u'wllinscht', u'w\xfcnscht'), (u'wllirde', u'w\xfcrde'), (u'wllirden', u'w\xfcrden'), (u'wllirdest', u'w\xfcrdest'), (u'wllirdet', u'w\xfcrdet'), (u'Wllirgegriff', u'W\xfcrgegriff'), (u'wllirgen', u'w\xfcrgen'), (u'wllisste', u'w\xfcsste'), (u'wlr', u'wir'), (u'wlrd', u'wird'), (u'wlrkllch', u'wirklich'), (u'Wlrkllchkelt', u'Wirklichkeit'), (u'wlrst', u'wirst'), (u'Wlrwarten', u'Wir warten'), (u'wlrwollen', u'wir wollen'), (u'Wo/f', u'Wolf'), (u'Wochenf\xe9hre', u'Wochenf\xe4hre'), (u'woffir', u'wof\xfcr'), (u'Wofiir', u'Wof\xfcr'), (u'Wofijr', u'Wof\xfcr'), (u'wofilr', u'wof\xfcr'), (u'Wofur', u'Wof\xfcr'), (u'WoherweiB', u'Woher wei\xdf'), (u'WoherweiBt', u'Woher wei\xdft'), (u'Woherweif$t', u'Woher wei\xdft'), (u'wohlfilhlen', u'wohlf\xfchlen'), (u'Wollkn\xe9uel', u'Wollkn\xe4uel'), (u'womiiglich', u'wom\xf6glich'), (u'wom\xe9glich', u'wom\xf6glich'), (u'wom\xe9iglich', u'wom\xf6glich'), (u'Worfiber', u'Wor\xfcber'), (u'woriiber', u'wor\xfcber'), (u'Worijber', u'Wor\xfcber'), (u'Wortgepl\xe9nkel', u'Wortgepl\xe4nkel'), (u'Woruber', u'Wor\xfcber'), (u"wt/'rden", u'w\xfcrden'), (u'wtinsche', u'w\xfcnsche'), (u'wtinschst', u'w\xfcnschst'), (u'wtirde', u'w\xfcrde'), (u'Wtirdest', u'W\xfcrdest'), (u'Wtirfel', u'W\xfcrfel'), (u'Wtmschen', u'W\xfcnschen'), (u"WUl'd\u20ac", u'w\xfcrde'), (u'WUlfelbecher', u'W\xfcrfelbecher'), (u'wullte', u'wusste'), (u'Wundersch6n', u'Wundersch\xf6n'), (u'wunderschfin', u'wundersch\xf6n'), (u'Wunderschiin', u'Wundersch\xf6n'), (u'wunderschiinen', u'wundersch\xf6nen'), (u'wundersch\xe9n', u'wundersch\xf6n'), (u'wundersch\xe9ne', u'wundersch\xf6ne'), (u'Wundersch\xe9nel', u'Wundersch\xf6ne!'), (u'wundersch\xe9nen', u'wundersch\xf6nen'), (u'wundersch\xe9nes', u'wundersch\xf6nes'), (u'wundersoh\xe9n', u'wundersch\xf6n'), (u'wunsche', u'w\xfcnsche'), (u'Wunschen', u'W\xfcnschen'), (u'wunscht', u'w\xfcnscht'), (u'wunschte', u'w\xfcnschte'), (u'WUNSCHTE', u'W\xdcNSCHTE'), (u'wurcle', u'wurde'), (u'wUrde', u'w\xfcrde'), (u'Wurdige', u'W\xfcrdige'), (u'WURGT', u'W\xdcRGT'), (u'Wurmer', u'W\xfcrmer'), (u'Wursfsfulle', u'Wurststulle'), (u'Wuste', u'W\xfcste'), (u'WUSTEN', u'W\xdcSTEN'), (u'wutend', u'w\xfctend'), (u'wu\xdfte', u'wusste'), (u'wu\xdftest', u'wusstest'), (u"w\xa7r's", u"w\xe4r's"), (u'w\xa7re', u'w\xe4re'), (u"W\xa7ren's", u"W\xe4ren's"), (u"w\xe9'hrend", u'w\xe4hrend'), (u'w\xe9chst', u'w\xe4chst'), (u'W\xe9chter', u'W\xe4chter'), (u'w\xe9fs', u"w\xe4r's"), (u'W\xe9g', u'Weg'), (u'w\xe9hle', u'w\xe4hle'), (u'w\xe9hlejetzt', u'w\xe4hle jetzt'), (u'w\xe9hlen', u'w\xe4hlen'), (u'W\xe9hler', u'W\xe4hler'), (u'W\xe9hlern', u'W\xe4hlern'), (u'w\xe9hlt', u'w\xe4hlt'), (u'w\xe9hlte', u'w\xe4hlte'), (u'w\xe9hrend', u'w\xe4hrend'), (u'W\xe9hrung', u'W\xe4hrung'), (u'W\xe9ichter', u'W\xe4chter'), (u'w\xe9ihlen', u'w\xe4hlen'), (u'w\xe9ihrend', u'w\xe4hrend'), (u'w\xe9ir', u'w\xe4r'), (u"w\xe9ir's", u"w\xe4r's"), (u'w\xe9irde', u'w\xfcrde'), (u'W\xe9ire', u'W\xe4re'), (u'w\xe9iren', u'w\xe4ren'), (u'w\xe9irmen', u'w\xe4rmen'), (u'w\xe9irst', u'w\xe4rst'), (u'W\xe9lder', u'W\xe4lder'), (u'W\xe9ldern', u'W\xe4ldern'), (u'W\xe9lfen', u'W\xf6lfen'), (u'W\xe9lkchen', u'W\xf6lkchen'), (u'W\xe9nde', u'W\xe4nde'), (u'W\xe9nden', u'W\xe4nden'), (u'w\xe9r', u'w\xe4r'), (u"w\xe9r's", u"w\xe4r's"), (u'W\xe9re', u'W\xe4re'), (u'W\xe9ren', u'W\xe4ren'), (u'w\xe9ret', u'w\xe4ret'), (u'w\xe9rja', u'w\xe4r ja'), (u'W\xe9rm', u'W\xe4rm'), (u'W\xe9rme', u'W\xe4rme'), (u'w\xe9rmt', u'w\xe4rmt'), (u'W\xe9rst', u'W\xe4rst'), (u'w\xe9rt', u'w\xe4rt'), (u'W\xe9rter', u'W\xf6rter'), (u'W\xe9rterbuch', u'W\xf6rterbuch'), (u'w\xe9rtliche', u'w\xf6rtliche'), (u'W\xe9sche', u'W\xe4sche'), (u'W\xe9scheklammer', u'W\xe4scheklammer'), (u'W\xe9schst', u'W\xe4schst'), (u'w\xe9scht', u'w\xe4scht'), (u'w\ufb02rde', u'w\xfcrde'), (u'w\ufb02rden', u'w\xfcrden'), (u'W\ufb02rfel', u'W\xfcrfel'), (u"z'a'h", u'z\xe4h'), (u'Z/egf', u'liegt'), (u'Z/yarettenb\xe4ume', u'Zigarettenb\xe4ume'), (u'Z05', u'los'), (u'z6gel1e', u'z\xf6gerte'), (u'z6gern', u'z\xf6gern'), (u'zahlenm\xe9\ufb02ig', u'zahlenm\xe4\xdfig'), (u'zappelnl', u'zappeln!'), (u'Zauberspruchen', u'Zauberspr\xfcchen'), (u'Zaubervoodookr\xe9fte', u'Zaubervoodookr\xe4fte'), (u'Zauherpfippchen', u'Zauberp\xfcppchen'), (u'Zefietzende', u'Zerfetzende'), (u'zeitgem5B', u'zeitgem\xe4\xdf'), (u'Zeitgem\xe9\ufb02e', u'Zeitgem\xe4\xdfe'), (u'Zeitgeniissische', u'Zeitgen\xf6ssische'), (u'zeitgeniissischen', u'zeitgen\xf6ssischen'), (u'Zellenschliissel', u'Zellenschl\xfcssel'), (u'zerbeif$en', u'zerbei\xdfen'), (u'zerbeif$t', u'zerbei\xdft'), (u'zerf\xe9llt', u'zerf\xe4llt'), (u'Zermatschger\xe9usch', u'Zermatschger\xe4usch'), (u'zerm\ufb02rben', u'zerm\xfcrben'), (u'zerreifien', u'zerrei\xdfen'), (u'zerreilit', u'zerrei\xdft'), (u'zersfdren', u'zerst\xf6ren'), (u'zerst6rst', u'zerst\xf6rst'), (u'zerst6rt', u'zerst\xf6rt'), (u'zerstdren', u'zerst\xf6ren'), (u'Zerstfiren', u'Zerst\xf6ren'), (u'Zerstfirer', u'Zerst\xf6rer'), (u'Zerstfirungskraft', u'Zerst\xf6rungskraft'), (u'Zerstiickelung', u'Zerst\xfcckelung'), (u'zerstiire', u'zerst\xf6re'), (u'zerstiiren', u'zerst\xf6ren'), (u'Zerstiirer', u'Zerst\xf6rer'), (u'zerstiirt', u'zerst\xf6rt'), (u'zerstiirten', u'zerst\xf6rten'), (u'zerstiirtl', u'zerst\xf6rt!'), (u'Zerstiirungl', u'Zerst\xf6rung!'), (u'zerstoren', u'zerst\xf6ren'), (u'zerst\xe9re', u'zerst\xf6re'), (u'zerst\xe9ren', u'zerst\xf6ren'), (u'Zerst\xe9rer', u'Zerst\xf6rer'), (u'zerst\xe9rt', u'zerst\xf6rt'), (u'Zerst\xe9rung', u'Zerst\xf6rung'), (u'Zerst\xe9rungsfeldzug', u'Zerst\xf6rungsfeldzug'), (u'zertrlllmmert', u'zertr\xfcmmert'), (u'zfihlt', u'z\xe4hlt'), (u'Ziel160m', u'Ziel 160 m'), (u'Zihnelt', u'\xe4hnelt'), (u'ziichtiger', u'z\xfcchtiger'), (u'Ziige', u'Z\xfcge'), (u'Ziindkapseln', u'Z\xfcndkapseln'), (u'Zilnd', u'Z\xfcnd'), (u'Zilnden', u'Z\xfcnden'), (u'Zilndungsenergie', u'Z\xfcndungsenergie'), (u'Zilrich', u'Z\xfcrich'), (u'Zindern', u'\xe4ndern'), (u'Zingstlich', u'\xe4ngstlich'), (u'Ziufierst', u'\xe4u\xdferst'), (u'zleht', u'zieht'), (u'ZLIFUCK', u'zur\xfcck'), (u'Zooschlieliung', u'Zooschlie\xdfung'), (u'Zuckerschn\ufb02tchen', u'Zuckerschn\xfctchen'), (u'zuerstvor', u'zuerst vor'), (u'zuffillig', u'zuf\xe4llig'), (u'zuflligen', u'zuf\xfcgen'), (u'ZUFUCK', u'zur\xfcck'), (u'Zuf\xe9illig', u'Zuf\xe4llig'), (u'Zuf\xe9illigerweise', u'Zuf\xe4lligerweise'), (u'zuf\xe9llig', u'zuf\xe4llig'), (u'Zuf\xe9lligerweise', u'Zuf\xe4lligerweise'), (u"zug'a'nglichen", u'zug\xe4nglichen'), (u'ZUGANGSPRIORITKT', u'ZUGANGSPRIORIT\xc4T'), (u'zugehdrt', u'zugeh\xf6rt'), (u'zugeh\xe9rt', u'zugeh\xf6rt'), (u'zugestofien', u'zugesto\xdfen'), (u'Zugest\xe9ndnis', u'Zugest\xe4ndnis'), (u'Zugest\xe9ndnisse', u'Zugest\xe4ndnisse'), (u'Zugiinge', u'Zug\xe4nge'), (u'zuh6ren', u'zuh\xf6ren'), (u'zuh6rt', u'zuh\xf6rt'), (u'zuhiiren', u'zuh\xf6ren'), (u'zuhiirt', u'zuh\xf6rt'), (u'Zuh\xe9lter', u'Zuh\xe4lter'), (u'Zuh\xe9ren', u'Zuh\xf6ren'), (u'Zuh\xe9rer', u'Zuh\xf6rer'), (u'zukilnftiges', u'zuk\xfcnftiges'), (u'zul', u'zu!'), (u'zundete', u'z\xfcndete'), (u'Zundverteilerkappe', u'Z\xfcndverteilerkappe'), (u'zunjick', u'zur\xfcck'), (u'zun\xe9chst', u'zun\xe4chst'), (u'zun\xe9hen', u'zun\xe4hen'), (u'zun\xe9ihen', u'zun\xe4hen'), (u'Zuokerschntltchen', u'Zuckerschn\xfctchen'), (u'zurfick', u'zur\xfcck'), (u'zurfickblicken', u'zur\xfcckblicken'), (u'zurfickgekommen', u'zur\xfcckgekommen'), (u'zurfickgezogen', u'zur\xfcckgezogen'), (u'zurfickkehren', u'zur\xfcckkehren'), (u'zurfickzufuhren', u'zur\xfcckzuf\xfchren'), (u'zuriick', u'zur\xfcck'), (u'zuriickbleiben', u'zur\xfcckbleiben'), (u'zuriickgeben', u'zur\xfcckgeben'), (u'zuriickgehen', u'zur\xfcckgehen'), (u'zuriickgekommen', u'zur\xfcckgekommen'), (u'zuriickgezogen', u'zur\xfcckgezogen'), (u'zuriickhaben', u'zur\xfcckhaben'), (u'zuriickkehre', u'zur\xfcckkehre'), (u'zuriickkehren', u'zur\xfcckkehren'), (u'zuriickkehrst', u'zur\xfcckkehrst'), (u'zuriickziehen', u'zur\xfcckziehen'), (u'Zurijck', u'Zur\xfcck'), (u'zurijckbringen', u'zur\xfcckbringen'), (u'zurijckfordem', u'zur\xfcckfordern'), (u'zurijckgeholt', u'zur\xfcckgeholt'), (u'zurijckgekehrt', u'zur\xfcckgekehrt'), (u'zurijckgekommen', u'zur\xfcckgekommen'), (u'zurijckgelassen', u'zur\xfcckgelassen'), (u'zurijckgerufen', u'zur\xfcckgerufen'), (u'zurijckkehren', u'zur\xfcckkehren'), (u'zurijcknehmen', u'zur\xfccknehmen'), (u'zurijckstolpern', u'zur\xfcckstolpern'), (u'Zurilck', u'Zur\xfcck'), (u'Zurilckf', u'Zur\xfcck!'), (u'zurilckgeblieben', u'zur\xfcckgeblieben'), (u'zurilckgeholt', u'zur\xfcckgeholt'), (u'zurilckgekehrt', u'zur\xfcckgekehrt'), (u'zurilckhalten', u'zur\xfcckhalten'), (u'zurilckholen', u'zur\xfcckholen'), (u'zurilckkehre', u'zur\xfcckkehre'), (u'zurilckkehren', u'zur\xfcckkehren'), (u'zurilckkehrt', u'zur\xfcckkehrt'), (u'zurilckkommen', u'zur\xfcckkommen'), (u'zurilckkommt', u'zur\xfcckkommt'), (u'zurilcklassen', u'zur\xfccklassen'), (u'zurilckziehen', u'zur\xfcckziehen'), (u'Zurilckziehenl', u'Zur\xfcckziehen!'), (u'zurilckzugeben', u'zur\xfcckzugeben'), (u"zurl'Jck", u'zur\xfcck!'), (u"zurL'lck", u'zur\xfcck'), (u'zurLick', u'zur\xfcck'), (u'zurljckgeben', u'zur\xfcckgeben'), (u'zurllickfallen', u'zur\xfcckfallen'), (u'zurllickgekehrt', u'zur\xfcckgekehrt'), (u'zurllickkehrt', u'zur\xfcckkehrt'), (u'zurllickzukehren', u'zur\xfcckzukehren'), (u'zurlllckgehen', u'zur\xfcckgehen'), (u'zurlllckkomme', u'zur\xfcckkomme'), (u'zurtick', u'zur\xfcck'), (u'zurtickbringe', u'zur\xfcckbringe'), (u'zurtickgezogen', u'zur\xfcckgezogen'), (u'zurtlckgekommen', u'zur\xfcckgekommen'), (u'zurtlckvervvandeln', u'zur\xfcckverwandeln'), (u'Zuruck', u'Zur\xfcck'), (u'ZURUCK', u'ZUR\xdcCK'), (u'zuruckbleiben', u'zur\xfcckbleiben'), (u'zuruckblicken', u'zur\xfcckblicken'), (u'zuruckdenke', u'zur\xfcckdenke'), (u'zuruckfeuern', u'zur\xfcckfeuern'), (u'zuruckgehen', u'zur\xfcckgehen'), (u'zuruckgelegt', u'zur\xfcckgelegt'), (u'zuruckgewiesen', u'zur\xfcckgewiesen'), (u'zuruckgreifen', u'zur\xfcckgreifen'), (u'zuruckhaben', u'zur\xfcckhaben'), (u'zuruckkehren', u'zur\xfcckkehren'), (u'zuruckkehrten', u'zur\xfcckkehrten'), (u'zuruckkomme', u'zur\xfcckkomme'), (u'zuruckkommen', u'zur\xfcckkommen'), (u'zuruckk\xe9mst', u'zur\xfcckk\xe4mst'), (u'zuruckl', u'zur\xfcck!'), (u'zurucklassen', u'zur\xfccklassen'), (u'zurUcklieB', u'zur\xfccklie\xdf'), (u'zuruckl\xe9cheln', u'zur\xfcckl\xe4cheln'), (u'zurucknehmen', u'zur\xfccknehmen'), (u'zuruckverwandeln', u'zur\xfcckverwandeln'), (u'zuruckverwandelt', u'zur\xfcckverwandelt'), (u'zuruckziehen', u'zur\xfcckziehen'), (u'zuruckzukommen', u'zur\xfcckzukommen'), (u'zurverfilgung', u'zur Verf\xfcgung'), (u'zur\xe9ickrufen', u'zur\xfcckrufen'), (u'zur\ufb02ck', u'zur\xfcck'), (u'Zur\ufb02ckbleiben', u'Zur\xfcckbleiben'), (u'zur\ufb02ckfliegen', u'zur\xfcckfliegen'), (u'zur\ufb02ckgeschickt', u'zur\xfcckgeschickt'), (u'zur\ufb02ckgibst', u'zur\xfcckgibst'), (u"zus'a'tzliche", u'zus\xe4tzliche'), (u'zusammenbeilien', u'zusammenbei\xdfen'), (u'zusammenffigen', u'zusammenf\xfcgen'), (u'zusammenfugen', u'zusammenf\xfcgen'), (u'zusammenfuhren', u'zusammenf\xfchren'), (u'zusammenf\xe9illt', u'zusammenf\xe4llt'), (u'zusammenh\xe9ilt', u'zusammenh\xe4lt'), (u'zusammenh\xe9lt', u'zusammenh\xe4lt'), (u'zusammenh\xe9ngen', u'zusammenh\xe4ngen'), (u'zusammenreifien', u'zusammenrei\xdfen'), (u'zusammenzuschweifien', u'zusammenzuschwei\xdfen'), (u'zuschl\xe9gst', u'zuschl\xe4gst'), (u'zust6Bt', u'zust\xf6\xdft'), (u'zustofken', u'zusto\xdfen'), (u'zust\xe9indig', u'zust\xe4ndig'), (u'zust\xe9ncligen', u'zust\xe4ndigen'), (u'zust\xe9ndig', u'zust\xe4ndig'), (u'zust\xe9ndigen', u'zust\xe4ndigen'), (u'zus\xe9tzlich', u'zus\xe4tzlich'), (u'zus\xe9tzliche', u'zus\xe4tzliche'), (u'zuverlfissig', u'zuverl\xe4ssig'), (u'zuverllssig', u'zuverl\xe4ssig'), (u'zuverl\xe9ssig', u'zuverl\xe4ssig'), (u'zuverl\xe9ssiger', u'zuverl\xe4ssiger'), (u'zuviel', u'zu viel'), (u'zuviele', u'zu viele'), (u'zuzuflligen', u'zuzuf\xfcgen'), (u'Zu\ufb02ucht', u'Zuflucht'), (u'zvvei', u'zwei'), (u'Zw6If', u'Zw\xf6lf'), (u'zw6lfmal', u'zw\xf6lfmal'), (u'Zwel', u'Zwei'), (u'Zwickmfihle', u'Zwickm\xfchle'), (u'Zwillingstiichter', u'Zwillingst\xf6chter'), (u'Zwischenf\xe9lle', u'Zwischenf\xe4lle'), (u'zwnlf', u'zw\xf6lf'), (u'Zw\xe9ilften', u'Zw\xf6lften'), (u'zw\xe9lf', u'zw\xf6lf'), (u'z\xe9gerlich', u'z\xf6gerlich'), (u'z\xe9gern', u'z\xf6gern'), (u'Z\xe9gerns', u'Z\xf6gerns'), (u'z\xe9h', u'z\xe4h'), (u'z\xe9he', u'z\xe4he'), (u'z\xe9her', u'z\xe4her'), (u'z\xe9hl', u'z\xe4hl'), (u'z\xe9hle', u'z\xe4hle'), (u'z\xe9hlen', u'z\xe4hlen'), (u'Z\xe9hlerei', u'Z\xe4hlerei'), (u'z\xe9hlt', u'z\xe4hlt'), (u'z\xe9hltl', u'z\xe4hlt!'), (u'Z\xe9hlung', u'Z\xe4hlung'), (u'Z\xe9hne', u'Z\xe4hne'), (u'Z\xe9hnen', u'Z\xe4hnen'), (u'Z\xe9hneputzen', u'Z\xe4hneputzen'), (u'z\xe9ihle', u'z\xe4hle'), (u'z\xe9ihlen', u'z\xe4hlen'), (u'z\xe9ihlt', u'z\xe4hlt'), (u'Z\xe9ihlungen', u'Z\xe4hlungen'), (u'Z\xe9ihne', u'Z\xe4hne'), (u'Z\xe9libat', u'Z\xf6libat'), (u'\\/GFQHUQGH', u'Vergn\xfcgen'), (u'\\/OFVVUFf\u20ac', u'Vorw\xfcrfe'), (u'\\/Vahrheit', u'Wahrheit'), (u'\\/Vir', u'Wir'), (u"\\/\\/i6fUl'1l\u20acfi", u'Wie f\xfchlen'), (u"\\/\\/il'fUl'1I'\u20acl'1", u'Wir f\xfchren'), (u'\\Nynn', u'Wynn'), (u'_', u'-'), (u'\xc4u', u'Au'), (u'\xe9', u'\xe0'), (u'\xe9chzt', u'\xe4chzt'), (u'\xe9ffentlich', u'\xf6ffentlich'), (u'\xe9ffne', u'\xf6ffne'), (u'\xe9ffnen', u'\xf6ffnen'), (u'\xe9ffnet', u'\xf6ffnet'), (u'\xe9fft', u'\xe4fft'), (u'\xe9fter', u'\xf6fter'), (u'\xe9fters', u'\xf6fters'), (u'\xe9h', u'\xe4h'), (u'\xe9hnlich', u'\xe4hnlich'), (u'\xe9hnliche', u'\xe4hnliche'), (u'\xe9hnlicher', u'\xe4hnlicher'), (u'\xe9ih', u'\xe4h'), (u'\xe9ihnlich', u'\xe4hnlich'), (u'\xe9indern', u'\xe4ndern'), (u'\xe9itzend', u'\xe4tzend'), (u'\xe9lter', u'\xe4lter'), (u'\xe9lteste', u'\xe4lteste'), (u'\xe9ltesten', u'\xe4ltesten'), (u'\xe9ndere', u'\xe4ndere'), (u'\xe9ndern', u'\xe4ndern'), (u'\xe9ndert', u'\xe4ndert'), (u'\xe9nderte', u'\xe4nderte'), (u'\xe9nderten', u'\xe4nderten'), (u'\xe9ngstlich', u'\xe4ngstlich'), (u'\xe9rgere', u'\xe4rgere'), (u'\xe9rgern', u'\xe4rgern'), (u'\xe9rztliche', u'\xe4rztliche'), (u'\xe9rztlichen', u'\xe4rztlichen'), (u'\xe9rztlicher', u'\xe4rztlicher'), (u'\xe9sthetisch', u'\xe4sthetisch'), (u'\xe9tzend', u'\xe4tzend'), (u'\xe9ufierst', u'\xe4u\xdferst'), (u'\xe9ufiersten', u'\xe4u\xdfersten'), (u'\xe9uflserst', u'\xe4u\xdferst'), (u'\ufb02atterndem', u'flatterndem'), (u'\ufb02el', u'fiel'), (u'\ufb02iehen', u'fliehen'), (u'\ufb02jr', u'f\xfcr'), (u'\ufb02lhlen', u'f\xfchlen'), (u'\ufb02lllen', u'f\xfcllen'), (u'\ufb02lr', u'f\xfcr'), (u'\ufb02lrchterlich', u'f\xfcrchterlich'), (u'\ufb02ndet', u'findet'), (u'AIle', u'Alle'), (u'AIter', u'Alter'), (u'GI\xfcck', u'Gl\xfcck'), (u'PIaystation', u'Playstation'), (u'AIIes', u'Alles'), (u'AIso', u'Also'), (u'Ouatsch', u'Quatsch'), (u'AIles', u'Alles'), (u'BIeib', u'Bleib'), (u'KIaut', u'Klaut'), (u'AIlah', u'Allah'), (u'PIan', u'Plan'), (u'oderjemand', u'oder jemand'), (u'liestjetzt', u'liest jetzt')]), 'pattern': u"(?um)(\\b|^)(?:\\/a|\\/ch|\\/d\\/of|\\/ebte|\\/eid|\\/hn|\\/hnen|\\/hr|\\/hre|\\/hren|\\/m|\\/mmer|\\/n|\\/ndividuen|\\/nn|\\/oe|\\/sf|\\/sf\\/0\\/1n|\\/ungs|\\/Vfinuten|\\/\\\xe9nger|\\/\\\xe9uft|0\\/1|0\\/me|0\\/vne|00om|100m|120m|13Oj\\\xa7hrie|145m|150m|160m|165m|19m|20m|27m|30m|37m|38m|3km|5\\/ch|5\\/cher|5\\/cherer|5\\/e|5\\/nd|500m|5ulSere|60m|6de|6dere|6ffne|6ffnen|6ffnet|6fter|750m|85m|90m|a\\/\\/em|A\\/\\/es|abbeif\\$en|abdrficken|aBen|abergl\\\xe9iubischen|aberja|aberjemand|Aberjetzt|abf\\\xe9hrt|abf\\\xe9illt|abgef\\\xe9rbt|abgeh\\\xe9ngt|abgeh\\\xe9rt|abgelost|abgesprengli|abgestfirztl|abgestilrzt|abgestofien|abgew\\\xe9hlt|abgew\\\xe9hnen|abgew\\\xe9hnt|abge\\\xe9nderten|abh\\\xe9ingt|abh\\\xe9ngen|abh\\\xe9ngig|abh\\\xe9ngiges|Abh\\\xe9rstationen|Abjetzt|abkfihlen|Abkfirzung|abkommlich|Ablegenl|ablfisen|ablosen|Ablosung|abreif\\$en|Abrijcken|abr\\\xe9umen|Absch\\/ed|abschiefien|abschlief\\$en|abschliefien|abschwiiren|abstoflsend|Abtrijnnige|abwiirgt|abw\\\xe9gen|abzuh\\\xe9ren|abzuschwiiren|abzusfofien|ACh|Achtungl|Achzen|ACHZT|Acic|ADDRESSDATEI|Adi\\\xf6s|Admiralitat|Admiralit\\\xe9it|Admiralit\\\xe9t|Aff\\\xe9re|Aff\\\xe9ren|AFl|aggresivem|Agypten|aher|AI\\/en\\/vichtigste|Ain\\/vays|AIs|Aktivit\\\xe9iten|Aktivit\\\xe9ten|AKTMERT|Alarmsfufe|albem|Albtriiume|ale|alleinl|allejubeln|allern\\\xe9chsten|Allmiichtigerl|Allm\\\xe9chtige|Allm\\\xe9chtiger|allm\\\xe9hlich|Allm\\\xe9ichtiger|Allsparkl|allt\\\xe9iglichen|ALTESTE|Altester|Alzte|Amerx\\'kaner|amfisierst|Amiilsierst|amiisieren|amiisierenl|amiisierte|Amijsant|amlllsant|amlllsiert|amtlsant|Amusanf|amusant|Amusiert|Anderst|Anderung|Anderungen|anfa\\'ngt|Anffihrer|Anffingerl|Anfiihrer|anfijhlt|Anfingerl|Anfuhrer|Anfuhrern|Anf\\\xe9inger|Anf\\\xe9ingergliick|Anf\\\xe9nge|anf\\\xe9ngst|anf\\\xe9ngt|angebrfillt|angebrullt|angefiihrt|ANGEHCHDRIGE|angehfirt|Angehtirigen|angeh\\\xe9ren|angeh\\\xe9rt|angel\\\xe9chelt|angerilhrt|anger\\\ufb02hrt|angeschweifit|angespruht|angetiltert|Angriffspl\\\xe9nen|Angstschweili|anhiiren|Anh\\\xe9inger|anh\\\xe9lt|anh\\\xe9ngen|anh\\\xe9ren|ankijndigen|anliigen|anlugen|anmal3ende|ann\\\xe9hern|anriihrst|anrijuhren|anst\\\xe9indig|anst\\\xe9indiger|anst\\\xe9indiges|anst\\\xe9ndig|anst\\\xe9ndige|anst\\\xe9ndigen|Anst\\\xe9ndiges|Antik\\\xe9rper|Antiquit\\\xe9t|Antistrahlenger\\\xe9t|antwortenl|Anwe\\/sung|Anwe\\/sungen|Anw\\\xe9iltin|Anw\\\xe9lte|Anw\\\xe9ltin|Anzilge|Anztinden|Anzuge|Anzugen|anzuhiiren|anzuhoren|anzundenl|anzupiibeln|An\\\xe9sthesie|An\\\xe9sthesieprofessor|An\\\xe9sthesieteam|An\\\xe9sthesist|An\\\xe9sthesisten|An\\\xe9sthetikum|ARBEITERI|Arbeitsfl\\\ufb02gel|Armeefunkger\\\xe9t|Armel|Arschkichern|Arschliicher|Arschliichern|Arschl\\\xe9cher|Arschl\\\xe9chern|Arzte|Arzten|Arztin|Atemger\\\xe9usche|Atlantikkiiste|Atlantikkuste|ATMOSPHARE|Atmosph\\\xe9re|Atmosph\\\xe9renbereich|Atmosph\\\xe9reneinflugsequenz|Atmosph\\\xe9reneintritt|Attenfaiter|Attent\\\xe9iter|Attent\\\xe9ter|Attent\\\xe9ters|Attraktivit\\\xe9t|auBen|Aubenblick|AuBenbord|AuBenwelt|auBer|AuBerdem|auBerhalb|auc\\/1|auchl|Auf\\$erdem|auf3er|aufAugenh6he|aufblilhende|auff\\'a\\'ngt|Auff\\\xe9lliges|aufgebltiht|aufgeftlhrt|aufgeh\\\xe9ingt|aufgeh\\\xe9rt|aufgekl\\\xe9rt|aufger\\\xe9umt|aufgespiefit|aufgewiihlter|aufgez\\\xe9hlt|Aufh6ren|aufhbren|aufhdrf|aufhfiren|aufhiiren|Aufhoren|Aufh\\\xe9iren|aufh\\\xe9ngen|Aufh\\\xe9ren|aufh\\\xe9renl|aufi|Aufienministerium|aufier|Aufierdem|aufiergew\\\xe9hnliche|aufierhalb|Aufierirdischer|Aufierlich|aufierordentlich|Aufkenposten|aufkisen|aufkl\\\xe9ren|Aufkl\\\xe9rung|aufl|Aufl6sung|aufliisen|auflser|aufl\\\xe9sen|aufmiibeln|aufraumte|aufr\\\xe9umen|aufschlief\\$en|Aufschlull|aufSer|aufSIJBigkeiten|aufspturen|aufstellenl|Aufst\\\xe9ndige|aufTanis|Auftr\\\xe9ge|aufvv\\\xe9ndigen|aufw\\\xe9ichst|aufw\\\xe9rmen|aufZ\\>er|Aufztlge|aufzuhiivren|aufzukl\\\xe9ren|aufzuldsen|aufzur\\\xe9umen|aufz\\\xe9hlen|auf\\\xe9er|auf\\\ufb02iegen|Augenm\\\xe9igen|aul\\'5er|aul3er|Aul3erdem|aul5er|aulier|Aulierdem|auliergewfihnlich|aulierhalb|Aulierirdischen|auller|aullerhalb|AulSer|AulSerdem|ausdriicken|ausdriickt|ausdrijcken|ausdrucklicher|Ausdr\\\ufb02cken|Ausen\\/v\\\xe9hlte|Ausen\\/v\\\xe9hlter|auserw\\\xe9hlt|Ausffillen|ausfijhren|ausfijhrt|ausfuhren|ausfullt|ausgef\\\ufb02llt|ausgeliischt|ausgeliist|ausgel\\\xe9ist|ausgel\\\xe9scht|ausgel\\\xe9st|ausgeriickt|ausgerijstet|AUSGEWAHLT|ausgew\\\xe9hlt|Ausg\\\xe9ngen|aush6hlen|aushiilt|Aushilfspunkerl|aush\\\xe9lt|ausilben|Auskunfte|ausl|Ausl\\\xe9nder|Ausl\\\xe9nderl|ausl\\\xe9schen|ausl\\\xe9sen|Ausl\\\xe9ser|AusmaB|ausprobie\\\ufb02|Ausriistung|ausrusten|Ausrustung|Ausschullware|ausschwinnenl|auszudriicken|auszuschliefien|auszuw\\\xe9hlen|Autorit\\\xe9t|Autoschlilssel|Autoschl\\\ufb02ssel|au\\\ufb02\\/viihlt|Au\\\ufb02ergewiihnlich|Azevedol|A\\\ufb02es|B\\/ick|b\\/olog\\/sch|b\\/sschen|B6se|B6sem|B6ser|Babym\\\xe9dchen|Ballastst\\\xe9ffchen|Ballm\\\xe9dchen|Ballm\\\xe9idchen|Ballonverk\\\xe9ufer|Balzenl|Bankijberfall|Barbarenilberfall|Barenk\\\xe9nig|basfeln|Bastianol|Bastlano|Bauchfellentztmdung|Bauchkr\\\xe9mpfe|bauf\\\xe9llig|bauf\\\xe9llige|Baumst\\\xe9mme|Baupl\\\xe9ne|Bbses|be\\/de|bedecktl|Bedilrfnisse|Bedilrfnissen|Bedllirfnisse|bedrijckt|bedr\\\xe9ngen|bedr\\\xe9ngt|bedr\\\xe9ngten|Beeilungf|Beeilungl|Beerdingungsinsiiiui|Beerdingungsinstitut|Befehll|beffirdert|Beffirderung|befiirchte|befiirchteten|befiirdert|befiirderte|Befiirderung|befilrchtete|befllirchte|befurworte|befurwortet|bef\\\xe9rdere|bef\\\xe9rdert|Bef\\\xe9rderung|beg\\/ng|begl\\\ufb02ckt|begniigt|begrfindetes|Begriiliungsruf|begrijfien|Begrilfiung|Begrilfkung|begrL\\'llZ\\>en|BegrUBungsruf|begrUf\\$t|begrufie|begrufit|Begrundung|Beh6rden|beh\\\xe9lt|Beh\\\xe9lter|beh\\\xe9mmert|beiB|beiBen|beiBt|beif\\$t|beif2\\>en|beifken|beiflsen|beijenen|Beiliring|BEKAMPFEN|bekannf|bekanntermafken|bek\\\xe9me|bek\\\xe9mpfen|Bek\\\xe9mpfung|bel|belde|beliellsen|belm|Beltlftungstunnels|Beluftungstunnel|Beluftungstunnell|bel\\\xe9stigen|Bemiihe|Bemiihen|bemL\\'lhe|bemtuht|bemuhen|bemuhten|Ben\\\xe9tigen|ben\\\xe9tigt|ben\\\xe9tigten|Beobachtar|bereft|bereitf\\\xe9ndet|beriichtigtsten|beriichtlgten|beriihmt|Beriihmtheiten|beriihren|Beriihrend|beriihrt|Beriihrtl|berijhrt|berilhmter|berilhrt|Berilhrung|Berks\\/1\\/re|BerL\\'lhre|berllichtigter|berllihren|berllihrt|berlllhmten|Bern\\/e|beruhrt|beruhrte|ber\\\ufb02hmter|besafi|Besch\\'a\\'ftigt|bescheifien|beschiftigt|beschiiftigt|beschiitzen|beschiitzt|beschiltze|beschiltzen|beschleun\\/gt|beschliefkt|beschlie\\\ufb02tloszuziehen|beschllitzet|beschllitzt|beschr\\\xe9nkt|Beschr\\\xe9nkungen|beschtitze|beschutzen|besch\\\xe9digt|besch\\\xe9ftigen|besch\\\xe9ftigt|besch\\\xe9ftigte|besch\\\xe9ftigten|besch\\\xe9iftige|besch\\\xe9iftigt|Besch\\\xe9imen|besch\\\xe9mendste|besch\\\xe9oligen|besch\\\ufb02tzen|Besch\\\ufb02tzer|Besf\\\xe9f\\/gen|Besitztijmer|BESTATIGE|BESTATIGT|bestenl|bestiirzt|bestiitigen|bestltigt|bestx\\'mmt|best\\\xe9indige|best\\\xe9itigt|Best\\\xe9itigung|Best\\\xe9itigungen|Best\\\xe9tige|Best\\\xe9tigen|best\\\xe9tigt|Best\\\xe9tigung|bes\\\xe9inftigen|bes\\\xe9inftigt|bes\\\xe9nftigen|Betiiubt|betriibt|betriigen|Betriiger|betriigt|betrijgen|Betrijgerl|betrilgen|betrtlgerischer|betr\\\xe9chtliches|Betr\\\xe9ge|betr\\\xe9gt|Bettw\\\xe9ische|Beviilkerung|bevorwir|bev\\\xe9lkern|bewegf|Bew\\\xe9hrungsauflage|bew\\\xe9ihrte|bew\\\xe9iltigen|bew\\\xe9issern|bew\\\xe9lkten|bew\\\xe9ltigen|Bew\\\xe9ltigung|bew\\\xe9ssern|Bew\\\xe9sserungssysteme|Bezirksgelinde|bezuglich|be\\\xe9ingstigende|be\\\xe9ngstigend|be\\\xe9ngstigender|bffnen|Bficher|Bfiro|bfirsten|bfise|bfisen|bfiser|bfises|bfiseste|bfisesten|bgsonderen|BI6de|Bierbfichse|Biicher|Biicherei|Biick|Biiffel|BIiHlt|Biihne|Biilcherei|BIind|Biirger|Biirgerrechte|Biiro|Biiros|Biirotiir|biirsten|Biise|Biisen|biises|Bijchern|Bijhne|Bijndnis|Bijrger|Bijrgermeister|Bijro|Bijrokraten|Bijrzel|Bilchern|Bildseitenverh\\\xe9ltnis|Bilndel|Bilro|BIood|BIQIS|Bischiife|Bischiifen|Bisch\\\xe9fe|bistja|bistjetzt|Bittejetzt|bittersiJl3es|Bittesch\\\xe9n|BIue|bi\\\xdfchen|BL1hne|Bl6cke|bl6d|bl6de|bl6den|bl6der|bl6des|Bl6dian|Bl6dmann|Bl6dsinn|Blauaugel|Blddes|Ble\\/bf|bleibenl|blelbenl|Blfidmann|Blfidsinn|Blfimchen|BLicher|BLihne|Bliid|bliide|bliiden|bliidere|bliides|Bliidmann|Bliidsinn|bliiht|bliirgerlichen|Blijmchen|Bllck|Bllindel|Blllroklammer|bln|bloB|bloBen|bloBstellen|blockiertl|BLODE|blof\\$|blofl|Blol2\\>|blol3|blol3\\>|blol3stellen|bloli|blolistellen|blolls|bls|Blst|bltte|Blumenstr\\\xe9iulichen|Blument\\\xe9pfen|Blutgetr\\\xe4nkte|Blutgetr\\\xe9nkte|blutjungl|blutriinstig|Blutvergiefien|bl\\\xe9d|Bl\\\xe9de|bl\\\xe9den|bl\\\xe9der|Bl\\\xe9des|Bl\\\xe9dheit|Bl\\\xe9dmann|Bl\\\xe9dsinn|Bl\\\xe9iser|Bl\\\xe9ser|bl\\\xe9st|Bnjicke|Bodensch\\\xe9tze|Bogenschiefien|Bogenschiefienl|Bogenschiefiens|Bogenschiitze|Bogenschiitzen|Bogenschijtze|Bogenschijtzen|Bogenschutzen|Bogenschutzenl|BOnjour|bosartige|Bracken|Briicke|Briicken|Briider|Briihe|Briillen|briillt|Brijcke|Brijderlichkeit|brijllen|Brilcke|Brilder|Brilllen|brillltjeden|Brilnette|Brilsten|brilten|BrL\\'lcke|brL\\'lllen|brlliderliche|Brllidern|Brlliste|Broschijre|Broschilren|Broschuren|Brucke|Brucken|Brudern|Bruhe|brullen|brullt|Brutalitiit|Brutzelhtihnchen|Br\\\xe9chtet|Br\\\xe9iutigam|Br\\\xe9sel|Br\\\xe9tchen|br\\\xe9uchte|br\\\xe9uchten|br\\\xe9unen|Br\\\xe9ute|Br\\\ufb02cke|Br\\\ufb02der|Btiro|Btiser|Bucher|Buchern|Budgetkiirzung|BUFO|Bugschutzgerate|Buhnenbild|Bullel|Buml|Bundnis|Burger|Burgerrechtlerin|Buro|BURO|Burol|Burottlr|Busche|B\\\xe9ickchen|B\\\xe9ickerei|B\\\xe9ille|B\\\xe9inder|B\\\xe9ir|B\\\xe9irgermeister|B\\\xe9iro|b\\\xe9ise|B\\\xe9iume|B\\\xe9nder|B\\\xe9r|B\\\xe9ren|B\\\xe9renhasser|B\\\xe9renhunger|B\\\xe9renj\\\xe9ger|B\\\xe9renk\\\xe9nig|B\\\xe9renlaute|B\\\xe9renrolle|B\\\xe9renschnitzereien|B\\\xe9renstimmen|B\\\xe9rin|B\\\xe9risch|B\\\xe9rs|B\\\xe9rte|b\\\xe9s|b\\\xe9se|b\\\xe9sen|B\\\xe9ses|B\\\xe9ume|B\\\xe9umen|B\\\ufb02chern|B\\\ufb02ste|Cafe|Caf\\\xe4|CASAREN|Charakterm\\\xe9ngel|Charakterst\\\xe9rke|Chrlntlna|Ciden|Ciffnet|Cihrchen|Citro\\\xe9n|clamit|class|Clbernimmt|cler|Coimbrasl|CommanderWill|Corenillal|Cowboyscheifi|C\\\xe9sar|D\\/e|d\\/ese|d\\/esem|d\\/esen|D\\/eser|D\\/eses|D\\/sko|dabel|dachfen|daffir|dafiir|Dafijr|Dafijur|Dafilr|dafL\\'lr|dafLir|dafljr|dafllir|Daflllrwar|daftir|dafUr|dafzjir|dajemand|dal|Damenh\\\xe9nde|damitl|damlt|DANEMARK|darfiber|Dariiber|darijber|Darilber|dart\\/\\'ber|dartlber|DARUBER|DarUber|dasjetzt|dasl|Dateniibermittlung|dauem|dauerf|dazugeh\\\xe9ren|Da\\\xdf|Da\\\ufb02lr|Ddrfern|def|Defekf\\/v|deinerZelle|deln|delne|demfiltigen|Demijtigung|demllitige|demllitigen|denkwurdiger|denkw\\\ufb02rdiger|derAbgeordnete|derAusgabe|derAusl6ser|DerjL\\'lngste|derjunge|dermaben|derTyp|derWeg|derWelle|DerWL1rfel|DerZauberer|de\\_\\_n|dfeserr|dffentlichen|dffnen|Dfimonen|dfinn|dichl|diej\\\xfcngste|dienstunfahig|Dieselkapit\\\xe9in|Dieselkapit\\\xe9n|Dieselmotorenl|dieserAufnahme|Dieserjunge|Diiit|diirfe|Diirfen|diirft|diirfte|dijfien|dijnn|dijrfen|Dijrfte|dijstere|dilmmer|dilrfen|dilrft|dilrften|dilrftig|Dine|dirja|dirjemand|dirjetzt|dirJulie|dirl|dirwehzutun|Di\\\xe9t|Di\\\xe9tberaterin|Di\\\xe9tbier|dlch|Dle|dles|Dlese|Dlfit|Dlitplan|dllirfen|dllirft|dllirstet|dlr|doc\\/1|dochl|dolthin|Doppelgfiner|Doppelgfinger|Doppelg\\\xe9inger|Doppelg\\\xe9nger|Doppelzijngig|doppelztmgiger|dor|Dr\\'a\\'ngt|drachengriinen|Drahte|dranl|drau\\/3en|drau\\/Sen|drauBen|drauf\\$en|draufdrilcken|draufgestllirzt|draufg\\\xe9ngerisch|draufien|draufken|drauflsenl|drauf\\\xe9en|drauilen|draul3en|draul5en|draulien|draullen|draulSen|Dreckl\\\xe9chern|Drecksmiihle|Drecks\\\xe9cke|drfiben|Drfick|Drfingeln|drih|driiben|driicken|driickt|drijben|drijber|drijck|drijckt|drilben|drilber|drilcken|drLiber|drlliben|drlllben|Drogenabh\\\xe9ngige|Drticken|druben|drubenl|druber|Druckkn\\\xe9pfe|drunterliegt|Dr\\\xe9nage|dr\\\xe9ngeln|dr\\\xe9ngen|dr\\\xe9ngt|dr\\\ufb02ben|dtirft|dtlrfen|Dudels\\\xe9cken|dUFf\\\u20acl\\'1|dul|dull|Dummk6pfe|Dummkiipfe|Dunnschiss|durchdrficken|durchdr\\\xe9ngen|Durchfiihrung|durchfuhren|durchgefiihlt|durchgefijhrt|durchgefuhrt|durchgef\\\ufb02hrt|Durchg\\\xe9nge|Durchladenl|durchlfichere|durchsetzungsf\\\xe9higer|durchst\\\xe9bern|durchwilhlt|durchzufilhren|durchzufuhren|Durfen|durft|dusterer|D\\\xe9cher|D\\\xe9imon|D\\\xe9imonen|D\\\xe9inemark|D\\\xe9inemarks|D\\\xe9inen|d\\\xe9inisches|d\\\xe9mlich|D\\\xe9mliche|d\\\xe9mlichen|d\\\xe9mlicher|d\\\xe9mlichl|d\\\xe9mmert|D\\\xe9monenb\\\xe9ren|d\\\xe9monischen|D\\\xe9rme|D\\\xe9rrfleisch|D\\\xe9umchen|d\\\ufb02rfen|E\\/\\/e|e\\/n|e\\/ne|e\\/nem|e\\/nen|e\\/ner|e\\/nes|e\\/ns|e\\/nsf|E9YPt|Ea\\/vtes|ebenbfirtig|ebenburtige|Ec\\/vte|echfen|edelm\\\ufb02tig|efn|efwas|Eheminner|Ehem\\\xe9nnern|Ehezerstfirerin|Ehrenbijrger|EHRENBURGERSCHAFT|Ehreng\\\xe9iste|Eichhfirnchen|Eichhiirnchen|Eichh\\\xe9rnchens|eifersfichtig|eifersiichtig|eifers\\\ufb02chtig|eigenh\\\xe9ndig|eigenmlchtig|eigenntltziges|Eihnlich|Eimen\\/veise|Einbruche|eindriicken|Eindring\\/Inge|eindrucken|einejunge|einerfr\\\ufb02hen|einervorfuhrung|einfiihren|Einfiihrung|einfilgen|einfilhlsamsten|einflllgen|Einflusse|einfugen|einfuhrten|Einfuhrung|Einf\\\xe9ltige|eingefiigt|eingef\\\ufb02gt|eingehiillt|eingepr\\\xe9gt|einger\\\xe9iumt|einger\\\xe9umt|eingeschl\\\xe9fert|eingeschr\\\xe9nkt|eingesch\\\xe9itzt|eingesch\\\xe9tzt|eingesturzt|eingieBt|eingschaltet|Einh\\\xe9rnern|einlegenl|einl\\\xe9dt|einl\\\xe9sen|Einsatzfahigkeit|Einschiichterung|Einschliefklich|Einschlielilich|einstellenl|Eins\\\xe9tze|eint\\\xe9nig|Einzelg\\\xe9ngerin|einzusch\\\xe9tzen|Eisstiirme|Elektrizit\\\xe9t|elfenbeingetfinte|elit\\\xe9rer|Eln|Elne|elnem|Elnen|elner|Elnes|empfindungsf\\\xe9higen|Empf\\\xe9inger|empf\\\xe9ngt|Empiirend|Empiirendste|empiirt|emst|en\\/varten|En\\/vartungen|en\\/v\\\xe9hnt|Enchant\\\xe4|endgiiltig|endgultig|endgultigen|endg\\\ufb02ltig|endlichl|ENERIGE|enfternt|Engl\\\xe9nder|Engl\\\xe9nderin|eniillen|entbl6Bte|entbl6f\\$en|entfiihre|entfiihrt|entfiihrte|Entfiihrung|Entftihrung|ENTFUHRUNGSVERDACHTIGER|enthllt|enthUllt|enth\\\xe9lt|entliiften|Entliiftungen|Entlijlftungen|entluften|entl\\\xe9sst|Entreilit|entriistet|entr\\\xe9itseln|Entschlrfen|Entschlull|ENTSCHLUSSELN|Entschlussen|entsch\\\xe9rfen|enttausche|enttiiuscht|Enttluscht|Enttluschungen|entt\\\xe9iuschen|entt\\\xe9uschen|entt\\\xe9uschst|entt\\\xe9uscht|Entv\\\\\\/Urfe|Entwicklungsl\\\xe9ndern|entzllickt|entzllindet|entzuckend|entzundet|enzv\\\xe9rmt|Er6ffnen|erb\\\xe9rml\\/ch|erb\\\xe9rmlich|Erb\\\xe9rmliches|Erdnijsse|erdriickt|erd\\\xe9ihnliche|erfebst|erffillen|erfiffnet|erfiille|erfiillen|erfiillt|erfijllt|erfillle|erfilllen|erfilllt|erfllille|erfllillt|erflllllen|Erfolgl|erfullen|erfullt|erf\\\xe9hrst|erf\\\xe9hrt|erf\\\ufb02llen|ergrllindet|erhalfen|Erhdhe|erhiihter|erhiiren|ERHKLT|erhllt|erh\\\xe9hen|erh\\\xe9ht|erh\\\xe9ilt|erh\\\xe9lt|erh\\\xe9rt|erh\\\xe9rte|eriiffnet|erja|erjetzt|erjung|erkl\\'a\\'ren|erkl\\'air\\'s|erklaren|erklfire|Erklfirung|erklirt|erkllre|erkllrt|erkllrte|erkllrten|Erkllrung|erkl\\\xe9ir|erkl\\\xe9ire|erkl\\\xe9iren|erkl\\\xe9r|erkl\\\xe9r\\'s|erkl\\\xe9rbar|Erkl\\\xe9re|erkl\\\xe9ren|erkl\\\xe9rt|Erkl\\\xe9rung|erk\\\xe9ltest|erlC\\'\\>st|erldse|Erled\\/gen|erlieB|erlnnem|erl\\\xe9scht|erl\\\xe9sen|erl\\\xe9st|Erl\\\xe9sung|ermbglichen|Erm\\\xe9chtige|erm\\\xe9glicht|erm\\\xe9glichte|ernlllchtert|ern\\\xe9hren|Ern\\\xe9hrung|eroffnet|Erpressungsscheilie|err\\\xe9tst|erschieB|erschieBen|erschiefien|erschiefit|erschiefke|erschielie|Erschielit|erschiipft|erschiittert|erschilttert|erschl\\\xe9gt|ERTCHDNT|ERTCNT|ERTGNT|ertiffnen|ertr\\\xe9gst|ertr\\\xe9inken|ert\\\xe9nt|ervvartez|ervvilrgen|ervv\\\xe9hnen|ervv\\\xe9ihnen|ervv\\\xe9ihnt|ervv\\\xe9ihnte|Erv\\\\\\/an|Erv\\\\\\/an\\'s|erw\\'a\\'hnt|Erwar|erwe\\/sen|Erwfirmung|Erwird|Erwtirde|erw\\\xe9gt|Erw\\\xe9gung|Erw\\\xe9hne|erw\\\xe9hnen|erw\\\xe9hnt|erw\\\xe9hnte|Erw\\\xe9hnung|erw\\\xe9ihlt|erw\\\xe9ihnt|erw\\\xe9rmt|erz\\'a\\'hlt|Erzdiiizese|erzfihlen|Erzfihler|erzihlenl|erziihlen|erziihlt|erziirnt|erzilrnt|erzllirnt|erzurnen|erz\\\xe9hl|erz\\\xe9hle|Erz\\\xe9hlen|erz\\\xe9hlerische|erz\\\xe9hlerischen|erz\\\xe9hlerischer|Erz\\\xe9hlkunste|erz\\\xe9hlst|erz\\\xe9hlt|erz\\\xe9hlte|Erz\\\xe9hlung|Erz\\\xe9ihl|Erz\\\xe9ihle|erz\\\xe9ihlen|erz\\\xe9ihlst|erz\\\xe9ihlt|erz\\\xe9ihlte|er\\\xe9ffnen|er\\\xe9ffnet|er\\\xe9ffnete|Er\\\xe9ffnungsaufnahme|Er\\\xe9ffnungssequenz|Er\\\xe9ffnungsszene|Er\\\ufb02lllen|etemity|etvva|euc\\/1|Europ\\\xe9er|europ\\\xe9ische|ex\\'nfac\\'\\/7|Examenspriifungen|Exekutivzust\\\xe9noligkeit|Explosionenl|Extrablattl|F\\/nden|F\\/ugba\\/I|Fahnrich|fahrlissiges|Fairbankverlieh|Fallef|fallengelassen|Fallschirmj\\\xe9gereinheiten|Fam\\/Z\\/e|Fa\\\xdf|FBl|Fe\\/nd|fehlschl\\\xe9gt|Feindberllihrung|Feind\\\xfcbewvachung|feltig|femen|fernh\\\xe9ilt|Festhaltenl|Fettw\\\xe9nste|Feuen\\/vehr|Feuerliischer|Feuervvehrrnann|Feuerwehrl|Feuerwfirmen|Feue\\\ufb02|ff\\'Ul\\'1\\\u20acf\\'\\\u20acl\\'1|Ffiegen|ffihft|ffihren|ffinf|ffir|ffirchte|ffirs|ffittere|FI6he|Fiasenm\\\xe9iher|fibel|fiber|fiberdressierter|fibergezogen|fiberhaupt|fiberholt|fiberlegt|fibernachtet|fiberspannt|fibertreiben|fiberzfichtete|fibrig|Fieferenz|Fieifi|fiffentlichkeit|fiffnen|fiffnest|fifter|Fihigkeit|fihneln|Fihrt|fiihl|fiihle|fiihlen|fiihlst|fiihlt|Fiihlte|Fiihre|Fiihren|Fiihrerin|Fiihrerschein|fiihrfe|fiihrt|fiihrte|Fiihrungsf\\\xe9ihigkeiten|Fiihrungsprogramm|Fiihrungsstil|Fiilcksicht|fiillen|fiinden|fiinf|fiinfhundert|fiinfzehn|fiir|fiirchte|fiirchten|fiirchterlich|fiirchterlichl|fiirchterllches|fiirchtet|fiirchteten|fiirjeden|Fiirmchen|fiirs|Fijgen|fijhl|fijhle|fijhlen|fijhlst|fijhlt|fijhren|Fijhrer|fijhrt|Fijhrungsqualit\\\xe9iten|FiJl3en|Fijlie|fijlr|Fijnf|Fijnfziger|fijr|fijrchte|fijrchten|Fijrjedenl|fijrs|fiJrVorteile|fijttern|fijur|filhl|filhle|filhlen|filhlte|filhre|filhren|Filhrern|Filhrerschein|filhrst|filhrt|filhrte|filhrten|Filhrung|Fillle|Filll\\\xe9en|Filmemachen|Filml|filnf|Filn\\\ufb02|Filr|filr\\'ne|filrchten|filrchterlich|filrs|filter|findem|findenlassen|Fingerabdrijcke|Fingerabdrilcke|Fingerniigeln|Fingern\\\xe9gel|Fingern\\\xe9geln|fingstlich|Fiothaarige|Firmen\\\xe9rzte|Fischk\\\xe9pfe|FIUssigkeitsgleichgewicht|Fiusten|FIynn|fjffnen|fL\\'1\\'r|fL\\'1hle|FL\\'1r|fL\\'ir|fL\\'lr|fL1r|Fl6he|Flclse|fleifkige|fleifkiges|fleil3ig|Fleischb\\\xe9llchen|Fleischkl6l\\'Sen|Flfige|Flfigell|flfistert|Flhigkeiten|Flhnrich|Flhnriche|flieBen|Fliefiband|Fliefiheck|Flieflsb\\\xe9nder|flielit|flielSt|FLif\\$e|fLihlt|fliichtige|Fliigel|flijchtig|Flijgel|Flijgelfedernl|Flilssige|flilstert|fLir|fljhrt|Fljr|flJr\\'n|fllihrst|Fllihrt|fllinf|fllinften|Fllinkchen|Fllir|fllirchte|fllirchten|fllirchterlichen|fllirchtet|Fllirsten|Fllitterungszeitenl|flllgte|flllgten|flllhrten|Flllhrung|Fllligel|flllistern|fllllstert|flllrchte|flllrchten|flllrjede|Flohtransporterl|Floli|Flottenalzt|Flottenstiitzpunkt|Flottenstutzpunkt|Flrma|fltlsterte|Fluchtig|Flughdhe|Flughiihe|Flugh\\\xe9ifen|Flugunf\\\xe9ihig|flugunf\\\xe9ihigen|Flugunf\\\xe9ihigl|Flugzeugl|FLUSSIGER|Flustereffekt|Flustern|FLUSTERT|fl\\\ufb02stern|fl\\\ufb02sterten|Folgendesz|fortgespiilt|fortspiilen|fortw\\\xe9hrend|Fr\\/ed\\/10\\/|Fr5ulein|Fr6hliche|Frachfmodule|Frafi|fragfe|Fral\\'S|fralken|Franzfisisch|Franziisin|franziisische|franziisischen|franziisischer|franziisisches|Franz\\\xe9sisch|franz\\\xe9sische|franz\\\xe9sischen|franz\\\xe9sischer|Franz\\\xe9sisches|FRAULEIN|fre\\/em|freffen|freilieB|freimiitigen|Fressger\\\xe9usche|Frfichtekuchen|frfih|frfiher|Friedh\\\xe9fe|Friichtchen|friih|friihen|friiher|friihere|friihliche|friihlichen|Friihstiick|friilher|friilhesten|Frijchte|frijh|frijher|frijherer|frilh|frilhen|Frilher|frilhere|Frilhst\\\ufb02ck|Fris6r|frL\\'lher|Frljihling|Frllichte|frllih|frlliher|Frllihstiickskiiche|fro\\/1|FROHLICHE|frtih|Frtiher|Frtihliche|Frtihstticksei|Frtlh|FrUh|FRUHE|fruhe|fruhen|Fruher|fruheren|Fruhling|Fruhlingsrolle|FrUhstUck|Fruhstuck|frUhstUcken|fr\\\xe9hliches|fr\\\xe9ihfiches|fr\\\xe9ihlich|Fr\\\xe9iulein|fr\\\xe9nen|Fr\\\xe9sche|Fr\\\xe9ulein|ftihlen|Ftillhorn|Ftir|Ftirs|Ftlhrung|ftlrchte|ftmf|Fu\\/3|FuB|FuBballspieler|FUBen|Fuf\\$|Fufi|Fufiabdrucke|Fufiballtraining|FufL|Fuflsball|Fuflsballszene|fUhl\\'t|fuhle|fuhlst|fUhlt|fUhre|fUhrt|fuhrte|fuhrten|Fuhrung|Fuhrungsf\\\xe9higkeiten|Fuhrungsoffizier|Fuhrungsqualit\\\xe9t|FUI3en|Fuli|Fuliball|Fulisohlen|FUller|fUllten|fumt|Fundbiiro|FUnf|Funftbeste|Funkchen|Funkger\\\xe9it|Funkger\\\xe9ite|Funkger\\\xe9t|funktionstilchtig|FUR|Fur|fUrAusweichmanc\\'\\\xa7ver|furchteinfl6Bend|furchteinfl6Bende|furchten|Furchtest|furchtet|furchteten|fureinander|furjeden|furjemanden|furjudische|furs|FUrWalter|fut|Fu\\\ufb02ballspiel|F\\\xa7hnlein|f\\\xe9\\/\\/t|f\\\xe9hig|F\\\xe9higkeit|F\\\xe9higkeiten|f\\\xe9hnen|F\\\xe9hnens|F\\\xe9hnerei|F\\\xe9hnleinmiitter|F\\\xe9hre|f\\\xe9hrst|f\\\xe9hrt|F\\\xe9ihigkeit|F\\\xe9ihigkeiten|f\\\xe9ihrt|f\\\xe9illst|f\\\xe9illt|F\\\xe9ilschung|F\\\xe9ingt|f\\\xe9ir|F\\\xe9lle|F\\\xe9llen|f\\\xe9lligl|F\\\xe9llt|f\\\xe9llt\\'s|F\\\xe9lschen|F\\\xe9lschung|f\\\xe9nde|F\\\xe9ngst|F\\\xe9ngt|f\\\xe9rben|f\\\xe9rbt|f\\\xe9rdern|f\\\xe9rmlich|F\\\xe9ustlinge|f\\\xfcr\\'ne|f\\\xfcrchlerlichen|f\\\xfcrjede|f\\\xfcrjeden|F\\\ufb02hrungsprogramm|F\\\ufb02hrungsstil|f\\\ufb02llen|f\\\ufb02llt|f\\\ufb02nf|F\\\ufb02r|f\\\ufb02rchte|f\\\ufb02rjeden|g\\/bf|g\\/bsf|G5ste|G6nn|G6t\\'lllche|G6tter|G6ttern|Gamilonl|ganzlich|gardel|Gasbrfiter|gauze|GCJKTEN|ge6lt|gebauf|Gebiez|Gebi\\\xe9ude|gebliebenl|GEBRAUCHTWAGENIPOLIZEIITAXI|Gebr\\\xe9u|gebs|gebuhrend|Geb\\\xe9ick|Geb\\\xe9iude|geb\\\xe9rdet|Geb\\\xe9rmutter|Geb\\\xe9rmutterhals|Geb\\\xe9ude|Geb\\\xe9udedach|Geb\\\xe9uden|Geb\\\xe9udes|gedemiitigt|gedemijtigt|gedemllitigt|gedrtickt|gedr\\\xe9ngt|Ged\\\xe9chtnisverlustes|Ged\\\xe9ichtnis|ged\\\xe9mpft|gef\\'a\\'hrlich|gef\\'a\\'llt|gef5IIt|gefahrdet|gefahrlich|gefallsllichtige|GEFANGNISTECHNOLOGIE|Gefechtsausrustung|Geffihl|geffihrt|geffillt|Gefihrliche|Gefiihl|Gefiihle|Gefiihlen|Gefiihlslebens|gefiihlsmiliigen|gefiihrt|gefiillst|gefiillt|gefiirchtet|Gefijhl|Gefijhle|gefijhlt|gefijllte|Gefilhl|Gefilhle|gefillt|Gefingnis|gefL\\'lllten|Geflilster|gefllihllos|Geflllhlsduselige|GEFLUSTERT|Geftuhle|Gefuhl|Gefuhle|Gefuhlen|gefuhlt|gefuhlvolle|gefurchtet|Gef\\\xe9hrde|gef\\\xe9hrden|gef\\\xe9hrdet|Gef\\\xe9hrdung|gef\\\xe9hrlich|gef\\\xe9hrliche|gef\\\xe9hrlicher|gef\\\xe9hrlicheren|Gef\\\xe9hrliches|Gef\\\xe9hrt|gef\\\xe9ihrden|gef\\\xe9ihrdet|gef\\\xe9ihrlich|Gef\\\xe9ihrte|Gef\\\xe9ihrten|gef\\\xe9illt|Gef\\\xe9illt\\'s|gef\\\xe9llf|gef\\\xe9llfs|gef\\\xe9llig|gef\\\xe9lligst|gef\\\xe9llst|Gef\\\xe9llt|Gef\\\xe9llt\\'s|gef\\\xe9lscht|Gef\\\xe9ngnis|Gef\\\xe9ngnisregeln|Gef\\\xe9ngnisse|Gef\\\xe9ngnissen|Gef\\\xe9ngnisses|Gef\\\xe9ngniswagen|gef\\\ufb02gig|gegenfiber|gegeniiber|gegeniibertritt|gegeniiberzusfehen|gegenijber|gegenlliber|gegenlliberstehen|Gegenstrfimung|Gegenstr\\\xe9mung|Gegensttlck|Gegenst\\\xe9nde|gegenuber|Gegenverschwiirung|gegenw\\\xe9rtigen|gegriindet|gegrijfit|gegrilfit|GegrUl3t|gegrundet|geh6ren|geh6rt|gehdrt|GeheilS|geheilSen|gehejetzt|gehf|gehfiirt|gehfire|gehfiren|gehfirt|gehiipft|Gehiir|gehiire|gehiiren|gehiirst|gehiirt|Gehim|Gehirnsch\\\xe9den|gehlngt|gehore|gehoren|gehort|geht\\'sl|Gehtirt|gehtjetzt|geh\\\xe9irt|Geh\\\xe9iuteten|geh\\\xe9r|geh\\\xe9re|geh\\\xe9ren|geh\\\xe9rst|Geh\\\xe9rt|geh\\\xe9rten|geh\\\xe9rtf|geiiffnet|geilbt|geistesgestort|Gei\\\ufb02blatt|Gei\\\ufb02blattstaude|gekiisst|gekiisstl|gekijndigt|gekijsst|gekilsst|gekimpfl|gekimpft|geklautl|gekliirt|gekllrt|gekl\\\xe9rt|gekriint|gekrijmmt|GEKUHLTER|gekurzt|gek\\\xe9mpft|gelaufenl|gelegf|gelegtwurde|geliist|gelilftet|gelndert|Gelst|Geltungsbedurfnis|GELUBDE|Gel\\\xe9chter|gel\\\xe9hmt|gel\\\xe9ischt|Gel\\\xe9nde|gel\\\xe9nge|gel\\\xe9st|gem|gemafiregelt|Geme|gemfitliches|Gemiise|gemiitlich|Gemijlse|Gemilt|gemiltlicher|GemLise|Gemut|gem\\\xe9fi|Gem\\\xe9fk|gem\\\xe9ht|Gem\\\xe9ili|Gem\\\xe9lde|Gem\\\xe9lden|Genaul|genieBt|genief\\$en|Geniefien|geniefk|genielien|genielken|genie\\\ufb02en|genligen|genlligend|genlligt|genlllgend|genugt|genugte|georfef|gepfluckt|gepriifter|gepruft|Gep\\\xe9ck|gerfit|Geriichte|Geriite|Gerijcht|Gerllicht|gerllistet|gernhaben|gernntgt|ger\\\xe9it|Ger\\\xe9iusch|Ger\\\xe9t|Ger\\\xe9te|Ger\\\xe9tschaften|ger\\\xe9umt|Ger\\\xe9usch|Ger\\\xe9usche|ger\\\xe9uschvoll|geschafff|GESCHAFTSFUHRER|gescha\\\ufb02i|Geschfift|geschfimt|Geschift|Geschifte|Geschiftsleute|Geschiftswelt|geschiidigt|Geschiift|Geschiiftsleben|geschijtzten|Geschiltz|Geschiltze|Geschiltzrohre|Geschiltzturm|geschlijpftl|Geschllitzstellungen|geschnfiffelt|Geschtitz|Geschtltz|Geschutz|Geschutze|Geschwiir|Geschwllir|Geschwur|geschw\\\xe9cht|geschw\\\xe9ingert|Geschw\\\xe9tz|Gesch\\\xe9ft|Gesch\\\xe9fte|Gesch\\\xe9ftige|gesch\\\xe9ftlich|Gesch\\\xe9fts|Gesch\\\xe9ftsleben|Gesch\\\xe9ift|Gesch\\\xe9ifte|gesch\\\xe9iftsm\\\xe9ifiig|gesch\\\xe9itzt|gesch\\\xe9nolet|Gesch\\\ufb02tze|Gesetzeshiiter|Gesichtl|Gesichtsausdrijcke|Gesiiff|gesiindigt|gespiirt|Gesprach|GESPRACH|GESPRACHE|Gespr\\\xe9ch|Gespr\\\xe9che|Gespr\\\xe9iche|Gespr\\\xe9ichsthema|Gespur|gestiirt|gestijrzt|gestijtzte|gestof\\$en|gestolken|Gestriipp|Gestrijpp|GESTURZT|gest\\\xe9irt|Gest\\\xe9ndnis|gest\\\xe9rt|gest\\\ufb02rzt|Gesundheitsbehijrde|Gesundheitsftlrsorge|Ges\\\xe9fitaschel|Ges\\\xe9iffstaschenl|get6tet|Getiise|getiitet|getr\\'a\\'umt|getr\\\xe9umt|get\\\xe9tet|get\\\xe9tetf|get\\\xe9uscht|gev\\\xe9gelt|gew6hnt|GEWACHSHAUS|gewaltt\\\xe9tig|gewarnf|Gewerkschaftsfunktion\\\xe9ren|gewfinscht|Gewiasenskon\\\ufb02ikte|gewiihlt|gewiihnen|gewiihnlich|gewiihnlicher|gewiihnliches|gewiihnt|gewiinscht|gewijhnlichen|gewijnscht|gewissermafien|gewissermallsen|gewlllnscht|Gewohnheitstiter|gewtinscht|gewunscht|gewunschten|Gew\\\xe9chshaus|gew\\\xe9hlt|gew\\\xe9hnen|gew\\\xe9hnlicher|gew\\\xe9hnst|gew\\\xe9hnt|Gew\\\xe9hren|gew\\\xe9hrt|Gew\\\xe9isser|Gew\\\xe9ssern|gezfichtet|gezilndet|gez\\\xe9hlt|gez\\\xe9ihlt|gez\\\xe9ihmt|ge\\\xe9ndert|GF6l\\'1Z6fUf|Gfirtel|Gfirtner|Gfiste|Gfitter|Ghrchen|gibtjede|gibtk|gibts|gieBen|GieBkanne|gief\\$t|giefit|gielit|gignalton|giinstiger|Giire|Giite|giitiger|Giitter|Giittliche|giittlichen|Gijte|Gijtel|Gilrtel|Gilte|Giltiger|Gitarrenkl\\\xe9nge|Gite|GIUck|GIUCKliCl\\'1|GL\\'lte|Glaubwurdigkeit|Glaubwurdigkeitl|glaubw\\\ufb02rdig|glb|glbt|Gle\\/ch|gleichgiiltig|gleichm\\\xe9mig|Glfick|glficklich|Glfickspilz|Gliick|Gliickchen|gliicklich|gliicklicher|Gliicksbringer|Gliickssfr\\\xe9hne|Gliickwunsch|gliilcklich|Glijck|glijcklich|Glilck|glilcklich|Glilckwunsch|Glillck|gllinstig|gllinstigem|gllinstigen|glljcklich|glllicklich|glllickliche|Glllte|Glorifiziertl|glticklich|Gltickszahlen|gltlckliohes|Gluck|glucklich|gluckliche|GLUCKSELIGKEIT|Gluckwunsch|Gluok|gluoklich|Glupsch\\\xe9ugige|glutheilie|gl\\\xe9inzende|gl\\\xe9nzende|gl\\\xe9nzte|Gl\\\xe9ser|gl\\\xe9ubige|Gl\\\xe9ubigen|Gl\\\ufb02ck|Gl\\\ufb02cklich|Gl\\\ufb02ckstag|Gl\\\ufb02ckwilnsche|gnidig|Gnllnden|gn\\\xe9dig|gn\\\xe9dige|gn\\\xe9digen|Gn\\\xe9digste|gn\\\xe9idig|Goff|Golfballweili|gonnst|gottesfllirchtiger|Gottverdammt|Go\\\ufb02|Gr6Be|gr6Ber|gr6Bere|gr6Beren|Gr6Bte|Gr6Bten|gr6Bter|gr6Btes|gr6f\\$te|gr6f\\$ten|gr6f5ten|gr6I3ter|gr6ISten|Gr6l3e|gr6l3ter|Grabst\\\xe9tte|gratulierel|grClf\\$en|grfilieren|Grfiner|griil3e|griiliere|griiliten|griin|Griinde|Griinden|griindlich|Griine|griinen|Griiner|griin\\\xe9iugige|griin\\\xe9iugiges|grii\\\ufb02te|Grijbeln|griJBen|grijn|Grijnde|grijnden|grijndlich|grijnes|Grijnfutter|Grilbelt|grilfken|Grillh\\\xe9hnchen|Grilnde|Grilnden|grilndet|grilndlich|grilndlicherf|grilndlichl|grilne|Grilnschn\\\xe9bel|grim|Grime|grinco|Grllinde|grllinden|grllindlich|grlllnes|Gro\\/3artig|gro\\/3es|gro\\/3zUgig|Gro\\/Bstadt|gro\\/Ken|groB|groBartig|GroBe|GroBes|GroBmutter|GroBteil|groBziJgiger|grof\\$|grof\\$artig|grof\\$artigen|grof\\$e|grof\\$er|grof\\$es|grof3|grof3\\>artige|Grof3e|grof3en|grof3erAlien|grof5es|Grofbvaters|grofi|Grofiangriffs|Grofiartig|grofiartige|grofiartigen|grofiartiger|Grofiartiges|Grofibritannien|Grofidiebstahl|Grofie|grofier|grofies|grofiten|grofk|Grofkartig|grofke|Grofken|Grofker|Grofkvater|grofLe|grofler|groflsartig|groflsartige|Groflse|groflsen|Grofser|grol|grol\\'3\\>en|grol2\\>|grol2\\>en|grol3\\>es|grol3e|grol3er|Grol3raum|groli|Groliartig|groliartige|groliartigen|grolie|grolien|groliherzig|Grolimutter|Grolisegel|Grolkvater|groller|Grollser|grollzugig|grolS|grolSe|GrolSeltern|grolSer|GrolSvater|grolZ\\~|gror\\$er|grorker|grosses|GROSSTE|gro\\\ufb02|gro\\\ufb02e|Gro\\\ufb02stadtkind|Gro\\\ufb02vater|Grtin|Grtmde|GruB|Grubenausg\\\xe9nge|Gruf\\$|grUf\\$en|grufit|Gruli|Grulikarte|Grulikarten|Grun|grundlich|Grundstiick|grunds\\\xe9tzlich|grune|grunen|Gr\\\xe9ben|gr\\\xe9bst|gr\\\xe9fier|gr\\\xe9fkte|gr\\\xe9flserer|Gr\\\xe9ifite|gr\\\xe9illten|gr\\\xe9sslich|Gr\\\xe9uel|gr\\\ufb02ndlich|gr\\\ufb02ne|gull|Gummist\\\xe9psel|Gumml|GUNSTIGSTEN|Gurtell|gutaussehend|gutaussehender|GUte|gutgebaut|gutgehen|Gutmijtigkeit|g\\\xe9be|g\\\xe9ben|g\\\xe9ibe|G\\\xe9ittern|G\\\xe9lisch|G\\\xe9lische|g\\\xe9lisches|G\\\xe9nsehaut|G\\\xe9nsen|G\\\xe9nze|G\\\xe9rfen|G\\\xe9rtnern|G\\\xe9ste|G\\\xe9stezimmer|G\\\xe9tter|G\\\xe9tterspeise|G\\\xe9ttin|G\\\xe9ttliche|g\\\xe9ttlichen|G\\\xe9tze|G\\\u20acfUhl6|G\\\u20acStFUpp|h\\<\\'\\>\\'r\\'t|h\\<\\'5r|h\\'a\\'lt|H\\'a\\'nde|H\\'a\\'nden|H\\'a\\'ttest|H\\/|H\\/er|h\\/nfer|h5tte|H6fe|h6flich|H6fling|H6hen|h6her|h6here|H6HERER|H6hle|H6l1e|H6lle|H6llen|h6lte|H6r|h6re|h6ren|H6rer|H6rner|h6rst|h6rt|h6rte|Ha\\/s|Haarbijrstel|Haarhfirste|Haarl|Haarstr\\\xe9hne|hab\\'jemanden|Hah|halbstlllndiges|halbvervvandelt|halfef|Hallfjchen|hallol|Halsb\\\xe9nder|Halsl|haltenl|Haltjohnny|Hammersch\\\xe9del|Handfl\\\xe9che|Handlungsstr\\\xe9nge|harfe|hartn\\\xe9ickig|Hasenful|Hasenfull|hassq|Hastja|hatjetzt|hatta|Haupfbus|Hauptaktion\\\xe9ire|Hauptaktion\\\xe9irinnen|Hauptkabell|haupts\\\xe9chlich|haupts\\\xe9ichlich|Haupttrib\\\ufb02ne|Hauptverschwiirer|Hauptwasserrohrwar|Hausfirzte|Haush\\\xe9lterin|Hausschlilssel|Haustilr|Hausubervvachung|ha\\\xdft|Hbr|hc\\'5ren|hc\\'\\\xa7r|hdchsfens|Hdchstleistung|hdher|Hdlle|Hdllenfeuer|hdre|hdren|hdrsf|hdrten|He\\/nr\\/ch|hedeutest|hegrfille|heiB|heiBe|heiBen|HeiBer|heiBes|heiBt|heif\\$|heif\\$e|heif\\$es|Heif\\$t|heif3\\>en|heif3t|heif5en|heifie|heifiem|heifien|heifit|heifkt|heifLt|heifZ\\>e|heil\\'\\$|heil\\'\\$en|heil\\'\\$t|heil\\'Se|heil2\\>en|heil2\\>t|heil3en|heil3t|heil5e|heil5t|heili|heilies|heilit|heillst|heilZ\\~|heir\\$|heisst|Helllger|Helzlichen|Hen\\'je|herabstofien|heransttlrmtet|heraush\\\xe9ngendem|herhfiren|herh\\\xe9ren|heriiber|HerrSchmidt|herumf\\\xe9hrt|herumkehren|herumlluft|herumzuwijhlen|Herzrhythmusst\\\xe9rungen|Herzschlielierei|Herzstlllck|Heuta|Hexenhtltte|HeY\\\xb7|Hfibscheste|hfiherer|hfihsch|Hfilfte|Hfille|hfilt|hfiltst|Hfin|hfipft|Hfir|hfiren|hfirst|hfirt|hfitte|hfitten|hie\\/3|hieB|hiefL|hiel3|hiells|hierhergereist|hierherzuriick|hierijber|hierjede|hierjeder|hierl|hierL|hierwar|hierzum|hie\\\ufb02|Hiibsch|Hiibsche|Hiibscher|hiibschl|hiichst|hiichstens|hiichster|hiichstpersiinlich|Hiifen|hiifischen|Hiifling|Hiigel|Hiihe|Hiihepunkt|hiiher|hiihere|Hiihlen|Hiihnchen|Hiihner|Hiihnerkl\\\xe9fkchen|Hiilfte|Hiille|Hiillenstreitmacht|hiillischen|hiipfen|Hiir|hiire|Hiiren|Hiirer|Hiiret|Hiirjetzt|Hiirt|hiirte|hiirtest|Hiissliches|Hiite|Hiiten|hiitet|Hiitte|hiitten|Hiitten|hijbsch|hijbschen|hijbsches|Hijfte|Hijften|Hijgel|Hijgels|Hijpfburgl|hijpfe|hijpfen|hijre|Hijren|Hijrer|hilbsch|hilbsche|hilbschen|hilbscher|Hilfel|HILFSPERSONALI|Hilgel|hillig|Hilt|hil\\\ufb02|Him|Himmell|hineintr\\\xe9umen|hinfijhrt|hingefiihrt|hingehdren|hingehiiren|hinilber|hinreiliend|hinschmeifit|HintenN\\\xe4ldler|Hintergrundl\\\xe9rm|hinterhfiltig|hinterh\\\xe9iltiger|Hinterh\\\xe9iltigl|hinterh\\\xe9ltige|hinterh\\\xe9ltiger|Hinterk\\\xe9pfen|hinterlieBe|hinterl\\\xe9sst|Hintersttlbchen|Hintertur|hinwollen|hinzufuhren|hinzuf\\\ufb02gten|Hirnrnel|hirteste|hisslich|Hi\\\xe9tte|Hler|hler|hllf|hllibsch|Hllindinnen|Hlllpf|hln|Hlnbllck|hltte|Hltten|Hochfrequenzst\\\xe9rungenl|hochl|Hochsicherheitsgef\\\xe9ngnis|Hochstens|Hochzeitskostiime|Hohek|Hohepunkt|hohere|HoHo|Holle|Holzsttlck|hor|Horen|Hosenscheifker|Hosenscheiiker|Hosenschei\\\ufb02er|Hotelg\\\xe9ste|HQHE|htibscher|Htihnchen|Htipfen|Htipfenl|htiren|hubsch|hubsche|hubschen|Hubscher|hubscheres|Hubsches|Huhner|humon\\/oll|Hundchen|Hundebullel|Hunden\\\xe9pfe|Hundescheilie|Hundl|HUNG|hunte|Hurensiihne|Hurensohnl|Huterin|HUtte|Hypoglyk\\\xe9mie|h\\\xe9|H\\\xe9chste|h\\\xe9chsten|H\\\xe9chstens|H\\\xe9chstpers\\\xe9nlich|H\\\xe9fen|h\\\xe9flich|H\\\xe9ftling|H\\\xe9ftlinge|H\\\xe9ftlingsr\\\xe9te|H\\\xe9hef|H\\\xe9hepunkt|h\\\xe9her|h\\\xe9heren|H\\\xe9i|H\\\xe9ifen|H\\\xe9ilften|h\\\xe9iltst|H\\\xe9inde|h\\\xe9ing|h\\\xe9ingen|h\\\xe9ingt|h\\\xe9ir|h\\\xe9irter|h\\\xe9itt|H\\\xe9itte|h\\\xe9itten|h\\\xe9ittest|h\\\xe9iufig|H\\\xe9lfte|H\\\xe9lle|H\\\xe9llen|H\\\xe9llenloch|h\\\xe9llisch|h\\\xe9llische|h\\\xe9lt|H\\\xe9ltst|h\\\xe9lzernes|h\\\xe9misch|H\\\xe9mmer|h\\\xe9mmernde|H\\\xe9moglobin|H\\\xe9morrhoiden|H\\\xe9ndchen|H\\\xe9nde|H\\\xe9ndedruck|H\\\xe9nden|H\\\xe9ndlerin|h\\\xe9ng|h\\\xe9ngen|h\\\xe9ngend|h\\\xe9ngst|h\\\xe9ngt|H\\\xe9r|h\\\xe9re|h\\\xe9ren|H\\\xe9rgesch\\\xe9idigte|h\\\xe9rst|h\\\xe9rt|h\\\xe9rte|h\\\xe9rten|h\\\xe9rter|H\\\xe9rzu|H\\\xe9schen|h\\\xe9sslich|h\\\xe9sslicher|h\\\xe9sslichl|h\\\xe9sslichste|h\\\xe9tt|H\\\xe9tte|h\\\xe9tten|h\\\xe9tten\\'s|h\\\xe9ttest|H\\\xe9ttet|H\\\xe9ufi|h\\\xe9ufig|h\\\xe9ufiger|H\\\xe9ufigkeit|h\\\xe9ufigsten|H\\\xe9user|H\\\xe9usern|h\\\xe9ute|H\\\u20acY|H\\\ufb02geln|i\\'\\\xa7ffne|I\\/egen|I5sst|I5stern|I6sen|Ia\\\xdf|Ia\\\xdft|Icll|identifizieet|IDENTITAT|IE|Iebendigl|Iebenslinglich|Iebtjetzt|Ieck|Iehn|Ieid\\\u201a|Ieinenlose|Ienistische|Ietztendlich|Ifigt|Ihrdllirft|ihrja|ihrjemals|ihrjetzt|ihrjeweiliges|ihrVater|ihrvorstrafenregister|ihrwahres|Ihrwerdet|ihrzwei|iibel|iibemehmen|iiber|iiberall|iiberallhin|iiberdauern|iiberdauerte|iibereinstimmte|iiberfallen|iiberfiel|iibergeben|iiberhaupt|iiberhiirt|iiberholt|iiberholter|iiberkam|iiberlassen|iiberleben|iiberlebt|iiberlegen|iiberlegten|iibernahmen|iibernehme|iibernehmen|iibernimmt|iibernommen|iiberpriife|iiberpriifen|iiberpriift|iiberpriiften|iiberqueren|iiberragen|iiberrascht|iiberraschte|iiberreden|iiberschritten|iibersetzen|iibersetzt|iibersteigt|iibertragen|iibertreffen|iibertreib|iibertreiben|iibertrieben|iiberzeugen|iiberzeugt|iiblich|iibliche|iibrig|IieB|Iiebte|Iief\\'s|Iiehe|Iie\\\ufb02est|iiffentlichen|iiffentliches|iiffnest|iifter|iihnllchkelt|Iisst|ijbel|ijben|ijberall|ijberhaupt|ijberlegene|ijbernehme|ijbernimmst|ijberprijfen|ijberreden|ijbertrage|ijberwunden|ijberzeugen|ijberzogen|Il6her|IleiB|Ill|Illfie|Ilrger|Ilufierste|immerja|immerjung|immerweinen|immerw\\\xe4hrende|immerw\\\xe9hrende|Improvisiation|Impulswellengeschutz|INBRUNSTIGE|instfindig|intramuskul\\\xe9r|INVASIONSFLOTFE|Iosgeliist|Iosgel\\\xe9st|Ioszuliisen|ip|irn|irrefuhren|irrefuhrende|istja|istjedoch|istjemand|istjetzt|istJohnny|istjung|istweg|ITIUSSEFI|ITIUSSGI7|ITTITTRZ|Ivl\\\xe9gliche|I\\\xe9cheln|I\\\xe9cherlich|I\\\xe9cherlichen|I\\\xe9hmt|I\\\xe9iuft|I\\\xe9nger|I\\\xe9sst|I\\\xe9sste|I\\\xe9uft|J0Shua|Jackettkaufen|jahr|jahre|jahren|JAHRIGE|jal|jemandenl|jetztl|jiidisch|Jiingem|jiingerwar|Jiingste|jilnger|Jlllngling|job|Jogglng|john|johnny|journalisten|Jullo|JUNGFRAULICHE|jungfr\\\xe9uliche|jungfr\\\xe9ulichen|jungfr\\\xe9ulicher|Jungfr\\\xe9ulichkeit|Jungsl|Jungste|Jurlgs|Justitzministeriums|J\\\xe9ger|J\\\xe9hrige|j\\\xe9hrigen|j\\\xe9hriger|j\\\xe9hrlich|J\\\xe9iger|j\\\xe9ihrigen|j\\\xe9mmerlich|k\\'a\\'mpfen|K\\/no|K\\/Varte|K\\/Velle|K5NIGIN|K6der|K6ln|K6nig|K6nige|K6nigin|k6nnen|k6nnen\\'s|k6nnest|k6nnt|K6nnte|k6nnte\\'s|k6nnten|k6nntest|K6pfe|K6rper|K6rpers|K6stlich|Kabelm\\\xe9nner|kalf|kaltblijtig|kampfen|Kampfj\\\xe9ger|Kanarienviigeln|kann\\'sja|kannstja|Kan\\\xe9len|Kapitan|Kapitln|Kapitlnen|Kapitlns|Kapit\\\xe9in|Kapit\\\xe9inleutnant|Kapit\\\xe9ins|Kapit\\\xe9n|Kapit\\\xe9nleutnant|Kapit\\\xe9ns|Kapt\\'n|kaputthaust|Kartoffelsch\\\xe9len|Kassettenger\\\xe9it|kbnnen|kbnnten|kdnnen|kdnnfe|kdnnte|ke\\/ne|Kefn|Keh\\/1|Keithl|keln|kelne|Keri|kfime|Kfimmer|kfimmere|kfimmern|kfimmert|kfimpft|kfimpften|Kfinig|Kfinnen|kfinnte|Kfinnten|Kfinntest|Kfiss|Kfisschen|Kfissen|Kfjnnte|Khnlichkeit|KIar|Kifig|Kiiche|Kiichenhelfer|Kiichln|Kiihe|Kiihlbox|kiihler|Kiihlschrank|kiimmem|kiimmer|kiimmere|Kiimmern|kiindigen|Kiinig|Kiinige|Kiinigen|Kiinigin|Kiiniginnen|kiinigliche|kiiniglichen|kiiniglicher|Kiinigreichs|Kiinigs|Kiinigtum|kiinne|kiinnen|kiinnt|Kiinnte|kiinnten|kiinntest|kiinntet|Kiinstler|kiinstlerischen|kiipfen|Kiirper|Kiirperfunktionen|Kiirperhaltung|kiirperliche|Kiirperliches|Kiirpersprache|Kiirperverletzung|kiirzen|kiirzerzutreten|kiirzeste|Kiisschen|Kiissen|Kiisst|Kiiste|kiistlich|Kijche|Kijhlschrank|Kijmmere|kijmmern|kijmmernl|kijmmerst|kijmmerten|kijndigt|kijnnen|kijnnt|kijnnte|kijnnten|Kijnstler|Kijrbis|kijrzlich|kijrzliche|Kijrzungen|kijsst|Kijste|Kilche|Kilchlein|kilhlen|kilhler|Kilhlkreislauf|Kilhlschrank|Kilmmern|Kilmmert|kilndigen|kilnstliche|kilss|kilsse|kilssen|Kinderm\\\xe9dchen|Kinderspiell|Kindsk\\\xe9pfe|kiokflip|KIotz|KL\\'lr|KL\\'lste|Klapsmiihle|Klassem\\\xe9dchen|kle\\/ne|Kleidergr6Be|Kleidergrfilie|Kleinerl|kleinwiichsige|kleinwilchsiges|klijger|klijgsten|klilger|kLinft\\'gen|klirst|kljmmere|Kllirze|kllissen|Klliste|Klllche|klllhnsten|kllllger|Klobtlrsten|klop\\\ufb02l|Klpt\\'n|Klpt\\'nl|Klpt\\'ns|Klse|Klseschnuffelei|Kltigste|Klugschei\\\ufb02er|kl\\\xe9ffen|Kl\\\xe9iren|Kl\\\xe9ranlage|Kl\\\xe9re|kl\\\xe9ren|Kn6pf|Knallttite|Knastwill|Knderung|Knochengrfinde|Knofen|Knuller|Knupf|Knupfe|knupfen|knzjipfe|Kn\\\xe9dell|kn\\\xe9pf|Kn\\\xe9pfe|Kn\\\xe9sten|Kofferraumschliissel|Kohlens\\\xe9ure|Komaf\\\xe9lle|Komaf\\\xe9llen|Kombiise|Kombuse|Komiidie|kommerz\\/ellen|kommjetzt|Kompatibilitfits|Kompatibilit\\\xe9its|Kompatiblit5ts|Kom\\\xe9die|KONIGIN|konne|konnen|konnt|konsen\\/ativ|Kopfabreifimann|Kopfgeldj\\\xe9ger|Kopfgeldj\\\xe9gern|Kopfm\\\xe9fiig|Kopfnijsse|kostengtlnstige|Kostiim|Kostiimdesigner|Kostiimdesignerin|Kostiimdrama|Kostiime|Kostiims|Kostume|Kost\\\ufb02m|kr\\/egen|kr6ne|kr6nen|Kr6ten|Krafte|Kraftwfirfel|Kranf\\\ufb02hrer|Kreativit\\\xe9t|Kreuzverhor|krfiftiger|Krfiutertee|Kriegserkl\\\xe9rungen|Kriegsfuhrung|Kriegsschauplatze|Kriifte|Kriinung|Kriinungsfeier|Krijppel|Krijte|Kronjuwell|KROTE|Krsche|Kr\\\xe9fte|Kr\\\xe9ften|Kr\\\xe9ftigsten|Kr\\\xe9he|kr\\\xe9ht|kr\\\xe9ichzt|Kr\\\xe9ifte|Kr\\\xe9iutertee|Kr\\\xe9mpfe|kr\\\xe9nte|Kr\\\xe9te|Kr\\\xe9tes|Kr\\\xe9utern|Kr\\\xe9utersenf|Ktiche|Ktinige|ktinntest|Ktisschen|ktlmmere|ktznnen|Kuche|KUCHE|Kuckucksger\\\xe9usch|KUl\\'ZSCl\\'1lUSS9|kulz|kummer|Kummere|kummern|kummert|Kumpell|Kunststficke|Kunststticke|Kuriosit\\\xe9ten|kurzeste|kurzte|Kurzwellenfunkger\\\xe9te|Kurzzeitgediichtnis|Kurzzeitged\\\xe9chtnis|KUS1I\\\u20ac|Kuschelhengstl|KUSSE|KUSSGH|kusste|KUSTE|Kuste|K\\\xe9fer|K\\\xe9fig|k\\\xe9ime|k\\\xe9impfen|k\\\xe9impfend|k\\\xe9impft|k\\\xe9impfte|k\\\xe9impften|k\\\xe9impftest|k\\\xe9impfwie|K\\\xe9inguru|k\\\xe9innen|k\\\xe9innte|K\\\xe9irper|K\\\xe9ise|K\\\xe9isebrunnen|K\\\xe9lte|k\\\xe9lter|k\\\xe9lteste|k\\\xe9me|k\\\xe9men|k\\\xe9mpfe|K\\\xe9mpfen|K\\\xe9mpfer|k\\\xe9mpferische|k\\\xe9mpfst|k\\\xe9mpft|k\\\xe9mpfte|k\\\xe9mpften|k\\\xe9mt|K\\\xe9nig|K\\\xe9nige|K\\\xe9nigin|K\\\xe9niginl|K\\\xe9niginnen|k\\\xe9niglich|k\\\xe9nigliche|k\\\xe9niglichen|k\\\xe9nigliches|K\\\xe9nigreich|K\\\xe9nigreichs|K\\\xe9nigs|K\\\xe9nigsfamilie|k\\\xe9nne|k\\\xe9nnen|k\\\xe9nnt|k\\\xe9nnte|K\\\xe9nnten|K\\\xe9nntest|K\\\xe9nntet|K\\\xe9pfchen|K\\\xe9pfe|K\\\xe9pfen|k\\\xe9pft|K\\\xe9pt\\'n|K\\\xe9rbchen|K\\\xe9rbchengr\\\xe9fie|K\\\xe9rben|K\\\xe9rper|K\\\xe9rperfunktionen|k\\\xe9rperlich|k\\\xe9rperliche|K\\\xe9rperproportionen|K\\\xe9rpersprache|K\\\xe9rpertyp|K\\\xe9rperverletzung|K\\\xe9rper\\\xe9ffnungen|K\\\xe9se|K\\\xe9sebrett|K\\\xe9secracker|k\\\xe9stlich|K\\\xe9ter|K\\\xe9tern|K\\\ufb02mmere|k\\\ufb02mmern|L\\'a\\'cherlich|L\\'a\\'ndern|l\\'a\\'sst|l\\'a\\'uft|l\\/chtes|l\\/Vings|L5cheln|L6ffel|L6schen|L6se|l6sen|L6wen|L6win|LADIESMANZ17|Landh\\\xe9user|Landstra\\\ufb02e|Lands\\\xe9iugetier|langl|langweiligl|Lasergestutzte|Laserzielger\\\xe9t|Lattenzaunwei\\\ufb02|Laudal|laufl|Lau\\\ufb02|La\\\xdf|lch|ldee|ldeen|ldelia|ldentifikation|ldentifikationsnummer|ldentifikationssignal|ldentifizierung|ldentit\\'a\\'tsscheibe|ldioten|ldloten|Le\\/d|Lebenl|lebensf\\\xe9hig|lebensl\\\xe9nglich|lebensmijlde|Lebersch\\\xe9den|leergegessen|legend\\\xe9re|legend\\\xe9ren|Legion\\\xe9r|Legion\\\xe9re|Lehe|Leichensch\\\xe9ndung|leichtjemanden|leidl|Leistuljg|Lelbwfichter|Leld|lemen|Lenks\\\xe9ule|lfidt|lfigt|lfinger|lfiuft|Lfiuterung|lgitt|lgnorier|lhm|lhn|lhnen|lhnenl|lhr|lhre|lhrem|lhren|lhrer|lhrerverffigung|lhres|lhrfehlt|lhrjemalsjemanden|lhrVerteidiger|Libel|Libelwollen|Liben|Liber|Liberall|Liberdenken|Liberdrllissig|Liberfallen|Libergebrannt|Liberhaupt|Liberlasst|Liberleben|Liberlegen|Liberlegt|Libernimmt|Liberpriift|Liberreden|Libersteht|Liberstllirzen|Liberwachen|Liberwacht|Liberwinden|Liberw\\\xe9ltigen|Liberw\\\xe9ltigt|Liberzeugt|Lible|Liblich|Libliche|Librig|lie\\/3|lie\\/Se|lieB|lieBe|liebenswilrdig|liebenswurdiger|Liebesgestiindnis|Lieblingsbesch\\\xe9ftigung|Lieblingsrockerl|Lieblingss\\\xe9tze|lief2\\>en|Liefergebiihren|lieflsen|liegenlassen|Liehe|lieli|lielien|Liellen|liells|lien|Liicher|Liige|Liigner|liinger|liischen|liischt|Liisst|liist|Liisung|Liisungen|Liiwen|Lii\\\ufb02ung|lijgen|Lijgner|Lilgner|lilgst|lilgt|Lilterer|LIMOUSINENSERVICE10I06|linger|lke\\'s|lkone|lL\\'lgt|Llberstehen|Llebe|llebt|lllfie|lllfillensstark|lllfillie\\'s|lllfir|Lllignerl|llligtl|lllusionen|llngst|llztlicher|lm|lmbiss|lmmer|lmmigranten|lmpuls|lmpulsantrieb|lndianer|lndianerin|lndianerm\\\xe9dchen|lndianertanz|lndikation|lndividualit\\\xe9t|lndividuen|lndividuum|lnduktion|lneffizienz|lnformationen|lnfos|lngenieur|lngenieure|lnhalt|lnhalte|lnnenraum|lnnenr\\\xe9ume|lnsekt|lnsekten|lnsel|lnserat|lnspektion|lnstinkt|lnstinkte|lnstitut|lnstrumente|lnstrumentenwagen|lnsubordination|lntellektuellste|lntelligenz|lntensivstation|lnteraktion|lnteresse|lnteressen|lnternat|lntrigantin|lntrigantl|lntrigen|lnverness|lnvestition|lnvestoren|lnzucht|lo|Lordk\\\xe9mmerer|losf|losl|losw\\\ufb02rde|Lou\\/e|Loyalit\\\xe9t|lrak|lraner|lren|Lrgendetvvas|lrland|lronhide|lronie|lrre|lrren|lrrenanstalt|lrrenhaus|lrrer|lrrgarten|lrrlicht|lrrlichter|lrrsinn|lrrsinns|lrrtum|lscandar|lscandars|lsolierband|lss|lstja|ltaker|ltakerflossen|ltalo|Ltiffel|ltlgen|Lufijagen|Luftballonsl|Luftjagen|Luftunterst\\\ufb02tzung|LUgen|lvl\\\xe9idchen|lwan|l\\\xa7uft\\'s|L\\\xe9chelmfinderl|l\\\xe9cheln|l\\\xe9chelt|L\\\xe9cher|L\\\xe9cherlich|l\\\xe9cherliches|L\\\xe9chle|l\\\xe9dt|L\\\xe9ffel|l\\\xe9ge|L\\\xe9icheln|L\\\xe9icherlich|l\\\xe9ichle|L\\\xe9indchen|l\\\xe9ingst|l\\\xe9isen|l\\\xe9issig|l\\\xe9isst|L\\\xe9iuft|L\\\xe9jsung|L\\\xe9mmchen|L\\\xe9mmer|L\\\xe9nder|L\\\xe9ndern|L\\\xe9nge|L\\\xe9ngen|l\\\xe9nger|l\\\xe9ngst|l\\\xe9ngste|L\\\xe9rm|L\\\xe9rmbeschwerden|l\\\xe9schen|L\\\xe9se|L\\\xe9segeld|l\\\xe9sst|l\\\xe9st|l\\\xe9ste|l\\\xe9sten|l\\\xe9stig|L\\\xe9sung|l\\\xe9ufig|l\\\xe9ufst|L\\\xe9uft|l\\\xe9uten|l\\\xe9utet|L\\\xe9we|L\\\ufb02gner|M\\'a\\'dchen|m\\/ese|M\\/ffsommernachfsfraum|M\\/r|M0I8KUI|m6belt|m6chte|m6chtest|m6gen|m6glich|m6glichen|m6glicher|m6gt|M6rder|MaB|MaBgabe|mac\\/1e|mac\\/7|machs|Machtiibernahme|madenschw\\\xe9inziger|Mafinahme|Magengeschwiire|Magengeschwilr|Magengeschwtir|Magnolienbliiten|Majesfait|Majest\\\xe9it|Majest\\\xe9t|Majest\\\xe9ten|Mal2\\>en|Mal3en|malf|Malinahme|mall|Mallregelten|Mandverstation|Manfiver|Maniiver|Manikfire|Mannscha\\\ufb02|Mansclle\\\ufb02\\'enkm\\'5pfe|Man\\\xe9iver|Man\\\xe9ver|man\\\xe9vrieren|man\\\xe9vrierf\\\xe9hig|Man\\\xe9vriermodus|Margoliserklfirung|Margoliserkl\\\xe9rung|marsch\\\xe9hnliche|Massagestllihlen|Massenzerst\\\xe9rung|Massenzerst\\\xe9rungswaffen|Mater\\/al|Maxiriicke|Mayonaise|mbglichst|Mdge|mdglichen\\/veise|mdglicherweise|Mdglichkeit|me\\/n|mehrZeit|mein\\'ja|meinerjetzigen|Meinungs\\\xe9ufierung|Meisterbr\\\xe9u|Meisterstijck|meistgehasste|meln|melne|Mend|Menschenh\\\xe9indler|Menstruationsst\\\xe9rungen|Merkwiirdig|Merkwiirdige|merkwiirdiger|merkwilrdig|merkwlllrdige|merkwurdig|merkwurolig|merkw\\\ufb02rdig|Messger\\\xe9t|mfichte|Mfichten|Mfidchen|Mfidchenl|Mfidels|mfigen|Mfigliche|mfiglichen|mfiglicherweise|Mfill|Mfillhalde|Mfinchen|Mfinder|Mfinnern|Mfissen|mfisst|mfisste|Mfjrder|Midchen|Migrane|Migr\\\xe9ne|Migr\\\ufb02ne|miichte|Miichtegern|Miichten|miichtest|miide|Miidels|miides|miige|miigen|miiglich|miigliche|miiglichen|miigliches|Miiglichkeit|Miiglichkeiten|miigt|Miill|Miillhalde|Miilltonnen|miilssen|miirderisch|miisse|Miissen|miisst|miisste|Miiuse|mijchte|Mijcken|Mijhe|Mijnzen|mijssen|mijsst|mijsste|mijsstest|Milchstrafie|Milhe|Milhle|MILITAR|Militiirprogramme|Militir|militlrische|Milit\\\xe9irkodex|Milit\\\xe9r|Milit\\\xe9rakademie|Milit\\\xe9rdienst|milit\\\xe9rischen|Milit\\\xe9rkodex|Milit\\\xe9rluftraum|Milit\\\xe9rnetzwerk|Milit\\\xe9rs|Milit\\\xe9rsystem|Millbilligung|Millefs|Millgeburt|Milliard\\\xe9iren|Million\\\xe9rssohn|Milli\\\xe9quivalent|Millltonne|millverstanden|milssen|milsst|milsste|milssten|Miltter|Minenraumen|Miniriicke|mirglauben|mirja|mirje|mirjeglichen|mirjemals|mirjemand|mirjetzt|mirso|mirvon|mirzu|Miserabell|missf\\\xe9llt|Missverstfindnisl|Missverstiindnis|Missverst\\\xe9ndnis|Missverst\\\xe9ndnissen|Mistkerlel|Mistkiiter|Miststiick|Mistst\\\ufb02cke|Mitbijrger|Mitbilrger|mitfiihlend|mitfiihlender|mitfuhlend|Mitgefiihl|Mitgefuhl|mitgehiirt|mitgez\\\xe9hlt|mitjedem|mitjemandem|mittlen\\/veile|ML\\'1nze|mlch|Mldchen|mLissen|Mljnder|Mllillschlucker|Mllindel|Mllindung|mllissen|mllisst|Mlllhe|Mllllon|Mllllonen|mlllsst|Mllltterjedoch|Mlnnern|mlr|mlrl|mlt|moglich|Moglichkeit|Moglichkeiten|Molekijle|MolekL\\'lle|Mondeinhiirner|Mondeinhiirnerl|Mondeinh\\\xe9irner|Mondk\\\xe9ilber|Monl|MONTONEI|Mordsiiberraschung|Mordverd\\\xe9chtiger|Morsealphabetl|Motorger\\\xe9usch|Motorger\\\xe9usche|Mousset\\\ufb02e\\'s|Mowen|Mtihe|Mtillschlucker|mtissen|mtissenl|Mtitzel|mtlde|mtlsste|muBt|Mucken|mucksm\\\xe9uschenstill|mude|Muhe|MUII|mull|MULL|mullte|Mundl|Mundung|Munzfernsprecher|Muskatnijsse|Muskelkumpelsl|muskul\\\xe9ren|mussen|MUSSEN|mUssen\\'s|muss\\_\\'\\\xa7e|Musterschuler|Mutterja|mutterlich|Mutze|mu\\\xdf|mu\\\xdft|mu\\\xdfte|mx\\'t|Mzlinnern|M\\\xe9bel|m\\\xe9cht|M\\\xe9chte|m\\\xe9chte|M\\\xe9chtegern|m\\\xe9chten|m\\\xe9chtest|m\\\xe9chtet|m\\\xe9chtig|m\\\xe9chtige|m\\\xe9chtigen|m\\\xe9chtiger|m\\\xe9chtiges|m\\\xe9chtigste|m\\\xe9chtigsten|M\\\xe9dchen|M\\\xe9dchenh\\\xe9nden|M\\\xe9dchens|M\\\xe9del|M\\\xe9dels|M\\\xe9delsl|M\\\xe9fiigung|m\\\xe9ge|M\\\xe9gen|M\\\xe9glich|m\\\xe9gliche|M\\\xe9glichen|M\\\xe9gliches|M\\\xe9glichkeit|M\\\xe9glichkeiten|m\\\xe9glichst|m\\\xe9gt|m\\\xe9ichtig|m\\\xe9ichtige|m\\\xe9ichtigen|m\\\xe9ichtiger|M\\\xe9idchen|M\\\xe9idel|M\\\xe9inner|M\\\xe9innl|m\\\xe9innlicher|M\\\xe9irder|M\\\xe9irz|M\\\xe9nnchen|M\\\xe9nnchens|M\\\xe9nner|M\\\xe9nnerfreundschaft|M\\\xe9nnern|M\\\xe9nnersache|m\\\xe9nnlich|m\\\xe9nnliche|M\\\xe9ntel|M\\\xe9olel|M\\\xe9olels|M\\\xe9rchen|M\\\xe9rchenl|M\\\xe9rchenprinzen|M\\\xe9rder|M\\\xe9rtyrer|M\\\xe9rz|M\\\xe9tresse|M\\\xe9uschen|M\\\xe9use|M\\\xe9usehtipfer|M\\\xe9usen|M\\\xe9userennen|m\\\xfc\\\xdft|m\\\ufb02de|m\\\ufb02ssen|n\\'a\\'chste|n\\'a\\'hert|n\\/chfs|n\\/chi|N\\/ck|n\\/e|N6|n6tig|nac\\/1|Nachf|nachllssig|nachl\\\xe9ssig|nachl\\\xe9sst|nachprufen|Nachschlussel|Nachste|NAHERT|NAHERTE|Nat\\/on|natfirlich|Natiilrlich|Natiirlich|Natiirllch|natijrlich|natijrlichen|natilrlich|natilrliche|natL\\'lrlich|Natllirlich|Nattirlich|Nattlrlich|Nattlrliohl|Naturlich|naturlich|naturlichen|naturlichsten|Navajoweifi|ndtige|ne\\/n|Nebengeb\\\xe9ude|Nebengesch\\\xe9ift|neffes|Nehmf|neinl|Neln|nerv6s|Nervens\\\xe9ge|Nervens\\\xe9ige|nerviis|Nerv\\\xe9s|ner\\\\\\/t|Neuankiimmlinge|neuromuskul\\\xe9ren|Neuzug\\\xe9inge|Nfichster|NIANN|nichsten|nichtim|nichtjemand|Nichtjetzt|Nichtsl|nichtzurilckgelassen|nic\\_l\\_1t|niederk\\\xe9mpfen|niederliells|niedlichl|niher|niichsten|niichstes|niirgeln|niitig|niitige|Nijssen|Nijsternl|nijtzlich|nilchtern|niltzen|Nlagnaten|Nlannern|nlchste|nlchsthoheren|nlcht|nle|Nlemalsl|Nlhe|nlir|nllitzen|Nl\\\xe9inner|noc\\/1|Not\\/\\'all|Notfalll|notig|notigen|Notliige|Notziindung|NUFI|Nunja|Nurdich|nureins|nurflustern|Nurjetzt|nurl|nurwunscht|Nurzu|nus|NUSSS|nutzlich|Nx\\'emand|N\\\xe9chste|n\\\xe9chsten|N\\\xe9chster|n\\\xe9chstes|N\\\xe9chte|N\\\xe9chten|n\\\xe9chtlichen|N\\\xe9gel|N\\\xe9h|N\\\xe9he|n\\\xe9henf|n\\\xe9her|n\\\xe9here|N\\\xe9hern|n\\\xe9hernde|n\\\xe9hert|n\\\xe9herte|n\\\xe9hren|n\\\xe9ht|N\\\xe9hten|N\\\xe9ichste|n\\\xe9ichsten|N\\\xe9ichstes|N\\\xe9ihe|n\\\xe9iher|n\\\xe9ihern|n\\\xe9ihert|N\\\xe9ihten|n\\\xe9imlich|n\\\xe9mlich|N\\\xe9pfe|n\\\xe9rdlich|n\\\xe9rgelnde|N\\\xe9rrin|N\\\xe9schen|n\\\xe9tig|n\\\xe9tige|n\\\xe9tiges|O8|obdachlosl|Obefil\\\xe9iche|OBERFLACHENSCHWERKRAFT|Oberfl\\\xe9che|Oberfl\\\xe9chen|oberfl\\\xe9chlich|oberfl\\\xe9chliche|Oberm\\\xe9inner|Ober\\\ufb02fiche|of\\/\\'en|Offenslchtllch|Offentliches|Offentlichkeit|Offne|Offnen|Offnet|ofi|Ofiiziere|Ofiiziers|Oftweg|Of\\\ufb02cer|Ohnejede|ohnm\\\xe9chtig|ohnm\\\xe9ichtig|OI|olas|oles|Oltanks|OO|Orgelt\\\xe9ne|ORTI|Ortl|Ostfltlgel|Paliontologie|pallt|Pal\\\xe9sten|Panfike\\/chen|Papierbl\\\xe9tter|Papiertiite|Papiertilcher|Parfyknaller|Partyhiite|Partyhijte|Passendervveise|Paulgenauso|pa\\\xdf|pa\\\xdft|peinliohl|persdnlich|persfinlich|persiinlich|persiinliche|persiinlicher|Persiinllchkeltsspaltun|persijnliche|personlich|Personlichkeit|pers\\\xe9nlich|pers\\\xe9nliche|pers\\\xe9nlicher|Pers\\\xe9nliches|Pers\\\xe9nlichkeit|pe\\\ufb02g|Pfadfindervvappen|Pfad\\\ufb02ndeml|Pffitzen|Pfiitchen|Pfippchen|pflL\\'lgen|Pfllitze|pflugte|Pfundbijro|ph\\\xe9nomenal|PIatz|Piimpel|Piinlttchenltrawatte|Pijppchen|Pijppchenl|Planetenf|planm\\\xe9fiigen|Plastikfr\\\xe9iuleinl|plattmachen|Plfitzchen|plfitzlich|pliitzlich|pliitzllch|Pllllnderer|plotzlich|pl\\\xe9dieren|Pl\\\xe9ine|Pl\\\xe9inen|Pl\\\xe9itzchen|Pl\\\xe9itze|Pl\\\xe9ne|Pl\\\xe9tzchen|Pl\\\xe9tze|Pl\\\xe9tzel|pl\\\xe9tzlich|pl\\\xe9tzliche|Pofkawoche|Polizistl|pompiise|popul\\\xe9r|potth\\\xe9sslich|prasentleren|prfignant|Prfisentation|Prfisi|priide|Priife|priifen|prijfen|Priorit2a\\'t|PRIORITKT|PRIORITKTSZUGANG|Priorit\\\xe9itszugang|Priorit\\\xe9t|Prisident|Privatgem\\\xe9chern|Privatsph\\\xe9re|Probfeme|Profitinzerinnen|Protege|prude|Pruf|prufen|Prugelei|prugeln|pr\\\xe9chtig|Pr\\\xe9fekt|pr\\\xe9historischer|pr\\\xe9ichtiger|pr\\\xe9ichtiges|Pr\\\xe9imie|pr\\\xe9ipotente|pr\\\xe9isentiert|Pr\\\xe9isidenten|Pr\\\xe9itorianer|Pr\\\xe9mie|Pr\\\xe9operative|pr\\\xe9sentiere|pr\\\xe9sentieren|Pr\\\xe9sentiert|Pr\\\xe9senz|Pr\\\xe9sident|Pr\\\xe9sidenten|Pr\\\xe9sidentin|Pr\\\xe9sidentschaft|Pr\\\xe9torianer|pr\\\xe9zise|pr\\\xe9ziser|Pr\\\ufb02fungen|Pubert\\\xe9it|Publlkuml|PUPPCHEN|PUpst|Purzelb\\\xe9ume|P\\\xe9ckchen|p\\\xe9idagogisch|P\\\xe9irchen|P\\\xe9rchen|p\\\ufb02egen|P\\\ufb02icht|p\\\ufb02ichtbewullt|Qas|Qualit\\\xe9tskontrolle|Quten|qu\\\xe9ilen|qu\\\xe9ilt|Qu\\\xe9l|Qu\\\xe9lt|R\\'a\\'che|R\\/ck|R\\/nge|R6mer|rachsiichtiger|ranghfiheren|rangh\\\xe9heren|ranzukommen|Rasenm\\\xe9herunfall|Rasterllibertragung|Rasterubertragung|Ratschl\\\xe9ige|Rattenf\\\xe9nger|Rauc\\/7|Rauc\\/vender|rauhen|RAUMFAHRE|Raumf\\\xe9hre|Raumsschiff|rausf\\\xe9hrt|rausgeprtigeltl|rausliefien|rauszuschmeifien|rau\\\ufb02|Re\\/se|Realit\\\xe9it|Realit\\\xe9t|Rechtgl\\\xe9ubige|rechtm\\\xe9fkigen|RECHTSANWALTE|rechtsl|Reffer|regelm\\\xe9fiige|Regenh\\\xe9igen|Regenm\\\xe9ntel|Regierungsgehirnw\\\xe9ischesignal|regul\\\xe9re|reiB|reiBt|Reichtfimer|Reichtllimern|reif\\$|reif\\$en|Reifiverschluss|Reil3t|reil5|Reili|reilien|Reilin\\\xe9gel|Reillt|reilZ\\>|reingeh\\\xe9ngt|Reingelegtl|reinhupft|reinl|reinstilrmen|reiohen|REISSVERSCHLUSSGERAUSCH|rei\\\ufb02|rei\\\ufb02en|relch|religi6s|religiiiser|religi\\\xe9s|Rels|Rentenbezuge|Repr\\\xe9sentantin|Rettungsflofi|Rev\\/er|rfiber|rfiberwachsen|Rfickseite|rfihrselige|rfilpse|Rfissel|RGMISCHE|Richer|Riesenhfipfer|Riesenspafi|Riesentijr|riiber|Riicheln|riichelt|Riick|Riickblickend|Riicken|Riickenlage|Riickenwind|riicksichtslos|Riicksichtslosigkeit|Riicksitz|Riickw\\\xe9irts|Riickzug|Riick\\\ufb02ug|riihrt|Riilpsen|riilpst|Riimischen|Riistung|Riiumlichkeiten|Rijbe|rijber|rijckgfingig|rijckw\\\xe9irts|Rijsseltierl|Rilbe|rilber|rilberkommen|Rilckkehr|rilcksichtsloses|rilckw\\\xe9rts|Rillpsen|Riol|Rivalit\\\xe9t|rL\\'lber|RL\\'lhr|rllicken|rllickt|Rlllckgrat|Rlnge|Rlumgerate|ROMISCHE|ROMISCHEN|rosa\\\xe9ugiges|rotiugiger|Rotk\\\xe9ppchen|Rott\\\xe9nen|Routinetlberprijfung|Rticken|rticksichtslos|rtlber|Rtlckseite|ruber|Ruberrutschen|Ruckblende|Ruckblick|Rucken|Ruckenlage|Ruckenwind|Ruckfall|Ruckfrage|Ruckgriff|Ruckkehr|Rucksitz|Ruckzugl|ruhlg|ruhrenl|Ruhrt|Rul3|Rumgebrfillel|rumhingen|rumh\\\xe9ngen|rumh\\\xe9ngst|ruml\\\xe9uft|rumwuhlen|rumzuf\\\ufb02hren|rum\\\xe9rgern|runterffihrt|runtergespillt|runtergesp\\\ufb02lt|Runterl|runterspillen|runterspllllen|runtersp\\\xfclt|runtervverfen|Rupem|Rustung|r\\\xe9che|r\\\xe9chen|R\\\xe9cher|r\\\xe9cht|R\\\xe9der|R\\\xe9dern|R\\\xe9hre|R\\\xe9idern|R\\\xe9itsel|r\\\xe9itseln|r\\\xe9itst|R\\\xe9iume|R\\\xe9mern|r\\\xe9mische|r\\\xe9mischen|r\\\xe9mischer|R\\\xe9nder|R\\\xe9nke|R\\\xe9nken|R\\\xe9ntgenaufnahme|R\\\xe9ntgenbild|R\\\xe9son|r\\\xe9t|R\\\xe9tsel|r\\\xe9tselhaft|R\\\xe9tselhaftes|R\\\xe9ume|R\\\xe9umen|R\\\xe9umlichkeiten|R\\\xe9umt|r\\\xe9uspert|R\\\ufb02be|r\\\ufb02bergeguckt|R\\\ufb02ckkehr|S\\/e|s\\/nd|S5tze|S6hne|saB|Sachverstlndiger|sagf|sagfen|Sammlerstiicken|Sands\\\xe9cke|Sanftmiltigen|Sanierungsbeh\\\xe9rde|Sanit\\\xe9ter|Sargn\\\xe9gel|sari|Satellitenschijssel|Satellitenschusseln|Satellitenuberwachung|Saugf\\\ufb02flsen|sc\\/10\\/1|sc\\/16\\/1|sch\\/cken|Sch\\/ffe|sch6n|Schadeniiberpriifung|Schadenuberprtlfung|Scharfschijtze|schbn|schc\\'\\\xa7n|Schdn|schdnen|Schecksl|ScheiB|ScheiBe|scheiBegal|Scheif\\$e|scheiffsel|Scheifi|Scheifiding|scheifie|Scheifiel|Scheifier|Scheifihelm|Scheifiloch|Scheifipascha|Scheifisofa|Scheifiweiber|Scheifle|Scheiiislangweilig|Scheil\\'\\$e|Scheil3\\>er|Scheil3e|Scheili|Scheilie|scheilien|Scheille|Scheillel|ScheilSe|ScheilZ\\>|Scheir\\$oling|scheissegal|Scheisskarre|Schei\\\ufb02e|scheme|scheuf\\$lich|Scheulilich|schfichtern|schfimen|schfin|Schfine|schfinen|Schfines|schfirfer|Schfissel|Schfitzchen|schfjnes|Schideln|schief\\$en|Schief3\\>en|Schiefien|schiefit|schiefZ\\>t|schiel\\'5|Schiel3t|schiellen|Schielmbung|schie\\\ufb02en|schie\\\ufb02t|Schiffs\\\xe9rzte|Schiffzerstfiren|Schifies|Schiidel|schiilzen|schiin|schiine|Schiinen|Schiiner|schiines|Schiinheit|Schiipfer|Schiipfung|Schiisse|Schiitt|Schiittelfrost|schiitten|schiittet|schiitze|schiitzen|schiitzt|schijn|Schijnes|schijng|Schijssel|schijttelt|Schijtze|schijtzen|Schildkr\\\xe9te|Schilrze|Schilsse|schiltten|schiltzen|schimte|Schizophrenia|Schi\\\xe9tze|Schlachtgetllimmels|Schlachtschifl|schlafenl|Schlafk\\\xe9fern|Schlafmiitzenl|Schlafm\\\ufb02tzel|Schlangeng\\\xe9ttin|Schlappschw\\\xe9nze|Schlaumeierl|schlechf|Schlelistiinde|Schlellen|Schle\\\ufb02t|Schlfilsselparty|Schlfisse|SchlieBe|schlieBen|schlieBIich|schlieBlich|SchlieBt|schlief\\$en|Schlief\\$lich|schlief2\\>lich|schlief3t|Schliefie|schliefien|Schliefilich|schlieflslich|schliel3en|schliel3lich|Schliel5t|schlielie|schlielien|schlielilich|schliellsen|SchlielSt|Schliissel|Schliissell|Schliisselmoment|Schliisseln|Schlijsse|Schlijssel|Schlijsselloch|Schlilssel|Schlilssell|Schlilsselparty|schlimmsterAlbtraum|Schlle\\\ufb02en|Schllisse|schllitze|schllitzen|Schlllissell|Schlull|Schlupfern|Schlusselmoment|Schlusselszenen|Schlusselw\\\xe9rter|Schlussl|Schlu\\\xdf|Schl\\\xe9chter|schl\\\xe9fst|Schl\\\xe9ft|Schl\\\xe9ge|Schl\\\xe9ger|Schl\\\xe9gerei|schl\\\xe9gt|schl\\\xe9ift|schl\\\xe9igst|Schl\\\ufb02ssel|Schmatzger\\\xe9usche|SchmeiBt|Schmeif\\$|Schmeif\\$t|Schmeifien|schmeifit|Schmeilit|Schmei\\\ufb02|Schmier\\\xe9l|schmiicken|schmilztl|schmi\\\ufb02|Schmuckk\\\xe9stchen|Schmuckstiick|Schnappschijsse|Schnauzel|Schneegest\\\xe9ber|Schneidez\\\xe9hnen|Schneidez\\\xe9ihne|schnellf|Schnfiffeln|schnfiffelnl|schnfiffelst|Schnfirsenkel|schniiffele|schnijffelt|Schnilffeln|schnilrt|Schnitzereigesch\\\xe9ft|Schniuzer|Schnuoki|Schn\\\xe9ppchen|SchoB|Schofk|ScholShund|Schones|schonl|schopferische|scho\\\xdf|Schrankw\\\xe9nde|Schraubenschlijssel|schrecklichl|Schriftist|Schriftstijcks|schr\\\xe9ge|Schr\\\xe9ges|Schr\\\xe9nke|Schr\\\xe9nken|schtin|schtine|Schtisse|schuchtern|Schuchterne|Schuhl|Schuldgeftihlen|Schulterl|Schutzen|Schutzr\\\xe9ume|SCHUTZT|Schw6r\\'s|Schwachkop\\\ufb02|Schwanzlutscherl|Schwarzh\\\xe9ndler|Schwarzweills|schwei\\\ufb02durchnisst|schwerh\\\xe9rig|schwiicht|schwiire|schwiiren|Schwimmanziige|schwi\\\xe9rmten|schwnre|Schw\\\xe9che|Schw\\\xe9chen|schw\\\xe9cher|schw\\\xe9cheren|schw\\\xe9chsten|Schw\\\xe9icheanfall|Schw\\\xe9ichen|schw\\\xe9icher|Schw\\\xe9ichling|Schw\\\xe9irmerei|schw\\\xe9irzeste|Schw\\\xe9mme|schw\\\xe9re|schw\\\xe9ren|Schw\\\xe9rme|schw\\\xe9rmt|schw\\\xe9rmte|Schw\\\xe9tzer|sch\\\xe9biger|Sch\\\xe9del|Sch\\\xe9den|Sch\\\xe9inder|sch\\\xe9ine|sch\\\xe9inen|Sch\\\xe9iner|sch\\\xe9irfen|sch\\\xe9le|sch\\\xe9me|Sch\\\xe9n|sch\\\xe9ne|Sch\\\xe9nen|Sch\\\xe9ner|Sch\\\xe9nes|Sch\\\xe9nheit|sch\\\xe9nl|sch\\\xe9nste|sch\\\xe9nsten|sch\\\xe9nstes|Sch\\\xe9tzchen|Sch\\\xe9tze|sch\\\xe9tzen|sch\\\xe9tzt|Sch\\\xe9tzung|Sch\\\xe9umen|sch\\\ufb02chtern|SCl\\'1lUSS6l|Scllrift|scmoss|se\\/n|Se\\/wen|sehenl|Sehenswlllrdigkeiten|Sehnsilchte|sehrangespannt|sehrjung|Sehrwohl|sehrzufrieden|sehtjetzt|Seidenglattl|seidjetzt|Seitwann|SEKRETARIN|Sekretiir|Sekretir|Sekret\\\xe9irin|Sekret\\\xe9rin|sel\\/g|selbstl|selbststiindig|selbstsuchtige|selbstverstindlich|Selbstverstlndlich|Selbstverst\\\xe9indlich|Selbstverst\\\xe9ndlich|seld|selhst|SeligerVater|seln|Selt|sentimalen|seri\\\xe9ser|Sexualit\\\xe9t|Sfe|Sfidamerikas|Sfidwind|Sfifies|Sfihne|Sfildner|Sfilie|Sfilieste|Sfi\\\ufb02igkeiten|sfnd|SICHERHEITSBEHORDE|Sicherheitsgrijnden|Sichtubervvachung|Sichtunterstutzung|Sieja|Sifihnchen|Signalst\\\xe9rke|Siiden|Siidfrankreich|siidliche|siil\\$|siili|Siilie|siilier|SIim\\'s|Siinde|Siinden|Siinder|siindigen|sii\\\ufb02en|siJB|SiJBe|siJchtige|sijlien|sijliesten|Sijsser|Sildtunnel|Silfie|Silfier|Silfies|silfker|Silnden|Silndenbock|sindja|Sirl|Sj\\_r|Skilaufen|skrupelloserAnw\\\xe9lte|sL\\'lf\\$e|sL1B|slch|sle|slebe|sLif\\$|SLif\\$e|SLif\\$er|sLif\\$es|SLilSe|Slliden|Sllinde|sllindigen|Slnd|Slr|Slrs|SoBen|sofortl|soh\\\xe9nen|Solien|sollenl|SONDERMULL|sorgf\\\xe9iltig|sorgf\\\xe9ltig|souver\\\xe9ine|souver\\\xe9inen|souver\\\xe9ner|sp\\'a\\'ter|sp\\/elen|SpaB|Spaf\\$|Spaf2\\>|Spaffs|Spafi|Spafls|SpafS|Spal\\'5|Spal2\\>|Spal3|Spali|Spall|Spass|spat|spektakular|Spell|Spells|Spell\\\xbb|Spezialit\\\xe9t|spfit|SpieB|spief\\$ig|Spielzeuggeschfiftn|spiilte|spiiren|spiirt|spiit|spijre|spijren|spijrt|Spillmeier|spilre|spilren|spit|Spitzenfriihstiick|spLir\\'s|splliren|splter|Sportilbertragung|Sportsfraund|Sprachpijppchen|SPRACHPUPPCHEN|Spriichlein|Sprilht|spr\\\xe9che|spr\\\xe9chen|spr\\\xe9chet|Spr\\\ufb02che|spr\\\ufb02ht|spUl|spUr|spurbare|spUrt|sp\\\xa7ter|Sp\\\xe4\\\xdf|sp\\\xe9it|sp\\\xe9iter|sp\\\xe9t|Sp\\\xe9ter|Sp\\\xe9tzchen|Sp\\\xe9tzchenl|ssh|st6Bt|st6hnt|st6lSt|St6rt|ST\\@HNT|Staatsaff\\\xe9ren|staatsbllirgerliches|Staatsgesch\\\xe9fte|Standardan\\\xe9sthesie|standig|STARSCREAMI|station\\\xe9r|Statusmeldungl|stdrte|stecktjede|Stehenbleiben|Stehvermiigen|Steigbilgeldinger|Steinh\\\xe9user|Sternenkijsse|Steuererkl\\\xe9rung|Steuererkl\\\xe9rungen|Steuerprtifer|Steuerprtifung|Steuersiitzen|stfipseln|stfiren|stfirker|Stfirt|stfirzt|stieB|Stiefbriider|Stiicke|Stiihle|Stiihlen|stiihnt|Stiillen|Stiire|stiiren|Stiirme|stiirmischen|Stiirsignale|stiirt|Stiirung|stiirzen|Stiitzpunkt|Stijck|Stijckchen|Stijcke|stijhle|stijrme|stijrzen|Stilck|Stilcke|Stillckchen|Stillst\\\xe9nde|Stilvolll|stinden|Stldseite|stleg|Stllihle|Stllirmen|stllirzt|stlllrzen|Stl\\\ufb02|sto\\/3en|StoB|stoBe|stof\\$en|Stofi|STOHNT|Stol3zahn|Stol3zeit|stolie|Storung|Str6men|str6mt|StraBe|StraBen|StraBenk6tern|Straf\\$e|Strafiengang|Strafienratten|Strafienschlacht|Straflsenecke|Straflsenmaler|Straflsenschilder|Straft\\\xe9ter|Strahlenschutzger\\\xe9t|Strahlungsintensit\\\xe9t|Stral3en|Stral5e|Stralie|Straliengang|Stralienk\\\xe9ter|Straliensperre|Streitkr\\\xe9fte|Streitkr\\\xe9ften|Streit\\\xe9xte|strfimten|Striimen|Striimungen|Stromschliige|Stromschnellenl|Stromung|Strullerl|Str\\\xe9mung|Str\\\xe9mungen|sturzte|STUTZPUNKT|St\\\xe9be|st\\\xe9hnt|st\\\xe9hnte|St\\\xe9idtchen|St\\\xe9idte|st\\\xe9indig|St\\\xe9irke|st\\\xe9irker|St\\\xe9irkeres|st\\\xe9llst|St\\\xe9ndchen|St\\\xe9nder|St\\\xe9ndig|st\\\xe9pseln|st\\\xe9ren|St\\\xe9rke|St\\\xe9rken|st\\\xe9rker|St\\\xe9rkere|st\\\xe9rkeres|st\\\xe9rkste|st\\\xe9rst|st\\\xe9rt|St\\\xe9rung|St\\\xe9tten|St\\\ufb02ck|St\\\ufb02hlen|sUB|sUBe|Suchfeam|SUden|Sudseite|Sudwest|sUf\\$|SUf\\$e|suMM\\\u2020|Suohet|Superkr\\\xe9fte|superl\\\xe9cherlich|s\\\xa2\\'il3|S\\\xe9cke|S\\\xe9ge|s\\\xe9he|S\\\xe9hne|S\\\xe9hnen|S\\\xe9icke|S\\\xe9inger|S\\\xe9iulen|S\\\xe9ldner|s\\\xe9mfl\\/che|s\\\xe9mtliche|s\\\xe9mtlichen|S\\\xe9nger|S\\\xe9ngerin|s\\\xe9ubern|s\\\xe9uft|s\\\xe9ugen|S\\\xe9ulen|S\\\xe9urewannen|S\\\ufb02dh\\\xe9ingen|T6chter|T6pfchen|T6rn|T6rtchen|t6te|T6ten|t6tet|TANZERINNEN|Tater|tats\\\xe9chlich|tats\\\xe9chliche|tats\\\xe9ichlich|Tatverd\\\xe9ichtigen|Tauchg\\\xe9inge|Tauchg\\\xe9nge|Tauschgesch\\\xe9fte|Tauschgesch\\\xe9\\\ufb02e|Tbrn|tbten|tdten|tdtete|Telefongespr\\\xe9che|Tempelsch\\\xe9nderf|TemPO|TESTGELANDE|Testvorf\\\ufb02hrungen|tfidlich|tfiitet|Tfir|tfirkischen|Tfite|Theaterstfick|Therapiel|Thermalger\\\xe9t|Thronr\\\xe9uber|Thronr\\\xe9uberin|Tiefkilhlung|Tiefktih\\/system|Tiefktihleind\\\xe9mmung|TIEFKUHL|Tiefkuhlstasis|Tiefkuhlung|tiglich|tiichtige|tiint|Tiipfchen|Tiipfchennummer|Tiir|Tiiren|Tiirl|Tiirme|tiite|Tiite|tiiten|tiitet|tiitete|TiJr|Tijrme|Tilr|Tilrglocke|Tilrklingel|Tilr\\\xe9ffner|Tippger\\\xe9usch|Tischlenuerkstatt|TL\\'lr|tlglich|Tllir|Tllirkei|Tlllpfelchen|TOILETTENSPULUNG|Tonl|Toreroabs\\\xe9tze|Tortenb\\\xe9ickerin|Tragfidie|Tragiidie|Trag\\\xe9die|Trainingsijbung|TRAUMKCRPER|treffan|trfiumen|Tribiinen|trif\\'f\\'t|trigt|Triibsal|Triimmem|triistllch|Triistungen|Triiume|Trilmmer|triume|Trockenger\\\xe9ite|Trockenger\\\xe9te|Tropfsteinhiihle|Trottell|Trubsal|tr\\\xe9ge|Tr\\\xe9gerschiff|tr\\\xe9gt|Tr\\\xe9igerschiff|tr\\\xe9igt|tr\\\xe9ium|tr\\\xe9iume|tr\\\xe9iumen|tr\\\xe9iumt|tr\\\xe9llert|Tr\\\xe9ne|Tr\\\xe9nen|Tr\\\xe9um|tr\\\xe9ume|Tr\\\xe9umen|Tr\\\xe9umer|tr\\\xe9umst|Tr\\\xe9umt|Tschiiss|Tschiissl|tschijss|Tschtiss|tsch\\\xfc\\\xdf|Tsch\\\ufb02s|Ttir|ttlckisch|Ttlte|tubul\\\xe9re|Tupperschiissel|TUR|TUr|Turen|TURKEI|Turmwiichter|tutjetzt|typlschl|T\\\xe9chter|t\\\xe9d\\/ichen|t\\\xe9dlich|t\\\xe9dliche|t\\\xe9dlichen|t\\\xe9glich|t\\\xe9glichen|t\\\xe9iglich|t\\\xe9itowieren|t\\\xe9itowierte|T\\\xe9itowierung|t\\\xe9iuschen|T\\\xe9ler|T\\\xe9lpell|T\\\xe9nze|T\\\xe9nzerin|T\\\xe9pfchen|T\\\xe9pfchenquatsch|T\\\xe9pfchensache|t\\\xe9te|T\\\xe9ten|t\\\xe9test|t\\\xe9tet|t\\\xe9tete|t\\\xe9towieren|t\\\xe9towierte|T\\\xe9towierung|T\\\xe9towierungen|t\\\xe9uschen|t\\\xe9uscht|T\\\xe9uschung|T\\\xe9uschungsman\\\xe9ver|Ub6FpFUfl\\'T1al|Ub6l\\'pl\\'Uf\\\u20ac|Ube|Ubel|Ubelkeit|Ubelt\\\xe9ter|Uben|Uben\\/vachen|Uben\\/vacher|Uben\\/vacht|Uben\\/vachungen|Uben\\/vachungsgesetz|Uben\\/vinden|Uber|UBER|Uberall|Uberanstrenge|Uberanstrengung|Uberarbeiten|UberAuf\\$erirdische|Uberaus|Uberbleibsel|Uberblick|Uberbringe|Uberdauern|Uberdecken|Ubereinstimmung|Uberfahren|Uberfall|Uberflilssig|Ubergabe|Ubergaben|Ubergabepunkt|Ubergangen|Ubergangsweise|Ubergeben|Ubergehen|Uberhaupt|Uberholt|Uberholter|Uberh\\\xe9rt|Uberjemanden|Uberlagerungs|Uberlandleitungen|Uberlass|Uberlasse|Uberlassen|Uberlassenl|Uberlasteten|Uberleben|Uberlebende|Uberlebenden|Uberlebenschancen|Uberlebenswichtigen|Uberlebt|Uberleg|Uberlegen|Uberlegenheit|uberlegt|Uberlegten|Uberleiten|Uberleitung|Uberlieferungen|Uberl\\\xe9sst|Uberm|Ubermorgen|Ubernachtungsgast|Ubernahm|Ubernahme|Ubernahmen|Ubernehme|Ubernehmen|Ubernimmst|ubernimmt|Ubernommen|Uberpriifen|Uberprilfen|Uberprliifen|Uberprufe|Uberprufen|Uberpruft|Uberraschend|Uberrascht|Uberraschte|Uberraschter|Uberraschung|Uberraschungen|Uberraschungl|Uberreagiert|Uberreden|Uberredet|Uberreste|Uberrumpeln|Uberrumple|Ubers|Uberschl\\\xe9gt|Uberschreiten|Uberschritten|Uberschwemmung|Ubersehen|Ubersensibilit\\\xe9t|Ubersetzung|Uberspannte|Uberspielt|Uberstehen|Ubersteigerten|Ubersteigt|Uberstunden|Ubertraf|UBERTRAGEN|Ubertragen|UBERTRAGUNG|ubertreibe|Ubertreiben|Ubertrieben|Ubertriebene|ubertriebener|Ubertrifft|Ubervvachen|Ubervvacht|Ubervvachung|Ubervvachungs|Ubervvachungsstaat|Ubervvachungsstaats|Ubervvachungsvideos|Ubervv\\\xe9iltigend|Uberwachen|Uberwacher|Uberwachung|Uberzeuge|Uberzeugen|Uberzeugend|Uberzeugt|Uberzeugung|Uberzeugungen|Uberziehen|Uberzuleiten|ublem|Ubler|Ubles|Ublich|Ubliche|ublichen|Ubrig|Ubrige|Ubrigen|Ubrigens|Ubrlgens|Ubrllccol|Ubung|Ubungsbedingungen|Ubungsschiisse|Ubungsschusse|Ub\\\u20acf\\'pf\\'Uf\\\u20acl\\'1|Uher|ultrakiistlichl|umgeriistet|umg\\\xe9nglich|umhdren|umh\\\xe9ngt|Umschlfigen|umschlieBt|Umst\\\xe9inden|Umst\\\xe9nde|Umst\\\xe9nden|umst\\\xe9ndlich|umweltsch\\\xe9dlich|unabhiingiges|unabh\\\xe9ingig|unabh\\\xe9ngig|unabl\\\xe9ssig|Unauff\\\xe9lligeres|unaufhalfsam|unaufhiirlich|unaufh\\\xe9rlich|unaufi\\\xe9llig|unberijhrbar|unberllihrten|unbesch\\\xe9digt|Uncl|undja|undjeder|undjemand|undjetzt|undlassenihn|undlhnen|undurchfuhrbar|uneingeschr\\\xe9nkten|unergrilndliche|unerhort|unerhorte|unerkl\\\xe9rliche|unerkl\\\xe9rlichen|unertr\\\xe9glich|unf\\'a\\'hig|Unfahigkeit|unfersfellen|unfiirmigen|unf\\\xe9hig|unf\\\xe9higste|unf\\\xe9ihigste|Unf\\\xe9ille|Unf\\\xe9lle|ungef\\\xe9hr|ungef\\\xe9hre|Ungef\\\xe9ihr|ungef\\\xe9ihrlich|ungemutlich|ungenugend|ungestbrt|ungewfihnliche|Ungewfjhnliches|ungewiihnlich|Ungewijhnliches|ungew\\\xe9hnlich|ungew\\\xe9hnliche|ungew\\\xe9hnlichste|ungfinstigen|ungiiltig|ungilnstig|Unglaubliohl|unglaubwurdig|Unglfiubige|Ungliicklicherweise|Unglilck|Ungll\\'Jcklichervveise|Unglllick|unglllicklich|ungllllckliche|unglucklich|Ungl\\\xe9ubiger|ungultig|ungunstigen|unheimlichl|UNHORBARES|unh\\\xe9flich|Universitlt|Universit\\\xe9t|unlfisbare|unm6glich|unmfiglich|Unmiiglich|Unmiigliche|unmijglich|unmissverst\\\xe9ndlich|unmoglich|Unmtioglich|Unm\\\xe9glich|unm\\\xe9glioh|unnatiirliche|unnaturliche|unnfitigen|unniitig|unnllitz|unn\\\xe9tig|unn\\\xe9tigen|unol|unp\\\xe9sslich|UNREGELMASSIG|Unregelm\\\xe9fiigkeiten|unschliissig|unserejungen|unsererAnw\\\xe9lte|unsererjungfr\\\xe9ulichen|unsjede|uns\\\xe9glich|Untenuelt|unterdriickten|Unterdrilckung|unterdrtlckte|Unterdr\\\ufb02ckung|Unterhaltskostenl|Unterhaltungsm\\\xe9fiig|unterhfilt|unterh\\\xe9lt|unterschitzt|untersch\\\xe9tzte|unterstiitzt|Unterstiitzung|unterstijtzt|Unterstiltzung|Unterstllitzung|unterstutzen|unterstutzt|Unterstutzten|Unterstutzung|Untersuchungsausschijsse|Unterw\\\xe9sche|untr\\\xe9stlich|Unt\\\xe9tigkeit|unumg\\\xe9nglich|unverm\\\xe9hlt|Unverschfimtheitl|unversch\\\xe9mte|Unversch\\\xe9mtheitl|UNVERSTANDLICH|UNVERSTANDLICHE|UNVERSTANDLICHER|UNVERSTANDLICHES|Unverst\\\xe9ndliche|unverst\\\xe9ndlichen|unverst\\\xe9ndliches|unverzlliglich|unver\\\xe9ndert|Unzerbrechliohen|unzurechnungsfahig|unzuverlassiger|Unzuverl\\\xe9ssiger|unzuverl\\\xe9ssiges|unz\\\xe9hlige|unz\\\xe9hligen|unz\\\xe9ihlige|Urgrofivaters|Urlaubsuberschreitung|Ursprijnglich|ursprtmglich|Ursprunglich|Ururgrofivater|v\\/el|v\\/er|v\\/erfe|v\\/erfes|V6gel|v6IIig|V6lker|V6llig|v6lllg|vdllig|Ve\\/Teidigungskr\\\xe9fte|Velzeih|Velzeihung|velzichte|Ven\\/vandter|ven\\/v\\\xe9hntl|Ventilationsfiffnung|Ventilatorsch\\\xe9chte|VERACHTLICH|verandert|Verbiindeten|Verbilndeter|verbliidet|Verbliidung|verbllirgen|verbrachfe|Verbrec\\/ver|Verbtmdeter|Verbundeten|Verb\\\ufb02nolete|verdiichtigen|verdiinnt|verdllistern|verdr\\\ufb02ckt|verdunnt|verd\\\xe9chtig|Verd\\\xe9chtigen|verd\\\xe9chtiger|verffilgbares|Verfiigung|verfiihren|verfiihrt|verfiittem|Verfijgung|verfilgst|verfilgte|Verfilgung|Verfilhrungskilnste|verflligen|verfllihrt|Verflllgung|verfolgf|verfolgtl|VERFUGBAR|verfugt|vergafk|Vergniigen|Vergniigens|Vergniigungsausflug|Vergnijgen|Vergnilgen|Vergnlligen|Vergntigen|Vergnugen|vergnugt|vergnugte|Vergnugungsausflug|vergr6Bern|vergr\\\xe9fiern|Vergr\\\xe9fierung|verg\\\xe9nglich|verhiirt|Verhiitung|Verhor|verhort|verhorten|verh\\\xe9ilt|verh\\\xe9lt|Verh\\\xe9ltnis|Verh\\\xe9ltnisse|verh\\\xe9ltst|veriindert|Verinderungen|verkilnden|verkilndet|verkniipft|verknUpf\\'t|verkunde|verkunden|verkundet|VERKUNDIGUNG|Verk\\\xe9ufer|verletztl|verlieB|verlielien|verlorenl|verl\\\xe9ingert|Verl\\\xe9ingerungskabel|verl\\\xe9isst|verl\\\xe9sst|verl\\\xe9uft|verm\\'aihlen|verm\\/ssf|vermiibelt|Vermiigt|Verm\\\xe9gen|verm\\\xe9hle|verm\\\xe9hlen|verm\\\xe9hlt|Verm\\\xe9ihlung|vernachl\\\xe9ssigt|Vernachl\\\xe9ssigung|vernfinftig|vernfinftige|vernilnftig|vernllmftigsten|verntmftige|vernunftig|vernunftigsten|vern\\\ufb02nftig|verpa\\\xdft|verpesfefe|verprilgle|verprugeln|Verp\\\ufb02ichtungen|verrat|verrfickter|verriickt|Verriickte|Verriickten|Verriickter|verriicktes|verrijckt|verrijckte|verrilckt|Verrilckte|Verrilckter|Verrilcktes|verrL\\'lckt|verrljckt|verrllickt|Verrllickte|Verrllickter|verrlllckte|verrtickt|verrUckt|Verruckte|verruckten|Verruckter|Verr\\\xe9iter|verr\\\xe9itst|verr\\\xe9t|Verr\\\xe9ter|Verr\\\xe9terin|verr\\\xe9terisch|verr\\\xe9terischen|verr\\\ufb02ckt|versaumt|Verscheifier|verschiichtert|verschiitten|verschlucktl|VERSCHLUSSELN|VERSCHLUSSELT|Verschlusselung|Verschnauferst|Verschwdrung|verschweilit|Verschwiirer|verschwiirerisch|Verschwiirern|Verschwiirung|Verschwiirungen|Verschw\\\xe9rer|Verschw\\\xe9rung|Verschw\\\xe9rungstheoretiker|versch\\\xe9rft|versfanden|Versfehen|versiihnlich|Versiihnung|verslumte|Verspfitung|verspiire|verspilre|verspiten|versprijht|verst0I3en|verst6Bt|Verst6ISt|verst6l3t|verstehejetzt|Verstiindnis|verstiirkt|Verstiirkung|verstilmmelst|verstoBen|verstofken|verstolien|verstummelt|verstunde|verstundest|verst\\\xe9fkt|verst\\\xe9indlich|Verst\\\xe9irkung|Verst\\\xe9ndigen|Verst\\\xe9ndigt|verst\\\xe9ndlich|Verst\\\xe9ndnis|verst\\\xe9rken|verst\\\xe9rkt|verst\\\xe9rkte|verst\\\xe9rkter|Verst\\\xe9rkung|verst\\\xe9rt|vers\\\xe9hnen|vers\\\xe9hnt|vers\\\xe9umen|vers\\\xe9umt|VERTRAGSLANGE|vertrauenswiirdig|vertrauenswtlrdig|vertrauenswtlrdigen|vertr\\\xe9umte|vervvanzt|verwiistete|verwllisten|verwustet|verw\\\xe9hnten|verw\\\xe9ihnen|verw\\\xe9ssert|verz\\\xe9gere|Verz\\\xe9gerte|Verz\\\xe9gerung|ver\\\xe9ffentliche|ver\\\xe9ffentlichen|ver\\\xe9ffentlicht|ver\\\xe9indert|Ver\\\xe9inderung|ver\\\xe9ndern|ver\\\xe9ndert|ver\\\xe9nderte|ver\\\xe9nderten|Ver\\\xe9nderung|Ver\\\xe9nderungen|ver\\\xe9ngstigtes|ver\\\xe9ppelt|ver\\\xe9rgert|vewvendet|vfillig|VGFKUFZGH|VI\\/illkommen|VI\\/itwicky|vial|Videoiiben\\/vachung|Vie\\/e|Vielfrafi|vielf\\\xe9ltig|Vielleichtja|vielversprechend|Vieraugengespr\\\xe9ch|vieriunge|vierj\\\xe9hriges|vierk\\\xe9pfige|Viigel|viillig|viilliges|Viterchen|Vizepr\\\xe9isident|vlel|Vlellelcht|Vogelscheifke|Vogelscheilie|Volksm\\\xe9rchen|vollerjeder|vollmachen|vollst\\\xe9ndig|vollst\\\xe9ndige|Volltrefferl|vollz\\\xe9hlig|Volumenl|von\\/vagten|von\\/v\\\xe9irts|vonn6ten|Vonn\\\xe9irts|Vordertiir|Vorderturl|vordr\\\xe9ngelnl|vorfibergehend|Vorfuhrungen|vorgef\\\ufb02hrt|Vorgiinge|Vorg\\\xe9nger|Vorg\\\xe9ngern|Vorh\\\xe9nge|vorijbergehend|vorilber|vorilbergehende|vorkniipfen|Vorl\\\xe9ufer|Vorl\\\xe9ufig|Vorraus|Vorschl\\\xe9ge|vorschriftsm\\\xe9fiig|vorschriftsm\\\xe9iliig|Vorsichtsmaflnahme|Vorstellungsgespr\\\xe9ch|Vorstellungsgespr\\\xe9che|Vorstof\\$|Vortlbergehende|vort\\\xe9uschen|vorubergehend|vorvv\\\xe9rts|Vorwfirts|vorw\\\xe9rts|vorzfiglichl|vor\\\ufb02ber|Vor\\\ufb02bergehend|VVACHMANN|Vvaffen|Vvagen|VVarte|VVeif3\\>t|VVeil\\'2\\>t|VVir|VVM|v\\\\\\/as|V\\\\\\/e|V\\\xe9gel|v\\\xe9geln|v\\\xe9gelt|v\\\xe9llig|w\\/\\'r|W\\/e|w\\/eder|W\\/nkel|w\\/r|w\\/rd|w\\/rkl\\/ch|W0|w5r|w5r\\'s|W6lfe|W6lfen|W99|Waffenschr\\\xe9nke|wafs|wahrend|WAHRENDDESSEN|Wahrheitl|wail|Walbl|Walsinghaml|wankelmiltig|ware|WAREST|Warfe|warja|Waschbrettb\\\xe9uche|Waschb\\\xe9ir|Waschb\\\xe9iren|Wasseranschlljssen|Wattekn\\\xe9uel|Wattest\\\xe9bchen|we\\'re|We\\'ro|we\\/B|We\\/Bf|we\\/fere|Wechsell|weggebfirstet|weggespllllt|weggesplllltl|weggesp\\\ufb02lt|wegl|wegreiflsen|wegschieBen|Wegtratan|wegzuwefien|wei\\/3|WeiB|weiBe|weiBen|weiBer|weiBes|WeiBfresse|weiBt|Weif\\$|Weif\\$t|weif2\\>|weif3|weif3\\>|Weif3t|weif5|Weifbe|weifbt|Weifi|Weifie|weifies|Weifist|Weifit|weifk|weifken|Weifker|weifkes|weifkt|weifL|weifLt|weifl\\\xbb|weifS|WeifSt|weifZ\\>|WeifZ\\>t|weif\\\xe9t|Weihnachtseink\\\xe9ufe|Weihnachtsm\\\xe9nner|weil\\'5|weil\\'5t|weil3|Weil3t|weil5|Weil5t|weili|weilit|weilke|Weill|weills|weillst|weillt|weilS|weilSe|WeilSglut|weilZ\\>|weilZ\\~|weiss|weissen|weisst|weiterhiipfen|Weiterpessen|weitl\\\xe9ufige|weitweg|WelBt|well|Well|Wellit|welllt|welt|WELTBEVOLKERUNG|Wel\\\ufb02t|Werdja|Werkst\\\xe9tten|Werkzeugg\\\ufb02rtel|wertschfitzen|Westflilgel|Westkilste|Wettk\\\xe9mpfe|Wettk\\\xe9mpfen|Wettk\\\xe9mpfer|Wfinsche|wfinschen|Wfird|wfirde|Wfirden|wfirdest|wfire|Wfirme|Wfisste|wfitete|wfssen|Widen\\/v\\\xe9rtig|widerf\\'a\\'hrt|widerspriichliche|Widerw\\\xe9irtig|wiedergew\\\xe9ihltl|wiederhaben|Wiederh\\\xe9ren|Wieheifiternoch|Wieheiliternoch|wihlerisch|wihlerlsch|wiihlen|wiihlte|wiihrend|wiilrdest|Wiinde|wiinsch|Wiinsche|Wiinschen|wiinschst|wiinscht|wiinschte|wiirde|Wiirden|Wiirdest|wiirdet|wiirdigst|Wiire|wiiren|Wiirfel|wiirfeln|Wiirfels|wiirs|Wiirstchen|wiischt|Wiisste|wiissten|wiisstest|Wiiste|wiitenden|wijnsche|wijnschen|wijnschte|wijrd|wijrde|wijrden|wijrdest|wijrdiger|Wijrg|wijsste|wijtend|wildl|wilnsch|wilnsche|wilnschen|wilnscht|wilnschte|wilrd|Wilrde|Wilrden|Wilrdest|wilrdig|Wilrfel|Wilrfelenergie|wilsste|wilssten|Wilstling|wiltend|Windelhundl|Windhundk\\\xe9rper|winner|Wire|wires|Wirfangen|wirja|wirje|wirjede|wirjeden|wirjetzt|Wirnisse|Wirsind|wirtragen|Wirtschaftspriifer|Wirverfolgen|wirvom|Wirwaren|Wirwarten|Wirwerden|Wirwissen|Wirwollen|Wirwollten|Wirzeigten|wirzu|Witzl|WKHRENDDESSEN|wL\\'lrden|wle|Wleso|Wlhlen|wllinsch|wllinschst|wllinscht|wllirde|wllirden|wllirdest|wllirdet|Wllirgegriff|wllirgen|wllisste|wlr|wlrd|wlrkllch|Wlrkllchkelt|wlrst|Wlrwarten|wlrwollen|Wo\\/f|Wochenf\\\xe9hre|woffir|Wofiir|Wofijr|wofilr|Wofur|WoherweiB|WoherweiBt|Woherweif\\$t|wohlfilhlen|Wollkn\\\xe9uel|womiiglich|wom\\\xe9glich|wom\\\xe9iglich|Worfiber|woriiber|Worijber|Wortgepl\\\xe9nkel|Woruber|wt\\/\\'rden|wtinsche|wtinschst|wtirde|Wtirdest|Wtirfel|Wtmschen|WUl\\'d\\\u20ac|WUlfelbecher|wullte|Wundersch6n|wunderschfin|Wunderschiin|wunderschiinen|wundersch\\\xe9n|wundersch\\\xe9ne|Wundersch\\\xe9nel|wundersch\\\xe9nen|wundersch\\\xe9nes|wundersoh\\\xe9n|wunsche|Wunschen|wunscht|wunschte|WUNSCHTE|wurcle|wUrde|Wurdige|WURGT|Wurmer|Wursfsfulle|Wuste|WUSTEN|wutend|wu\\\xdfte|wu\\\xdftest|w\\\xa7r\\'s|w\\\xa7re|W\\\xa7ren\\'s|w\\\xe9\\'hrend|w\\\xe9chst|W\\\xe9chter|w\\\xe9fs|W\\\xe9g|w\\\xe9hle|w\\\xe9hlejetzt|w\\\xe9hlen|W\\\xe9hler|W\\\xe9hlern|w\\\xe9hlt|w\\\xe9hlte|w\\\xe9hrend|W\\\xe9hrung|W\\\xe9ichter|w\\\xe9ihlen|w\\\xe9ihrend|w\\\xe9ir|w\\\xe9ir\\'s|w\\\xe9irde|W\\\xe9ire|w\\\xe9iren|w\\\xe9irmen|w\\\xe9irst|W\\\xe9lder|W\\\xe9ldern|W\\\xe9lfen|W\\\xe9lkchen|W\\\xe9nde|W\\\xe9nden|w\\\xe9r|w\\\xe9r\\'s|W\\\xe9re|W\\\xe9ren|w\\\xe9ret|w\\\xe9rja|W\\\xe9rm|W\\\xe9rme|w\\\xe9rmt|W\\\xe9rst|w\\\xe9rt|W\\\xe9rter|W\\\xe9rterbuch|w\\\xe9rtliche|W\\\xe9sche|W\\\xe9scheklammer|W\\\xe9schst|w\\\xe9scht|w\\\ufb02rde|w\\\ufb02rden|W\\\ufb02rfel|z\\'a\\'h|Z\\/egf|Z\\/yarettenb\\\xe4ume|Z05|z6gel1e|z6gern|zahlenm\\\xe9\\\ufb02ig|zappelnl|Zauberspruchen|Zaubervoodookr\\\xe9fte|Zauherpfippchen|Zefietzende|zeitgem5B|Zeitgem\\\xe9\\\ufb02e|Zeitgeniissische|zeitgeniissischen|Zellenschliissel|zerbeif\\$en|zerbeif\\$t|zerf\\\xe9llt|Zermatschger\\\xe9usch|zerm\\\ufb02rben|zerreifien|zerreilit|zersfdren|zerst6rst|zerst6rt|zerstdren|Zerstfiren|Zerstfirer|Zerstfirungskraft|Zerstiickelung|zerstiire|zerstiiren|Zerstiirer|zerstiirt|zerstiirten|zerstiirtl|Zerstiirungl|zerstoren|zerst\\\xe9re|zerst\\\xe9ren|Zerst\\\xe9rer|zerst\\\xe9rt|Zerst\\\xe9rung|Zerst\\\xe9rungsfeldzug|zertrlllmmert|zfihlt|Ziel160m|Zihnelt|ziichtiger|Ziige|Ziindkapseln|Zilnd|Zilnden|Zilndungsenergie|Zilrich|Zindern|Zingstlich|Ziufierst|zleht|ZLIFUCK|Zooschlieliung|Zuckerschn\\\ufb02tchen|zuerstvor|zuffillig|zuflligen|ZUFUCK|Zuf\\\xe9illig|Zuf\\\xe9illigerweise|zuf\\\xe9llig|Zuf\\\xe9lligerweise|zug\\'a\\'nglichen|ZUGANGSPRIORITKT|zugehdrt|zugeh\\\xe9rt|zugestofien|Zugest\\\xe9ndnis|Zugest\\\xe9ndnisse|Zugiinge|zuh6ren|zuh6rt|zuhiiren|zuhiirt|Zuh\\\xe9lter|Zuh\\\xe9ren|Zuh\\\xe9rer|zukilnftiges|zul|zundete|Zundverteilerkappe|zunjick|zun\\\xe9chst|zun\\\xe9hen|zun\\\xe9ihen|Zuokerschntltchen|zurfick|zurfickblicken|zurfickgekommen|zurfickgezogen|zurfickkehren|zurfickzufuhren|zuriick|zuriickbleiben|zuriickgeben|zuriickgehen|zuriickgekommen|zuriickgezogen|zuriickhaben|zuriickkehre|zuriickkehren|zuriickkehrst|zuriickziehen|Zurijck|zurijckbringen|zurijckfordem|zurijckgeholt|zurijckgekehrt|zurijckgekommen|zurijckgelassen|zurijckgerufen|zurijckkehren|zurijcknehmen|zurijckstolpern|Zurilck|Zurilckf|zurilckgeblieben|zurilckgeholt|zurilckgekehrt|zurilckhalten|zurilckholen|zurilckkehre|zurilckkehren|zurilckkehrt|zurilckkommen|zurilckkommt|zurilcklassen|zurilckziehen|Zurilckziehenl|zurilckzugeben|zurl\\'Jck|zurL\\'lck|zurLick|zurljckgeben|zurllickfallen|zurllickgekehrt|zurllickkehrt|zurllickzukehren|zurlllckgehen|zurlllckkomme|zurtick|zurtickbringe|zurtickgezogen|zurtlckgekommen|zurtlckvervvandeln|Zuruck|ZURUCK|zuruckbleiben|zuruckblicken|zuruckdenke|zuruckfeuern|zuruckgehen|zuruckgelegt|zuruckgewiesen|zuruckgreifen|zuruckhaben|zuruckkehren|zuruckkehrten|zuruckkomme|zuruckkommen|zuruckk\\\xe9mst|zuruckl|zurucklassen|zurUcklieB|zuruckl\\\xe9cheln|zurucknehmen|zuruckverwandeln|zuruckverwandelt|zuruckziehen|zuruckzukommen|zurverfilgung|zur\\\xe9ickrufen|zur\\\ufb02ck|Zur\\\ufb02ckbleiben|zur\\\ufb02ckfliegen|zur\\\ufb02ckgeschickt|zur\\\ufb02ckgibst|zus\\'a\\'tzliche|zusammenbeilien|zusammenffigen|zusammenfugen|zusammenfuhren|zusammenf\\\xe9illt|zusammenh\\\xe9ilt|zusammenh\\\xe9lt|zusammenh\\\xe9ngen|zusammenreifien|zusammenzuschweifien|zuschl\\\xe9gst|zust6Bt|zustofken|zust\\\xe9indig|zust\\\xe9ncligen|zust\\\xe9ndig|zust\\\xe9ndigen|zus\\\xe9tzlich|zus\\\xe9tzliche|zuverlfissig|zuverllssig|zuverl\\\xe9ssig|zuverl\\\xe9ssiger|zuviel|zuviele|zuzuflligen|Zu\\\ufb02ucht|zvvei|Zw6If|zw6lfmal|Zwel|Zwickmfihle|Zwillingstiichter|Zwischenf\\\xe9lle|zwnlf|Zw\\\xe9ilften|zw\\\xe9lf|z\\\xe9gerlich|z\\\xe9gern|Z\\\xe9gerns|z\\\xe9h|z\\\xe9he|z\\\xe9her|z\\\xe9hl|z\\\xe9hle|z\\\xe9hlen|Z\\\xe9hlerei|z\\\xe9hlt|z\\\xe9hltl|Z\\\xe9hlung|Z\\\xe9hne|Z\\\xe9hnen|Z\\\xe9hneputzen|z\\\xe9ihle|z\\\xe9ihlen|z\\\xe9ihlt|Z\\\xe9ihlungen|Z\\\xe9ihne|Z\\\xe9libat|\\\\\\/GFQHUQGH|\\\\\\/OFVVUFf\\\u20ac|\\\\\\/Vahrheit|\\\\\\/Vir|\\\\\\/\\\\\\/i6fUl\\'1l\\\u20acfi|\\\\\\/\\\\\\/il\\'fUl\\'1I\\'\\\u20acl\\'1|\\\\Nynn|\\_|\\\xc4u|\\\xe9|\\\xe9chzt|\\\xe9ffentlich|\\\xe9ffne|\\\xe9ffnen|\\\xe9ffnet|\\\xe9fft|\\\xe9fter|\\\xe9fters|\\\xe9h|\\\xe9hnlich|\\\xe9hnliche|\\\xe9hnlicher|\\\xe9ih|\\\xe9ihnlich|\\\xe9indern|\\\xe9itzend|\\\xe9lter|\\\xe9lteste|\\\xe9ltesten|\\\xe9ndere|\\\xe9ndern|\\\xe9ndert|\\\xe9nderte|\\\xe9nderten|\\\xe9ngstlich|\\\xe9rgere|\\\xe9rgern|\\\xe9rztliche|\\\xe9rztlichen|\\\xe9rztlicher|\\\xe9sthetisch|\\\xe9tzend|\\\xe9ufierst|\\\xe9ufiersten|\\\xe9uflserst|\\\ufb02atterndem|\\\ufb02el|\\\ufb02iehen|\\\ufb02jr|\\\ufb02lhlen|\\\ufb02lllen|\\\ufb02lr|\\\ufb02lrchterlich|\\\ufb02ndet|AIle|AIter|GI\\\xfcck|PIaystation|AIIes|AIso|Ouatsch|AIles|BIeib|KIaut|AIlah|PIan|oderjemand|liestjetzt)(\\b|$)"}}, - 'eng': {'BeginLines': {'data': OrderedDict([(u'lgot it', u'I got it'), (u'Don,t ', u"Don't "), (u'Can,t ', u"Can't "), (u'Let,s ', u"Let's "), (u'He,s ', u"He's "), (u'I,m ', u"I'm "), (u'I,ve ', u"I've "), (u'I,ll ', u"I'll "), (u'You,ll ', u"You'll "), (u'T hey ', u'They '), (u'T here ', u'There '), (u'W here ', u'Where '), (u'M aybe ', u'Maybe '), (u'S hould ', u'Should '), (u'|was', u'I was'), (u'|am ', u'I am'), (u'No w, ', u'Now, '), (u'l... I ', u'I... I '), (u'L... I ', u'I... I '), (u'lrn gonna', u"I'm gonna"), (u"-l don't", u"-I don't"), (u"l don't", u"I don't"), (u'L ', u'I '), (u'-L ', u'-I '), (u'- L ', u'- I '), (u'-l ', u'-I '), (u'- l ', u'- I '), (u'G0', u'Go'), (u'GO get', u'Go get'), (u'GO to', u'Go to'), (u'GO for', u'Go for'), (u'Ifl', u'If I'), (u"lt'll", u"It'll"), (u"Lt'll", u"It'll"), (u'IVIa', u'Ma'), (u'IVIu', u'Mu'), (u'0ne', u'One'), (u'0nly', u'Only'), (u'0n ', u'On '), (u'lt ', u'It '), (u'Lt ', u'It '), (u"lt's ", u"It's "), (u"Lt's ", u"It's "), (u'ln ', u'In '), (u'Ln ', u'In '), (u'l-in ', u'I-in '), (u'l-impossible', u'I-impossible'), (u'l- impossible', u'I-impossible'), (u'L- impossible', u'I-impossible'), (u"l-isn't ", u"I-isn't "), (u"L-isn't ", u"I-isn't "), (u"l- isn't ", u"I-isn't "), (u"L- isn't ", u"I-isn't "), (u'l- l ', u'I-I '), (u'L- l ', u'I-I '), (u'l- it ', u'I-it '), (u'L- it ', u'I-it '), (u'Ls it ', u'Is it '), (u'Ls there ', u'Is there '), (u'Ls he ', u'Is he '), (u'Ls she ', u'Is she '), (u'L can', u'I can'), (u'l can', u'I can'), (u"L'm ", u"I'm "), (u"L' m ", u"I'm "), (u"Lt' s ", u"It's "), (u"I']I ", u"I'll "), (u'...ls ', u'...Is '), (u'- ls ', u'- Is '), (u'...l ', u'...I '), (u'Ill ', u"I'll "), (u'L hope ', u'I hope '), (u"|\u2019E'$ ", u"It's "), (u"The y're ", u"They're "), (u'<i>/ ', u'<i>I '), (u'/ ', u'I '), (u'<i>/n ', u'<i>In '), (u'/n ', u'In '), (u'<i>Ana\u2019 ', u'<i>And '), (u"<i>Ana' ", u'<i>And '), (u'~ ', u'- '), (u"<i>A'|'|'EN BOROUGH:", u'<i>ATTENBOROUGH:'), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID A'|'|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID AT|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"<i>AT|'EN BOROUGH:", u'<i>ATTENBOROUGH:'), (u'TH REE ', u'THREE '), (u'NARRA TOR', u'NARRATOR'), (u'<i>NARRA TOR', u'<i>NARRATOR'), (u"lt'syour", u"It's your"), (u"It'syour", u"It's your"), (u'Ls ', u'Is '), (u'l ', u'I ')]), - 'pattern': u"(?um)^(?:lgot\\ it|Don\\,t\\ |Can\\,t\\ |Let\\,s\\ |He\\,s\\ |I\\,m\\ |I\\,ve\\ |I\\,ll\\ |You\\,ll\\ |T\\ hey\\ |T\\ here\\ |W\\ here\\ |M\\ aybe\\ |S\\ hould\\ |\\|was|\\|am\\ |No\\ w\\,\\ |l\\.\\.\\.\\ I\\ |L\\.\\.\\.\\ I\\ |lrn\\ gonna|\\-l\\ don\\'t|l\\ don\\'t|L\\ |\\-L\\ |\\-\\ L\\ |\\-l\\ |\\-\\ l\\ |G0|GO\\ get|GO\\ to|GO\\ for|Ifl|lt\\'ll|Lt\\'ll|IVIa|IVIu|0ne|0nly|0n\\ |lt\\ |Lt\\ |lt\\'s\\ |Lt\\'s\\ |ln\\ |Ln\\ |l\\-in\\ |l\\-impossible|l\\-\\ impossible|L\\-\\ impossible|l\\-isn\\'t\\ |L\\-isn\\'t\\ |l\\-\\ isn\\'t\\ |L\\-\\ isn\\'t\\ |l\\-\\ l\\ |L\\-\\ l\\ |l\\-\\ it\\ |L\\-\\ it\\ |Ls\\ it\\ |Ls\\ there\\ |Ls\\ he\\ |Ls\\ she\\ |L\\ can|l\\ can|L\\'m\\ |L\\'\\ m\\ |Lt\\'\\ s\\ |I\\'\\]I\\ |\\.\\.\\.ls\\ |\\-\\ ls\\ |\\.\\.\\.l\\ |Ill\\ |L\\ hope\\ |\\|\\\u2019E\\'\\$\\ |The\\ y\\'re\\ |\\<i\\>\\/\\ |\\/\\ |\\<i\\>\\/n\\ |\\/n\\ |\\<i\\>Ana\\\u2019\\ |\\<i\\>Ana\\'\\ |\\~\\ |\\<i\\>A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|DAVID\\ A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|AT\\|\\'EN\\ BOROUGH\\:|DAVID\\ AT\\|\\'EN\\ BOROUGH\\:|\\<i\\>AT\\|\\'EN\\ BOROUGH\\:|TH\\ REE\\ |NARRA\\ TOR|\\<i\\>NARRA\\ TOR|lt\\'syour|It\\'syour|Ls\\ |l\\ )"}, - 'EndLines': {'data': OrderedDict([(u', sin', u', sir.'), (u' mothen', u' mother.'), (u" can't_", u" can't."), (u' openiL', u' open it.'), (u' of\ufb02', u' off!'), (u'pshycol', u'psycho!')]), - 'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol)$"}, - 'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]), - 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just"), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'eng': {'BeginLines': {'data': OrderedDict([(u'lgot it', u'I got it'), (u'Don,t ', u"Don't "), (u'Can,t ', u"Can't "), (u'Let,s ', u"Let's "), (u'He,s ', u"He's "), (u'I,m ', u"I'm "), (u'I,ve ', u"I've "), (u'I,ll ', u"I'll "), (u'You,ll ', u"You'll "), (u'T hey ', u'They '), (u'T here ', u'There '), (u'W here ', u'Where '), (u'M aybe ', u'Maybe '), (u'S hould ', u'Should '), (u'|was', u'I was'), (u'|am ', u'I am'), (u'No w, ', u'Now, '), (u'l... I ', u'I... I '), (u'L... I ', u'I... I '), (u'lrn gonna', u"I'm gonna"), (u"-l don't", u"-I don't"), (u"l don't", u"I don't"), (u'L ', u'I '), (u'-L ', u'-I '), (u'- L ', u'- I '), (u'-l ', u'-I '), (u'- l ', u'- I '), (u'G0', u'Go'), (u'GO get', u'Go get'), (u'GO to', u'Go to'), (u'GO for', u'Go for'), (u'Ifl', u'If I'), (u"lt'll", u"It'll"), (u"Lt'll", u"It'll"), (u'IVIa', u'Ma'), (u'IVIu', u'Mu'), (u'0ne', u'One'), (u'0nly', u'Only'), (u'0n ', u'On '), (u'lt ', u'It '), (u'Lt ', u'It '), (u"lt's ", u"It's "), (u"Lt's ", u"It's "), (u'ln ', u'In '), (u'Ln ', u'In '), (u'l-in ', u'I-in '), (u'l-impossible', u'I-impossible'), (u'l- impossible', u'I-impossible'), (u'L- impossible', u'I-impossible'), (u"l-isn't ", u"I-isn't "), (u"L-isn't ", u"I-isn't "), (u"l- isn't ", u"I-isn't "), (u"L- isn't ", u"I-isn't "), (u'l- l ', u'I-I '), (u'L- l ', u'I-I '), (u'l- it ', u'I-it '), (u'L- it ', u'I-it '), (u'Ls it ', u'Is it '), (u'Ls there ', u'Is there '), (u'Ls he ', u'Is he '), (u'Ls she ', u'Is she '), (u'L can', u'I can'), (u'l can', u'I can'), (u"L'm ", u"I'm "), (u"L' m ", u"I'm "), (u"Lt' s ", u"It's "), (u"I']I ", u"I'll "), (u'...ls ', u'...Is '), (u'- ls ', u'- Is '), (u'...l ', u'...I '), (u'Ill ', u"I'll "), (u'L hope ', u'I hope '), (u"|\u2019E'$ ", u"It's "), (u"The y're ", u"They're "), (u'<i>/ ', u'<i>I '), (u'/ ', u'I '), (u'<i>/n ', u'<i>In '), (u'/n ', u'In '), (u'<i>Ana\u2019 ', u'<i>And '), (u"<i>Ana' ", u'<i>And '), (u'~ ', u'- '), (u"<i>A'|'|'EN BOROUGH:", u'<i>ATTENBOROUGH:'), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID A'|'|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID AT|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"<i>AT|'EN BOROUGH:", u'<i>ATTENBOROUGH:'), (u'TH REE ', u'THREE '), (u'NARRA TOR', u'NARRATOR'), (u'<i>NARRA TOR', u'<i>NARRATOR'), (u"lt'syour", u"It's your"), (u"It'syour", u"It's your"), (u'Ls ', u'Is '), (u'I ve ', u"I've "), (u'I ii ', u"I'll "), (u'I m ', u"I'm "), (u'Why d ', u"Why'd "), (u'why d ', u"Why'd "), (u'Couldn t ', u"Couldn't "), (u'couldn t ', u"Couldn't "), (u'That s ', u"That's "), (u'that s ', u"That's "), (u'l ', u'I ')]), + 'pattern': u"(?um)^(?:lgot\\ it|Don\\,t\\ |Can\\,t\\ |Let\\,s\\ |He\\,s\\ |I\\,m\\ |I\\,ve\\ |I\\,ll\\ |You\\,ll\\ |T\\ hey\\ |T\\ here\\ |W\\ here\\ |M\\ aybe\\ |S\\ hould\\ |\\|was|\\|am\\ |No\\ w\\,\\ |l\\.\\.\\.\\ I\\ |L\\.\\.\\.\\ I\\ |lrn\\ gonna|\\-l\\ don\\'t|l\\ don\\'t|L\\ |\\-L\\ |\\-\\ L\\ |\\-l\\ |\\-\\ l\\ |G0|GO\\ get|GO\\ to|GO\\ for|Ifl|lt\\'ll|Lt\\'ll|IVIa|IVIu|0ne|0nly|0n\\ |lt\\ |Lt\\ |lt\\'s\\ |Lt\\'s\\ |ln\\ |Ln\\ |l\\-in\\ |l\\-impossible|l\\-\\ impossible|L\\-\\ impossible|l\\-isn\\'t\\ |L\\-isn\\'t\\ |l\\-\\ isn\\'t\\ |L\\-\\ isn\\'t\\ |l\\-\\ l\\ |L\\-\\ l\\ |l\\-\\ it\\ |L\\-\\ it\\ |Ls\\ it\\ |Ls\\ there\\ |Ls\\ he\\ |Ls\\ she\\ |L\\ can|l\\ can|L\\'m\\ |L\\'\\ m\\ |Lt\\'\\ s\\ |I\\'\\]I\\ |\\.\\.\\.ls\\ |\\-\\ ls\\ |\\.\\.\\.l\\ |Ill\\ |L\\ hope\\ |\\|\\\u2019E\\'\\$\\ |The\\ y\\'re\\ |\\<i\\>\\/\\ |\\/\\ |\\<i\\>\\/n\\ |\\/n\\ |\\<i\\>Ana\\\u2019\\ |\\<i\\>Ana\\'\\ |\\~\\ |\\<i\\>A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|DAVID\\ A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|AT\\|\\'EN\\ BOROUGH\\:|DAVID\\ AT\\|\\'EN\\ BOROUGH\\:|\\<i\\>AT\\|\\'EN\\ BOROUGH\\:|TH\\ REE\\ |NARRA\\ TOR|\\<i\\>NARRA\\ TOR|lt\\'syour|It\\'syour|Ls\\ |I\\ ve\\ |I\\ ii\\ |I\\ m\\ |Why\\ d\\ |why\\ d\\ |Couldn\\ t\\ |couldn\\ t\\ |That\\ s\\ |that\\ s\\ |l\\ )"}, + 'EndLines': {'data': OrderedDict([(u', sin', u', sir.'), (u' mothen', u' mother.'), (u" can't_", u" can't."), (u' openiL', u' open it.'), (u' of\ufb02', u' off!'), (u'pshycol', u'psycho!'), (u' i...', u' I...'), (u' L.', u' I.')]), + 'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol|\\ i\\.\\.\\.|\\ L\\.)$"}, + 'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Henry ll', u'Henry II'), (u'Henry lll', u'Henry III'), (u'Henry Vlll', u'Henry VIII'), (u'Henry Vll', u'Henry VII'), (u'Henry Vl', u'Henry VI'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u' I ve ', u" I've "), (u' I ii ', u" I'll "), (u' I m ', u" I'm "), (u' why d ', u" why'd "), (u' couldn t ', u" couldn't "), (u' that s ', u" that's "), (u' i... ', u' I... '), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]), + 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Henry\\ ll|Henry\\ lll|Henry\\ Vlll|Henry\\ Vll|Henry\\ Vl|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |\\ I\\ ve\\ |\\ I\\ ii\\ |\\ I\\ m\\ |\\ why\\ d\\ |\\ couldn\\ t\\ |\\ that\\ s\\ |\\ i\\.\\.\\.\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"}, + 'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'";', u"'s"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just")]), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'H ey.', u'Hey.'), (u'He)\u2019-', u'Hey.'), (u'N0.', u'No.'), (u'-N0.', u'-No.'), (u'Noll', u'No!!'), (u'(G ROANS)', u'(GROANS)'), (u'[G ROANS]', u'[GROANS]'), (u'(M EOWS)', u'(MEOWS)'), (u'[M EOWS]', u'[MEOWS]'), (u'Uaughs]', u'[laughs]'), (u'[chitte rs]', u'[chitters]'), (u'Hil\u2018 it!', u'Hit it!'), (u'<i>Hil\u2018 it!</i>', u'<i>Hit it!</i>'), (u'ISIGHS]', u'[SIGHS]')]), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'$COff$', u'scoffs'), (u'$ergei', u'Sergei'), (u"$'llOp", u'Stop'), (u"/'//", u"I'll"), (u"/'/I", u"I'll"), (u'/ennifer', u'Jennifer'), (u'/got', u'I got'), (u'/have', u'I have'), (u'/hope', u'I hope'), (u'/just', u'I just'), (u'/love', u'I love'), (u"/'m", u"I'm"), (u'/mmerse', u'immerse'), (u'/nsu/ts', u'Insults'), (u'/ong', u'long'), (u'/ook', u'look'), (u"/t's", u"It's"), (u"/'ve", u"I've"), (u"\\/\\/e'd", u"We'd"), (u"\\/\\/e're", u"We're"), (u"\\/\\/e've", u"We've"), (u'\\/\\/hat', u'What'), (u"\\/\\/here'd", u"Where'd"), (u'\\/\\/hoo', u'Whoo'), (u'\\/\\/hy', u'Why'), (u"\\/\\/hy'd", u"Why'd"), (u"\\/\\le're", u"We're"), (u'\\/Ve', u'We'), (u"\\Ne're", u"We're"), (u"\\Nhat's", u"What's"), (u"\\Nhere's", u"Where's"), (u"|'mjust", u"I'm just"), (u'\xa4ff', u'off'), (u'\xa4Id', u'old'), (u'\xa4Ids', u'olds'), (u'\xa4n', u'on'), (u'\xa4ne', u'one'), (u'\xa4nly', u'only'), (u'\xa4pen', u'open'), (u'\xa4r', u'or'), (u'\xa4rder', u'order'), (u'\xa4ther', u'other'), (u'\xa4ur', u'our'), (u'\xa4ut', u'out'), (u'\xa4ver', u'over'), (u'\xa4wn', u'own'), (u"\u20acV\u20acI'y", u'every'), (u"0'clock", u"o'clock"), (u'0f', u'of'), (u'0fEngland', u'of England'), (u'0fft0', u'off to'), (u'0l/er', u'over'), (u'0n', u'on'), (u'0ne', u'one'), (u"0ne's", u"one's"), (u'0r', u'or'), (u'0rders', u'orders'), (u"0thers'", u"others'"), (u'0ut', u'out'), (u"0utlaw's", u"outlaw's"), (u"0utlaws'", u"outlaws'"), (u'0ver', u'over'), (u'13oos', u'1300s'), (u'18oos', u'1800s'), (u'195os', u'1950s'), (u"1et's", u"let's"), (u'1o', u'10'), (u'1oo', u'100'), (u'1ooth', u'100th'), (u'1oth', u'10th'), (u'2E_', u'2E.'), (u"2'IST", u'21ST'), (u"2'Ist_", u"2'1st."), (u'2o', u'20'), (u'2oth', u'20th'), (u'3o', u'30'), (u'3oth', u'30th'), (u'4o', u'40'), (u'4os', u'40s'), (u'4oth', u'40th'), (u'50rry', u'sorry'), (u'5o', u'50'), (u'5oth', u'50th'), (u'6o', u'60'), (u'6os', u'60s'), (u"'6os", u"'60s"), (u'6oth', u'60th'), (u'7o', u'70'), (u"'7os", u"'70s"), (u'7oth', u'70th'), (u'8o', u'80'), (u"'8os", u"'80s"), (u'8oth', u'80th'), (u'9/aim', u'alarm'), (u'9o', u'90'), (u'9oth', u'90th'), (u'9UnShQt', u'gunshot'), (u'a//', u'all'), (u'a/bum', u'album'), (u'a/so', u'also'), (u'A/ways', u'Always'), (u'abcut', u'about'), (u'aboutjoining', u'about joining'), (u'aboutposh', u'about posh'), (u'aboutus', u'about us'), (u'aboutyou', u'about you'), (u'accldent', u'accident'), (u'Acool', u'A cool'), (u'afier', u'after'), (u'affraid', u'afraid'), (u'Afriend', u'A friend'), (u'afterall', u'after all'), (u'afterthe', u'after the'), (u'afulcrum', u'a fulcrum'), (u'Afunny', u'A funny'), (u'aga/nst', u'against'), (u'ahsolutes', u'absolutes'), (u'AI_I_', u'ALL'), (u'AIien', u'Alien'), (u'AIex', u'Alex'), (u'AII', u'All'), (u'AIIan', u'Allan'), (u'AIIow', u'Allow'), (u'AIive', u'Alive'), (u"ain'tgotno", u"ain't got no"), (u"Ain'tgotno", u"Ain't got no"), (u'airstrike', u'air strike'), (u'AIVIBULANCE', u'AMBULANCE'), (u'ajob', u'a job'), (u'ajockey_', u'a jockey.'), (u'ajoke', u'a joke'), (u'Ajoke', u'A joke'), (u'ajoking', u'a joking'), (u'al/', u'all'), (u'al/en', u'alien'), (u'alittle', u'a little'), (u'allgasp', u'all gasp'), (u'alljustforshow', u'all just for show'), (u"aln't", u"ain't"), (u'alot', u'a lot'), (u'Alot', u'A lot'), (u'An5wer', u'Answer'), (u'Andit', u'And it'), (u"Andit's", u"And it's"), (u'andl', u'and I'), (u'andlaughs', u'and laughs'), (u'andleave', u'and leave'), (u'andthe', u'and the'), (u'andyou', u'and you'), (u'Andyou', u'And you'), (u'ANNOUNC/NG', u'ANNOUNCING'), (u'anotherstep', u'another step'), (u'ANSWER/NG', u'ANSWERING'), (u'answerwhat', u'answer what'), (u'antiquejoke', u'antique joke'), (u"anyhcdy's", u"anybody's"), (u'Anyidea', u'Any idea'), (u"anyone's_", u"anyone's."), (u'apejust', u'ape just'), (u'ARABlc', u'ARABIC'), (u"aren't_", u"aren't."), (u"arerl't", u"aren't"), (u"Arnsteln's", u"Arnstein's"), (u'atleast', u'at least'), (u'Atough', u'A tough'), (u'Awhole', u'A whole'), (u'awoman', u'a woman'), (u'Awoman', u'A woman'), (u'barelytalked', u'barely talked'), (u'bcat', u'boat'), (u'Bcllvla', u'Bolivia'), (u'bcmb', u'bomb'), (u'bcmbs', u'bombs'), (u'be//y', u'belly'), (u'becuase', u'because'), (u"Beep/'ng", u'Beeping'), (u'bejumpy', u'be jumpy'), (u'besldes', u'besides'), (u'bestfriend', u'best friend'), (u'bestguy', u'best guy'), (u'bestjob', u'best job'), (u'BIack', u'Black'), (u'BIess', u'Bless'), (u'bigos___', u'bigos...'), (u'BIame', u'Blame'), (u'BIind', u'Blind'), (u'BIood', u'Blood'), (u'BIue', u'Blue'), (u'BLOVVS', u'BLOWS'), (u'blowholel', u'blowhole!'), (u'blt', u'bit'), (u'Bo99', u'Bogg'), (u'bodiedyoung', u'bodied young'), (u'breakf\xe9wtl', u'breakfast!'), (u'bulldozlng', u'bulldozing'), (u'butjust', u'but just'), (u'butl', u'but I'), (u'Butl', u'But I'), (u'butljust', u'but I just'), (u"Butljustcan'tgetenough", u"But I just can't get enough"), (u"Butyou're", u"But you're"), (u'buythem', u'buy them'), (u'buyyou', u'buy you'), (u'byjust', u'by just'), (u'bythe', u'by the'), (u"C/latter/'/7g", u'Chattering'), (u'ca///ng', u'calling'), (u'ca/I', u'call'), (u'call/ng', u'calling'), (u'callyou', u'call you'), (u'can*t', u"can't"), (u"can'i", u"can't"), (u"can'I", u"can't"), (u'canlgetyou', u'canI get you'), (u'cannotchange', u'cannot change'), (u'cannut', u'cannot'), (u"can'T", u"can't"), (u"can't_", u'Crucially'), (u"can'tjust", u"can't just"), (u"can'tletgo", u"can't let go"), (u'Car0l', u'Carol'), (u'Carhorn', u'Car horn'), (u'carrled', u'carried'), (u'Ccug', u'Coug'), (u'Ccugs', u'Cougs'), (u'Ccver', u'Cover'), (u'cellularchange', u'cellular change'), (u'cff', u'off'), (u'cfycu', u'of you'), (u'cfycur', u'of your'), (u'Ch/rping', u'Chirping'), (u'chaletgirl', u'chalet girl'), (u'changejobs', u'change jobs'), (u'Charliejust', u'Charlie just'), (u"Chatter/'rtg", u'Chattering'), (u'CHATTERWG', u'CHATTERING'), (u'Chequeredlove', u'Chequered love'), (u'cHIRPINcs', u'CHIRPING'), (u'chjldishness', u'childishness'), (u'chlldrcn', u'children'), (u'chlldren', u'children'), (u'chocolatte', u'chocolate'), (u'Cho/r', u'Choir'), (u'cHucKl_Es', u'CHUCKLES'), (u'CIark', u'Clark'), (u'CIear', u'Clear'), (u'circumcised_', u'circumcised.'), (u'ckay', u'okay'), (u'cl_osEs', u'CLOSES'), (u'CLATTERWG', u'CLATTERING'), (u'cn', u'on'), (u'cne', u'one'), (u'cnes', u'ones'), (u'Coincidenta//y', u'Coincidentally'), (u'COm\u20ac', u'Come'), (u'comp/etey', u'completely'), (u'complainingabout', u'complaining about'), (u'coms', u'come'), (u'cond/lion', u'condition'), (u'confdence', u'confidence'), (u'conhrmed', u'confirmed'), (u'connrm', u'confirm'), (u'Consecutivelyl', u'Consecutively!'), (u'COUGH5', u'COUGHS'), (u'CouGHING', u'COUGHING'), (u"couIdn't", u"couldn't"), (u'couldjust', u'could just'), (u"couldn'T", u"couldn't"), (u"couldn'tjust", u"couldn't just"), (u'Couldyou', u'Could you'), (u'crappyjob', u'crappy job'), (u'CRAsHING', u'CRASHING'), (u'crder', u'order'), (u'Crowdcheers', u'Crowd cheers'), (u'Cruoially', u'Crucially'), (u'cther', u'other'), (u'cuuld', u'could'), (u'cver', u'over'), (u"d/'dn't", u"didn't"), (u'd/squietude', u'disquietude'), (u"D\xa4esn't", u"Doesn't"), (u"d\xa4n'i", u"don't"), (u"d\xa4n't", u"don't"), (u'd\xb09', u'dog'), (u'd0', u'do'), (u'D0', u'Do'), (u"D0asn't", u"Doesn't"), (u"Dad'//", u"Dad'll"), (u'dairyjust', u'dairy just'), (u'Dar//ng', u'Darling'), (u'dc', u'do'), (u'Dcbby', u'Dobby'), (u"dccsn't", u"doesn't"), (u'dcctcr', u'doctor'), (u'Dces', u'Does'), (u'dcgs', u'dogs'), (u'dcing', u'doing'), (u"dcn'I", u"don't"), (u"dcn't", u"don't"), (u"Dcn't", u"Don't"), (u'dcughnut', u'doughnut'), (u'declslons', u'decisions'), (u'deedhas', u'deed has'), (u'Dehnitely', u'Definitely'), (u'desewes', u'deserves'), (u'desperate/\xbby', u'desperately'), (u'D\ufb02nk', u'Drink'), (u'DIAl_lNcs', u'DIALING'), (u"didn'!", u"didn't"), (u'didnt', u"didn't"), (u"didn'T", u"didn't"), (u"dIdn't", u"didn't"), (u"didn't_", u"didn't."), (u'didrft', u"didn't"), (u"didrl't", u"didn't"), (u'didyou', u'did you'), (u'divorcing_', u'divorcing.'), (u'dld', u'did'), (u"dldn't", u"didn't"), (u'dlfflcull', u'difficult'), (u'dlg', u'dig'), (u'dlsobeyed', u'disobeyed'), (u"doasn't", u"doesn't"), (u"Doasn't", u"Doesn't"), (u'doctoh', u'doctor'), (u'Doctor___tell', u'Doctor... tell'), (u'doesnt', u"doesn't"), (u"doesn'T", u"doesn't"), (u"doesri't", u"doesnt't"), (u'doesrt', u"doesn't"), (u'Doesrt', u"Doesn't"), (u'doit', u'do it'), (u'dojust', u'do just'), (u'don*t', u"don't"), (u'donejobs', u'done jobs'), (u"don'i", u"don't"), (u"don'l", u"don't"), (u"Don'l", u"Don't"), (u'Donllook', u"Don't look"), (u'dont', u"don't"), (u"don'T", u"don't"), (u"don'tcare", u"don't care"), (u"don'tjoke", u"don't joke"), (u"Don'tjudge", u"Don't judge"), (u"don'tjust", u"don't just"), (u"Don'tjust", u"Don't just"), (u"Don'tlet", u"Don't let"), (u"don'tlhink", u"don't think"), (u"don'tpush", u"don't push"), (u"Don'tyou", u"Don't you"), (u'DonWlook', u"Don't look"), (u'Dooropens', u'Door opens'), (u'doorshuts', u'door shuts'), (u'dothat', u'do that'), (u'dothis', u'do this'), (u'Drinkthis', u'Drink this'), (u'dumbass', u'dumb-ass'), (u'dumbto', u'dumb to'), (u"dun't", u"don't"), (u'E//e', u'Elle'), (u'E9YPt', u'Egypt'), (u"ea/'t/7", u'earth'), (u'eart/7', u'earth'), (u"efi'/'c/'ent", u'efficient'), (u'EN<3LlsH', u'ENGLISH'), (u'Enjoythe', u'Enjoy the'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u'etemity', u'eternity'), (u'ev/I', u'evil'), (u'eve/yone', u'everyone'), (u"even/body's", u"everybody's"), (u'eversay', u'ever say'), (u'Everymonth', u'Every month'), (u'everythings', u"everything's"), (u"Everythirlg's", u'Everything\u2019s'), (u"Everythlng's", u"Everything's"), (u'Everytime', u'Every time'), (u'Exac\ufb02y', u'Exactly'), (u'ExacUy_', u'Exactly.'), (u'excitedshrieking', u'excited shrieking'), (u'ExcLAllvls', u'EXCLAIMS'), (u'exploatation', u'exploitation'), (u'expreusion', u'expression'), (u'fairthat', u'fair that'), (u'Fathef', u'Father'), (u'fatherfigure', u'father figure'), (u'FBl', u'FBI'), (u'fcrebcdlng', u'foreboding'), (u'fcreverjudges', u'forever judges'), (u'fcund', u'found'), (u'feeleverything', u'feel everything'), (u'feelsweet', u'feel sweet'), (u"fiam/'/y", u'family'), (u'\ufb01ngernail', u'fingernail'), (u'finishedjunior', u'finished junior'), (u'FIynn', u'Flynn'), (u'flll', u'fill'), (u'flra', u'fira'), (u'Flylng', u'Flying'), (u'Fnends', u'Fiends'), (u'fo/low', u'follow'), (u'fonzvard', u'forward'), (u'fora', u'for a'), (u'Fora', u'For a'), (u'forajob', u'for a job'), (u'forAmerica', u'for America'), (u'forNew', u'for New'), (u'forone', u'for one'), (u'forso', u'for so'), (u'Forsuch', u'For such'), (u'forsunburns', u'for sunburns'), (u'forthe', u'for the'), (u'Foryears', u'For years'), (u'foryou', u'for you'), (u'Foudeen', u'Fouteen'), (u'Fou\ufb02een', u'Fourteen'), (u'FourSeasons', u'Four Seasons'), (u'fr/ends', u'friends'), (u'freezerfood', u'freezer food'), (u'F\xfchrerfeels', u'F\xfchrer feels'), (u'furthernotice', u'further notice'), (u'furyou', u'for you'), (u'G0', u'Go'), (u'g0in9', u'going'), (u'gamlenias', u'gardenias'), (u'GAsPING', u'GASPING'), (u'gc', u'go'), (u'gcing', u'going'), (u'gcnna', u'gonna'), (u'Gcnna', u'Gonna'), (u'gct', u'get'), (u'Gct', u'Got'), (u'genercsity', u'generosity'), (u'generosityn', u'generosity"'), (u'getjust', u'get just'), (u'g\ufb02ing', u'going'), (u'gi\ufb02friend', u'girlfriend'), (u'gir/', u'girl'), (u"gir/s'boarding", u"girls' boarding"), (u'giris', u'girls'), (u'gLlyS', u'guys'), (u'glum_', u'glum.'), (u'gnyone', u'anyone'), (u'golng', u'going'), (u'goodboyand', u'good boy and'), (u'goodjob', u'good job'), (u'gOt', u'got'), (u'gotjumped', u'got jumped'), (u'gotmyfirstinterview', u'got my first interview'), (u'grandjury', u'grand jury'), (u'greatjob', u'great job'), (u'Greatjobl', u'Great job!'), (u'grinco', u'gringo'), (u'GRoANING', u'GROANING'), (u'GRUNUNG', u'GRUNTING'), (u'gu', u'go'), (u'gunna', u'gonna'), (u'guyjumped', u'guy jumped'), (u'guyjust', u'guy just'), (u'gUyS', u'guys'), (u'_H6Y-', u'- Hey!'), (u'H\u20acY', u'Hey'), (u'H0we\xb7ver', u'However'), (u'halftheir', u'half their'), (u'hapPY', u'happy'), (u'hasrt', u"hasn't"), (u'Hasrt', u"Hasn't"), (u"haven'tspokerl", u"haven't spoken"), (u'hcle', u'hole'), (u'hcme', u'home'), (u'hcmes', u'homes'), (u'hcpe', u'hope'), (u'hctel', u'hotel'), (u'hcurs', u'hours'), (u'Hcw', u'How'), (u'he/ps', u'helps'), (u'hearjokestonight', u'hear jokes tonight'), (u'hearme', u'hear me'), (u'Hefell', u'He fell'), (u"he'II", u"he'll"), (u"He'II", u"He'll"), (u'HeII0', u'Hello'), (u"He'Il", u"He'll"), (u'Hejust', u'He just'), (u"He'lI", u"He'll"), (u'HelIo', u'Hello'), (u'hellc', u'hello'), (u'HellO', u'Hello'), (u'herboyfr/end', u'her boyfriend'), (u'herflesh', u'her flesh'), (u'herfollov\\/ed', u'her followed'), (u'herjob_', u'her job.'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herwith', u'her with'), (u'HeY\xb7', u'Hey.'), (u'HeyJennifer', u'Hey Jennifer'), (u'hiddsn', u'hidden'), (u'hisjunk', u'his junk'), (u'Hitlershare', u'Hitler share'), (u'Hlneed', u"I'll need"), (u'Hnally', u'finally'), (u'Hnishing', u'finishing'), (u'HOId', u'Hold'), (u'hOIes', u'holes'), (u'HONMNG', u'HONKING'), (u'honorthe', u'honor the'), (u'honoryou', u'honor you'), (u'honoryour', u'honor your'), (u"Hov\\/'s", u"How's"), (u"Hov\\/'S", u"How's"), (u'HovvLING', u'HOWLING'), (u'howit', u'how it'), (u"HoW's", u"How's"), (u'howto', u'how to'), (u"Hs's", u"He's"), (u'hurtyou', u'hurt you'), (u'I/erilj/', u'verify'), (u'I/fe', u'life'), (u'I\\/I', u'M'), (u'I\\/Ian', u'Man'), (u'I\\/Iathies', u'Mathies'), (u'I\\/Ie', u'Me'), (u'I\\/Iommy', u'Mommy'), (u'I\\/Ir', u'Mr'), (u'I\\/Ir.', u'Mr.'), (u'I\\/ly', u'My'), (u'I3EEPING', u'BEEPING'), (u'I3LARING', u'BLARING'), (u'Iacings', u'lacings'), (u'Iaid', u'laid'), (u'Iam', u'I am'), (u'Iand', u'land'), (u'Ianding', u'landing'), (u'Iast', u'last'), (u'Iate', u'late'), (u'Icad', u'load'), (u'Icading', u'loading'), (u'Ican', u'I can'), (u'Iccked', u'locked'), (u'Icng', u'long'), (u'Icsing', u'losing'), (u'Icslng', u'losing'), (u'Idid', u'I did'), (u"Ididn't", u"I didn't"), (u'Ido', u'I do'), (u"Idon'i", u"I don't"), (u"Idon't", u"I don't"), (u"Idon'tthink", u"I don't think"), (u"I'E'$", u"It's"), (u'Ieamed', u'learned'), (u'Ieapt', u'leapt'), (u'Iearned', u'learned'), (u'Ieast', u'least'), (u'Ieave', u'leave'), (u'Ied', u'led'), (u'Ieft', u'left'), (u"Ieg's", u"leg's"), (u'Iess', u'less'), (u'Iet', u'let'), (u"Iet's", u"let's"), (u"Iet'sjust", u"let's just"), (u'if/just', u'if I just'), (u'Ifear', u'I fear'), (u'Ifeared', u'I feared'), (u'Ifeel', u'I feel'), (u"ifI'||", u"if I'll"), (u"ifI'd", u"if I'd"), (u"ifI'II", u"if I'll"), (u"ifI'll", u"if I'll"), (u"ifI'm", u"if I'm"), (u'Ifinally', u'I finally'), (u"ifI've", u"if I've"), (u'ifl', u'if I'), (u'Iforgot', u'I forgot'), (u'Ifound', u'I found'), (u'ifshe', u'if she'), (u"ifthat's", u"if that's"), (u'ifthe', u'if the'), (u'Ifthe', u'If the'), (u"ifthere's", u"if there's"), (u'Ifthey', u'If they'), (u'ifwe', u'if we'), (u'Ifwe', u'If we'), (u'Ifycu', u'If you'), (u'ifyou', u'if you'), (u'Ifyou', u'If you'), (u'ifyuu', u'if you'), (u'Iget', u'I get'), (u'Igot', u'I got'), (u'Igotta', u'I gotta'), (u'Igotyou', u'I got you'), (u'Iguess', u'I guess'), (u'Iguessljust', u'I guess I just'), (u'Ihad', u'I had'), (u"Ihat's", u"that's"), (u'Ihave', u'I have'), (u'Iheard', u'I heard'), (u"ihere's", u"there's"), (u"ihey've", u"they've"), (u'Ihope', u'I hope'), (u'ii/Iary', u'Mary'), (u'ii/Ir', u'Mr'), (u'ii/Ir.', u'Mr.'), (u'ii/love', u'Move'), (u'Iife', u'life'), (u"I'II", u"I'll"), (u'Iike', u'like'), (u"I'Il", u"I'll"), (u'Iine', u'line'), (u'iirst', u'first'), (u"ii's", u"it's"), (u"Ii's", u"It's"), (u'Iiterallyjumped', u'literally jumped'), (u'Ijoined', u'I joined'), (u'Ijust', u'I just'), (u'Iknew', u'I knew'), (u'Iknow', u'I know'), (u'Ile', u'lie'), (u'Ileft', u'I left'), (u"I'lldo", u"I'll do"), (u"I'llmake", u"I'll make"), (u'Ilons', u'lions'), (u'Ilove', u'I love'), (u"I'mjust", u"I'm just"), (u'Inconceivablel', u'Inconceivable!'), (u'infact', u'in fact'), (u'Infact', u'In fact'), (u'in\ufb02uence', u'influence'), (u'infront', u'in front'), (u'injust', u'in just'), (u'insc\ufb01p\ufb01ons', u'inscriptions'), (u'insolencel', u'insolence!'), (u'intc', u'into'), (u'internationaljudges', u'international judges'), (u'inthe', u'in the'), (u'Iockdown', u'lockdown'), (u'Iong', u'long'), (u'Iongships', u'longships'), (u'Iook', u'look'), (u'Iookjust', u'look just'), (u'Iooklng', u'looking'), (u'Iooks', u'looks'), (u'Ioose', u'loose'), (u"Iord's", u"lord's"), (u'Iose', u'lose'), (u'Ioser', u'loser'), (u'Ioss', u'loss'), (u'Iost', u'lost'), (u'Iot', u'lot'), (u"Iot's", u"lot's"), (u'Iousyjob', u'lousy job'), (u'Iove', u'love'), (u'Ioves', u'loves'), (u'Iowlife', u'lowlife'), (u'Ipaid', u'I paid'), (u'Iquit', u'I quit'), (u'Ireallythinkthis', u'I really think this'), (u"I'rn", u"I'm"), (u'Isaw', u'I saw'), (u'Isayt/1e', u'I say the'), (u'isjust', u'is just'), (u"isn'i", u"isn't"), (u"isn't_", u"isn't."), (u'Isthis', u'Is this'), (u'Istill', u'I still'), (u'Istumblod', u'I stumbled'), (u'Itake', u'I take'), (u'itdown', u'it down'), (u'Iteach', u'I teach'), (u'Itfeels', u'It feels'), (u'ithave', u'it have'), (u'Ithink', u'I think'), (u'Ithinkthat', u'I think that'), (u'Ithinkthis', u'I think this'), (u"Ithinkyou're", u"I think you're"), (u'Ithlnk', u'I think'), (u'Ithoguht', u'I thought'), (u'Ithought', u'I thought'), (u'Ithoughtl', u'I thought I'), (u"it'II", u"it'll"), (u"It'II", u"It'll"), (u"it'Il", u"it'll"), (u"It'Il", u"It'll"), (u'itin', u'it in'), (u'itjust', u'it just'), (u'Itjust', u'It just'), (u"it'lI", u"it'll"), (u"It'lI", u"It'll"), (u"It'llhappen", u"It'll happen"), (u"it'lljust", u"it'll just"), (u'Itold', u'I told'), (u'Itook', u'I took'), (u'itout', u'it out'), (u"it'S", u"it's"), (u"it'sjinxed", u"it's jinxed"), (u"it'sjust", u"it's just"), (u"It'sjust", u"It's just"), (u'itso', u'it so'), (u'Ittends', u'It tends'), (u"Itwasn't", u"It wasn't"), (u'Iuckier', u'luckier'), (u'IV|oney', u'Money'), (u"IV|oney's", u"Money's"), (u"I'va", u"I've"), (u"I'Ve", u"I've"), (u'IVIan', u'Man'), (u'IVIAN', u'MAN'), (u'IVIarch', u'March'), (u"IVIarci's", u"Marci's"), (u'IVIarko', u'Marko'), (u'IVIe', u'Me'), (u"IVIine's", u"Mine's"), (u'IVImm', u'Mmm'), (u'IVIoney', u'Money'), (u'IVIr.', u'Mr.'), (u'IVIrs', u'Mrs'), (u'IVIuch', u'Much'), (u'IVIust', u'Must'), (u'IVIy', u'My'), (u'IVlacArthur', u'MacArthur'), (u"IVlacArthur's", u"MacArthur's"), (u'IVlcBride', u'McBride'), (u'IVlore', u'More'), (u'IVlotherfucker_', u'Motherfucker.'), (u'IVlr', u'Mr'), (u'IVlr.', u'Mr.'), (u'IVlr_', u'Mr.'), (u'IVlust', u'Must'), (u'IVly', u'My'), (u'Iwake', u'I wake'), (u'Iwant', u'I want'), (u'Iwanted', u'I wanted'), (u'Iwas', u'I was'), (u'Iwasjust', u'I was just'), (u'Iwasjustu', u'I was just...'), (u'Iwill', u'I will'), (u'Iwish', u'I wish'), (u"Iwon't", u"I won't"), (u'Iworked', u'I worked'), (u'Iwould', u'I would'), (u'jalapeno', u'jalape\xf1o'), (u'Jaokson', u'Jackson'), (u'Jascn', u'Jason'), (u'jcke', u'joke'), (u'jennifer', u'Jennifer'), (u'joseph', u'Joseph'), (u'Jumpthem', u'Jump them'), (u'jusi', u'just'), (u'jusl', u'just'), (u'justjudge', u'just judge'), (u'justleave', u'just leave'), (u'Justletgo', u'Just let go'), (u'kidsjumped', u'kids jumped'), (u'kiokflip', u'kickflip'), (u'knowjust', u'know just'), (u'knowthat', u'know that'), (u'knowthis', u'know this'), (u'knowwhat', u'know what'), (u'knowyet', u'know yet'), (u'knowyourlove', u'know your love'), (u'korean', u'Korean'), (u'L/ght', u'Light'), (u'L/kes', u'Likes'), (u'L\\/Ianuela', u'Manuela'), (u'L\\/Ianuelal', u'Manuela!'), (u'l\\/Iauzard', u'Mauzard'), (u'l\\/I\xe9lanie', u'M\xe9lanie'), (u'L\\/I\xe9lanie', u'M\xe9lanie'), (u'l\\/Iom', u'Mom'), (u'l\\/Iommy', u'Mommy'), (u'l\\/Ir', u'Mr'), (u'l\\/Ir.', u'Mr.'), (u'l\\/Is', u'Ms'), (u'l\\/ly', u'My'), (u'l_AuGHING', u'LAUGHING'), (u'l\u2018m', u"I'm"), (u'Laml6', u'I am l6'), (u'Lcad', u'Load'), (u'lcan', u'I can'), (u"lcan't", u"I can't"), (u"lcarl't_", u"I can't."), (u'Lcve', u'Love'), (u"l'd", u"I'd"), (u"L'd", u"I'd"), (u'ldid', u'I did'), (u'Ldid', u'I did'), (u'ldiot', u'Idiot'), (u"L'djump", u"I'd jump"), (u"ldon't", u"I don't"), (u"Ldon't", u"I don't"), (u'Lefs', u"Let's"), (u"Let'sjust", u"Let's just"), (u'lf', u'if'), (u'Lf', u'If'), (u'lfeelonelung', u'I feel one lung'), (u'lfthey', u'if they'), (u'lfyou', u'If you'), (u'Lfyou', u'If you'), (u"lfyou're", u"If you're"), (u'lget', u'I get'), (u'lgive', u'I give'), (u'Li/0/Academy', u'Lilly Academy'), (u'li/lr.', u'Mr.'), (u'ligature___', u'ligature...'), (u"l'II", u"I'll"), (u"l'Il", u"I'll"), (u'ljust', u'I just'), (u'Ljust', u'I just'), (u"ll/Iommy's", u"Mommy's"), (u'll/lajor', u'Major'), (u'Ll/lajor', u'Major'), (u'll/layans', u'Mayans'), (u"l'lI", u"I'll"), (u"l'll", u"I'll"), (u"L'll", u"I'll"), (u"l'lljust", u"I'll just"), (u"L'lltake", u"I'll take"), (u'llte', u'lite'), (u"l'm", u"I'm"), (u"L'm", u"I'm"), (u'Lmean', u'I mean'), (u"l'mjust", u"I'm just"), (u'ln', u'In'), (u'lN', u'IN'), (u'lNAuDll3LE', u'INAUDIBLE'), (u'LNAuDll3LE', u'INAUDIBLE'), (u'LNDlsTINcT', u'INDISTINCT'), (u'lneed', u'I need'), (u'lostyou', u'lost you'), (u'Loudmusic', u'Loud music'), (u'lraq', u'Iraq'), (u"lRA's", u"IRA's"), (u'Lrenka', u'Irenka'), (u'Lrn', u"I'm"), (u'lRS', u'IRS'), (u'lsabella', u'Isabella'), (u"lsn't", u"isn't"), (u"Lsn't", u"Isn't"), (u"Lst's", u"Let's"), (u'lsuppose', u'I suppose'), (u'lt', u'It'), (u'ltake', u'I take'), (u'ltell', u'I tell'), (u'lthink', u'I think'), (u'Lthink', u'I think'), (u'lthink___', u'I think...'), (u"lt'II", u"It'll"), (u"lt'Il", u"It'll"), (u'ltjammed_', u'It jammed.'), (u"lt'll", u"It'll"), (u'ltold', u'I told'), (u"lt's", u"It's"), (u"lT'S", u"IT'S"), (u"Lt'S", u"It's"), (u"Lt'sjust", u"It's just"), (u"lv\\/asn't", u"I wasn't"), (u"l've", u"I've"), (u"L've", u"I've"), (u'lVIan', u'Man'), (u'lVIcHenry', u'McHenry'), (u'lVIr.', u'Mr.'), (u'lVlacArthur', u'MacArthur'), (u'LVlore', u'More'), (u'lVlr', u'Mr'), (u'lVlr.', u'Mr.'), (u'lvluslc', u'MUSIC'), (u'lVlust', u'Must'), (u'LVly', u'Lily'), (u'lwaited', u'I waited'), (u'lwamoto', u'Iwamoto'), (u'lwant', u'I want'), (u'lwanted', u'I wanted'), (u'lwas', u'I was'), (u'lwill', u'I will'), (u"lwon't", u"I won't"), (u'lworked', u'I worked'), (u'lwould', u'I would'), (u"lwould've", u"I would've"), (u'lx/Iorning', u'Morning'), (u'M/dd/e', u'Middle'), (u'm/g/7ty', u'mighty'), (u'MACH/NE', u'MACHINE'), (u'MacKenz/e', u'MacKenzie'), (u'majorjackpot', u'major jackpot'), (u'majormuscle', u'major muscle'), (u'Manuela_', u'Manuela.'), (u'maste/y', u'mastery'), (u'Masturhate', u'Masturbate'), (u'Mattei_', u'Mattei.'), (u'mayjust', u'may just'), (u'mbecause', u'"because'), (u'McCa/Iister', u'McCallister'), (u'McCallisler', u'McCallister'), (u'Mccallister', u'McCallister'), (u'Mccallisters', u'McCallisters'), (u"mcm's", u"mom's"), (u'mcney', u'money'), (u'mcral', u'moral'), (u'mcre', u'more'), (u'mcve', u'move'), (u'mejust', u'me just'), (u'Mexioo', u'Mexico'), (u'mi//<', u'milk'), (u'misfartune', u'misfortune'), (u'Ml6', u'MI6'), (u'Mlnd', u'Mind'), (u"Mock/'ngbl'rd", u'Mockingbird'), (u"mOI'\u20ac", u'more'), (u'Mom_', u'Mom.'), (u'monkeyback', u'monkey back'), (u'move___l', u'move... I'), (u'moveto', u'move to'), (u'mustknock', u'must knock'), (u'Myheart', u'My heart'), (u'myjch', u'my job'), (u'myjet', u'my jet'), (u'myjob', u'my job'), (u'Myjob', u'My job'), (u"myjob's", u"my job's"), (u'mylife', u'my life'), (u'Mynew', u'My new'), (u'myown', u'my own'), (u'mypants', u'my pants'), (u'myselli', u'myself'), (u'Myshoes', u'My shoes'), (u'mysong', u'my song'), (u'mytemper', u'my temper'), (u'mythumb', u'my thumb'), (u'Myworld', u'My world'), (u'N0', u'No'), (u'narne', u'name'), (u'Natians', u'Nations'), (u'naTve', u'naive'), (u'nc', u'no'), (u'Nc', u'No'), (u'ncne', u'none'), (u'Ncrth', u'North'), (u'ncw', u'new'), (u'Ncw', u'Now'), (u'needyou', u'need you'), (u'neighboun', u'neighbour'), (u'neverfound', u'never found'), (u'neverthere', u'never there'), (u'neverv\\/ill_', u'never will.'), (u'NewJersey', u'New Jersey'), (u'newjob', u'new job'), (u'newjobs', u'new jobs'), (u'nextdoor', u'next door'), (u'Nighw', u'Nighty'), (u'nilios', u'ni\xf1os'), (u'Nlagnificence', u'Magnificence'), (u'Nlakes', u'Makes'), (u'Nlalina', u'Malina'), (u'Nlan', u'Man'), (u'Nlarch', u'March'), (u'Nlarine', u'Marine'), (u'Nlarion', u'Marion'), (u'Nlarry', u'Marry'), (u'Nlars', u'Mars'), (u'Nlarty', u'Marty'), (u'Nle', u'Me'), (u'Nleet', u'Meet'), (u'Nlen', u'Men'), (u'Nlom', u'Mom'), (u'Nlore', u'More'), (u'Nlornin', u'Mornin'), (u'Nlother', u'Mother'), (u'Nlr', u'Mr'), (u'Nlr.', u'Mr.'), (u'Nlrs', u'Mrs'), (u'Nluch', u'Much'), (u'nojurisdiction', u'no jurisdiction'), (u'noone', u'no one'), (u'Noone', u'No one'), (u'not judging', u'not judging'), (u'notgoing', u'not going'), (u'notjunk', u'not junk'), (u'Notjunk', u'Not junk'), (u'notjust', u'not just'), (u'notsure', u'not sure'), (u'novv', u'now'), (u'Nowjust', u'Now just'), (u"Nowthat's", u"Now that's"), (u'Numbertwo', u'Number two'), (u"oan't", u"can't"), (u"oan'tjust", u"can't just"), (u'objecl', u'object'), (u'occultpowerand', u'occult power and'), (u'Ocps', u'Oops'), (u'ofa', u'of a'), (u'ofajudge', u'of a judge'), (u'ofall', u'of all'), (u'Ofall', u'Of all'), (u'ofBedford', u'of Bedford'), (u'ofcourse', u'of course'), (u'Ofcourse', u'Of course'), (u'ofeach', u'of each'), (u'ofeither', u'of either'), (u"Offioer's", u"Officer's"), (u'ofFrance', u'of France'), (u'offreedom', u'of freedom'), (u'offthe', u'off the'), (u'offthis', u'off this'), (u'offto', u'off to'), (u'offun', u'of fun'), (u'ofguy', u'of guy'), (u'Ofhce', u'Office'), (u'ofhis', u'of his'), (u'ofHis', u'of His'), (u'ofhoneybees', u'of honeybees'), (u'ofit', u'of it'), (u'ofjam', u'of jam'), (u'OFJOAN', u'OF JOAN'), (u'ofjoy', u'of joy'), (u'ofjunior', u'of junior'), (u'ofme', u'of me'), (u'ofmead', u'of mead'), (u'ofmicroinjections', u'of microinjections'), (u'ofmy', u'of my'), (u'ofNew', u'of New'), (u"ofNorris'", u"of Norris'"), (u'ofopinions', u'of opinions'), (u'ofour', u'of our'), (u'ofpeopla', u'of people'), (u'ofthat', u'of that'), (u'ofthe', u'of the'), (u'Ofthe', u'Of the'), (u'oftheir', u'of their'), (u'ofthem', u'of them'), (u"ofthem's", u"of them's"), (u'ofthemselves', u'of themselves'), (u'ofthere', u'of there'), (u'ofthese', u'of these'), (u'ofthings', u'of things'), (u'ofthis', u'of this'), (u'ofthlngs', u'of things'), (u'ofthose', u'of those'), (u'ofuse', u'of use'), (u'ofwashington', u'of Washington'), (u'ofyou', u'of you'), (u'ofyour', u'of your'), (u'OId', u'Old'), (u'OIsson', u'Olsson'), (u'Ok3Y', u'Okay'), (u'okaY', u'okay'), (u'OkaY', u'Okay'), (u'OKaY', u'Okay'), (u'OKGY', u'Okay'), (u'Ol<', u'Ole'), (u'oldAdolfon', u'old Adolf on'), (u'onboard', u'on board'), (u'onIy', u'only'), (u'onIything', u'only thing'), (u'onJanuaw', u'on January'), (u'onlyjust', u'only just'), (u'Onyinal', u'Original'), (u'oomprise', u'comprise'), (u'oonstitution', u'constitution'), (u"oouldn't", u"couldn't"), (u"oould've", u"could've"), (u"oousin's", u"cousin's"), (u'opiimistically', u'optimistically'), (u'ora', u'or a'), (u'orfall', u'or fall'), (u'orglory', u'or glory'), (u'orjust', u'or just'), (u'Orjust', u'Or just'), (u'Orthat', u'Or that'), (u'orwould', u'or would'), (u'Orwould', u'Or would'), (u'Othenzvise', u'Otherwise'), (u'our joumey', u'our journey'), (u'ourbrave', u'our brave'), (u'ourfathers', u'our fathers'), (u'ourgirlon', u'our girl on'), (u'Ourgoal', u'Our goal'), (u'Ourguy', u'Our guy'), (u"ourj0b's", u"our job's"), (u"Ourj0b's", u"Our job's"), (u'ourjobs', u'our jobs'), (u"ourjob's", u"our job's"), (u"Ourjob's", u"Our job's"), (u'ourjoumey', u'our journey'), (u'ourphotos', u'our photos'), (u'ourv\\/ay', u'our way'), (u"outlool<'s", u"outlook's"), (u'overme', u'over me'), (u'overthe', u'over the'), (u'overthere', u'over there'), (u'p/ace', u'place'), (u'P/ease', u'Please'), (u'p_m_', u'p.m.'), (u'P\xb0P$', u'Pops'), (u'PANUNG', u'PANTING'), (u'pclnt', u'point'), (u'pclnts', u'points'), (u'pe0pIe', u'people'), (u'Perrut_', u'Perrut.'), (u'Persona/4/', u'Personally'), (u'Persona/y', u'Personally'), (u'persors', u"person's"), (u'PIain', u'Plain'), (u'PIease', u'Please'), (u'PIeasure', u'Pleasure'), (u'PIus', u'Plus'), (u'pleasurlng', u'pleasuring'), (u'POIe', u'Pole'), (u'Polynes/ans', u'Polynesians'), (u'poorshowing', u'poor showing'), (u'popsicle', u'Popsicle'), (u'Presidenfs', u"President's"), (u'probablyjust', u'probably just'), (u'puIIing', u'pulling'), (u'Putyourhand', u'Put your hand'), (u'Qh', u'Oh'), (u'QkaY', u'Okay'), (u'Qpen', u'Open'), (u'QUYS', u'GUYS'), (u'_QW', u'Aw'), (u'r/ght', u'right'), (u'ralnbow', u'rainbow'), (u'ratherjump', u'rather jump'), (u'ratherjust', u'rather just'), (u'Rcque', u'Roque'), (u'rcscucd', u'rescued'), (u'rea/', u'real'), (u'readytolaunchu', u'ready to launch...'), (u'reaHy', u'really'), (u'ReaHy', u'Really'), (u'reallyjust', u'really just'), (u'reallymiss', u'really miss'), (u'reallytalked', u'really talked'), (u'reallythink', u'really think'), (u'reallythinkthis', u'really think this'), (u'rememberthem', u'remember them'), (u'reoalibrated', u'recalibrated'), (u'retum', u'return'), (u'rhfluence', u'influence'), (u'rightdown', u'right down'), (u'roadyou', u'road you'), (u'RUMBUNG', u'RUMBLING'), (u's/uggikh', u'sluggish'), (u'S0', u'So'), (u'S1oW1y', u'Slowly'), (u'saidyou', u'said you'), (u"sayeverything's", u"say everything's"), (u'saynothing', u'say nothing'), (u'saythat', u'say that'), (u'sc', u'so'), (u'scientihc', u'scientific'), (u'SCREAIVHNG', u'SCREAMING'), (u'sCREAlvllNG', u'SCREAMING'), (u'SCREAlvllNG', u'SCREAMING'), (u'scund', u'sound'), (u"S'EOp", u'Stop'), (u'severa/parents', u'several parents'), (u'sfill', u'still'), (u'S\ufb02ence', u'Silence'), (u'shallrise', u'shall rise'), (u'sHATTERING', u'SHATTERING'), (u'shcws', u'shows'), (u'Shdsjust', u"She's just"), (u'She`s', u"She's"), (u'She\u2018II', u"She'll"), (u"she'II", u"she'll"), (u"She'II", u"She'll"), (u"she'Il", u"she'll"), (u'Shejust', u'She just'), (u"she'lI", u"she'll"), (u'Shoofing', u'Shooting'), (u'ShOp', u'shop'), (u'shortyears', u'short years'), (u'shou/dn', u'shouldn\u2019t'), (u'shou\ufb01ng', u'shouting'), (u'Shou\ufb02ng', u'Shouting'), (u'shouldnt', u"shouldn't"), (u'Shouldrt', u"Shouldn't"), (u'shouldrt', u"shouldn't"), (u"Shs's", u"She's"), (u'SHUDDERWG', u'SHUDDERING'), (u'Shutup', u'Shut up'), (u'SIGH$', u'SIGHS'), (u'signifcance', u'significance'), (u'Sincc', u'Since'), (u'sistervvill', u'sister will'), (u'Skarsg\xe9rd', u'Skarsg\xe5rd'), (u'slcsHs', u'SIGHS'), (u'slGHINcs', u'SIGHING'), (u'slGHING', u'SIGHING'), (u'slNGING', u'SINGING'), (u'slzzLING', u'SIZZLING'), (u'smarfest', u'smartest'), (u'Smiih', u'Smith'), (u'so/id', u'solid'), (u'SoBl3lNG', u'SOBBING'), (u'soemtimes', u'sometimes'), (u'Sojust', u'So just'), (u'soldierl', u'soldier!'), (u'somethlng', u'something'), (u"somethlng's", u"something's"), (u"somez'/7/ng", u'something'), (u'somthing', u'something'), (u'sumthing', u'something'), (u'sou/', u'soul'), (u'SoundofMusic', u'Sound of Music'), (u'SP/ash', u'Splash'), (u'SPEAK/NG', u'SPEAKING'), (u'speII', u'spell'), (u"speII's", u"spell's"), (u'Spendourtime', u'Spend our time'), (u'sQUA\\/\\/KING', u'SQUAWKING'), (u'StAnton', u'St Anton'), (u'stealsjeans', u'steals jeans'), (u'StilI', u'Still'), (u'Stilldesperatelyseeking', u'Still desperately seeking'), (u'stlll', u'still'), (u'sToPs', u'STOPS'), (u'storyl', u'story!'), (u'Stubbom', u'Stubborn'), (u'su/faces', u'surfaces'), (u'suffocaiing', u'suffocating'), (u'summerjob', u'summer job'), (u'Summerjust', u'Summer just'), (u'sun/ive', u'survive'), (u'superiorman', u'superior man'), (u'sur\ufb02aces', u'surfaces'), (u't/ying', u'trying'), (u'T0', u'To'), (u'T00', u'Too'), (u'ta/ks', u'talks'), (u'taiked', u'talked'), (u'talkto', u'talk to'), (u'Talkto', u'Talk to'), (u'talktonight', u'talk tonight'), (u'tampax', u'Tampax'), (u'tc', u'to'), (u'tcday', u'today'), (u'tcrturing', u'torturing'), (u'tcuch', u'touch'), (u'te//', u'tell'), (u'tearjust', u'tear just'), (u'tellsjokes', u'tells jokes'), (u'tellyou', u'tell you'), (u'terriers_', u'terriers.'), (u'th/nk', u'think'), (u'THEPASSION', u'THE PASSION'), (u'thafs', u"that's"), (u'Thafs', u"That's"), (u"Thai's", u"That's"), (u"Thal's", u"That's"), (u'thankyou', u'thank you'), (u'Thankyou', u'Thank you'), (u'thatconverts', u'that converts'), (u'thatgoes', u'that goes'), (u"that'II", u"that'll"), (u"That'II", u"That'll"), (u'thatjob', u'that job'), (u'thatjunk', u'that junk'), (u'thatjust', u'that just'), (u'thatleads', u'that leads'), (u"Thatl'm", u"That I'm"), (u"that's just", u"that's just"), (u'Thatsand', u'That sand'), (u"that'sjust", u"that's just"), (u"That'sjust", u"That's just"), (u'Thc', u'The'), (u'theirface', u'their face'), (u'theirfeet', u'their feet'), (u'theirfury', u'their fury'), (u'thejaw', u'the jaw'), (u'thejoint', u'the joint'), (u'thejudge', u'the judge'), (u'thejudges', u'the judges'), (u'Thejudges', u'The judges'), (u'thejury', u'the jury'), (u'Thelook', u'The look'), (u'Therds', u"There's"), (u"There'II", u"There'll"), (u"There'Il", u"There'll"), (u"There'lI", u"There'll"), (u"They'/'e", u"They're"), (u"they/'II", u"they'll"), (u'They/re', u"They're"), (u"They/'re", u"They're"), (u"they'II", u"they'll"), (u"they'Il", u"they'll"), (u'theyjust', u'they just'), (u'Theyjust', u'They just'), (u"they'lI", u"they'll"), (u"They'lI", u"They'll"), (u'theyre', u"they're"), (u'theysay', u'they say'), (u'thinkthat', u'think that'), (u"this'II", u"this'll"), (u'thlngs', u'things'), (u'Thlnkthls', u'Think this'), (u'thls', u'this'), (u"thore's", u"there's"), (u"Thore's", u"There's"), (u'Thorjust', u'Thor just'), (u"thoughtl'dletyou", u"thought I'd let you"), (u'tnatjust', u'that just'), (u"tnat's", u"that's"), (u"Tnat's", u"That's"), (u"Tnere'll", u"There'll"), (u'to//et', u'toilet'), (u'To//S', u'Tolls'), (u"todayl'd", u"today I'd"), (u'togelher', u'together'), (u'togethen', u'together'), (u'tojoin', u'to join'), (u'tojudge', u'to judge'), (u'toldyou', u'told you'), (u'tomorrovv', u'tomorrow'), (u'Tonighfsjust', u"Tonight's just"), (u'totake', u'to take'), (u'totalk', u'to talk'), (u'tothat', u'to that'), (u'tothe', u'to the'), (u'Towef', u'Tower'), (u'Tr/ck/ing', u'Trickling'), (u'Traitur', u'Traitor'), (u'tv\\/o', u'two'), (u'tvvelve', u'twelve'), (u'Tvvelve', u'Twelve'), (u'tvventy', u'tvventy'), (u'Tvventy', u'Tvventy'), (u'tvvo', u'two'), (u'Tvvo', u'Two'), (u'twc', u'two'), (u'unconhrmed', u'unconfirmed'), (u'underthat', u'under that'), (u'underthe', u'under the'), (u'underthese', u'under these'), (u'underyour', u'under your'), (u'unfilyou', u'until you'), (u"Unfon'unate/y", u'Unfortunately'), (u'Uninnabited', u'Uninhabited'), (u'untilApril', u'until April'), (u'untilyou', u'until you'), (u'upthinking', u'up thinking'), (u'upto', u'up to'), (u'V\\/ait___', u'Wait...'), (u'v\\/as', u'was'), (u'V\\/as', u'Was'), (u'V\\/e', u'We'), (u"v\\/eek's", u"week's"), (u'V\\/eird_', u'Weird.'), (u'V\\/ell', u'Well'), (u'V\\/hat', u'what'), (u"V\\/hen'll", u"When'll"), (u'V\\/ho', u'Who'), (u"v\\/ho'll", u"who'll"), (u'v\\/Hoops', u'Whoops'), (u"v\\/ho's", u"who's"), (u"V\\/ho's", u"Who's"), (u'V\\/hy', u'Why'), (u'v\\/ith', u'with'), (u"v\\/on't", u"won't"), (u'V\\fith', u'With'), (u'V\\fithin', u'Within'), (u'valedictolian', u'valedictorian'), (u'vcice', u'voice'), (u've/y', u'very'), (u'veiy', u'very'), (u'V\xe9ry', u'Very'), (u'versioin', u'version'), (u'vi/ay', u'way'), (u'visitjails', u'visit jails'), (u"Viva/di's", u"Vivaldi's"), (u'vlll', u'vill'), (u'Voil\xe1', u'Voil\xe0'), (u'Voil\xe9', u'Voil\xe0'), (u'vvasjust', u'was just'), (u"VVasn't", u"Wasn't"), (u'vvay', u'way'), (u'VVe', u'We'), (u"VVe'II", u"We'll"), (u"VVe'll", u"We'll"), (u'Vvelooked', u'We looked'), (u"VVe're", u"We're"), (u"VVe've", u"We've"), (u'VVhat', u'What'), (u"VVhat's", u"What's"), (u"VVhat'S", u"What's"), (u'VVhen', u'When'), (u"'v'Vhere's", u"Where's"), (u'VVhip', u'Whip'), (u'vvHooPING', u'WHOOPING'), (u'VvHooPING', u'WHOOPING'), (u'VVhy', u'Why'), (u'VVill', u'Will'), (u'VVinters', u'Winters'), (u'vvlND', u'WIND'), (u"w\xa4n't", u"won't"), (u'W9', u'We'), (u'waht', u'want'), (u'waierfall', u'waterfall'), (u'walkjust', u'walk just'), (u'wallplant', u'wall plant'), (u'wannajump', u'wanna jump'), (u'wantyou', u'want you'), (u'Warcontinues', u'War continues'), (u'wasjennifer', u'was Jennifer'), (u'wasjust', u'was just'), (u'wasrt', u"wasn't"), (u'Wasrt', u"Wasn't"), (u'wayl', u'way I'), (u'wayround', u'way round'), (u'wclf', u'wolf'), (u'wcman', u'woman'), (u'wcmen', u'women'), (u"wcn't", u"won't"), (u'wcrse', u'worse'), (u'wculd', u'would'), (u'We//', u'Well'), (u'We/came', u'Welcome'), (u'we/come', u'welcome'), (u'We/come', u'Welcome'), (u'We/I', u'Well'), (u'weekendjust', u'weekend just'), (u'werert', u"weren't"), (u'Werert', u"Weren't"), (u"we'II", u"we'll"), (u"We'II", u"We'll"), (u"we'Il", u"we'll"), (u"We'Il", u"We'll"), (u'wejust', u'we just'), (u"we'lI", u"we'll"), (u"We'rejust", u"We're just"), (u"We'ro", u"We're"), (u"We'Ve", u"We've"), (u'wh/p', u'whip'), (u'Wh\xb0ops', u'Whoops'), (u'Whafs', u"What's"), (u'Whatam', u'What am'), (u'Whatare', u'What are'), (u'Whateverwe', u'Whatever we'), (u"What'II", u"What'll"), (u'Whatis', u'What is'), (u'whatjust', u'what just'), (u'Whatl', u'What I'), (u'whatshe', u'what she'), (u'whatwe', u'what we'), (u"Whc's", u"Who's"), (u'Whcse', u'Whose'), (u'wHlsPERs', u'WHISPERS'), (u'wi//', u'will'), (u'wil/', u'will'), (u'Wil/', u'Will'), (u'wilI', u'will'), (u'willbe', u'will be'), (u'willhire', u'will hire'), (u'willneverknow', u'will never know'), (u'willyou', u'will you'), (u'wlfe', u'wife'), (u"wlfe's", u"wife's"), (u'wlth', u'with'), (u"wnat's", u"what's"), (u'Wno', u'Who'), (u'Wo/f', u'Wolf'), (u'wo\ufb02d', u'world'), (u"WOI'1't", u"won't"), (u'wondernobody', u'wonder nobody'), (u"won'T", u"won't"), (u"won'tanswerme", u"won't answer me"), (u"won'tforget", u"won't forget"), (u"won'tletitbring", u"won't let it bring"), (u"Wo're", u"We're"), (u'worfd', u'world'), (u"won'th", u'worth'), (u"won'thwhile", u'worthwhile'), (u'workyou', u'work you'), (u"wouIdn't", u"wouldn't"), (u"wouldn'!", u"wouldn't"), (u'Wouldrt', u"Wouldn't"), (u"wr/'2'/ng", u'writing'), (u'writign', u'writing'), (u'wrcng', u'wrong'), (u'wuuld', u'would'), (u'_Yay', u'Yay'), (u"Y\xa4u'II", u"You'll"), (u"Y\xa4u'll", u"You'll"), (u"y\xa4u're", u"you're"), (u"Y\xa4u're", u"You're"), (u"y\xa4u've", u"you've"), (u'Y0', u'Yo'), (u'y0LI', u'you'), (u"y0u'II", u"you'll"), (u"Y0u'rc", u"You're"), (u"Y0u're", u"You're"), (u"Y0u've", u"You've"), (u'yaming', u'yarning'), (u'yaurparents', u'your parents'), (u'ycu', u'you'), (u"ycu'd", u"you'd"), (u'ycur', u'your'), (u"Ycu're", u"You're"), (u'Ycursins', u'Your sins'), (u'YEI_I_', u'YELL'), (u'YELL$', u'YELLS'), (u'yigg/mg', u'giggling'), (u'Yigg/mg', u'giggling'), (u'yoLI', u'you'), (u'yOu', u'you'), (u'yOU', u'you'), (u'you`re', u"you're"), (u"you'II", u"you'll"), (u"You'II", u"You'll"), (u"You'Il", u"You'll"), (u'youjack', u'you jack'), (u'youjoin', u'you join'), (u'Youjoin', u'You join'), (u'youjust', u'you just'), (u"You'lI", u"You'll"), (u'youngsterlike', u'youngster like'), (u'youpick', u'you pick'), (u"you'ra", u"you're"), (u'Yourattention', u'Your attention'), (u'yourautomobile', u'your automobile'), (u"You'rejustjealous", u"You're just jealous"), (u'yourextra', u'your extra'), (u'yourfather', u'your father'), (u'yourhand', u'your hand'), (u'yourhusband', u'your husband'), (u'yourjewelry', u'your jewelry'), (u'yourjob', u'your job'), (u'Yourjob', u'Your job'), (u'yourjob_', u'your job.'), (u'yourjockey', u'your jockey'), (u'yourjury', u'your jury'), (u'yourname', u'your name'), (u'Yourpackage', u'Your package'), (u'yourpackage', u'your package'), (u"you'ro", u"you're"), (u'yourpoorleg', u'your poor leg'), (u'yourvveak', u'your weak'), (u"you'va", u"you've"), (u"You'va", u"You've"), (u'youWlneversee', u"you'll never see"), (u'yQu', u'you'), (u'YQu', u'You'), (u"yQu'_7", u'you?'), (u'yummY', u'yummy'), (u'yuu', u'you'), (u'Yuu', u'You'), (u"Yuu've", u"You've"), (u"z'housand", u'thousand'), (u'zlPPING', u'ZIPPING'), (u'Ifslocked', u"It's locked"), (u'nightjust', u'night just'), (u'dayjourney', u'day journey'), (u'Ourjob', u'Our job'), (u'IunCh', u'lunch'), (u'nieCe', u'niece'), (u'giVes', u'gives'), (u'wantto', u'want to'), (u'besttoday', u'best today'), (u'NiCe', u'Nice'), (u'oftravelling', u'of travelling'), (u'oftwo', u'of two'), (u'ALl', u'ALI'), (u'afterparty', u'after-party'), (u'welL', u'well.'), (u'theirjob', u'their job'), (u"lfhe's", u"If he's"), (u'babyjesus', u'baby Jesus'), (u'shithousejohn', u'shithouse John'), (u'jesus', u'Jesus'), (u'withjesus', u'with Jesus'), (u'Gojoin', u'Go join'), (u'Adaughter', u'A daughter'), (u'talkwith', u'talk with'), (u'anyjournals', u'any journals'), (u"L'mjewish", u"I'm Jewish"), (u'arejust', u'are just'), (u'soundjust', u'sound just'), (u"ifl'm", u"if I'm"), (u'askyou', u'ask you'), (u'ordinarywoman', u'ordinary woman'), (u'andjunkies', u'and junkies'), (u'isjack', u'is Jack'), (u'helpyou', u'help you'), (u'thinkyou', u'think you'), (u'Lordjesus', u'Lord Jesus'), (u'injuvy', u'in juvy'), (u'thejets', u'the jets'), (u'ifGod', u'if God'), (u'againstjewish', u'against Jewish'), (u'ajunkie', u'a junkie'), (u'dearjesus', u'dear Jesus'), (u'hearyour', u'hear your'), (u'takeyears', u'take years'), (u'friendjean', u'friend Jean'), (u'Fatherjohn', u'Father John'), (u'youjean', u'you Jean'), (u'hearyou', u'hear you'), (u'Ifshe', u'If she'), (u"didn'tjust", u"didn't just"), (u'IfGod', u'If God'), (u'notjudge', u'not judge'), (u'andjudge', u'and judge'), (u'OKBY', u'Okay'), (u'myjourney', u'my journey'), (u'yourpremium', u'your premium'), (u"we'rejust", u"we're just"), (u'Iittlejokes', u'little jokes'), (u'Iifejust', u'life just'), (u'Andjust', u'And just'), (u'ofThe', u'of The'), (u'lifejust', u'life just'), (u'AIice', u'Alice'), (u'lnternationalAirport', u'International Airport'), (u'yourbody', u'your body'), (u'DollarBaby', u'Dollar Baby'), (u'ofjonesing', u'of jonesing'), (u'yourpanties', u'your panties'), (u'offforme', u'off for me'), (u'pantyparty', u'panty party'), (u'everhit', u'ever hit'), (u'theirhomes', u'their homes'), (u'AirForce', u'Air Force'), (u'yourhead', u'your head'), (u'betterbe', u'better be'), (u'myparty', u'my party'), (u'disasterlockdown', u'disaster lockdown'), (u"Ifpot's", u"If pot's"), (u'ifmy', u'if my'), (u'yourmoney', u'your money'), (u'Potterfan', u'Potter fan'), (u'Hermionejust', u'Hermione just'), (u'ofourshit', u'of our shit'), (u'showyou', u'show you'), (u'answernow', u'answer now'), (u'theirsjust', u'theirs just'), (u'BIackie', u'Blackie'), (u'SIeep', u'Sleep'), (u'foryour', u'for your'), (u'oryour', u'or your'), (u'forArthur', u'for Arthur'), (u'CIamp', u'Clamp'), (u'CIass', u'Class'), (u'CIose', u'Close'), (u'GIove', u'Glove'), (u'EIIen', u'Ellen'), (u'PIay', u'Play'), (u'PIace', u'Place'), (u'EIgyn', u'Elgyn'), (u'AIert', u'Alert'), (u'CIaus', u'Claus'), (u'CIimb', u'Climb'), (u"military'II", u"military'll"), (u'anylonget', u'any longer'), (u'yourlife', u'your life'), (u"Yourbitch'IIgetyou", u"Your bitch'll get you"), (u'yourdick', u'your dick'), (u'Tellyourbitch', u'Tell your bitch'), (u'rememberyou', u'remember you'), (u'newface', u'new face'), (u'Butyou', u'But you'), (u"don'tyou", u"don't you"), (u'yourlives', u'your lives'), (u'Iovedher', u'loved her'), (u'reallydid', u'really did'), (u'firstperson', u'first person'), (u'mybest', u'my best'), (u'Justgive', u'Just give'), (u'AIong', u'Along'), (u'atyourbody', u'at your body'), (u'myhands', u'my hands'), (u'sayhe', u'say he'), (u'mybooty', u'my booty'), (u'yourbooty', u'your booty'), (u'yourgirl', u'your girl'), (u'yourlegs', u'your legs'), (u'betterifthey', u'better if they'), (u'manybeautiful', u'many beautiful'), (u'contactpolice', u'contact police'), (u'numberbelow', u'number below'), (u'biggestproblem', u'biggest problem'), (u'Itgave', u'It gave'), (u'everybodykind', u'everybody kind'), (u'theyhad', u'they had'), (u'knowherlast', u'know her last'), (u'herhearing', u'her hearing'), (u'othermembers', u'other members'), (u'BIing', u'Bling'), (u'CIyde', u'Clyde'), (u'foundguilty', u'found guilty'), (u'fouryears', u'four years'), (u'countyjail', u'county jail'), (u'yearin', u'year in'), (u'theirrole', u'their role'), (u'manybottles', u'many bottles'), (u"can'tpronounce", u"can't pronounce"), (u'manybowls', u'many bowls'), (u'ofthatgreen', u'of that green'), (u'manyjoyrides', u'many joyrides'), (u'Superrich', u'Super rich'), (u'Iprefer', u'I prefer'), (u'Theymust', u'They must'), (u'whatyou', u'what you'), (u"I'IIjump", u"I'll jump"), (u'nobodyknow', u'nobody know'), (u'neverknew', u'never knew'), (u'EIectronica', u'Electronica'), (u'AIarm', u'Alarm'), (u'getyourman', u'get your man'), (u'sayyou', u'say you'), (u'getyour', u'get your'), (u'Fuckyou', u'Fuck you'), (u'Whyyou', u'Why you'), (u'butyoujust', u'but you just'), (u'forgetyourname', u'forget your name'), (u'Whatyou', u'What you'), (u"Co/'ncidenta//y", u'Coincidentally'), (u'GIad', u'Glad'), (u'RachelMarron', u'Rachel Marron'), (u"She'llgive", u"She'll give"), (u'presidentialsuite', u'presidential suite'), (u'andgentlemen', u'and gentlemen'), (u'willnot', u'will not'), (u'ourproducers', u'our producers'), (u"Ifshe's", u"If she's"), (u'CIock', u'Clock'), (u'Ishould', u'I should'), (u"I'llgo", u"I'll go"), (u'maypass', u'may pass'), (u'andprotecting', u'and protecting'), (u'BIessed', u'Blessed'), (u'CIean', u'Clean'), (u'SIave', u'Slave'), (u'AIi', u'Ali'), (u'AIIah', u'Allah'), (u'AIIahu', u'Allahu'), (u'CIick', u'Click'), (u'BIast', u'Blast'), (u'AIlah', u'Allah'), (u'SIow', u'Slow'), (u'theirpolicies', u'their policies'), (u'Orperhaps', u'Or perhaps'), (u'ofsex', u'of sex'), (u'forpleasure', u'for pleasure'), (u'ourpower', u'our power'), (u'Yourpiece', u'Your piece'), (u'Offioers', u'Officers'), (u'oondesoended', u'condescended'), (u'myseif', u'myself'), (u"let'sjust", u'let\u2019s just'), (u'yourway', u'your way'), (u'An9TY', u'Angry'), (u'ourjourney', u'our journey'), (u'LuCY', u'Lucy'), (u"\\'m", u'I\u2019m'), (u'CEDR/C', u'CEDRIC'), (u'lsaac', u'Isaac'), (u'FIy', u'Fly'), (u'Ionger', u'longer'), (u'Iousy', u'lousy'), (u'Iosing', u'losing'), (u"They'II", u"They'll"), (u'yourpaws', u'your paws'), (u'littie', u'little'), (u"It'lljust", u"It'll just"), (u'AIso', u'Also'), (u'Iisten', u'listen'), (u'suPPosed', u'supposed'), (u'somePIace', u'someplace'), (u'exPIain', u'explain'), (u'Iittle', u'little'), (u'StoP', u'Stop'), (u'AIways', u'Always'), (u'Iectures', u'lectures'), (u'Iow', u'low'), (u'Ieaving', u'leaving'), (u'Ietting', u'letting'), (u'Iistening', u'listening'), (u'Iecture', u'lecture'), (u'Iicking', u'licking'), (u'Iosses', u'losses'), (u'PIeased', u'Pleased'), (u'ofburglaries', u'of burglaries'), (u"He'sjust", u"He's just"), (u'mytrucktoo', u'my truck too'), (u'nowwhat', u'now what'), (u'yourfire', u'your fire'), (u"herwhat's", u"her what's"), (u'hearthat', u'hear that'), (u'oryou', u'or you'), (u'preferjournalist', u'prefer journalist'), (u'CIaw', u'Claw'), (u'Ifour', u'If our'), (u'lron', u'Iron'), (u"It'syour", u"It's your"), (u'lfstill', u'If still'), (u'forjoining', u'for joining'), (u'foryears', u'for years'), (u'Ifit', u'If it'), (u'notjump', u'not jump'), (u'ourproblem', u'our problem'), (u'yourprofile', u'your profile'), (u'ifJanine', u'if Janine'), (u'forpreventative', u'for preventative'), (u'whetherprotest', u'whether protest'), (u'Ifnot', u'If not'), (u'ourpeople', u'our people'), (u'offmy', u'off my'), (u'forproviding', u'for providing'), (u'hadjust', u'had just'), (u'nearyou', u'near you'), (u'whateveryou', u'whatever you'), (u'hourputs', u'hour puts'), (u'timejob', u'time job'), (u'overyour', u'over your'), (u'orpermanent', u'or permanent'), (u'createjobs', u'create jobs'), (u"I'vejust", u"I've just"), (u'peoplejobs', u'people jobs'), (u'dinnerpail', u'dinner pail'), (u'hasjumped', u'has jumped'), (u'theirprivacy', u'their privacy'), (u'AIl', u'All'), (u'ofserious', u'of serious'), (u'yourprofessional', u'your professional'), (u'poiitical', u'political'), (u'tojump', u'to jump'), (u'iives', u'lives'), (u'eiections', u'elections'), (u'militaryjuntas', u'military juntas'), (u'nojoke', u'no joke'), (u'yourpresidency', u'your presidency'), (u'ofmilitaryjuntas', u'of military juntas'), (u'Ourproposal', u'Our proposal'), (u'LeBIanc', u'LeBlanc'), (u'KIaus', u'Klaus'), (u'yourpussy', u'your pussy'), (u'lNTERVIEWER', u'INTERVIEWER'), (u'lNAUDIBLE', u'INAUDIBLE'), (u'SImpsons', u'Simpsons'), (u'anotherjob', u'another job'), (u'lfthere', u'If there'), (u'descentinto', u'descent into'), (u'ofthathere', u'of that here'), (u'ofway', u'of way'), (u'yourseat', u'your seat'), (u'allyou', u'all you'), (u'Allyou', u'All you'), (u'yourass', u'your ass'), (u'Yourbutt', u'Your butt'), (u'iustiiggle', u'just jiggle'), (u'iust', u'just'), (u'CSi', u'CSI'), (u'affernoon', u'afternoon'), (u'orpersecution', u'or persecution'), (u'theirpetty', u'their petty'), (u'Fourpercent', u'Four percent'), (u'fourpercent', u'four percent'), (u'willjust', u'will just'), (u"Ifyou're", u"If you're"), (u'ourplanet', u'our planet'), (u'lsolation', u'Isolation'), (u'yourprimitive', u'your primitive'), (u'yourplanet', u'your planet'), (u'matteryour', u'matter your'), (u'Yourplace', u'Your place'), (u'andjustice', u'and justice'), (u'anotherpart', u'another part'), (u'confiict', u'conflict'), (u'growingjeopardy', u'growing jeopardy'), (u'hasjust', u'has just'), (u'havejust', u'have just'), (u'herselfinto', u'herself into'), (u'ifnecessary', u'if necessary'), (u"we'vejust", u"we've just"), (u'tojust', u'to just'), (u'yourjudgment', u'your judgment'), (u'yourjeans', u'your jeans'), (u'Youjust', u'You just'), (u'ajanitor', u'a janitor'), (u'FIattery', u'Flattery'), (u'myjournal', u'my journal'), (u'myjudgment', u'my judgment'), (u'offofmy', u'off of my'), (u'offyour', u'off your'), (u'ofgood', u'of good'), (u'ofguilty', u'of guilty'), (u'ofhaving', u'of having'), (u'ofheart', u'of heart'), (u'ofhonor', u'of honor'), (u'oflove', u'of love'), (u'ofmankind', u'of mankind'), (u'ofmany', u'of many'), (u'ofnormal', u'of normal'), (u'ofpeople', u'of people'), (u'ofpower', u'of power'), (u'ofsuch', u'of such'), (u'peoplejust', u'people just'), (u"They'rejust", u"They're just"), (u'tojeopardize', u'to jeopardize'), (u'Yourplaces', u'Your places'), (u'yourposition', u'your position'), (u'yourselfa', u'yourself a'), (u'yourselfright', u'yourself right'), (u'thejob', u'the job'), (u'thejanitors', u'the janitors'), (u'alljust', u'all just'), (u"forAmerica's", u"for America's"), (u'Forpencils', u'For pencils'), (u'forpondering', u'for pondering'), (u'handwrittenjournals', u'handwritten journals'), (u'herpursuit', u'her pursuit'), (u'ofjust', u'of just'), (u'oflanding', u'of landing'), (u'oflife', u'of life'), (u'outjust', u'out just'), (u'Thejoke', u'The joke'), (u'ourpatient', u'our patient'), (u"oryou're", u"or you're"), (u'ofyourself', u'of yourself'), (u'poweryour', u'power your'), (u'Ofmy', u'Of my'), (u'EIlen', u'Ellen'), (u"Don'tget", u"Don't get"), (u'tellme', u'tell me'), (u'ofdecision', u'of decision'), (u'itgoing', u'it going'), (u'artificialgravity', u'artificial gravity'), (u'shouldknow', u'should know'), (u"Hasn'tgot", u"Hasn't got"), (u'thirdjunction', u'third junction'), (u'somebodypicks', u'somebody picks'), (u'Willyou', u'Will you'), (u"can'tget", u"can't get"), (u'BuZZes', u'Buzzes'), (u"wouldn'tyou", u"wouldn't you"), (u'Wellbelow', u'Well below'), (u"What'dyou", u"What'd you"), (u'decipheredpart', u'deciphered part'), (u"they'llknow", u"they'll know"), (u"ifit's", u"if it's"), (u'ornot', u'or not'), (u'myposition', u'my position'), (u'lndistinct', u'Indistinct'), (u'anybiscuits', u'any biscuits'), (u'Andifyou', u'And if you'), (u'lfwe', u'If we'), (u'yourarm', u'your arm'), (u'lnteresting', u'Interesting'), (u'findit', u'find it'), (u"it'llstart", u"it'll start"), (u'holdit', u'hold it'), (u'ofkilling', u'of killing'), (u'Howyou', u'How you'), (u'lnhales', u'Inhales'), (u'lgot', u'I got'), (u'CIip', u'Clip'), (u"what'II", u"what'll"), (u"road'II", u"road'll"), (u'girI', u'girl'), (u'LIoyd', u'Lloyd'), (u'BIake', u'Blake'), (u'reaI', u'real'), (u'Foryour', u'For your'), (u'yourpublic', u'your public'), (u'LAst', u'Last'), (u'h is', u'his'), (u'He)\u2019', u'Hey'), (u'Ls', u'Is'), (u"al'", u'at'), (u"wail'", u'wait'), (u"III'll", u"I'll"), (u'forthis', u'for this'), (u'Yea h', u'Yeah'), (u'a re', u'are'), (u'He)"', u'Hey'), (u"pan'", u'part'), (u'yea h', u'yeah'), (u'Tun', u'Run'), (u"He)'", u'Hey'), (u"he)'", u'hey'), (u"I'11", u"I'll"), (u'he)"', u'hey'), (u" 're ", u"'re ")]), - 'pattern': u'(?um)(\\b|^)(?:\\$COff\\$|\\$ergei|\\$\\\'llOp|\\/\\\'\\/\\/|\\/\\\'\\/I|\\/ennifer|\\/got|\\/have|\\/hope|\\/just|\\/love|\\/\\\'m|\\/mmerse|\\/nsu\\/ts|\\/ong|\\/ook|\\/t\\\'s|\\/\\\'ve|\\\\\\/\\\\\\/e\\\'d|\\\\\\/\\\\\\/e\\\'re|\\\\\\/\\\\\\/e\\\'ve|\\\\\\/\\\\\\/hat|\\\\\\/\\\\\\/here\\\'d|\\\\\\/\\\\\\/hoo|\\\\\\/\\\\\\/hy|\\\\\\/\\\\\\/hy\\\'d|\\\\\\/\\\\le\\\'re|\\\\\\/Ve|\\\\Ne\\\'re|\\\\Nhat\\\'s|\\\\Nhere\\\'s|\\|\\\'mjust|\\\xa4ff|\\\xa4Id|\\\xa4Ids|\\\xa4n|\\\xa4ne|\\\xa4nly|\\\xa4pen|\\\xa4r|\\\xa4rder|\\\xa4ther|\\\xa4ur|\\\xa4ut|\\\xa4ver|\\\xa4wn|\\\u20acV\\\u20acI\\\'y|0\\\'clock|0f|0fEngland|0fft0|0l\\/er|0n|0ne|0ne\\\'s|0r|0rders|0thers\\\'|0ut|0utlaw\\\'s|0utlaws\\\'|0ver|13oos|18oos|195os|1et\\\'s|1o|1oo|1ooth|1oth|2E\\_|2\\\'IST|2\\\'Ist\\_|2o|2oth|3o|3oth|4o|4os|4oth|50rry|5o|5oth|6o|6os|\\\'6os|6oth|7o|\\\'7os|7oth|8o|\\\'8os|8oth|9\\/aim|9o|9oth|9UnShQt|a\\/\\/|a\\/bum|a\\/so|A\\/ways|abcut|aboutjoining|aboutposh|aboutus|aboutyou|accldent|Acool|afier|affraid|Afriend|afterall|afterthe|afulcrum|Afunny|aga\\/nst|ahsolutes|AI\\_I\\_|AIien|AIex|AII|AIIan|AIIow|AIive|ain\\\'tgotno|Ain\\\'tgotno|airstrike|AIVIBULANCE|ajob|ajockey\\_|ajoke|Ajoke|ajoking|al\\/|al\\/en|alittle|allgasp|alljustforshow|aln\\\'t|alot|Alot|An5wer|Andit|Andit\\\'s|andl|andlaughs|andleave|andthe|andyou|Andyou|ANNOUNC\\/NG|anotherstep|ANSWER\\/NG|answerwhat|antiquejoke|anyhcdy\\\'s|Anyidea|anyone\\\'s\\_|apejust|ARABlc|aren\\\'t\\_|arerl\\\'t|Arnsteln\\\'s|atleast|Atough|Awhole|awoman|Awoman|barelytalked|bcat|Bcllvla|bcmb|bcmbs|be\\/\\/y|becuase|Beep\\/\\\'ng|bejumpy|besldes|bestfriend|bestguy|bestjob|BIack|BIess|bigos\\_\\_\\_|BIame|BIind|BIood|BIue|BLOVVS|blowholel|blt|Bo99|bodiedyoung|breakf\\\xe9wtl|bulldozlng|butjust|butl|Butl|butljust|Butljustcan\\\'tgetenough|Butyou\\\'re|buythem|buyyou|byjust|bythe|C\\/latter\\/\\\'\\/7g|ca\\/\\/\\/ng|ca\\/I|call\\/ng|callyou|can\\*t|can\\\'i|can\\\'I|canlgetyou|cannotchange|cannut|can\\\'T|can\\\'t\\_|can\\\'tjust|can\\\'tletgo|Car0l|Carhorn|carrled|Ccug|Ccugs|Ccver|cellularchange|cff|cfycu|cfycur|Ch\\/rping|chaletgirl|changejobs|Charliejust|Chatter\\/\\\'rtg|CHATTERWG|Chequeredlove|cHIRPINcs|chjldishness|chlldrcn|chlldren|chocolatte|Cho\\/r|cHucKl\\_Es|CIark|CIear|circumcised\\_|ckay|cl\\_osEs|CLATTERWG|cn|cne|cnes|Coincidenta\\/\\/y|COm\\\u20ac|comp\\/etey|complainingabout|coms|cond\\/lion|confdence|conhrmed|connrm|Consecutivelyl|COUGH5|CouGHING|couIdn\\\'t|couldjust|couldn\\\'T|couldn\\\'tjust|Couldyou|crappyjob|CRAsHING|crder|Crowdcheers|Cruoially|cther|cuuld|cver|d\\/\\\'dn\\\'t|d\\/squietude|D\\\xa4esn\\\'t|d\\\xa4n\\\'i|d\\\xa4n\\\'t|d\\\xb09|d0|D0|D0asn\\\'t|Dad\\\'\\/\\/|dairyjust|Dar\\/\\/ng|dc|Dcbby|dccsn\\\'t|dcctcr|Dces|dcgs|dcing|dcn\\\'I|dcn\\\'t|Dcn\\\'t|dcughnut|declslons|deedhas|Dehnitely|desewes|desperate\\/\\\xbby|D\\\ufb02nk|DIAl\\_lNcs|didn\\\'\\!|didnt|didn\\\'T|dIdn\\\'t|didn\\\'t\\_|didrft|didrl\\\'t|didyou|divorcing\\_|dld|dldn\\\'t|dlfflcull|dlg|dlsobeyed|doasn\\\'t|Doasn\\\'t|doctoh|Doctor\\_\\_\\_tell|doesnt|doesn\\\'T|doesri\\\'t|doesrt|Doesrt|doit|dojust|don\\*t|donejobs|don\\\'i|don\\\'l|Don\\\'l|Donllook|dont|don\\\'T|don\\\'tcare|don\\\'tjoke|Don\\\'tjudge|don\\\'tjust|Don\\\'tjust|Don\\\'tlet|don\\\'tlhink|don\\\'tpush|Don\\\'tyou|DonWlook|Dooropens|doorshuts|dothat|dothis|Drinkthis|dumbass|dumbto|dun\\\'t|E\\/\\/e|E9YPt|ea\\/\\\'t\\/7|eart\\/7|efi\\\'\\/\\\'c\\/\\\'ent|EN\\<3LlsH|Enjoythe|Erv\\\\\\/an|Erv\\\\\\/an\\\'s|etemity|ev\\/I|eve\\/yone|even\\/body\\\'s|eversay|Everymonth|everythings|Everythirlg\\\'s|Everythlng\\\'s|Everytime|Exac\\\ufb02y|ExacUy\\_|excitedshrieking|ExcLAllvls|exploatation|expreusion|fairthat|Fathef|fatherfigure|FBl|fcrebcdlng|fcreverjudges|fcund|feeleverything|feelsweet|fiam\\/\\\'\\/y|\\\ufb01ngernail|finishedjunior|FIynn|flll|flra|Flylng|Fnends|fo\\/low|fonzvard|fora|Fora|forajob|forAmerica|forNew|forone|forso|Forsuch|forsunburns|forthe|Foryears|foryou|Foudeen|Fou\\\ufb02een|FourSeasons|fr\\/ends|freezerfood|F\\\xfchrerfeels|furthernotice|furyou|G0|g0in9|gamlenias|GAsPING|gc|gcing|gcnna|Gcnna|gct|Gct|genercsity|generosityn|getjust|g\\\ufb02ing|gi\\\ufb02friend|gir\\/|gir\\/s\\\'boarding|giris|gLlyS|glum\\_|gnyone|golng|goodboyand|goodjob|gOt|gotjumped|gotmyfirstinterview|grandjury|greatjob|Greatjobl|grinco|GRoANING|GRUNUNG|gu|gunna|guyjumped|guyjust|gUyS|\\_H6Y\\-|H\\\u20acY|H0we\\\xb7ver|halftheir|hapPY|hasrt|Hasrt|haven\\\'tspokerl|hcle|hcme|hcmes|hcpe|hctel|hcurs|Hcw|he\\/ps|hearjokestonight|hearme|Hefell|he\\\'II|He\\\'II|HeII0|He\\\'Il|Hejust|He\\\'lI|HelIo|hellc|HellO|herboyfr\\/end|herflesh|herfollov\\\\\\/ed|herjob\\_|HerrSchmidt|herwith|HeY\\\xb7|HeyJennifer|hiddsn|hisjunk|Hitlershare|Hlneed|Hnally|Hnishing|HOId|hOIes|HONMNG|honorthe|honoryou|honoryour|Hov\\\\\\/\\\'s|Hov\\\\\\/\\\'S|HovvLING|howit|HoW\\\'s|howto|Hs\\\'s|hurtyou|I\\/erilj\\/|I\\/fe|I\\\\\\/I|I\\\\\\/Ian|I\\\\\\/Iathies|I\\\\\\/Ie|I\\\\\\/Iommy|I\\\\\\/Ir|I\\\\\\/Ir\\.|I\\\\\\/ly|I3EEPING|I3LARING|Iacings|Iaid|Iam|Iand|Ianding|Iast|Iate|Icad|Icading|Ican|Iccked|Icng|Icsing|Icslng|Idid|Ididn\\\'t|Ido|Idon\\\'i|Idon\\\'t|Idon\\\'tthink|I\\\'E\\\'\\$|Ieamed|Ieapt|Iearned|Ieast|Ieave|Ied|Ieft|Ieg\\\'s|Iess|Iet|Iet\\\'s|Iet\\\'sjust|if\\/just|Ifear|Ifeared|Ifeel|ifI\\\'\\|\\||ifI\\\'d|ifI\\\'II|ifI\\\'ll|ifI\\\'m|Ifinally|ifI\\\'ve|ifl|Iforgot|Ifound|ifshe|ifthat\\\'s|ifthe|Ifthe|ifthere\\\'s|Ifthey|ifwe|Ifwe|Ifycu|ifyou|Ifyou|ifyuu|Iget|Igot|Igotta|Igotyou|Iguess|Iguessljust|Ihad|Ihat\\\'s|Ihave|Iheard|ihere\\\'s|ihey\\\'ve|Ihope|ii\\/Iary|ii\\/Ir|ii\\/Ir\\.|ii\\/love|Iife|I\\\'II|Iike|I\\\'Il|Iine|iirst|ii\\\'s|Ii\\\'s|Iiterallyjumped|Ijoined|Ijust|Iknew|Iknow|Ile|Ileft|I\\\'lldo|I\\\'llmake|Ilons|Ilove|I\\\'mjust|Inconceivablel|infact|Infact|in\\\ufb02uence|infront|injust|insc\\\ufb01p\\\ufb01ons|insolencel|intc|internationaljudges|inthe|Iockdown|Iong|Iongships|Iook|Iookjust|Iooklng|Iooks|Ioose|Iord\\\'s|Iose|Ioser|Ioss|Iost|Iot|Iot\\\'s|Iousyjob|Iove|Ioves|Iowlife|Ipaid|Iquit|Ireallythinkthis|I\\\'rn|Isaw|Isayt\\/1e|isjust|isn\\\'i|isn\\\'t\\_|Isthis|Istill|Istumblod|Itake|itdown|Iteach|Itfeels|ithave|Ithink|Ithinkthat|Ithinkthis|Ithinkyou\\\'re|Ithlnk|Ithoguht|Ithought|Ithoughtl|it\\\'II|It\\\'II|it\\\'Il|It\\\'Il|itin|itjust|Itjust|it\\\'lI|It\\\'lI|It\\\'llhappen|it\\\'lljust|Itold|Itook|itout|it\\\'S|it\\\'sjinxed|it\\\'sjust|It\\\'sjust|itso|Ittends|Itwasn\\\'t|Iuckier|IV\\|oney|IV\\|oney\\\'s|I\\\'va|I\\\'Ve|IVIan|IVIAN|IVIarch|IVIarci\\\'s|IVIarko|IVIe|IVIine\\\'s|IVImm|IVIoney|IVIr\\.|IVIrs|IVIuch|IVIust|IVIy|IVlacArthur|IVlacArthur\\\'s|IVlcBride|IVlore|IVlotherfucker\\_|IVlr|IVlr\\.|IVlr\\_|IVlust|IVly|Iwake|Iwant|Iwanted|Iwas|Iwasjust|Iwasjustu|Iwill|Iwish|Iwon\\\'t|Iworked|Iwould|jalapeno|Jaokson|Jascn|jcke|jennifer|joseph|Jumpthem|jusi|jusl|justjudge|justleave|Justletgo|kidsjumped|kiokflip|knowjust|knowthat|knowthis|knowwhat|knowyet|knowyourlove|korean|L\\/ght|L\\/kes|L\\\\\\/Ianuela|L\\\\\\/Ianuelal|l\\\\\\/Iauzard|l\\\\\\/I\\\xe9lanie|L\\\\\\/I\\\xe9lanie|l\\\\\\/Iom|l\\\\\\/Iommy|l\\\\\\/Ir|l\\\\\\/Ir\\.|l\\\\\\/Is|l\\\\\\/ly|l\\_AuGHING|l\\\u2018m|Laml6|Lcad|lcan|lcan\\\'t|lcarl\\\'t\\_|Lcve|l\\\'d|L\\\'d|ldid|Ldid|ldiot|L\\\'djump|ldon\\\'t|Ldon\\\'t|Lefs|Let\\\'sjust|lf|Lf|lfeelonelung|lfthey|lfyou|Lfyou|lfyou\\\'re|lget|lgive|Li\\/0\\/Academy|li\\/lr\\.|ligature\\_\\_\\_|l\\\'II|l\\\'Il|ljust|Ljust|ll\\/Iommy\\\'s|ll\\/lajor|Ll\\/lajor|ll\\/layans|l\\\'lI|l\\\'ll|L\\\'ll|l\\\'lljust|L\\\'lltake|llte|l\\\'m|L\\\'m|Lmean|l\\\'mjust|ln|lN|lNAuDll3LE|LNAuDll3LE|LNDlsTINcT|lneed|lostyou|Loudmusic|lraq|lRA\\\'s|Lrenka|Lrn|lRS|lsabella|lsn\\\'t|Lsn\\\'t|Lst\\\'s|lsuppose|lt|ltake|ltell|lthink|Lthink|lthink\\_\\_\\_|lt\\\'II|lt\\\'Il|ltjammed\\_|lt\\\'ll|ltold|lt\\\'s|lT\\\'S|Lt\\\'S|Lt\\\'sjust|lv\\\\\\/asn\\\'t|l\\\'ve|L\\\'ve|lVIan|lVIcHenry|lVIr\\.|lVlacArthur|LVlore|lVlr|lVlr\\.|lvluslc|lVlust|LVly|lwaited|lwamoto|lwant|lwanted|lwas|lwill|lwon\\\'t|lworked|lwould|lwould\\\'ve|lx\\/Iorning|M\\/dd\\/e|m\\/g\\/7ty|MACH\\/NE|MacKenz\\/e|majorjackpot|majormuscle|Manuela\\_|maste\\/y|Masturhate|Mattei\\_|mayjust|mbecause|McCa\\/Iister|McCallisler|Mccallister|Mccallisters|mcm\\\'s|mcney|mcral|mcre|mcve|mejust|Mexioo|mi\\/\\/\\<|misfartune|Ml6|Mlnd|Mock\\/\\\'ngbl\\\'rd|mOI\\\'\\\u20ac|Mom\\_|monkeyback|move\\_\\_\\_l|moveto|mustknock|Myheart|myjch|myjet|myjob|Myjob|myjob\\\'s|mylife|Mynew|myown|mypants|myselli|Myshoes|mysong|mytemper|mythumb|Myworld|N0|narne|Natians|naTve|nc|Nc|ncne|Ncrth|ncw|Ncw|needyou|neighboun|neverfound|neverthere|neverv\\\\\\/ill\\_|NewJersey|newjob|newjobs|nextdoor|Nighw|nilios|Nlagnificence|Nlakes|Nlalina|Nlan|Nlarch|Nlarine|Nlarion|Nlarry|Nlars|Nlarty|Nle|Nleet|Nlen|Nlom|Nlore|Nlornin|Nlother|Nlr|Nlr\\.|Nlrs|Nluch|nojurisdiction|noone|Noone|not\\ judging|notgoing|notjunk|Notjunk|notjust|notsure|novv|Nowjust|Nowthat\\\'s|Numbertwo|oan\\\'t|oan\\\'tjust|objecl|occultpowerand|Ocps|ofa|ofajudge|ofall|Ofall|ofBedford|ofcourse|Ofcourse|ofeach|ofeither|Offioer\\\'s|ofFrance|offreedom|offthe|offthis|offto|offun|ofguy|Ofhce|ofhis|ofHis|ofhoneybees|ofit|ofjam|OFJOAN|ofjoy|ofjunior|ofme|ofmead|ofmicroinjections|ofmy|ofNew|ofNorris\\\'|ofopinions|ofour|ofpeopla|ofthat|ofthe|Ofthe|oftheir|ofthem|ofthem\\\'s|ofthemselves|ofthere|ofthese|ofthings|ofthis|ofthlngs|ofthose|ofuse|ofwashington|ofyou|ofyour|OId|OIsson|Ok3Y|okaY|OkaY|OKaY|OKGY|Ol\\<|oldAdolfon|onboard|onIy|onIything|onJanuaw|onlyjust|Onyinal|oomprise|oonstitution|oouldn\\\'t|oould\\\'ve|oousin\\\'s|opiimistically|ora|orfall|orglory|orjust|Orjust|Orthat|orwould|Orwould|Othenzvise|our\\ joumey|ourbrave|ourfathers|ourgirlon|Ourgoal|Ourguy|ourj0b\\\'s|Ourj0b\\\'s|ourjobs|ourjob\\\'s|Ourjob\\\'s|ourjoumey|ourphotos|ourv\\\\\\/ay|outlool\\<\\\'s|overme|overthe|overthere|p\\/ace|P\\/ease|p\\_m\\_|P\\\xb0P\\$|PANUNG|pclnt|pclnts|pe0pIe|Perrut\\_|Persona\\/4\\/|Persona\\/y|persors|PIain|PIease|PIeasure|PIus|pleasurlng|POIe|Polynes\\/ans|poorshowing|popsicle|Presidenfs|probablyjust|puIIing|Putyourhand|Qh|QkaY|Qpen|QUYS|\\_QW|r\\/ght|ralnbow|ratherjump|ratherjust|Rcque|rcscucd|rea\\/|readytolaunchu|reaHy|ReaHy|reallyjust|reallymiss|reallytalked|reallythink|reallythinkthis|rememberthem|reoalibrated|retum|rhfluence|rightdown|roadyou|RUMBUNG|s\\/uggikh|S0|S1oW1y|saidyou|sayeverything\\\'s|saynothing|saythat|sc|scientihc|SCREAIVHNG|sCREAlvllNG|SCREAlvllNG|scund|S\\\'EOp|severa\\/parents|sfill|S\\\ufb02ence|shallrise|sHATTERING|shcws|Shdsjust|She\\`s|She\\\u2018II|she\\\'II|She\\\'II|she\\\'Il|Shejust|she\\\'lI|Shoofing|ShOp|shortyears|shou\\/dn|shou\\\ufb01ng|Shou\\\ufb02ng|shouldnt|Shouldrt|shouldrt|Shs\\\'s|SHUDDERWG|Shutup|SIGH\\$|signifcance|Sincc|sistervvill|Skarsg\\\xe9rd|slcsHs|slGHINcs|slGHING|slNGING|slzzLING|smarfest|Smiih|so\\/id|SoBl3lNG|soemtimes|Sojust|soldierl|somethlng|somethlng\\\'s|somez\\\'\\/7\\/ng|somthing|sumthing|sou\\/|SoundofMusic|SP\\/ash|SPEAK\\/NG|speII|speII\\\'s|Spendourtime|sQUA\\\\\\/\\\\\\/KING|StAnton|stealsjeans|StilI|Stilldesperatelyseeking|stlll|sToPs|storyl|Stubbom|su\\/faces|suffocaiing|summerjob|Summerjust|sun\\/ive|superiorman|sur\\\ufb02aces|t\\/ying|T0|T00|ta\\/ks|taiked|talkto|Talkto|talktonight|tampax|tc|tcday|tcrturing|tcuch|te\\/\\/|tearjust|tellsjokes|tellyou|terriers\\_|th\\/nk|THEPASSION|thafs|Thafs|Thai\\\'s|Thal\\\'s|thankyou|Thankyou|thatconverts|thatgoes|that\\\'II|That\\\'II|thatjob|thatjunk|thatjust|thatleads|Thatl\\\'m|that\\\'s\\ just|Thatsand|that\\\'sjust|That\\\'sjust|Thc|theirface|theirfeet|theirfury|thejaw|thejoint|thejudge|thejudges|Thejudges|thejury|Thelook|Therds|There\\\'II|There\\\'Il|There\\\'lI|They\\\'\\/\\\'e|they\\/\\\'II|They\\/re|They\\/\\\'re|they\\\'II|they\\\'Il|theyjust|Theyjust|they\\\'lI|They\\\'lI|theyre|theysay|thinkthat|this\\\'II|thlngs|Thlnkthls|thls|thore\\\'s|Thore\\\'s|Thorjust|thoughtl\\\'dletyou|tnatjust|tnat\\\'s|Tnat\\\'s|Tnere\\\'ll|to\\/\\/et|To\\/\\/S|todayl\\\'d|togelher|togethen|tojoin|tojudge|toldyou|tomorrovv|Tonighfsjust|totake|totalk|tothat|tothe|Towef|Tr\\/ck\\/ing|Traitur|tv\\\\\\/o|tvvelve|Tvvelve|tvventy|Tvventy|tvvo|Tvvo|twc|unconhrmed|underthat|underthe|underthese|underyour|unfilyou|Unfon\\\'unate\\/y|Uninnabited|untilApril|untilyou|upthinking|upto|V\\\\\\/ait\\_\\_\\_|v\\\\\\/as|V\\\\\\/as|V\\\\\\/e|v\\\\\\/eek\\\'s|V\\\\\\/eird\\_|V\\\\\\/ell|V\\\\\\/hat|V\\\\\\/hen\\\'ll|V\\\\\\/ho|v\\\\\\/ho\\\'ll|v\\\\\\/Hoops|v\\\\\\/ho\\\'s|V\\\\\\/ho\\\'s|V\\\\\\/hy|v\\\\\\/ith|v\\\\\\/on\\\'t|V\\\\fith|V\\\\fithin|valedictolian|vcice|ve\\/y|veiy|V\\\xe9ry|versioin|vi\\/ay|visitjails|Viva\\/di\\\'s|vlll|Voil\\\xe1|Voil\\\xe9|vvasjust|VVasn\\\'t|vvay|VVe|VVe\\\'II|VVe\\\'ll|Vvelooked|VVe\\\'re|VVe\\\'ve|VVhat|VVhat\\\'s|VVhat\\\'S|VVhen|\\\'v\\\'Vhere\\\'s|VVhip|vvHooPING|VvHooPING|VVhy|VVill|VVinters|vvlND|w\\\xa4n\\\'t|W9|waht|waierfall|walkjust|wallplant|wannajump|wantyou|Warcontinues|wasjennifer|wasjust|wasrt|Wasrt|wayl|wayround|wclf|wcman|wcmen|wcn\\\'t|wcrse|wculd|We\\/\\/|We\\/came|we\\/come|We\\/come|We\\/I|weekendjust|werert|Werert|we\\\'II|We\\\'II|we\\\'Il|We\\\'Il|wejust|we\\\'lI|We\\\'rejust|We\\\'ro|We\\\'Ve|wh\\/p|Wh\\\xb0ops|Whafs|Whatam|Whatare|Whateverwe|What\\\'II|Whatis|whatjust|Whatl|whatshe|whatwe|Whc\\\'s|Whcse|wHlsPERs|wi\\/\\/|wil\\/|Wil\\/|wilI|willbe|willhire|willneverknow|willyou|wlfe|wlfe\\\'s|wlth|wnat\\\'s|Wno|Wo\\/f|wo\\\ufb02d|WOI\\\'1\\\'t|wondernobody|won\\\'T|won\\\'tanswerme|won\\\'tforget|won\\\'tletitbring|Wo\\\'re|worfd|won\\\'th|won\\\'thwhile|workyou|wouIdn\\\'t|wouldn\\\'\\!|Wouldrt|wr\\/\\\'2\\\'\\/ng|writign|wrcng|wuuld|\\_Yay|Y\\\xa4u\\\'II|Y\\\xa4u\\\'ll|y\\\xa4u\\\'re|Y\\\xa4u\\\'re|y\\\xa4u\\\'ve|Y0|y0LI|y0u\\\'II|Y0u\\\'rc|Y0u\\\'re|Y0u\\\'ve|yaming|yaurparents|ycu|ycu\\\'d|ycur|Ycu\\\'re|Ycursins|YEI\\_I\\_|YELL\\$|yigg\\/mg|Yigg\\/mg|yoLI|yOu|yOU|you\\`re|you\\\'II|You\\\'II|You\\\'Il|youjack|youjoin|Youjoin|youjust|You\\\'lI|youngsterlike|youpick|you\\\'ra|Yourattention|yourautomobile|You\\\'rejustjealous|yourextra|yourfather|yourhand|yourhusband|yourjewelry|yourjob|Yourjob|yourjob\\_|yourjockey|yourjury|yourname|Yourpackage|yourpackage|you\\\'ro|yourpoorleg|yourvveak|you\\\'va|You\\\'va|youWlneversee|yQu|YQu|yQu\\\'\\_7|yummY|yuu|Yuu|Yuu\\\'ve|z\\\'housand|zlPPING|Ifslocked|nightjust|dayjourney|Ourjob|IunCh|nieCe|giVes|wantto|besttoday|NiCe|oftravelling|oftwo|ALl|afterparty|welL|theirjob|lfhe\\\'s|babyjesus|shithousejohn|jesus|withjesus|Gojoin|Adaughter|talkwith|anyjournals|L\\\'mjewish|arejust|soundjust|ifl\\\'m|askyou|ordinarywoman|andjunkies|isjack|helpyou|thinkyou|Lordjesus|injuvy|thejets|ifGod|againstjewish|ajunkie|dearjesus|hearyour|takeyears|friendjean|Fatherjohn|youjean|hearyou|Ifshe|didn\\\'tjust|IfGod|notjudge|andjudge|OKBY|myjourney|yourpremium|we\\\'rejust|Iittlejokes|Iifejust|Andjust|ofThe|lifejust|AIice|lnternationalAirport|yourbody|DollarBaby|ofjonesing|yourpanties|offforme|pantyparty|everhit|theirhomes|AirForce|yourhead|betterbe|myparty|disasterlockdown|Ifpot\\\'s|ifmy|yourmoney|Potterfan|Hermionejust|ofourshit|showyou|answernow|theirsjust|BIackie|SIeep|foryour|oryour|forArthur|CIamp|CIass|CIose|GIove|EIIen|PIay|PIace|EIgyn|AIert|CIaus|CIimb|military\\\'II|anylonget|yourlife|Yourbitch\\\'IIgetyou|yourdick|Tellyourbitch|rememberyou|newface|Butyou|don\\\'tyou|yourlives|Iovedher|reallydid|firstperson|mybest|Justgive|AIong|atyourbody|myhands|sayhe|mybooty|yourbooty|yourgirl|yourlegs|betterifthey|manybeautiful|contactpolice|numberbelow|biggestproblem|Itgave|everybodykind|theyhad|knowherlast|herhearing|othermembers|BIing|CIyde|foundguilty|fouryears|countyjail|yearin|theirrole|manybottles|can\\\'tpronounce|manybowls|ofthatgreen|manyjoyrides|Superrich|Iprefer|Theymust|whatyou|I\\\'IIjump|nobodyknow|neverknew|EIectronica|AIarm|getyourman|sayyou|getyour|Fuckyou|Whyyou|butyoujust|forgetyourname|Whatyou|Co\\/\\\'ncidenta\\/\\/y|GIad|RachelMarron|She\\\'llgive|presidentialsuite|andgentlemen|willnot|ourproducers|Ifshe\\\'s|CIock|Ishould|I\\\'llgo|maypass|andprotecting|BIessed|CIean|SIave|AIi|AIIah|AIIahu|CIick|BIast|AIlah|SIow|theirpolicies|Orperhaps|ofsex|forpleasure|ourpower|Yourpiece|Offioers|oondesoended|myseif|let\\\'sjust|yourway|An9TY|ourjourney|LuCY|\\\\\\\'m|CEDR\\/C|lsaac|FIy|Ionger|Iousy|Iosing|They\\\'II|yourpaws|littie|It\\\'lljust|AIso|Iisten|suPPosed|somePIace|exPIain|Iittle|StoP|AIways|Iectures|Iow|Ieaving|Ietting|Iistening|Iecture|Iicking|Iosses|PIeased|ofburglaries|He\\\'sjust|mytrucktoo|nowwhat|yourfire|herwhat\\\'s|hearthat|oryou|preferjournalist|CIaw|Ifour|lron|It\\\'syour|lfstill|forjoining|foryears|Ifit|notjump|ourproblem|yourprofile|ifJanine|forpreventative|whetherprotest|Ifnot|ourpeople|offmy|forproviding|hadjust|nearyou|whateveryou|hourputs|timejob|overyour|orpermanent|createjobs|I\\\'vejust|peoplejobs|dinnerpail|hasjumped|theirprivacy|AIl|ofserious|yourprofessional|poiitical|tojump|iives|eiections|militaryjuntas|nojoke|yourpresidency|ofmilitaryjuntas|Ourproposal|LeBIanc|KIaus|yourpussy|lNTERVIEWER|lNAUDIBLE|SImpsons|anotherjob|lfthere|descentinto|ofthathere|ofway|yourseat|allyou|Allyou|yourass|Yourbutt|iustiiggle|iust|CSi|affernoon|orpersecution|theirpetty|Fourpercent|fourpercent|willjust|Ifyou\\\'re|ourplanet|lsolation|yourprimitive|yourplanet|matteryour|Yourplace|andjustice|anotherpart|confiict|growingjeopardy|hasjust|havejust|herselfinto|ifnecessary|we\\\'vejust|tojust|yourjudgment|yourjeans|Youjust|ajanitor|FIattery|myjournal|myjudgment|offofmy|offyour|ofgood|ofguilty|ofhaving|ofheart|ofhonor|oflove|ofmankind|ofmany|ofnormal|ofpeople|ofpower|ofsuch|peoplejust|They\\\'rejust|tojeopardize|Yourplaces|yourposition|yourselfa|yourselfright|thejob|thejanitors|alljust|forAmerica\\\'s|Forpencils|forpondering|handwrittenjournals|herpursuit|ofjust|oflanding|oflife|outjust|Thejoke|ourpatient|oryou\\\'re|ofyourself|poweryour|Ofmy|EIlen|Don\\\'tget|tellme|ofdecision|itgoing|artificialgravity|shouldknow|Hasn\\\'tgot|thirdjunction|somebodypicks|Willyou|can\\\'tget|BuZZes|wouldn\\\'tyou|Wellbelow|What\\\'dyou|decipheredpart|they\\\'llknow|ifit\\\'s|ornot|myposition|lndistinct|anybiscuits|Andifyou|lfwe|yourarm|lnteresting|findit|it\\\'llstart|holdit|ofkilling|Howyou|lnhales|lgot|CIip|what\\\'II|road\\\'II|girI|LIoyd|BIake|reaI|Foryour|yourpublic|LAst|h\\ is|He\\)\\\u2019|Ls|al\\\'|wail\\\'|III\\\'ll|forthis|Yea\\ h|a\\ re|He\\)\\"|pan\\\'|yea\\ h|Tun|He\\)\\\'|he\\)\\\'|I\\\'11|he\\)\\"|\\ \\\'re\\ )(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'$COff$', u'scoffs'), (u'$ergei', u'Sergei'), (u"$'llOp", u'Stop'), (u"/'//", u"I'll"), (u"/'/I", u"I'll"), (u'/ennifer', u'Jennifer'), (u'/got', u'I got'), (u'/have', u'I have'), (u'/hope', u'I hope'), (u'/just', u'I just'), (u'/love', u'I love'), (u"/'m", u"I'm"), (u'/mmerse', u'immerse'), (u'/nsu/ts', u'Insults'), (u'/ong', u'long'), (u'/ook', u'look'), (u"/t's", u"It's"), (u"/'ve", u"I've"), (u"\\/\\/e'd", u"We'd"), (u"\\/\\/e're", u"We're"), (u"\\/\\/e've", u"We've"), (u'\\/\\/hat', u'What'), (u"\\/\\/here'd", u"Where'd"), (u'\\/\\/hoo', u'Whoo'), (u'\\/\\/hy', u'Why'), (u"\\/\\/hy'd", u"Why'd"), (u"\\/\\le're", u"We're"), (u'\\/Ve', u'We'), (u"\\Ne're", u"We're"), (u"\\Nhat's", u"What's"), (u"\\Nhere's", u"Where's"), (u"|'mjust", u"I'm just"), (u'\xa4ff', u'off'), (u'\xa4Id', u'old'), (u'\xa4Ids', u'olds'), (u'\xa4n', u'on'), (u'\xa4ne', u'one'), (u'\xa4nly', u'only'), (u'\xa4pen', u'open'), (u'\xa4r', u'or'), (u'\xa4rder', u'order'), (u'\xa4ther', u'other'), (u'\xa4ur', u'our'), (u'\xa4ut', u'out'), (u'\xa4ver', u'over'), (u'\xa4wn', u'own'), (u"\u20acV\u20acI'y", u'every'), (u"0'clock", u"o'clock"), (u'0f', u'of'), (u'0fEngland', u'of England'), (u'0fft0', u'off to'), (u'0l/er', u'over'), (u'0n', u'on'), (u'0ne', u'one'), (u"0ne's", u"one's"), (u'0r', u'or'), (u'0rders', u'orders'), (u"0thers'", u"others'"), (u'0ut', u'out'), (u"0utlaw's", u"outlaw's"), (u"0utlaws'", u"outlaws'"), (u'0ver', u'over'), (u'13oos', u'1300s'), (u'18oos', u'1800s'), (u'195os', u'1950s'), (u"1et's", u"let's"), (u'1o', u'10'), (u'1oo', u'100'), (u'1ooth', u'100th'), (u'1oth', u'10th'), (u'2E_', u'2E.'), (u"2'IST", u'21ST'), (u"2'Ist_", u"2'1st."), (u'2o', u'20'), (u'2oth', u'20th'), (u'3o', u'30'), (u'3oth', u'30th'), (u'4o', u'40'), (u'4os', u'40s'), (u'4oth', u'40th'), (u'50rry', u'sorry'), (u'5o', u'50'), (u'5oth', u'50th'), (u'6o', u'60'), (u'6os', u'60s'), (u"'6os", u"'60s"), (u'6oth', u'60th'), (u'7o', u'70'), (u"'7os", u"'70s"), (u'7oth', u'70th'), (u'8o', u'80'), (u"'8os", u"'80s"), (u'8oth', u'80th'), (u'9/aim', u'alarm'), (u'9o', u'90'), (u'9oth', u'90th'), (u'9UnShQt', u'gunshot'), (u'a//', u'all'), (u'a/bum', u'album'), (u'a/so', u'also'), (u'A/ways', u'Always'), (u'abcut', u'about'), (u'aboutjoining', u'about joining'), (u'aboutposh', u'about posh'), (u'aboutus', u'about us'), (u'aboutyou', u'about you'), (u'accldent', u'accident'), (u'Acool', u'A cool'), (u'afier', u'after'), (u'affraid', u'afraid'), (u'Afriend', u'A friend'), (u'afterall', u'after all'), (u'afterthe', u'after the'), (u'afulcrum', u'a fulcrum'), (u'Afunny', u'A funny'), (u'aga/nst', u'against'), (u'ahsolutes', u'absolutes'), (u'AI_I_', u'ALL'), (u'AIien', u'Alien'), (u'AIex', u'Alex'), (u'AII', u'All'), (u'AIIan', u'Allan'), (u'AIIow', u'Allow'), (u'AIive', u'Alive'), (u"ain'tgotno", u"ain't got no"), (u"Ain'tgotno", u"Ain't got no"), (u'airstrike', u'air strike'), (u'AIVIBULANCE', u'AMBULANCE'), (u'ajob', u'a job'), (u'ajockey_', u'a jockey.'), (u'ajoke', u'a joke'), (u'Ajoke', u'A joke'), (u'ajoking', u'a joking'), (u'al/', u'all'), (u'al/en', u'alien'), (u'alittle', u'a little'), (u'allgasp', u'all gasp'), (u'alljustforshow', u'all just for show'), (u"aln't", u"ain't"), (u'alot', u'a lot'), (u'Alot', u'A lot'), (u'An5wer', u'Answer'), (u'Andit', u'And it'), (u"Andit's", u"And it's"), (u'andl', u'and I'), (u'andlaughs', u'and laughs'), (u'andleave', u'and leave'), (u'andthe', u'and the'), (u'andyou', u'and you'), (u'Andyou', u'And you'), (u'ANNOUNC/NG', u'ANNOUNCING'), (u'anotherstep', u'another step'), (u'ANSWER/NG', u'ANSWERING'), (u'answerwhat', u'answer what'), (u'antiquejoke', u'antique joke'), (u"anyhcdy's", u"anybody's"), (u'Anyidea', u'Any idea'), (u"anyone's_", u"anyone's."), (u'apejust', u'ape just'), (u'ARABlc', u'ARABIC'), (u"aren't_", u"aren't."), (u"arerl't", u"aren't"), (u"Arnsteln's", u"Arnstein's"), (u'atleast', u'at least'), (u'Atough', u'A tough'), (u'Awhole', u'A whole'), (u'awoman', u'a woman'), (u'Awoman', u'A woman'), (u'barelytalked', u'barely talked'), (u'bcat', u'boat'), (u'Bcllvla', u'Bolivia'), (u'bcmb', u'bomb'), (u'bcmbs', u'bombs'), (u'be//y', u'belly'), (u'becuase', u'because'), (u"Beep/'ng", u'Beeping'), (u'bejumpy', u'be jumpy'), (u'besldes', u'besides'), (u'bestfriend', u'best friend'), (u'bestguy', u'best guy'), (u'bestjob', u'best job'), (u'BIack', u'Black'), (u'BIess', u'Bless'), (u'bigos___', u'bigos...'), (u'BIame', u'Blame'), (u'BIind', u'Blind'), (u'BIood', u'Blood'), (u'BIue', u'Blue'), (u'BLOVVS', u'BLOWS'), (u'blowholel', u'blowhole!'), (u'blt', u'bit'), (u'Bo99', u'Bogg'), (u'bodiedyoung', u'bodied young'), (u'breakf\xe9wtl', u'breakfast!'), (u'bulldozlng', u'bulldozing'), (u'butjust', u'but just'), (u'butl', u'but I'), (u'Butl', u'But I'), (u'butljust', u'but I just'), (u"Butljustcan'tgetenough", u"But I just can't get enough"), (u"Butyou're", u"But you're"), (u'buythem', u'buy them'), (u'buyyou', u'buy you'), (u'byjust', u'by just'), (u'bythe', u'by the'), (u"C/latter/'/7g", u'Chattering'), (u'ca///ng', u'calling'), (u'ca/I', u'call'), (u'call/ng', u'calling'), (u'callyou', u'call you'), (u'can*t', u"can't"), (u"can'i", u"can't"), (u"can'I", u"can't"), (u'canlgetyou', u'canI get you'), (u'cannotchange', u'cannot change'), (u'cannut', u'cannot'), (u"can'T", u"can't"), (u"can't_", u'Crucially'), (u"can'tjust", u"can't just"), (u"can'tletgo", u"can't let go"), (u'Car0l', u'Carol'), (u'Carhorn', u'Car horn'), (u'carrled', u'carried'), (u'Ccug', u'Coug'), (u'Ccugs', u'Cougs'), (u'Ccver', u'Cover'), (u'cellularchange', u'cellular change'), (u'cff', u'off'), (u'cfycu', u'of you'), (u'cfycur', u'of your'), (u'Ch/rping', u'Chirping'), (u'chaletgirl', u'chalet girl'), (u'changejobs', u'change jobs'), (u'Charliejust', u'Charlie just'), (u"Chatter/'rtg", u'Chattering'), (u'CHATTERWG', u'CHATTERING'), (u'Chequeredlove', u'Chequered love'), (u'cHIRPINcs', u'CHIRPING'), (u'chjldishness', u'childishness'), (u'chlldrcn', u'children'), (u'chlldren', u'children'), (u'chocolatte', u'chocolate'), (u'Cho/r', u'Choir'), (u'cHucKl_Es', u'CHUCKLES'), (u'CIark', u'Clark'), (u'CIear', u'Clear'), (u'circumcised_', u'circumcised.'), (u'ckay', u'okay'), (u'cl_osEs', u'CLOSES'), (u'CLATTERWG', u'CLATTERING'), (u'cn', u'on'), (u'cne', u'one'), (u'cnes', u'ones'), (u'Coincidenta//y', u'Coincidentally'), (u'COm\u20ac', u'Come'), (u'comp/etey', u'completely'), (u'complainingabout', u'complaining about'), (u'coms', u'come'), (u'cond/lion', u'condition'), (u'confdence', u'confidence'), (u'conhrmed', u'confirmed'), (u'connrm', u'confirm'), (u'Consecutivelyl', u'Consecutively!'), (u'COUGH5', u'COUGHS'), (u'CouGHING', u'COUGHING'), (u"couIdn't", u"couldn't"), (u'couldjust', u'could just'), (u"couldn'T", u"couldn't"), (u"couldn'tjust", u"couldn't just"), (u'Couldyou', u'Could you'), (u'crappyjob', u'crappy job'), (u'CRAsHING', u'CRASHING'), (u'crder', u'order'), (u'Crowdcheers', u'Crowd cheers'), (u'Cruoially', u'Crucially'), (u'cther', u'other'), (u'cuuld', u'could'), (u'cver', u'over'), (u"d/'dn't", u"didn't"), (u'd/squietude', u'disquietude'), (u"D\xa4esn't", u"Doesn't"), (u"d\xa4n'i", u"don't"), (u"d\xa4n't", u"don't"), (u'd\xb09', u'dog'), (u'd0', u'do'), (u'D0', u'Do'), (u"D0asn't", u"Doesn't"), (u"Dad'//", u"Dad'll"), (u'dairyjust', u'dairy just'), (u'Dar//ng', u'Darling'), (u'dc', u'do'), (u'Dcbby', u'Dobby'), (u"dccsn't", u"doesn't"), (u'dcctcr', u'doctor'), (u'Dces', u'Does'), (u'dcgs', u'dogs'), (u'dcing', u'doing'), (u"dcn'I", u"don't"), (u"dcn't", u"don't"), (u"Dcn't", u"Don't"), (u'dcughnut', u'doughnut'), (u'declslons', u'decisions'), (u'deedhas', u'deed has'), (u'Dehnitely', u'Definitely'), (u'desewes', u'deserves'), (u'desperate/\xbby', u'desperately'), (u'D\ufb02nk', u'Drink'), (u'DIAl_lNcs', u'DIALING'), (u"didn'!", u"didn't"), (u'didnt', u"didn't"), (u"didn'T", u"didn't"), (u"dIdn't", u"didn't"), (u"didn't_", u"didn't."), (u'didrft', u"didn't"), (u"didrl't", u"didn't"), (u'didyou', u'did you'), (u'divorcing_', u'divorcing.'), (u'dld', u'did'), (u"dldn't", u"didn't"), (u'dlfflcull', u'difficult'), (u'dlg', u'dig'), (u'dlsobeyed', u'disobeyed'), (u"doasn't", u"doesn't"), (u"Doasn't", u"Doesn't"), (u'doctoh', u'doctor'), (u'Doctor___tell', u'Doctor... tell'), (u'doesnt', u"doesn't"), (u"doesn'T", u"doesn't"), (u"doesri't", u"doesnt't"), (u'doesrt', u"doesn't"), (u'Doesrt', u"Doesn't"), (u'doit', u'do it'), (u'dojust', u'do just'), (u'don*t', u"don't"), (u'donejobs', u'done jobs'), (u"don'i", u"don't"), (u"don'l", u"don't"), (u"Don'l", u"Don't"), (u'Donllook', u"Don't look"), (u'dont', u"don't"), (u"don'T", u"don't"), (u"don'tcare", u"don't care"), (u"don'tjoke", u"don't joke"), (u"Don'tjudge", u"Don't judge"), (u"don'tjust", u"don't just"), (u"Don'tjust", u"Don't just"), (u"Don'tlet", u"Don't let"), (u"don'tlhink", u"don't think"), (u"don'tpush", u"don't push"), (u"Don'tyou", u"Don't you"), (u'DonWlook', u"Don't look"), (u'Dooropens', u'Door opens'), (u'doorshuts', u'door shuts'), (u'dothat', u'do that'), (u'dothis', u'do this'), (u'Drinkthis', u'Drink this'), (u'dumbass', u'dumb-ass'), (u'dumbto', u'dumb to'), (u"dun't", u"don't"), (u'E//e', u'Elle'), (u'E9YPt', u'Egypt'), (u"ea/'t/7", u'earth'), (u'eart/7', u'earth'), (u"efi'/'c/'ent", u'efficient'), (u'EN<3LlsH', u'ENGLISH'), (u'Enjoythe', u'Enjoy the'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u'etemity', u'eternity'), (u'ev/I', u'evil'), (u'eve/yone', u'everyone'), (u"even/body's", u"everybody's"), (u'eversay', u'ever say'), (u'Everymonth', u'Every month'), (u'everythings', u"everything's"), (u"Everythirlg's", u'Everything\u2019s'), (u"Everythlng's", u"Everything's"), (u'Everytime', u'Every time'), (u'Exac\ufb02y', u'Exactly'), (u'ExacUy_', u'Exactly.'), (u'excitedshrieking', u'excited shrieking'), (u'ExcLAllvls', u'EXCLAIMS'), (u'exploatation', u'exploitation'), (u'expreusion', u'expression'), (u'fairthat', u'fair that'), (u'Fathef', u'Father'), (u'fatherfigure', u'father figure'), (u'FBl', u'FBI'), (u'fcrebcdlng', u'foreboding'), (u'fcreverjudges', u'forever judges'), (u'fcund', u'found'), (u'feeleverything', u'feel everything'), (u'feelsweet', u'feel sweet'), (u"fiam/'/y", u'family'), (u'\ufb01ngernail', u'fingernail'), (u'finishedjunior', u'finished junior'), (u'FIynn', u'Flynn'), (u'flll', u'fill'), (u'flra', u'fira'), (u'Flylng', u'Flying'), (u'Fnends', u'Fiends'), (u'fo/low', u'follow'), (u'fonzvard', u'forward'), (u'fora', u'for a'), (u'Fora', u'For a'), (u'forajob', u'for a job'), (u'forAmerica', u'for America'), (u'forNew', u'for New'), (u'forone', u'for one'), (u'forso', u'for so'), (u'Forsuch', u'For such'), (u'forsunburns', u'for sunburns'), (u'forthe', u'for the'), (u'Foryears', u'For years'), (u'foryou', u'for you'), (u'Foudeen', u'Fouteen'), (u'Fou\ufb02een', u'Fourteen'), (u'FourSeasons', u'Four Seasons'), (u'fr/ends', u'friends'), (u'freezerfood', u'freezer food'), (u'F\xfchrerfeels', u'F\xfchrer feels'), (u'furthernotice', u'further notice'), (u'furyou', u'for you'), (u'G0', u'Go'), (u'g0in9', u'going'), (u'gamlenias', u'gardenias'), (u'GAsPING', u'GASPING'), (u'gc', u'go'), (u'gcing', u'going'), (u'gcnna', u'gonna'), (u'Gcnna', u'Gonna'), (u'gct', u'get'), (u'Gct', u'Got'), (u'genercsity', u'generosity'), (u'generosityn', u'generosity"'), (u'getjust', u'get just'), (u'g\ufb02ing', u'going'), (u'gi\ufb02friend', u'girlfriend'), (u'gir/', u'girl'), (u"gir/s'boarding", u"girls' boarding"), (u'giris', u'girls'), (u'gLlyS', u'guys'), (u'glum_', u'glum.'), (u'gnyone', u'anyone'), (u'golng', u'going'), (u'goodboyand', u'good boy and'), (u'goodjob', u'good job'), (u'gOt', u'got'), (u'gotjumped', u'got jumped'), (u'gotmyfirstinterview', u'got my first interview'), (u'grandjury', u'grand jury'), (u'greatjob', u'great job'), (u'Greatjobl', u'Great job!'), (u'grinco', u'gringo'), (u'GRoANING', u'GROANING'), (u'GRUNUNG', u'GRUNTING'), (u'gu', u'go'), (u'gunna', u'gonna'), (u'guyjumped', u'guy jumped'), (u'guyjust', u'guy just'), (u'gUyS', u'guys'), (u'_H6Y-', u'- Hey!'), (u'H\u20acY', u'Hey'), (u'H0we\xb7ver', u'However'), (u'halftheir', u'half their'), (u'hapPY', u'happy'), (u'hasrt', u"hasn't"), (u'Hasrt', u"Hasn't"), (u"haven'tspokerl", u"haven't spoken"), (u'hcle', u'hole'), (u'hcme', u'home'), (u'hcmes', u'homes'), (u'hcpe', u'hope'), (u'hctel', u'hotel'), (u'hcurs', u'hours'), (u'Hcw', u'How'), (u'he/ps', u'helps'), (u'hearjokestonight', u'hear jokes tonight'), (u'hearme', u'hear me'), (u'Hefell', u'He fell'), (u"he'II", u"he'll"), (u"He'II", u"He'll"), (u'HeII0', u'Hello'), (u"He'Il", u"He'll"), (u'Hejust', u'He just'), (u"He'lI", u"He'll"), (u'HelIo', u'Hello'), (u'hellc', u'hello'), (u'HellO', u'Hello'), (u'herboyfr/end', u'her boyfriend'), (u'herflesh', u'her flesh'), (u'herfollov\\/ed', u'her followed'), (u'herjob_', u'her job.'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herwith', u'her with'), (u'HeY\xb7', u'Hey.'), (u'HeyJennifer', u'Hey Jennifer'), (u'hiddsn', u'hidden'), (u'hisjunk', u'his junk'), (u'Hitlershare', u'Hitler share'), (u'Hlneed', u"I'll need"), (u'Hnally', u'finally'), (u'Hnishing', u'finishing'), (u'HOId', u'Hold'), (u'hOIes', u'holes'), (u'HONMNG', u'HONKING'), (u'honorthe', u'honor the'), (u'honoryou', u'honor you'), (u'honoryour', u'honor your'), (u"Hov\\/'s", u"How's"), (u"Hov\\/'S", u"How's"), (u'HovvLING', u'HOWLING'), (u'howit', u'how it'), (u"HoW's", u"How's"), (u'howto', u'how to'), (u"Hs's", u"He's"), (u'hurtyou', u'hurt you'), (u'I/erilj/', u'verify'), (u'I/fe', u'life'), (u'I\\/I', u'M'), (u'I\\/Ian', u'Man'), (u'I\\/Iathies', u'Mathies'), (u'I\\/Ie', u'Me'), (u'I\\/Iommy', u'Mommy'), (u'I\\/Ir', u'Mr'), (u'I\\/Ir.', u'Mr.'), (u'I\\/ly', u'My'), (u'I3EEPING', u'BEEPING'), (u'I3LARING', u'BLARING'), (u'Iacings', u'lacings'), (u'Iaid', u'laid'), (u'Iam', u'I am'), (u'Iand', u'land'), (u'Ianding', u'landing'), (u'Iast', u'last'), (u'Iate', u'late'), (u'Icad', u'load'), (u'Icading', u'loading'), (u'Ican', u'I can'), (u'Iccked', u'locked'), (u'Icng', u'long'), (u'Icsing', u'losing'), (u'Icslng', u'losing'), (u'Idid', u'I did'), (u"Ididn't", u"I didn't"), (u'Ido', u'I do'), (u"Idon'i", u"I don't"), (u"Idon't", u"I don't"), (u"Idon'tthink", u"I don't think"), (u"I'E'$", u"It's"), (u'Ieamed', u'learned'), (u'Ieapt', u'leapt'), (u'Iearned', u'learned'), (u'Ieast', u'least'), (u'Ieave', u'leave'), (u'Ied', u'led'), (u'Ieft', u'left'), (u"Ieg's", u"leg's"), (u'Iess', u'less'), (u'Iet', u'let'), (u"Iet's", u"let's"), (u"Iet'sjust", u"let's just"), (u'if/just', u'if I just'), (u'Ifear', u'I fear'), (u'Ifeared', u'I feared'), (u'Ifeel', u'I feel'), (u"ifI'||", u"if I'll"), (u"ifI'd", u"if I'd"), (u"ifI'II", u"if I'll"), (u"ifI'll", u"if I'll"), (u"ifI'm", u"if I'm"), (u'Ifinally', u'I finally'), (u"ifI've", u"if I've"), (u'ifl', u'if I'), (u'Iforgot', u'I forgot'), (u'Ifound', u'I found'), (u'ifshe', u'if she'), (u"ifthat's", u"if that's"), (u'ifthe', u'if the'), (u'Ifthe', u'If the'), (u"ifthere's", u"if there's"), (u'Ifthey', u'If they'), (u'ifwe', u'if we'), (u'Ifwe', u'If we'), (u'Ifycu', u'If you'), (u'ifyou', u'if you'), (u'Ifyou', u'If you'), (u'ifyuu', u'if you'), (u'Iget', u'I get'), (u'Igot', u'I got'), (u'Igotta', u'I gotta'), (u'Igotyou', u'I got you'), (u'Iguess', u'I guess'), (u'Iguessljust', u'I guess I just'), (u'Ihad', u'I had'), (u"Ihat's", u"that's"), (u'Ihave', u'I have'), (u'Iheard', u'I heard'), (u"ihere's", u"there's"), (u"ihey've", u"they've"), (u'Ihope', u'I hope'), (u'ii/Iary', u'Mary'), (u'ii/Ir', u'Mr'), (u'ii/Ir.', u'Mr.'), (u'ii/love', u'Move'), (u'Iife', u'life'), (u"I'II", u"I'll"), (u'Iike', u'like'), (u"I'Il", u"I'll"), (u'Iine', u'line'), (u'iirst', u'first'), (u"ii's", u"it's"), (u"Ii's", u"It's"), (u'Iiterallyjumped', u'literally jumped'), (u'Ijoined', u'I joined'), (u'Ijust', u'I just'), (u'Iknew', u'I knew'), (u'Iknow', u'I know'), (u'Ile', u'lie'), (u'Ileft', u'I left'), (u"I'lldo", u"I'll do"), (u"I'llmake", u"I'll make"), (u'Ilons', u'lions'), (u'Ilove', u'I love'), (u"I'mjust", u"I'm just"), (u'Inconceivablel', u'Inconceivable!'), (u'infact', u'in fact'), (u'Infact', u'In fact'), (u'in\ufb02uence', u'influence'), (u'infront', u'in front'), (u'injust', u'in just'), (u'insc\ufb01p\ufb01ons', u'inscriptions'), (u'insolencel', u'insolence!'), (u'intc', u'into'), (u'internationaljudges', u'international judges'), (u'inthe', u'in the'), (u'Iockdown', u'lockdown'), (u'Iong', u'long'), (u'Iongships', u'longships'), (u'Iook', u'look'), (u'Iookjust', u'look just'), (u'Iooklng', u'looking'), (u'Iooks', u'looks'), (u'Ioose', u'loose'), (u"Iord's", u"lord's"), (u'Iose', u'lose'), (u'Ioser', u'loser'), (u'Ioss', u'loss'), (u'Iost', u'lost'), (u'Iot', u'lot'), (u"Iot's", u"lot's"), (u'Iousyjob', u'lousy job'), (u'Iove', u'love'), (u'Ioves', u'loves'), (u'Iowlife', u'lowlife'), (u'Ipaid', u'I paid'), (u'Iquit', u'I quit'), (u'Ireallythinkthis', u'I really think this'), (u"I'rn", u"I'm"), (u'Isaw', u'I saw'), (u'Isayt/1e', u'I say the'), (u'isjust', u'is just'), (u"isn'i", u"isn't"), (u"isn't_", u"isn't."), (u'Isthis', u'Is this'), (u'Istill', u'I still'), (u'Istumblod', u'I stumbled'), (u'Itake', u'I take'), (u'itdown', u'it down'), (u'Iteach', u'I teach'), (u'Itfeels', u'It feels'), (u'ithave', u'it have'), (u'Ithink', u'I think'), (u'Ithinkthat', u'I think that'), (u'Ithinkthis', u'I think this'), (u"Ithinkyou're", u"I think you're"), (u'Ithlnk', u'I think'), (u'Ithoguht', u'I thought'), (u'Ithought', u'I thought'), (u'Ithoughtl', u'I thought I'), (u"it'II", u"it'll"), (u"It'II", u"It'll"), (u"it'Il", u"it'll"), (u"It'Il", u"It'll"), (u'itin', u'it in'), (u'itjust', u'it just'), (u'Itjust', u'It just'), (u"it'lI", u"it'll"), (u"It'lI", u"It'll"), (u"It'llhappen", u"It'll happen"), (u"it'lljust", u"it'll just"), (u'Itold', u'I told'), (u'Itook', u'I took'), (u'itout', u'it out'), (u"it'S", u"it's"), (u"it'sjinxed", u"it's jinxed"), (u"it'sjust", u"it's just"), (u"It'sjust", u"It's just"), (u'itso', u'it so'), (u'Ittends', u'It tends'), (u"Itwasn't", u"It wasn't"), (u'Iuckier', u'luckier'), (u'IV|oney', u'Money'), (u"IV|oney's", u"Money's"), (u"I'va", u"I've"), (u"I'Ve", u"I've"), (u'IVIan', u'Man'), (u'IVIAN', u'MAN'), (u'IVIarch', u'March'), (u"IVIarci's", u"Marci's"), (u'IVIarko', u'Marko'), (u'IVIe', u'Me'), (u"IVIine's", u"Mine's"), (u'IVImm', u'Mmm'), (u'IVIoney', u'Money'), (u'IVIr.', u'Mr.'), (u'IVIrs', u'Mrs'), (u'IVIuch', u'Much'), (u'IVIust', u'Must'), (u'IVIy', u'My'), (u'IVlacArthur', u'MacArthur'), (u"IVlacArthur's", u"MacArthur's"), (u'IVlcBride', u'McBride'), (u'IVlore', u'More'), (u'IVlotherfucker_', u'Motherfucker.'), (u'IVlr', u'Mr'), (u'IVlr.', u'Mr.'), (u'IVlr_', u'Mr.'), (u'IVlust', u'Must'), (u'IVly', u'My'), (u'Iwake', u'I wake'), (u'Iwant', u'I want'), (u'Iwanted', u'I wanted'), (u'Iwas', u'I was'), (u'Iwasjust', u'I was just'), (u'Iwasjustu', u'I was just...'), (u'Iwill', u'I will'), (u'Iwish', u'I wish'), (u"Iwon't", u"I won't"), (u'Iworked', u'I worked'), (u'Iwould', u'I would'), (u'jalapeno', u'jalape\xf1o'), (u'Jaokson', u'Jackson'), (u'Jascn', u'Jason'), (u'jcke', u'joke'), (u'jennifer', u'Jennifer'), (u'joseph', u'Joseph'), (u'jsut', u'just'), (u'Jumpthem', u'Jump them'), (u'jusi', u'just'), (u'jusl', u'just'), (u'justjudge', u'just judge'), (u'justleave', u'just leave'), (u'Justletgo', u'Just let go'), (u'kidsjumped', u'kids jumped'), (u'kiokflip', u'kickflip'), (u'knowjust', u'know just'), (u'knowthat', u'know that'), (u'knowthis', u'know this'), (u'knowwhat', u'know what'), (u'knowyet', u'know yet'), (u'knowyourlove', u'know your love'), (u'korean', u'Korean'), (u'L/ght', u'Light'), (u'L/kes', u'Likes'), (u'L\\/Ianuela', u'Manuela'), (u'L\\/Ianuelal', u'Manuela!'), (u'l\\/Iauzard', u'Mauzard'), (u'l\\/I\xe9lanie', u'M\xe9lanie'), (u'L\\/I\xe9lanie', u'M\xe9lanie'), (u'l\\/Iom', u'Mom'), (u'l\\/Iommy', u'Mommy'), (u'l\\/Ir', u'Mr'), (u'l\\/Ir.', u'Mr.'), (u'l\\/Is', u'Ms'), (u'l\\/ly', u'My'), (u'l_AuGHING', u'LAUGHING'), (u'l\u2018m', u"I'm"), (u'Laml6', u'I am l6'), (u'Lcad', u'Load'), (u'lcan', u'I can'), (u"lcan't", u"I can't"), (u"lcarl't_", u"I can't."), (u'Lcve', u'Love'), (u"l'd", u"I'd"), (u"L'd", u"I'd"), (u'ldid', u'I did'), (u'Ldid', u'I did'), (u'ldiot', u'Idiot'), (u"L'djump", u"I'd jump"), (u"ldon't", u"I don't"), (u"Ldon't", u"I don't"), (u'Lefs', u"Let's"), (u"Let'sjust", u"Let's just"), (u'lf', u'if'), (u'Lf', u'If'), (u'lfeelonelung', u'I feel one lung'), (u'lfthey', u'if they'), (u'lfyou', u'If you'), (u'Lfyou', u'If you'), (u"lfyou're", u"If you're"), (u'lget', u'I get'), (u'lgive', u'I give'), (u'Li/0/Academy', u'Lilly Academy'), (u'li/lr.', u'Mr.'), (u'ligature___', u'ligature...'), (u"l'II", u"I'll"), (u"l'Il", u"I'll"), (u'ljust', u'I just'), (u'Ljust', u'I just'), (u"ll/Iommy's", u"Mommy's"), (u'll/lajor', u'Major'), (u'Ll/lajor', u'Major'), (u'll/layans', u'Mayans'), (u"l'lI", u"I'll"), (u"l'll", u"I'll"), (u"L'll", u"I'll"), (u"l'lljust", u"I'll just"), (u"L'lltake", u"I'll take"), (u'llte', u'lite'), (u"l'm", u"I'm"), (u"L'm", u"I'm"), (u'Lmean', u'I mean'), (u"l'mjust", u"I'm just"), (u'ln', u'In'), (u'lN', u'IN'), (u'lNAuDll3LE', u'INAUDIBLE'), (u'LNAuDll3LE', u'INAUDIBLE'), (u'LNDlsTINcT', u'INDISTINCT'), (u'lneed', u'I need'), (u'lostyou', u'lost you'), (u'Loudmusic', u'Loud music'), (u'lraq', u'Iraq'), (u"lRA's", u"IRA's"), (u'Lrenka', u'Irenka'), (u'Lrn', u"I'm"), (u'lRS', u'IRS'), (u'lsabella', u'Isabella'), (u"lsn't", u"isn't"), (u"Lsn't", u"Isn't"), (u"Lst's", u"Let's"), (u'lsuppose', u'I suppose'), (u'lt', u'It'), (u'ltake', u'I take'), (u'ltell', u'I tell'), (u'lthink', u'I think'), (u'Lthink', u'I think'), (u'lthink___', u'I think...'), (u"lt'II", u"It'll"), (u"lt'Il", u"It'll"), (u'ltjammed_', u'It jammed.'), (u"lt'll", u"It'll"), (u'ltold', u'I told'), (u"lt's", u"It's"), (u"lT'S", u"IT'S"), (u"Lt'S", u"It's"), (u"Lt'sjust", u"It's just"), (u"lv\\/asn't", u"I wasn't"), (u"l've", u"I've"), (u"L've", u"I've"), (u'lVIan', u'Man'), (u'lVIcHenry', u'McHenry'), (u'lVIr.', u'Mr.'), (u'lVlacArthur', u'MacArthur'), (u'LVlore', u'More'), (u'lVlr', u'Mr'), (u'lVlr.', u'Mr.'), (u'lvluslc', u'MUSIC'), (u'lVlust', u'Must'), (u'LVly', u'Lily'), (u'lwaited', u'I waited'), (u'lwamoto', u'Iwamoto'), (u'lwant', u'I want'), (u'lwanted', u'I wanted'), (u'lwas', u'I was'), (u'lwill', u'I will'), (u"lwon't", u"I won't"), (u'lworked', u'I worked'), (u'lwould', u'I would'), (u"lwould've", u"I would've"), (u'lx/Iorning', u'Morning'), (u'M/dd/e', u'Middle'), (u'm/g/7ty', u'mighty'), (u'MACH/NE', u'MACHINE'), (u'MacKenz/e', u'MacKenzie'), (u'majorjackpot', u'major jackpot'), (u'majormuscle', u'major muscle'), (u'Manuela_', u'Manuela.'), (u'maste/y', u'mastery'), (u'Masturhate', u'Masturbate'), (u'Mattei_', u'Mattei.'), (u'mayjust', u'may just'), (u'mbecause', u'"because'), (u'McCa/Iister', u'McCallister'), (u'McCallisler', u'McCallister'), (u'Mccallister', u'McCallister'), (u'Mccallisters', u'McCallisters'), (u"mcm's", u"mom's"), (u'mcney', u'money'), (u'mcral', u'moral'), (u'mcre', u'more'), (u'mcve', u'move'), (u'mejust', u'me just'), (u'Mexioo', u'Mexico'), (u'mi//<', u'milk'), (u'misfartune', u'misfortune'), (u'Ml6', u'MI6'), (u'Mlnd', u'Mind'), (u"Mock/'ngbl'rd", u'Mockingbird'), (u"mOI'\u20ac", u'more'), (u'Mom_', u'Mom.'), (u'monkeyback', u'monkey back'), (u'move___l', u'move... I'), (u'moveto', u'move to'), (u'mustknock', u'must knock'), (u'Myheart', u'My heart'), (u'myjch', u'my job'), (u'myjet', u'my jet'), (u'myjob', u'my job'), (u'Myjob', u'My job'), (u"myjob's", u"my job's"), (u'mylife', u'my life'), (u'Mynew', u'My new'), (u'myown', u'my own'), (u'mypants', u'my pants'), (u'myselli', u'myself'), (u'Myshoes', u'My shoes'), (u'mysong', u'my song'), (u'mytemper', u'my temper'), (u'mythumb', u'my thumb'), (u'Myworld', u'My world'), (u'N0', u'No'), (u'narne', u'name'), (u'Natians', u'Nations'), (u'naTve', u'naive'), (u'nc', u'no'), (u'Nc', u'No'), (u'ncne', u'none'), (u'Ncrth', u'North'), (u'ncw', u'new'), (u'Ncw', u'Now'), (u'needyou', u'need you'), (u'neighboun', u'neighbour'), (u'neverfound', u'never found'), (u'neverthere', u'never there'), (u'neverv\\/ill_', u'never will.'), (u'NewJersey', u'New Jersey'), (u'newjob', u'new job'), (u'newjobs', u'new jobs'), (u'nextdoor', u'next door'), (u'Nighw', u'Nighty'), (u'nilios', u'ni\xf1os'), (u'Nlagnificence', u'Magnificence'), (u'Nlakes', u'Makes'), (u'Nlalina', u'Malina'), (u'Nlan', u'Man'), (u'Nlarch', u'March'), (u'Nlarine', u'Marine'), (u'Nlarion', u'Marion'), (u'Nlarry', u'Marry'), (u'Nlars', u'Mars'), (u'Nlarty', u'Marty'), (u'Nle', u'Me'), (u'Nleet', u'Meet'), (u'Nlen', u'Men'), (u'Nlom', u'Mom'), (u'Nlore', u'More'), (u'Nlornin', u'Mornin'), (u'Nlother', u'Mother'), (u'Nlr', u'Mr'), (u'Nlr.', u'Mr.'), (u'Nlrs', u'Mrs'), (u'Nluch', u'Much'), (u'nojurisdiction', u'no jurisdiction'), (u'noone', u'no one'), (u'Noone', u'No one'), (u'not judging', u'not judging'), (u'notgoing', u'not going'), (u'notjunk', u'not junk'), (u'Notjunk', u'Not junk'), (u'notjust', u'not just'), (u'notsure', u'not sure'), (u'novv', u'now'), (u'Nowjust', u'Now just'), (u"Nowthat's", u"Now that's"), (u'Numbertwo', u'Number two'), (u"oan't", u"can't"), (u"oan'tjust", u"can't just"), (u'objecl', u'object'), (u'occultpowerand', u'occult power and'), (u'Ocps', u'Oops'), (u'ofa', u'of a'), (u'ofajudge', u'of a judge'), (u'ofall', u'of all'), (u'Ofall', u'Of all'), (u'ofBedford', u'of Bedford'), (u'ofcourse', u'of course'), (u'Ofcourse', u'Of course'), (u'ofeach', u'of each'), (u'ofeither', u'of either'), (u"Offioer's", u"Officer's"), (u'ofFrance', u'of France'), (u'offreedom', u'of freedom'), (u'offthe', u'off the'), (u'offthis', u'off this'), (u'offto', u'off to'), (u'offun', u'of fun'), (u'ofguy', u'of guy'), (u'Ofhce', u'Office'), (u'ofhis', u'of his'), (u'ofHis', u'of His'), (u'ofhoneybees', u'of honeybees'), (u'ofit', u'of it'), (u'ofjam', u'of jam'), (u'OFJOAN', u'OF JOAN'), (u'ofjoy', u'of joy'), (u'ofjunior', u'of junior'), (u'ofme', u'of me'), (u'ofmead', u'of mead'), (u'ofmicroinjections', u'of microinjections'), (u'ofmy', u'of my'), (u'ofNew', u'of New'), (u"ofNorris'", u"of Norris'"), (u'ofopinions', u'of opinions'), (u'ofour', u'of our'), (u'ofpeopla', u'of people'), (u'ofthat', u'of that'), (u'ofthe', u'of the'), (u'Ofthe', u'Of the'), (u'oftheir', u'of their'), (u'ofthem', u'of them'), (u"ofthem's", u"of them's"), (u'ofthemselves', u'of themselves'), (u'ofthere', u'of there'), (u'ofthese', u'of these'), (u'ofthings', u'of things'), (u'ofthis', u'of this'), (u'ofthlngs', u'of things'), (u'ofthose', u'of those'), (u'ofuse', u'of use'), (u'ofwashington', u'of Washington'), (u'ofyou', u'of you'), (u'ofyour', u'of your'), (u'OId', u'Old'), (u'OIsson', u'Olsson'), (u'Ok3Y', u'Okay'), (u'okaY', u'okay'), (u'OkaY', u'Okay'), (u'OKaY', u'Okay'), (u'OKGY', u'Okay'), (u'Ol<', u'Ole'), (u'oldAdolfon', u'old Adolf on'), (u'onboard', u'on board'), (u'onIy', u'only'), (u'onIything', u'only thing'), (u'onJanuaw', u'on January'), (u'onlyjust', u'only just'), (u'Onyinal', u'Original'), (u'oomprise', u'comprise'), (u'oonstitution', u'constitution'), (u"oouldn't", u"couldn't"), (u"oould've", u"could've"), (u"oousin's", u"cousin's"), (u'opiimistically', u'optimistically'), (u'ora', u'or a'), (u'orfall', u'or fall'), (u'orglory', u'or glory'), (u'orjust', u'or just'), (u'Orjust', u'Or just'), (u'Orthat', u'Or that'), (u'orwould', u'or would'), (u'Orwould', u'Or would'), (u'Othenzvise', u'Otherwise'), (u'our joumey', u'our journey'), (u'ourbrave', u'our brave'), (u'ourfathers', u'our fathers'), (u'ourgirlon', u'our girl on'), (u'Ourgoal', u'Our goal'), (u'Ourguy', u'Our guy'), (u"ourj0b's", u"our job's"), (u"Ourj0b's", u"Our job's"), (u'ourjobs', u'our jobs'), (u"ourjob's", u"our job's"), (u"Ourjob's", u"Our job's"), (u'ourjoumey', u'our journey'), (u'ourphotos', u'our photos'), (u'ourv\\/ay', u'our way'), (u"outlool<'s", u"outlook's"), (u'overme', u'over me'), (u'overthe', u'over the'), (u'overthere', u'over there'), (u'p/ace', u'place'), (u'P/ease', u'Please'), (u'p_m_', u'p.m.'), (u'P\xb0P$', u'Pops'), (u'PANUNG', u'PANTING'), (u'pclnt', u'point'), (u'pclnts', u'points'), (u'pe0pIe', u'people'), (u'Perrut_', u'Perrut.'), (u'Persona/4/', u'Personally'), (u'Persona/y', u'Personally'), (u'persors', u"person's"), (u'PIain', u'Plain'), (u'PIease', u'Please'), (u'PIeasure', u'Pleasure'), (u'PIus', u'Plus'), (u'pleasurlng', u'pleasuring'), (u'POIe', u'Pole'), (u'Polynes/ans', u'Polynesians'), (u'poorshowing', u'poor showing'), (u'popsicle', u'Popsicle'), (u'Presidenfs', u"President's"), (u'probablyjust', u'probably just'), (u'puIIing', u'pulling'), (u'Putyourhand', u'Put your hand'), (u'Qh', u'Oh'), (u'QkaY', u'Okay'), (u'Qpen', u'Open'), (u'QUYS', u'GUYS'), (u'_QW', u'Aw'), (u'r/ght', u'right'), (u'ralnbow', u'rainbow'), (u'ratherjump', u'rather jump'), (u'ratherjust', u'rather just'), (u'Rcque', u'Roque'), (u'rcscucd', u'rescued'), (u'rea/', u'real'), (u'readytolaunchu', u'ready to launch...'), (u'reaHy', u'really'), (u'ReaHy', u'Really'), (u'reallyjust', u'really just'), (u'reallymiss', u'really miss'), (u'reallytalked', u'really talked'), (u'reallythink', u'really think'), (u'reallythinkthis', u'really think this'), (u'rememberthem', u'remember them'), (u'reoalibrated', u'recalibrated'), (u'retum', u'return'), (u'rhfluence', u'influence'), (u'rightdown', u'right down'), (u'roadyou', u'road you'), (u'RUMBUNG', u'RUMBLING'), (u's/uggikh', u'sluggish'), (u'S0', u'So'), (u'S1oW1y', u'Slowly'), (u'saidyou', u'said you'), (u"sayeverything's", u"say everything's"), (u'saynothing', u'say nothing'), (u'saythat', u'say that'), (u'sc', u'so'), (u'scientihc', u'scientific'), (u'SCREAIVHNG', u'SCREAMING'), (u'sCREAlvllNG', u'SCREAMING'), (u'SCREAlvllNG', u'SCREAMING'), (u'scund', u'sound'), (u"S'EOp", u'Stop'), (u'severa/parents', u'several parents'), (u'sfill', u'still'), (u'S\ufb02ence', u'Silence'), (u'shallrise', u'shall rise'), (u'sHATTERING', u'SHATTERING'), (u'shcws', u'shows'), (u'Shdsjust', u"She's just"), (u'She`s', u"She's"), (u'She\u2018II', u"She'll"), (u"she'II", u"she'll"), (u"She'II", u"She'll"), (u"she'Il", u"she'll"), (u'Shejust', u'She just'), (u"she'lI", u"she'll"), (u'Shoofing', u'Shooting'), (u'ShOp', u'shop'), (u'shortyears', u'short years'), (u'shou/dn', u'shouldn\u2019t'), (u'shou\ufb01ng', u'shouting'), (u'Shou\ufb02ng', u'Shouting'), (u'shouldnt', u"shouldn't"), (u'Shouldrt', u"Shouldn't"), (u'shouldrt', u"shouldn't"), (u"Shs's", u"She's"), (u'SHUDDERWG', u'SHUDDERING'), (u'Shutup', u'Shut up'), (u'SIGH$', u'SIGHS'), (u'signifcance', u'significance'), (u'Sincc', u'Since'), (u'sistervvill', u'sister will'), (u'Skarsg\xe9rd', u'Skarsg\xe5rd'), (u'slcsHs', u'SIGHS'), (u'slGHINcs', u'SIGHING'), (u'slGHING', u'SIGHING'), (u'slNGING', u'SINGING'), (u'slzzLING', u'SIZZLING'), (u'smarfest', u'smartest'), (u'Smiih', u'Smith'), (u'so/id', u'solid'), (u'SoBl3lNG', u'SOBBING'), (u'soemtimes', u'sometimes'), (u'Sojust', u'So just'), (u'soldierl', u'soldier!'), (u'somethlng', u'something'), (u"somethlng's", u"something's"), (u"somez'/7/ng", u'something'), (u'somthing', u'something'), (u'sumthing', u'something'), (u'sou/', u'soul'), (u'SoundofMusic', u'Sound of Music'), (u'SP/ash', u'Splash'), (u'SPEAK/NG', u'SPEAKING'), (u'speII', u'spell'), (u"speII's", u"spell's"), (u'Spendourtime', u'Spend our time'), (u'sQUA\\/\\/KING', u'SQUAWKING'), (u'StAnton', u'St Anton'), (u'stealsjeans', u'steals jeans'), (u'StilI', u'Still'), (u'Stilldesperatelyseeking', u'Still desperately seeking'), (u'stlll', u'still'), (u'sToPs', u'STOPS'), (u'storyl', u'story!'), (u'Stubbom', u'Stubborn'), (u'su/faces', u'surfaces'), (u'suffocaiing', u'suffocating'), (u'summerjob', u'summer job'), (u'Summerjust', u'Summer just'), (u'sun/ive', u'survive'), (u'superiorman', u'superior man'), (u'sur\ufb02aces', u'surfaces'), (u't/ying', u'trying'), (u'T0', u'To'), (u'T00', u'Too'), (u'ta/ks', u'talks'), (u'taiked', u'talked'), (u'talkto', u'talk to'), (u'Talkto', u'Talk to'), (u'talktonight', u'talk tonight'), (u'tampax', u'Tampax'), (u'tc', u'to'), (u'tcday', u'today'), (u'tcrturing', u'torturing'), (u'tcuch', u'touch'), (u'te//', u'tell'), (u'tearjust', u'tear just'), (u'tellsjokes', u'tells jokes'), (u'tellyou', u'tell you'), (u'terriers_', u'terriers.'), (u'th/nk', u'think'), (u'THEPASSION', u'THE PASSION'), (u'thafs', u"that's"), (u'Thafs', u"That's"), (u"Thai's", u"That's"), (u"Thal's", u"That's"), (u'thankyou', u'thank you'), (u'Thankyou', u'Thank you'), (u'thatconverts', u'that converts'), (u'thatgoes', u'that goes'), (u"that'II", u"that'll"), (u"That'II", u"That'll"), (u'thatjob', u'that job'), (u'thatjunk', u'that junk'), (u'thatjust', u'that just'), (u'thatleads', u'that leads'), (u"Thatl'm", u"That I'm"), (u"that's just", u"that's just"), (u'Thatsand', u'That sand'), (u"that'sjust", u"that's just"), (u"That'sjust", u"That's just"), (u'Thc', u'The'), (u'theirface', u'their face'), (u'theirfeet', u'their feet'), (u'theirfury', u'their fury'), (u'thejaw', u'the jaw'), (u'thejoint', u'the joint'), (u'thejudge', u'the judge'), (u'thejudges', u'the judges'), (u'Thejudges', u'The judges'), (u'thejury', u'the jury'), (u'Thelook', u'The look'), (u'Therds', u"There's"), (u"There'II", u"There'll"), (u"There'Il", u"There'll"), (u"There'lI", u"There'll"), (u"They'/'e", u"They're"), (u"they/'II", u"they'll"), (u'They/re', u"They're"), (u"They/'re", u"They're"), (u"they'II", u"they'll"), (u"they'Il", u"they'll"), (u'theyjust', u'they just'), (u'Theyjust', u'They just'), (u"they'lI", u"they'll"), (u"They'lI", u"They'll"), (u'theyre', u"they're"), (u'theysay', u'they say'), (u'thinkthat', u'think that'), (u"this'II", u"this'll"), (u'thlngs', u'things'), (u'Thlnkthls', u'Think this'), (u'thls', u'this'), (u"thore's", u"there's"), (u"Thore's", u"There's"), (u'Thorjust', u'Thor just'), (u"thoughtl'dletyou", u"thought I'd let you"), (u'tnatjust', u'that just'), (u"tnat's", u"that's"), (u"Tnat's", u"That's"), (u"Tnere'll", u"There'll"), (u'to//et', u'toilet'), (u'To//S', u'Tolls'), (u"todayl'd", u"today I'd"), (u'togelher', u'together'), (u'togethen', u'together'), (u'tojoin', u'to join'), (u'tojudge', u'to judge'), (u'toldyou', u'told you'), (u'tomorrovv', u'tomorrow'), (u'Tonighfsjust', u"Tonight's just"), (u'totake', u'to take'), (u'totalk', u'to talk'), (u'tothat', u'to that'), (u'tothe', u'to the'), (u'Towef', u'Tower'), (u'Tr/ck/ing', u'Trickling'), (u'Traitur', u'Traitor'), (u'tv\\/o', u'two'), (u'tvvelve', u'twelve'), (u'Tvvelve', u'Twelve'), (u'tvventy', u'tvventy'), (u'Tvventy', u'Tvventy'), (u'tvvo', u'two'), (u'Tvvo', u'Two'), (u'twc', u'two'), (u'unconhrmed', u'unconfirmed'), (u'underthat', u'under that'), (u'underthe', u'under the'), (u'underthese', u'under these'), (u'underyour', u'under your'), (u'unfilyou', u'until you'), (u"Unfon'unate/y", u'Unfortunately'), (u'Uninnabited', u'Uninhabited'), (u'untilApril', u'until April'), (u'untilyou', u'until you'), (u'upthinking', u'up thinking'), (u'upto', u'up to'), (u'V\\/ait___', u'Wait...'), (u'v\\/as', u'was'), (u'V\\/as', u'Was'), (u'V\\/e', u'We'), (u"v\\/eek's", u"week's"), (u'V\\/eird_', u'Weird.'), (u'V\\/ell', u'Well'), (u'V\\/hat', u'what'), (u"V\\/hen'll", u"When'll"), (u'V\\/ho', u'Who'), (u"v\\/ho'll", u"who'll"), (u'v\\/Hoops', u'Whoops'), (u"v\\/ho's", u"who's"), (u"V\\/ho's", u"Who's"), (u'V\\/hy', u'Why'), (u'v\\/ith', u'with'), (u"v\\/on't", u"won't"), (u'V\\fith', u'With'), (u'V\\fithin', u'Within'), (u'valedictolian', u'valedictorian'), (u'vcice', u'voice'), (u've/y', u'very'), (u'veiy', u'very'), (u'V\xe9ry', u'Very'), (u'versioin', u'version'), (u'vi/ay', u'way'), (u'visitjails', u'visit jails'), (u"Viva/di's", u"Vivaldi's"), (u'vlll', u'vill'), (u'Voil\xe1', u'Voil\xe0'), (u'Voil\xe9', u'Voil\xe0'), (u'vvasjust', u'was just'), (u"VVasn't", u"Wasn't"), (u'vvay', u'way'), (u'VVe', u'We'), (u"VVe'II", u"We'll"), (u"VVe'll", u"We'll"), (u'Vvelooked', u'We looked'), (u"VVe're", u"We're"), (u"VVe've", u"We've"), (u'VVhat', u'What'), (u"VVhat's", u"What's"), (u"VVhat'S", u"What's"), (u'VVhen', u'When'), (u"'v'Vhere's", u"Where's"), (u'VVhip', u'Whip'), (u'vvHooPING', u'WHOOPING'), (u'VvHooPING', u'WHOOPING'), (u'VVhy', u'Why'), (u'VVill', u'Will'), (u'VVinters', u'Winters'), (u'vvlND', u'WIND'), (u"w\xa4n't", u"won't"), (u'W9', u'We'), (u'waht', u'want'), (u'waierfall', u'waterfall'), (u'walkjust', u'walk just'), (u'wallplant', u'wall plant'), (u'wannajump', u'wanna jump'), (u'wantyou', u'want you'), (u'Warcontinues', u'War continues'), (u'wasjennifer', u'was Jennifer'), (u'wasjust', u'was just'), (u'wasrt', u"wasn't"), (u'Wasrt', u"Wasn't"), (u'wayl', u'way I'), (u'wayround', u'way round'), (u'wclf', u'wolf'), (u'wcman', u'woman'), (u'wcmen', u'women'), (u"wcn't", u"won't"), (u'wcrse', u'worse'), (u'wculd', u'would'), (u'We//', u'Well'), (u'We/came', u'Welcome'), (u'we/come', u'welcome'), (u'We/come', u'Welcome'), (u'We/I', u'Well'), (u'weekendjust', u'weekend just'), (u'werert', u"weren't"), (u'Werert', u"Weren't"), (u"we'II", u"we'll"), (u"We'II", u"We'll"), (u"we'Il", u"we'll"), (u"We'Il", u"We'll"), (u'wejust', u'we just'), (u"we'lI", u"we'll"), (u"We'rejust", u"We're just"), (u"We'ro", u"We're"), (u"We'Ve", u"We've"), (u'wh/p', u'whip'), (u'Wh\xb0ops', u'Whoops'), (u'Whafs', u"What's"), (u'Whatam', u'What am'), (u'Whatare', u'What are'), (u'Whateverwe', u'Whatever we'), (u"What'II", u"What'll"), (u'Whatis', u'What is'), (u'whatjust', u'what just'), (u'Whatl', u'What I'), (u'whatshe', u'what she'), (u'whatwe', u'what we'), (u"Whc's", u"Who's"), (u'Whcse', u'Whose'), (u'wHlsPERs', u'WHISPERS'), (u'wi//', u'will'), (u'wil/', u'will'), (u'Wil/', u'Will'), (u'wilI', u'will'), (u'willbe', u'will be'), (u'willhire', u'will hire'), (u'willneverknow', u'will never know'), (u'willyou', u'will you'), (u'wlfe', u'wife'), (u"wlfe's", u"wife's"), (u'wlth', u'with'), (u"wnat's", u"what's"), (u'Wno', u'Who'), (u'Wo/f', u'Wolf'), (u'wo\ufb02d', u'world'), (u"WOI'1't", u"won't"), (u'wondernobody', u'wonder nobody'), (u"won'T", u"won't"), (u"won'tanswerme", u"won't answer me"), (u"won'tforget", u"won't forget"), (u"won'tletitbring", u"won't let it bring"), (u"Wo're", u"We're"), (u'worfd', u'world'), (u"won'th", u'worth'), (u"won'thwhile", u'worthwhile'), (u'workyou', u'work you'), (u"wouIdn't", u"wouldn't"), (u"wouldn'!", u"wouldn't"), (u'Wouldrt', u"Wouldn't"), (u"wr/'2'/ng", u'writing'), (u'writign', u'writing'), (u'wrcng', u'wrong'), (u'wuuld', u'would'), (u'_Yay', u'Yay'), (u"Y\xa4u'II", u"You'll"), (u"Y\xa4u'll", u"You'll"), (u"y\xa4u're", u"you're"), (u"Y\xa4u're", u"You're"), (u"y\xa4u've", u"you've"), (u'Y0', u'Yo'), (u'y0LI', u'you'), (u"y0u'II", u"you'll"), (u"Y0u'rc", u"You're"), (u"Y0u're", u"You're"), (u"Y0u've", u"You've"), (u'yaming', u'yarning'), (u'yaurparents', u'your parents'), (u'ycu', u'you'), (u"ycu'd", u"you'd"), (u'ycur', u'your'), (u"Ycu're", u"You're"), (u'Ycursins', u'Your sins'), (u'YEI_I_', u'YELL'), (u'YELL$', u'YELLS'), (u'yigg/mg', u'giggling'), (u'Yigg/mg', u'giggling'), (u'yoLI', u'you'), (u'yOu', u'you'), (u'yOU', u'you'), (u'you`re', u"you're"), (u"you'II", u"you'll"), (u"You'II", u"You'll"), (u"You'Il", u"You'll"), (u'youjack', u'you jack'), (u'youjoin', u'you join'), (u'Youjoin', u'You join'), (u'youjust', u'you just'), (u"You'lI", u"You'll"), (u'youngsterlike', u'youngster like'), (u'youpick', u'you pick'), (u"you'ra", u"you're"), (u'Yourattention', u'Your attention'), (u'yourautomobile', u'your automobile'), (u"You'rejustjealous", u"You're just jealous"), (u'yourextra', u'your extra'), (u'yourfather', u'your father'), (u'yourhand', u'your hand'), (u'yourhusband', u'your husband'), (u'yourjewelry', u'your jewelry'), (u'yourjob', u'your job'), (u'Yourjob', u'Your job'), (u'yourjob_', u'your job.'), (u'yourjockey', u'your jockey'), (u'yourjury', u'your jury'), (u'yourname', u'your name'), (u'Yourpackage', u'Your package'), (u'yourpackage', u'your package'), (u"you'ro", u"you're"), (u'yourpoorleg', u'your poor leg'), (u'yourvveak', u'your weak'), (u"you'va", u"you've"), (u"You'va", u"You've"), (u'youWlneversee', u"you'll never see"), (u'yQu', u'you'), (u'YQu', u'You'), (u"yQu'_7", u'you?'), (u'yummY', u'yummy'), (u'yuu', u'you'), (u'Yuu', u'You'), (u"Yuu've", u"You've"), (u"z'housand", u'thousand'), (u'zlPPING', u'ZIPPING'), (u'Ifslocked', u"It's locked"), (u'nightjust', u'night just'), (u'dayjourney', u'day journey'), (u'Ourjob', u'Our job'), (u'IunCh', u'lunch'), (u'nieCe', u'niece'), (u'giVes', u'gives'), (u'wantto', u'want to'), (u'besttoday', u'best today'), (u'NiCe', u'Nice'), (u'oftravelling', u'of travelling'), (u'oftwo', u'of two'), (u'ALl', u'ALI'), (u'afterparty', u'after-party'), (u'welL', u'well.'), (u'theirjob', u'their job'), (u"lfhe's", u"If he's"), (u'babyjesus', u'baby Jesus'), (u'shithousejohn', u'shithouse John'), (u'jesus', u'Jesus'), (u'withjesus', u'with Jesus'), (u'Gojoin', u'Go join'), (u'Adaughter', u'A daughter'), (u'talkwith', u'talk with'), (u'anyjournals', u'any journals'), (u"L'mjewish", u"I'm Jewish"), (u'arejust', u'are just'), (u'soundjust', u'sound just'), (u"ifl'm", u"if I'm"), (u'askyou', u'ask you'), (u'ordinarywoman', u'ordinary woman'), (u'andjunkies', u'and junkies'), (u'isjack', u'is Jack'), (u'helpyou', u'help you'), (u'thinkyou', u'think you'), (u'Lordjesus', u'Lord Jesus'), (u'injuvy', u'in juvy'), (u'thejets', u'the jets'), (u'ifGod', u'if God'), (u'againstjewish', u'against Jewish'), (u'ajunkie', u'a junkie'), (u'dearjesus', u'dear Jesus'), (u'hearyour', u'hear your'), (u'takeyears', u'take years'), (u'friendjean', u'friend Jean'), (u'Fatherjohn', u'Father John'), (u'youjean', u'you Jean'), (u'hearyou', u'hear you'), (u'Ifshe', u'If she'), (u"didn'tjust", u"didn't just"), (u'IfGod', u'If God'), (u'notjudge', u'not judge'), (u'andjudge', u'and judge'), (u'OKBY', u'Okay'), (u'myjourney', u'my journey'), (u'yourpremium', u'your premium'), (u"we'rejust", u"we're just"), (u'Iittlejokes', u'little jokes'), (u'Iifejust', u'life just'), (u'Andjust', u'And just'), (u'ofThe', u'of The'), (u'lifejust', u'life just'), (u'AIice', u'Alice'), (u'lnternationalAirport', u'International Airport'), (u'yourbody', u'your body'), (u'DollarBaby', u'Dollar Baby'), (u'ofjonesing', u'of jonesing'), (u'yourpanties', u'your panties'), (u'offforme', u'off for me'), (u'pantyparty', u'panty party'), (u'everhit', u'ever hit'), (u'theirhomes', u'their homes'), (u'AirForce', u'Air Force'), (u'yourhead', u'your head'), (u'betterbe', u'better be'), (u'myparty', u'my party'), (u'disasterlockdown', u'disaster lockdown'), (u"Ifpot's", u"If pot's"), (u'ifmy', u'if my'), (u'yourmoney', u'your money'), (u'Potterfan', u'Potter fan'), (u'Hermionejust', u'Hermione just'), (u'ofourshit', u'of our shit'), (u'showyou', u'show you'), (u'answernow', u'answer now'), (u'theirsjust', u'theirs just'), (u'BIackie', u'Blackie'), (u'SIeep', u'Sleep'), (u'foryour', u'for your'), (u'oryour', u'or your'), (u'forArthur', u'for Arthur'), (u'CIamp', u'Clamp'), (u'CIass', u'Class'), (u'CIose', u'Close'), (u'GIove', u'Glove'), (u'EIIen', u'Ellen'), (u'PIay', u'Play'), (u'PIace', u'Place'), (u'EIgyn', u'Elgyn'), (u'AIert', u'Alert'), (u'CIaus', u'Claus'), (u'CIimb', u'Climb'), (u"military'II", u"military'll"), (u'anylonget', u'any longer'), (u'yourlife', u'your life'), (u"Yourbitch'IIgetyou", u"Your bitch'll get you"), (u'yourdick', u'your dick'), (u'Tellyourbitch', u'Tell your bitch'), (u'rememberyou', u'remember you'), (u'newface', u'new face'), (u'Butyou', u'But you'), (u"don'tyou", u"don't you"), (u'yourlives', u'your lives'), (u'Iovedher', u'loved her'), (u'reallydid', u'really did'), (u'firstperson', u'first person'), (u'mybest', u'my best'), (u'Justgive', u'Just give'), (u'AIong', u'Along'), (u'atyourbody', u'at your body'), (u'myhands', u'my hands'), (u'sayhe', u'say he'), (u'mybooty', u'my booty'), (u'yourbooty', u'your booty'), (u'yourgirl', u'your girl'), (u'yourlegs', u'your legs'), (u'betterifthey', u'better if they'), (u'manybeautiful', u'many beautiful'), (u'contactpolice', u'contact police'), (u'numberbelow', u'number below'), (u'biggestproblem', u'biggest problem'), (u'Itgave', u'It gave'), (u'everybodykind', u'everybody kind'), (u'theyhad', u'they had'), (u'knowherlast', u'know her last'), (u'herhearing', u'her hearing'), (u'othermembers', u'other members'), (u'BIing', u'Bling'), (u'CIyde', u'Clyde'), (u'foundguilty', u'found guilty'), (u'fouryears', u'four years'), (u'countyjail', u'county jail'), (u'yearin', u'year in'), (u'theirrole', u'their role'), (u'manybottles', u'many bottles'), (u"can'tpronounce", u"can't pronounce"), (u'manybowls', u'many bowls'), (u'ofthatgreen', u'of that green'), (u'manyjoyrides', u'many joyrides'), (u'Superrich', u'Super rich'), (u'Iprefer', u'I prefer'), (u'Theymust', u'They must'), (u'whatyou', u'what you'), (u"I'IIjump", u"I'll jump"), (u'nobodyknow', u'nobody know'), (u'neverknew', u'never knew'), (u'EIectronica', u'Electronica'), (u'AIarm', u'Alarm'), (u'getyourman', u'get your man'), (u'sayyou', u'say you'), (u'getyour', u'get your'), (u'Fuckyou', u'Fuck you'), (u'Whyyou', u'Why you'), (u'butyoujust', u'but you just'), (u'forgetyourname', u'forget your name'), (u'Whatyou', u'What you'), (u"Co/'ncidenta//y", u'Coincidentally'), (u'GIad', u'Glad'), (u'RachelMarron', u'Rachel Marron'), (u"She'llgive", u"She'll give"), (u'presidentialsuite', u'presidential suite'), (u'andgentlemen', u'and gentlemen'), (u'willnot', u'will not'), (u'ourproducers', u'our producers'), (u"Ifshe's", u"If she's"), (u'CIock', u'Clock'), (u'Ishould', u'I should'), (u"I'llgo", u"I'll go"), (u'maypass', u'may pass'), (u'andprotecting', u'and protecting'), (u'BIessed', u'Blessed'), (u'CIean', u'Clean'), (u'SIave', u'Slave'), (u'AIi', u'Ali'), (u'AIIah', u'Allah'), (u'AIIahu', u'Allahu'), (u'CIick', u'Click'), (u'BIast', u'Blast'), (u'AIlah', u'Allah'), (u'SIow', u'Slow'), (u'theirpolicies', u'their policies'), (u'Orperhaps', u'Or perhaps'), (u'ofsex', u'of sex'), (u'forpleasure', u'for pleasure'), (u'ourpower', u'our power'), (u'Yourpiece', u'Your piece'), (u'Offioers', u'Officers'), (u'oondesoended', u'condescended'), (u'myseif', u'myself'), (u"let'sjust", u'let\u2019s just'), (u'yourway', u'your way'), (u'An9TY', u'Angry'), (u'ourjourney', u'our journey'), (u'LuCY', u'Lucy'), (u"\\'m", u'I\u2019m'), (u'CEDR/C', u'CEDRIC'), (u'lsaac', u'Isaac'), (u'FIy', u'Fly'), (u'Ionger', u'longer'), (u'Iousy', u'lousy'), (u'Iosing', u'losing'), (u"They'II", u"They'll"), (u'yourpaws', u'your paws'), (u'littie', u'little'), (u"It'lljust", u"It'll just"), (u'AIso', u'Also'), (u'Iisten', u'listen'), (u'suPPosed', u'supposed'), (u'somePIace', u'someplace'), (u'exPIain', u'explain'), (u'Iittle', u'little'), (u'StoP', u'Stop'), (u'AIways', u'Always'), (u'Iectures', u'lectures'), (u'Iow', u'low'), (u'Ieaving', u'leaving'), (u'Ietting', u'letting'), (u'Iistening', u'listening'), (u'Iecture', u'lecture'), (u'Iicking', u'licking'), (u'Iosses', u'losses'), (u'PIeased', u'Pleased'), (u'ofburglaries', u'of burglaries'), (u"He'sjust", u"He's just"), (u'mytrucktoo', u'my truck too'), (u'nowwhat', u'now what'), (u'yourfire', u'your fire'), (u"herwhat's", u"her what's"), (u'hearthat', u'hear that'), (u'oryou', u'or you'), (u'preferjournalist', u'prefer journalist'), (u'CIaw', u'Claw'), (u'Ifour', u'If our'), (u'lron', u'Iron'), (u"It'syour", u"It's your"), (u'lfstill', u'If still'), (u'forjoining', u'for joining'), (u'foryears', u'for years'), (u'Ifit', u'If it'), (u'notjump', u'not jump'), (u'ourproblem', u'our problem'), (u'yourprofile', u'your profile'), (u'ifJanine', u'if Janine'), (u'forpreventative', u'for preventative'), (u'whetherprotest', u'whether protest'), (u'Ifnot', u'If not'), (u'ourpeople', u'our people'), (u'offmy', u'off my'), (u'forproviding', u'for providing'), (u'hadjust', u'had just'), (u'nearyou', u'near you'), (u'whateveryou', u'whatever you'), (u'hourputs', u'hour puts'), (u'timejob', u'time job'), (u'overyour', u'over your'), (u'orpermanent', u'or permanent'), (u'createjobs', u'create jobs'), (u"I'vejust", u"I've just"), (u'peoplejobs', u'people jobs'), (u'dinnerpail', u'dinner pail'), (u'hasjumped', u'has jumped'), (u'theirprivacy', u'their privacy'), (u'AIl', u'All'), (u'ofserious', u'of serious'), (u'yourprofessional', u'your professional'), (u'poiitical', u'political'), (u'tojump', u'to jump'), (u'iives', u'lives'), (u'eiections', u'elections'), (u'militaryjuntas', u'military juntas'), (u'nojoke', u'no joke'), (u'yourpresidency', u'your presidency'), (u'ofmilitaryjuntas', u'of military juntas'), (u'Ourproposal', u'Our proposal'), (u'LeBIanc', u'LeBlanc'), (u'KIaus', u'Klaus'), (u'yourpussy', u'your pussy'), (u'lNTERVIEWER', u'INTERVIEWER'), (u'lNAUDIBLE', u'INAUDIBLE'), (u'SImpsons', u'Simpsons'), (u'anotherjob', u'another job'), (u'lfthere', u'If there'), (u'descentinto', u'descent into'), (u'ofthathere', u'of that here'), (u'ofway', u'of way'), (u'yourseat', u'your seat'), (u'allyou', u'all you'), (u'Allyou', u'All you'), (u'yourass', u'your ass'), (u'Yourbutt', u'Your butt'), (u'iustiiggle', u'just jiggle'), (u'iust', u'just'), (u'CSi', u'CSI'), (u'affernoon', u'afternoon'), (u'orpersecution', u'or persecution'), (u'theirpetty', u'their petty'), (u'Fourpercent', u'Four percent'), (u'fourpercent', u'four percent'), (u'willjust', u'will just'), (u"Ifyou're", u"If you're"), (u'ourplanet', u'our planet'), (u'lsolation', u'Isolation'), (u'yourprimitive', u'your primitive'), (u'yourplanet', u'your planet'), (u'matteryour', u'matter your'), (u'Yourplace', u'Your place'), (u'andjustice', u'and justice'), (u'anotherpart', u'another part'), (u'confiict', u'conflict'), (u'growingjeopardy', u'growing jeopardy'), (u'hasjust', u'has just'), (u'havejust', u'have just'), (u'herselfinto', u'herself into'), (u'ifnecessary', u'if necessary'), (u"we'vejust", u"we've just"), (u'tojust', u'to just'), (u'yourjudgment', u'your judgment'), (u'yourjeans', u'your jeans'), (u'Youjust', u'You just'), (u'ajanitor', u'a janitor'), (u'FIattery', u'Flattery'), (u'myjournal', u'my journal'), (u'myjudgment', u'my judgment'), (u'offofmy', u'off of my'), (u'offyour', u'off your'), (u'ofgood', u'of good'), (u'ofguilty', u'of guilty'), (u'ofhaving', u'of having'), (u'ofheart', u'of heart'), (u'ofhonor', u'of honor'), (u'oflove', u'of love'), (u'ofmankind', u'of mankind'), (u'ofmany', u'of many'), (u'ofnormal', u'of normal'), (u'ofpeople', u'of people'), (u'ofpower', u'of power'), (u'ofsuch', u'of such'), (u'peoplejust', u'people just'), (u"They'rejust", u"They're just"), (u'tojeopardize', u'to jeopardize'), (u'Yourplaces', u'Your places'), (u'yourposition', u'your position'), (u'yourselfa', u'yourself a'), (u'yourselfright', u'yourself right'), (u'thejob', u'the job'), (u'thejanitors', u'the janitors'), (u'alljust', u'all just'), (u"forAmerica's", u"for America's"), (u'Forpencils', u'For pencils'), (u'forpondering', u'for pondering'), (u'handwrittenjournals', u'handwritten journals'), (u'herpursuit', u'her pursuit'), (u'ofjust', u'of just'), (u'oflanding', u'of landing'), (u'oflife', u'of life'), (u'outjust', u'out just'), (u'Thejoke', u'The joke'), (u'ourpatient', u'our patient'), (u"oryou're", u"or you're"), (u'ofyourself', u'of yourself'), (u'poweryour', u'power your'), (u'Ofmy', u'Of my'), (u'EIlen', u'Ellen'), (u"Don'tget", u"Don't get"), (u'tellme', u'tell me'), (u'ofdecision', u'of decision'), (u'itgoing', u'it going'), (u'artificialgravity', u'artificial gravity'), (u'shouldknow', u'should know'), (u"Hasn'tgot", u"Hasn't got"), (u'thirdjunction', u'third junction'), (u'somebodypicks', u'somebody picks'), (u'Willyou', u'Will you'), (u"can'tget", u"can't get"), (u'BuZZes', u'Buzzes'), (u"wouldn'tyou", u"wouldn't you"), (u'Wellbelow', u'Well below'), (u"What'dyou", u"What'd you"), (u'decipheredpart', u'deciphered part'), (u"they'llknow", u"they'll know"), (u"ifit's", u"if it's"), (u'ornot', u'or not'), (u'myposition', u'my position'), (u'lndistinct', u'Indistinct'), (u'anybiscuits', u'any biscuits'), (u'Andifyou', u'And if you'), (u'lfwe', u'If we'), (u'yourarm', u'your arm'), (u'lnteresting', u'Interesting'), (u'findit', u'find it'), (u"it'llstart", u"it'll start"), (u'holdit', u'hold it'), (u'ofkilling', u'of killing'), (u'Howyou', u'How you'), (u'lnhales', u'Inhales'), (u'lgot', u'I got'), (u'CIip', u'Clip'), (u"what'II", u"what'll"), (u"road'II", u"road'll"), (u'girI', u'girl'), (u'LIoyd', u'Lloyd'), (u'BIake', u'Blake'), (u'reaI', u'real'), (u'Foryour', u'For your'), (u'yourpublic', u'your public'), (u'LAst', u'Last'), (u'h is', u'his'), (u'He)\u2019', u'Hey'), (u'Ls', u'Is'), (u"al'", u'at'), (u"wail'", u'wait'), (u"III'll", u"I'll"), (u'forthis', u'for this'), (u'Yea h', u'Yeah'), (u'a re', u'are'), (u'He)"', u'Hey'), (u"pan'", u'part'), (u'yea h', u'yeah'), (u'Tun', u'Run'), (u"He)'", u'Hey'), (u"he)'", u'hey'), (u"I'11", u"I'll"), (u'he)"', u'hey'), (u" 're ", u"'re ")]), + 'pattern': u'(?um)(\\b|^)(?:\\$COff\\$|\\$ergei|\\$\\\'llOp|\\/\\\'\\/\\/|\\/\\\'\\/I|\\/ennifer|\\/got|\\/have|\\/hope|\\/just|\\/love|\\/\\\'m|\\/mmerse|\\/nsu\\/ts|\\/ong|\\/ook|\\/t\\\'s|\\/\\\'ve|\\\\\\/\\\\\\/e\\\'d|\\\\\\/\\\\\\/e\\\'re|\\\\\\/\\\\\\/e\\\'ve|\\\\\\/\\\\\\/hat|\\\\\\/\\\\\\/here\\\'d|\\\\\\/\\\\\\/hoo|\\\\\\/\\\\\\/hy|\\\\\\/\\\\\\/hy\\\'d|\\\\\\/\\\\le\\\'re|\\\\\\/Ve|\\\\Ne\\\'re|\\\\Nhat\\\'s|\\\\Nhere\\\'s|\\|\\\'mjust|\\\xa4ff|\\\xa4Id|\\\xa4Ids|\\\xa4n|\\\xa4ne|\\\xa4nly|\\\xa4pen|\\\xa4r|\\\xa4rder|\\\xa4ther|\\\xa4ur|\\\xa4ut|\\\xa4ver|\\\xa4wn|\\\u20acV\\\u20acI\\\'y|0\\\'clock|0f|0fEngland|0fft0|0l\\/er|0n|0ne|0ne\\\'s|0r|0rders|0thers\\\'|0ut|0utlaw\\\'s|0utlaws\\\'|0ver|13oos|18oos|195os|1et\\\'s|1o|1oo|1ooth|1oth|2E\\_|2\\\'IST|2\\\'Ist\\_|2o|2oth|3o|3oth|4o|4os|4oth|50rry|5o|5oth|6o|6os|\\\'6os|6oth|7o|\\\'7os|7oth|8o|\\\'8os|8oth|9\\/aim|9o|9oth|9UnShQt|a\\/\\/|a\\/bum|a\\/so|A\\/ways|abcut|aboutjoining|aboutposh|aboutus|aboutyou|accldent|Acool|afier|affraid|Afriend|afterall|afterthe|afulcrum|Afunny|aga\\/nst|ahsolutes|AI\\_I\\_|AIien|AIex|AII|AIIan|AIIow|AIive|ain\\\'tgotno|Ain\\\'tgotno|airstrike|AIVIBULANCE|ajob|ajockey\\_|ajoke|Ajoke|ajoking|al\\/|al\\/en|alittle|allgasp|alljustforshow|aln\\\'t|alot|Alot|An5wer|Andit|Andit\\\'s|andl|andlaughs|andleave|andthe|andyou|Andyou|ANNOUNC\\/NG|anotherstep|ANSWER\\/NG|answerwhat|antiquejoke|anyhcdy\\\'s|Anyidea|anyone\\\'s\\_|apejust|ARABlc|aren\\\'t\\_|arerl\\\'t|Arnsteln\\\'s|atleast|Atough|Awhole|awoman|Awoman|barelytalked|bcat|Bcllvla|bcmb|bcmbs|be\\/\\/y|becuase|Beep\\/\\\'ng|bejumpy|besldes|bestfriend|bestguy|bestjob|BIack|BIess|bigos\\_\\_\\_|BIame|BIind|BIood|BIue|BLOVVS|blowholel|blt|Bo99|bodiedyoung|breakf\\\xe9wtl|bulldozlng|butjust|butl|Butl|butljust|Butljustcan\\\'tgetenough|Butyou\\\'re|buythem|buyyou|byjust|bythe|C\\/latter\\/\\\'\\/7g|ca\\/\\/\\/ng|ca\\/I|call\\/ng|callyou|can\\*t|can\\\'i|can\\\'I|canlgetyou|cannotchange|cannut|can\\\'T|can\\\'t\\_|can\\\'tjust|can\\\'tletgo|Car0l|Carhorn|carrled|Ccug|Ccugs|Ccver|cellularchange|cff|cfycu|cfycur|Ch\\/rping|chaletgirl|changejobs|Charliejust|Chatter\\/\\\'rtg|CHATTERWG|Chequeredlove|cHIRPINcs|chjldishness|chlldrcn|chlldren|chocolatte|Cho\\/r|cHucKl\\_Es|CIark|CIear|circumcised\\_|ckay|cl\\_osEs|CLATTERWG|cn|cne|cnes|Coincidenta\\/\\/y|COm\\\u20ac|comp\\/etey|complainingabout|coms|cond\\/lion|confdence|conhrmed|connrm|Consecutivelyl|COUGH5|CouGHING|couIdn\\\'t|couldjust|couldn\\\'T|couldn\\\'tjust|Couldyou|crappyjob|CRAsHING|crder|Crowdcheers|Cruoially|cther|cuuld|cver|d\\/\\\'dn\\\'t|d\\/squietude|D\\\xa4esn\\\'t|d\\\xa4n\\\'i|d\\\xa4n\\\'t|d\\\xb09|d0|D0|D0asn\\\'t|Dad\\\'\\/\\/|dairyjust|Dar\\/\\/ng|dc|Dcbby|dccsn\\\'t|dcctcr|Dces|dcgs|dcing|dcn\\\'I|dcn\\\'t|Dcn\\\'t|dcughnut|declslons|deedhas|Dehnitely|desewes|desperate\\/\\\xbby|D\\\ufb02nk|DIAl\\_lNcs|didn\\\'\\!|didnt|didn\\\'T|dIdn\\\'t|didn\\\'t\\_|didrft|didrl\\\'t|didyou|divorcing\\_|dld|dldn\\\'t|dlfflcull|dlg|dlsobeyed|doasn\\\'t|Doasn\\\'t|doctoh|Doctor\\_\\_\\_tell|doesnt|doesn\\\'T|doesri\\\'t|doesrt|Doesrt|doit|dojust|don\\*t|donejobs|don\\\'i|don\\\'l|Don\\\'l|Donllook|dont|don\\\'T|don\\\'tcare|don\\\'tjoke|Don\\\'tjudge|don\\\'tjust|Don\\\'tjust|Don\\\'tlet|don\\\'tlhink|don\\\'tpush|Don\\\'tyou|DonWlook|Dooropens|doorshuts|dothat|dothis|Drinkthis|dumbass|dumbto|dun\\\'t|E\\/\\/e|E9YPt|ea\\/\\\'t\\/7|eart\\/7|efi\\\'\\/\\\'c\\/\\\'ent|EN\\<3LlsH|Enjoythe|Erv\\\\\\/an|Erv\\\\\\/an\\\'s|etemity|ev\\/I|eve\\/yone|even\\/body\\\'s|eversay|Everymonth|everythings|Everythirlg\\\'s|Everythlng\\\'s|Everytime|Exac\\\ufb02y|ExacUy\\_|excitedshrieking|ExcLAllvls|exploatation|expreusion|fairthat|Fathef|fatherfigure|FBl|fcrebcdlng|fcreverjudges|fcund|feeleverything|feelsweet|fiam\\/\\\'\\/y|\\\ufb01ngernail|finishedjunior|FIynn|flll|flra|Flylng|Fnends|fo\\/low|fonzvard|fora|Fora|forajob|forAmerica|forNew|forone|forso|Forsuch|forsunburns|forthe|Foryears|foryou|Foudeen|Fou\\\ufb02een|FourSeasons|fr\\/ends|freezerfood|F\\\xfchrerfeels|furthernotice|furyou|G0|g0in9|gamlenias|GAsPING|gc|gcing|gcnna|Gcnna|gct|Gct|genercsity|generosityn|getjust|g\\\ufb02ing|gi\\\ufb02friend|gir\\/|gir\\/s\\\'boarding|giris|gLlyS|glum\\_|gnyone|golng|goodboyand|goodjob|gOt|gotjumped|gotmyfirstinterview|grandjury|greatjob|Greatjobl|grinco|GRoANING|GRUNUNG|gu|gunna|guyjumped|guyjust|gUyS|\\_H6Y\\-|H\\\u20acY|H0we\\\xb7ver|halftheir|hapPY|hasrt|Hasrt|haven\\\'tspokerl|hcle|hcme|hcmes|hcpe|hctel|hcurs|Hcw|he\\/ps|hearjokestonight|hearme|Hefell|he\\\'II|He\\\'II|HeII0|He\\\'Il|Hejust|He\\\'lI|HelIo|hellc|HellO|herboyfr\\/end|herflesh|herfollov\\\\\\/ed|herjob\\_|HerrSchmidt|herwith|HeY\\\xb7|HeyJennifer|hiddsn|hisjunk|Hitlershare|Hlneed|Hnally|Hnishing|HOId|hOIes|HONMNG|honorthe|honoryou|honoryour|Hov\\\\\\/\\\'s|Hov\\\\\\/\\\'S|HovvLING|howit|HoW\\\'s|howto|Hs\\\'s|hurtyou|I\\/erilj\\/|I\\/fe|I\\\\\\/I|I\\\\\\/Ian|I\\\\\\/Iathies|I\\\\\\/Ie|I\\\\\\/Iommy|I\\\\\\/Ir|I\\\\\\/Ir\\.|I\\\\\\/ly|I3EEPING|I3LARING|Iacings|Iaid|Iam|Iand|Ianding|Iast|Iate|Icad|Icading|Ican|Iccked|Icng|Icsing|Icslng|Idid|Ididn\\\'t|Ido|Idon\\\'i|Idon\\\'t|Idon\\\'tthink|I\\\'E\\\'\\$|Ieamed|Ieapt|Iearned|Ieast|Ieave|Ied|Ieft|Ieg\\\'s|Iess|Iet|Iet\\\'s|Iet\\\'sjust|if\\/just|Ifear|Ifeared|Ifeel|ifI\\\'\\|\\||ifI\\\'d|ifI\\\'II|ifI\\\'ll|ifI\\\'m|Ifinally|ifI\\\'ve|ifl|Iforgot|Ifound|ifshe|ifthat\\\'s|ifthe|Ifthe|ifthere\\\'s|Ifthey|ifwe|Ifwe|Ifycu|ifyou|Ifyou|ifyuu|Iget|Igot|Igotta|Igotyou|Iguess|Iguessljust|Ihad|Ihat\\\'s|Ihave|Iheard|ihere\\\'s|ihey\\\'ve|Ihope|ii\\/Iary|ii\\/Ir|ii\\/Ir\\.|ii\\/love|Iife|I\\\'II|Iike|I\\\'Il|Iine|iirst|ii\\\'s|Ii\\\'s|Iiterallyjumped|Ijoined|Ijust|Iknew|Iknow|Ile|Ileft|I\\\'lldo|I\\\'llmake|Ilons|Ilove|I\\\'mjust|Inconceivablel|infact|Infact|in\\\ufb02uence|infront|injust|insc\\\ufb01p\\\ufb01ons|insolencel|intc|internationaljudges|inthe|Iockdown|Iong|Iongships|Iook|Iookjust|Iooklng|Iooks|Ioose|Iord\\\'s|Iose|Ioser|Ioss|Iost|Iot|Iot\\\'s|Iousyjob|Iove|Ioves|Iowlife|Ipaid|Iquit|Ireallythinkthis|I\\\'rn|Isaw|Isayt\\/1e|isjust|isn\\\'i|isn\\\'t\\_|Isthis|Istill|Istumblod|Itake|itdown|Iteach|Itfeels|ithave|Ithink|Ithinkthat|Ithinkthis|Ithinkyou\\\'re|Ithlnk|Ithoguht|Ithought|Ithoughtl|it\\\'II|It\\\'II|it\\\'Il|It\\\'Il|itin|itjust|Itjust|it\\\'lI|It\\\'lI|It\\\'llhappen|it\\\'lljust|Itold|Itook|itout|it\\\'S|it\\\'sjinxed|it\\\'sjust|It\\\'sjust|itso|Ittends|Itwasn\\\'t|Iuckier|IV\\|oney|IV\\|oney\\\'s|I\\\'va|I\\\'Ve|IVIan|IVIAN|IVIarch|IVIarci\\\'s|IVIarko|IVIe|IVIine\\\'s|IVImm|IVIoney|IVIr\\.|IVIrs|IVIuch|IVIust|IVIy|IVlacArthur|IVlacArthur\\\'s|IVlcBride|IVlore|IVlotherfucker\\_|IVlr|IVlr\\.|IVlr\\_|IVlust|IVly|Iwake|Iwant|Iwanted|Iwas|Iwasjust|Iwasjustu|Iwill|Iwish|Iwon\\\'t|Iworked|Iwould|jalapeno|Jaokson|Jascn|jcke|jennifer|joseph|jsut|Jumpthem|jusi|jusl|justjudge|justleave|Justletgo|kidsjumped|kiokflip|knowjust|knowthat|knowthis|knowwhat|knowyet|knowyourlove|korean|L\\/ght|L\\/kes|L\\\\\\/Ianuela|L\\\\\\/Ianuelal|l\\\\\\/Iauzard|l\\\\\\/I\\\xe9lanie|L\\\\\\/I\\\xe9lanie|l\\\\\\/Iom|l\\\\\\/Iommy|l\\\\\\/Ir|l\\\\\\/Ir\\.|l\\\\\\/Is|l\\\\\\/ly|l\\_AuGHING|l\\\u2018m|Laml6|Lcad|lcan|lcan\\\'t|lcarl\\\'t\\_|Lcve|l\\\'d|L\\\'d|ldid|Ldid|ldiot|L\\\'djump|ldon\\\'t|Ldon\\\'t|Lefs|Let\\\'sjust|lf|Lf|lfeelonelung|lfthey|lfyou|Lfyou|lfyou\\\'re|lget|lgive|Li\\/0\\/Academy|li\\/lr\\.|ligature\\_\\_\\_|l\\\'II|l\\\'Il|ljust|Ljust|ll\\/Iommy\\\'s|ll\\/lajor|Ll\\/lajor|ll\\/layans|l\\\'lI|l\\\'ll|L\\\'ll|l\\\'lljust|L\\\'lltake|llte|l\\\'m|L\\\'m|Lmean|l\\\'mjust|ln|lN|lNAuDll3LE|LNAuDll3LE|LNDlsTINcT|lneed|lostyou|Loudmusic|lraq|lRA\\\'s|Lrenka|Lrn|lRS|lsabella|lsn\\\'t|Lsn\\\'t|Lst\\\'s|lsuppose|lt|ltake|ltell|lthink|Lthink|lthink\\_\\_\\_|lt\\\'II|lt\\\'Il|ltjammed\\_|lt\\\'ll|ltold|lt\\\'s|lT\\\'S|Lt\\\'S|Lt\\\'sjust|lv\\\\\\/asn\\\'t|l\\\'ve|L\\\'ve|lVIan|lVIcHenry|lVIr\\.|lVlacArthur|LVlore|lVlr|lVlr\\.|lvluslc|lVlust|LVly|lwaited|lwamoto|lwant|lwanted|lwas|lwill|lwon\\\'t|lworked|lwould|lwould\\\'ve|lx\\/Iorning|M\\/dd\\/e|m\\/g\\/7ty|MACH\\/NE|MacKenz\\/e|majorjackpot|majormuscle|Manuela\\_|maste\\/y|Masturhate|Mattei\\_|mayjust|mbecause|McCa\\/Iister|McCallisler|Mccallister|Mccallisters|mcm\\\'s|mcney|mcral|mcre|mcve|mejust|Mexioo|mi\\/\\/\\<|misfartune|Ml6|Mlnd|Mock\\/\\\'ngbl\\\'rd|mOI\\\'\\\u20ac|Mom\\_|monkeyback|move\\_\\_\\_l|moveto|mustknock|Myheart|myjch|myjet|myjob|Myjob|myjob\\\'s|mylife|Mynew|myown|mypants|myselli|Myshoes|mysong|mytemper|mythumb|Myworld|N0|narne|Natians|naTve|nc|Nc|ncne|Ncrth|ncw|Ncw|needyou|neighboun|neverfound|neverthere|neverv\\\\\\/ill\\_|NewJersey|newjob|newjobs|nextdoor|Nighw|nilios|Nlagnificence|Nlakes|Nlalina|Nlan|Nlarch|Nlarine|Nlarion|Nlarry|Nlars|Nlarty|Nle|Nleet|Nlen|Nlom|Nlore|Nlornin|Nlother|Nlr|Nlr\\.|Nlrs|Nluch|nojurisdiction|noone|Noone|not\\ judging|notgoing|notjunk|Notjunk|notjust|notsure|novv|Nowjust|Nowthat\\\'s|Numbertwo|oan\\\'t|oan\\\'tjust|objecl|occultpowerand|Ocps|ofa|ofajudge|ofall|Ofall|ofBedford|ofcourse|Ofcourse|ofeach|ofeither|Offioer\\\'s|ofFrance|offreedom|offthe|offthis|offto|offun|ofguy|Ofhce|ofhis|ofHis|ofhoneybees|ofit|ofjam|OFJOAN|ofjoy|ofjunior|ofme|ofmead|ofmicroinjections|ofmy|ofNew|ofNorris\\\'|ofopinions|ofour|ofpeopla|ofthat|ofthe|Ofthe|oftheir|ofthem|ofthem\\\'s|ofthemselves|ofthere|ofthese|ofthings|ofthis|ofthlngs|ofthose|ofuse|ofwashington|ofyou|ofyour|OId|OIsson|Ok3Y|okaY|OkaY|OKaY|OKGY|Ol\\<|oldAdolfon|onboard|onIy|onIything|onJanuaw|onlyjust|Onyinal|oomprise|oonstitution|oouldn\\\'t|oould\\\'ve|oousin\\\'s|opiimistically|ora|orfall|orglory|orjust|Orjust|Orthat|orwould|Orwould|Othenzvise|our\\ joumey|ourbrave|ourfathers|ourgirlon|Ourgoal|Ourguy|ourj0b\\\'s|Ourj0b\\\'s|ourjobs|ourjob\\\'s|Ourjob\\\'s|ourjoumey|ourphotos|ourv\\\\\\/ay|outlool\\<\\\'s|overme|overthe|overthere|p\\/ace|P\\/ease|p\\_m\\_|P\\\xb0P\\$|PANUNG|pclnt|pclnts|pe0pIe|Perrut\\_|Persona\\/4\\/|Persona\\/y|persors|PIain|PIease|PIeasure|PIus|pleasurlng|POIe|Polynes\\/ans|poorshowing|popsicle|Presidenfs|probablyjust|puIIing|Putyourhand|Qh|QkaY|Qpen|QUYS|\\_QW|r\\/ght|ralnbow|ratherjump|ratherjust|Rcque|rcscucd|rea\\/|readytolaunchu|reaHy|ReaHy|reallyjust|reallymiss|reallytalked|reallythink|reallythinkthis|rememberthem|reoalibrated|retum|rhfluence|rightdown|roadyou|RUMBUNG|s\\/uggikh|S0|S1oW1y|saidyou|sayeverything\\\'s|saynothing|saythat|sc|scientihc|SCREAIVHNG|sCREAlvllNG|SCREAlvllNG|scund|S\\\'EOp|severa\\/parents|sfill|S\\\ufb02ence|shallrise|sHATTERING|shcws|Shdsjust|She\\`s|She\\\u2018II|she\\\'II|She\\\'II|she\\\'Il|Shejust|she\\\'lI|Shoofing|ShOp|shortyears|shou\\/dn|shou\\\ufb01ng|Shou\\\ufb02ng|shouldnt|Shouldrt|shouldrt|Shs\\\'s|SHUDDERWG|Shutup|SIGH\\$|signifcance|Sincc|sistervvill|Skarsg\\\xe9rd|slcsHs|slGHINcs|slGHING|slNGING|slzzLING|smarfest|Smiih|so\\/id|SoBl3lNG|soemtimes|Sojust|soldierl|somethlng|somethlng\\\'s|somez\\\'\\/7\\/ng|somthing|sumthing|sou\\/|SoundofMusic|SP\\/ash|SPEAK\\/NG|speII|speII\\\'s|Spendourtime|sQUA\\\\\\/\\\\\\/KING|StAnton|stealsjeans|StilI|Stilldesperatelyseeking|stlll|sToPs|storyl|Stubbom|su\\/faces|suffocaiing|summerjob|Summerjust|sun\\/ive|superiorman|sur\\\ufb02aces|t\\/ying|T0|T00|ta\\/ks|taiked|talkto|Talkto|talktonight|tampax|tc|tcday|tcrturing|tcuch|te\\/\\/|tearjust|tellsjokes|tellyou|terriers\\_|th\\/nk|THEPASSION|thafs|Thafs|Thai\\\'s|Thal\\\'s|thankyou|Thankyou|thatconverts|thatgoes|that\\\'II|That\\\'II|thatjob|thatjunk|thatjust|thatleads|Thatl\\\'m|that\\\'s\\ just|Thatsand|that\\\'sjust|That\\\'sjust|Thc|theirface|theirfeet|theirfury|thejaw|thejoint|thejudge|thejudges|Thejudges|thejury|Thelook|Therds|There\\\'II|There\\\'Il|There\\\'lI|They\\\'\\/\\\'e|they\\/\\\'II|They\\/re|They\\/\\\'re|they\\\'II|they\\\'Il|theyjust|Theyjust|they\\\'lI|They\\\'lI|theyre|theysay|thinkthat|this\\\'II|thlngs|Thlnkthls|thls|thore\\\'s|Thore\\\'s|Thorjust|thoughtl\\\'dletyou|tnatjust|tnat\\\'s|Tnat\\\'s|Tnere\\\'ll|to\\/\\/et|To\\/\\/S|todayl\\\'d|togelher|togethen|tojoin|tojudge|toldyou|tomorrovv|Tonighfsjust|totake|totalk|tothat|tothe|Towef|Tr\\/ck\\/ing|Traitur|tv\\\\\\/o|tvvelve|Tvvelve|tvventy|Tvventy|tvvo|Tvvo|twc|unconhrmed|underthat|underthe|underthese|underyour|unfilyou|Unfon\\\'unate\\/y|Uninnabited|untilApril|untilyou|upthinking|upto|V\\\\\\/ait\\_\\_\\_|v\\\\\\/as|V\\\\\\/as|V\\\\\\/e|v\\\\\\/eek\\\'s|V\\\\\\/eird\\_|V\\\\\\/ell|V\\\\\\/hat|V\\\\\\/hen\\\'ll|V\\\\\\/ho|v\\\\\\/ho\\\'ll|v\\\\\\/Hoops|v\\\\\\/ho\\\'s|V\\\\\\/ho\\\'s|V\\\\\\/hy|v\\\\\\/ith|v\\\\\\/on\\\'t|V\\\\fith|V\\\\fithin|valedictolian|vcice|ve\\/y|veiy|V\\\xe9ry|versioin|vi\\/ay|visitjails|Viva\\/di\\\'s|vlll|Voil\\\xe1|Voil\\\xe9|vvasjust|VVasn\\\'t|vvay|VVe|VVe\\\'II|VVe\\\'ll|Vvelooked|VVe\\\'re|VVe\\\'ve|VVhat|VVhat\\\'s|VVhat\\\'S|VVhen|\\\'v\\\'Vhere\\\'s|VVhip|vvHooPING|VvHooPING|VVhy|VVill|VVinters|vvlND|w\\\xa4n\\\'t|W9|waht|waierfall|walkjust|wallplant|wannajump|wantyou|Warcontinues|wasjennifer|wasjust|wasrt|Wasrt|wayl|wayround|wclf|wcman|wcmen|wcn\\\'t|wcrse|wculd|We\\/\\/|We\\/came|we\\/come|We\\/come|We\\/I|weekendjust|werert|Werert|we\\\'II|We\\\'II|we\\\'Il|We\\\'Il|wejust|we\\\'lI|We\\\'rejust|We\\\'ro|We\\\'Ve|wh\\/p|Wh\\\xb0ops|Whafs|Whatam|Whatare|Whateverwe|What\\\'II|Whatis|whatjust|Whatl|whatshe|whatwe|Whc\\\'s|Whcse|wHlsPERs|wi\\/\\/|wil\\/|Wil\\/|wilI|willbe|willhire|willneverknow|willyou|wlfe|wlfe\\\'s|wlth|wnat\\\'s|Wno|Wo\\/f|wo\\\ufb02d|WOI\\\'1\\\'t|wondernobody|won\\\'T|won\\\'tanswerme|won\\\'tforget|won\\\'tletitbring|Wo\\\'re|worfd|won\\\'th|won\\\'thwhile|workyou|wouIdn\\\'t|wouldn\\\'\\!|Wouldrt|wr\\/\\\'2\\\'\\/ng|writign|wrcng|wuuld|\\_Yay|Y\\\xa4u\\\'II|Y\\\xa4u\\\'ll|y\\\xa4u\\\'re|Y\\\xa4u\\\'re|y\\\xa4u\\\'ve|Y0|y0LI|y0u\\\'II|Y0u\\\'rc|Y0u\\\'re|Y0u\\\'ve|yaming|yaurparents|ycu|ycu\\\'d|ycur|Ycu\\\'re|Ycursins|YEI\\_I\\_|YELL\\$|yigg\\/mg|Yigg\\/mg|yoLI|yOu|yOU|you\\`re|you\\\'II|You\\\'II|You\\\'Il|youjack|youjoin|Youjoin|youjust|You\\\'lI|youngsterlike|youpick|you\\\'ra|Yourattention|yourautomobile|You\\\'rejustjealous|yourextra|yourfather|yourhand|yourhusband|yourjewelry|yourjob|Yourjob|yourjob\\_|yourjockey|yourjury|yourname|Yourpackage|yourpackage|you\\\'ro|yourpoorleg|yourvveak|you\\\'va|You\\\'va|youWlneversee|yQu|YQu|yQu\\\'\\_7|yummY|yuu|Yuu|Yuu\\\'ve|z\\\'housand|zlPPING|Ifslocked|nightjust|dayjourney|Ourjob|IunCh|nieCe|giVes|wantto|besttoday|NiCe|oftravelling|oftwo|ALl|afterparty|welL|theirjob|lfhe\\\'s|babyjesus|shithousejohn|jesus|withjesus|Gojoin|Adaughter|talkwith|anyjournals|L\\\'mjewish|arejust|soundjust|ifl\\\'m|askyou|ordinarywoman|andjunkies|isjack|helpyou|thinkyou|Lordjesus|injuvy|thejets|ifGod|againstjewish|ajunkie|dearjesus|hearyour|takeyears|friendjean|Fatherjohn|youjean|hearyou|Ifshe|didn\\\'tjust|IfGod|notjudge|andjudge|OKBY|myjourney|yourpremium|we\\\'rejust|Iittlejokes|Iifejust|Andjust|ofThe|lifejust|AIice|lnternationalAirport|yourbody|DollarBaby|ofjonesing|yourpanties|offforme|pantyparty|everhit|theirhomes|AirForce|yourhead|betterbe|myparty|disasterlockdown|Ifpot\\\'s|ifmy|yourmoney|Potterfan|Hermionejust|ofourshit|showyou|answernow|theirsjust|BIackie|SIeep|foryour|oryour|forArthur|CIamp|CIass|CIose|GIove|EIIen|PIay|PIace|EIgyn|AIert|CIaus|CIimb|military\\\'II|anylonget|yourlife|Yourbitch\\\'IIgetyou|yourdick|Tellyourbitch|rememberyou|newface|Butyou|don\\\'tyou|yourlives|Iovedher|reallydid|firstperson|mybest|Justgive|AIong|atyourbody|myhands|sayhe|mybooty|yourbooty|yourgirl|yourlegs|betterifthey|manybeautiful|contactpolice|numberbelow|biggestproblem|Itgave|everybodykind|theyhad|knowherlast|herhearing|othermembers|BIing|CIyde|foundguilty|fouryears|countyjail|yearin|theirrole|manybottles|can\\\'tpronounce|manybowls|ofthatgreen|manyjoyrides|Superrich|Iprefer|Theymust|whatyou|I\\\'IIjump|nobodyknow|neverknew|EIectronica|AIarm|getyourman|sayyou|getyour|Fuckyou|Whyyou|butyoujust|forgetyourname|Whatyou|Co\\/\\\'ncidenta\\/\\/y|GIad|RachelMarron|She\\\'llgive|presidentialsuite|andgentlemen|willnot|ourproducers|Ifshe\\\'s|CIock|Ishould|I\\\'llgo|maypass|andprotecting|BIessed|CIean|SIave|AIi|AIIah|AIIahu|CIick|BIast|AIlah|SIow|theirpolicies|Orperhaps|ofsex|forpleasure|ourpower|Yourpiece|Offioers|oondesoended|myseif|let\\\'sjust|yourway|An9TY|ourjourney|LuCY|\\\\\\\'m|CEDR\\/C|lsaac|FIy|Ionger|Iousy|Iosing|They\\\'II|yourpaws|littie|It\\\'lljust|AIso|Iisten|suPPosed|somePIace|exPIain|Iittle|StoP|AIways|Iectures|Iow|Ieaving|Ietting|Iistening|Iecture|Iicking|Iosses|PIeased|ofburglaries|He\\\'sjust|mytrucktoo|nowwhat|yourfire|herwhat\\\'s|hearthat|oryou|preferjournalist|CIaw|Ifour|lron|It\\\'syour|lfstill|forjoining|foryears|Ifit|notjump|ourproblem|yourprofile|ifJanine|forpreventative|whetherprotest|Ifnot|ourpeople|offmy|forproviding|hadjust|nearyou|whateveryou|hourputs|timejob|overyour|orpermanent|createjobs|I\\\'vejust|peoplejobs|dinnerpail|hasjumped|theirprivacy|AIl|ofserious|yourprofessional|poiitical|tojump|iives|eiections|militaryjuntas|nojoke|yourpresidency|ofmilitaryjuntas|Ourproposal|LeBIanc|KIaus|yourpussy|lNTERVIEWER|lNAUDIBLE|SImpsons|anotherjob|lfthere|descentinto|ofthathere|ofway|yourseat|allyou|Allyou|yourass|Yourbutt|iustiiggle|iust|CSi|affernoon|orpersecution|theirpetty|Fourpercent|fourpercent|willjust|Ifyou\\\'re|ourplanet|lsolation|yourprimitive|yourplanet|matteryour|Yourplace|andjustice|anotherpart|confiict|growingjeopardy|hasjust|havejust|herselfinto|ifnecessary|we\\\'vejust|tojust|yourjudgment|yourjeans|Youjust|ajanitor|FIattery|myjournal|myjudgment|offofmy|offyour|ofgood|ofguilty|ofhaving|ofheart|ofhonor|oflove|ofmankind|ofmany|ofnormal|ofpeople|ofpower|ofsuch|peoplejust|They\\\'rejust|tojeopardize|Yourplaces|yourposition|yourselfa|yourselfright|thejob|thejanitors|alljust|forAmerica\\\'s|Forpencils|forpondering|handwrittenjournals|herpursuit|ofjust|oflanding|oflife|outjust|Thejoke|ourpatient|oryou\\\'re|ofyourself|poweryour|Ofmy|EIlen|Don\\\'tget|tellme|ofdecision|itgoing|artificialgravity|shouldknow|Hasn\\\'tgot|thirdjunction|somebodypicks|Willyou|can\\\'tget|BuZZes|wouldn\\\'tyou|Wellbelow|What\\\'dyou|decipheredpart|they\\\'llknow|ifit\\\'s|ornot|myposition|lndistinct|anybiscuits|Andifyou|lfwe|yourarm|lnteresting|findit|it\\\'llstart|holdit|ofkilling|Howyou|lnhales|lgot|CIip|what\\\'II|road\\\'II|girI|LIoyd|BIake|reaI|Foryour|yourpublic|LAst|h\\ is|He\\)\\\u2019|Ls|al\\\'|wail\\\'|III\\\'ll|forthis|Yea\\ h|a\\ re|He\\)\\"|pan\\\'|yea\\ h|Tun|He\\)\\\'|he\\)\\\'|I\\\'11|he\\)\\"|\\ \\\'re\\ )(\\b|$)'}}, 'fin': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'Katsokaa pa.', u'Katsokaapa.'), (u'Mik!\r\n""e\u201c9ir\xe4\u0131', u'Mik!\r\n-Hengit\xe4!'), (u'Tu lta!', u'Tulta!'), (u'...0I1...', u'...on...'), (u'Ken g\xe4n nauh oja?', u'Keng\xe4nnauhoja?'), (u'k\xe3mmott\xe3V\xe3ll\xe3 mUiStoll\xe3.', u'kammottavana muistona.'), (u'H\xe4n n\xe4ki naisen menev\xe4n\r\nkellarikerroksen ksen asun to o ns\xe4.', u'H\xe4n n\xe4ki naisen menev\xe4n\r\nkellarikerroksen asuntoonsa.'), (u'Min\xe4 etsin k\xe4siini miehen, joka\r\non aurtanutiestradea ja minua:', u'Min\xe4 etsin k\xe4siini miehen, joka\r\non auttanut Lestradea ja minua:'), (u'Huomaa erityisesti\r\npunaisella merkitty "kitoris.', u'Huomaa erityisesti\r\npunaisella merkitty "klitoris".'), (u'Tulkaa, meill\xe4 on\r\nHa va\u0131ji-bileet suihkussa', u'Tulkaa, meill\xe4 on\r\nHavaiji-bileet suihkussa'), (u'Ta rkoitatko ett\xe4\r\nh\xe4net myrkytettiin?', u'Tarkoitatko ett\xe4\r\nh\xe4net myrkytettiin?'), (u'Odotta kaa soittoani\r\nIev\xe4hdyspaikalla.', u'Odottakaa soittoani\r\nlev\xe4hdyspaikalla.'), (u'Nyt kuuntelet, perska rva.', u'Nyt kuuntelet, perskarva.'), (u'Ta patko h\xe4net sitten?', u'Tapatko h\xe4net sitten?'), (u'Seuraa vissa va/oissa.', u'Seuraavissa valoissa.'), (u'A\u0131o\u0131t rapattaa minut.\r\n- En.', u'Aioit tapattaa minut.\r\n- En.'), (u'Todella vaku uttavaa.', u'Todella vakuuttavaa.'), (u'I-le ovat tuolla alhaalla', u'He ovat tuolla alhaalla'), (u'Nainen kuuluu minulle.\r\n- I-I\xe0ivy siit\xe4, ylikasvuinen hyttynen!', u'Nainen kuuluu minulle.\r\n- H\xe4ivy siit\xe4, ylikasvuinen hyttynen!'), (u'I-Ialuatte k\xe4ytt\xe4\xe4 pyh\xe0\xe0 kive\xe4\r\ndynastian aarteen l\xf6yt\xe4miseksi.', u'Haluatte k\xe4ytt\xe4\xe4 pyh\xe0\xe0 kive\xe4\r\ndynastian aarteen l\xf6yt\xe4miseksi.'), (u'Mit\xe4f?', u'Mit\xe4.. ?'), (u'Kuuluuko Hiru ko-klaanista mit\xe4\xe4n?\r\n- Ninjasoturit ovat edell\xe4mme.', u'Kuuluuko Hiruko-klaanista mit\xe4\xe4n?\r\n- Ninjasoturit ovat edell\xe4mme.'), (u'Anteeks\u0131} painoin kai... -', u'Anteeksi, painoin kai... -'), (u'ja Rea! Ho usew\xedves.', u'ja Real Housewives.'), (u'Et halu n n ut Julkkistansseihinkaan.', u'Et halunnut Julkkistansseihinkaan.'), (u'Laard i k\xe4si?', u'Laardik\xe4si?'), (u'Varo kaa!', u'Varokaa!'), (u'N\xe4ytt\xe4v\xe4t k\xf6 tyt\xf6t v\xe4h \xe4n\r\nh uorahtavi m m i lta?', u'N\xe4ytt\xe4v\xe4tk\xf6 tyt\xf6t v\xe4h\xe4n\r\nhuorahtavimmilta?'), (u'Stif... Ier.', u'Stif... ler.'), (u'J u mantsu kka! M it\xe4?', u'Jumantsukka! Mit\xe4?'), (u'Varasin Ch u m bawam ban,', u'Varasin Chumbawamban,'), (u'J u malavita!', u'Jumalavita!'), (u'S', u'Isi...'), (u'Haluan kertoa jotai n', u'Haluan kertoa jotain'), (u'I-Ialuatte', u'Haluatte')]), 'pattern': None}, @@ -54,7 +66,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u" I'", u" l'"), (u" |'", u" l'")]), 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ I\\'|\\ \\|\\')(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'"D\'ac:c:ord."', u'"D\'accord."'), (u'\u201ci QU\xce gagne, qui perd,', u'ni qui gagne, qui perd,'), (u"L'ac:c:ent est mis \r\n \r\n sur son trajet jusqu'en Suisse.", u"L'accent est mis \r\n \r\n sur son trajet jusqu'en Suisse."), (u"C'est la plus gentille chose \r\n \r\n qu'Hitchc:oc:k m'ait jamais dite.", u"C'est la plus gentille chose \r\n \r\n qu'Hitchcock m'ait jamais dite."), (u"Tout le monde, en revanche, qualifie \r\n \r\n Goldfinger d'aventu re structur\xe9e,", u"Tout le monde, en revanche, qualifie \r\n \r\n Goldfinger d'aventure structur\xe9e,"), (u'et le film Shadow of a man \r\n \r\n a lanc\xe9 sa carri\xe8re au cin\xe9ma.', u'et le film <i>Shadow of a man</i> \r\n \r\n a lanc\xe9 sa carri\xe8re au cin\xe9ma.'), (u'En 1948, Young est pass\xe9 \xe0 la r\xe9alisation \r\n \r\n avec One night with you.', u'En 1948, Young est pass\xe9 \xe0 la r\xe9alisation \r\n \r\n avec <i>One night with you</i>.'), (u'Il a construit tous ces v\xe9hicules \r\n \r\n \xe0 C)c:ala, en Floride.', u'Il a construit tous ces v\xe9hicules \r\n \r\n \xe0 Ocala, en Floride.'), (u'Tokyo Pop et A Taxing Woman? Return.', u"Tokyo Pop et A Taxing Woman's Return."), (u'Peter H u nt.', u'Peter Hunt.'), (u'"C\'est bien mieux dans Peau. \r\n \r\n On peut s\ufb02\xe9clabousser, faire du bruit."', u'"C\'est bien mieux dans l\'eau. \r\n \r\n On peut s\'\xe9clabousser, faire du bruit."')]), 'pattern': None}, @@ -64,21 +76,21 @@ 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialLines': {'data': OrderedDict([(u'Ako ej', u'Ako je'), (u'ako ej', u'ako je'), (u'bez svesti', u'bez svijesti'), (u'Bi\u0107u uz', u'Bit \u0107u uz'), (u'bi ja', u'bih ja'), (u'bi la', u'bila'), (u'biti uredu', u'biti u redu'), (u'bi da bude', u'bi biti'), (u'Bi ste', u'Biste'), (u'bilo ko', u'bilo tko'), (u'\u0107e da do\u0111e', u'\u0107e do\u0107i'), (u'Da li \u0107emo', u'Ho\u0107emo li'), (u'da li \u0107u', u'ho\u0107u li'), (u'dali \u0107u', u'ho\u0107u li'), (u'Da li je', u'Je li'), (u'da li je', u'je li'), (u'Da li ste', u'Jeste li'), (u'Da li si', u'Jesi li'), (u'dali si', u'jesi li'), (u'da li \u0107e', u'ho\u0107e li'), (u'dali \u0107e', u'ho\u0107e li'), (u'do srede', u'do srijede'), (u'Dobro ve\u010de', u'Dobra ve\u010der'), (u'Dobro ve\u010der', u'Dobra ve\u010der'), (u'Dobar ve\u010der', u'Dobra ve\u010der'), (u'gdje ide\u0161', u'kamo ide\u0161'), (u'Gdje ide\u0161', u'Kamo ide\u0161'), (u'Gdje sada', u'Kamo sada'), (u'gle ko', u'gle tko'), (u'ho\u0107u da budem', u'\u017eelim biti'), (u'Ho\u0107u da budem', u'\u017delim biti'), (u'ho\u0107u da ka\u017eem', u'\u017eelim re\u0107i'), (u'ho\u0107e\u0161 da ka\u017ee\u0161', u'\u017eeli\u0161 re\u0107i'), (u'ho\u0107e da ka\u017ee', u'\u017eeli re\u0107i'), (u'Izvini se', u'Ispri\u010daj se'), (u'izvini se', u'ispri\u010daj se'), (u'Izvinite me', u'Ispri\u010dajte me'), (u'Izvinite nas', u'Ispri\u010dajte nas'), (u'izvinite nas', u'ispri\u010dajte nas'), (u'Izvinjavamo se', u'Ispri\u010davamo se'), (u'ja bi', u'ja bih'), (u'Ja bi', u'Ja bih'), (u'Jel sam ti', u'Jesam li ti'), (u'Jeli se', u'Je li se'), (u'Jeli sve', u'Je li sve'), (u'Jeli ti', u'Je li ti'), (u'ko je', u'tko je'), (u'ko zna', u'tko zna'), (u'moglo da bude', u'moglo biti'), (u'moje sau\u010de\u0161\u0107e', u'moja su\u0107ut'), (u'mora da bude', u'mora biti'), (u'Moram da idem', u'Moram i\u0107i'), (u'Moramo da idemo', u'Moramo i\u0107i'), (u'mora\u0161 da ide\u0161', u'mora\u0161 i\u0107i'), (u'na ve\u010der', u'nave\u010der'), (u'Na ve\u010der', u'Nave\u010der'), (u'neko ko', u'netko tko'), (u'nedjelju dana', u'tjedan dana'), (u'Ne mogu da verujem', u'Ne mogu vjerovati'), (u'od kako', u'otkako'), (u'Pla\u0161im se', u'Bojim se'), (u'pla\u0161im se', u'bojim se'), (u'pravo u o\u010di', u'ravno u o\u010di'), (u'sa njom', u's njom'), (u'sa tim', u's tim'), (u'sa tom', u's tom'), (u'sa tobom', u's tobom'), (u'Si dobro', u'Jesi li dobro'), (u'Svako ko', u'Svatko tko'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'smeo da', u'smio'), (u'smeli da', u'smjeli'), (u'\u0160to ej', u'\u0160to je'), (u'\u0161to ej', u'\u0161to je'), (u'to j', u'to je'), (u'to ej', u'to je'), (u'To ej', u'To je'), (u'tamo natrag', u'tamo iza'), (u'tamo je natrag', u'tamo je iza'), (u'Tamo je natrag', u'Tamo je iza'), (u'zato sto', u'zato \u0161to'), (u'zna ko', u'zna tko'), (u'znati ko', u'znati tko'), (u'\u017eelim da budem', u'\u017eelim biti'), (u'\u017delim da budem', u'\u017delim biti'), (u'\u017eeli\u0161 da bude\u0161', u'\u017eeli\u0161 biti'), (u'\u017eelim da odem', u'\u017eelim oti\u0107i'), (u'\u017eeli\u0161 da ode\u0161', u'\u017eeli\u0161 oti\u0107i'), (u'\u017eelim da znam', u'\u017eelim znati'), (u'\u017eeli\u0161 da zna\u0161', u'\u017eeli\u0161 znati')]), - 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:Ako\\ ej|ako\\ ej|bez\\ svesti|Bi\\\u0107u\\ uz|bi\\ ja|bi\\ la|biti\\ uredu|bi\\ da\\ bude|Bi\\ ste|bilo\\ ko|\\\u0107e\\ da\\ do\\\u0111e|Da\\ li\\ \\\u0107emo|da\\ li\\ \\\u0107u|dali\\ \\\u0107u|Da\\ li\\ je|da\\ li\\ je|Da\\ li\\ ste|Da\\ li\\ si|dali\\ si|da\\ li\\ \\\u0107e|dali\\ \\\u0107e|do\\ srede|Dobro\\ ve\\\u010de|Dobro\\ ve\\\u010der|Dobar\\ ve\\\u010der|gdje\\ ide\\\u0161|Gdje\\ ide\\\u0161|Gdje\\ sada|gle\\ ko|ho\\\u0107u\\ da\\ budem|Ho\\\u0107u\\ da\\ budem|ho\\\u0107u\\ da\\ ka\\\u017eem|ho\\\u0107e\\\u0161\\ da\\ ka\\\u017ee\\\u0161|ho\\\u0107e\\ da\\ ka\\\u017ee|Izvini\\ se|izvini\\ se|Izvinite\\ me|Izvinite\\ nas|izvinite\\ nas|Izvinjavamo\\ se|ja\\ bi|Ja\\ bi|Jel\\ sam\\ ti|Jeli\\ se|Jeli\\ sve|Jeli\\ ti|ko\\ je|ko\\ zna|moglo\\ da\\ bude|moje\\ sau\\\u010de\\\u0161\\\u0107e|mora\\ da\\ bude|Moram\\ da\\ idem|Moramo\\ da\\ idemo|mora\\\u0161\\ da\\ ide\\\u0161|na\\ ve\\\u010der|Na\\ ve\\\u010der|neko\\ ko|nedjelju\\ dana|Ne\\ mogu\\ da\\ verujem|od\\ kako|Pla\\\u0161im\\ se|pla\\\u0161im\\ se|pravo\\ u\\ o\\\u010di|sa\\ njom|sa\\ tim|sa\\ tom|sa\\ tobom|Si\\ dobro|Svako\\ ko|Svo\\ vreme|Svo\\ vrijeme|smeo\\ da|smeli\\ da|\\\u0160to\\ ej|\\\u0161to\\ ej|to\\ j|to\\ ej|To\\ ej|tamo\\ natrag|tamo\\ je\\ natrag|Tamo\\ je\\ natrag|zato\\ sto|zna\\ ko|znati\\ ko|\\\u017eelim\\ da\\ budem|\\\u017delim\\ da\\ budem|\\\u017eeli\\\u0161\\ da\\ bude\\\u0161|\\\u017eelim\\ da\\ odem|\\\u017eeli\\\u0161\\ da\\ ode\\\u0161|\\\u017eelim\\ da\\ znam|\\\u017eeli\\\u0161\\ da\\ zna\\\u0161)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialLines': {'data': OrderedDict([(u'Ako ej', u'Ako je'), (u'ako ej', u'ako je'), (u'bez svesti', u'bez svijesti'), (u'Bi\u0107u uz', u'Bit \u0107u uz'), (u'bi ja', u'bih ja'), (u'bi la', u'bila'), (u'biti uredu', u'biti u redu'), (u'bi da bude', u'bi biti'), (u'Bi ste', u'Biste'), (u'Bilo ko', u'Bilo tko'), (u'bilo ko', u'bilo tko'), (u'\u0107e da do\u0111e', u'\u0107e do\u0107i'), (u'Da li \u0107e', u'Ho\u0107e li'), (u'Da li \u0107emo', u'Ho\u0107emo li'), (u'Da li \u0107u', u'Ho\u0107u li'), (u'da li \u0107u', u'ho\u0107u li'), (u'dali \u0107u', u'ho\u0107u li'), (u'Da li je', u'Je li'), (u'da li je', u'je li'), (u'dali je', u'je li'), (u'Da li ste', u'Jeste li'), (u'Da li si', u'Jesi li'), (u'dali si', u'jesi li'), (u'da li \u0107e', u'ho\u0107e li'), (u'dali \u0107e', u'ho\u0107e li'), (u'do srede', u'do srijede'), (u'Dobro ve\u010de', u'Dobra ve\u010der'), (u'Dobro ve\u010der', u'Dobra ve\u010der'), (u'Dobar ve\u010der', u'Dobra ve\u010der'), (u'gdje ide\u0161', u'kamo ide\u0161'), (u'Gdje ide\u0161', u'Kamo ide\u0161'), (u'Gdje sada', u'Kamo sada'), (u'gle ko', u'gle tko'), (u'ho\u0107u da budem', u'\u017eelim biti'), (u'Ho\u0107u da budem', u'\u017delim biti'), (u'ho\u0107u da ka\u017eem', u'\u017eelim re\u0107i'), (u'ho\u0107e\u0161 da ka\u017ee\u0161', u'\u017eeli\u0161 re\u0107i'), (u'ho\u0107e da ka\u017ee', u'\u017eeli re\u0107i'), (u'ho\u0107u da \u017eivim', u'\u017eelim \u017eivjeti'), (u'Izvini se', u'Ispri\u010daj se'), (u'izvini se', u'ispri\u010daj se'), (u'Izvinite me', u'Ispri\u010dajte me'), (u'Izvinite nas', u'Ispri\u010dajte nas'), (u'izvinite nas', u'ispri\u010dajte nas'), (u'Izvinjavamo se', u'Ispri\u010davamo se'), (u'ja bi', u'ja bih'), (u'Ja bi', u'Ja bih'), (u'Jel sam ti', u'Jesam li ti'), (u'Jeli se', u'Je li se'), (u'Jeli sve', u'Je li sve'), (u'Jeli ti', u'Je li ti'), (u'ko je', u'tko je'), (u'ko si', u'tko si'), (u'ko ti je', u'tko ti je'), (u'ko te je', u'tko te je'), (u'ko zna', u'tko zna'), (u'mo\u0107i da idemo', u'mo\u0107i i\u0107i'), (u'moglo da bude', u'moglo biti'), (u'moje sau\u010de\u0161\u0107e', u'moja su\u0107ut'), (u'mora da bude', u'mora biti'), (u'moram da budem', u'moram biti'), (u'Moram da idem', u'Moram i\u0107i'), (u'moram da idem', u'moram i\u0107i'), (u'Mora\u0161 da ide\u0161', u'Mora\u0161 i\u0107i'), (u'Moramo da idemo', u'Moramo i\u0107i'), (u'moram da vidim', u'moram vidjeti'), (u'moram da zaboravim', u'moram zaboraviti'), (u'mora\u0161 da zaboravi\u0161', u'mora\u0161 zaboraviti'), (u'mora da zna', u'mora znati'), (u'moram da znam', u'moram znati'), (u'Moram da znam', u'Moram znati'), (u'mora\u0161 da zna\u0161', u'mora\u0161 znati'), (u'mora\u0161 da ide\u0161', u'mora\u0161 i\u0107i'), (u'mo\u017ee da bude', u'mo\u017ee biti'), (u'mo\u017ee\u0161 da bude\u0161', u'mo\u017ee\u0161 biti'), (u'mo\u017ee da di\u0161e', u'mo\u017ee disati'), (u'mo\u017ee\u0161 da dobije\u0161', u'mo\u017ee\u0161 dobiti'), (u'mo\u017eemo da imamo', u'mo\u017eemo imati'), (u'na ve\u010der', u'nave\u010der'), (u'Na ve\u010der', u'Nave\u010der'), (u'ne\u0107e da bude', u'ne\u0107e biti'), (u'ne\u0107e\u0161 da bude\u0161', u'ne\u0107e\u0161 biti'), (u'ne\u0107e\u0161 da po\u017eali\u0161', u'ne\u0107e\u0161 po\u017ealiti'), (u'Neko ko', u'Netko tko'), (u'neko ko', u'netko tko'), (u'neko ne\u0161to', u'netko ne\u0161to'), (u'nedjelju dana', u'tjedan dana'), (u'Ne mogu da verujem', u'Ne mogu vjerovati'), (u'new yor\u0161ki', u'njujor\u0161ki'), (u'nju jor\u0161ki', u'njujor\u0161ki'), (u'od kako', u'otkako'), (u'Pla\u0161im se', u'Bojim se'), (u'pla\u0161im se', u'bojim se'), (u'pravo u o\u010di', u'ravno u o\u010di'), (u'sa njim', u's njim'), (u'sa njima', u's njima'), (u'sa njom', u's njom'), (u'sa tim', u's tim'), (u'sa tom', u's tom'), (u'sa tobom', u's tobom'), (u'sa vama', u's vama'), (u'sam da budem', u'sam biti'), (u'si\u0107i dolje', u'si\u0107i'), (u'Si dobro', u'Jesi li dobro'), (u'Svako ko', u'Svatko tko'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'smeo da', u'smio'), (u'smeli da', u'smjeli'), (u'\u0160to ej', u'\u0160to je'), (u'\u0161to ej', u'\u0161to je'), (u'to j', u'to je'), (u'to ej', u'to je'), (u'To ej', u'To je'), (u'tamo natrag', u'tamo iza'), (u'tamo je natrag', u'tamo je iza'), (u'Tamo je natrag', u'Tamo je iza'), (u'treba da bude', u'treba biti'), (u'u jutro', u'ujutro'), (u'u\u0107i unutra', u'u\u0107i'), (u'vas je lagao', u'vam je lagao'), (u'za uvijek', u'zauvijek'), (u'zato sto', u'zato \u0161to'), (u'zna da bude', u'zna biti'), (u'zna ko', u'zna tko'), (u'znati ko', u'znati tko'), (u'\u017eele da budu', u'\u017eele biti'), (u'\u017eeli da bude', u'\u017eeli biti'), (u'\u017eelio da budem', u'\u017eelio biti'), (u'\u017eelim da budem', u'\u017eelim biti'), (u'\u017delim da budem', u'\u017delim biti'), (u'\u017eeli\u0161 da bude\u0161', u'\u017eeli\u0161 biti'), (u'\u017eelim da idem', u'\u017eelim i\u0107i'), (u'\u017eelim da odem', u'\u017eelim oti\u0107i'), (u'\u017eeli\u0161 da ode\u0161', u'\u017eeli\u0161 oti\u0107i'), (u'\u017eeli\u0161 da u\u0111e\u0161', u'\u017eeli\u0161 u\u0107i'), (u'\u017eelim da umrem', u'\u017eelim umrijeti'), (u'\u017delim da znam', u'\u017delim znati'), (u'\u017eelim da znam', u'\u017eelim znati'), (u'\u017eeli\u0161 da zna\u0161', u'\u017eeli\u0161 znati')]), + 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:Ako\\ ej|ako\\ ej|bez\\ svesti|Bi\\\u0107u\\ uz|bi\\ ja|bi\\ la|biti\\ uredu|bi\\ da\\ bude|Bi\\ ste|Bilo\\ ko|bilo\\ ko|\\\u0107e\\ da\\ do\\\u0111e|Da\\ li\\ \\\u0107e|Da\\ li\\ \\\u0107emo|Da\\ li\\ \\\u0107u|da\\ li\\ \\\u0107u|dali\\ \\\u0107u|Da\\ li\\ je|da\\ li\\ je|dali\\ je|Da\\ li\\ ste|Da\\ li\\ si|dali\\ si|da\\ li\\ \\\u0107e|dali\\ \\\u0107e|do\\ srede|Dobro\\ ve\\\u010de|Dobro\\ ve\\\u010der|Dobar\\ ve\\\u010der|gdje\\ ide\\\u0161|Gdje\\ ide\\\u0161|Gdje\\ sada|gle\\ ko|ho\\\u0107u\\ da\\ budem|Ho\\\u0107u\\ da\\ budem|ho\\\u0107u\\ da\\ ka\\\u017eem|ho\\\u0107e\\\u0161\\ da\\ ka\\\u017ee\\\u0161|ho\\\u0107e\\ da\\ ka\\\u017ee|ho\\\u0107u\\ da\\ \\\u017eivim|Izvini\\ se|izvini\\ se|Izvinite\\ me|Izvinite\\ nas|izvinite\\ nas|Izvinjavamo\\ se|ja\\ bi|Ja\\ bi|Jel\\ sam\\ ti|Jeli\\ se|Jeli\\ sve|Jeli\\ ti|ko\\ je|ko\\ si|ko\\ ti\\ je|ko\\ te\\ je|ko\\ zna|mo\\\u0107i\\ da\\ idemo|moglo\\ da\\ bude|moje\\ sau\\\u010de\\\u0161\\\u0107e|mora\\ da\\ bude|moram\\ da\\ budem|Moram\\ da\\ idem|moram\\ da\\ idem|Mora\\\u0161\\ da\\ ide\\\u0161|Moramo\\ da\\ idemo|moram\\ da\\ vidim|moram\\ da\\ zaboravim|mora\\\u0161\\ da\\ zaboravi\\\u0161|mora\\ da\\ zna|moram\\ da\\ znam|Moram\\ da\\ znam|mora\\\u0161\\ da\\ zna\\\u0161|mora\\\u0161\\ da\\ ide\\\u0161|mo\\\u017ee\\ da\\ bude|mo\\\u017ee\\\u0161\\ da\\ bude\\\u0161|mo\\\u017ee\\ da\\ di\\\u0161e|mo\\\u017ee\\\u0161\\ da\\ dobije\\\u0161|mo\\\u017eemo\\ da\\ imamo|na\\ ve\\\u010der|Na\\ ve\\\u010der|ne\\\u0107e\\ da\\ bude|ne\\\u0107e\\\u0161\\ da\\ bude\\\u0161|ne\\\u0107e\\\u0161\\ da\\ po\\\u017eali\\\u0161|Neko\\ ko|neko\\ ko|neko\\ ne\\\u0161to|nedjelju\\ dana|Ne\\ mogu\\ da\\ verujem|new\\ yor\\\u0161ki|nju\\ jor\\\u0161ki|od\\ kako|Pla\\\u0161im\\ se|pla\\\u0161im\\ se|pravo\\ u\\ o\\\u010di|sa\\ njim|sa\\ njima|sa\\ njom|sa\\ tim|sa\\ tom|sa\\ tobom|sa\\ vama|sam\\ da\\ budem|si\\\u0107i\\ dolje|Si\\ dobro|Svako\\ ko|Svo\\ vreme|Svo\\ vrijeme|smeo\\ da|smeli\\ da|\\\u0160to\\ ej|\\\u0161to\\ ej|to\\ j|to\\ ej|To\\ ej|tamo\\ natrag|tamo\\ je\\ natrag|Tamo\\ je\\ natrag|treba\\ da\\ bude|u\\ jutro|u\\\u0107i\\ unutra|vas\\ je\\ lagao|za\\ uvijek|zato\\ sto|zna\\ da\\ bude|zna\\ ko|znati\\ ko|\\\u017eele\\ da\\ budu|\\\u017eeli\\ da\\ bude|\\\u017eelio\\ da\\ budem|\\\u017eelim\\ da\\ budem|\\\u017delim\\ da\\ budem|\\\u017eeli\\\u0161\\ da\\ bude\\\u0161|\\\u017eelim\\ da\\ idem|\\\u017eelim\\ da\\ odem|\\\u017eeli\\\u0161\\ da\\ ode\\\u0161|\\\u017eeli\\\u0161\\ da\\ u\\\u0111e\\\u0161|\\\u017eelim\\ da\\ umrem|\\\u017delim\\ da\\ znam|\\\u017eelim\\ da\\ znam|\\\u017eeli\\\u0161\\ da\\ zna\\\u0161)(?:(?=\\s)|(?=$)|(?=\\b))'}, + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'advokati', u'odvjetnici'), (u'Advokati', u'Odvjetnici'), (u'advokatima', u'odvjetnicima'), (u'Advokatima', u'Odvjetnicima'), (u'afirmi\u0161e', u'afirmira'), (u'akcenat', u'naglasak'), (u'akcionara', u'dioni\u010dara'), (u'amin', u'amen'), (u'Amin', u'Amen'), (u'azot', u'du\u0161ik'), (u'ba\u0161ta', u'vrt'), (u'Ba\u0161ta', u'Vrt'), (u'ba\u0161te', u'vrtovi'), (u'Ba\u0161te', u'Vrtovi'), (u'ba\u0161ti', u'vrtu'), (u'ba\u0161tu', u'vrt'), (u'Ba\u0161tu', u'Vrt'), (u'ba\u0161tom', u'vrtom'), (u'bedan', u'bijedan'), (u'bede', u'bijede'), (u'bedi', u'bijedi'), (u'bejah', u'bijah'), (u'bele\u0161ci', u'bilje\u0161ci'), (u'be\u0161ike', u'mjehure'), (u'bimso', u'bismo'), (u'bioskop', u'kino'), (u'bioskopi', u'kina'), (u'bitci', u'bitki'), (u'blije\u0111i', u'blje\u0111i'), (u'beg', u'bijeg'), (u'begu', u'bijegu'), (u'beja\u0161e', u'bija\u0161e'), (u'bekstvo', u'bijeg'), (u'bekstvu', u'bijegu'), (u'begstvu', u'bijegu'), (u'bes', u'bijes'), (u'besa', u'bijesa'), (u'besan', u'bijesan'), (u'besom', u'bijesom'), (u'besu', u'bijesu'), (u'be\u0161e', u'bje\u0161e'), (u'bioje', u'bio je'), (u'bi smo', u'bismo'), (u'bi ste', u'biste'), (u'bled', u'blijed'), (u'blede', u'blijede'), (u'boksuje\u0161', u'boksa\u0161'), (u'bolesan', u'bolestan'), (u'braon', u'sme\u0111a'), (u'bregu', u'brijegu'), (u'bti', u'biti'), (u'cedilu', u'cjedilu'), (u'ceo', u'cijeli'), (u'Ceo', u'Cijeli'), (u'cepa', u'cijepa'), (u'cev', u'cijev'), (u'cevi', u'cijevi'), (u'cev\u010dica', u'cjev\u010dica'), (u'cev\u010dicu', u'cjev\u010dicu'), (u'cvetu', u'cvijetu'), (u'cvjetu', u'cvijetu'), (u'cvetalo', u'cvjetalo'), (u'cvjetom', u'cvijetom'), (u'\u010cakom', u'Chuckom'), (u'\u010dar\u0161av', u'plahta'), (u'\u010dar\u0161ave', u'plahte'), (u'\u010dar\u0161avima', u'plahtama'), (u'\u010das', u'sat'), (u'\u010detvoro', u'\u010detvero'), (u'\u010cita\u0107u', u'\u010citat \u0107u'), (u'\u010derku', u'k\u0107er'), (u'\u010cerku', u'K\u0107er'), (u'\u0107erku', u'k\u0107er'), (u'\u0106erku', u'K\u0107er'), (u'\u0107erkama', u'k\u0107erima'), (u'\u010derkama', u'k\u0107erima'), (u'\u0107erkom', u'k\u0107eri'), (u'\u010derkom', u'k\u0107eri'), (u'k\u0107erkom', u'k\u0107eri'), (u'k\u010derkom', u'k\u0107eri'), (u'\u0107ebe', u'deku'), (u'\u0107ebetu', u'deki'), (u'\u010dk', u'\u010dak'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107ale', u'tata'), (u'\u0107aletom', u'ocem'), (u'\u0107aleta', u'oca'), (u'\u0107aletu', u'ocu'), (u'\u0107orsokak', u'slijepa ulica'), (u'\u0107orsokaku', u'slijepoj ulici'), (u'\u0107o\u0161ak', u'ugao'), (u'\u0107o\u0161ku', u'uglu'), (u'\u0107erka', u'k\u0107i'), (u'\u0106erka', u'K\u0107i'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010du\u0107e', u'\u010dut \u0107e'), (u'\u010du\u0107emo', u'\u010dut \u0107emo'), (u'\u010cu\u0107emo', u'\u010cut \u0107emo'), (u'\u010cu\u0107ete', u'\u010cut \u0107ete'), (u'\u010cu\u0107e', u'\u010cut \u0107e'), (u'\u0107utao', u'\u0161utio'), (u'\u0106utao', u'\u0160utio'), (u'cvetova', u'cvjetova'), (u'daga', u'da ga'), (u'damas', u'danas'), (u'deda', u'djed'), (u'Deda', u'Djed'), (u'dede', u'djeda'), (u'dedi', u'djedu'), (u'dedom', u'djedom'), (u'defini\u0161e', u'definira'), (u'dele\u0107i', u'dijele\u0107i'), (u'deo', u'dio'), (u'Deo', u'Dio'), (u'de\u0161ava', u'doga\u0111a'), (u'dete', u'dijete'), (u'diluje', u'dila'), (u'diluju', u'dilaju'), (u'djete', u'dijete'), (u'Dete', u'Dijete'), (u'Djete', u'Dijete'), (u'detektuje', u'detektira'), (u'dodju', u'do\u0111u'), (u'dole', u'dolje'), (u'Dole', u'Dolje'), (u'Donije\u0107u', u'Donijet \u0107u'), (u'do ovde', u'dovde'), (u'dospeo', u'dospio'), (u'dospeju', u'dospiju'), (u'do\u0111avola', u'dovraga'), (u'Do\u0111avola', u'Dovraga'), (u'drug', u'prijatelj'), (u'drugde', u'drugdje'), (u'duuga', u'd\xfaga'), (u'duvana', u'duhana'), (u'dve', u'dvije'), (u'Dve', u'Dvije'), (u'dvema', u'dvjema'), (u'\u0111avo', u'vrag'), (u'\u0111avola', u'vraga'), (u'\u0111emper', u'd\u017eemper'), (u'd\u017eanki', u'ovisnik'), (u'd\u017eelat', u'krvnik'), (u'\u0111ubre', u'sme\u0107e'), (u'eksperata', u'stru\u010dnjaka'), (u'eksperti', u'stru\u010dnjaci'), (u'Eksperti', u'Stru\u010dnjaci'), (u'ekspertima', u'stru\u010dnjacima'), (u'en', u'ne'), (u'emitovao', u'emitirao'), (u'emitovati', u'emitirati'), (u'emituje', u'emitira'), (u'emitujem', u'emitiram'), (u'emituju', u'emitiraju'), (u'familijama', u'obiteljima'), (u'familiji', u'obitelji'), (u'flertuje', u'o\u010dijuka'), (u'foka', u'tuljan'), (u'foku', u'tuljana'), (u'foke', u'tuljani'), (u'fokama', u'tuljanima'), (u'fotografi\u0161u', u'fotografiraju'), (u'gde', u'gdje'), (u'Gde', u'Gdje'), (u'gluhonem', u'gluhonijem'), (u'gre\u0161e', u'grije\u0161e'), (u'gre\u0161ki', u'gre\u0161ci'), (u'grijehova', u'grijeha'), (u'hipnoti\u0161e', u'hipnotizira'), (u'Historija', u'Povijest'), (u'Historiju', u'Povijest'), (u'Historije', u'Povijesti'), (u'Historiji', u'Povijesti'), (u'Istorija', u'Povijest'), (u'Istoriju', u'Povijest'), (u'Istorije', u'Povijesti'), (u'Istoriji', u'Povijesti'), (u'historije', u'povijesti'), (u'historiji', u'povijesti'), (u'istorije', u'povijesti'), (u'istoriji', u'povijesti'), (u'istorijom', u'povije\u0161\u0107u'), (u'ho\u010du', u'ho\u0107u'), (u'Ho\u010du', u'Ho\u0107u'), (u'hte\u0107e', u'htjet \u0107e'), (u'htedoh', u'htjedoh'), (u'i\u010di', u'i\u0107i'), (u'I\u010di', u'I\u0107i'), (u'iko', u'itko'), (u'ignori\u0161i', u'ignoriraj'), (u'Ignori\u0161i', u'Ignoriraj'), (u'ignori\u0161ite', u'ignorirajte'), (u'Ignori\u0161ite', u'Ignorirajte'), (u'ignori\u0161u', u'ignoriraju'), (u'ilustruju', u'ilustriraju'), (u'informi\u0161e', u'informira'), (u'informi\u0161u', u'informiraju'), (u'inspirisao', u'inspirirao'), (u'interesuje', u'zanima'), (u'Interesuje', u'Zanima'), (u'Interesuju', u'Zanimaju'), (u'interesuju', u'zanimaju'), (u'isekao', u'izrezao'), (u'isterao', u'istjerao'), (u'istera\u0161', u'istjera\u0161'), (u'Istera\u0161', u'Istjera\u0161'), (u'isuvi\u0161e', u'previ\u0161e'), (u'ivica', u'rub'), (u'ivice', u'ruba'), (u'ivici', u'rubu'), (u'ivicu', u'rub'), (u'Izolujete', u'Izolirate'), (u'Izolujte', u'Izolirajte'), (u'izgladneo', u'izgladnio'), (u'izmeriti', u'izmjeriti'), (u'izmerio', u'izmjerio'), (u'izneo', u'iznio'), (u'izolujte', u'izolirajte'), (u'izneti', u'iznijeti'), (u'izvestan', u'izvjestan'), (u'izvinim', u'ispri\u010dam'), (u'izvini\u0161', u'ispri\u010da\u0161'), (u'izviniti', u'ispri\u010dati'), (u'izvinjenje', u'isprika'), (u'izvinjenja', u'isprike'), (u'izvinjenju', u'isprici'), (u'jedamput', u'jedanput'), (u'jelda', u"jel' da"), (u'Je\u0161\u0107emo', u'Jest \u0107emo'), (u'ju\u010de', u'ju\u010der'), (u'Ju\u010de', u'Ju\u010der'), (u'kakava', u'kakva'), (u'kampuje', u'kampira'), (u'kampujemo', u'kampiramo'), (u'kampuju', u'kampiraju'), (u'kancelariji', u'uredu'), (u'kancelarijom', u'uredom'), (u'kancera', u'raka'), (u'kandidovati', u'kandidirati'), (u'kandidujem', u'kandidiram'), (u'karmin', u'ru\u017e'), (u'karminom', u'ru\u017eem'), (u'k\u0107erci', u'k\u0107eri'), (u'k\u0107erka', u'k\u0107i'), (u'k\u010derka', u'k\u0107i'), (u'K\u0107erka', u'K\u0107i'), (u'K\u010derka', u'K\u0107i'), (u'k\u0107erkama', u'k\u0107erima'), (u'ker', u'pas'), (u'Ker', u'Pas'), (u'kerova', u'pasa'), (u'kidnapovan', u'otet'), (u'Kidnapovan', u'Otet'), (u'kiji', u'koji'), (u'kijim', u'kojim'), (u'klasifikuju', u'klasificiraju'), (u'Ko', u'Tko'), (u'koa', u'kao'), (u'koaj', u'koja'), (u'kola', u'auto'), (u'kolima', u'autu'), (u'komandni', u'zapovjedni'), (u'kombinuju', u'kombiniraju'), (u'kompanija', u'tvrtka'), (u'kom\u0161ija', u'susjed'), (u'kom\u0161iji', u'susjedu'), (u'kom\u0161iju', u'susjeda'), (u'kom\u0161iluk', u'susjedstvo'), (u'kom\u0161iluka', u'susjedstva'), (u'kom\u0161iluku', u'susjedstvu'), (u'kom\u0161ije', u'susjedi'), (u'kom\u0161ijama', u'susjedima'), (u'kontroli\u0161u', u'kontroliraju'), (u'Kontroli\u0161u', u'Kontroliraju'), (u'Kontroli\u0161i', u'Kontroliraj'), (u'kontroli\u0161i', u'kontroliraj'), (u'Kontroli\u0161ite', u'Kontrolirajte'), (u'kontroli\u0161ite', u'kontrolirajte'), (u'korpu', u'ko\u0161aru'), (u'kritikuju', u'kritiziraju'), (u'krsta', u'kri\u017ea'), (u'krstu', u'kri\u017eu'), (u'krsti\u0107a', u'kri\u017ei\u0107a'), (u'krsti\u0107u', u'kri\u017ei\u0107u'), (u'Krsta', u'Kri\u017ea'), (u'Krstu', u'Kri\u017eu'), (u'Krsti\u0107a', u'Kri\u017ei\u0107a'), (u'Krsti\u0107u', u'Kri\u017ei\u0107u'), (u'krstom', u'kri\u017eem'), (u'krstove', u'kri\u017eeve'), (u'Krstove', u'Kri\u017eeve'), (u'krstovima', u'kri\u017eevima'), (u'Krstovima', u'Kri\u017eevima'), (u'kri\u017eom', u'kri\u017eem'), (u'kupatilo', u'kupaona'), (u'kupatilu', u'kupaoni'), (u'kvalifikuju', u'kvalificiraju'), (u'la\u017eeju', u'la\u017eu'), (u'la\u017eov', u'la\u017eljivac'), (u'la\u017eovi', u'la\u017eljivci'), (u'la\u017eovu', u'la\u017eljivcu'), (u'la\u017eovima', u'la\u017eljivcima'), (u'la\u017eovom', u'la\u017eljivcem'), (u'lebdeo', u'lebdio'), (u'le\u010di', u'lije\u010di'), (u'le\u010de', u'lije\u010de'), (u'lje\u010di', u'lije\u010di'), (u'Le\u010di', u'Lije\u010di'), (u'Lje\u010di', u'Lije\u010di'), (u'Lejn', u'Lane'), (u'Lenja', u'Lijena'), (u'lenji', u'lijeni'), (u'lenja', u'lijena'), (u'le\u0161nik', u'lje\u0161njak'), (u'Leta', u'Ljeta'), (u'leto', u'ljeto'), (u'letiti', u'letjeti'), (u'leve', u'lijeve'), (u'lo\u017ei', u'pali'), (u'lza', u'Iza'), (u'majca', u'majica'), (u'majce', u'majice'), (u'majcu', u'majicu'), (u'majcom', u'majicom'), (u'Malopre', u'Malo prije'), (u'malopre', u'malo prije'), (u'maloprije', u'malo prije'), (u'manifestuje', u'manifestira'), (u'Mek', u'Mac'), (u'mehur', u'mjehur'), (u'menom', u'mnom'), (u'mera\u010d', u'mjera\u010d'), (u'meri', u'mjeri'), (u'mere', u'mjere'), (u'merdevine', u'ljestve'), (u'merdevinama', u'ljestvama'), (u'me\u0161ane', u'mije\u0161ane'), (u'me\u0161avina', u'mje\u0161avina'), (u'me\u0161avine', u'mje\u0161avine'), (u'me\u0161avinu', u'mje\u0161avinu'), (u'me\u0161tana', u'mje\u0161tana'), (u'minut', u'minutu'), (u'mo\u010d', u'mo\u0107'), (u'mofu', u'mogu'), (u'momenat', u'trenutak'), (u'muzejem', u'muzejom'), (u'muzici', u'glazbi'), (u'na\u010di', u'na\u0107i'), (u'naduvan', u'napu\u0161en'), (u'najpre', u'najprije'), (u'Najpre', u'Najprije'), (u'najzad', u'napokon'), (u'nanev\u0161i', u'nanjev\u0161i'), (u'napastvuje', u'napastuje'), (u'Napolje', u'Van'), (u'napolje', u'van'), (u'Napolju', u'Vani'), (u'napolju', u'vani'), (u'nauka', u'znanost'), (u'Nauka', u'Znanost'), (u'nauci', u'znanosti'), (u'nazad', u'natrag'), (u'Nazad', u'Natrag'), (u'napred', u'naprijed'), (u'Napred', u'Naprijed'), (u'naprimjer', u'na primjer'), (u'naseo', u'nasjeo'), (u'nasme\u0161i', u'nasmije\u0161i'), (u'nasre\u0107u', u'na sre\u0107u'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebismo', u'ne bismo'), (u'Nebismo', u'Ne bismo'), (u'nebiste', u'ne biste'), (u'Nebiste', u'Ne biste'), (u'nedaj', u'ne daj'), (u'negde', u'negdje'), (u'Negde', u'Negdje'), (u'neguje', u'njeguje'), (u'neguju', u'njeguju'), (u'nekto', u'netko'), (u'nemi', u'nijemi'), (u'nemrem', u'ne mogu'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nene', u'njene'), (u'ne\u0161o', u'ne\u0161to'), (u'nevreme', u'nevrijeme'), (u'nezi', u'njezi'), (u'nigde', u'nigdje'), (u'Nigde', u'Nigdje'), (u'niko', u'nitko'), (u'Niko', u'Nitko'), (u'nisma', u'nisam'), (u'Nisma', u'Nisam'), (u'ne\u0107\u0161', u'ne\u0107e\u0161'), (u'nejde', u'ne ide'), (u'neda', u'ne da'), (u'nedam', u'ne dam'), (u'new yor\u0161ki', u'njujor\u0161ki'), (u'nju jor\u0161ki', u'njujor\u0161ki'), (u'njegi', u'njezi'), (u'ne\u017eeli', u'ne \u017eeli'), (u'niej', u'nije'), (u'njie', u'nije'), (u'njem', u'nijem'), (u'njeme', u'njene'), (u'nsiam', u'nisam'), (u'nteko', u'netko'), (u'obe', u'obje'), (u'Obe', u'Obje'), (u'obema', u'objema'), (u'Obezbe\u0111uju', u'Osiguravaju'), (u'obezbe\u0111uju', u'osiguravaju'), (u'objekat', u'objekt'), (u'oblast', u'podru\u010dje'), (u'oblastima', u'podru\u010djima'), (u'oblasti', u'podru\u010dj*'), (u'obolelu', u'oboljelu'), (u'obo\u017eavalac', u'obo\u017eavatelj'), (u'obu\u010di', u'obu\u0107i'), (u'obuhvata', u'obuhva\u0107a'), (u'odandje', u'odande'), (u'odavdje', u'odavde'), (u'odela', u'odjela'), (u'odelu', u'odjelu'), (u'odelenje', u'odjel'), (u'odelenju', u'odjelu'), (u'odeljak', u'odjeljak'), (u'odeljenje', u'odjel'), (u'Odeljenje', u'Odjel'), (u'odjeljenje', u'odjel'), (u'Odjeljenje', u'Odjel'), (u'odeljenjem', u'odjelom'), (u'odma', u'odmah'), (u'Odne\u0107u', u'Odnijet \u0107u'), (u'odne\u0107u', u'odnijet \u0107u'), (u'odne\u0107e', u'odnijet \u0107e'), (u'odoliti', u'odoljeti'), (u'odneti', u'odnijeti'), (u'odprilike', u'otprilike'), (u'odseo', u'odsjeo'), (u'odsela', u'odsjela'), (u'odsesti', u'odsjesti'), (u'odupreti', u'oduprijeti'), (u'ogladneo', u'ogladnio'), (u'organizuju', u'organiziraju'), (u'Organizuju', u'Organiziraju'), (u'osje\u0107anja', u'osje\u0107aje'), (u'osmehe', u'osmijehe'), (u'osmehne', u'osmjehne'), (u'osobenosti', u'osobnosti'), (u'ostrva', u'otoka'), (u'ostrvu', u'otoku'), (u'ostrvom', u'otokom'), (u'Ostrva', u'Otoka'), (u'Ostrvu', u'Otoku'), (u'Ostrvom', u'Otokom'), (u'ostrvima', u'otocima'), (u'osete', u'osjete'), (u'ostrvo', u'otok'), (u'Ostrvo', u'Otok'), (u'ovde', u'ovdje'), (u'Ovde', u'Ovdje'), (u'ovdije', u'ovdje'), (u'Ovdije', u'Ovdje'), (u'ovjde', u'ovdje'), (u'Ovjde', u'Ovdje'), (u'palatama', u'pala\u010dama'), (u'palate', u'pala\u010de'), (u'palatu', u'pala\u010du'), (u'palati', u'pala\u010di'), (u'pantalone', u'hla\u010de'), (u'Pantalone', u'Hla\u010de'), (u'pantalona', u'hla\u010da'), (u'pantalonama', u'hla\u010dama'), (u'par\u010de', u'komadi\u0107'), (u'par\u010deta', u'komadi\u0107a'), (u'par\u010detom', u'komadi\u0107em'), (u'parampar\u010dad', u'komadi\u0107i'), (u'pd', u'od'), (u'pemzija', u'penzija'), (u'pemziju', u'penziju'), (u'penzionerski', u'umirovljeni\u010dki'), (u'Penzionerski', u'Umirovljeni\u010dki'), (u'pertle', u'\u017enirance'), (u'pesama', u'pjesama'), (u'pesnicima', u'pjesnicima'), (u'pe\u0161ice', u'pje\u0161ice'), (u'Pe\u0161ice', u'Pje\u0161ice'), (u'plata', u'pla\u0107a'), (u'pla\u010da', u'pla\u0107a'), (u'platu', u'pla\u0107u'), (u'pla\u010danje', u'pla\u0107anje'), (u'pla\u010danjem', u'pla\u0107anjem'), (u'pla\u0107e\u0161', u'pla\u010de\u0161'), (u'po\u010de\u0107u', u'po\u010det \u0107u'), (u'podjelimo', u'podijelimo'), (u'podnesti', u'podnijeti'), (u'podstreka\u010d', u'poticatelj'), (u'podsete', u'podsjete'), (u'poen', u'bod'), (u'poena', u'boda'), (u'poene', u'bodove'), (u'poeni', u'bodovi'), (u'Poeni', u'Bodovi'), (u'poenima', u'bodovima'), (u'poludili', u'poludjeli'), (u'poma\u0107i', u'pomaknuti'), (u'pomaknim', u'pomaknem'), (u'pomaknio', u'pomaknuo'), (u'pomakniti', u'pomaknuti'), (u'pomenu', u'spomenu'), (u'Pomera', u'Mi\u010de'), (u'pomera', u'mi\u010de'), (u'pomerajte', u'mi\u010dite'), (u'pomjeri', u'pomakni'), (u'pomeraj', u'mi\u010di'), (u'pomjeraj', u'mi\u010di'), (u'pomeraju', u'mi\u010du'), (u'pomerala', u'micala'), (u'pomeranja', u'pomicanja'), (u'pomerati', u'micati'), (u'pomjerati', u'pomicati'), (u'pomeri\u0161', u'pomakne\u0161'), (u'ponaosob', u'osobno'), (u'ponesla', u'ponijela'), (u'Ponesla', u'Ponijela'), (u'pore\u0111enje', u'usporedba'), (u'pore\u0111enju', u'usporedbi'), (u'porekla', u'podrijetla'), (u'poreklo', u'podrijetlo'), (u'poreklu', u'podrijetlu'), (u'Porodica', u'Obitelj'), (u'Porodice', u'Obitelji'), (u'porodica', u'obitelj'), (u'porodice', u'obitelji'), (u'porodici', u'obitelji'), (u'porodicama', u'obiteljima'), (u'porodicom', u'obitelji'), (u'porodicu', u'obitelj'), (u'posle', u'poslije'), (u'Posle', u'Poslije'), (u'poslje', u'poslije'), (u'postara', u'pobrine'), (u'Postara\u0107u', u'Pobrinut \u0107u'), (u'postara\u0107u', u'pobrinut \u0107u'), (u'postaraj', u'pobrini'), (u'Postaraj', u'Pobrini'), (u'Postaraju', u'Pobrinu'), (u'postaraju', u'pobrinu'), (u'postarajmo', u'pobrinimo'), (u'postaramo', u'pobrinemo'), (u'postara\u0161', u'pobrine\u0161'), (u'povesne', u'povijesne'), (u'Povinuju', u'Pokoravaju'), (u'povinuju', u'pokoravaju'), (u'pozadi', u'iza'), (u'praktikuj', u'prakticiraj'), (u'praktikuju', u'prakticiraju'), (u'praktikovala', u'prakticirala'), (u'praktikovati', u'prakticirati'), (u'pre', u'prije'), (u'Pre', u'Prije'), (u'Pre\u0107i', u'Prije\u0107i'), (u'pre\u0107i', u'prije\u0107i'), (u'predame', u'preda me'), (u'predelu', u'predjelu'), (u'preformuli\u0161i', u'preformuliraj'), (u'preklo', u'porijeklo'), (u'preloma', u'prijeloma'), (u'Prene\u0107u', u'Prenijet \u0107u'), (u'prene\u0107u', u'prenijet \u0107u'), (u'prenos', u'prijenos'), (u'prenosa', u'prijenosa'), (u'prenosom', u'prijenosom'), (u'prenosu', u'prijenosu'), (u'preneo', u'prenio'), (u'prenela', u'prenijela'), (u'prenjela', u'prenijela'), (u'preneli', u'prenijeli'), (u'prenjeli', u'prenijeli'), (u'preneti', u'prenijeti'), (u'preporu\u010da', u'preporu\u010duje'), (u'prese\u0107i', u'presje\u0107i'), (u'preti', u'prijeti'), (u'prete\u0107im', u'prijete\u0107im'), (u'prete\u0107ih', u'prijete\u0107ih'), (u'pretrpeo', u'pretrpio'), (u'prevod', u'prijevod'), (u'Prevod', u'Prijevod'), (u'prezentovati', u'prezentirati'), (u'pridonjeti', u'pridonijeti'), (u'prijatan', u'ugodan'), (u'primedbi', u'primjedbi'), (u'primjete', u'primijete'), (u'prisetim', u'prisjetim'), (u'pritiskam', u'priti\u0161\u0107em'), (u'prmda', u'iako'), (u'procenat', u'postotak'), (u'procent', u'postotak'), (u'procenata', u'postotaka'), (u'procenti', u'postoci'), (u'Procenti', u'Postoci'), (u'procente', u'postotke'), (u'Procente', u'Postotke'), (u'procentu', u'postotku'), (u'Procentu', u'Postotku'), (u'procentima', u'postocima'), (u'prodato', u'prodano'), (u'prohte', u'prohtije'), (u'projekat', u'projekt'), (u'Projekat', u'Projekt'), (u'promijena', u'promjena'), (u'protestvovat', u'protestirat'), (u'Protestvovat', u'Protestirat'), (u'Protestvujem', u'Protestiram'), (u'protestvujem', u'protestiram'), (u'protestvuju', u'protestiraju'), (u'protestuju\u0107i', u'protestiraju\u0107i'), (u'psihi\u0107ki', u'psihi\u010dki'), (u'ra\u010dunari', u'ra\u010dunala'), (u'ra\u010dunare', u'ra\u010dunala'), (u'radijo', u'radio'), (u'ra\u0111e', u'radije'), (u'ranac', u'ruksak'), (u'rancu', u'ruksaku'), (u'rascep', u'rascjep'), (u'rasejan', u'rastresen'), (u'rasejana', u'rastresena'), (u'raspust', u'odmor'), (u'razdevi\u010de', u'razdjevi\u010de'), (u'razgovrati', u'razgovarati'), (u'razre\u0161i', u'razrije\u0161i'), (u'razume', u'razumije'), (u'razumeju', u'razumiju'), (u're\u0111e', u'rje\u0111e'), (u'rejv', u'rave'), (u'rejvu', u'raveu'), (u'reko', u'rekao'), (u'rengen', u'rendgen'), (u'repuje\u0161', u'repa\u0161'), (u'resetuje', u'resetira'), (u'resetujte', u'resetirajte'), (u'Resetujte', u'Resetirajte'), (u'rije\u0111i', u'rje\u0111i'), (u'Rizikuj', u'Riskiraj'), (u'rokenrol', u"rock'n'roll"), (u'ronioc', u'ronilac'), (u'savije\u0161\u0107u', u'savje\u0161\u0107u'), (u'save\u0161\u0107u', u'savje\u0161\u0107u'), (u'sede\u0107e\u0161', u'sjedit \u0107e\u0161'), (u'sedeli', u'sjedili'), (u'sedi\u0161ta', u'sjedala'), (u'sedi\u0161te', u'sjedalo'), (u'sedi\u0161tu', u'sjedalu'), (u'sedni', u'sjedni'), (u'Sedni', u'Sjedni'), (u'sedi', u'sjedi'), (u'Sedi', u'Sjedi'), (u'sedite', u'sjedite'), (u'sesti', u'sjesti'), (u'sekire', u'sjekire'), (u'sekiraj', u'brini'), (u'sekiramo', u'brinemo'), (u'sekirate', u'brinete'), (u'sekirajte', u'brinite'), (u'seme', u'sjeme'), (u'sertan', u'sretan'), (u'Se\u0161\u0107u', u'Sjest \u0107u'), (u'se\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107emo', u'sjest \u0107emo'), (u'seta', u'sjeta'), (u'sigruno', u'sigurno'), (u'siguan', u'siguran'), (u'sija', u'sja'), (u'sir\u0107e', u'ocat'), (u'sir\u0107eta', u'octa'), (u'sir\u0107etu', u'octu'), (u'sle\u0107e', u'slije\u0107e'), (u'sle\u0107u', u'slije\u0107u'), (u'sle\u0107emo', u'slije\u0107emo'), (u'sleva', u'slijeva'), (u'se\u0107anjima', u'sje\u0107anjima'), (u'seo', u'sjeo'), (u'Seo', u'Sjeo'), (u'sem', u'osim'), (u'sma', u'sam'), (u'smao', u'samo'), (u'Smao', u'Samo'), (u'sme', u'smije'), (u'Sme', u'Smije'), (u'sme\u0107pm', u'sme\u0107em'), (u'smej', u'smij'), (u'smesta', u'smjesta'), (u'Smesta', u'Smjesta'), (u'smeste', u'smjeste'), (u'sme\u0161ak', u'smje\u0161ak'), (u'sme\u0161i', u'smije\u0161i'), (u'Sme\u0161i', u'Smije\u0161i'), (u'sme\u0161io', u'smije\u0161io'), (u'sme\u0161kom', u'smje\u0161kom'), (u'smjeo', u'smio'), (u'smrdeo', u'smrdio'), (u'sintersajzer', u'synthesizer'), (u'sitnisajzer', u'synthesizer'), (u'skelet', u'kostur'), (u'so\u010diva', u'le\u0107e'), (u'so\u010divo', u'le\u0107a'), (u'so\u010divom', u'le\u0107om'), (u'so\u010divu', u'le\u0107i'), (u'spasao', u'spasio'), (u'Spasao', u'Spasio'), (u'spasen', u'spa\u0161en'), (u'spasla', u'spasila'), (u'spasli', u'spasili'), (u'speluje', u'sri\u010de'), (u'speluju', u'sri\u010du'), (u'spolja', u'izvana'), (u'stabilizuju', u'stabiliziraju'), (u'starati', u'brinuti'), (u'Starati', u'Brinuti'), (u'steni', u'stijeni'), (u'stepen', u'stupanj'), (u'stepena', u'stupnjeva'), (u'stepeni', u'stupnjeva'), (u'stepenu', u'stupnju'), (u'sticati', u'stjecati'), (u'stiditi', u'stidjeti'), (u'stole\u0107a', u'stolje\u0107a'), (u'stobom', u's tobom'), (u'stvrano', u'stvarno'), (u'subjekat', u'subjekt'), (u'sudija', u'sudac'), (u'Sudija', u'Sudac'), (u'sudije', u'suca'), (u'sudiji', u'sucu'), (u'sudijo', u'su\u010de'), (u'sudiju', u'suca'), (u'sudijom', u'sucem'), (u'sudijskog', u'sudskog'), (u'sugeri\u0161u', u'predla\u017eu'), (u'sugeri\u0161e', u'predla\u017ee'), (u'surfuje', u'surfa'), (u'surfuje\u0161', u'surfa\u0161'), (u'surfuju', u'surfaju'), (u'su\u0161tina', u'bit'), (u'su\u0161tinski', u'bitni'), (u'suvim', u'suhim'), (u'svestan', u'svjestan'), (u'svjest', u'svijest'), (u'Svjest', u'Svijest'), (u'svjesti', u'svijesti'), (u'Svjesti', u'Svijesti'), (u'svetova', u'svjetova'), (u'svugde', u'svugdje'), (u'\u0161olja', u'\u0161alica'), (u'\u0161olju', u'\u0161alicu'), (u'\u0160ta', u'\u0160to'), (u'\u0161tagod', u'\u0161to god'), (u'\u0161ta', u'\u0161to'), (u'\u0161tp', u'\u0161to'), (u'\u0161tampa', u'tisak'), (u'\u0161tampu', u'tisak'), (u'\u0161tampom', u'tiskom'), (u'\u0161tampi', u'tisku'), (u'\u0161tampati', u'tiskati'), (u'tablu', u'plo\u010du'), (u'tako\u0111e', u'tako\u0111er'), (u'Tako\u0111e', u'Tako\u0111er'), (u'talas', u'val'), (u'Talas', u'Val'), (u'talasa', u'valova'), (u'talasima', u'valovima'), (u'talase', u'valove'), (u'talasi', u'valovi'), (u'Talasi', u'Valovi'), (u'te\u010dnost', u'teku\u0107ina'), (u'te\u010dnosti', u'teku\u0107ine'), (u'te\u010dno\u0161\u0107u', u'teku\u0107inom'), (u'tek\u0161o', u'te\u0161ko'), (u'Tek\u0161o', u'Te\u0161ko'), (u'terajte', u'tjerajte'), (u'to\u010dak', u'kota\u010d'), (u'To\u010dak', u'Kota\u010d'), (u'toha', u'toga'), (u'tovj', u'tvoj'), (u'trabam', u'trebam'), (u'trkanje', u'utrkivanje'), (u'trkanja', u'utrkivanja'), (u'trkao', u'utrkivao'), (u'trougao', u'trokut'), (u'trougla', u'trokuta'), (u'trouglu', u'trokutu'), (u'trouglove', u'trokute'), (u'trpeo', u'trpio'), (u'Trpeo', u'Trpio'), (u'tugi', u'tuzi'), (u'tvrtci', u'tvrtki'), (u'ubede', u'uvjere'), (u'Ube\u0111ivao', u'Uvjeravao'), (u'ube\u0111ivati', u'uvjeravati'), (u'ubje\u0111ivati', u'uvjeravati'), (u'ube\u0111uje', u'uvjerava'), (u'ube\u0111uje\u0161', u'uvjerava\u0161'), (u'ube\u0111uju', u'uvjeravaju'), (u'ubjediti', u'uvjeriti'), (u'u\u010dtivo', u'uljudno'), (u'u\u010dtivost', u'uljudnost'), (u'u\u010dtivo\u0161\u0107u', u'uljudno\u0161\u0107u'), (u'udata', u'udana'), (u'Udata', u'Udana'), (u'udeo', u'udio'), (u'uliva', u'ulijeva'), (u'ulivali', u'ulijevali'), (u'ulivate', u'ulijevate'), (u'uljeva', u'ulijeva'), (u'u jutro', u'ujutro'), (u'ujutru', u'ujutro'), (u'ume', u'zna'), (u'umem', u'umijem'), (u'ume\u0161', u'umije\u0161'), (u'umesto', u'umjesto'), (u'umetninama', u'umjetninama'), (u'umreti', u'umrijeti'), (u'Umret', u'Umrijet'), (u'Une\u0107u', u'Unijet \u0107u'), (u'univerzitet', u'sveu\u010dili\u0161te'), (u'univerzitetu', u'sveu\u010dili\u0161tu'), (u'Uop\u0161te', u'Uop\u0107e'), (u'uop\u0161te', u'uop\u0107e'), (u'uop\u010de', u'uop\u0107e'), (u'uprkos', u'usprkos'), (u'Uprkos', u'Usprkos'), (u'uradio', u'u\u010dinio'), (u'Uredu', u'U redu'), (u'uspe', u'uspije'), (u'Uspe', u'Uspije'), (u'uspeo', u'uspio'), (u'Uspeo', u'Uspio'), (u'uspe\u0161', u'uspije\u0161'), (u'uspeju', u'uspiju'), (u'uspjevala', u'uspijevala'), (u'uspijo', u'uspio'), (u'u sred', u'usred'), (u'usled', u'uslijed'), (u'Usled', u'Uslijed'), (u'usledila', u'uslijedila'), (u'usljed', u'uslijed'), (u'Usljed', u'Uslijed'), (u'u\u0161unjate', u'u\u0161uljate'), (u'utehe', u'utjehe'), (u'uve\u010de', u'nave\u010der'), (u'uvijet', u'uvjet'), (u'uvo', u'uho'), (u'vaistinu', u'uistinu'), (u'Vaistinu', u'Uistinu'), (u'varnica', u'iskra'), (u'varnicu', u'iskru'), (u'vaspitavan', u'odgajan'), (u'vaspitavanju', u'odgoju'), (u'va\u0161ljivi', u'u\u0161ljivi'), (u'va\u017ei', u'vrijedi'), (u've\u010dan', u'vje\u010dan'), (u'vek', u'stolje\u0107e'), (u'veka', u'stolje\u0107a'), (u'veke', u'vijeke'), (u'vekova', u'stolje\u0107a'), (u'venca', u'vijenca'), (u've\u010dnost', u'vje\u010dnost'), (u'veoma', u'vrlo'), (u'Veoma', u'Vrlo'), (u'veren', u'zaru\u010den'), (u'Veren', u'Zaru\u010den'), (u'verena', u'zaru\u010dena'), (u'vereni', u'zaru\u010deni'), (u'verimo', u'zaru\u010dimo'), (u've\u0161\u0107u', u'vije\u0161\u0107u'), (u've\u0161u', u'rublju'), (u'vidjeo', u'vidio'), (u'Vidjeo', u'Vidio'), (u'vjerojatno\u0107a', u'vjerojatnost'), (u'vje\u0161\u0107u', u'vije\u0161\u0107u'), (u'vje\u0161ta\u010dko', u'umjetno'), (u'vje\u0161ta\u010dki', u'umjetni'), (u'vje\u0161ta\u010dkom', u'umjetnom'), (u'vje\u0161ta\u010dkog', u'umjetnog'), (u'vje\u0161ta\u010dku', u'umjetnu'), (u'vlo', u'vrlo'), (u'Vodi\u0107e', u'Vodit \u0107e'), (u'Vodi\u0107u', u'Vodit \u0107u'), (u'voliti', u'voljeti'), (u'vredelo', u'vrijedilo'), (u'vrednom', u'vrijednom'), (u'vrednog', u'vrijednog'), (u'vreme', u'vrijeme'), (u'Vreme', u'Vrijeme'), (u'vrjeme', u'vrijeme'), (u'Vrjeme', u'Vrijeme'), (u'vrteo', u'vrtio'), (u'whiskey', u'viski'), (u'zaceljivanje', u'zacjeljivanje'), (u'zagrevanje', u'zagrijavanje'), (u'zalepili', u'zalijepili'), (u'zalepiti', u'zalijepiti'), (u'zanm', u'znam'), (u'zanma', u'zanima'), (u'zaspem', u'zaspim'), (u'zastareo', u'zastario'), (u'za uvijek', u'zauvijek'), (u'zavera', u'zavjera'), (u'zavredili', u'zavrijedili'), (u'zahtev', u'zahtjev'), (u'Zahtev', u'Zahtjev'), (u'zasede', u'zasjede'), (u'zasedi', u'zasjedi'), (u'zasedu', u'zasjedu'), (u'zatp', u'zato'), (u'Zatp', u'Zato'), (u'zbg', u'zbog'), (u'zdrvo', u'zdravo'), (u'Zdrvo', u'Zdravo'), (u'zlodela', u'zlodjela'), (u'zna\u0107i', u'zna\u010di'), (u'zvani\u010dan', u'slu\u017eben'), (u'\u017eemo', u'\u0107emo'), (u'\u017diveo', u'\u017divio'), (u'\u017emureo', u'\u017emirio'), (u'Ajron', u'Iron'), (u'Ar\u010di', u'Archie'), (u'Ajvi', u'Ivy'), (u'Beverli', u'Beverly'), (u'Bejker', u'Baker'), (u'Brid\u017eit', u'Bridget'), (u'Bri\u017eit', u'Brigitte'), (u'Darvin', u'Darwin'), (u'Darvina', u'Darwina'), (u'Darvinu', u'Darwinu'), (u'Darvinom', u'Darwinom'), (u'Dejv', u'Dave'), (u'Dejvi', u'Davie'), (u'Dejva', u'Davea'), (u'Dejvu', u'Daveu'), (u'Dejvom', u'Daveom'), (u'Den', u'Dan'), (u'Dru', u'Drew'), (u'D\u017eosi', u'Josie'), (u'\u0110o\u0161ua', u'Joshua'), (u'D\u017ees', u'Jess'), (u'D\u017een', u'Jen'), (u'D\u017eej', u'Jay'), (u'D\u017eejn', u'Jane'), (u'D\u017eil', u'Jill'), (u'D\u017eodi', u'Jody'), (u'D\u017euli', u'Julie'), (u'Ejb', u'Abe'), (u'Ejmi', u'Amy'), (u'Ejpril', u'April'), (u'End\u017ei', u'Angie'), (u'Entoni', u'Anthony'), (u'E\u0161li', u'Ashley'), (u'Fibi', u'Phoebe'), (u'Gre\u010den', u'Gretchen'), (u'Grejs', u'Grace'), (u'Hju', u'Hugh'), (u'Hjua', u'Hugha'), (u'Hjuz', u'Hughes'), (u'Hjuza', u'Hughesa'), (u'Hjuston', u'Houston'), (u'Ilejn', u'Elaine'), (u'Kejsi', u'Casey'), (u'Kerol', u'Carol'), (u'Kerolajn', u'Caroline'), (u'Kloe', u'Chloe'), (u'Kortni', u'Courtney'), (u'Krejg', u'Craig'), (u'Kristi', u'Christie'), (u'Lajf', u'Life'), (u'Lusi', u'Lucy'), (u'Majk', u'Mike'), (u'Medelin', u'Madeline'), (u'Mejbel', u'Mabel'), (u'Mejn', u'Maine'), (u'Mejna', u'Mainea'), (u'Mejnu', u'Maineu'), (u'Mejnom', u'Maineom'), (u'Merilend', u'Maryland'), (u'Mi\u010del', u'Mitchell'), (u'Nejt', u'Nate'), (u'Nensi', u'Nancy'), (u'Ni\u010de', u'Nietzsche'), (u'Odri', u'Audrey'), (u'Ohajo', u'Ohio'), (u'Pem', u'Pam'), (u'Pejd\u017e', u'Paige'), (u'Rej\u010del', u'Rachel'), (u'Rouz', u'Rose'), (u'Stejt', u'State'), (u'Stejsi', u'Stacy'), (u'\u0160eron', u'Sharon'), (u'\u0160eril', u'Cheryl'), (u'\u0160paniji', u'\u0160panjolskoj'), (u'Tajms', u'Times'), (u'Tejlor', u'Taylor'), (u'\u017dak', u'Jacques'), (u'januar', u'sije\u010danj'), (u'Januar', u'Sije\u010danj'), (u'februar', u'velja\u010da'), (u'februara', u'velja\u010de'), (u'februaru', u'velja\u010di'), (u'Februar', u'Velja\u010da'), (u'Februara', u'Velja\u010de'), (u'Februaru', u'Velja\u010di'), (u'mart', u'o\u017eujak'), (u'Mart', u'O\u017eujak'), (u'april', u'travanj'), (u'April', u'Travanj'), (u'maj', u'svibanj'), (u'Maj', u'Svibanj'), (u'svibnjom', u'svibnjem'), (u'jun', u'lipanj'), (u'juna', u'lipnja'), (u'junu', u'lipnju'), (u'Jun', u'Lipanj'), (u'juli', u'srpanj'), (u'jula', u'srpnja'), (u'julu', u'srpnju'), (u'Juli', u'Srpanj'), (u'septembar', u'rujan'), (u'Septembar', u'Rujan'), (u'oktobar', u'listopad'), (u'Oktobar', u'Listopad'), (u'novembar', u'studeni'), (u'november', u'studeni'), (u'novembra', u'studenog'), (u'novembru', u'studenom'), (u'Novembar', u'Studeni'), (u'November', u'Studeni'), (u'Novembra', u'Studenog'), (u'Novembru', u'Studenom'), (u'decembar', u'prosinac'), (u'Decembar', u'Prosinac')]), - 'pattern': u'(?um)(\\b|^)(?:advokati|Advokati|advokatima|Advokatima|afirmi\\\u0161e|akcenat|akcionara|amin|Amin|azot|ba\\\u0161ta|Ba\\\u0161ta|ba\\\u0161te|Ba\\\u0161te|ba\\\u0161ti|ba\\\u0161tu|Ba\\\u0161tu|ba\\\u0161tom|bedan|bede|bedi|bejah|bele\\\u0161ci|be\\\u0161ike|bimso|bioskop|bioskopi|bitci|blije\\\u0111i|beg|begu|beja\\\u0161e|bekstvo|bekstvu|begstvu|bes|besa|besan|besom|besu|be\\\u0161e|bioje|bi\\ smo|bi\\ ste|bled|blede|boksuje\\\u0161|bolesan|braon|bregu|bti|cedilu|ceo|Ceo|cepa|cev|cevi|cev\\\u010dica|cev\\\u010dicu|cvetu|cvjetu|cvetalo|cvjetom|\\\u010cakom|\\\u010dar\\\u0161av|\\\u010dar\\\u0161ave|\\\u010dar\\\u0161avima|\\\u010das|\\\u010detvoro|\\\u010cita\\\u0107u|\\\u010derku|\\\u010cerku|\\\u0107erku|\\\u0106erku|\\\u0107erkama|\\\u010derkama|\\\u0107erkom|\\\u010derkom|k\\\u0107erkom|k\\\u010derkom|\\\u0107ebe|\\\u0107ebetu|\\\u010dk|\\\u0107\\\u0161|\\\u0107ale|\\\u0107aletom|\\\u0107aleta|\\\u0107aletu|\\\u0107orsokak|\\\u0107orsokaku|\\\u0107o\\\u0161ak|\\\u0107o\\\u0161ku|\\\u0107erka|\\\u0106erka|\\\u0107mo|\\\u0107te|\\\u010du\\\u0107e|\\\u010du\\\u0107emo|\\\u010cu\\\u0107emo|\\\u010cu\\\u0107ete|\\\u010cu\\\u0107e|\\\u0107utao|\\\u0106utao|cvetova|daga|damas|deda|Deda|dede|dedi|dedom|defini\\\u0161e|dele\\\u0107i|deo|Deo|de\\\u0161ava|dete|diluje|diluju|djete|Dete|Djete|detektuje|dodju|dole|Dole|Donije\\\u0107u|do\\ ovde|dospeo|dospeju|do\\\u0111avola|Do\\\u0111avola|drug|drugde|duuga|duvana|dve|Dve|dvema|\\\u0111avo|\\\u0111avola|\\\u0111emper|d\\\u017eanki|d\\\u017eelat|\\\u0111ubre|eksperata|eksperti|Eksperti|ekspertima|en|emitovao|emitovati|emituje|emitujem|emituju|familijama|familiji|flertuje|foka|foku|foke|fokama|fotografi\\\u0161u|gde|Gde|gluhonem|gre\\\u0161e|gre\\\u0161ki|grijehova|hipnoti\\\u0161e|Historija|Historiju|Historije|Historiji|Istorija|Istoriju|Istorije|Istoriji|historije|historiji|istorije|istoriji|istorijom|ho\\\u010du|Ho\\\u010du|hte\\\u0107e|htedoh|i\\\u010di|I\\\u010di|iko|ignori\\\u0161i|Ignori\\\u0161i|ignori\\\u0161ite|Ignori\\\u0161ite|ignori\\\u0161u|ilustruju|informi\\\u0161e|informi\\\u0161u|inspirisao|interesuje|Interesuje|Interesuju|interesuju|isekao|isterao|istera\\\u0161|Istera\\\u0161|isuvi\\\u0161e|ivica|ivice|ivici|ivicu|Izolujete|Izolujte|izgladneo|izmeriti|izmerio|izneo|izolujte|izneti|izvestan|izvinim|izvini\\\u0161|izviniti|izvinjenje|izvinjenja|izvinjenju|jedamput|jelda|Je\\\u0161\\\u0107emo|ju\\\u010de|Ju\\\u010de|kakava|kampuje|kampujemo|kampuju|kancelariji|kancelarijom|kancera|kandidovati|kandidujem|karmin|karminom|k\\\u0107erci|k\\\u0107erka|k\\\u010derka|K\\\u0107erka|K\\\u010derka|k\\\u0107erkama|ker|Ker|kerova|kidnapovan|Kidnapovan|kiji|kijim|klasifikuju|Ko|koa|koaj|kola|kolima|komandni|kombinuju|kompanija|kom\\\u0161ija|kom\\\u0161iji|kom\\\u0161iju|kom\\\u0161iluk|kom\\\u0161iluka|kom\\\u0161iluku|kom\\\u0161ije|kom\\\u0161ijama|kontroli\\\u0161u|Kontroli\\\u0161u|Kontroli\\\u0161i|kontroli\\\u0161i|Kontroli\\\u0161ite|kontroli\\\u0161ite|korpu|kritikuju|krsta|krstu|krsti\\\u0107a|krsti\\\u0107u|Krsta|Krstu|Krsti\\\u0107a|Krsti\\\u0107u|krstom|krstove|Krstove|krstovima|Krstovima|kri\\\u017eom|kupatilo|kupatilu|kvalifikuju|la\\\u017eeju|la\\\u017eov|la\\\u017eovi|la\\\u017eovu|la\\\u017eovima|la\\\u017eovom|lebdeo|le\\\u010di|le\\\u010de|lje\\\u010di|Le\\\u010di|Lje\\\u010di|Lejn|Lenja|lenji|lenja|le\\\u0161nik|Leta|leto|letiti|leve|lo\\\u017ei|lza|majca|majce|majcu|majcom|Malopre|malopre|maloprije|manifestuje|Mek|mehur|menom|mera\\\u010d|meri|mere|merdevine|merdevinama|me\\\u0161ane|me\\\u0161avina|me\\\u0161avine|me\\\u0161avinu|me\\\u0161tana|minut|mo\\\u010d|mofu|momenat|muzejem|muzici|na\\\u010di|naduvan|najpre|Najpre|najzad|nanev\\\u0161i|napastvuje|Napolje|napolje|Napolju|napolju|nauka|Nauka|nauci|nazad|Nazad|napred|Napred|naprimjer|naseo|nasme\\\u0161i|nasre\\\u0107u|nebi|nebih|Nebi|Nebih|nebismo|Nebismo|nebiste|Nebiste|nedaj|negde|Negde|neguje|neguju|nekto|nemi|nemrem|nemogu|Nemogu|nemora|Nemora|nene|ne\\\u0161o|nevreme|nezi|nigde|Nigde|niko|Niko|nisma|Nisma|ne\\\u0107\\\u0161|nejde|neda|nedam|new\\ yor\\\u0161ki|nju\\ jor\\\u0161ki|njegi|ne\\\u017eeli|niej|njie|njem|njeme|nsiam|nteko|obe|Obe|obema|Obezbe\\\u0111uju|obezbe\\\u0111uju|objekat|oblast|oblastima|oblasti|obolelu|obo\\\u017eavalac|obu\\\u010di|obuhvata|odandje|odavdje|odela|odelu|odelenje|odelenju|odeljak|odeljenje|Odeljenje|odjeljenje|Odjeljenje|odeljenjem|odma|Odne\\\u0107u|odne\\\u0107u|odne\\\u0107e|odoliti|odneti|odprilike|odseo|odsela|odsesti|odupreti|ogladneo|organizuju|Organizuju|osje\\\u0107anja|osmehe|osmehne|osobenosti|ostrva|ostrvu|ostrvom|Ostrva|Ostrvu|Ostrvom|ostrvima|osete|ostrvo|Ostrvo|ovde|Ovde|ovdije|Ovdije|ovjde|Ovjde|palatama|palate|palatu|palati|pantalone|Pantalone|pantalona|pantalonama|par\\\u010de|par\\\u010deta|par\\\u010detom|parampar\\\u010dad|pd|pemzija|pemziju|penzionerski|Penzionerski|pertle|pesama|pesnicima|pe\\\u0161ice|Pe\\\u0161ice|plata|pla\\\u010da|platu|pla\\\u010danje|pla\\\u010danjem|pla\\\u0107e\\\u0161|po\\\u010de\\\u0107u|podjelimo|podnesti|podstreka\\\u010d|podsete|poen|poena|poene|poeni|Poeni|poenima|poludili|poma\\\u0107i|pomaknim|pomaknio|pomakniti|pomenu|Pomera|pomera|pomerajte|pomjeri|pomeraj|pomjeraj|pomeraju|pomerala|pomeranja|pomerati|pomjerati|pomeri\\\u0161|ponaosob|ponesla|Ponesla|pore\\\u0111enje|pore\\\u0111enju|porekla|poreklo|poreklu|Porodica|Porodice|porodica|porodice|porodici|porodicama|porodicom|porodicu|posle|Posle|poslje|postara|Postara\\\u0107u|postara\\\u0107u|postaraj|Postaraj|Postaraju|postaraju|postarajmo|postaramo|postara\\\u0161|povesne|Povinuju|povinuju|pozadi|praktikuj|praktikuju|praktikovala|praktikovati|pre|Pre|Pre\\\u0107i|pre\\\u0107i|predame|predelu|preformuli\\\u0161i|preklo|preloma|Prene\\\u0107u|prene\\\u0107u|prenos|prenosa|prenosom|prenosu|preneo|prenela|prenjela|preneli|prenjeli|preneti|preporu\\\u010da|prese\\\u0107i|preti|prete\\\u0107im|prete\\\u0107ih|pretrpeo|prevod|Prevod|prezentovati|pridonjeti|prijatan|primedbi|primjete|prisetim|pritiskam|prmda|procenat|procent|procenata|procenti|Procenti|procente|Procente|procentu|Procentu|procentima|prodato|prohte|projekat|Projekat|promijena|protestvovat|Protestvovat|Protestvujem|protestvujem|protestvuju|protestuju\\\u0107i|psihi\\\u0107ki|ra\\\u010dunari|ra\\\u010dunare|radijo|ra\\\u0111e|ranac|rancu|rascep|rasejan|rasejana|raspust|razdevi\\\u010de|razgovrati|razre\\\u0161i|razume|razumeju|re\\\u0111e|rejv|rejvu|reko|rengen|repuje\\\u0161|resetuje|resetujte|Resetujte|rije\\\u0111i|Rizikuj|rokenrol|ronioc|savije\\\u0161\\\u0107u|save\\\u0161\\\u0107u|sede\\\u0107e\\\u0161|sedeli|sedi\\\u0161ta|sedi\\\u0161te|sedi\\\u0161tu|sedni|Sedni|sedi|Sedi|sedite|sesti|sekire|sekiraj|sekiramo|sekirate|sekirajte|seme|sertan|Se\\\u0161\\\u0107u|se\\\u0161\\\u0107u|sje\\\u0161\\\u0107emo|seta|sigruno|siguan|sija|sir\\\u0107e|sir\\\u0107eta|sir\\\u0107etu|sle\\\u0107e|sle\\\u0107u|sle\\\u0107emo|sleva|se\\\u0107anjima|seo|Seo|sem|sma|smao|Smao|sme|Sme|sme\\\u0107pm|smej|smesta|Smesta|smeste|sme\\\u0161ak|sme\\\u0161i|Sme\\\u0161i|sme\\\u0161io|sme\\\u0161kom|smjeo|smrdeo|sintersajzer|sitnisajzer|skelet|so\\\u010diva|so\\\u010divo|so\\\u010divom|so\\\u010divu|spasao|Spasao|spasen|spasla|spasli|speluje|speluju|spolja|stabilizuju|starati|Starati|steni|stepen|stepena|stepeni|stepenu|sticati|stiditi|stole\\\u0107a|stobom|stvrano|subjekat|sudija|Sudija|sudije|sudiji|sudijo|sudiju|sudijom|sudijskog|sugeri\\\u0161u|sugeri\\\u0161e|surfuje|surfuje\\\u0161|surfuju|su\\\u0161tina|su\\\u0161tinski|suvim|svestan|svjest|Svjest|svjesti|Svjesti|svetova|svugde|\\\u0161olja|\\\u0161olju|\\\u0160ta|\\\u0161tagod|\\\u0161ta|\\\u0161tp|\\\u0161tampa|\\\u0161tampu|\\\u0161tampom|\\\u0161tampi|\\\u0161tampati|tablu|tako\\\u0111e|Tako\\\u0111e|talas|Talas|talasa|talasima|talase|talasi|Talasi|te\\\u010dnost|te\\\u010dnosti|te\\\u010dno\\\u0161\\\u0107u|tek\\\u0161o|Tek\\\u0161o|terajte|to\\\u010dak|To\\\u010dak|toha|tovj|trabam|trkanje|trkanja|trkao|trougao|trougla|trouglu|trouglove|trpeo|Trpeo|tugi|tvrtci|ubede|Ube\\\u0111ivao|ube\\\u0111ivati|ubje\\\u0111ivati|ube\\\u0111uje|ube\\\u0111uje\\\u0161|ube\\\u0111uju|ubjediti|u\\\u010dtivo|u\\\u010dtivost|u\\\u010dtivo\\\u0161\\\u0107u|udata|Udata|udeo|uliva|ulivali|ulivate|uljeva|u\\ jutro|ujutru|ume|umem|ume\\\u0161|umesto|umetninama|umreti|Umret|Une\\\u0107u|univerzitet|univerzitetu|Uop\\\u0161te|uop\\\u0161te|uop\\\u010de|uprkos|Uprkos|uradio|Uredu|uspe|Uspe|uspeo|Uspeo|uspe\\\u0161|uspeju|uspjevala|uspijo|u\\ sred|usled|Usled|usledila|usljed|Usljed|u\\\u0161unjate|utehe|uve\\\u010de|uvijet|uvo|vaistinu|Vaistinu|varnica|varnicu|vaspitavan|vaspitavanju|va\\\u0161ljivi|va\\\u017ei|ve\\\u010dan|vek|veka|veke|vekova|venca|ve\\\u010dnost|veoma|Veoma|veren|Veren|verena|vereni|verimo|ve\\\u0161\\\u0107u|ve\\\u0161u|vidjeo|Vidjeo|vjerojatno\\\u0107a|vje\\\u0161\\\u0107u|vje\\\u0161ta\\\u010dko|vje\\\u0161ta\\\u010dki|vje\\\u0161ta\\\u010dkom|vje\\\u0161ta\\\u010dkog|vje\\\u0161ta\\\u010dku|vlo|Vodi\\\u0107e|Vodi\\\u0107u|voliti|vredelo|vrednom|vrednog|vreme|Vreme|vrjeme|Vrjeme|vrteo|whiskey|zaceljivanje|zagrevanje|zalepili|zalepiti|zanm|zanma|zaspem|zastareo|za\\ uvijek|zavera|zavredili|zahtev|Zahtev|zasede|zasedi|zasedu|zatp|Zatp|zbg|zdrvo|Zdrvo|zlodela|zna\\\u0107i|zvani\\\u010dan|\\\u017eemo|\\\u017diveo|\\\u017emureo|Ajron|Ar\\\u010di|Ajvi|Beverli|Bejker|Brid\\\u017eit|Bri\\\u017eit|Darvin|Darvina|Darvinu|Darvinom|Dejv|Dejvi|Dejva|Dejvu|Dejvom|Den|Dru|D\\\u017eosi|\\\u0110o\\\u0161ua|D\\\u017ees|D\\\u017een|D\\\u017eej|D\\\u017eejn|D\\\u017eil|D\\\u017eodi|D\\\u017euli|Ejb|Ejmi|Ejpril|End\\\u017ei|Entoni|E\\\u0161li|Fibi|Gre\\\u010den|Grejs|Hju|Hjua|Hjuz|Hjuza|Hjuston|Ilejn|Kejsi|Kerol|Kerolajn|Kloe|Kortni|Krejg|Kristi|Lajf|Lusi|Majk|Medelin|Mejbel|Mejn|Mejna|Mejnu|Mejnom|Merilend|Mi\\\u010del|Nejt|Nensi|Ni\\\u010de|Odri|Ohajo|Pem|Pejd\\\u017e|Rej\\\u010del|Rouz|Stejt|Stejsi|\\\u0160eron|\\\u0160eril|\\\u0160paniji|Tajms|Tejlor|\\\u017dak|januar|Januar|februar|februara|februaru|Februar|Februara|Februaru|mart|Mart|april|April|maj|Maj|svibnjom|jun|juna|junu|Jun|juli|jula|julu|Juli|septembar|Septembar|oktobar|Oktobar|novembar|november|novembra|novembru|Novembar|November|Novembra|Novembru|decembar|Decembar)(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'advokati', u'odvjetnici'), (u'Advokati', u'Odvjetnici'), (u'advokatima', u'odvjetnicima'), (u'Advokatima', u'Odvjetnicima'), (u'afirmi\u0161e', u'afirmira'), (u'akcenat', u'naglasak'), (u'akcionara', u'dioni\u010dara'), (u'akvarijum', u'akvarij'), (u'akvarijumu', u'akvariju'), (u'amin', u'amen'), (u'Amin', u'Amen'), (u'ans', u'nas'), (u'apsorbovanje', u'apsorbiranje'), (u'apsorbuje', u'apsorbira'), (u'azot', u'du\u0161ik'), (u'ba\u0161ta', u'vrt'), (u'Ba\u0161ta', u'Vrt'), (u'ba\u0161te', u'vrtovi'), (u'Ba\u0161te', u'Vrtovi'), (u'ba\u0161ti', u'vrtu'), (u'ba\u0161tu', u'vrt'), (u'Ba\u0161tu', u'Vrt'), (u'ba\u0161tom', u'vrtom'), (u'bedan', u'bijedan'), (u'bede', u'bijede'), (u'bedi', u'bijedi'), (u'bejah', u'bijah'), (u'bejahu', u'bijahu'), (u'bele\u0161ci', u'bilje\u0161ci'), (u'be\u0161ike', u'mjehure'), (u'bebisiterka', u'dadilja'), (u'beg', u'bijeg'), (u'begu', u'bijegu'), (u'begstva', u'bijega'), (u'beja\u0161e', u'bija\u0161e'), (u'bekstvo', u'bijeg'), (u'bekstvu', u'bijegu'), (u'begstvu', u'bijegu'), (u'bes', u'bijes'), (u'besa', u'bijesa'), (u'besan', u'bijesan'), (u'besom', u'bijesom'), (u'besu', u'bijesu'), (u'be\u0161e', u'bje\u0161e'), (u'bimso', u'bismo'), (u'blije\u0111i', u'blje\u0111i'), (u'bioje', u'bio je'), (u'bi smo', u'bismo'), (u'bi ste', u'biste'), (u'bioskop', u'kino'), (u'bioskopi', u'kina'), (u'bitci', u'bitki'), (u'bled', u'blijed'), (u'blede', u'blijede'), (u'boksuje\u0161', u'boksa\u0161'), (u'bolesan', u'bolestan'), (u'bolila', u'boljela'), (u'bori\u0107e\u0161', u'borit \u0107e\u0161'), (u'Bori\u0107e\u0161', u'Borit \u0107e\u0161'), (u'braon', u'sme\u0111a'), (u'bregu', u'brijegu'), (u'bti', u'biti'), (u'cedilu', u'cjedilu'), (u'ceo', u'cijeli'), (u'Ceo', u'Cijeli'), (u'cepa', u'cijepa'), (u'cev', u'cijev'), (u'cevi', u'cijevi'), (u'cjevi', u'cijevi'), (u'cevima', u'cijevima'), (u'Cevi', u'Cijevi'), (u'Cjevi', u'Cijevi'), (u'Cevima', u'Cijevima'), (u'Cjevima', u'Cijevima'), (u'cev\u010dica', u'cjev\u010dica'), (u'cev\u010dicu', u'cjev\u010dicu'), (u'cutanje', u'\u0161utnja'), (u'\u010dutanje', u'\u0161utnja'), (u'\u0107utanje', u'\u0161utnja'), (u'Cutanje', u'\u0160utnja'), (u'\u010cutanje', u'\u0160utnja'), (u'\u0106utanje', u'\u0160utnja'), (u'cutanjem', u'\u0161utnjom'), (u'\u010dutanjem', u'\u0161utnjom'), (u'\u0107utanjem', u'\u0161utnjom'), (u'Cutanjem', u'\u0160utnjom'), (u'\u010cutanjem', u'\u0160utnjom'), (u'\u0106utanjem', u'\u0160utnjom'), (u'cvetaju', u'cvjetaju'), (u'cvetove', u'cvjetove'), (u'cvetu', u'cvijetu'), (u'cvjetu', u'cvijetu'), (u'cvetalo', u'cvjetalo'), (u'cvjetom', u'cvijetom'), (u'\u010cakom', u'Chuckom'), (u'\u010dar\u0161av', u'plahta'), (u'\u010dar\u0161ave', u'plahte'), (u'\u010dar\u0161avi', u'plahte'), (u'\u010dar\u0161avima', u'plahtama'), (u'\u010das', u'sat'), (u'\u010detvoro', u'\u010detvero'), (u'\u010cita\u0107u', u'\u010citat \u0107u'), (u'\u010derku', u'k\u0107er'), (u'\u010cerku', u'K\u0107er'), (u'\u0107erku', u'k\u0107er'), (u'\u0106erku', u'K\u0107er'), (u'\u0107erkama', u'k\u0107erima'), (u'\u010derkama', u'k\u0107erima'), (u'\u0107erkom', u'k\u0107eri'), (u'\u010derkom', u'k\u0107eri'), (u'k\u0107erkom', u'k\u0107eri'), (u'k\u010derkom', u'k\u0107eri'), (u'\u010cu', u'\u0106u'), (u'\u010ce\u0161', u'\u0106e\u0161'), (u'\u010ce', u'\u0106e'), (u'\u010cemo', u'\u0106emo'), (u'\u010cete', u'\u0106ete'), (u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u0107ete'), (u'\u0107ebe', u'deku'), (u'\u0107ebetu', u'deki'), (u'\u010dk', u'\u010dak'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107ale', u'tata'), (u'\u0107aletom', u'ocem'), (u'\u0107aleta', u'oca'), (u'\u0107aletu', u'ocu'), (u'\u0107orsokak', u'slijepa ulica'), (u'\u0107orsokaku', u'slijepoj ulici'), (u'\u0107o\u0161ak', u'ugao'), (u'\u0107o\u0161ku', u'uglu'), (u'\u0107erka', u'k\u0107i'), (u'\u0106erka', u'K\u0107i'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010du\u0107e', u'\u010dut \u0107e'), (u'\u010du\u0107emo', u'\u010dut \u0107emo'), (u'\u010cu\u0107emo', u'\u010cut \u0107emo'), (u'\u010cu\u0107ete', u'\u010cut \u0107ete'), (u'\u010cu\u0107e', u'\u010cut \u0107e'), (u'\u0107uo', u'\u010duo'), (u'\u0107utao', u'\u0161utio'), (u'\u0106utao', u'\u0160utio'), (u'\u0107ute', u'\u0161ute'), (u'\u0106ute', u'\u0160ute'), (u'cvetova', u'cvjetova'), (u'daga', u'da ga'), (u'damas', u'danas'), (u'date', u'dane'), (u'deda', u'djed'), (u'Deda', u'Djed'), (u'dede', u'djeda'), (u'dedi', u'djedu'), (u'dedom', u'djedom'), (u'defini\u0161e', u'definira'), (u'dejstvo', u'djelovanje'), (u'Dejstvo', u'Djelovanje'), (u'dejstvom', u'djelovanjem'), (u'Dejstvom', u'Djelovanjem'), (u'dele\u0107i', u'dijele\u0107i'), (u'deo', u'dio'), (u'Deo', u'Dio'), (u'de\u0161ava', u'doga\u0111a'), (u'dete', u'dijete'), (u'Dete', u'Dijete'), (u'diluje', u'dila'), (u'diluju', u'dilaju'), (u'diskutuje', u'raspravlja'), (u'Diskutuje', u'Raspravlja'), (u'diskutujemo', u'raspravljamo'), (u'Diskutujemo', u'Raspravljamo'), (u'djete', u'dijete'), (u'Djete', u'Dijete'), (u'detektuje', u'detektira'), (u'dodju', u'do\u0111u'), (u'dole', u'dolje'), (u'Dole', u'Dolje'), (u'donijeo', u'donio'), (u'Donijeo', u'Donio'), (u'Donije\u0107u', u'Donijet \u0107u'), (u'dosledan', u'dosljedan'), (u'dospeo', u'dospio'), (u'dospeju', u'dospiju'), (u'do\u0111avola', u'dovraga'), (u'Do\u0111avola', u'Dovraga'), (u'drug', u'prijatelj'), (u'drugari', u'prijatelji'), (u'drugare', u'prijatelje'), (u'drug\u010diji', u'druga\u010diji'), (u'drugde', u'drugdje'), (u'duuga', u'd\xfaga'), (u'duvana', u'duhana'), (u'dve', u'dvije'), (u'Dve', u'Dvije'), (u'dvema', u'dvjema'), (u'\u0111avo', u'vrag'), (u'\u0111avola', u'vraga'), (u'\u0111emper', u'd\u017eemper'), (u'd\u017eanki', u'ovisnik'), (u'd\u017eelat', u'krvnik'), (u'\u0111ubre', u'sme\u0107e'), (u'efekat', u'efekt'), (u'eksperata', u'stru\u010dnjaka'), (u'eksperti', u'stru\u010dnjaci'), (u'Eksperti', u'Stru\u010dnjaci'), (u'ekspertima', u'stru\u010dnjacima'), (u'en', u'ne'), (u'emitovao', u'emitirao'), (u'emitovati', u'emitirati'), (u'emituje', u'emitira'), (u'emitujem', u'emitiram'), (u'Emitujem', u'Emitiram'), (u'emituju', u'emitiraju'), (u'evra', u'eura'), (u'familija', u'obitelj'), (u'Familija', u'Obitelj'), (u'familiju', u'obitelj'), (u'Familiju', u'Obitelj'), (u'familijama', u'obiteljima'), (u'familiji', u'obitelji'), (u'flertuje', u'o\u010dijuka'), (u'foka', u'tuljan'), (u'foku', u'tuljana'), (u'foke', u'tuljani'), (u'fokama', u'tuljanima'), (u'fotografi\u0161u', u'fotografiraju'), (u'gasova', u'plinova'), (u'gde', u'gdje'), (u'Gde', u'Gdje'), (u'gluhonem', u'gluhonijem'), (u'gre\u0161e', u'grije\u0161e'), (u'grje\u0161e', u'grije\u0161e'), (u'gre\u0161i', u'grije\u0161i'), (u'grje\u0161i', u'grije\u0161i'), (u'gre\u0161ki', u'gre\u0161ci'), (u'grijehova', u'grijeha'), (u'grijehove', u'grijehe'), (u'hipnotisao', u'hipnotizirao'), (u'hipnotisana', u'hipnotizirana'), (u'hipnoti\u0161e', u'hipnotizira'), (u'Historija', u'Povijest'), (u'Historiju', u'Povijest'), (u'Historije', u'Povijesti'), (u'Historiji', u'Povijesti'), (u'Istorija', u'Povijest'), (u'Istoriju', u'Povijest'), (u'Istorije', u'Povijesti'), (u'Istoriji', u'Povijesti'), (u'historije', u'povijesti'), (u'historiji', u'povijesti'), (u'istorije', u'povijesti'), (u'istoriji', u'povijesti'), (u'istorijom', u'povije\u0161\u0107u'), (u'hakuje', u'hakira'), (u'Hakuje', u'Hakira'), (u'hakujemo', u'hakiramo'), (u'Hakujemo', u'Hakiramo'), (u'Hakuju', u'Hakiraju'), (u'hakuju', u'hakiraju'), (u'ho\u010du', u'ho\u0107u'), (u'Ho\u010du', u'Ho\u0107u'), (u'hte\u0107e', u'htjet \u0107e'), (u'htedoh', u'htjedoh'), (u'Htjeo', u'Htio'), (u'Hteo', u'Htio'), (u'htjeo', u'htio'), (u'hteo', u'htio'), (u'i\u010di', u'i\u0107i'), (u'I\u010di', u'I\u0107i'), (u'iko', u'itko'), (u'ignori\u0161i', u'ignoriraj'), (u'Ignori\u0161i', u'Ignoriraj'), (u'ignori\u0161ite', u'ignorirajte'), (u'Ignori\u0161ite', u'Ignorirajte'), (u'ignori\u0161u', u'ignoriraju'), (u'ilustruju', u'ilustriraju'), (u'inspirisao', u'inspirirao'), (u'interesantan', u'zanimljiv'), (u'Interesantan', u'Zanimljiv'), (u'interesuje', u'zanima'), (u'Interesuje', u'Zanima'), (u'interesujemo', u'zanimamo'), (u'Interesujemo', u'Zanimamo'), (u'interesujete', u'zanimate'), (u'Interesujete', u'Zanimate'), (u'Interesuju', u'Zanimaju'), (u'interesuju', u'zanimaju'), (u'isekao', u'izrezao'), (u'isterao', u'istjerao'), (u'istera\u0161', u'istjera\u0161'), (u'Istera\u0161', u'Istjera\u0161'), (u'istrebi', u'istrijebi'), (u'istrebiti', u'istrijebiti'), (u'isuvi\u0161e', u'previ\u0161e'), (u'ivica', u'rub'), (u'ivice', u'ruba'), (u'ivici', u'rubu'), (u'ivicu', u'rub'), (u'izduvaj', u'ispu\u0161i'), (u'izduvamo', u'ispu\u0161emo'), (u'izoluje', u'izolira'), (u'izolujemo', u'izoliramo'), (u'izoluje\u0161', u'izolira\u0161'), (u'Izolujete', u'Izolirate'), (u'Izolujte', u'Izolirajte'), (u'izolujte', u'izolirajte'), (u'izgladneo', u'izgladnio'), (u'izmeriti', u'izmjeriti'), (u'izmerio', u'izmjerio'), (u'izme\u0161ane', u'izmije\u0161ane'), (u'izneo', u'iznio'), (u'izneti', u'iznijeti'), (u'izvestan', u'izvjestan'), (u'izvinem', u'ispri\u010dam'), (u'izvine\u0161', u'ispri\u010da\u0161'), (u'Izvinem', u'Ispri\u010dam'), (u'Izvine\u0161', u'Ispri\u010da\u0161'), (u'izvinim', u'ispri\u010dam'), (u'izvini\u0161', u'ispri\u010da\u0161'), (u'izviniti', u'ispri\u010dati'), (u'izvinjenje', u'isprika'), (u'izvinjenja', u'isprike'), (u'izvinjenju', u'isprici'), (u'jedamput', u'jedanput'), (u'jelda', u"jel' da"), (u'Je\u0161\u0107emo', u'Jest \u0107emo'), (u'Je\u0161\u0107e\u0161', u'Jest \u0107e\u0161'), (u'je\u0161\u0107e', u'jest \u0107e'), (u'je\u0161\u0107u', u'jest \u0107u'), (u'Je\u0161\u0107u', u'Jest \u0107u'), (u'je\u0161\u0107e\u0161', u'jest \u0107e\u0161'), (u'je\u0161\u0107emo', u'jest \u0107emo'), (u'ju\u010de', u'ju\u010der'), (u'Ju\u010de', u'Ju\u010der'), (u'kakava', u'kakva'), (u'kampovao', u'kampirao'), (u'kampuje', u'kampira'), (u'kampujemo', u'kampiramo'), (u'kampuju', u'kampiraju'), (u'kancelarija', u'ured'), (u'kancelarijama', u'uredima'), (u'kancelariju', u'ured'), (u'Kancelarija', u'Ured'), (u'Kancelariju', u'Ured'), (u'kancelariji', u'uredu'), (u'kancelarije', u'ureda'), (u'kancelarijom', u'uredom'), (u'kancera', u'raka'), (u'kandidovati', u'kandidirati'), (u'kandidujem', u'kandidiram'), (u'kapar', u'kopar'), (u'kapra', u'kopra'), (u'karmin', u'ru\u017e'), (u'karminom', u'ru\u017eem'), (u'k\u0107erci', u'k\u0107eri'), (u'k\u0107erka', u'k\u0107i'), (u'k\u010derka', u'k\u0107i'), (u'K\u0107erka', u'K\u0107i'), (u'K\u010derka', u'K\u0107i'), (u'k\u0107erkama', u'k\u0107erima'), (u'ker', u'pas'), (u'Ker', u'Pas'), (u'kerova', u'pasa'), (u'kidnapovan', u'otet'), (u'Kidnapovan', u'Otet'), (u'kiji', u'koji'), (u'kijim', u'kojim'), (u'klasifikuju', u'klasificiraju'), (u'kle\u0161ta', u'klije\u0161ta'), (u'klje\u0161ta', u'klije\u0161ta'), (u'Ko', u'Tko'), (u'koa', u'kao'), (u'koaj', u'koja'), (u'kola', u'auto'), (u'kolima', u'autu'), (u'komandni', u'zapovjedni'), (u'kombinuju', u'kombiniraju'), (u'kompanija', u'tvrtka'), (u'komponovao', u'skladao'), (u'kom\u0161ija', u'susjed'), (u'kom\u0161iji', u'susjedu'), (u'kom\u0161iju', u'susjeda'), (u'kom\u0161iluk', u'susjedstvo'), (u'kom\u0161iluka', u'susjedstva'), (u'kom\u0161iluku', u'susjedstvu'), (u'kom\u0161ije', u'susjedi'), (u'kom\u0161ijama', u'susjedima'), (u'kom\u0161inica', u'susjeda'), (u'kom\u0161inicu', u'susjedu'), (u'konektovan', u'spojen'), (u'konektovati', u'spojiti'), (u'kontroli\u0161u', u'kontroliraju'), (u'Kontroli\u0161u', u'Kontroliraju'), (u'Kontroli\u0161i', u'Kontroliraj'), (u'kontroli\u0161i', u'kontroliraj'), (u'Kontroli\u0161ite', u'Kontrolirajte'), (u'kontroli\u0161ite', u'kontrolirajte'), (u'korpu', u'ko\u0161aru'), (u'kritikuju', u'kritiziraju'), (u'krsta', u'kri\u017ea'), (u'krsta\u0161i', u'kri\u017eari'), (u'krstu', u'kri\u017eu'), (u'krsti\u0107a', u'kri\u017ei\u0107a'), (u'krsti\u0107u', u'kri\u017ei\u0107u'), (u'Krsta', u'Kri\u017ea'), (u'Krstu', u'Kri\u017eu'), (u'Krsti\u0107a', u'Kri\u017ei\u0107a'), (u'Krsti\u0107u', u'Kri\u017ei\u0107u'), (u'krstom', u'kri\u017eem'), (u'krstove', u'kri\u017eeve'), (u'Krstove', u'Kri\u017eeve'), (u'krstovima', u'kri\u017eevima'), (u'Krstovima', u'Kri\u017eevima'), (u'kri\u017eom', u'kri\u017eem'), (u'kupatilo', u'kupaona'), (u'kupatilu', u'kupaoni'), (u'kvalifikuju', u'kvalificiraju'), (u'la\u017eeju', u'la\u017eu'), (u'La\u017eov', u'La\u017eljivac'), (u'la\u017eov', u'la\u017eljivac'), (u'la\u017eovi', u'la\u017eljivci'), (u'la\u017eovu', u'la\u017eljivcu'), (u'la\u017eovima', u'la\u017eljivcima'), (u'la\u017eovom', u'la\u017eljivcem'), (u'lebdeo', u'lebdio'), (u'le\u010di', u'lije\u010di'), (u'le\u010de', u'lije\u010de'), (u'lje\u010di', u'lije\u010di'), (u'Le\u010di', u'Lije\u010di'), (u'Lje\u010di', u'Lije\u010di'), (u'Lejn', u'Lane'), (u'Lenja', u'Lijena'), (u'lenji', u'lijeni'), (u'lenja', u'lijena'), (u'le\u0161nik', u'lje\u0161njak'), (u'Leta', u'Ljeta'), (u'leto', u'ljeto'), (u'Leto', u'Ljeto'), (u'letos', u'ljetos'), (u'letiti', u'letjeti'), (u'leve', u'lijeve'), (u'lo\u017ei', u'pali'), (u'lza', u'Iza'), (u'ljepiti', u'lijepiti'), (u'ljepili', u'lijepili'), (u'magnezijuma', u'magnezija'), (u'magnezijumu', u'magneziju'), (u'maja', u'svibnja'), (u'maju', u'svibnju'), (u'majem', u'svibnjem'), (u'majca', u'majica'), (u'majce', u'majice'), (u'majcu', u'majicu'), (u'majcom', u'majicom'), (u'Malopre', u'Malo prije'), (u'malopre', u'malo prije'), (u'maloprije', u'malo prije'), (u'manifestuje', u'manifestira'), (u'manifestuju', u'manifestiraju'), (u'marta', u'o\u017eujka'), (u'martu', u'o\u017eujku'), (u'martom', u'o\u017eujkom'), (u'mehur', u'mjehur'), (u'menom', u'mnom'), (u'mera\u010d', u'mjera\u010d'), (u'meri', u'mjeri'), (u'mere', u'mjere'), (u'merdevine', u'ljestve'), (u'merdevinama', u'ljestvama'), (u'merljivo', u'mjerljivo'), (u'me\u0161ane', u'mije\u0161ane'), (u'me\u0161avina', u'mje\u0161avina'), (u'me\u0161avine', u'mje\u0161avine'), (u'me\u0161avinu', u'mje\u0161avinu'), (u'minut', u'minutu'), (u'mleo', u'mljeo'), (u'mo\u010d', u'mo\u0107'), (u'mofu', u'mogu'), (u'momenat', u'trenutak'), (u'momenta', u'trena'), (u'muzejem', u'muzejom'), (u'muzici', u'glazbi'), (u'muzika', u'glazba'), (u'muzike', u'glazbe'), (u'muzikom', u'glazbom'), (u'Muzika', u'Glazba'), (u'Muzike', u'Glazbe'), (u'Muzikom', u'Glazbom'), (u'na\u010di', u'na\u0107i'), (u'nadevati', u'nadijevati'), (u'naduvan', u'napu\u0161en'), (u'najpre', u'najprije'), (u'Najpre', u'Najprije'), (u'najzad', u'napokon'), (u'nanev\u0161i', u'nanjev\u0161i'), (u'nanjeli', u'nanijeli'), (u'napastvuje', u'napastuje'), (u'Napolje', u'Van'), (u'napolje', u'van'), (u'Napolju', u'Vani'), (u'napolju', u'vani'), (u'nauka', u'znanost'), (u'Nauka', u'Znanost'), (u'nauci', u'znanosti'), (u'nazad', u'natrag'), (u'Nazad', u'Natrag'), (u'napred', u'naprijed'), (u'Napred', u'Naprijed'), (u'naprimjer', u'na primjer'), (u'naseo', u'nasjeo'), (u'nasesti', u'nasjesti'), (u'nasre\u0107u', u'na sre\u0107u'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebismo', u'ne bismo'), (u'Nebismo', u'Ne bismo'), (u'nebiste', u'ne biste'), (u'Nebiste', u'Ne biste'), (u'nedaj', u'ne daj'), (u'negde', u'negdje'), (u'Negde', u'Negdje'), (u'neguje', u'njeguje'), (u'neguju', u'njeguju'), (u'nekto', u'netko'), (u'nemi', u'nijemi'), (u'nemrem', u'ne mogu'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nene', u'njene'), (u'ne\u0161o', u'ne\u0161to'), (u'nevesta', u'nevjesta'), (u'nevreme', u'nevrijeme'), (u'nezi', u'njezi'), (u'niasm', u'nisam'), (u'nigde', u'nigdje'), (u'Nigde', u'Nigdje'), (u'nikakave', u'nikakve'), (u'niko', u'nitko'), (u'Niko', u'Nitko'), (u'nisma', u'nisam'), (u'Nisma', u'Nisam'), (u'ne\u0107\u0161', u'ne\u0107e\u0161'), (u'nejde', u'ne ide'), (u'Nejde', u'Ne ide'), (u'neda', u'ne da'), (u'nedam', u'ne dam'), (u'negujem', u'njegujem'), (u'njegi', u'njezi'), (u'ne\u017eeli', u'ne \u017eeli'), (u'niej', u'nije'), (u'nili', u'niti'), (u'njie', u'nije'), (u'njem', u'nijem'), (u'njeme', u'njene'), (u'nominovan', u'nominiran'), (u'nsiam', u'nisam'), (u'nteko', u'netko'), (u'obe', u'obje'), (u'Obe', u'Obje'), (u'obema', u'objema'), (u'Obezbe\u0111uju', u'Osiguravaju'), (u'obezbe\u0111uju', u'osiguravaju'), (u'objekat', u'objekt'), (u'oblast', u'podru\u010dje'), (u'oblastima', u'podru\u010djima'), (u'oblasti', u'podru\u010dj*'), (u'obolelu', u'oboljelu'), (u'obo\u017eavalac', u'obo\u017eavatelj'), (u'obu\u010di', u'obu\u0107i'), (u'obuhvata', u'obuhva\u0107a'), (u'odandje', u'odande'), (u'odavdje', u'odavde'), (u'Odavdje', u'Odavde'), (u'odbi\u0107e\u0161', u'odbit \u0107e\u0161'), (u'odbi\u0107emo', u'odbit \u0107emo'), (u'odela', u'odjela'), (u'odelu', u'odjelu'), (u'odelenja', u'odjela'), (u'odelenje', u'odjel'), (u'odelenju', u'odjelu'), (u'odeljak', u'odjeljak'), (u'odeljenje', u'odjel'), (u'Odeljenje', u'Odjel'), (u'odjeljenje', u'odjel'), (u'Odjeljenje', u'Odjel'), (u'odeljenjem', u'odjelom'), (u'odma', u'odmah'), (u'Odne\u0107u', u'Odnijet \u0107u'), (u'odne\u0107u', u'odnijet \u0107u'), (u'odne\u0107e', u'odnijet \u0107e'), (u'odoliti', u'odoljeti'), (u'odneti', u'odnijeti'), (u'odseo', u'odsjeo'), (u'odsela', u'odsjela'), (u'odsesti', u'odsjesti'), (u'odupreti', u'oduprijeti'), (u'oduvek', u'oduvijek'), (u'Oduvek', u'Oduvijek'), (u'oduvjek', u'oduvijek'), (u'Oduvjek', u'Oduvijek'), (u'ogladneo', u'ogladnio'), (u'okoreli', u'okorjeli'), (u'organizuju', u'organiziraju'), (u'Organizuju', u'Organiziraju'), (u'osje\u0107anja', u'osje\u0107aje'), (u'osmehe', u'osmijehe'), (u'osmehne', u'osmjehne'), (u'osmehnu', u'osmjehnu'), (u'osobenosti', u'osobnosti'), (u'ostareli', u'ostarjeli'), (u'ostrva', u'otoka'), (u'ostrvu', u'otoku'), (u'ostrvom', u'otokom'), (u'Ostrva', u'Otoka'), (u'Ostrvu', u'Otoku'), (u'Ostrvom', u'Otokom'), (u'ostrvima', u'otocima'), (u'osete', u'osjete'), (u'ostrvo', u'otok'), (u'Ostrvo', u'Otok'), (u'osvjetljen', u'osvijetljen'), (u'ovde', u'ovdje'), (u'Ovde', u'Ovdje'), (u'ovdej', u'ovdje'), (u'ovdije', u'ovdje'), (u'Ovdije', u'Ovdje'), (u'ovjde', u'ovdje'), (u'Ovjde', u'Ovdje'), (u'pakuje', u'pakira'), (u'Pakuje', u'Pakira'), (u'Pakuju', u'Pakiraju'), (u'pakuju', u'pakiraju'), (u'palatama', u'pala\u010dama'), (u'palate', u'pala\u010de'), (u'palatu', u'pala\u010du'), (u'palati', u'pala\u010di'), (u'pantalone', u'hla\u010de'), (u'Pantalone', u'Hla\u010de'), (u'pantalona', u'hla\u010da'), (u'pantalonama', u'hla\u010dama'), (u'par\u010de', u'komadi\u0107'), (u'par\u010deta', u'komadi\u0107a'), (u'par\u010detu', u'komadi\u0107u'), (u'par\u010detom', u'komadi\u0107em'), (u'parampar\u010dad', u'komadi\u0107i'), (u'pastuv', u'pastuh'), (u'pastuva', u'pastuha'), (u'pastuvu', u'pastuhu'), (u'pd', u'od'), (u'pemzija', u'penzija'), (u'pemziju', u'penziju'), (u'penzionerski', u'umirovljeni\u010dki'), (u'Penzionerski', u'Umirovljeni\u010dki'), (u'pertle', u'\u017enirance'), (u'pesama', u'pjesama'), (u'pesnicima', u'pjesnicima'), (u'pe\u0161ice', u'pje\u0161ice'), (u'Pe\u0161ice', u'Pje\u0161ice'), (u'pe\u0161ke', u'pje\u0161ke'), (u'plata', u'pla\u0107a'), (u'pla\u010da', u'pla\u0107a'), (u'platom', u'pla\u0107om'), (u'platu', u'pla\u0107u'), (u'pla\u010danje', u'pla\u0107anje'), (u'pla\u010danjem', u'pla\u0107anjem'), (u'pla\u0107e\u0161', u'pla\u010de\u0161'), (u'plen', u'plijen'), (u'Plen', u'Plijen'), (u'pljen', u'plijen'), (u'Pljen', u'Plijen'), (u'po\u010de\u0107u', u'po\u010det \u0107u'), (u'podjelimo', u'podijelimo'), (u'podnesti', u'podnijeti'), (u'podstreka\u010d', u'poticatelj'), (u'podsete', u'podsjete'), (u'poen', u'bod'), (u'poena', u'boda'), (u'poene', u'bodove'), (u'poeni', u'bodovi'), (u'Poeni', u'Bodovi'), (u'poenima', u'bodovima'), (u'poludili', u'poludjeli'), (u'poma\u0107i', u'pomaknuti'), (u'pomaknim', u'pomaknem'), (u'pomaknio', u'pomaknuo'), (u'pomakni\u0161', u'pomakne\u0161'), (u'pomakniti', u'pomaknuti'), (u'pomenu', u'spomenu'), (u'Pomera', u'Mi\u010de'), (u'pomera', u'mi\u010de'), (u'pomjera', u'pomi\u010de'), (u'pomerajte', u'mi\u010dite'), (u'pomjeri', u'pomakni'), (u'pomeraj', u'mi\u010di'), (u'pomjeraj', u'mi\u010di'), (u'pomeraju', u'mi\u010du'), (u'pomerala', u'micala'), (u'pomjerala', u'pomicala'), (u'pomjeraju', u'pomi\u010du'), (u'pomeranja', u'pomicanja'), (u'pomerati', u'micati'), (u'pomjerati', u'pomicati'), (u'pomeri\u0161', u'pomakne\u0161'), (u'ponaosob', u'osobno'), (u'ponesla', u'ponijela'), (u'Ponesla', u'Ponijela'), (u'pore\u0111enje', u'usporedba'), (u'pore\u0111enju', u'usporedbi'), (u'porekla', u'podrijetla'), (u'poreklo', u'podrijetlo'), (u'poreklu', u'podrijetlu'), (u'Porodica', u'Obitelj'), (u'Porodice', u'Obitelji'), (u'porodica', u'obitelj'), (u'porodice', u'obitelji'), (u'porodici', u'obitelji'), (u'porodicama', u'obiteljima'), (u'porodicom', u'obitelji'), (u'porodicu', u'obitelj'), (u'poslata', u'poslana'), (u'posle', u'poslije'), (u'Posle', u'Poslije'), (u'poslje', u'poslije'), (u'posredi', u'posrijedi'), (u'postara', u'pobrine'), (u'Postara\u0107u', u'Pobrinut \u0107u'), (u'postara\u0107u', u'pobrinut \u0107u'), (u'postaraj', u'pobrini'), (u'Postaraj', u'Pobrini'), (u'Postaraju', u'Pobrinu'), (u'postaraju', u'pobrinu'), (u'postarajmo', u'pobrinimo'), (u'postaramo', u'pobrinemo'), (u'postara\u0161', u'pobrine\u0161'), (u'povesne', u'povijesne'), (u'Povinuju', u'Pokoravaju'), (u'povinuju', u'pokoravaju'), (u'pozadi', u'iza'), (u'po\u017eeleo', u'po\u017eelio'), (u'Po\u017eeleo', u'Po\u017eelio'), (u'Po\u017eeljeo', u'Po\u017eelio'), (u'po\u017eeljeo', u'po\u017eelio'), (u'praktikuj', u'prakticiraj'), (u'praktikuju', u'prakticiraju'), (u'praktikovala', u'prakticirala'), (u'praktikovati', u'prakticirati'), (u'pre', u'prije'), (u'Pre', u'Prije'), (u'predela', u'predjela'), (u'predelu', u'predjelu'), (u'Pre\u0107i', u'Prije\u0107i'), (u'pre\u0107i', u'prije\u0107i'), (u'pre\u0107utkuje', u'pre\u0161u\u0107uje'), (u'predame', u'preda me'), (u'predamnom', u'preda mnom'), (u'Predamnom', u'Preda mnom'), (u'preformuli\u0161i', u'preformuliraj'), (u'preklo', u'porijeklo'), (u'preloma', u'prijeloma'), (u'Prene\u0107u', u'Prenijet \u0107u'), (u'prene\u0107u', u'prenijet \u0107u'), (u'prenos', u'prijenos'), (u'prenosa', u'prijenosa'), (u'prenosom', u'prijenosom'), (u'prenosu', u'prijenosu'), (u'preneo', u'prenio'), (u'Preneo', u'Prenio'), (u'prenela', u'prenijela'), (u'prenjela', u'prenijela'), (u'preneli', u'prenijeli'), (u'prenjeli', u'prenijeli'), (u'preneti', u'prenijeti'), (u'preporu\u010da', u'preporu\u010duje'), (u'prese\u0107i', u'presje\u0107i'), (u'preti', u'prijeti'), (u'prete', u'prijete'), (u'Prete', u'Prijete'), (u'prjeti', u'prijeti'), (u'prjete', u'prijete'), (u'prete\u0107im', u'prijete\u0107im'), (u'prete\u0107ih', u'prijete\u0107ih'), (u'pretrpeo', u'pretrpio'), (u'prevod', u'prijevod'), (u'Prevod', u'Prijevod'), (u'prezentovati', u'prezentirati'), (u'prezentovane', u'prezentirane'), (u'prezentovan', u'prezentiran'), (u'prezentovani', u'prezentirani'), (u'prezentovano', u'prezentirano'), (u'pridonjeti', u'pridonijeti'), (u'prijatan', u'ugodan'), (u'prime\u0107ivao', u'primje\u0107ivao'), (u'primedbi', u'primjedbi'), (u'primjete', u'primijete'), (u'prisetim', u'prisjetim'), (u'prisetio', u'prisjetio'), (u'prisetite', u'prisjetite'), (u'pritiskam', u'priti\u0161\u0107em'), (u'prmda', u'iako'), (u'procenat', u'postotak'), (u'procent', u'postotak'), (u'procenta', u'postotka'), (u'procenata', u'postotaka'), (u'procenti', u'postoci'), (u'Procenti', u'Postoci'), (u'procente', u'postotke'), (u'Procente', u'Postotke'), (u'procentu', u'postotku'), (u'Procentu', u'Postotku'), (u'procentima', u'postocima'), (u'prodato', u'prodano'), (u'prohte', u'prohtije'), (u'projekat', u'projekt'), (u'Projekat', u'Projekt'), (u'promijena', u'promjena'), (u'prosledili', u'proslijedili'), (u'protestvovat', u'protestirat'), (u'Protestvovat', u'Protestirat'), (u'Protestvujem', u'Protestiram'), (u'protestvujem', u'protestiram'), (u'protestvuju', u'protestiraju'), (u'protestuju\u0107i', u'protestiraju\u0107i'), (u'psihi\u0107ki', u'psihi\u010dki'), (u'pto', u'\u0161to'), (u'ptom', u'potom'), (u'punoletan', u'punoljetan'), (u'Punoletan', u'Punoljetan'), (u'ra\u010dunari', u'ra\u010dunala'), (u'ra\u010dunare', u'ra\u010dunala'), (u'radijo', u'radio'), (u'ra\u0111e', u'radije'), (u'ranac', u'ruksak'), (u'rancu', u'ruksaku'), (u'rascep', u'rascjep'), (u'rasejan', u'rastresen'), (u'rasejana', u'rastresena'), (u'raspust', u'odmor'), (u'razbi\u0107u', u'razbit \u0107u'), (u'razbijesneo', u'razbjesnio'), (u'ra\u0161\u0107e', u'rast \u0107e'), (u'Razbi\u0107u', u'Razbit \u0107u'), (u'razdevi\u010de', u'razdjevi\u010de'), (u'razgovrati', u'razgovarati'), (u'razre\u0161i', u'razrije\u0161i'), (u'razume', u'razumije'), (u'razumeju', u'razumiju'), (u're\u010dju', u'rije\u010dju'), (u'Re\u010dju', u'Rije\u010dju'), (u'rje\u010dju', u'rije\u010dju'), (u'Rje\u010dju', u'Rije\u010dju'), (u'reagujte', u'reagirajte'), (u'redov', u'vojnik'), (u'redovu', u'vojniku'), (u're\u0111e', u'rje\u0111e'), (u're\u0111i', u'rje\u0111i'), (u'rejv', u'rave'), (u'rejvu', u'raveu'), (u'reko', u'rekao'), (u'rengen', u'rendgen'), (u'repuje\u0161', u'repa\u0161'), (u'resetuje', u'resetira'), (u'resetujte', u'resetirajte'), (u'Resetujte', u'Resetirajte'), (u'rije\u0111i', u'rje\u0111i'), (u'Rizikuj', u'Riskiraj'), (u'rizikuju', u'riskiraju'), (u'rizikuje', u'riskira'), (u'rizikujte', u'riskirajte'), (u'rje\u0161io', u'rije\u0161io'), (u'rokenrol', u"rock'n'roll"), (u'ronioc', u'ronilac'), (u'savije\u0161\u0107u', u'savje\u0161\u0107u'), (u'save\u0161\u0107u', u'savje\u0161\u0107u'), (u'secka', u'sjecka'), (u'seckam', u'sjeckam'), (u'sede\u0107e\u0161', u'sjedit \u0107e\u0161'), (u'sedeli', u'sjedili'), (u'sedi\u0161ta', u'sjedala'), (u'sedi\u0161te', u'sjedalo'), (u'sedi\u0161tu', u'sjedalu'), (u'sedni', u'sjedni'), (u'Sedni', u'Sjedni'), (u'sedi', u'sjedi'), (u'Sedi', u'Sjedi'), (u'sedite', u'sjedite'), (u'sesti', u'sjesti'), (u'sekire', u'sjekire'), (u'sekiraj', u'brini'), (u'sekiram', u'brinem'), (u'sekiramo', u'brinemo'), (u'sekira\u0161', u'brine\u0161'), (u'sekirate', u'brinete'), (u'sekirajte', u'brinite'), (u'seme', u'sjeme'), (u'sertan', u'sretan'), (u'Se\u0161\u0107u', u'Sjest \u0107u'), (u'se\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107emo', u'sjest \u0107emo'), (u'seta', u'sjeta'), (u'sigruno', u'sigurno'), (u'siguan', u'siguran'), (u'sija', u'sja'), (u'sijaju', u'sjaju'), (u'sir\u0107e', u'ocat'), (u'sir\u0107eta', u'octa'), (u'sir\u0107etu', u'octu'), (u'sje\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107e', u'sjest \u0107e'), (u'sle\u0107e', u'slije\u0107e'), (u'sle\u0107u', u'slije\u0107u'), (u'sle\u0107emo', u'slije\u0107emo'), (u'sleva', u'slijeva'), (u'se\u0107anjima', u'sje\u0107anjima'), (u'seo', u'sjeo'), (u'Seo', u'Sjeo'), (u'sem', u'osim'), (u'sma', u'sam'), (u'smao', u'samo'), (u'Smao', u'Samo'), (u'sme', u'smije'), (u'Sme', u'Smije'), (u'sme\u0107pm', u'sme\u0107em'), (u'smej', u'smij'), (u'Smejte', u'Smijte'), (u'smejte', u'smijte'), (u'smesta', u'smjesta'), (u'Smesta', u'Smjesta'), (u'smeste', u'smjeste'), (u'sme\u0161ak', u'smje\u0161ak'), (u'sme\u0161i', u'smije\u0161i'), (u'Sme\u0161i', u'Smije\u0161i'), (u'sme\u0161io', u'smije\u0161io'), (u'sme\u0161i\u0161', u'smije\u0161i\u0161'), (u'sme\u0161kom', u'smje\u0161kom'), (u'smjeo', u'smio'), (u'smrdeo', u'smrdio'), (u'sintersajzer', u'synthesizer'), (u'sitnisajzer', u'synthesizer'), (u'skelet', u'kostur'), (u'so\u010diva', u'le\u0107e'), (u'so\u010divima', u'le\u0107ama'), (u'so\u010divo', u'le\u0107a'), (u'so\u010divom', u'le\u0107om'), (u'so\u010divu', u'le\u0107i'), (u'Spakuj', u'Spakiraj'), (u'Spakujte', u'Spakirajte'), (u'spakujte', u'spakirajte'), (u'spasao', u'spasio'), (u'Spasao', u'Spasio'), (u'spasen', u'spa\u0161en'), (u'spasla', u'spasila'), (u'spasli', u'spasili'), (u'speluje', u'sri\u010de'), (u'speluju', u'sri\u010du'), (u'spoji\u0107e', u'spojit \u0107e'), (u'spolja', u'izvana'), (u'Sredi\u0107e', u'Sredit \u0107e'), (u'Sredi\u0107u', u'Sredit \u0107u'), (u'stabilizuju', u'stabiliziraju'), (u'starao', u'brinuo'), (u'starati', u'brinuti'), (u'Starati', u'Brinuti'), (u'steni', u'stijeni'), (u'stepen', u'stupanj'), (u'stepena', u'stupnjeva'), (u'stepeni', u'stupnjeva'), (u'stepenu', u'stupnju'), (u'sticati', u'stjecati'), (u'stiditi', u'stidjeti'), (u'streljamo', u'strijeljamo'), (u'streljati', u'strijeljati'), (u'stole\u0107a', u'stolje\u0107a'), (u'stobom', u's tobom'), (u'stvrano', u'stvarno'), (u'Stupi\u0107u', u'Stupit \u0107u'), (u'stupi\u0107u', u'stupit \u0107u'), (u'subjekat', u'subjekt'), (u'sudija', u'sudac'), (u'Sudija', u'Sudac'), (u'sudije', u'suca'), (u'sudiji', u'sucu'), (u'sudijo', u'su\u010de'), (u'sudiju', u'suca'), (u'sudijom', u'sucem'), (u'sudijskog', u'sudskog'), (u'sugeri\u0161u', u'predla\u017eu'), (u'sugeri\u0161e', u'predla\u017ee'), (u'supa', u'juha'), (u'supe', u'juhe'), (u'supi', u'juhi'), (u'supu', u'juhu'), (u'supom', u'juhom'), (u'supama', u'juhama'), (u'Supa', u'Juha'), (u'Supe', u'Juhe'), (u'Supi', u'Juhi'), (u'Supu', u'Juhu'), (u'Supom', u'Juhom'), (u'Supama', u'Juhama'), (u'surfuje', u'surfa'), (u'surfuje\u0161', u'surfa\u0161'), (u'surfuju', u'surfaju'), (u'su\u0161tina', u'bit'), (u'su\u0161tinski', u'bitni'), (u'suvom', u'suhom'), (u'suvog', u'suhog'), (u'suvoj', u'suhoj'), (u'Suvom', u'Suhom'), (u'Suvog', u'Suhog'), (u'Suvoj', u'Suhoj'), (u'suvim', u'suhim'), (u'Suvim', u'Suhim'), (u'svestan', u'svjestan'), (u'svjest', u'svijest'), (u'Svjest', u'Svijest'), (u'svjesti', u'svijesti'), (u'Svjesti', u'Svijesti'), (u'svetova', u'svjetova'), (u'svetove', u'svjetove'), (u'svugde', u'svugdje'), (u'\u0161olja', u'\u0161alica'), (u'\u0161olju', u'\u0161alicu'), (u'\u0160ta', u'\u0160to'), (u'\u0161tagod', u'\u0161to god'), (u'\u0161ta', u'\u0161to'), (u'\u0161tp', u'\u0161to'), (u'\u0161tampa', u'tisak'), (u'\u0161tampu', u'tisak'), (u'\u0161tampom', u'tiskom'), (u'\u0161tampi', u'tisku'), (u'\u0161tampati', u'tiskati'), (u'\u0160utje\u0107e', u'\u0160utjet \u0107e'), (u'tablu', u'plo\u010du'), (u'taguje', u'tagira'), (u'tako\u0111e', u'tako\u0111er'), (u'Tako\u0111e', u'Tako\u0111er'), (u'talas', u'val'), (u'Talas', u'Val'), (u'talasa', u'valova'), (u'talase', u'valove'), (u'talasi', u'valovi'), (u'Talasi', u'Valovi'), (u'talasima', u'valovima'), (u'Talasima', u'Valovima'), (u'te\u010dnost', u'teku\u0107ina'), (u'te\u010dnosti', u'teku\u0107ine'), (u'te\u010dno\u0161\u0107u', u'teku\u0107inom'), (u'tek\u0161o', u'te\u0161ko'), (u'Tek\u0161o', u'Te\u0161ko'), (u'terajte', u'tjerajte'), (u'te\u0161io', u'tje\u0161io'), (u'te\u0161i\u0161', u'tje\u0161i\u0161'), (u'tki', u'tko'), (u'to\u010dak', u'kota\u010d'), (u'To\u010dak', u'Kota\u010d'), (u'toha', u'toga'), (u'tovj', u'tvoj'), (u'trabam', u'trebam'), (u'trkanje', u'utrkivanje'), (u'trkanja', u'utrkivanja'), (u'trkao', u'utrkivao'), (u'trougao', u'trokut'), (u'trougla', u'trokuta'), (u'trouglu', u'trokutu'), (u'trouglove', u'trokute'), (u'trpeo', u'trpio'), (u'Trpeo', u'Trpio'), (u'tugi', u'tuzi'), (u'tvrtci', u'tvrtki'), (u'ubede', u'uvjere'), (u'Ube\u0111ivao', u'Uvjeravao'), (u'ube\u0111ivati', u'uvjeravati'), (u'ubje\u0111ivati', u'uvjeravati'), (u'ube\u0111uje', u'uvjerava'), (u'ube\u0111uje\u0161', u'uvjerava\u0161'), (u'ube\u0111uju', u'uvjeravaju'), (u'ubjediti', u'uvjeriti'), (u'u\u010dtivo', u'uljudno'), (u'u\u010dtivost', u'uljudnost'), (u'u\u010dtivo\u0161\u0107u', u'uljudno\u0161\u0107u'), (u'udata', u'udana'), (u'Udata', u'Udana'), (u'udatoj', u'udanoj'), (u'udeo', u'udio'), (u'ugljenik', u'ugljik'), (u'uliva', u'ulijeva'), (u'ulivali', u'ulijevali'), (u'ulivate', u'ulijevate'), (u'uljeva', u'ulijeva'), (u'ujutru', u'ujutro'), (u'Ukoliko', u'Ako'), (u'ukoliko', u'ako'), (u'ume', u'zna'), (u'umem', u'umijem'), (u'ume\u0161', u'umije\u0161'), (u'umesto', u'umjesto'), (u'Umesto', u'umjesto'), (u'umete', u'znate'), (u'umijesto', u'umjesto'), (u'Umijesto', u'Umjesto'), (u'umetninama', u'umjetninama'), (u'umreti', u'umrijeti'), (u'Umret', u'Umrijet'), (u'umrije\u0107e\u0161', u'umrijet \u0107e\u0161'), (u'umrije\u0107ete', u'umrijet \u0107ete'), (u'Une\u0107u', u'Unijet \u0107u'), (u'univerzitet', u'sveu\u010dili\u0161te'), (u'univerzitetu', u'sveu\u010dili\u0161tu'), (u'Uop\u0161te', u'Uop\u0107e'), (u'uop\u0161te', u'uop\u0107e'), (u'uop\u010de', u'uop\u0107e'), (u'upustva', u'uputstva'), (u'uprkos', u'usprkos'), (u'Uprkos', u'Usprkos'), (u'uradio', u'u\u010dinio'), (u'Uredu', u'U redu'), (u'uspe', u'uspije'), (u'Uspe', u'Uspije'), (u'uspeo', u'uspio'), (u'Uspeo', u'Uspio'), (u'uspe\u0107e\u0161', u'uspjet \u0107e\u0161'), (u'uspje\u0107e\u0161', u'uspjet \u0107e\u0161'), (u'uspe\u0107emo', u'uspjet \u0107emo'), (u'uspe\u0161', u'uspije\u0161'), (u'uspeju', u'uspiju'), (u'uspjevala', u'uspijevala'), (u'uspijo', u'uspio'), (u'u sred', u'usred'), (u'usled', u'uslijed'), (u'Usled', u'Uslijed'), (u'usledila', u'uslijedila'), (u'usljed', u'uslijed'), (u'Usljed', u'Uslijed'), (u'u\u0161unjate', u'u\u0161uljate'), (u'utehe', u'utjehe'), (u'uve\u010de', u'nave\u010der'), (u'uvek', u'uvijek'), (u'Uvek', u'Uvijek'), (u'uvjek', u'uvijek'), (u'Uvjek', u'Uvijek'), (u'uvijet', u'uvjet'), (u'uvijeti', u'uvjeti'), (u'uvijetima', u'uvjetima'), (u'uva', u'uha'), (u'Uva', u'Uha'), (u'uvo', u'uho'), (u'Uvo', u'Uho'), (u'uvom', u'uhom'), (u'Uvom', u'Uhom'), (u'uvu', u'uhu'), (u'Uvu', u'Uhu'), (u'vaistinu', u'uistinu'), (u'Vaistinu', u'Uistinu'), (u'vajar', u'kipar'), (u'vakcini\u0161e', u'cijepi'), (u'varnica', u'iskra'), (u'varnicu', u'iskru'), (u'vaspitala', u'odgojila'), (u'vaspitavan', u'odgajan'), (u'vaspitavanju', u'odgoju'), (u'va\u0161ljivi', u'u\u0161ljivi'), (u'va\u017ei', u'vrijedi'), (u've\u010dan', u'vje\u010dan'), (u've\u0107ati', u'vije\u0107ati'), (u'vek', u'stolje\u0107e'), (u'veka', u'stolje\u0107a'), (u'veke', u'vijeke'), (u'vekova', u'stolje\u0107a'), (u'venca', u'vijenca'), (u've\u010dnost', u'vje\u010dnost'), (u'veoma', u'vrlo'), (u'Veoma', u'Vrlo'), (u'vera', u'vjera'), (u'vere', u'vjere'), (u'veri', u'vjeri'), (u'verom', u'vjerom'), (u'veru', u'vjeru'), (u'veran', u'vjeran'), (u'verama', u'vjerama'), (u'Vera', u'Vjera'), (u'Vere', u'Vjere'), (u'Veri', u'Vjeri'), (u'Verom', u'Vjerom'), (u'Veru', u'Vjeru'), (u'Veran', u'Vjeran'), (u'Verama', u'Vjerama'), (u'veren', u'zaru\u010den'), (u'Veren', u'Zaru\u010den'), (u'verena', u'zaru\u010dena'), (u'vereni', u'zaru\u010deni'), (u'verimo', u'zaru\u010dimo'), (u'vest', u'vijest'), (u'Vest', u'Vijest'), (u'vesti', u'vijesti'), (u'Vesti', u'Vijesti'), (u'Vjesti', u'Vijesti'), (u'vjesti', u'vijesti'), (u'vestima', u'vijestima'), (u'Vestima', u'Vijestima'), (u'vjestima', u'vijestima'), (u'Vjestima', u'Vijestima'), (u've\u0161ala', u'vje\u0161ala'), (u've\u0161\u0107u', u'vije\u0161\u0107u'), (u've\u0161u', u'rublju'), (u'vide\u0161e', u'vidje\u0161e'), (u'vidjeo', u'vidio'), (u'Vidjeo', u'Vidio'), (u'vjerojatno\u0107a', u'vjerojatnost'), (u'vje\u0161\u0107u', u'vije\u0161\u0107u'), (u'vlo', u'vrlo'), (u'Vodi\u0107e', u'Vodit \u0107e'), (u'Vodi\u0107u', u'Vodit \u0107u'), (u'voliti', u'voljeti'), (u'vredelo', u'vrijedilo'), (u'vrednom', u'vrijednom'), (u'vrednog', u'vrijednog'), (u'vreme', u'vrijeme'), (u'Vreme', u'Vrijeme'), (u'vrjeme', u'vrijeme'), (u'Vrjeme', u'Vrijeme'), (u'vrteo', u'vrtio'), (u'vrvela', u'vrvjela'), (u'whiskey', u'viski'), (u'zaceljivanje', u'zacjeljivanje'), (u'zagreva', u'zagrijava'), (u'Zagreva', u'Zagrijava'), (u'Zagrevate', u'Zagrijavate'), (u'zagrevanje', u'zagrijavanje'), (u'zakunio', u'zakleo'), (u'zalepili', u'zalijepili'), (u'zalepiti', u'zalijepiti'), (u'zaliv', u'zaljev'), (u'zalivu', u'zaljevu'), (u'zanm', u'znam'), (u'zanma', u'zanima'), (u'zaplena', u'zapljena'), (u'zapleni', u'zaplijeni'), (u'zaplenu', u'zapljenu'), (u'zaspem', u'zaspim'), (u'zastareo', u'zastario'), (u'zauvek', u'zauvijek'), (u'Zauvek', u'Zauvijek'), (u'zauvjek', u'zauvijek'), (u'Zauvjek', u'Zauvijek'), (u'zavera', u'zavjera'), (u'zahtev', u'zahtjev'), (u'Zahtev', u'Zahtjev'), (u'zasede', u'zasjede'), (u'zasedi', u'zasjedi'), (u'zasedu', u'zasjedu'), (u'zatp', u'zato'), (u'Zatp', u'Zato'), (u'za\u017eeleo', u'za\u017eelio'), (u'Za\u017eeleo', u'Za\u017eelio'), (u'Za\u017eeljeo', u'Za\u017eelio'), (u'za\u017eeljeo', u'za\u017eelio'), (u'zbg', u'zbog'), (u'zdrvo', u'zdravo'), (u'Zdrvo', u'Zdravo'), (u'zlodela', u'zlodjela'), (u'zna\u0107i', u'zna\u010di'), (u'zvani\u010dan', u'slu\u017eben'), (u'zvezdom', u'zvijezdom'), (u'\u017eemo', u'\u0107emo'), (u'\u017eeleo', u'\u017eelio'), (u'\u017deleo', u'\u017delio'), (u'\u017deljeo', u'\u017delio'), (u'\u017eeljeo', u'\u017eelio'), (u'\u017diveo', u'\u017divio'), (u'\u017eiveo', u'\u017eivio'), (u'\u017emureo', u'\u017emirio'), (u'Abi', u'Abby'), (u'Alis', u'Alice'), (u'Ajk', u'Ike'), (u'Ajku', u'Ikeu'), (u'Ajrin', u'Irene'), (u'Ajris', u'Iris'), (u'Ajron', u'Iron'), (u'Ajvi', u'Ivy'), (u'An\u0111eles', u'Angeles'), (u'An\u0111elesa', u'Angelesa'), (u'An\u0111elesu', u'Angelesu'), (u'An\u0111elesom', u'Angelesom'), (u'Antoni', u'Anthony'), (u'Antoniju', u'Anthonyju'), (u'Ar\u010di', u'Archie'), (u'Beverli', u'Beverly'), (u'Bejker', u'Baker'), (u'Bitls', u'Beatles'), (u'Bitlsi', u'Beatlesi'), (u'Brid\u017eit', u'Bridget'), (u'Bri\u017eit', u'Brigitte'), (u'Bruks', u'Brooks'), (u'Dablin', u'Dublin'), (u'Dablina', u'Dublina'), (u'Dablinu', u'Dublinu'), (u'Dag', u'Doug'), (u'Darvin', u'Darwin'), (u'Darvina', u'Darwina'), (u'Darvinu', u'Darwinu'), (u'Darvinom', u'Darwinom'), (u'Dejv', u'Dave'), (u'Dejvi', u'Davie'), (u'Dejva', u'Davea'), (u'Dejvu', u'Daveu'), (u'Dejvom', u'Daveom'), (u'Den', u'Dan'), (u'Deril', u'Daryl'), (u'Dijaz', u'Diaz'), (u'Dru', u'Drew'), (u'\u0110eni', u'Jenny'), (u'\u0110o\u0161ua', u'Joshua'), (u'D\u017eejmi', u'Jamie'), (u'D\u017ead', u'Jude'), (u'D\u017eeri', u'Jerry'), (u'D\u017eerija', u'Jerryja'), (u'D\u017eo', u'Joe'), (u'D\u017eoel', u'Joel'), (u'D\u017eoelu', u'Joelu'), (u'D\u017eo\u0161', u'Josh'), (u'D\u017eo\u0161u', u'Joshu'), (u'D\u017eosi', u'Josie'), (u'D\u017eozi', u'Josie'), (u'D\u017ees', u'Jess'), (u'D\u017een', u'Jen'), (u'D\u017eej', u'Jay'), (u'D\u017eejn', u'Jane'), (u'D\u017eil', u'Jill'), (u'D\u017eodi', u'Jody'), (u'D\u017eud', u'Jude'), (u'D\u017euli', u'Julie'), (u'Ebi', u'Abby'), (u'Ejb', u'Abe'), (u'Ejba', u'Abea'), (u'Ejmi', u'Amy'), (u'Ejpril', u'April'), (u'Empajer', u'Empire'), (u'En\u0111el', u'Angel'), (u'End\u017ei', u'Angie'), (u'Entoni', u'Anthony'), (u'E\u0161ford', u'Ashford'), (u'E\u0161forda', u'Ashforda'), (u'E\u0161li', u'Ashley'), (u'Fibi', u'Phoebe'), (u'Filovo', u'Philovo'), (u'Flober', u'Flaubert'), (u'Fokner', u'Faulkner'), (u'Fren', u'Fran'), (u'Gre\u010den', u'Gretchen'), (u'Grejs', u'Grace'), (u'Hadson', u'Hudson'), (u'Hadsonu', u'Hudsonu'), (u'Hant', u'Hunt'), (u'Hemingvej', u'Hemingway'), (u'Henk', u'Hank'), (u'Hejstings', u'Hastings'), (u'Hju', u'Hugh'), (u'Hjua', u'Hugha'), (u'Hjuz', u'Hughes'), (u'Hjuza', u'Hughesa'), (u'Hjuston', u'Houston'), (u'Hjustonu', u'Houstonu'), (u'Igo', u'Hugo'), (u'Ilejn', u'Elaine'), (u'\u017didovin', u'\u017didov'), (u'Johni', u'Johnny'), (u'Jud\u017ein', u'Eugene'), (u'Kasl', u'Castle'), (u'Kejd\u017e', u'Cage'), (u'Kejn', u'Kane'), (u'Kejsi', u'Casey'), (u'Kejti', u'Katie'), (u'Keren', u'Karen'), (u'Kerol', u'Carol'), (u'Kerolajn', u'Caroline'), (u'Klajv', u'Clive'), (u'Klajva', u'Clivea'), (u'Klajve', u'Clive'), (u'Klajvu', u'Cliveu'), (u'Klarens', u'Clarence'), (u'Kler', u'Claire'), (u'Kloi', u'Chloe'), (u'Klod', u'Claude'), (u'Klode', u'Claude'), (u'Kol', u'Cole'), (u'Kolins', u'Collins'), (u'Kortni', u'Courtney'), (u'Krej?g', u'Craig'), (u'Kristi', u'Christie'), (u'Lajf', u'Life'), (u'Lajl', u'Lile'), (u'Lejk', u'Lake'), (u'Lorejn', u'Loraine'), (u'Lorens', u'Lawrence'), (u'Lusi', u'Lucy'), (u'Majk', u'Mike'), (u'Majkeve', u'Mikeove'), (u'Majlo', u'Milo'), (u'Maslou', u'Maslow'), (u'Medlin', u'Madelaine'), (u'Medelin', u'Madeline'), (u'Mejbel', u'Mabel'), (u'Mejn', u'Maine'), (u'Mejna', u'Mainea'), (u'Mejnu', u'Maineu'), (u'Mejnom', u'Maineom'), (u'Mejpls', u'Maples'), (u'Mejsi', u'Maisy'), (u'Mek', u'Mac'), (u'Merilend', u'Maryland'), (u'Mi\u010del', u'Mitchell'), (u'Nensi', u'Nancy'), (u'Ni\u010de', u'Nietzsche'), (u'Ni\u010dea', u'Nietzschea'), (u'Ni\u010deu', u'Nietzscheu'), (u'Ni\u010deom', u'Nietzscheom'), (u'Odri', u'Audrey'), (u'Ohajo', u'Ohio'), (u'Ohaja', u'Ohia'), (u'Ohaju', u'Ohiu'), (u'Olbrajt', u'Albright'), (u"O'Nil", u"O'Neal"), (u'Orlins', u'Orleans'), (u'Orlinsa', u'Orleansa'), (u'Orlinsu', u'Orleansu'), (u'Pem', u'Pam'), (u'Pejd\u017e', u'Paige'), (u'Red\u017ei', u'Reggie'), (u'Red\u017einald', u'Reginald'), (u'Rej', u'Ray'), (u'Rej\u010del', u'Rachel'), (u'Ri\u010d', u'Rich'), (u'Rouz', u'Rose'), (u'Sendi', u'Sandy'), (u'Sidnej', u'Sidney'), (u'Sindi', u'Cindy'), (u'Sojer', u'Sawyer'), (u'Sojeru', u'Sawyeru'), (u'Sole', u'Saule'), (u'Stejsi', u'Stacy'), (u'Stoun', u'Stone'), (u'\u0160eron', u'Sharon'), (u'\u0160eril', u'Cheryl'), (u'\u0160irli', u'Shirley'), (u'\u0160paniji', u'\u0160panjolskoj'), (u'Tajms', u'Times'), (u'Tejlor', u'Taylor'), (u'Vajlder', u'Wilder'), (u'Val\u0161', u'Walsh'), (u'Vins', u'Vince'), (u'Voren', u'Warren'), (u'Vud', u'Wood'), (u'\u017dak', u'Jacques'), (u'\u017dil', u'Jules'), (u'januar', u'sije\u010danj'), (u'Januar', u'Sije\u010danj'), (u'februar', u'velja\u010da'), (u'februara', u'velja\u010de'), (u'februaru', u'velja\u010di'), (u'Februar', u'Velja\u010da'), (u'Februara', u'Velja\u010de'), (u'Februaru', u'Velja\u010di'), (u'mart', u'o\u017eujak'), (u'Mart', u'O\u017eujak'), (u'april', u'travanj'), (u'April', u'Travanj'), (u'maj', u'svibanj'), (u'Maj', u'Svibanj'), (u'svibnjom', u'svibnjem'), (u'jun', u'lipanj'), (u'juna', u'lipnja'), (u'junu', u'lipnju'), (u'Jun', u'Lipanj'), (u'Juni', u'Lipanj'), (u'juli', u'srpanj'), (u'jula', u'srpnja'), (u'julu', u'srpnju'), (u'Juli', u'Srpanj'), (u'septembar', u'rujan'), (u'Septembar', u'Rujan'), (u'oktobar', u'listopad'), (u'Oktobar', u'Listopad'), (u'oktobra', u'listopada'), (u'oktobru', u'listopadu'), (u'novembar', u'studeni'), (u'november', u'studeni'), (u'novembra', u'studenog'), (u'novembru', u'studenom'), (u'Novembar', u'Studeni'), (u'November', u'Studeni'), (u'Novembra', u'Studenog'), (u'Novembru', u'Studenom'), (u'decembar', u'prosinac'), (u'Decembar', u'Prosinac')]), + 'pattern': u"(?um)(\\b|^)(?:advokati|Advokati|advokatima|Advokatima|afirmi\\\u0161e|akcenat|akcionara|akvarijum|akvarijumu|amin|Amin|ans|apsorbovanje|apsorbuje|azot|ba\\\u0161ta|Ba\\\u0161ta|ba\\\u0161te|Ba\\\u0161te|ba\\\u0161ti|ba\\\u0161tu|Ba\\\u0161tu|ba\\\u0161tom|bedan|bede|bedi|bejah|bejahu|bele\\\u0161ci|be\\\u0161ike|bebisiterka|beg|begu|begstva|beja\\\u0161e|bekstvo|bekstvu|begstvu|bes|besa|besan|besom|besu|be\\\u0161e|bimso|blije\\\u0111i|bioje|bi\\ smo|bi\\ ste|bioskop|bioskopi|bitci|bled|blede|boksuje\\\u0161|bolesan|bolila|bori\\\u0107e\\\u0161|Bori\\\u0107e\\\u0161|braon|bregu|bti|cedilu|ceo|Ceo|cepa|cev|cevi|cjevi|cevima|Cevi|Cjevi|Cevima|Cjevima|cev\\\u010dica|cev\\\u010dicu|cutanje|\\\u010dutanje|\\\u0107utanje|Cutanje|\\\u010cutanje|\\\u0106utanje|cutanjem|\\\u010dutanjem|\\\u0107utanjem|Cutanjem|\\\u010cutanjem|\\\u0106utanjem|cvetaju|cvetove|cvetu|cvjetu|cvetalo|cvjetom|\\\u010cakom|\\\u010dar\\\u0161av|\\\u010dar\\\u0161ave|\\\u010dar\\\u0161avi|\\\u010dar\\\u0161avima|\\\u010das|\\\u010detvoro|\\\u010cita\\\u0107u|\\\u010derku|\\\u010cerku|\\\u0107erku|\\\u0106erku|\\\u0107erkama|\\\u010derkama|\\\u0107erkom|\\\u010derkom|k\\\u0107erkom|k\\\u010derkom|\\\u010cu|\\\u010ce\\\u0161|\\\u010ce|\\\u010cemo|\\\u010cete|\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u010demo|\\\u010dete|\\\u0107ebe|\\\u0107ebetu|\\\u010dk|\\\u0107\\\u0161|\\\u0107ale|\\\u0107aletom|\\\u0107aleta|\\\u0107aletu|\\\u0107orsokak|\\\u0107orsokaku|\\\u0107o\\\u0161ak|\\\u0107o\\\u0161ku|\\\u0107erka|\\\u0106erka|\\\u0107mo|\\\u0107te|\\\u010du\\\u0107e|\\\u010du\\\u0107emo|\\\u010cu\\\u0107emo|\\\u010cu\\\u0107ete|\\\u010cu\\\u0107e|\\\u0107uo|\\\u0107utao|\\\u0106utao|\\\u0107ute|\\\u0106ute|cvetova|daga|damas|date|deda|Deda|dede|dedi|dedom|defini\\\u0161e|dejstvo|Dejstvo|dejstvom|Dejstvom|dele\\\u0107i|deo|Deo|de\\\u0161ava|dete|Dete|diluje|diluju|diskutuje|Diskutuje|diskutujemo|Diskutujemo|djete|Djete|detektuje|dodju|dole|Dole|donijeo|Donijeo|Donije\\\u0107u|dosledan|dospeo|dospeju|do\\\u0111avola|Do\\\u0111avola|drug|drugari|drugare|drug\\\u010diji|drugde|duuga|duvana|dve|Dve|dvema|\\\u0111avo|\\\u0111avola|\\\u0111emper|d\\\u017eanki|d\\\u017eelat|\\\u0111ubre|efekat|eksperata|eksperti|Eksperti|ekspertima|en|emitovao|emitovati|emituje|emitujem|Emitujem|emituju|evra|familija|Familija|familiju|Familiju|familijama|familiji|flertuje|foka|foku|foke|fokama|fotografi\\\u0161u|gasova|gde|Gde|gluhonem|gre\\\u0161e|grje\\\u0161e|gre\\\u0161i|grje\\\u0161i|gre\\\u0161ki|grijehova|grijehove|hipnotisao|hipnotisana|hipnoti\\\u0161e|Historija|Historiju|Historije|Historiji|Istorija|Istoriju|Istorije|Istoriji|historije|historiji|istorije|istoriji|istorijom|hakuje|Hakuje|hakujemo|Hakujemo|Hakuju|hakuju|ho\\\u010du|Ho\\\u010du|hte\\\u0107e|htedoh|Htjeo|Hteo|htjeo|hteo|i\\\u010di|I\\\u010di|iko|ignori\\\u0161i|Ignori\\\u0161i|ignori\\\u0161ite|Ignori\\\u0161ite|ignori\\\u0161u|ilustruju|inspirisao|interesantan|Interesantan|interesuje|Interesuje|interesujemo|Interesujemo|interesujete|Interesujete|Interesuju|interesuju|isekao|isterao|istera\\\u0161|Istera\\\u0161|istrebi|istrebiti|isuvi\\\u0161e|ivica|ivice|ivici|ivicu|izduvaj|izduvamo|izoluje|izolujemo|izoluje\\\u0161|Izolujete|Izolujte|izolujte|izgladneo|izmeriti|izmerio|izme\\\u0161ane|izneo|izneti|izvestan|izvinem|izvine\\\u0161|Izvinem|Izvine\\\u0161|izvinim|izvini\\\u0161|izviniti|izvinjenje|izvinjenja|izvinjenju|jedamput|jelda|Je\\\u0161\\\u0107emo|Je\\\u0161\\\u0107e\\\u0161|je\\\u0161\\\u0107e|je\\\u0161\\\u0107u|Je\\\u0161\\\u0107u|je\\\u0161\\\u0107e\\\u0161|je\\\u0161\\\u0107emo|ju\\\u010de|Ju\\\u010de|kakava|kampovao|kampuje|kampujemo|kampuju|kancelarija|kancelarijama|kancelariju|Kancelarija|Kancelariju|kancelariji|kancelarije|kancelarijom|kancera|kandidovati|kandidujem|kapar|kapra|karmin|karminom|k\\\u0107erci|k\\\u0107erka|k\\\u010derka|K\\\u0107erka|K\\\u010derka|k\\\u0107erkama|ker|Ker|kerova|kidnapovan|Kidnapovan|kiji|kijim|klasifikuju|kle\\\u0161ta|klje\\\u0161ta|Ko|koa|koaj|kola|kolima|komandni|kombinuju|kompanija|komponovao|kom\\\u0161ija|kom\\\u0161iji|kom\\\u0161iju|kom\\\u0161iluk|kom\\\u0161iluka|kom\\\u0161iluku|kom\\\u0161ije|kom\\\u0161ijama|kom\\\u0161inica|kom\\\u0161inicu|konektovan|konektovati|kontroli\\\u0161u|Kontroli\\\u0161u|Kontroli\\\u0161i|kontroli\\\u0161i|Kontroli\\\u0161ite|kontroli\\\u0161ite|korpu|kritikuju|krsta|krsta\\\u0161i|krstu|krsti\\\u0107a|krsti\\\u0107u|Krsta|Krstu|Krsti\\\u0107a|Krsti\\\u0107u|krstom|krstove|Krstove|krstovima|Krstovima|kri\\\u017eom|kupatilo|kupatilu|kvalifikuju|la\\\u017eeju|La\\\u017eov|la\\\u017eov|la\\\u017eovi|la\\\u017eovu|la\\\u017eovima|la\\\u017eovom|lebdeo|le\\\u010di|le\\\u010de|lje\\\u010di|Le\\\u010di|Lje\\\u010di|Lejn|Lenja|lenji|lenja|le\\\u0161nik|Leta|leto|Leto|letos|letiti|leve|lo\\\u017ei|lza|ljepiti|ljepili|magnezijuma|magnezijumu|maja|maju|majem|majca|majce|majcu|majcom|Malopre|malopre|maloprije|manifestuje|manifestuju|marta|martu|martom|mehur|menom|mera\\\u010d|meri|mere|merdevine|merdevinama|merljivo|me\\\u0161ane|me\\\u0161avina|me\\\u0161avine|me\\\u0161avinu|minut|mleo|mo\\\u010d|mofu|momenat|momenta|muzejem|muzici|muzika|muzike|muzikom|Muzika|Muzike|Muzikom|na\\\u010di|nadevati|naduvan|najpre|Najpre|najzad|nanev\\\u0161i|nanjeli|napastvuje|Napolje|napolje|Napolju|napolju|nauka|Nauka|nauci|nazad|Nazad|napred|Napred|naprimjer|naseo|nasesti|nasre\\\u0107u|nebi|nebih|Nebi|Nebih|nebismo|Nebismo|nebiste|Nebiste|nedaj|negde|Negde|neguje|neguju|nekto|nemi|nemrem|nemogu|Nemogu|nemora|Nemora|nene|ne\\\u0161o|nevesta|nevreme|nezi|niasm|nigde|Nigde|nikakave|niko|Niko|nisma|Nisma|ne\\\u0107\\\u0161|nejde|Nejde|neda|nedam|negujem|njegi|ne\\\u017eeli|niej|nili|njie|njem|njeme|nominovan|nsiam|nteko|obe|Obe|obema|Obezbe\\\u0111uju|obezbe\\\u0111uju|objekat|oblast|oblastima|oblasti|obolelu|obo\\\u017eavalac|obu\\\u010di|obuhvata|odandje|odavdje|Odavdje|odbi\\\u0107e\\\u0161|odbi\\\u0107emo|odela|odelu|odelenja|odelenje|odelenju|odeljak|odeljenje|Odeljenje|odjeljenje|Odjeljenje|odeljenjem|odma|Odne\\\u0107u|odne\\\u0107u|odne\\\u0107e|odoliti|odneti|odseo|odsela|odsesti|odupreti|oduvek|Oduvek|oduvjek|Oduvjek|ogladneo|okoreli|organizuju|Organizuju|osje\\\u0107anja|osmehe|osmehne|osmehnu|osobenosti|ostareli|ostrva|ostrvu|ostrvom|Ostrva|Ostrvu|Ostrvom|ostrvima|osete|ostrvo|Ostrvo|osvjetljen|ovde|Ovde|ovdej|ovdije|Ovdije|ovjde|Ovjde|pakuje|Pakuje|Pakuju|pakuju|palatama|palate|palatu|palati|pantalone|Pantalone|pantalona|pantalonama|par\\\u010de|par\\\u010deta|par\\\u010detu|par\\\u010detom|parampar\\\u010dad|pastuv|pastuva|pastuvu|pd|pemzija|pemziju|penzionerski|Penzionerski|pertle|pesama|pesnicima|pe\\\u0161ice|Pe\\\u0161ice|pe\\\u0161ke|plata|pla\\\u010da|platom|platu|pla\\\u010danje|pla\\\u010danjem|pla\\\u0107e\\\u0161|plen|Plen|pljen|Pljen|po\\\u010de\\\u0107u|podjelimo|podnesti|podstreka\\\u010d|podsete|poen|poena|poene|poeni|Poeni|poenima|poludili|poma\\\u0107i|pomaknim|pomaknio|pomakni\\\u0161|pomakniti|pomenu|Pomera|pomera|pomjera|pomerajte|pomjeri|pomeraj|pomjeraj|pomeraju|pomerala|pomjerala|pomjeraju|pomeranja|pomerati|pomjerati|pomeri\\\u0161|ponaosob|ponesla|Ponesla|pore\\\u0111enje|pore\\\u0111enju|porekla|poreklo|poreklu|Porodica|Porodice|porodica|porodice|porodici|porodicama|porodicom|porodicu|poslata|posle|Posle|poslje|posredi|postara|Postara\\\u0107u|postara\\\u0107u|postaraj|Postaraj|Postaraju|postaraju|postarajmo|postaramo|postara\\\u0161|povesne|Povinuju|povinuju|pozadi|po\\\u017eeleo|Po\\\u017eeleo|Po\\\u017eeljeo|po\\\u017eeljeo|praktikuj|praktikuju|praktikovala|praktikovati|pre|Pre|predela|predelu|Pre\\\u0107i|pre\\\u0107i|pre\\\u0107utkuje|predame|predamnom|Predamnom|preformuli\\\u0161i|preklo|preloma|Prene\\\u0107u|prene\\\u0107u|prenos|prenosa|prenosom|prenosu|preneo|Preneo|prenela|prenjela|preneli|prenjeli|preneti|preporu\\\u010da|prese\\\u0107i|preti|prete|Prete|prjeti|prjete|prete\\\u0107im|prete\\\u0107ih|pretrpeo|prevod|Prevod|prezentovati|prezentovane|prezentovan|prezentovani|prezentovano|pridonjeti|prijatan|prime\\\u0107ivao|primedbi|primjete|prisetim|prisetio|prisetite|pritiskam|prmda|procenat|procent|procenta|procenata|procenti|Procenti|procente|Procente|procentu|Procentu|procentima|prodato|prohte|projekat|Projekat|promijena|prosledili|protestvovat|Protestvovat|Protestvujem|protestvujem|protestvuju|protestuju\\\u0107i|psihi\\\u0107ki|pto|ptom|punoletan|Punoletan|ra\\\u010dunari|ra\\\u010dunare|radijo|ra\\\u0111e|ranac|rancu|rascep|rasejan|rasejana|raspust|razbi\\\u0107u|razbijesneo|ra\\\u0161\\\u0107e|Razbi\\\u0107u|razdevi\\\u010de|razgovrati|razre\\\u0161i|razume|razumeju|re\\\u010dju|Re\\\u010dju|rje\\\u010dju|Rje\\\u010dju|reagujte|redov|redovu|re\\\u0111e|re\\\u0111i|rejv|rejvu|reko|rengen|repuje\\\u0161|resetuje|resetujte|Resetujte|rije\\\u0111i|Rizikuj|rizikuju|rizikuje|rizikujte|rje\\\u0161io|rokenrol|ronioc|savije\\\u0161\\\u0107u|save\\\u0161\\\u0107u|secka|seckam|sede\\\u0107e\\\u0161|sedeli|sedi\\\u0161ta|sedi\\\u0161te|sedi\\\u0161tu|sedni|Sedni|sedi|Sedi|sedite|sesti|sekire|sekiraj|sekiram|sekiramo|sekira\\\u0161|sekirate|sekirajte|seme|sertan|Se\\\u0161\\\u0107u|se\\\u0161\\\u0107u|sje\\\u0161\\\u0107emo|seta|sigruno|siguan|sija|sijaju|sir\\\u0107e|sir\\\u0107eta|sir\\\u0107etu|sje\\\u0161\\\u0107u|sje\\\u0161\\\u0107e|sle\\\u0107e|sle\\\u0107u|sle\\\u0107emo|sleva|se\\\u0107anjima|seo|Seo|sem|sma|smao|Smao|sme|Sme|sme\\\u0107pm|smej|Smejte|smejte|smesta|Smesta|smeste|sme\\\u0161ak|sme\\\u0161i|Sme\\\u0161i|sme\\\u0161io|sme\\\u0161i\\\u0161|sme\\\u0161kom|smjeo|smrdeo|sintersajzer|sitnisajzer|skelet|so\\\u010diva|so\\\u010divima|so\\\u010divo|so\\\u010divom|so\\\u010divu|Spakuj|Spakujte|spakujte|spasao|Spasao|spasen|spasla|spasli|speluje|speluju|spoji\\\u0107e|spolja|Sredi\\\u0107e|Sredi\\\u0107u|stabilizuju|starao|starati|Starati|steni|stepen|stepena|stepeni|stepenu|sticati|stiditi|streljamo|streljati|stole\\\u0107a|stobom|stvrano|Stupi\\\u0107u|stupi\\\u0107u|subjekat|sudija|Sudija|sudije|sudiji|sudijo|sudiju|sudijom|sudijskog|sugeri\\\u0161u|sugeri\\\u0161e|supa|supe|supi|supu|supom|supama|Supa|Supe|Supi|Supu|Supom|Supama|surfuje|surfuje\\\u0161|surfuju|su\\\u0161tina|su\\\u0161tinski|suvom|suvog|suvoj|Suvom|Suvog|Suvoj|suvim|Suvim|svestan|svjest|Svjest|svjesti|Svjesti|svetova|svetove|svugde|\\\u0161olja|\\\u0161olju|\\\u0160ta|\\\u0161tagod|\\\u0161ta|\\\u0161tp|\\\u0161tampa|\\\u0161tampu|\\\u0161tampom|\\\u0161tampi|\\\u0161tampati|\\\u0160utje\\\u0107e|tablu|taguje|tako\\\u0111e|Tako\\\u0111e|talas|Talas|talasa|talase|talasi|Talasi|talasima|Talasima|te\\\u010dnost|te\\\u010dnosti|te\\\u010dno\\\u0161\\\u0107u|tek\\\u0161o|Tek\\\u0161o|terajte|te\\\u0161io|te\\\u0161i\\\u0161|tki|to\\\u010dak|To\\\u010dak|toha|tovj|trabam|trkanje|trkanja|trkao|trougao|trougla|trouglu|trouglove|trpeo|Trpeo|tugi|tvrtci|ubede|Ube\\\u0111ivao|ube\\\u0111ivati|ubje\\\u0111ivati|ube\\\u0111uje|ube\\\u0111uje\\\u0161|ube\\\u0111uju|ubjediti|u\\\u010dtivo|u\\\u010dtivost|u\\\u010dtivo\\\u0161\\\u0107u|udata|Udata|udatoj|udeo|ugljenik|uliva|ulivali|ulivate|uljeva|ujutru|Ukoliko|ukoliko|ume|umem|ume\\\u0161|umesto|Umesto|umete|umijesto|Umijesto|umetninama|umreti|Umret|umrije\\\u0107e\\\u0161|umrije\\\u0107ete|Une\\\u0107u|univerzitet|univerzitetu|Uop\\\u0161te|uop\\\u0161te|uop\\\u010de|upustva|uprkos|Uprkos|uradio|Uredu|uspe|Uspe|uspeo|Uspeo|uspe\\\u0107e\\\u0161|uspje\\\u0107e\\\u0161|uspe\\\u0107emo|uspe\\\u0161|uspeju|uspjevala|uspijo|u\\ sred|usled|Usled|usledila|usljed|Usljed|u\\\u0161unjate|utehe|uve\\\u010de|uvek|Uvek|uvjek|Uvjek|uvijet|uvijeti|uvijetima|uva|Uva|uvo|Uvo|uvom|Uvom|uvu|Uvu|vaistinu|Vaistinu|vajar|vakcini\\\u0161e|varnica|varnicu|vaspitala|vaspitavan|vaspitavanju|va\\\u0161ljivi|va\\\u017ei|ve\\\u010dan|ve\\\u0107ati|vek|veka|veke|vekova|venca|ve\\\u010dnost|veoma|Veoma|vera|vere|veri|verom|veru|veran|verama|Vera|Vere|Veri|Verom|Veru|Veran|Verama|veren|Veren|verena|vereni|verimo|vest|Vest|vesti|Vesti|Vjesti|vjesti|vestima|Vestima|vjestima|Vjestima|ve\\\u0161ala|ve\\\u0161\\\u0107u|ve\\\u0161u|vide\\\u0161e|vidjeo|Vidjeo|vjerojatno\\\u0107a|vje\\\u0161\\\u0107u|vlo|Vodi\\\u0107e|Vodi\\\u0107u|voliti|vredelo|vrednom|vrednog|vreme|Vreme|vrjeme|Vrjeme|vrteo|vrvela|whiskey|zaceljivanje|zagreva|Zagreva|Zagrevate|zagrevanje|zakunio|zalepili|zalepiti|zaliv|zalivu|zanm|zanma|zaplena|zapleni|zaplenu|zaspem|zastareo|zauvek|Zauvek|zauvjek|Zauvjek|zavera|zahtev|Zahtev|zasede|zasedi|zasedu|zatp|Zatp|za\\\u017eeleo|Za\\\u017eeleo|Za\\\u017eeljeo|za\\\u017eeljeo|zbg|zdrvo|Zdrvo|zlodela|zna\\\u0107i|zvani\\\u010dan|zvezdom|\\\u017eemo|\\\u017eeleo|\\\u017deleo|\\\u017deljeo|\\\u017eeljeo|\\\u017diveo|\\\u017eiveo|\\\u017emureo|Abi|Alis|Ajk|Ajku|Ajrin|Ajris|Ajron|Ajvi|An\\\u0111eles|An\\\u0111elesa|An\\\u0111elesu|An\\\u0111elesom|Antoni|Antoniju|Ar\\\u010di|Beverli|Bejker|Bitls|Bitlsi|Brid\\\u017eit|Bri\\\u017eit|Bruks|Dablin|Dablina|Dablinu|Dag|Darvin|Darvina|Darvinu|Darvinom|Dejv|Dejvi|Dejva|Dejvu|Dejvom|Den|Deril|Dijaz|Dru|\\\u0110eni|\\\u0110o\\\u0161ua|D\\\u017eejmi|D\\\u017ead|D\\\u017eeri|D\\\u017eerija|D\\\u017eo|D\\\u017eoel|D\\\u017eoelu|D\\\u017eo\\\u0161|D\\\u017eo\\\u0161u|D\\\u017eosi|D\\\u017eozi|D\\\u017ees|D\\\u017een|D\\\u017eej|D\\\u017eejn|D\\\u017eil|D\\\u017eodi|D\\\u017eud|D\\\u017euli|Ebi|Ejb|Ejba|Ejmi|Ejpril|Empajer|En\\\u0111el|End\\\u017ei|Entoni|E\\\u0161ford|E\\\u0161forda|E\\\u0161li|Fibi|Filovo|Flober|Fokner|Fren|Gre\\\u010den|Grejs|Hadson|Hadsonu|Hant|Hemingvej|Henk|Hejstings|Hju|Hjua|Hjuz|Hjuza|Hjuston|Hjustonu|Igo|Ilejn|\\\u017didovin|Johni|Jud\\\u017ein|Kasl|Kejd\\\u017e|Kejn|Kejsi|Kejti|Keren|Kerol|Kerolajn|Klajv|Klajva|Klajve|Klajvu|Klarens|Kler|Kloi|Klod|Klode|Kol|Kolins|Kortni|Krej\\?g|Kristi|Lajf|Lajl|Lejk|Lorejn|Lorens|Lusi|Majk|Majkeve|Majlo|Maslou|Medlin|Medelin|Mejbel|Mejn|Mejna|Mejnu|Mejnom|Mejpls|Mejsi|Mek|Merilend|Mi\\\u010del|Nensi|Ni\\\u010de|Ni\\\u010dea|Ni\\\u010deu|Ni\\\u010deom|Odri|Ohajo|Ohaja|Ohaju|Olbrajt|O\\'Nil|Orlins|Orlinsa|Orlinsu|Pem|Pejd\\\u017e|Red\\\u017ei|Red\\\u017einald|Rej|Rej\\\u010del|Ri\\\u010d|Rouz|Sendi|Sidnej|Sindi|Sojer|Sojeru|Sole|Stejsi|Stoun|\\\u0160eron|\\\u0160eril|\\\u0160irli|\\\u0160paniji|Tajms|Tejlor|Vajlder|Val\\\u0161|Vins|Voren|Vud|\\\u017dak|\\\u017dil|januar|Januar|februar|februara|februaru|Februar|Februara|Februaru|mart|Mart|april|April|maj|Maj|svibnjom|jun|juna|junu|Jun|Juni|juli|jula|julu|Juli|septembar|Septembar|oktobar|Oktobar|oktobra|oktobru|novembar|november|novembra|novembru|Novembar|November|Novembra|Novembru|decembar|Decembar)(\\b|$)"}}, 'hun': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -90,19 +102,31 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\u010d', u'\xe8'), (u'I\u05bb', u'I'), (u'\u05d0', u'\xe0'), (u'\u05d9', u'\xe9'), (u'\u05d8', u'\xe8'), (u'\u05db', u'\xeb'), (u'\u05dd', u'i'), (u'\u05df', u'\xef'), (u'\u05e3', u'\xf3'), (u'\u05e4', u'o'), (u'\u05e6', u'\xeb'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\u010d', u'\xe8'), (u'I\u05bb', u'I'), (u'\u05d0', u'\xe0'), (u'\u05d9', u'\xe9'), (u'\u05d8', u'\xe8'), (u'\u05db', u'\xeb'), (u'\u05dd', u'i'), (u'\u05df', u'\xef'), (u'\u05e3', u'\xf3'), (u'\u05e4', u'o'), (u'\u05e6', u'\xeb')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, 'WholeWords': {'data': OrderedDict([(u'ls', u'Is'), (u'ln', u'In'), (u'lk', u'Ik'), (u'ledereen', u'Iedereen'), (u'ledere', u'Iedere'), (u'lemand', u'Iemand')]), 'pattern': u'(?um)(\\b|^)(?:ls|ln|lk|ledereen|ledere|lemand)(\\b|$)'}}, + 'nob': {'BeginLines': {'data': OrderedDict(), + 'pattern': None}, + 'EndLines': {'data': OrderedDict(), + 'pattern': None}, + 'PartialLines': {'data': OrderedDict(), + 'pattern': None}, + 'PartialWordsAlways': {'data': OrderedDict(), + 'pattern': None}, + 'WholeLines': {'data': OrderedDict(), + 'pattern': None}, + 'WholeWords': {'data': OrderedDict([(u'varjeg', u'var jeg'), (u'omjeg', u'om jeg'), (u'menjeg', u'men jeg'), (u'noejeg', u'noe jeg'), (u'f\xf8rjeg', u'f\xf8r jeg'), (u'harjobbet', u'har jobbet'), (u'Kunnejeg', u'Kunne jeg'), (u'haddejeg', u'hadde jeg'), (u'p\xe5jorden', u'p\xe5 jorden'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'tenkerjeg', u'tenker jeg'), (u'helejorden', u'hele jorden'), (u'menjorden', u'men jorden'), (u'rundtjorden', u'rundt jorden'), (u'forjorden', u'for jorden'), (u'avjordens', u'av jordens')]), + 'pattern': u'(?um)(\\b|^)(?:varjeg|omjeg|menjeg|noejeg|f\\\xf8rjeg|harjobbet|Kunnejeg|haddejeg|p\\\xe5jorden|n\\\xe5rjeg|tenkerjeg|helejorden|menjorden|rundtjorden|forjorden|avjordens)(\\b|$)'}}, 'nor': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -114,7 +138,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict([(u'IN 6-E', u'N 6 E'), (u'in tegrar-se', u'integrar-se'), (u'in teresse', u'interesse'), (u'in testinos', u'intestinos'), (u'indica \xe7\xe3o', u'indica\xe7\xe3o'), (u'inte tino', u'intestino'), (u'intes tinos', u'intestinos'), (u'L da', u'Lda'), (u'mal estar', u'mal-estar'), (u'mastiga \xe7\xe1o', u'mastiga\xe7\xe3o'), (u'm\xe9di cas', u'm\xe9dicas'), (u'mineo rais', u'minerais'), (u'mola res', u'molares'), (u'movi mentos', u'movimentos'), (u'movimen to', u'movimento'), (u'N 5-Estendido', u'N\xba 5 Estendido'), (u'oxig\xe9 nio', u'oxig\xe9nio'), (u'pod mos', u'podemos'), (u'poder-se ia', u'poder-se-ia'), (u'pos sibilidade', u'possibilidade'), (u'possibi lidades', u'possibilidades'), (u'pro duto', u'produto'), (u'procu rar', u'procurar'), (u'Q u e', u'Que'), (u'qualifi cam', u'qualificam'), (u'R egi\xe3o', u'Regi\xe3o'), (u'unsuficien temente', u'insuficientemente')]), 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:IN\\ 6\\-E|in\\ tegrar\\-se|in\\ teresse|in\\ testinos|indica\\ \\\xe7\\\xe3o|inte\\ tino|intes\\ tinos|L\\ da|mal\\ estar|mastiga\\ \\\xe7\\\xe1o|m\\\xe9di\\ cas|mineo\\ rais|mola\\ res|movi\\ mentos|movimen\\ to|N\\ 5\\-Estendido|oxig\\\xe9\\ nio|pod\\ mos|poder\\-se\\ ia|pos\\ sibilidade|possibi\\ lidades|pro\\ duto|procu\\ rar|Q\\ u\\ e|qualifi\\ cam|R\\ egi\\\xe3o|unsuficien\\ temente)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -126,7 +150,7 @@ 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, @@ -138,36 +162,36 @@ 'pattern': u'(?um)(?:\\.\\\xbb\\.)$'}, 'PartialLines': {'data': OrderedDict([(u'de gratis', u'gratis'), (u'si quiera', u'siquiera'), (u'Cada una de los', u'Cada uno de los'), (u'Cada uno de las', u'Cada una de las'), (u'haber que', u'a ver qu\xe9'), (u'haber qu\xe9', u'a ver qu\xe9'), (u'Haber si', u'A ver si'), (u' que hora', u' qu\xe9 hora'), (u'yo que se', u'yo qu\xe9 s\xe9'), (u'Yo que se', u'Yo qu\xe9 s\xe9'), (u' tu!', u' t\xfa!'), (u' si!', u' s\xed!'), (u' mi!', u' m\xed!'), (u' el!', u' \xe9l!'), (u' tu?', u' t\xfa?'), (u' si?', u' s\xed?'), (u' mi?', u' m\xed?'), (u' el?', u' \xe9l?'), (u' aun?', u' a\xfan?'), (u' mas?', u' m\xe1s?'), (u' que?', u' qu\xe9?'), (u' paso?', u' pas\xf3?'), (u' cuando?', u' cu\xe1ndo?'), (u' cuanto?', u' cu\xe1nto?'), (u' cuanta?', u' cu\xe1nta?'), (u' cuantas?', u' cu\xe1ntas?'), (u' cuantos?', u' cu\xe1ntos?'), (u' donde?', u' d\xf3nde?'), (u' quien?', u' qui\xe9n?'), (u' como?', u' c\xf3mo?'), (u' adonde?', u' ad\xf3nde?'), (u' cual?', u' cu\xe1l?'), (u'\xbfSi?', u'\xbfS\xed?'), (u'\xbfesta bien?', u'\xbfest\xe1 bien?'), (u'\xbfPero qu\xe9 haces?', u'\xa1\xbfPero qu\xe9 haces?!'), (u'\xbfpero qu\xe9 haces?', u'\xa1\xbfpero qu\xe9 haces?!'), (u'\xbfEs que no me has escuchado?', u'\xa1\xbfEs que no me has escuchado?!'), (u'\xa1\xbfes que no me has escuchado?!', u'\xa1\xbfes que no me has escuchado?!'), (u'\xbfaun', u'\xbfa\xfan'), (u'\xbftu ', u'\xbft\xfa '), (u'\xbfque ', u'\xbfqu\xe9 '), (u'\xbfsabes que', u'\xbfsabes qu\xe9'), (u'\xbfsabes adonde', u'\xbfsabes ad\xf3nde'), (u'\xbfsabes cual', u'\xbfsabes cu\xe1l'), (u'\xbfsabes quien', u'\xbfsabes qui\xe9n'), (u'\xbfsabes como', u'\xbfsabes c\xf3mo'), (u'\xbfsabes cuan', u'\xbfsabes cu\xe1n'), (u'\xbfsabes cuanto', u'\xbfsabes cu\xe1nto'), (u'\xbfsabes cuanta', u'\xbfsabes cu\xe1nta'), (u'\xbfsabes cuantos', u'\xbfsabes cu\xe1ntos'), (u'\xbfsabes cuantas', u'\xbfsabes cu\xe1ntas'), (u'\xbfsabes cuando', u'\xbfsabes cu\xe1ndo'), (u'\xbfsabes donde', u'\xbfsabes d\xf3nde'), (u'\xbfsabe que', u'\xbfsabe qu\xe9'), (u'\xbfsabe adonde', u'\xbfsabe ad\xf3nde'), (u'\xbfsabe cual', u'\xbfsabe cu\xe1l'), (u'\xbfsabe quien', u'\xbfsabe qui\xe9n'), (u'\xbfsabe como', u'\xbfsabe c\xf3mo'), (u'\xbfsabe cuan', u'\xbfsabe cu\xe1n'), (u'\xbfsabe cuanto', u'\xbfsabe cu\xe1nto'), (u'\xbfsabe cuanta', u'\xbfsabe cu\xe1nta'), (u'\xbfsabe cuantos', u'\xbfsabe cu\xe1ntos'), (u'\xbfsabe cuantas', u'\xbfsabe cu\xe1ntas'), (u'\xbfsabe cuando', u'\xbfsabe cu\xe1ndo'), (u'\xbfsabe donde', u'\xbfsabe d\xf3nde'), (u'\xbfsaben que', u'\xbfsaben qu\xe9'), (u'\xbfsaben adonde', u'\xbfsaben ad\xf3nde'), (u'\xbfsaben cual', u'\xbfsaben cu\xe1l'), (u'\xbfsaben quien', u'\xbfsaben qui\xe9n'), (u'\xbfsaben como', u'\xbfsaben c\xf3mo'), (u'\xbfsaben cuan', u'\xbfsaben cu\xe1n'), (u'\xbfsaben cuanto', u'\xbfsaben cu\xe1nto'), (u'\xbfsaben cuanta', u'\xbfsaben cu\xe1nta'), (u'\xbfsaben cuantos', u'\xbfsaben cu\xe1ntos'), (u'\xbfsaben cuantas', u'\xbfsaben cu\xe1ntas'), (u'\xbfsaben cuando', u'\xbfsaben cu\xe1ndo'), (u'\xbfsaben donde', u'\xbfsaben d\xf3nde'), (u'\xbfde que', u'\xbfde qu\xe9'), (u'\xbfde donde', u'\xbfde d\xf3nde'), (u'\xbfde cual', u'\xbfde cu\xe1l'), (u'\xbfde quien', u'\xbfde qui\xe9n'), (u'\xbfde cuanto', u'\xbfde cu\xe1nto'), (u'\xbfde cuanta', u'\xbfde cu\xe1nta'), (u'\xbfde cuantos', u'\xbfde cu\xe1ntos'), (u'\xbfde cuantas', u'\xbfde cu\xe1ntas'), (u'\xbfde cuando', u'\xbfde cu\xe1ndo'), (u'\xbfsobre que', u'\xbfsobre qu\xe9'), (u'\xbfcomo ', u'\xbfc\xf3mo '), (u'\xbfcual ', u'\xbfcu\xe1l '), (u'\xbfen cual', u'\xbfen cu\xe1l'), (u'\xbfcuando', u'\xbfcu\xe1ndo'), (u'\xbfhasta cual', u'\xbfhasta cu\xe1l'), (u'\xbfhasta quien', u'\xbfhasta qui\xe9n'), (u'\xbfhasta cuanto', u'\xbfhasta cu\xe1nto'), (u'\xbfhasta cuantas', u'\xbfhasta cu\xe1ntas'), (u'\xbfhasta cuantos', u'\xbfhasta cu\xe1ntos'), (u'\xbfhasta cuando', u'\xbfhasta cu\xe1ndo'), (u'\xbfhasta donde', u'\xbfhasta d\xf3nde'), (u'\xbfhasta que', u'\xbfhasta qu\xe9'), (u'\xbfhasta adonde', u'\xbfhasta ad\xf3nde'), (u'\xbfdesde que', u'\xbfdesde qu\xe9'), (u'\xbfdesde cuando', u'\xbfdesde cu\xe1ndo'), (u'\xbfdesde quien', u'\xbfdesde qui\xe9n'), (u'\xbfdesde donde', u'\xbfdesde d\xf3nde'), (u'\xbfcuanto', u'\xbfcu\xe1nto'), (u'\xbfcuantos', u'\xbfcu\xe1ntos'), (u'\xbfdonde', u'\xbfd\xf3nde'), (u'\xbfadonde', u'\xbfad\xf3nde'), (u'\xbfcon que', u'\xbfcon qu\xe9'), (u'\xbfcon cual', u'\xbfcon cu\xe1l'), (u'\xbfcon quien', u'\xbfcon qui\xe9n'), (u'\xbfcon cuantos', u'\xbfcon cu\xe1ntos'), (u'\xbfcon cuantas', u'\xbfcon cu\xe1ntas'), (u'\xbfcon cuanta', u'\xbfcon cu\xe1nta'), (u'\xbfcon cuanto', u'\xbfcon cu\xe1nto'), (u'\xbfpara donde', u'\xbfpara d\xf3nde'), (u'\xbfpara adonde', u'\xbfpara ad\xf3nde'), (u'\xbfpara cuando', u'\xbfpara cu\xe1ndo'), (u'\xbfpara que', u'\xbfpara qu\xe9'), (u'\xbfpara quien', u'\xbfpara qui\xe9n'), (u'\xbfpara cuanto', u'\xbfpara cu\xe1nto'), (u'\xbfpara cuanta', u'\xbfpara cu\xe1nta'), (u'\xbfpara cuantos', u'\xbfpara cu\xe1ntos'), (u'\xbfpara cuantas', u'\xbfpara cu\xe1ntas'), (u'\xbfa donde', u'\xbfa d\xf3nde'), (u'\xbfa que', u'\xbfa qu\xe9'), (u'\xbfa cual', u'\xbfa cu\xe1l'), (u'\xbfa quien', u'\xbfa quien'), (u'\xbfa como', u'\xbfa c\xf3mo'), (u'\xbfa cuanto', u'\xbfa cu\xe1nto'), (u'\xbfa cuanta', u'\xbfa cu\xe1nta'), (u'\xbfa cuantos', u'\xbfa cu\xe1ntos'), (u'\xbfa cuantas', u'\xbfa cu\xe1ntas'), (u'\xbfpor que', u'\xbfpor qu\xe9'), (u'\xbfpor cual', u'\xbfpor cu\xe1l'), (u'\xbfpor quien', u'\xbfpor qui\xe9n'), (u'\xbfpor cuanto', u'\xbfpor cu\xe1nto'), (u'\xbfpor cuanta', u'\xbfpor cu\xe1nta'), (u'\xbfpor cuantos', u'\xbfpor cu\xe1ntos'), (u'\xbfpor cuantas', u'\xbfpor cu\xe1ntas'), (u'\xbfpor donde', u'\xbfpor d\xf3nde'), (u'\xbfporque', u'\xbfpor qu\xe9'), (u'\xbfporqu\xe9', u'\xbfpor qu\xe9'), (u'\xbfy que', u'\xbfy qu\xe9'), (u'\xbfy como', u'\xbfy c\xf3mo'), (u'\xbfy cuando', u'\xbfy cu\xe1ndo'), (u'\xbfy cual', u'\xbfy cu\xe1l'), (u'\xbfy quien', u'\xbfy qui\xe9n'), (u'\xbfy cuanto', u'\xbfy cu\xe1nto'), (u'\xbfy cuanta', u'\xbfy cu\xe1nta'), (u'\xbfy cuantos', u'\xbfy cu\xe1ntos'), (u'\xbfy cuantas', u'\xbfy cu\xe1ntas'), (u'\xbfy donde', u'\xbfy d\xf3nde'), (u'\xbfy adonde', u'\xbfy ad\xf3nde'), (u'\xbfquien ', u'\xbfqui\xe9n '), (u'\xbfesta ', u'\xbfest\xe1 '), (u'\xbfestas ', u'\xbfest\xe1s '), (u'\xbfAun', u'\xbfA\xfan'), (u'\xbfQue ', u'\xbfQu\xe9 '), (u'\xbfSabes que', u'\xbfSabes qu\xe9'), (u'\xbfSabes adonde', u'\xbfSabes ad\xf3nde'), (u'\xbfSabes cual', u'\xbfSabes cu\xe1l'), (u'\xbfSabes quien', u'\xbfSabes qui\xe9n'), (u'\xbfSabes como', u'\xbfSabes c\xf3mo'), (u'\xbfSabes cuan', u'\xbfSabes cu\xe1n'), (u'\xbfSabes cuanto', u'\xbfSabes cu\xe1nto'), (u'\xbfSabes cuanta', u'\xbfSabes cu\xe1nta'), (u'\xbfSabes cuantos', u'\xbfSabes cu\xe1ntos'), (u'\xbfSabes cuantas', u'\xbfSabes cu\xe1ntas'), (u'\xbfSabes cuando', u'\xbfSabes cu\xe1ndo'), (u'\xbfSabes donde', u'\xbfSabes d\xf3nde'), (u'\xbfSabe que', u'\xbfSabe qu\xe9'), (u'\xbfSabe adonde', u'\xbfSabe ad\xf3nde'), (u'\xbfSabe cual', u'\xbfSabe cu\xe1l'), (u'\xbfSabe quien', u'\xbfSabe qui\xe9n'), (u'\xbfSabe como', u'\xbfSabe c\xf3mo'), (u'\xbfSabe cuan', u'\xbfSabe cu\xe1n'), (u'\xbfSabe cuanto', u'\xbfSabe cu\xe1nto'), (u'\xbfSabe cuanta', u'\xbfSabe cu\xe1nta'), (u'\xbfSabe cuantos', u'\xbfSabe cu\xe1ntos'), (u'\xbfSabe cuantas', u'\xbfSabe cu\xe1ntas'), (u'\xbfSabe cuando', u'\xbfSabe cu\xe1ndo'), (u'\xbfSabe donde', u'\xbfSabe d\xf3nde'), (u'\xbfSaben que', u'\xbfSaben qu\xe9'), (u'\xbfSaben adonde', u'\xbfSaben ad\xf3nde'), (u'\xbfSaben cual', u'\xbfSaben cu\xe1l'), (u'\xbfSaben quien', u'\xbfSaben qui\xe9n'), (u'\xbfSaben como', u'\xbfSaben c\xf3mo'), (u'\xbfSaben cuan', u'\xbfSaben cu\xe1n'), (u'\xbfSaben cuanto', u'\xbfSaben cu\xe1nto'), (u'\xbfSaben cuanta', u'\xbfSaben cu\xe1nta'), (u'\xbfSaben cuantos', u'\xbfSaben cu\xe1ntos'), (u'\xbfSaben cuantas', u'\xbfSaben cu\xe1ntas'), (u'\xbfSaben cuando', u'\xbfSaben cu\xe1ndo'), (u'\xbfSaben donde', u'\xbfSaben d\xf3nde'), (u'\xbfDe que', u'\xbfDe qu\xe9'), (u'\xbfDe donde', u'\xbfDe d\xf3nde'), (u'\xbfDe cual', u'\xbfDe cu\xe1l'), (u'\xbfDe quien', u'\xbfDe qui\xe9n'), (u'\xbfDe cuanto', u'\xbfDe cu\xe1nto'), (u'\xbfDe cuanta', u'\xbfDe cu\xe1nta'), (u'\xbfDe cuantos', u'\xbfDe cu\xe1ntos'), (u'\xbfDe cuantas', u'\xbfDe cu\xe1ntas'), (u'\xbfDe cuando', u'\xbfDe cu\xe1ndo'), (u'\xbfDesde que', u'\xbfDesde qu\xe9'), (u'\xbfDesde cuando', u'\xbfDesde cu\xe1ndo'), (u'\xbfDesde quien', u'\xbfDesde qui\xe9n'), (u'\xbfDesde donde', u'\xbfDesde d\xf3nde'), (u'\xbfSobre que', u'\xbfSobre qu\xe9'), (u'\xbfComo ', u'\xbfC\xf3mo '), (u'\xbfCual ', u'\xbfCu\xe1l '), (u'\xbfEn cual', u'\xbfEn cu\xe1l'), (u'\xbfCuando', u'\xbfCu\xe1ndo'), (u'\xbfHasta cual', u'\xbfHasta cu\xe1l'), (u'\xbfHasta quien', u'\xbfHasta qui\xe9n'), (u'\xbfHasta cuanto', u'\xbfHasta cu\xe1nto'), (u'\xbfHasta cuantas', u'\xbfHasta cu\xe1ntas'), (u'\xbfHasta cuantos', u'\xbfHasta cu\xe1ntos'), (u'\xbfHasta cuando', u'\xbfHasta cu\xe1ndo'), (u'\xbfHasta donde', u'\xbfHasta d\xf3nde'), (u'\xbfHasta que', u'\xbfHasta qu\xe9'), (u'\xbfHasta adonde', u'\xbfHasta ad\xf3nde'), (u'\xbfCuanto', u'\xbfCu\xe1nto'), (u'\xbfCuantos', u'\xbfCu\xe1ntos'), (u'\xbfDonde', u'\xbfD\xf3nde'), (u'\xbfAdonde', u'\xbfAd\xf3nde'), (u'\xbfCon que', u'\xbfCon qu\xe9'), (u'\xbfCon cual', u'\xbfCon cu\xe1l'), (u'\xbfCon quien', u'\xbfCon qui\xe9n'), (u'\xbfCon cuantos', u'\xbfCon cu\xe1ntos'), (u'\xbfCon cuanta', u'\xbfCon cu\xe1nta'), (u'\xbfCon cuanto', u'\xbfCon cu\xe1nto'), (u'\xbfPara donde', u'\xbfPara d\xf3nde'), (u'\xbfPara adonde', u'\xbfPara ad\xf3nde'), (u'\xbfPara cuando', u'\xbfPara cu\xe1ndo'), (u'\xbfPara que', u'\xbfPara qu\xe9'), (u'\xbfPara quien', u'\xbfPara qui\xe9n'), (u'\xbfPara cuanto', u'\xbfPara cu\xe1nto'), (u'\xbfPara cuanta', u'\xbfPara cu\xe1nta'), (u'\xbfPara cuantos', u'\xbfPara cu\xe1ntos'), (u'\xbfPara cuantas', u'\xbfPara cu\xe1ntas'), (u'\xbfA donde', u'\xbfA d\xf3nde'), (u'\xbfA que', u'\xbfA qu\xe9'), (u'\xbfA cual', u'\xbfA cu\xe1l'), (u'\xbfA quien', u'\xbfA quien'), (u'\xbfA como', u'\xbfA c\xf3mo'), (u'\xbfA cuanto', u'\xbfA cu\xe1nto'), (u'\xbfA cuanta', u'\xbfA cu\xe1nta'), (u'\xbfA cuantos', u'\xbfA cu\xe1ntos'), (u'\xbfA cuantas', u'\xbfA cu\xe1ntas'), (u'\xbfPor que', u'\xbfPor qu\xe9'), (u'\xbfPor cual', u'\xbfPor cu\xe1l'), (u'\xbfPor quien', u'\xbfPor qui\xe9n'), (u'\xbfPor cuanto', u'\xbfPor cu\xe1nto'), (u'\xbfPor cuanta', u'\xbfPor cu\xe1nta'), (u'\xbfPor cuantos', u'\xbfPor cu\xe1ntos'), (u'\xbfPor cuantas', u'\xbfPor cu\xe1ntas'), (u'\xbfPor donde', u'\xbfPor d\xf3nde'), (u'\xbfPorque', u'\xbfPor qu\xe9'), (u'\xbfPorqu\xe9', u'\xbfPor qu\xe9'), (u'\xbfY que', u'\xbfY qu\xe9'), (u'\xbfY como', u'\xbfY c\xf3mo'), (u'\xbfY cuando', u'\xbfY cu\xe1ndo'), (u'\xbfY cual', u'\xbfY cu\xe1l'), (u'\xbfY quien', u'\xbfY qui\xe9n'), (u'\xbfY cuanto', u'\xbfY cu\xe1nto'), (u'\xbfY cuanta', u'\xbfY cu\xe1nta'), (u'\xbfY cuantos', u'\xbfY cu\xe1ntos'), (u'\xbfY cuantas', u'\xbfY cu\xe1ntas'), (u'\xbfY donde', u'\xbfY d\xf3nde'), (u'\xbfY adonde', u'\xbfY ad\xf3nde'), (u'\xbfQuien ', u'\xbfQui\xe9n '), (u'\xbfEsta ', u'\xbfEst\xe1 '), (u'el porque', u'el porqu\xe9'), (u'su porque', u'su porqu\xe9'), (u'los porqu\xe9s', u'los porqu\xe9s'), (u'aun,', u'a\xfan,'), (u'aun no', u'a\xfan no'), (u' de y ', u' d\xe9 y '), (u' nos de ', u' nos d\xe9 '), (u' tu ya ', u' t\xfa ya '), (u'Tu ya ', u'T\xfa ya '), (u' de, ', u' d\xe9,'), (u' mi, ', u' m\xed,'), (u' tu, ', u' t\xfa,'), (u' el, ', u' \xe9l,'), (u' te, ', u' t\xe9,'), (u' mas, ', u' m\xe1s,'), (u' quien, ', u' qui\xe9n,'), (u' cual,', u' cu\xe1l,'), (u'porque, ', u'porqu\xe9,'), (u'cuanto, ', u'cu\xe1nto,'), (u'cuando, ', u'cu\xe1ndo,'), (u' se,', u' s\xe9,'), (u'se donde', u's\xe9 d\xf3nde'), (u'se cuando', u's\xe9 cu\xe1ndo'), (u'se adonde', u's\xe9 ad\xf3nde'), (u'se como', u's\xe9 c\xf3mo'), (u'se cual', u's\xe9 cu\xe1l'), (u'se quien', u's\xe9 qui\xe9n'), (u'se cuanto', u's\xe9 cu\xe1nto'), (u'se cuanta', u's\xe9 cu\xe1nta'), (u'se cuantos', u's\xe9 cu\xe1ntos'), (u'se cuantas', u's\xe9 cu\xe1ntas'), (u'se cuan', u's\xe9 cu\xe1n'), (u' el si ', u' el s\xed '), (u'si mismo', u's\xed mismo'), (u'si misma', u's\xed misma'), (u' llegal', u' ilegal'), (u' lluminar', u' iluminar'), (u'sllbato', u'silbato'), (u'sllenclo', u'silencio'), (u'clemencla', u'clemencia'), (u'socledad', u'sociedad'), (u'tlene', u'tiene'), (u'tlempo', u'tiempo'), (u'equlvocaba', u'equivocaba'), (u'qulnce', u'quince'), (u'comlen', u'comien'), (u'historl', u'histori'), (u'misterl', u'misteri'), (u'vivencl', u'vivenci')]), 'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:de\\ gratis|si\\ quiera|Cada\\ una\\ de\\ los|Cada\\ uno\\ de\\ las|haber\\ que|haber\\ qu\\\xe9|Haber\\ si|\\ que\\ hora|yo\\ que\\ se|Yo\\ que\\ se|\\ tu\\!|\\ si\\!|\\ mi\\!|\\ el\\!|\\ tu\\?|\\ si\\?|\\ mi\\?|\\ el\\?|\\ aun\\?|\\ mas\\?|\\ que\\?|\\ paso\\?|\\ cuando\\?|\\ cuanto\\?|\\ cuanta\\?|\\ cuantas\\?|\\ cuantos\\?|\\ donde\\?|\\ quien\\?|\\ como\\?|\\ adonde\\?|\\ cual\\?|\\\xbfSi\\?|\\\xbfesta\\ bien\\?|\\\xbfPero\\ qu\\\xe9\\ haces\\?|\\\xbfpero\\ qu\\\xe9\\ haces\\?|\\\xbfEs\\ que\\ no\\ me\\ has\\ escuchado\\?|\\\xa1\\\xbfes\\ que\\ no\\ me\\ has\\ escuchado\\?\\!|\\\xbfaun|\\\xbftu\\ |\\\xbfque\\ |\\\xbfsabes\\ que|\\\xbfsabes\\ adonde|\\\xbfsabes\\ cual|\\\xbfsabes\\ quien|\\\xbfsabes\\ como|\\\xbfsabes\\ cuan|\\\xbfsabes\\ cuanto|\\\xbfsabes\\ cuanta|\\\xbfsabes\\ cuantos|\\\xbfsabes\\ cuantas|\\\xbfsabes\\ cuando|\\\xbfsabes\\ donde|\\\xbfsabe\\ que|\\\xbfsabe\\ adonde|\\\xbfsabe\\ cual|\\\xbfsabe\\ quien|\\\xbfsabe\\ como|\\\xbfsabe\\ cuan|\\\xbfsabe\\ cuanto|\\\xbfsabe\\ cuanta|\\\xbfsabe\\ cuantos|\\\xbfsabe\\ cuantas|\\\xbfsabe\\ cuando|\\\xbfsabe\\ donde|\\\xbfsaben\\ que|\\\xbfsaben\\ adonde|\\\xbfsaben\\ cual|\\\xbfsaben\\ quien|\\\xbfsaben\\ como|\\\xbfsaben\\ cuan|\\\xbfsaben\\ cuanto|\\\xbfsaben\\ cuanta|\\\xbfsaben\\ cuantos|\\\xbfsaben\\ cuantas|\\\xbfsaben\\ cuando|\\\xbfsaben\\ donde|\\\xbfde\\ que|\\\xbfde\\ donde|\\\xbfde\\ cual|\\\xbfde\\ quien|\\\xbfde\\ cuanto|\\\xbfde\\ cuanta|\\\xbfde\\ cuantos|\\\xbfde\\ cuantas|\\\xbfde\\ cuando|\\\xbfsobre\\ que|\\\xbfcomo\\ |\\\xbfcual\\ |\\\xbfen\\ cual|\\\xbfcuando|\\\xbfhasta\\ cual|\\\xbfhasta\\ quien|\\\xbfhasta\\ cuanto|\\\xbfhasta\\ cuantas|\\\xbfhasta\\ cuantos|\\\xbfhasta\\ cuando|\\\xbfhasta\\ donde|\\\xbfhasta\\ que|\\\xbfhasta\\ adonde|\\\xbfdesde\\ que|\\\xbfdesde\\ cuando|\\\xbfdesde\\ quien|\\\xbfdesde\\ donde|\\\xbfcuanto|\\\xbfcuantos|\\\xbfdonde|\\\xbfadonde|\\\xbfcon\\ que|\\\xbfcon\\ cual|\\\xbfcon\\ quien|\\\xbfcon\\ cuantos|\\\xbfcon\\ cuantas|\\\xbfcon\\ cuanta|\\\xbfcon\\ cuanto|\\\xbfpara\\ donde|\\\xbfpara\\ adonde|\\\xbfpara\\ cuando|\\\xbfpara\\ que|\\\xbfpara\\ quien|\\\xbfpara\\ cuanto|\\\xbfpara\\ cuanta|\\\xbfpara\\ cuantos|\\\xbfpara\\ cuantas|\\\xbfa\\ donde|\\\xbfa\\ que|\\\xbfa\\ cual|\\\xbfa\\ quien|\\\xbfa\\ como|\\\xbfa\\ cuanto|\\\xbfa\\ cuanta|\\\xbfa\\ cuantos|\\\xbfa\\ cuantas|\\\xbfpor\\ que|\\\xbfpor\\ cual|\\\xbfpor\\ quien|\\\xbfpor\\ cuanto|\\\xbfpor\\ cuanta|\\\xbfpor\\ cuantos|\\\xbfpor\\ cuantas|\\\xbfpor\\ donde|\\\xbfporque|\\\xbfporqu\\\xe9|\\\xbfy\\ que|\\\xbfy\\ como|\\\xbfy\\ cuando|\\\xbfy\\ cual|\\\xbfy\\ quien|\\\xbfy\\ cuanto|\\\xbfy\\ cuanta|\\\xbfy\\ cuantos|\\\xbfy\\ cuantas|\\\xbfy\\ donde|\\\xbfy\\ adonde|\\\xbfquien\\ |\\\xbfesta\\ |\\\xbfestas\\ |\\\xbfAun|\\\xbfQue\\ |\\\xbfSabes\\ que|\\\xbfSabes\\ adonde|\\\xbfSabes\\ cual|\\\xbfSabes\\ quien|\\\xbfSabes\\ como|\\\xbfSabes\\ cuan|\\\xbfSabes\\ cuanto|\\\xbfSabes\\ cuanta|\\\xbfSabes\\ cuantos|\\\xbfSabes\\ cuantas|\\\xbfSabes\\ cuando|\\\xbfSabes\\ donde|\\\xbfSabe\\ que|\\\xbfSabe\\ adonde|\\\xbfSabe\\ cual|\\\xbfSabe\\ quien|\\\xbfSabe\\ como|\\\xbfSabe\\ cuan|\\\xbfSabe\\ cuanto|\\\xbfSabe\\ cuanta|\\\xbfSabe\\ cuantos|\\\xbfSabe\\ cuantas|\\\xbfSabe\\ cuando|\\\xbfSabe\\ donde|\\\xbfSaben\\ que|\\\xbfSaben\\ adonde|\\\xbfSaben\\ cual|\\\xbfSaben\\ quien|\\\xbfSaben\\ como|\\\xbfSaben\\ cuan|\\\xbfSaben\\ cuanto|\\\xbfSaben\\ cuanta|\\\xbfSaben\\ cuantos|\\\xbfSaben\\ cuantas|\\\xbfSaben\\ cuando|\\\xbfSaben\\ donde|\\\xbfDe\\ que|\\\xbfDe\\ donde|\\\xbfDe\\ cual|\\\xbfDe\\ quien|\\\xbfDe\\ cuanto|\\\xbfDe\\ cuanta|\\\xbfDe\\ cuantos|\\\xbfDe\\ cuantas|\\\xbfDe\\ cuando|\\\xbfDesde\\ que|\\\xbfDesde\\ cuando|\\\xbfDesde\\ quien|\\\xbfDesde\\ donde|\\\xbfSobre\\ que|\\\xbfComo\\ |\\\xbfCual\\ |\\\xbfEn\\ cual|\\\xbfCuando|\\\xbfHasta\\ cual|\\\xbfHasta\\ quien|\\\xbfHasta\\ cuanto|\\\xbfHasta\\ cuantas|\\\xbfHasta\\ cuantos|\\\xbfHasta\\ cuando|\\\xbfHasta\\ donde|\\\xbfHasta\\ que|\\\xbfHasta\\ adonde|\\\xbfCuanto|\\\xbfCuantos|\\\xbfDonde|\\\xbfAdonde|\\\xbfCon\\ que|\\\xbfCon\\ cual|\\\xbfCon\\ quien|\\\xbfCon\\ cuantos|\\\xbfCon\\ cuanta|\\\xbfCon\\ cuanto|\\\xbfPara\\ donde|\\\xbfPara\\ adonde|\\\xbfPara\\ cuando|\\\xbfPara\\ que|\\\xbfPara\\ quien|\\\xbfPara\\ cuanto|\\\xbfPara\\ cuanta|\\\xbfPara\\ cuantos|\\\xbfPara\\ cuantas|\\\xbfA\\ donde|\\\xbfA\\ que|\\\xbfA\\ cual|\\\xbfA\\ quien|\\\xbfA\\ como|\\\xbfA\\ cuanto|\\\xbfA\\ cuanta|\\\xbfA\\ cuantos|\\\xbfA\\ cuantas|\\\xbfPor\\ que|\\\xbfPor\\ cual|\\\xbfPor\\ quien|\\\xbfPor\\ cuanto|\\\xbfPor\\ cuanta|\\\xbfPor\\ cuantos|\\\xbfPor\\ cuantas|\\\xbfPor\\ donde|\\\xbfPorque|\\\xbfPorqu\\\xe9|\\\xbfY\\ que|\\\xbfY\\ como|\\\xbfY\\ cuando|\\\xbfY\\ cual|\\\xbfY\\ quien|\\\xbfY\\ cuanto|\\\xbfY\\ cuanta|\\\xbfY\\ cuantos|\\\xbfY\\ cuantas|\\\xbfY\\ donde|\\\xbfY\\ adonde|\\\xbfQuien\\ |\\\xbfEsta\\ |el\\ porque|su\\ porque|los\\ porqu\\\xe9s|aun\\,|aun\\ no|\\ de\\ y\\ |\\ nos\\ de\\ |\\ tu\\ ya\\ |Tu\\ ya\\ |\\ de\\,\\ |\\ mi\\,\\ |\\ tu\\,\\ |\\ el\\,\\ |\\ te\\,\\ |\\ mas\\,\\ |\\ quien\\,\\ |\\ cual\\,|porque\\,\\ |cuanto\\,\\ |cuando\\,\\ |\\ se\\,|se\\ donde|se\\ cuando|se\\ adonde|se\\ como|se\\ cual|se\\ quien|se\\ cuanto|se\\ cuanta|se\\ cuantos|se\\ cuantas|se\\ cuan|\\ el\\ si\\ |si\\ mismo|si\\ misma|\\ llegal|\\ lluminar|sllbato|sllenclo|clemencla|socledad|tlene|tlempo|equlvocaba|qulnce|comlen|historl|misterl|vivencl)(?:(?=\\s)|(?=$)|(?=\\b))'}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict([(u'No', u'No.')]), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'KBs', u'kB'), (u'Vd', u'Ud'), (u'N\xb0', u'N.\xb0'), (u'n\xb0', u'n.\xb0'), (u'nro.', u'n.\xb0'), (u'Nro.', u'N.\xb0'), (u'aca', u'ac\xe1'), (u'actuas', u'act\xfaas'), (u'actues', u'act\xfaes'), (u'adios', u'adi\xf3s'), (u'agarrenla', u'ag\xe1rrenla'), (u'agarrenlo', u'ag\xe1rrenlo'), (u'agarrandose', u'agarr\xe1ndose'), (u'algun', u'alg\xfan'), (u'alli', u'all\xed'), (u'alla', u'all\xe1'), (u'alejate', u'al\xe9jate'), (u'ahi', u'ah\xed'), (u'angel', u'\xe1ngel'), (u'angeles', u'\xe1ngeles'), (u'apagala', u'ap\xe1gala'), (u'aqui', u'aqu\xed'), (u'asi', u'as\xed'), (u'bahia', u'bah\xeda'), (u'busqueda', u'b\xfasqueda'), (u'busquedas', u'b\xfasquedas'), (u'callate', u'c\xe1llate'), (u'carcel', u'c\xe1rcel'), (u'camara', u'c\xe1mara'), (u'caido', u'ca\xeddo'), (u'cabron', u'cabr\xf3n'), (u'camion', u'cami\xf3n'), (u'codigo', u'c\xf3digo'), (u'codigos', u'c\xf3digos'), (u'comence', u'comenc\xe9'), (u'comprate', u'c\xf3mprate'), (u'consegui', u'consegu\xed'), (u'confias', u'conf\xedas'), (u'convertira', u'convertir\xe1'), (u'corazon', u'coraz\xf3n'), (u'crei', u'cre\xed'), (u'creia', u'cre\xeda'), (u'creido', u'cre\xeddo'), (u'creiste', u'cre\xedste'), (u'cubrenos', u'c\xfabrenos'), (u'comio', u'comi\xf3'), (u'dara', u'dar\xe1'), (u'dia', u'd\xeda'), (u'dias', u'd\xedas'), (u'debio', u'debi\xf3'), (u'demelo', u'd\xe9melo'), (u'dimelo', u'd\xedmelo'), (u'denoslo', u'd\xe9noslo'), (u'deselo', u'd\xe9selo'), (u'decia', u'dec\xeda'), (u'decian', u'dec\xedan'), (u'detras', u'detr\xe1s'), (u'deberia', u'deber\xeda'), (u'deberas', u'deber\xe1s'), (u'deberias', u'deber\xedas'), (u'deberian', u'deber\xedan'), (u'deberiamos', u'deber\xedamos'), (u'dejame', u'd\xe9jame'), (u'dejate', u'd\xe9jate'), (u'dejalo', u'd\xe9jalo'), (u'dejarian', u'dejar\xedan'), (u'damela', u'd\xe1mela'), (u'despues', u'despu\xe9s'), (u'diciendome', u'dici\xe9ndome'), (u'dificil', u'dif\xedcil'), (u'dificiles', u'dif\xedciles'), (u'disculpate', u'disc\xfalpate'), (u'dolares', u'd\xf3lares'), (u'hechar', u'echar'), (u'examenes', u'ex\xe1menes'), (u'empezo', u'empez\xf3'), (u'empujon', u'empuj\xf3n'), (u'empujalo', u'emp\xfajalo'), (u'escondanme', u'esc\xf3ndanme'), (u'esperame', u'esp\xe9rame'), (u'estara', u'estar\xe1'), (u'estare', u'estar\xe9'), (u'estaria', u'estar\xeda'), (u'estan', u'est\xe1n'), (u'estaran', u'estar\xe1n'), (u'estabamos', u'est\xe1bamos'), (u'estuvieramos', u'estuvi\xe9ramos'), (u'exito', u'\xe9xito'), (u'facil', u'f\xe1cil'), (u'fiscalia', u'fiscal\xeda'), (u'fragil', u'fr\xe1gil'), (u'fragiles', u'fr\xe1giles'), (u'frances', u'franc\xe9s'), (u'gustaria', u'gustar\xeda'), (u'habia', u'hab\xeda'), (u'habias', u'hab\xedas'), (u'habian', u'hab\xedan'), (u'habrian', u'habr\xedan'), (u'habrias', u'habr\xedas'), (u'hagalo', u'h\xe1galo'), (u'haria', u'har\xeda'), (u'increible', u'incre\xedble'), (u'incredulo', u'incr\xe9dulo'), (u'intentalo', u'int\xe9ntalo'), (u'ire', u'ir\xe9'), (u'jovenes', u'j\xf3venes'), (u'ladron', u'ladr\xf3n'), (u'linea', u'l\xednea'), (u'llamame', u'll\xe1mame'), (u'llevalo', u'll\xe9valo'), (u'mama', u'mam\xe1'), (u'maricon', u'maric\xf3n'), (u'mayoria', u'mayor\xeda'), (u'metodo', u'm\xe9todo'), (u'metodos', u'm\xe9todos'), (u'mio', u'm\xedo'), (u'mostro', u'mostr\xf3'), (u'morira', u'morir\xe1'), (u'muevete', u'mu\xe9vete'), (u'murio', u'muri\xf3'), (u'numero', u'n\xfamero'), (u'numeros', u'n\xfameros'), (u'ningun', u'ning\xfan'), (u'oido', u'o\xeddo'), (u'oidos', u'o\xeddos'), (u'oimos', u'o\xedmos'), (u'oiste', u'o\xedste'), (u'pasale', u'p\xe1sale'), (u'pasame', u'p\xe1same'), (u'paraiso', u'para\xedso'), (u'parate', u'p\xe1rate'), (u'pense', u'pens\xe9'), (u'peluqueria', u'peluquer\xeda'), (u'platano', u'pl\xe1tano'), (u'plastico', u'pl\xe1stico'), (u'plasticos', u'pl\xe1sticos'), (u'policia', u'polic\xeda'), (u'policias', u'polic\xedas'), (u'poster', u'p\xf3ster'), (u'podia', u'pod\xeda'), (u'podias', u'pod\xedas'), (u'podria', u'podr\xeda'), (u'podrian', u'podr\xedan'), (u'podrias', u'podr\xedas'), (u'podriamos', u'podr\xedamos'), (u'prometio', u'prometi\xf3'), (u'proposito', u'prop\xf3sito'), (u'pideselo', u'p\xeddeselo'), (u'ponganse', u'p\xf3nganse'), (u'prometeme', u'prom\xe9teme'), (u'publico', u'p\xfablico'), (u'publicos', u'p\xfablicos'), (u'publicamente', u'p\xfablicamente'), (u'quedate', u'qu\xe9date'), (u'queria', u'quer\xeda'), (u'querrias', u'querr\xedas'), (u'querian', u'quer\xedan'), (u'rapido', u'r\xe1pido'), (u'rapidamente', u'r\xe1pidamente'), (u'razon', u'raz\xf3n'), (u'rehusen', u'reh\xfasen'), (u'rie', u'r\xede'), (u'rias', u'r\xedas'), (u'rindete', u'r\xedndete'), (u'sacame', u's\xe1came'), (u'sentian', u'sent\xedan'), (u'sientate', u'si\xe9ntate'), (u'sera', u'ser\xe1'), (u'soplon', u'sopl\xf3n'), (u'sueltalo', u'su\xe9ltalo'), (u'tambien', u'tambi\xe9n'), (u'teoria', u'teor\xeda'), (u'tendra', u'tendr\xe1'), (u'telefono', u'tel\xe9fono'), (u'tipica', u't\xedpica'), (u'todavia', u'todav\xeda'), (u'tomalo', u't\xf3malo'), (u'tonterias', u'tonter\xedas'), (u'torci', u'torc\xed'), (u'traelos', u'tr\xe1elos'), (u'traiganlo', u'tr\xe1iganlo'), (u'traiganlos', u'tr\xe1iganlos'), (u'trio', u'tr\xedo'), (u'tuvieramos', u'tuvi\xe9ramos'), (u'union', u'uni\xf3n'), (u'ultimo', u'\xfaltimo'), (u'ultima', u'\xfaltima'), (u'ultimos', u'\xfaltimos'), (u'ultimas', u'\xfaltimas'), (u'unica', u'\xfanica'), (u'unico', u'\xfanico'), (u'vamonos', u'v\xe1monos'), (u'vayanse', u'v\xe1yanse'), (u'victima', u'v\xedctima'), (u'vivira', u'vivir\xe1'), (u'volvio', u'volvi\xf3'), (u'volvia', u'volv\xeda'), (u'volvian', u'volv\xedan'), (u'reir', u're\xedr'), (u'freir', u'fre\xedr'), (u'sonreir', u'sonre\xedr'), (u'hazmerreir', u'hazmerre\xedr'), (u'oir', u'o\xedr'), (u'oirlo', u'o\xedrlo'), (u'oirte', u'o\xedrte'), (u'oirse', u'o\xedrse'), (u'oirme', u'o\xedrme'), (u'oirle', u'o\xedrle'), (u'oirla', u'o\xedrla'), (u'oirles', u'o\xedrles'), (u'oirnos', u'o\xedrnos'), (u'oirlas', u'o\xedrlas'), (u'bi\xe9n', u'bien'), (u'cr\xedmen', u'crimen'), (u'fu\xe9', u'fue'), (u'fu\xed', u'fui'), (u'qui\xe9res', u'quieres'), (u't\xed', u'ti'), (u'd\xed', u'di'), (u'v\xe1', u'va'), (u'v\xe9', u've'), (u'v\xed', u'vi'), (u'vi\xf3', u'vio'), (u'\xf3', u'o'), (u'cl\xf3n', u'clon'), (u'di\xf3', u'dio'), (u'gui\xf3n', u'guion'), (u'd\xf3n', u'don'), (u'f\xe9', u'fe'), (u'\xe1quel', u'aquel'), (u'\xe9ste', u'este'), (u'\xe9sta', u'esta'), (u'\xe9stos', u'estos'), (u'\xe9stas', u'estas'), (u'\xe9se', u'ese'), (u'\xe9sa', u'esa'), (u'\xe9sos', u'esos'), (u'\xe9sas', u'esas'), (u's\xf3lo', u'solo'), (u'coktel', u'c\xf3ctel'), (u'cocktel', u'c\xf3ctel'), (u'conciente', u'consciente'), (u'comenz\xe9', u'comenc\xe9'), (u'desilucionarte', u'desilusionarte'), (u'dijieron', u'dijeron'), (u'empez\xe9', u'empec\xe9'), (u'hize', u'hice'), (u'ilucionarte', u'ilusionarte'), (u'inconciente', u'inconsciente'), (u'quize', u'quise'), (u'quizo', u'quiso'), (u'verguenza', u'verg\xfcenza'), (u'Nu\xf1ez', u'N\xfa\xf1ez'), (u'Ivan', u'Iv\xe1n'), (u'Japon', u'Jap\xf3n'), (u'Monica', u'M\xf3nica'), (u'Maria', u'Mar\xeda'), (u'Jose', u'Jos\xe9'), (u'Ramon', u'Ram\xf3n'), (u'Garcia', u'Garc\xeda'), (u'Gonzalez', u'Gonz\xe1lez'), (u'Jesus', u'Jes\xfas'), (u'Alvarez', u'\xc1lvarez'), (u'Damian', u'Dami\xe1n'), (u'Rene', u'Ren\xe9'), (u'Nicolas', u'Nicol\xe1s'), (u'Jonas', u'Jon\xe1s'), (u'Lopez', u'L\xf3pez'), (u'Hernandez', u'Hern\xe1ndez'), (u'Bermudez', u'Berm\xfadez'), (u'Fernandez', u'Fern\xe1ndez'), (u'Suarez', u'Su\xe1rez'), (u'Sofia', u'Sof\xeda'), (u'Seneca', u'S\xe9neca'), (u'Tokyo', u'Tokio'), (u'Canada', u'Canad\xe1'), (u'Paris', u'Par\xeds'), (u'Turquia', u'Turqu\xeda'), (u'Mexico', u'M\xe9xico'), (u'Mejico', u'M\xe9xico'), (u'Matias', u'Mat\xedas'), (u'Valentin', u'Valent\xedn'), (u'mejicano', u'mexicano'), (u'mejicanos', u'mexicanos'), (u'mejicana', u'mexicana'), (u'mejicanas', u'mexicanas'), (u'io', u'lo'), (u'ia', u'la'), (u'ie', u'le'), (u'Io', u'lo'), (u'Ia', u'la'), (u'AI', u'Al'), (u'Ie', u'le'), (u'EI', u'El'), (u'suba\ufb02uente', u'subafluente'), (u'a\ufb02\xf3jalo', u'afl\xf3jalo'), (u'A\ufb02\xf3jalo', u'Afl\xf3jalo'), (u'perdi', u'perd\xed'), (u'Podria', u'Podr\xeda'), (u'confia', u'conf\xeda'), (u'pasaria', u'pasar\xeda'), (u'Podias', u'Pod\xedas'), (u'responsabke', u'responsable'), (u'Todavia', u'Todav\xeda'), (u'envien', u'env\xeden'), (u'Queria', u'Quer\xeda'), (u'tio', u't\xedo'), (u'traido', u'tra\xeddo'), (u'Asi', u'As\xed'), (u'elegi', u'eleg\xed'), (u'habria', u'habr\xeda'), (u'encantaria', u'encantar\xeda'), (u'leido', u'le\xeddo'), (u'conocias', u'conoc\xedas'), (u'harias', u'har\xedas'), (u'Aqui', u'Aqu\xed'), (u'decidi', u'decid\xed'), (u'mia', u'm\xeda'), (u'Crei', u'Cre\xed'), (u'podiamos', u'pod\xedamos'), (u'avisame', u'av\xedsame'), (u'debia', u'deb\xeda'), (u'pensarias', u'pensar\xedas'), (u'reuniamos', u'reun\xedamos'), (u'PO\xcf', u'por'), (u'vendria', u'vendr\xeda'), (u'caida', u'ca\xedda'), (u'venian', u'ven\xedan'), (u'compa\xf1ias', u'compa\xf1\xedas'), (u'leiste', u'le\xedste'), (u'Leiste', u'Le\xedste'), (u'fiaria', u'fiar\xeda'), (u'Hungria', u'Hungr\xeda'), (u'fotografia', u'fotograf\xeda'), (u'cafeteria', u'cafeter\xeda'), (u'Digame', u'D\xedgame'), (u'debias', u'deb\xedas'), (u'tendria', u'tendr\xeda'), (u'C\xcfGO', u'creo'), (u'anteg', u'antes'), (u'S\xf3Io', u'Solo'), (u'Ilam\xe1ndola', u'llam\xe1ndola'), (u'C\xe1\ufb02at\xe9', u'C\xe1llate'), (u'Ilamaste', u'llamaste'), (u'daria', u'dar\xeda'), (u'Iargaba', u'largaba'), (u'Yati', u'Y a ti'), (u'querias', u'quer\xedas'), (u'Iimpiarlo', u'limpiarlo'), (u'Iargado', u'largado'), (u'galeria', u'galer\xeda'), (u'Bartomeu', u'Bertomeu'), (u'Iocalizarlo', u'localizarlo'), (u'Il\xe1mame', u'll\xe1mame')]), - 'pattern': u'(?um)(\\b|^)(?:KBs|Vd|N\\\xb0|n\\\xb0|nro\\.|Nro\\.|aca|actuas|actues|adios|agarrenla|agarrenlo|agarrandose|algun|alli|alla|alejate|ahi|angel|angeles|apagala|aqui|asi|bahia|busqueda|busquedas|callate|carcel|camara|caido|cabron|camion|codigo|codigos|comence|comprate|consegui|confias|convertira|corazon|crei|creia|creido|creiste|cubrenos|comio|dara|dia|dias|debio|demelo|dimelo|denoslo|deselo|decia|decian|detras|deberia|deberas|deberias|deberian|deberiamos|dejame|dejate|dejalo|dejarian|damela|despues|diciendome|dificil|dificiles|disculpate|dolares|hechar|examenes|empezo|empujon|empujalo|escondanme|esperame|estara|estare|estaria|estan|estaran|estabamos|estuvieramos|exito|facil|fiscalia|fragil|fragiles|frances|gustaria|habia|habias|habian|habrian|habrias|hagalo|haria|increible|incredulo|intentalo|ire|jovenes|ladron|linea|llamame|llevalo|mama|maricon|mayoria|metodo|metodos|mio|mostro|morira|muevete|murio|numero|numeros|ningun|oido|oidos|oimos|oiste|pasale|pasame|paraiso|parate|pense|peluqueria|platano|plastico|plasticos|policia|policias|poster|podia|podias|podria|podrian|podrias|podriamos|prometio|proposito|pideselo|ponganse|prometeme|publico|publicos|publicamente|quedate|queria|querrias|querian|rapido|rapidamente|razon|rehusen|rie|rias|rindete|sacame|sentian|sientate|sera|soplon|sueltalo|tambien|teoria|tendra|telefono|tipica|todavia|tomalo|tonterias|torci|traelos|traiganlo|traiganlos|trio|tuvieramos|union|ultimo|ultima|ultimos|ultimas|unica|unico|vamonos|vayanse|victima|vivira|volvio|volvia|volvian|reir|freir|sonreir|hazmerreir|oir|oirlo|oirte|oirse|oirme|oirle|oirla|oirles|oirnos|oirlas|bi\\\xe9n|cr\\\xedmen|fu\\\xe9|fu\\\xed|qui\\\xe9res|t\\\xed|d\\\xed|v\\\xe1|v\\\xe9|v\\\xed|vi\\\xf3|\\\xf3|cl\\\xf3n|di\\\xf3|gui\\\xf3n|d\\\xf3n|f\\\xe9|\\\xe1quel|\\\xe9ste|\\\xe9sta|\\\xe9stos|\\\xe9stas|\\\xe9se|\\\xe9sa|\\\xe9sos|\\\xe9sas|s\\\xf3lo|coktel|cocktel|conciente|comenz\\\xe9|desilucionarte|dijieron|empez\\\xe9|hize|ilucionarte|inconciente|quize|quizo|verguenza|Nu\\\xf1ez|Ivan|Japon|Monica|Maria|Jose|Ramon|Garcia|Gonzalez|Jesus|Alvarez|Damian|Rene|Nicolas|Jonas|Lopez|Hernandez|Bermudez|Fernandez|Suarez|Sofia|Seneca|Tokyo|Canada|Paris|Turquia|Mexico|Mejico|Matias|Valentin|mejicano|mejicanos|mejicana|mejicanas|io|ia|ie|Io|Ia|AI|Ie|EI|suba\\\ufb02uente|a\\\ufb02\\\xf3jalo|A\\\ufb02\\\xf3jalo|perdi|Podria|confia|pasaria|Podias|responsabke|Todavia|envien|Queria|tio|traido|Asi|elegi|habria|encantaria|leido|conocias|harias|Aqui|decidi|mia|Crei|podiamos|avisame|debia|pensarias|reuniamos|PO\\\xcf|vendria|caida|venian|compa\\\xf1ias|leiste|Leiste|fiaria|Hungria|fotografia|cafeteria|Digame|debias|tendria|C\\\xcfGO|anteg|S\\\xf3Io|Ilam\\\xe1ndola|C\\\xe1\\\ufb02at\\\xe9|Ilamaste|daria|Iargaba|Yati|querias|Iimpiarlo|Iargado|galeria|Bartomeu|Iocalizarlo|Il\\\xe1mame)(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'KBs', u'kB'), (u'Vd', u'Ud'), (u'N\xb0', u'N.\xb0'), (u'n\xb0', u'n.\xb0'), (u'nro.', u'n.\xb0'), (u'Nro.', u'N.\xb0'), (u'aca', u'ac\xe1'), (u'actuas', u'act\xfaas'), (u'actues', u'act\xfaes'), (u'adios', u'adi\xf3s'), (u'agarrenla', u'ag\xe1rrenla'), (u'agarrenlo', u'ag\xe1rrenlo'), (u'agarrandose', u'agarr\xe1ndose'), (u'algun', u'alg\xfan'), (u'alli', u'all\xed'), (u'alla', u'all\xe1'), (u'alejate', u'al\xe9jate'), (u'ahi', u'ah\xed'), (u'angel', u'\xe1ngel'), (u'angeles', u'\xe1ngeles'), (u'ansian', u'ans\xedan'), (u'apagala', u'ap\xe1gala'), (u'aqui', u'aqu\xed'), (u'asi', u'as\xed'), (u'bahia', u'bah\xeda'), (u'busqueda', u'b\xfasqueda'), (u'busquedas', u'b\xfasquedas'), (u'callate', u'c\xe1llate'), (u'carcel', u'c\xe1rcel'), (u'camara', u'c\xe1mara'), (u'caido', u'ca\xeddo'), (u'cabron', u'cabr\xf3n'), (u'camion', u'cami\xf3n'), (u'codigo', u'c\xf3digo'), (u'codigos', u'c\xf3digos'), (u'comence', u'comenc\xe9'), (u'comprate', u'c\xf3mprate'), (u'consegui', u'consegu\xed'), (u'confias', u'conf\xedas'), (u'convertira', u'convertir\xe1'), (u'corazon', u'coraz\xf3n'), (u'crei', u'cre\xed'), (u'creia', u'cre\xeda'), (u'creido', u'cre\xeddo'), (u'creiste', u'cre\xedste'), (u'cubrenos', u'c\xfabrenos'), (u'comio', u'comi\xf3'), (u'dara', u'dar\xe1'), (u'dia', u'd\xeda'), (u'dias', u'd\xedas'), (u'debio', u'debi\xf3'), (u'demelo', u'd\xe9melo'), (u'dimelo', u'd\xedmelo'), (u'denoslo', u'd\xe9noslo'), (u'deselo', u'd\xe9selo'), (u'decia', u'dec\xeda'), (u'decian', u'dec\xedan'), (u'detras', u'detr\xe1s'), (u'deberia', u'deber\xeda'), (u'deberas', u'deber\xe1s'), (u'deberias', u'deber\xedas'), (u'deberian', u'deber\xedan'), (u'deberiamos', u'deber\xedamos'), (u'dejame', u'd\xe9jame'), (u'dejate', u'd\xe9jate'), (u'dejalo', u'd\xe9jalo'), (u'dejarian', u'dejar\xedan'), (u'damela', u'd\xe1mela'), (u'despues', u'despu\xe9s'), (u'diciendome', u'dici\xe9ndome'), (u'dificil', u'dif\xedcil'), (u'dificiles', u'dif\xedciles'), (u'disculpate', u'disc\xfalpate'), (u'dolares', u'd\xf3lares'), (u'hechar', u'echar'), (u'examenes', u'ex\xe1menes'), (u'empezo', u'empez\xf3'), (u'empujon', u'empuj\xf3n'), (u'empujalo', u'emp\xfajalo'), (u'energia', u'energ\xeda'), (u'enfrian', u'enfr\xedan'), (u'escondanme', u'esc\xf3ndanme'), (u'esperame', u'esp\xe9rame'), (u'estara', u'estar\xe1'), (u'estare', u'estar\xe9'), (u'estaria', u'estar\xeda'), (u'estan', u'est\xe1n'), (u'estaran', u'estar\xe1n'), (u'estabamos', u'est\xe1bamos'), (u'estuvieramos', u'estuvi\xe9ramos'), (u'exito', u'\xe9xito'), (u'facil', u'f\xe1cil'), (u'fiscalia', u'fiscal\xeda'), (u'fragil', u'fr\xe1gil'), (u'fragiles', u'fr\xe1giles'), (u'frances', u'franc\xe9s'), (u'gustaria', u'gustar\xeda'), (u'habia', u'hab\xeda'), (u'habias', u'hab\xedas'), (u'habian', u'hab\xedan'), (u'habrian', u'habr\xedan'), (u'habrias', u'habr\xedas'), (u'hagalo', u'h\xe1galo'), (u'haria', u'har\xeda'), (u'increible', u'incre\xedble'), (u'incredulo', u'incr\xe9dulo'), (u'intentalo', u'int\xe9ntalo'), (u'ire', u'ir\xe9'), (u'jovenes', u'j\xf3venes'), (u'ladron', u'ladr\xf3n'), (u'linea', u'l\xednea'), (u'llamame', u'll\xe1mame'), (u'llevalo', u'll\xe9valo'), (u'mama', u'mam\xe1'), (u'maricon', u'maric\xf3n'), (u'mayoria', u'mayor\xeda'), (u'metodo', u'm\xe9todo'), (u'metodos', u'm\xe9todos'), (u'mio', u'm\xedo'), (u'mostro', u'mostr\xf3'), (u'morira', u'morir\xe1'), (u'muevete', u'mu\xe9vete'), (u'murio', u'muri\xf3'), (u'numero', u'n\xfamero'), (u'numeros', u'n\xfameros'), (u'ningun', u'ning\xfan'), (u'oido', u'o\xeddo'), (u'oidos', u'o\xeddos'), (u'oimos', u'o\xedmos'), (u'oiste', u'o\xedste'), (u'pasale', u'p\xe1sale'), (u'pasame', u'p\xe1same'), (u'paraiso', u'para\xedso'), (u'parate', u'p\xe1rate'), (u'pense', u'pens\xe9'), (u'peluqueria', u'peluquer\xeda'), (u'platano', u'pl\xe1tano'), (u'plastico', u'pl\xe1stico'), (u'plasticos', u'pl\xe1sticos'), (u'policia', u'polic\xeda'), (u'policias', u'polic\xedas'), (u'poster', u'p\xf3ster'), (u'podia', u'pod\xeda'), (u'podias', u'pod\xedas'), (u'podria', u'podr\xeda'), (u'podrian', u'podr\xedan'), (u'podrias', u'podr\xedas'), (u'podriamos', u'podr\xedamos'), (u'prometio', u'prometi\xf3'), (u'proposito', u'prop\xf3sito'), (u'pideselo', u'p\xeddeselo'), (u'ponganse', u'p\xf3nganse'), (u'prometeme', u'prom\xe9teme'), (u'publico', u'p\xfablico'), (u'publicos', u'p\xfablicos'), (u'publicamente', u'p\xfablicamente'), (u'quedate', u'qu\xe9date'), (u'queria', u'quer\xeda'), (u'querrias', u'querr\xedas'), (u'querian', u'quer\xedan'), (u'rapido', u'r\xe1pido'), (u'rapidamente', u'r\xe1pidamente'), (u'razon', u'raz\xf3n'), (u'rehusen', u'reh\xfasen'), (u'rie', u'r\xede'), (u'rias', u'r\xedas'), (u'rindete', u'r\xedndete'), (u'sacame', u's\xe1came'), (u'sentian', u'sent\xedan'), (u'sientate', u'si\xe9ntate'), (u'sera', u'ser\xe1'), (u'soplon', u'sopl\xf3n'), (u'sueltalo', u'su\xe9ltalo'), (u'tambien', u'tambi\xe9n'), (u'teoria', u'teor\xeda'), (u'tendra', u'tendr\xe1'), (u'telefono', u'tel\xe9fono'), (u'tipica', u't\xedpica'), (u'todavia', u'todav\xeda'), (u'tomalo', u't\xf3malo'), (u'tonterias', u'tonter\xedas'), (u'torci', u'torc\xed'), (u'traelos', u'tr\xe1elos'), (u'traiganlo', u'tr\xe1iganlo'), (u'traiganlos', u'tr\xe1iganlos'), (u'trio', u'tr\xedo'), (u'tuvieramos', u'tuvi\xe9ramos'), (u'union', u'uni\xf3n'), (u'ultimo', u'\xfaltimo'), (u'ultima', u'\xfaltima'), (u'ultimos', u'\xfaltimos'), (u'ultimas', u'\xfaltimas'), (u'unica', u'\xfanica'), (u'unico', u'\xfanico'), (u'vamonos', u'v\xe1monos'), (u'vayanse', u'v\xe1yanse'), (u'victima', u'v\xedctima'), (u'vivira', u'vivir\xe1'), (u'volvio', u'volvi\xf3'), (u'volvia', u'volv\xeda'), (u'volvian', u'volv\xedan'), (u'reir', u're\xedr'), (u'freir', u'fre\xedr'), (u'sonreir', u'sonre\xedr'), (u'hazmerreir', u'hazmerre\xedr'), (u'oir', u'o\xedr'), (u'oirlo', u'o\xedrlo'), (u'oirte', u'o\xedrte'), (u'oirse', u'o\xedrse'), (u'oirme', u'o\xedrme'), (u'oirle', u'o\xedrle'), (u'oirla', u'o\xedrla'), (u'oirles', u'o\xedrles'), (u'oirnos', u'o\xedrnos'), (u'oirlas', u'o\xedrlas'), (u'bi\xe9n', u'bien'), (u'cr\xedmen', u'crimen'), (u'fu\xe9', u'fue'), (u'fu\xed', u'fui'), (u'qui\xe9res', u'quieres'), (u't\xed', u'ti'), (u'd\xed', u'di'), (u'v\xe1', u'va'), (u'v\xe9', u've'), (u'v\xed', u'vi'), (u'vi\xf3', u'vio'), (u'\xf3', u'o'), (u'cl\xf3n', u'clon'), (u'di\xf3', u'dio'), (u'gui\xf3n', u'guion'), (u'd\xf3n', u'don'), (u'f\xe9', u'fe'), (u'\xe1quel', u'aquel'), (u'\xe9ste', u'este'), (u'\xe9sta', u'esta'), (u'\xe9stos', u'estos'), (u'\xe9stas', u'estas'), (u'\xe9se', u'ese'), (u'\xe9sa', u'esa'), (u'\xe9sos', u'esos'), (u'\xe9sas', u'esas'), (u's\xf3lo', u'solo'), (u'coktel', u'c\xf3ctel'), (u'cocktel', u'c\xf3ctel'), (u'conciente', u'consciente'), (u'comenz\xe9', u'comenc\xe9'), (u'desilucionarte', u'desilusionarte'), (u'dijieron', u'dijeron'), (u'empez\xe9', u'empec\xe9'), (u'hize', u'hice'), (u'ilucionarte', u'ilusionarte'), (u'inconciente', u'inconsciente'), (u'quize', u'quise'), (u'quizo', u'quiso'), (u'verguenza', u'verg\xfcenza'), (u'Nu\xf1ez', u'N\xfa\xf1ez'), (u'Ivan', u'Iv\xe1n'), (u'Japon', u'Jap\xf3n'), (u'Monica', u'M\xf3nica'), (u'Maria', u'Mar\xeda'), (u'Jose', u'Jos\xe9'), (u'Ramon', u'Ram\xf3n'), (u'Garcia', u'Garc\xeda'), (u'Gonzalez', u'Gonz\xe1lez'), (u'Jesus', u'Jes\xfas'), (u'Alvarez', u'\xc1lvarez'), (u'Damian', u'Dami\xe1n'), (u'Rene', u'Ren\xe9'), (u'Nicolas', u'Nicol\xe1s'), (u'Jonas', u'Jon\xe1s'), (u'Lopez', u'L\xf3pez'), (u'Hernandez', u'Hern\xe1ndez'), (u'Bermudez', u'Berm\xfadez'), (u'Fernandez', u'Fern\xe1ndez'), (u'Suarez', u'Su\xe1rez'), (u'Sofia', u'Sof\xeda'), (u'Seneca', u'S\xe9neca'), (u'Tokyo', u'Tokio'), (u'Canada', u'Canad\xe1'), (u'Paris', u'Par\xeds'), (u'Turquia', u'Turqu\xeda'), (u'Mexico', u'M\xe9xico'), (u'Mejico', u'M\xe9xico'), (u'Matias', u'Mat\xedas'), (u'Valentin', u'Valent\xedn'), (u'mejicano', u'mexicano'), (u'mejicanos', u'mexicanos'), (u'mejicana', u'mexicana'), (u'mejicanas', u'mexicanas'), (u'io', u'lo'), (u'ia', u'la'), (u'ie', u'le'), (u'Io', u'lo'), (u'Ia', u'la'), (u'AI', u'Al'), (u'Ie', u'le'), (u'EI', u'El'), (u'suba\ufb02uente', u'subafluente'), (u'a\ufb02\xf3jalo', u'afl\xf3jalo'), (u'A\ufb02\xf3jalo', u'Afl\xf3jalo'), (u'perdi', u'perd\xed'), (u'Podria', u'Podr\xeda'), (u'confia', u'conf\xeda'), (u'pasaria', u'pasar\xeda'), (u'Podias', u'Pod\xedas'), (u'responsabke', u'responsable'), (u'Todavia', u'Todav\xeda'), (u'envien', u'env\xeden'), (u'Queria', u'Quer\xeda'), (u'tio', u't\xedo'), (u'traido', u'tra\xeddo'), (u'Asi', u'As\xed'), (u'elegi', u'eleg\xed'), (u'habria', u'habr\xeda'), (u'encantaria', u'encantar\xeda'), (u'leido', u'le\xeddo'), (u'conocias', u'conoc\xedas'), (u'harias', u'har\xedas'), (u'Aqui', u'Aqu\xed'), (u'decidi', u'decid\xed'), (u'mia', u'm\xeda'), (u'Crei', u'Cre\xed'), (u'podiamos', u'pod\xedamos'), (u'avisame', u'av\xedsame'), (u'debia', u'deb\xeda'), (u'pensarias', u'pensar\xedas'), (u'reuniamos', u'reun\xedamos'), (u'PO\xcf', u'por'), (u'vendria', u'vendr\xeda'), (u'caida', u'ca\xedda'), (u'venian', u'ven\xedan'), (u'compa\xf1ias', u'compa\xf1\xedas'), (u'leiste', u'le\xedste'), (u'Leiste', u'Le\xedste'), (u'fiaria', u'fiar\xeda'), (u'Hungria', u'Hungr\xeda'), (u'fotografia', u'fotograf\xeda'), (u'cafeteria', u'cafeter\xeda'), (u'Digame', u'D\xedgame'), (u'debias', u'deb\xedas'), (u'tendria', u'tendr\xeda'), (u'C\xcfGO', u'creo'), (u'anteg', u'antes'), (u'S\xf3Io', u'Solo'), (u'Ilam\xe1ndola', u'llam\xe1ndola'), (u'C\xe1\ufb02at\xe9', u'C\xe1llate'), (u'Ilamaste', u'llamaste'), (u'daria', u'dar\xeda'), (u'Iargaba', u'largaba'), (u'Yati', u'Y a ti'), (u'querias', u'quer\xedas'), (u'Iimpiarlo', u'limpiarlo'), (u'Iargado', u'largado'), (u'galeria', u'galer\xeda'), (u'Bartomeu', u'Bertomeu'), (u'Iocalizarlo', u'localizarlo'), (u'Il\xe1mame', u'll\xe1mame')]), + 'pattern': u'(?um)(\\b|^)(?:KBs|Vd|N\\\xb0|n\\\xb0|nro\\.|Nro\\.|aca|actuas|actues|adios|agarrenla|agarrenlo|agarrandose|algun|alli|alla|alejate|ahi|angel|angeles|ansian|apagala|aqui|asi|bahia|busqueda|busquedas|callate|carcel|camara|caido|cabron|camion|codigo|codigos|comence|comprate|consegui|confias|convertira|corazon|crei|creia|creido|creiste|cubrenos|comio|dara|dia|dias|debio|demelo|dimelo|denoslo|deselo|decia|decian|detras|deberia|deberas|deberias|deberian|deberiamos|dejame|dejate|dejalo|dejarian|damela|despues|diciendome|dificil|dificiles|disculpate|dolares|hechar|examenes|empezo|empujon|empujalo|energia|enfrian|escondanme|esperame|estara|estare|estaria|estan|estaran|estabamos|estuvieramos|exito|facil|fiscalia|fragil|fragiles|frances|gustaria|habia|habias|habian|habrian|habrias|hagalo|haria|increible|incredulo|intentalo|ire|jovenes|ladron|linea|llamame|llevalo|mama|maricon|mayoria|metodo|metodos|mio|mostro|morira|muevete|murio|numero|numeros|ningun|oido|oidos|oimos|oiste|pasale|pasame|paraiso|parate|pense|peluqueria|platano|plastico|plasticos|policia|policias|poster|podia|podias|podria|podrian|podrias|podriamos|prometio|proposito|pideselo|ponganse|prometeme|publico|publicos|publicamente|quedate|queria|querrias|querian|rapido|rapidamente|razon|rehusen|rie|rias|rindete|sacame|sentian|sientate|sera|soplon|sueltalo|tambien|teoria|tendra|telefono|tipica|todavia|tomalo|tonterias|torci|traelos|traiganlo|traiganlos|trio|tuvieramos|union|ultimo|ultima|ultimos|ultimas|unica|unico|vamonos|vayanse|victima|vivira|volvio|volvia|volvian|reir|freir|sonreir|hazmerreir|oir|oirlo|oirte|oirse|oirme|oirle|oirla|oirles|oirnos|oirlas|bi\\\xe9n|cr\\\xedmen|fu\\\xe9|fu\\\xed|qui\\\xe9res|t\\\xed|d\\\xed|v\\\xe1|v\\\xe9|v\\\xed|vi\\\xf3|\\\xf3|cl\\\xf3n|di\\\xf3|gui\\\xf3n|d\\\xf3n|f\\\xe9|\\\xe1quel|\\\xe9ste|\\\xe9sta|\\\xe9stos|\\\xe9stas|\\\xe9se|\\\xe9sa|\\\xe9sos|\\\xe9sas|s\\\xf3lo|coktel|cocktel|conciente|comenz\\\xe9|desilucionarte|dijieron|empez\\\xe9|hize|ilucionarte|inconciente|quize|quizo|verguenza|Nu\\\xf1ez|Ivan|Japon|Monica|Maria|Jose|Ramon|Garcia|Gonzalez|Jesus|Alvarez|Damian|Rene|Nicolas|Jonas|Lopez|Hernandez|Bermudez|Fernandez|Suarez|Sofia|Seneca|Tokyo|Canada|Paris|Turquia|Mexico|Mejico|Matias|Valentin|mejicano|mejicanos|mejicana|mejicanas|io|ia|ie|Io|Ia|AI|Ie|EI|suba\\\ufb02uente|a\\\ufb02\\\xf3jalo|A\\\ufb02\\\xf3jalo|perdi|Podria|confia|pasaria|Podias|responsabke|Todavia|envien|Queria|tio|traido|Asi|elegi|habria|encantaria|leido|conocias|harias|Aqui|decidi|mia|Crei|podiamos|avisame|debia|pensarias|reuniamos|PO\\\xcf|vendria|caida|venian|compa\\\xf1ias|leiste|Leiste|fiaria|Hungria|fotografia|cafeteria|Digame|debias|tendria|C\\\xcfGO|anteg|S\\\xf3Io|Ilam\\\xe1ndola|C\\\xe1\\\ufb02at\\\xe9|Ilamaste|daria|Iargaba|Yati|querias|Iimpiarlo|Iargado|galeria|Bartomeu|Iocalizarlo|Il\\\xe1mame)(\\b|$)'}}, 'srp': {'BeginLines': {'data': OrderedDict(), 'pattern': None}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialLines': {'data': OrderedDict([(u'bi smo', u'bismo'), (u'dali je', u'da li je'), (u'dali si', u'da li si'), (u'Dali si', u'Da li si'), (u'Jel sam ti', u'Jesam li ti'), (u'Jel si', u'Jesi li'), (u"Jel' si", u'Jesi li'), (u"Je I'", u'Jesi li'), (u'Jel si to', u'Jesi li to'), (u"Jel' si to", u'Da li si to'), (u'jel si to', u'da li si to'), (u"jel' si to", u'jesi li to'), (u'Jel si ti', u'Da li si ti'), (u"Jel' si ti", u'Da li si ti'), (u'jel si ti', u'da li si ti'), (u"jel' si ti", u'da li si ti'), (u'jel ste ', u'jeste li '), (u'Jel ste', u'Jeste li'), (u"jel' ste ", u'jeste li '), (u"Jel' ste ", u'Jeste li '), (u'Jel su ', u'Jesu li '), (u'Jel da ', u'Zar ne'), (u'jel da ', u'zar ne'), (u"jel'da ", u'zar ne'), (u'Jeli sve ', u'Je li sve'), (u'Jeli on ', u'Je li on'), (u'Jeli ti ', u'Je li ti'), (u'jeli ti ', u'je li ti'), (u'Jeli to ', u'Je li to'), (u'Nebrini', u'Ne brini'), (u'nedaj', u'ne daj'), (u'ne \u0107u', u'ne\u0107u'), (u'Nemogu', u'Ne mogu'), (u'ne mogu', u'ne mogu'), (u'Nemora\u0161', u'Ne mora\u0161'), (u'od kako', u'otkako'), (u'Si dobro', u'Jesi li dobro'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'Cijelo vrijeme', u'Sve vrijeme')]), - 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:bi\\ smo|dali\\ je|dali\\ si|Dali\\ si|Jel\\ sam\\ ti|Jel\\ si|Jel\\'\\ si|Je\\ I\\'|Jel\\ si\\ to|Jel\\'\\ si\\ to|jel\\ si\\ to|jel\\'\\ si\\ to|Jel\\ si\\ ti|Jel\\'\\ si\\ ti|jel\\ si\\ ti|jel\\'\\ si\\ ti|jel\\ ste\\ |Jel\\ ste|jel\\'\\ ste\\ |Jel\\'\\ ste\\ |Jel\\ su\\ |Jel\\ da\\ |jel\\ da\\ |jel\\'da\\ |Jeli\\ sve\\ |Jeli\\ on\\ |Jeli\\ ti\\ |jeli\\ ti\\ |Jeli\\ to\\ |Nebrini|nedaj|ne\\ \\\u0107u|Nemogu|ne\\ mogu|Nemora\\\u0161|od\\ kako|Si\\ dobro|Svo\\ vreme|Svo\\ vrijeme|Cijelo\\ vrijeme)(?:(?=\\s)|(?=$)|(?=\\b))"}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialLines': {'data': OrderedDict([(u'bi smo', u'bismo'), (u'dali je', u'da li je'), (u'dali si', u'da li si'), (u'Dali si', u'Da li si'), (u'Jel sam ti', u'Jesam li ti'), (u'Jel si', u'Jesi li'), (u"Jel' si", u'Jesi li'), (u"Je I'", u'Jesi li'), (u'Jel si to', u'Jesi li to'), (u"Jel' si to", u'Da li si to'), (u'jel si to', u'da li si to'), (u"jel' si to", u'jesi li to'), (u'Jel si ti', u'Da li si ti'), (u"Jel' si ti", u'Da li si ti'), (u'jel si ti', u'da li si ti'), (u"jel' si ti", u'da li si ti'), (u'jel ste ', u'jeste li '), (u'Jel ste', u'Jeste li'), (u"jel' ste ", u'jeste li '), (u"Jel' ste ", u'Jeste li '), (u'Jel su ', u'Jesu li '), (u'Jel da ', u'Zar ne'), (u'jel da ', u'zar ne'), (u"jel'da ", u'zar ne'), (u'Jeli sve ', u'Je li sve'), (u'Jeli on ', u'Je li on'), (u'Jeli ti ', u'Je li ti'), (u'jeli ti ', u'je li ti'), (u'Jeli to ', u'Je li to'), (u'Nebrini', u'Ne brini'), (u'ne \u0107u', u'ne\u0107u'), (u'od kako', u'otkako'), (u'Si dobro', u'Jesi li dobro'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'Cijelo vrijeme', u'Sve vrijeme')]), + 'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:bi\\ smo|dali\\ je|dali\\ si|Dali\\ si|Jel\\ sam\\ ti|Jel\\ si|Jel\\'\\ si|Je\\ I\\'|Jel\\ si\\ to|Jel\\'\\ si\\ to|jel\\ si\\ to|jel\\'\\ si\\ to|Jel\\ si\\ ti|Jel\\'\\ si\\ ti|jel\\ si\\ ti|jel\\'\\ si\\ ti|jel\\ ste\\ |Jel\\ ste|jel\\'\\ ste\\ |Jel\\'\\ ste\\ |Jel\\ su\\ |Jel\\ da\\ |jel\\ da\\ |jel\\'da\\ |Jeli\\ sve\\ |Jeli\\ on\\ |Jeli\\ ti\\ |jeli\\ ti\\ |Jeli\\ to\\ |Nebrini|ne\\ \\\u0107u|od\\ kako|Si\\ dobro|Svo\\ vreme|Svo\\ vrijeme|Cijelo\\ vrijeme)(?:(?=\\s)|(?=$)|(?=\\b))"}, + 'PartialWordsAlways': {'data': OrderedDict(), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u010dete'), (u'djete', u'dijete'), (u'Hey', u'Hej'), (u'hey', u'hej'), (u'htjeo', u'htio'), (u'Ho\u010de\u0161', u'Ho\u0107e\u0161'), (u'ho\u010de\u0161', u'ho\u0107e\u0161'), (u'i\u010di', u'i\u0107i'), (u'jel', u"je l'"), (u'Jel', u"Je l'"), (u'nedaj', u'ne daj'), (u'Rje\u0161it', u'Rije\u0161it'), (u'smjeo', u'smio'), (u'uop\u010de', u'uop\u0107e'), (u'valda', u'valjda'), (u'\u017eelila', u'\u017eeljela')]), - 'pattern': u'(?um)(\\b|^)(?:\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u0107\\\u0161|\\\u0107mo|\\\u0107te|\\\u010demo|\\\u010dete|djete|Hey|hey|htjeo|Ho\\\u010de\\\u0161|ho\\\u010de\\\u0161|i\\\u010di|jel|Jel|nedaj|Rje\\\u0161it|smjeo|uop\\\u010de|valda|\\\u017eelila)(\\b|$)'}}, + 'WholeWords': {'data': OrderedDict([(u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u0107ete'), (u'djete', u'dijete'), (u'Hey', u'Hej'), (u'hey', u'hej'), (u'htjeo', u'htio'), (u'i\u010di', u'i\u0107i'), (u'jel', u"je l'"), (u'Jel', u"Je l'"), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'nedaj', u'ne daj'), (u'Nedaj', u'Ne daj'), (u'nedam', u'ne dam'), (u'Nedam', u'Ne dam'), (u'neda\u0161', u'ne da\u0161'), (u'Neda\u0161', u'Ne da\u0161'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nemora\u0161', u'ne mora\u0161'), (u'Nemora\u0161', u'Ne mora\u0161'), (u'predamnom', u'preda mnom'), (u'Predamnom', u'Preda mnom'), (u'Rje\u0161it', u'Rije\u0161it'), (u'samnom', u'sa mnom'), (u'Samnom', u'Sa mnom'), (u'smjeo', u'smio'), (u'uop\u010de', u'uop\u0107e'), (u'Uop\u010de', u'Uop\u0107e'), (u'umijesto', u'umjesto'), (u'Umijesto', u'Umjesto'), (u'uspije\u0161an', u'uspje\u0161an'), (u'uvjek', u'uvijek'), (u'Uvjek', u'Uvijek'), (u'valda', u'valjda'), (u'zamnom', u'za mnom'), (u'Zamnom', u'Za mnom'), (u'\u017eelila', u'\u017eeljela')]), + 'pattern': u'(?um)(\\b|^)(?:\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u0107\\\u0161|\\\u0107mo|\\\u0107te|\\\u010demo|\\\u010dete|djete|Hey|hey|htjeo|i\\\u010di|jel|Jel|Nebi|Nebih|nebi|nebih|nedaj|Nedaj|nedam|Nedam|neda\\\u0161|Neda\\\u0161|nemogu|Nemogu|nemora|Nemora|nemora\\\u0161|Nemora\\\u0161|predamnom|Predamnom|Rje\\\u0161it|samnom|Samnom|smjeo|uop\\\u010de|Uop\\\u010de|umijesto|Umijesto|uspije\\\u0161an|uvjek|Uvjek|valda|zamnom|Zamnom|\\\u017eelila)(\\b|$)'}}, 'swe': {'BeginLines': {'data': OrderedDict([(u'Ln ', u'In '), (u'U ppfattat', u'Uppfattat')]), 'pattern': u'(?um)^(?:Ln\\ |U\\ ppfattat)'}, 'EndLines': {'data': OrderedDict(), 'pattern': None}, 'PartialLines': {'data': OrderedDict(), 'pattern': None}, - 'PartialWordsAlways': {'data': OrderedDict([(u'\u0139', u'\xc5'), (u'\u013a', u'\xe5'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]), + 'PartialWordsAlways': {'data': OrderedDict([(u'\u0139', u'\xc5'), (u'\u013a', u'\xe5')]), 'pattern': None}, 'WholeLines': {'data': OrderedDict(), 'pattern': None}, - 'WholeWords': {'data': OrderedDict([(u'l\xe2rt', u'l\xe4rt'), (u'hederv\xe5rda', u'hederv\xe4rda'), (u'storm\xe2stare', u'storm\xe4stare'), (u'Avf\xe2rd', u'Avf\xe4rd'), (u't\xe2lten', u't\xe4lten'), (u'\xe2rjag', u'\xe4r jag'), (u'\xe4rjag', u'\xe4r jag'), (u'j\xe2mlikar', u'j\xe4mlikar'), (u'Riskako\ufb02', u'Riskakor'), (u'Karamellen/', u'Karamellen'), (u'Lngen\xfcng', u'Ingenting'), (u'\xe4rju', u'\xe4r ju'), (u'S\xe1', u'S\xe5'), (u'n\xe4rjag', u'n\xe4r jag'), (u'alltjag', u'allt jag'), (u'g\xf6rjag', u'g\xf6r jag'), (u'trorjag', u'tror jag'), (u'varju', u'var ju'), (u'g\xf6rju', u'g\xf6r ju'), (u'kanju', u'kan ju'), (u'blirjag', u'blir jag'), (u's\xe4gerjag', u's\xe4ger jag'), (u'beh\xe5llerjag', u'beh\xe5ller jag'), (u'pr\xf8blem', u'problem'), (u'r\xe4ddadeju', u'r\xe4ddade ju'), (u'hon\xf8m', u'honom'), (u'Ln', u'In'), (u'sv\xe5r\ufb02\xf6rtad', u'sv\xe5rfl\xf6rtad'), (u'\xf8ch', u'och'), (u'\ufb02\xf6rtar', u'fl\xf6rtar'), (u'k\xe4nnerjag', u'k\xe4nner jag'), (u'\ufb02ickan', u'flickan'), (u'sn\xf8', u'sn\xf6'), (u'gerju', u'ger ju'), (u'k\xf8ntakter', u'kontakter'), (u'\xf8lycka', u'olycka'), (u'n\xf8lla', u'nolla'), (u'sinnenajublar', u'sinnena jublar'), (u'ijobbet', u'i jobbet'), (u'F\xe5rjag', u'F\xe5r jag'), (u'Ar', u'\xc4r'), (u'liggerju', u'ligger ju'), (u'um', u'om'), (u'lbland', u'Ibland'), (u'skjuterjag', u'skjuter jag'), (u'Vadd\xe5', u'Vad d\xe5'), (u'pratarj\xe4mt', u'pratar j\xe4mt'), (u'harju', u'har ju'), (u'sitterjag', u'sitter jag'), (u'h\xe4\ufb02a', u'h\xe4rja'), (u's\ufb01\xe4l', u'stj\xe4l'), (u'F\xd6U', u'F\xf6lj'), (u'varf\xf6rjag', u'varf\xf6r jag'), (u's\ufb01\xe4rna', u'stj\xe4rna'), (u'b\xf6\ufb02ar', u'b\xf6rjar'), (u'b\xf6\ufb02an', u'b\xf6rjan'), (u'st\xe4ri', u'st\xe5r'), (u'p\xe4', u'p\xe5'), (u'harjag', u'har jag'), (u'attjag', u'att jag'), (u'Verkarjag', u'Verkar jag'), (u'K\xe4nnerjag', u'K\xe4nner jag'), (u'd\xe4rjag', u'd\xe4r jag'), (u'tu\ufb01', u'tuff'), (u'lurarjag', u'lurar jag'), (u'varj\xe4ttebra', u'var j\xe4ttebra'), (u'allvan', u'allvar'), (u'deth\xe4r', u'det h\xe4r'), (u'va\ufb02e', u'varje'), (u'F\xf6Uer', u'F\xf6ljer'), (u'personalm\xf6tetl', u'personalm\xf6tet!'), (u'harjust', u'har just'), (u'\xe4rj\xe4tteduktig', u'\xe4r j\xe4tteduktig'), (u'd\xe4rja', u'd\xe4r ja'), (u'lngen\xfcng', u'lngenting'), (u'iluften', u'i luften'), (u'\xf6sen', u'\xf6ser'), (u'tv\xe2', u'tv\xe5'), (u'Uejerna', u'Tjejerna'), (u'h\xe5n*', u'h\xe5rt'), (u'\xc4rjag', u'\xc4r jag'), (u'keL', u'Okej'), (u'F\xf6rjag', u'F\xf6r jag'), (u'varj\xe4ttekul', u'var j\xe4ttekul'), (u'k\xe4mpan', u'k\xe4mpar'), (u'mycketjobb', u'mycket jobb'), (u'Uus', u'ljus'), (u'serjag', u'ser jag'), (u'vetjag', u'vet jag'), (u'f\xe5rjag', u'f\xe5r jag'), (u'hurjag', u'hur jag'), (u'f\xf6rs\xf6kerjag', u'f\xf6rs\xf6ker jag'), (u't\xe1nagel', u't\xe5nagel'), (u'va\xfce', u'varje'), (u'Uudet', u'ljudet'), (u'amhopa', u'allihopa'), (u'V\xe4\xfc', u'V\xe4lj'), (u'g\xe4ri', u'g\xe5r'), (u'r\xf6d\xfcus', u'r\xf6dljus'), (u'Uuset', u'ljuset'), (u'Rid\xe0n', u'Rid\xe5n'), (u'vi\xfca', u'vilja'), (u'g\xe5ri', u'g\xe5r i'), (u'Hurd\xe5', u'Hur d\xe5'), (u'inter\\/juar', u'intervjuar'), (u'menarjag', u'menar jag'), (u'spyrjag', u'spyr jag'), (u'bri\xfcera', u'briljera'), (u'N\xe4rjag', u'N\xe4r jag'), (u'ner\\/\xf6s', u'nerv\xf6s'), (u'ilivets', u'i livets'), (u'n\xe4got', u'n\xe5got'), (u'p\xe0', u'p\xe5'), (u'Lnnan', u'Innan'), (u'Uf', u'Ut'), (u'lnnan', u'Innan'), (u'D\xe0ren', u'D\xe5ren'), (u'F\xe0rjag', u'F\xe5r jag'), (u'Vad\xe4rdetd\xe4L', u'Vad \xe4r det d\xe4r'), (u'sm\xe0tjuv', u'sm\xe5tjuv'), (u't\xe0gr\xe5nare', u't\xe5gr\xe5nare'), (u'dit\xe0t', u'dit\xe5t'), (u's\xe4', u's\xe5'), (u'v\xe0rdsl\xf6sa', u'v\xe5rdsl\xf6sa'), (u'n\xe0n', u'n\xe5n'), (u'kommerjag', u'kommer jag'), (u'\xe4rj\xe4ttebra', u'\xe4r j\xe4ttebra'), (u'\xe4rj\xe4vligt', u'\xe4r j\xe4vligt'), (u'\xe0kerjag', u'\xe5ker jag'), (u'ellerjapaner', u'eller japaner'), (u'attjaga', u'att jaga'), (u'eften', u'efter'), (u'h\xe4stan', u'h\xe4star'), (u'Lntensivare', u'Intensivare'), (u'fr\xe0garjag', u'fr\xe5gar jag'), (u'pen/ers', u'pervers'), (u'r\xe0barkade', u'r\xe5barkade'), (u'styrkon', u'styrkor'), (u'Dif\xe5f', u'Dit\xe5t'), (u'h\xe4nden', u'h\xe4nder'), (u'f\xf6\ufb01a', u'f\xf6lja'), (u'Idioten/', u'Idioter!'), (u'Varf\xf6rjagade', u'Varf\xf6r jagade'), (u'd\xe4rf\xf6rjag', u'd\xe4rf\xf6r jag'), (u'forjag', u'for jag'), (u'Iivsgladje', u'livsgl\xe4dje'), (u'narjag', u'n\xe4r jag'), (u'sajag', u'sa jag'), (u'genastja', u'genast ja'), (u'rockument\xe0ren', u'rockument\xe4ren'), (u'turne', u'turn\xe9'), (u'fickjag', u'fick jag'), (u'sager', u's\xe4ger'), (u'Ijush\xe5rig', u'ljush\xe5rig'), (u'tradg\xe5rdsolycka', u'tr\xe4dg\xe5rdsolycka'), (u'kvavdes', u'kv\xe4vdes'), (u'd\xe0rja', u'd\xe4r ja'), (u'hedersgaster', u'hedersg\xe4ster'), (u'Nar', u'N\xe4r'), (u'smaki\xf6sa', u'smakl\xf6sa'), (u'lan', u'Ian'), (u'Lan', u'Ian'), (u'eri', u'er i'), (u'universitetsamne', u'universitets\xe4mne'), (u'garna', u'g\xe4rna'), (u'ar', u'\xe4r'), (u'baltdjur', u'b\xe4ltdjur'), (u'varjag', u'var jag'), (u'\xe0r', u'\xe4r'), (u'f\xf6rf\xf6rst\xe0rkare', u'f\xf6rf\xf6rst\xe4rkare'), (u'arjattespeciell', u'\xe4r j\xe4ttespeciell'), (u'h\xe0rg\xe5r', u'h\xe4r g\xe5r'), (u'Ia', u'la'), (u'Iimousinen', u'limousinen'), (u'krickettra', u'krickettr\xe4'), (u'h\xe5rdrockv\xe0rlden', u'h\xe5rdrockv\xe4rlden'), (u'tr\xe0bit', u'tr\xe4bit'), (u'Mellanvastern', u'Mellanv\xe4stern'), (u'arju', u'\xe4r ju'), (u'turnen', u'turn\xe9n'), (u'kanns', u'k\xe4nns'), (u'battre', u'b\xe4ttre'), (u'v\xe0rldsturne', u'v\xe4rldsturne'), (u'dar', u'd\xe4r'), (u'sj\xe0lvant\xe0nder', u'sj\xe4lvant\xe4nder'), (u'jattelange', u'j\xe4ttel\xe4nge'), (u'berattade', u'ber\xe4ttade'), (u'S\xe4', u'S\xe5'), (u'vandpunkten', u'v\xe4ndpunkten'), (u'N\xe0rjag', u'N\xe4r jag'), (u'lasa', u'l\xe4sa'), (u'skitl\xe0skigt', u'skitl\xe4skigt'), (u'sambandsv\xe0g', u'sambandsv\xe4g'), (u'valdigt', u'v\xe4ldigt'), (u'Stamga\ufb01el', u'St\xe4mgaffel'), (u'\xe0rjag', u'\xe4r jag'), (u'tajming', u'tajmning'), (u'utg\xe4ng', u'utg\xe5ng'), (u'H\xe0r\xe5t', u'H\xe4r\xe5t'), (u'h\xe0r\xe5t', u'h\xe4r\xe5t'), (u'anvander', u'anv\xe4nder'), (u'harjobbat', u'har jobbat'), (u'imageide', u'imageid\xe9'), (u'kla\ufb01en', u'klaffen'), (u'sjalv', u'sj\xe4lv'), (u'dvarg', u'dv\xe4rg'), (u'detjag', u'det jag'), (u'dvargarna', u'dv\xe4rgarna'), (u'fantasiv\xe0rld', u'fantasiv\xe4rld'), (u'\ufb01olliga', u'Fjolliga'), (u'mandoiinstr\xe0ngar', u'mandollnstr\xe4ngar'), (u'mittjobb', u'mitt jobb'), (u'Skajag', u'Ska jag'), (u'landari', u'landar i'), (u'gang', u'g\xe4ng'), (u'Detjag', u'Det jag'), (u'Narmre', u'N\xe4rmre'), (u'I\xe5tjavelni', u'l\xe5tj\xe4veln'), (u'H\xe5llerjag', u'H\xe5ller jag'), (u'visionarer', u'vision\xe4rer'), (u'T\xfclvad', u'Till vad'), (u'milit\xe0rbas', u'milit\xe4rbas'), (u'jattegiada', u'j\xe4tteglada'), (u'Fastjag', u'Fast jag'), (u's\xe5jag', u's\xe5 jag'), (u'rockvarlden', u'rockv\xe4rlden'), (u'saknarjag', u'saknar jag'), (u'allafall', u'alla fall'), (u'\ufb01anta', u'fjanta'), (u'Kr\xe0ma', u'Kr\xe4ma'), (u'stammer', u'st\xe4mmer'), (u'budb\xe0rare', u'budb\xe4rare'), (u'Iivsfiiosofi', u'livsfiiosofi'), (u'f\xf6rj\xe4mnan', u'f\xf6r j\xe4mnan'), (u'gillarjag', u'gillar jag'), (u'Iarvat', u'larvat'), (u'klararjag', u'klarar jag'), (u"hatta\ufb01'\xe0r", u'hattaff\xe4r'), (u'D\xe0', u'D\xe5'), (u'upp\ufb01nna', u'uppfinna'), (u'R\xe0ttf\xe5glar', u'R\xe5ttf\xe5glar'), (u'Sv\xe4\xfcboda', u'Sv\xe4ljboda'), (u'P\xe5b\xf6\ufb02ar', u'P\xe5b\xf6rjar'), (u'slutarju', u'slutar ju'), (u'ni\ufb01skebu\xfcken', u'i fiskebutiken'), (u'h\xe4rj\xe4keln', u'h\xe4r j\xe4keln'), (u'H\xdfppa', u'Hoppa'), (u'f\xf6rst\xf6rds', u'f\xf6rst\xf6rdes'), (u'varj\xe4ttegoda', u'var j\xe4ttegoda'), (u'Kor\\/', u'Korv'), (u'br\xfcl\xe9el', u'br\xfcl\xe9e!'), (u'Hei', u'Hej'), (u'\xe4lskarjordgubbsglass', u'\xe4lskar jordgubbsglass'), (u'Sn\xf6bom', u'Sn\xf6boll'), (u'Sn\xf6boH', u'Sn\xf6boll'), (u'Sn\xf6bol', u'Sn\xf6boll'), (u'sn\xf6boH', u'sn\xf6boll'), (u'L\xe4ggerp\xe5', u'L\xe4gger p\xe5'), (u'lnge\ufb02', u'lnget!'), (u'S\xe4gerj\xe4ttesmarta', u'S\xe4ger j\xe4ttesmarta'), (u'dopplen/\xe4derradar', u'dopplerv\xe4derradar'), (u's\xe4kertj\xe4ttefin', u's\xe4kert j\xe4ttefin'), (u'\xe4rj\xe4ttefin', u'\xe4r j\xe4ttefin'), (u'verkarju', u'verkar ju'), (u'blirju', u'blir ju'), (u'kor\\/', u'korv'), (u'naturkatastro\ufb01', u'naturkatastrof!'), (u'stickerjag', u'stickerj ag'), (u'j\xe4ttebu\ufb01\xe9', u'j\xe4ttebuff\xe9'), (u'be\ufb01nner', u'befinner'), (u'Sp\ufb02ng', u'Spring'), (u'trec\ufb01e', u'tredje'), (u'ryckerjag', u'rycker jag'), (u'skullejag', u'skulle jag'), (u'vetju', u'vet ju'), (u'a\ufb02jag', u'att jag'), (u'\ufb02nns', u'finns'), (u'\xe4rl\xe5ng', u'\xe4r l\xe5ng'), (u'k\xe5ra', u'k\xe4ra'), (u'\xe4r\ufb01na', u'\xe4r \ufb01na'), (u'\xe4ri', u'\xe4r i'), (u'h\xf6rden', u'h\xf6r den'), (u'\xe4ttj\xe4g', u'att j\xe4g'), (u'g\xe4r', u'g\xe5r'), (u'f\xf6ri', u'f\xf6r i'), (u'Hurvisste', u'Hur visste'), (u'\ufb01ck', u'fick'), (u'\ufb01nns', u'finns'), (u'\ufb01n', u'fin'), (u'Fa', u'Bra.'), (u'bori', u'bor i'), (u'fiendeplanl', u'fiendeplan!'), (u'if\xf6rnamn', u'i f\xf6rnamn'), (u'detju', u'det ju'), (u'N\xfcd', u'Niki'), (u'hatarjag', u'hatar jag'), (u'Klararjag', u'Klarar jag'), (u'deta\ufb01er', u'detaljer'), (u'v\xe4/', u'v\xe4l'), (u'smakarju', u'smakar ju'), (u'Teache\ufb02', u'Teacher!'), (u'imorse', u'i morse'), (u'drickerjag', u'dricker jag'), (u'st\xe5ri', u'st\xe5r i'), (u'Harjag', u'Har jag'), (u'Talarjag', u'Talar jag'), (u'undrarjag', u'undrar jag'), (u'\xe5lderjag', u'\xe5lder jag'), (u'va\ufb01e', u'varje'), (u'f\xf6rfalskningl', u'f\xf6rfalskning!'), (u'Vi\ufb01iiiam', u'William'), (u'V\\\ufb01lliams', u'Williams'), (u'attjobba', u'att jobba'), (u'intei', u'inte i'), (u'n\xe4rV\\\ufb01lliam', u'n\xe4r William'), (u'V\\\ufb01lliam', u'William'), (u'E\ufb01ersom', u'Eftersom'), (u'Vl\ufb01lliam', u'William'), (u'I\xe4ngejag', u'l\xe4nge jag'), (u"'\ufb01digare", u'Tidigare'), (u'b\xf6rjadei', u'b\xf6rjade i'), (u'merjust', u'mer just'), (u'e\ufb01er\xe5t', u'efter\xe5t'), (u'gjordejag', u'gjorde jag'), (u'hadeju', u'hade ju'), (u'g\xe5rvi', u'g\xe5r vi'), (u'k\xf6perjag', u'k\xf6per jag'), (u'M\xe5stejag', u'M\xe5ste jag'), (u'k\xe4nnerju', u'k\xe4nner ju'), (u'\ufb02n', u'fin'), (u'treviig', u'trevlig'), (u'Grattisl', u'Grattis!'), (u'kande', u'k\xe4nde'), (u"'llden", u'Tiden'), (u'sakjag', u'sak jag'), (u'klartjag', u'klart jag'), (u'h\xe4\ufb01igt', u'h\xe4ftigt'), (u'I\xe4mnarjag', u'l\xe4mnar jag'), (u'gickju', u'gick ju'), (u'skajag', u'ska jag'), (u'G\xf6rjag', u'G\xf6r jag'), (u'm\xe5stejag', u'm\xe5ste jag'), (u'gra\\/iditet', u'graviditet'), (u'hittadqdin', u'hittade din'), (u'\xe4rjobbigt', u'\xe4r jobbigt'), (u'Overdrivet', u'\xd6verdrivet'), (u'hOgtidlig', u'h\xf6gtidlig'), (u'Overtyga', u'\xd6vertyga'), (u'SKILSMASSA', u'SKILSM\xc4SSA'), (u'brukarju', u'brukar ju'), (u'lsabel', u'Isabel'), (u'kundejag', u'kunde jag'), (u'\xe4rl\xe4get', u'\xe4r l\xe4get'), (u'blirinte', u'blir inte'), (u"l'm", u"I'm"), (u"lt's", u"It's"), (u'ijakt', u'i jakt'), (u'avjordens', u'av jordens')]), - 'pattern': u"(?um)(\\b|^)(?:l\\\xe2rt|hederv\\\xe5rda|storm\\\xe2stare|Avf\\\xe2rd|t\\\xe2lten|\\\xe2rjag|\\\xe4rjag|j\\\xe2mlikar|Riskako\\\ufb02|Karamellen\\/|Lngen\\\xfcng|\\\xe4rju|S\\\xe1|n\\\xe4rjag|alltjag|g\\\xf6rjag|trorjag|varju|g\\\xf6rju|kanju|blirjag|s\\\xe4gerjag|beh\\\xe5llerjag|pr\\\xf8blem|r\\\xe4ddadeju|hon\\\xf8m|Ln|sv\\\xe5r\\\ufb02\\\xf6rtad|\\\xf8ch|\\\ufb02\\\xf6rtar|k\\\xe4nnerjag|\\\ufb02ickan|sn\\\xf8|gerju|k\\\xf8ntakter|\\\xf8lycka|n\\\xf8lla|sinnenajublar|ijobbet|F\\\xe5rjag|Ar|liggerju|um|lbland|skjuterjag|Vadd\\\xe5|pratarj\\\xe4mt|harju|sitterjag|h\\\xe4\\\ufb02a|s\\\ufb01\\\xe4l|F\\\xd6U|varf\\\xf6rjag|s\\\ufb01\\\xe4rna|b\\\xf6\\\ufb02ar|b\\\xf6\\\ufb02an|st\\\xe4ri|p\\\xe4|harjag|attjag|Verkarjag|K\\\xe4nnerjag|d\\\xe4rjag|tu\\\ufb01|lurarjag|varj\\\xe4ttebra|allvan|deth\\\xe4r|va\\\ufb02e|F\\\xf6Uer|personalm\\\xf6tetl|harjust|\\\xe4rj\\\xe4tteduktig|d\\\xe4rja|lngen\\\xfcng|iluften|\\\xf6sen|tv\\\xe2|Uejerna|h\\\xe5n\\*|\\\xc4rjag|keL|F\\\xf6rjag|varj\\\xe4ttekul|k\\\xe4mpan|mycketjobb|Uus|serjag|vetjag|f\\\xe5rjag|hurjag|f\\\xf6rs\\\xf6kerjag|t\\\xe1nagel|va\\\xfce|Uudet|amhopa|V\\\xe4\\\xfc|g\\\xe4ri|r\\\xf6d\\\xfcus|Uuset|Rid\\\xe0n|vi\\\xfca|g\\\xe5ri|Hurd\\\xe5|inter\\\\\\/juar|menarjag|spyrjag|bri\\\xfcera|N\\\xe4rjag|ner\\\\\\/\\\xf6s|ilivets|n\\\xe4got|p\\\xe0|Lnnan|Uf|lnnan|D\\\xe0ren|F\\\xe0rjag|Vad\\\xe4rdetd\\\xe4L|sm\\\xe0tjuv|t\\\xe0gr\\\xe5nare|dit\\\xe0t|s\\\xe4|v\\\xe0rdsl\\\xf6sa|n\\\xe0n|kommerjag|\\\xe4rj\\\xe4ttebra|\\\xe4rj\\\xe4vligt|\\\xe0kerjag|ellerjapaner|attjaga|eften|h\\\xe4stan|Lntensivare|fr\\\xe0garjag|pen\\/ers|r\\\xe0barkade|styrkon|Dif\\\xe5f|h\\\xe4nden|f\\\xf6\\\ufb01a|Idioten\\/|Varf\\\xf6rjagade|d\\\xe4rf\\\xf6rjag|forjag|Iivsgladje|narjag|sajag|genastja|rockument\\\xe0ren|turne|fickjag|sager|Ijush\\\xe5rig|tradg\\\xe5rdsolycka|kvavdes|d\\\xe0rja|hedersgaster|Nar|smaki\\\xf6sa|lan|Lan|eri|universitetsamne|garna|ar|baltdjur|varjag|\\\xe0r|f\\\xf6rf\\\xf6rst\\\xe0rkare|arjattespeciell|h\\\xe0rg\\\xe5r|Ia|Iimousinen|krickettra|h\\\xe5rdrockv\\\xe0rlden|tr\\\xe0bit|Mellanvastern|arju|turnen|kanns|battre|v\\\xe0rldsturne|dar|sj\\\xe0lvant\\\xe0nder|jattelange|berattade|S\\\xe4|vandpunkten|N\\\xe0rjag|lasa|skitl\\\xe0skigt|sambandsv\\\xe0g|valdigt|Stamga\\\ufb01el|\\\xe0rjag|tajming|utg\\\xe4ng|H\\\xe0r\\\xe5t|h\\\xe0r\\\xe5t|anvander|harjobbat|imageide|kla\\\ufb01en|sjalv|dvarg|detjag|dvargarna|fantasiv\\\xe0rld|\\\ufb01olliga|mandoiinstr\\\xe0ngar|mittjobb|Skajag|landari|gang|Detjag|Narmre|I\\\xe5tjavelni|H\\\xe5llerjag|visionarer|T\\\xfclvad|milit\\\xe0rbas|jattegiada|Fastjag|s\\\xe5jag|rockvarlden|saknarjag|allafall|\\\ufb01anta|Kr\\\xe0ma|stammer|budb\\\xe0rare|Iivsfiiosofi|f\\\xf6rj\\\xe4mnan|gillarjag|Iarvat|klararjag|hatta\\\ufb01\\'\\\xe0r|D\\\xe0|upp\\\ufb01nna|R\\\xe0ttf\\\xe5glar|Sv\\\xe4\\\xfcboda|P\\\xe5b\\\xf6\\\ufb02ar|slutarju|ni\\\ufb01skebu\\\xfcken|h\\\xe4rj\\\xe4keln|H\\\xdfppa|f\\\xf6rst\\\xf6rds|varj\\\xe4ttegoda|Kor\\\\\\/|br\\\xfcl\\\xe9el|Hei|\\\xe4lskarjordgubbsglass|Sn\\\xf6bom|Sn\\\xf6boH|Sn\\\xf6bol|sn\\\xf6boH|L\\\xe4ggerp\\\xe5|lnge\\\ufb02|S\\\xe4gerj\\\xe4ttesmarta|dopplen\\/\\\xe4derradar|s\\\xe4kertj\\\xe4ttefin|\\\xe4rj\\\xe4ttefin|verkarju|blirju|kor\\\\\\/|naturkatastro\\\ufb01|stickerjag|j\\\xe4ttebu\\\ufb01\\\xe9|be\\\ufb01nner|Sp\\\ufb02ng|trec\\\ufb01e|ryckerjag|skullejag|vetju|a\\\ufb02jag|\\\ufb02nns|\\\xe4rl\\\xe5ng|k\\\xe5ra|\\\xe4r\\\ufb01na|\\\xe4ri|h\\\xf6rden|\\\xe4ttj\\\xe4g|g\\\xe4r|f\\\xf6ri|Hurvisste|\\\ufb01ck|\\\ufb01nns|\\\ufb01n|Fa|bori|fiendeplanl|if\\\xf6rnamn|detju|N\\\xfcd|hatarjag|Klararjag|deta\\\ufb01er|v\\\xe4\\/|smakarju|Teache\\\ufb02|imorse|drickerjag|st\\\xe5ri|Harjag|Talarjag|undrarjag|\\\xe5lderjag|va\\\ufb01e|f\\\xf6rfalskningl|Vi\\\ufb01iiiam|V\\\\\\\ufb01lliams|attjobba|intei|n\\\xe4rV\\\\\\\ufb01lliam|V\\\\\\\ufb01lliam|E\\\ufb01ersom|Vl\\\ufb01lliam|I\\\xe4ngejag|\\'\\\ufb01digare|b\\\xf6rjadei|merjust|e\\\ufb01er\\\xe5t|gjordejag|hadeju|g\\\xe5rvi|k\\\xf6perjag|M\\\xe5stejag|k\\\xe4nnerju|\\\ufb02n|treviig|Grattisl|kande|\\'llden|sakjag|klartjag|h\\\xe4\\\ufb01igt|I\\\xe4mnarjag|gickju|skajag|G\\\xf6rjag|m\\\xe5stejag|gra\\\\\\/iditet|hittadqdin|\\\xe4rjobbigt|Overdrivet|hOgtidlig|Overtyga|SKILSMASSA|brukarju|lsabel|kundejag|\\\xe4rl\\\xe4get|blirinte|l\\'m|lt\\'s|ijakt|avjordens)(\\b|$)"}}} + 'WholeWords': {'data': OrderedDict([(u'l\xe2rt', u'l\xe4rt'), (u'hederv\xe5rda', u'hederv\xe4rda'), (u'storm\xe2stare', u'storm\xe4stare'), (u'Avf\xe2rd', u'Avf\xe4rd'), (u't\xe2lten', u't\xe4lten'), (u'\xe2rjag', u'\xe4r jag'), (u'\xe4rjag', u'\xe4r jag'), (u'j\xe2mlikar', u'j\xe4mlikar'), (u'Riskako\ufb02', u'Riskakor'), (u'Karamellen/', u'Karamellen'), (u'Lngen\xfcng', u'Ingenting'), (u'\xe4rju', u'\xe4r ju'), (u'S\xe1', u'S\xe5'), (u'n\xe4rjag', u'n\xe4r jag'), (u'alltjag', u'allt jag'), (u'g\xf6rjag', u'g\xf6r jag'), (u'trorjag', u'tror jag'), (u'varju', u'var ju'), (u'g\xf6rju', u'g\xf6r ju'), (u'kanju', u'kan ju'), (u'blirjag', u'blir jag'), (u's\xe4gerjag', u's\xe4ger jag'), (u'beh\xe5llerjag', u'beh\xe5ller jag'), (u'pr\xf8blem', u'problem'), (u'r\xe4ddadeju', u'r\xe4ddade ju'), (u'hon\xf8m', u'honom'), (u'Ln', u'In'), (u'sv\xe5r\ufb02\xf6rtad', u'sv\xe5rfl\xf6rtad'), (u'\xf8ch', u'och'), (u'\ufb02\xf6rtar', u'fl\xf6rtar'), (u'k\xe4nnerjag', u'k\xe4nner jag'), (u'\ufb02ickan', u'flickan'), (u'sn\xf8', u'sn\xf6'), (u'gerju', u'ger ju'), (u'k\xf8ntakter', u'kontakter'), (u'\xf8lycka', u'olycka'), (u'n\xf8lla', u'nolla'), (u'sinnenajublar', u'sinnena jublar'), (u'ijobbet', u'i jobbet'), (u'F\xe5rjag', u'F\xe5r jag'), (u'Ar', u'\xc4r'), (u'liggerju', u'ligger ju'), (u'um', u'om'), (u'lbland', u'Ibland'), (u'skjuterjag', u'skjuter jag'), (u'Vadd\xe5', u'Vad d\xe5'), (u'pratarj\xe4mt', u'pratar j\xe4mt'), (u'harju', u'har ju'), (u'sitterjag', u'sitter jag'), (u'h\xe4\ufb02a', u'h\xe4rja'), (u's\ufb01\xe4l', u'stj\xe4l'), (u'F\xd6U', u'F\xf6lj'), (u'varf\xf6rjag', u'varf\xf6r jag'), (u's\ufb01\xe4rna', u'stj\xe4rna'), (u'b\xf6\ufb02ar', u'b\xf6rjar'), (u'b\xf6\ufb02an', u'b\xf6rjan'), (u'st\xe4ri', u'st\xe5r'), (u'p\xe4', u'p\xe5'), (u'harjag', u'har jag'), (u'attjag', u'att jag'), (u'Verkarjag', u'Verkar jag'), (u'K\xe4nnerjag', u'K\xe4nner jag'), (u'd\xe4rjag', u'd\xe4r jag'), (u'tu\ufb01', u'tuff'), (u'lurarjag', u'lurar jag'), (u'varj\xe4ttebra', u'var j\xe4ttebra'), (u'allvan', u'allvar'), (u'deth\xe4r', u'det h\xe4r'), (u'va\ufb02e', u'varje'), (u'F\xf6Uer', u'F\xf6ljer'), (u'personalm\xf6tetl', u'personalm\xf6tet!'), (u'harjust', u'har just'), (u'\xe4rj\xe4tteduktig', u'\xe4r j\xe4tteduktig'), (u'd\xe4rja', u'd\xe4r ja'), (u'lngen\xfcng', u'lngenting'), (u'iluften', u'i luften'), (u'\xf6sen', u'\xf6ser'), (u'tv\xe2', u'tv\xe5'), (u'Uejerna', u'Tjejerna'), (u'h\xe5n*', u'h\xe5rt'), (u'\xc4rjag', u'\xc4r jag'), (u'keL', u'Okej'), (u'F\xf6rjag', u'F\xf6r jag'), (u'varj\xe4ttekul', u'var j\xe4ttekul'), (u'k\xe4mpan', u'k\xe4mpar'), (u'mycketjobb', u'mycket jobb'), (u'Uus', u'ljus'), (u'serjag', u'ser jag'), (u'vetjag', u'vet jag'), (u'f\xe5rjag', u'f\xe5r jag'), (u'hurjag', u'hur jag'), (u'f\xf6rs\xf6kerjag', u'f\xf6rs\xf6ker jag'), (u't\xe1nagel', u't\xe5nagel'), (u'va\xfce', u'varje'), (u'Uudet', u'ljudet'), (u'amhopa', u'allihopa'), (u'V\xe4\xfc', u'V\xe4lj'), (u'g\xe4ri', u'g\xe5r'), (u'r\xf6d\xfcus', u'r\xf6dljus'), (u'Uuset', u'ljuset'), (u'Rid\xe0n', u'Rid\xe5n'), (u'vi\xfca', u'vilja'), (u'g\xe5ri', u'g\xe5r i'), (u'Hurd\xe5', u'Hur d\xe5'), (u'inter\\/juar', u'intervjuar'), (u'menarjag', u'menar jag'), (u'spyrjag', u'spyr jag'), (u'bri\xfcera', u'briljera'), (u'N\xe4rjag', u'N\xe4r jag'), (u'ner\\/\xf6s', u'nerv\xf6s'), (u'ilivets', u'i livets'), (u'n\xe4got', u'n\xe5got'), (u'p\xe0', u'p\xe5'), (u'Lnnan', u'Innan'), (u'Uf', u'Ut'), (u'lnnan', u'Innan'), (u'D\xe0ren', u'D\xe5ren'), (u'F\xe0rjag', u'F\xe5r jag'), (u'Vad\xe4rdetd\xe4L', u'Vad \xe4r det d\xe4r'), (u'sm\xe0tjuv', u'sm\xe5tjuv'), (u't\xe0gr\xe5nare', u't\xe5gr\xe5nare'), (u'dit\xe0t', u'dit\xe5t'), (u's\xe4', u's\xe5'), (u'v\xe0rdsl\xf6sa', u'v\xe5rdsl\xf6sa'), (u'n\xe0n', u'n\xe5n'), (u'kommerjag', u'kommer jag'), (u'\xe4rj\xe4ttebra', u'\xe4r j\xe4ttebra'), (u'\xe4rj\xe4vligt', u'\xe4r j\xe4vligt'), (u'\xe0kerjag', u'\xe5ker jag'), (u'ellerjapaner', u'eller japaner'), (u'attjaga', u'att jaga'), (u'eften', u'efter'), (u'h\xe4stan', u'h\xe4star'), (u'Lntensivare', u'Intensivare'), (u'fr\xe0garjag', u'fr\xe5gar jag'), (u'pen/ers', u'pervers'), (u'r\xe0barkade', u'r\xe5barkade'), (u'styrkon', u'styrkor'), (u'Dif\xe5f', u'Dit\xe5t'), (u'h\xe4nden', u'h\xe4nder'), (u'f\xf6\ufb01a', u'f\xf6lja'), (u'Idioten/', u'Idioter!'), (u'Varf\xf6rjagade', u'Varf\xf6r jagade'), (u'd\xe4rf\xf6rjag', u'd\xe4rf\xf6r jag'), (u'forjag', u'for jag'), (u'Iivsgladje', u'livsgl\xe4dje'), (u'narjag', u'n\xe4r jag'), (u'sajag', u'sa jag'), (u'genastja', u'genast ja'), (u'rockument\xe0ren', u'rockument\xe4ren'), (u'turne', u'turn\xe9'), (u'fickjag', u'fick jag'), (u'sager', u's\xe4ger'), (u'Ijush\xe5rig', u'ljush\xe5rig'), (u'tradg\xe5rdsolycka', u'tr\xe4dg\xe5rdsolycka'), (u'kvavdes', u'kv\xe4vdes'), (u'd\xe0rja', u'd\xe4r ja'), (u'hedersgaster', u'hedersg\xe4ster'), (u'Nar', u'N\xe4r'), (u'smaki\xf6sa', u'smakl\xf6sa'), (u'lan', u'Ian'), (u'Lan', u'Ian'), (u'eri', u'er i'), (u'universitetsamne', u'universitets\xe4mne'), (u'garna', u'g\xe4rna'), (u'ar', u'\xe4r'), (u'baltdjur', u'b\xe4ltdjur'), (u'varjag', u'var jag'), (u'\xe0r', u'\xe4r'), (u'f\xf6rf\xf6rst\xe0rkare', u'f\xf6rf\xf6rst\xe4rkare'), (u'arjattespeciell', u'\xe4r j\xe4ttespeciell'), (u'h\xe0rg\xe5r', u'h\xe4r g\xe5r'), (u'Ia', u'la'), (u'Iimousinen', u'limousinen'), (u'krickettra', u'krickettr\xe4'), (u'h\xe5rdrockv\xe0rlden', u'h\xe5rdrockv\xe4rlden'), (u'tr\xe0bit', u'tr\xe4bit'), (u'Mellanvastern', u'Mellanv\xe4stern'), (u'arju', u'\xe4r ju'), (u'turnen', u'turn\xe9n'), (u'kanns', u'k\xe4nns'), (u'battre', u'b\xe4ttre'), (u'v\xe0rldsturne', u'v\xe4rldsturne'), (u'dar', u'd\xe4r'), (u'sj\xe0lvant\xe0nder', u'sj\xe4lvant\xe4nder'), (u'jattelange', u'j\xe4ttel\xe4nge'), (u'berattade', u'ber\xe4ttade'), (u'S\xe4', u'S\xe5'), (u'vandpunkten', u'v\xe4ndpunkten'), (u'N\xe0rjag', u'N\xe4r jag'), (u'lasa', u'l\xe4sa'), (u'skitl\xe0skigt', u'skitl\xe4skigt'), (u'sambandsv\xe0g', u'sambandsv\xe4g'), (u'valdigt', u'v\xe4ldigt'), (u'Stamga\ufb01el', u'St\xe4mgaffel'), (u'\xe0rjag', u'\xe4r jag'), (u'tajming', u'tajmning'), (u'utg\xe4ng', u'utg\xe5ng'), (u'H\xe0r\xe5t', u'H\xe4r\xe5t'), (u'h\xe0r\xe5t', u'h\xe4r\xe5t'), (u'anvander', u'anv\xe4nder'), (u'harjobbat', u'har jobbat'), (u'imageide', u'imageid\xe9'), (u'kla\ufb01en', u'klaffen'), (u'sjalv', u'sj\xe4lv'), (u'dvarg', u'dv\xe4rg'), (u'detjag', u'det jag'), (u'dvargarna', u'dv\xe4rgarna'), (u'fantasiv\xe0rld', u'fantasiv\xe4rld'), (u'\ufb01olliga', u'Fjolliga'), (u'mandoiinstr\xe0ngar', u'mandollnstr\xe4ngar'), (u'mittjobb', u'mitt jobb'), (u'Skajag', u'Ska jag'), (u'landari', u'landar i'), (u'gang', u'g\xe4ng'), (u'Detjag', u'Det jag'), (u'Narmre', u'N\xe4rmre'), (u'I\xe5tjavelni', u'l\xe5tj\xe4veln'), (u'H\xe5llerjag', u'H\xe5ller jag'), (u'visionarer', u'vision\xe4rer'), (u'T\xfclvad', u'Till vad'), (u'milit\xe0rbas', u'milit\xe4rbas'), (u'jattegiada', u'j\xe4tteglada'), (u'Fastjag', u'Fast jag'), (u's\xe5jag', u's\xe5 jag'), (u'rockvarlden', u'rockv\xe4rlden'), (u'saknarjag', u'saknar jag'), (u'allafall', u'alla fall'), (u'\ufb01anta', u'fjanta'), (u'Kr\xe0ma', u'Kr\xe4ma'), (u'stammer', u'st\xe4mmer'), (u'budb\xe0rare', u'budb\xe4rare'), (u'Iivsfiiosofi', u'livsfiiosofi'), (u'f\xf6rj\xe4mnan', u'f\xf6r j\xe4mnan'), (u'gillarjag', u'gillar jag'), (u'Iarvat', u'larvat'), (u'klararjag', u'klarar jag'), (u"hatta\ufb01'\xe0r", u'hattaff\xe4r'), (u'D\xe0', u'D\xe5'), (u'upp\ufb01nna', u'uppfinna'), (u'R\xe0ttf\xe5glar', u'R\xe5ttf\xe5glar'), (u'Sv\xe4\xfcboda', u'Sv\xe4ljboda'), (u'P\xe5b\xf6\ufb02ar', u'P\xe5b\xf6rjar'), (u'slutarju', u'slutar ju'), (u'ni\ufb01skebu\xfcken', u'i fiskebutiken'), (u'h\xe4rj\xe4keln', u'h\xe4r j\xe4keln'), (u'H\xdfppa', u'Hoppa'), (u'f\xf6rst\xf6rds', u'f\xf6rst\xf6rdes'), (u'varj\xe4ttegoda', u'var j\xe4ttegoda'), (u'Kor\\/', u'Korv'), (u'br\xfcl\xe9el', u'br\xfcl\xe9e!'), (u'Hei', u'Hej'), (u'\xe4lskarjordgubbsglass', u'\xe4lskar jordgubbsglass'), (u'Sn\xf6bom', u'Sn\xf6boll'), (u'Sn\xf6boH', u'Sn\xf6boll'), (u'Sn\xf6bol', u'Sn\xf6boll'), (u'sn\xf6boH', u'sn\xf6boll'), (u'L\xe4ggerp\xe5', u'L\xe4gger p\xe5'), (u'lnge\ufb02', u'lnget!'), (u'S\xe4gerj\xe4ttesmarta', u'S\xe4ger j\xe4ttesmarta'), (u'dopplen/\xe4derradar', u'dopplerv\xe4derradar'), (u's\xe4kertj\xe4ttefin', u's\xe4kert j\xe4ttefin'), (u'\xe4rj\xe4ttefin', u'\xe4r j\xe4ttefin'), (u'verkarju', u'verkar ju'), (u'blirju', u'blir ju'), (u'kor\\/', u'korv'), (u'naturkatastro\ufb01', u'naturkatastrof!'), (u'stickerjag', u'stickerj ag'), (u'j\xe4ttebu\ufb01\xe9', u'j\xe4ttebuff\xe9'), (u'be\ufb01nner', u'befinner'), (u'Sp\ufb02ng', u'Spring'), (u'trec\ufb01e', u'tredje'), (u'ryckerjag', u'rycker jag'), (u'skullejag', u'skulle jag'), (u'vetju', u'vet ju'), (u'a\ufb02jag', u'att jag'), (u'\ufb02nns', u'finns'), (u'\xe4rl\xe5ng', u'\xe4r l\xe5ng'), (u'k\xe5ra', u'k\xe4ra'), (u'\xe4r\ufb01na', u'\xe4r \ufb01na'), (u'\xe4ri', u'\xe4r i'), (u'h\xf6rden', u'h\xf6r den'), (u'\xe4ttj\xe4g', u'att j\xe4g'), (u'g\xe4r', u'g\xe5r'), (u'f\xf6ri', u'f\xf6r i'), (u'Hurvisste', u'Hur visste'), (u'\ufb01ck', u'fick'), (u'\ufb01nns', u'finns'), (u'\ufb01n', u'fin'), (u'Fa', u'Bra.'), (u'bori', u'bor i'), (u'fiendeplanl', u'fiendeplan!'), (u'if\xf6rnamn', u'i f\xf6rnamn'), (u'detju', u'det ju'), (u'N\xfcd', u'Niki'), (u'hatarjag', u'hatar jag'), (u'Klararjag', u'Klarar jag'), (u'deta\ufb01er', u'detaljer'), (u'v\xe4/', u'v\xe4l'), (u'smakarju', u'smakar ju'), (u'Teache\ufb02', u'Teacher!'), (u'imorse', u'i morse'), (u'drickerjag', u'dricker jag'), (u'st\xe5ri', u'st\xe5r i'), (u'Harjag', u'Har jag'), (u'Talarjag', u'Talar jag'), (u'undrarjag', u'undrar jag'), (u'\xe5lderjag', u'\xe5lder jag'), (u'va\ufb01e', u'varje'), (u'f\xf6rfalskningl', u'f\xf6rfalskning!'), (u'Vi\ufb01iiiam', u'William'), (u'V\\\ufb01lliams', u'Williams'), (u'attjobba', u'att jobba'), (u'intei', u'inte i'), (u'n\xe4rV\\\ufb01lliam', u'n\xe4r William'), (u'V\\\ufb01lliam', u'William'), (u'E\ufb01ersom', u'Eftersom'), (u'Vl\ufb01lliam', u'William'), (u'I\xe4ngejag', u'l\xe4nge jag'), (u"'\ufb01digare", u'Tidigare'), (u'b\xf6rjadei', u'b\xf6rjade i'), (u'merjust', u'mer just'), (u'e\ufb01er\xe5t', u'efter\xe5t'), (u'gjordejag', u'gjorde jag'), (u'hadeju', u'hade ju'), (u'g\xe5rvi', u'g\xe5r vi'), (u'k\xf6perjag', u'k\xf6per jag'), (u'M\xe5stejag', u'M\xe5ste jag'), (u'k\xe4nnerju', u'k\xe4nner ju'), (u'\ufb02n', u'fin'), (u'treviig', u'trevlig'), (u'Grattisl', u'Grattis!'), (u'kande', u'k\xe4nde'), (u"'llden", u'Tiden'), (u'sakjag', u'sak jag'), (u'klartjag', u'klart jag'), (u'h\xe4\ufb01igt', u'h\xe4ftigt'), (u'I\xe4mnarjag', u'l\xe4mnar jag'), (u'gickju', u'gick ju'), (u'skajag', u'ska jag'), (u'G\xf6rjag', u'G\xf6r jag'), (u'm\xe5stejag', u'm\xe5ste jag'), (u'gra\\/iditet', u'graviditet'), (u'hittadqdin', u'hittade din'), (u'\xe4rjobbigt', u'\xe4r jobbigt'), (u'Overdrivet', u'\xd6verdrivet'), (u'hOgtidlig', u'h\xf6gtidlig'), (u'Overtyga', u'\xd6vertyga'), (u'SKILSMASSA', u'SKILSM\xc4SSA'), (u'brukarju', u'brukar ju'), (u'lsabel', u'Isabel'), (u'kundejag', u'kunde jag'), (u'\xe4rl\xe4get', u'\xe4r l\xe4get'), (u'blirinte', u'blir inte'), (u'ijakt', u'i jakt'), (u'avjordens', u'av jordens'), (u'90000O', u'900000'), (u'9O0', u'900'), (u'\xe4rp\xe5', u'\xe4r p\xe5'), (u'\xe4rproteserna', u'\xe4r proteserna'), (u'\xe4rytterst', u'\xe4r ytterst'), (u'beborjorden', u'bebor jorden'), (u'filmjag', u'film jag'), (u'fokuserarp\xe5', u'fokuserar p\xe5'), (u'folkjag', u'folk jag'), (u'f\xf6rest\xe4lldejag', u'f\xf6rest\xe4llde jag'), (u'f\xf6rpubliken', u'f\xf6r publiken'), (u'gilladejag', u'gillade jag'), (u'h\xe5llerp\xe5', u'h\xe5ller p\xe5'), (u'harp\xe5', u'har p\xe5'), (u'harplaner', u'har planer'), (u'harprylar', u'har prylar'), (u'kommerpubliken', u'kommer publiken'), (u'kostymerp\xe5', u'kostymer p\xe5'), (u'litarp\xe5', u'litar p\xe5'), (u'lngen', u'Ingen'), (u'lnom', u'Inom'), (u'lnte', u'Inte'), (u'ochjag', u'och jag'), (u'Ochjag', u'Och jag'), (u'ochjorden', u'och jorden'), (u'omjag', u'om jag'), (u'Omjag', u'Om jag'), (u'passarperfekt', u'passar perfekt'), (u's\xe4ttetjag', u's\xe4ttet jag'), (u'silverp\xe5', u'silver p\xe5'), (u'skruvarjag', u'skruvar jag'), (u'somjag', u'som jag'), (u'Somjag', u'Som jag'), (u'talarp\xe5', u'talar p\xe5'), (u't\xe4nktejag', u't\xe4nkte jag'), (u'tapparjag', u'tappar jag'), (u'tittarp\xe5', u'tittar p\xe5'), (u'visstejag', u'visste jag'), (u'medjetpacks', u'med jetpacks'), (u's\xe4tterp\xe5', u's\xe4tter p\xe5'), (u'st\xe5rp\xe5', u'st\xe5r p\xe5'), (u'tillh\xf6rp\xe5', u'tillh\xf6r p\xe5')]), + 'pattern': u"(?um)(\\b|^)(?:l\\\xe2rt|hederv\\\xe5rda|storm\\\xe2stare|Avf\\\xe2rd|t\\\xe2lten|\\\xe2rjag|\\\xe4rjag|j\\\xe2mlikar|Riskako\\\ufb02|Karamellen\\/|Lngen\\\xfcng|\\\xe4rju|S\\\xe1|n\\\xe4rjag|alltjag|g\\\xf6rjag|trorjag|varju|g\\\xf6rju|kanju|blirjag|s\\\xe4gerjag|beh\\\xe5llerjag|pr\\\xf8blem|r\\\xe4ddadeju|hon\\\xf8m|Ln|sv\\\xe5r\\\ufb02\\\xf6rtad|\\\xf8ch|\\\ufb02\\\xf6rtar|k\\\xe4nnerjag|\\\ufb02ickan|sn\\\xf8|gerju|k\\\xf8ntakter|\\\xf8lycka|n\\\xf8lla|sinnenajublar|ijobbet|F\\\xe5rjag|Ar|liggerju|um|lbland|skjuterjag|Vadd\\\xe5|pratarj\\\xe4mt|harju|sitterjag|h\\\xe4\\\ufb02a|s\\\ufb01\\\xe4l|F\\\xd6U|varf\\\xf6rjag|s\\\ufb01\\\xe4rna|b\\\xf6\\\ufb02ar|b\\\xf6\\\ufb02an|st\\\xe4ri|p\\\xe4|harjag|attjag|Verkarjag|K\\\xe4nnerjag|d\\\xe4rjag|tu\\\ufb01|lurarjag|varj\\\xe4ttebra|allvan|deth\\\xe4r|va\\\ufb02e|F\\\xf6Uer|personalm\\\xf6tetl|harjust|\\\xe4rj\\\xe4tteduktig|d\\\xe4rja|lngen\\\xfcng|iluften|\\\xf6sen|tv\\\xe2|Uejerna|h\\\xe5n\\*|\\\xc4rjag|keL|F\\\xf6rjag|varj\\\xe4ttekul|k\\\xe4mpan|mycketjobb|Uus|serjag|vetjag|f\\\xe5rjag|hurjag|f\\\xf6rs\\\xf6kerjag|t\\\xe1nagel|va\\\xfce|Uudet|amhopa|V\\\xe4\\\xfc|g\\\xe4ri|r\\\xf6d\\\xfcus|Uuset|Rid\\\xe0n|vi\\\xfca|g\\\xe5ri|Hurd\\\xe5|inter\\\\\\/juar|menarjag|spyrjag|bri\\\xfcera|N\\\xe4rjag|ner\\\\\\/\\\xf6s|ilivets|n\\\xe4got|p\\\xe0|Lnnan|Uf|lnnan|D\\\xe0ren|F\\\xe0rjag|Vad\\\xe4rdetd\\\xe4L|sm\\\xe0tjuv|t\\\xe0gr\\\xe5nare|dit\\\xe0t|s\\\xe4|v\\\xe0rdsl\\\xf6sa|n\\\xe0n|kommerjag|\\\xe4rj\\\xe4ttebra|\\\xe4rj\\\xe4vligt|\\\xe0kerjag|ellerjapaner|attjaga|eften|h\\\xe4stan|Lntensivare|fr\\\xe0garjag|pen\\/ers|r\\\xe0barkade|styrkon|Dif\\\xe5f|h\\\xe4nden|f\\\xf6\\\ufb01a|Idioten\\/|Varf\\\xf6rjagade|d\\\xe4rf\\\xf6rjag|forjag|Iivsgladje|narjag|sajag|genastja|rockument\\\xe0ren|turne|fickjag|sager|Ijush\\\xe5rig|tradg\\\xe5rdsolycka|kvavdes|d\\\xe0rja|hedersgaster|Nar|smaki\\\xf6sa|lan|Lan|eri|universitetsamne|garna|ar|baltdjur|varjag|\\\xe0r|f\\\xf6rf\\\xf6rst\\\xe0rkare|arjattespeciell|h\\\xe0rg\\\xe5r|Ia|Iimousinen|krickettra|h\\\xe5rdrockv\\\xe0rlden|tr\\\xe0bit|Mellanvastern|arju|turnen|kanns|battre|v\\\xe0rldsturne|dar|sj\\\xe0lvant\\\xe0nder|jattelange|berattade|S\\\xe4|vandpunkten|N\\\xe0rjag|lasa|skitl\\\xe0skigt|sambandsv\\\xe0g|valdigt|Stamga\\\ufb01el|\\\xe0rjag|tajming|utg\\\xe4ng|H\\\xe0r\\\xe5t|h\\\xe0r\\\xe5t|anvander|harjobbat|imageide|kla\\\ufb01en|sjalv|dvarg|detjag|dvargarna|fantasiv\\\xe0rld|\\\ufb01olliga|mandoiinstr\\\xe0ngar|mittjobb|Skajag|landari|gang|Detjag|Narmre|I\\\xe5tjavelni|H\\\xe5llerjag|visionarer|T\\\xfclvad|milit\\\xe0rbas|jattegiada|Fastjag|s\\\xe5jag|rockvarlden|saknarjag|allafall|\\\ufb01anta|Kr\\\xe0ma|stammer|budb\\\xe0rare|Iivsfiiosofi|f\\\xf6rj\\\xe4mnan|gillarjag|Iarvat|klararjag|hatta\\\ufb01\\'\\\xe0r|D\\\xe0|upp\\\ufb01nna|R\\\xe0ttf\\\xe5glar|Sv\\\xe4\\\xfcboda|P\\\xe5b\\\xf6\\\ufb02ar|slutarju|ni\\\ufb01skebu\\\xfcken|h\\\xe4rj\\\xe4keln|H\\\xdfppa|f\\\xf6rst\\\xf6rds|varj\\\xe4ttegoda|Kor\\\\\\/|br\\\xfcl\\\xe9el|Hei|\\\xe4lskarjordgubbsglass|Sn\\\xf6bom|Sn\\\xf6boH|Sn\\\xf6bol|sn\\\xf6boH|L\\\xe4ggerp\\\xe5|lnge\\\ufb02|S\\\xe4gerj\\\xe4ttesmarta|dopplen\\/\\\xe4derradar|s\\\xe4kertj\\\xe4ttefin|\\\xe4rj\\\xe4ttefin|verkarju|blirju|kor\\\\\\/|naturkatastro\\\ufb01|stickerjag|j\\\xe4ttebu\\\ufb01\\\xe9|be\\\ufb01nner|Sp\\\ufb02ng|trec\\\ufb01e|ryckerjag|skullejag|vetju|a\\\ufb02jag|\\\ufb02nns|\\\xe4rl\\\xe5ng|k\\\xe5ra|\\\xe4r\\\ufb01na|\\\xe4ri|h\\\xf6rden|\\\xe4ttj\\\xe4g|g\\\xe4r|f\\\xf6ri|Hurvisste|\\\ufb01ck|\\\ufb01nns|\\\ufb01n|Fa|bori|fiendeplanl|if\\\xf6rnamn|detju|N\\\xfcd|hatarjag|Klararjag|deta\\\ufb01er|v\\\xe4\\/|smakarju|Teache\\\ufb02|imorse|drickerjag|st\\\xe5ri|Harjag|Talarjag|undrarjag|\\\xe5lderjag|va\\\ufb01e|f\\\xf6rfalskningl|Vi\\\ufb01iiiam|V\\\\\\\ufb01lliams|attjobba|intei|n\\\xe4rV\\\\\\\ufb01lliam|V\\\\\\\ufb01lliam|E\\\ufb01ersom|Vl\\\ufb01lliam|I\\\xe4ngejag|\\'\\\ufb01digare|b\\\xf6rjadei|merjust|e\\\ufb01er\\\xe5t|gjordejag|hadeju|g\\\xe5rvi|k\\\xf6perjag|M\\\xe5stejag|k\\\xe4nnerju|\\\ufb02n|treviig|Grattisl|kande|\\'llden|sakjag|klartjag|h\\\xe4\\\ufb01igt|I\\\xe4mnarjag|gickju|skajag|G\\\xf6rjag|m\\\xe5stejag|gra\\\\\\/iditet|hittadqdin|\\\xe4rjobbigt|Overdrivet|hOgtidlig|Overtyga|SKILSMASSA|brukarju|lsabel|kundejag|\\\xe4rl\\\xe4get|blirinte|ijakt|avjordens|90000O|9O0|\\\xe4rp\\\xe5|\\\xe4rproteserna|\\\xe4rytterst|beborjorden|filmjag|fokuserarp\\\xe5|folkjag|f\\\xf6rest\\\xe4lldejag|f\\\xf6rpubliken|gilladejag|h\\\xe5llerp\\\xe5|harp\\\xe5|harplaner|harprylar|kommerpubliken|kostymerp\\\xe5|litarp\\\xe5|lngen|lnom|lnte|ochjag|Ochjag|ochjorden|omjag|Omjag|passarperfekt|s\\\xe4ttetjag|silverp\\\xe5|skruvarjag|somjag|Somjag|talarp\\\xe5|t\\\xe4nktejag|tapparjag|tittarp\\\xe5|visstejag|medjetpacks|s\\\xe4tterp\\\xe5|st\\\xe5rp\\\xe5|tillh\\\xf6rp\\\xe5)(\\b|$)"}}} for lang, grps in data.iteritems(): for grp in grps.iterkeys(): if data[lang][grp]["pattern"]: diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py b/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py index 1ac99b6e6..7a0482dad 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/make_data.py @@ -36,6 +36,7 @@ u" l ": u" I ", u"'sjust": u"'s just", u"'tjust": u"'t just", + u"\";": u"'s", }, "WholeWords": { u"I'11": u"I'll", @@ -117,10 +118,6 @@ } SZ_FIX_DATA_GLOBAL = { - "PartialWordsAlways": { - u"¶¶": u"♫", - u"¶": u"♪" - } } if __name__ == "__main__": diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml new file mode 100644 index 000000000..4faf79872 --- /dev/null +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml @@ -0,0 +1,1840 @@ +<OCRFixReplaceList> + <WholeWords> + <Word from="andele" to="anđele" /> + <Word from="andeli" to="anđeli" /> + <Word from="bacas" to="bacaš" /> + <Word from="bas" to="baš" /> + <Word from="Bas" to="Baš" /> + <Word from="basta" to="vrt" /> + <Word from="Basta" to="Vrt" /> + <Word from="baste" to="vrtovi" /> + <Word from="Baste" to="Vrtovi" /> + <Word from="basti" to="vrtu" /> + <Word from="Basti" to="Vrtu" /> + <Word from="bastom" to="vrtom" /> + <Word from="Bastom" to="Vrtom" /> + <Word from="bastu" to="vrt" /> + <Word from="Bastu" to="Vrt" /> + <Word from="Bice" to="Biće" /> + <Word from="bice" to="biće" /> + <Word from="Biceš" to="Bit ćeš" /> + <Word from="Bicu" to="Bit ću" /> + <Word from="bicu" to="biću" /> + <Word from="blagonaklonoscu" to="blagonaklonošću" /> + <Word from="blizi" to="bliži" /> + <Word from="bljesti" to="bliješti" /> + <Word from="Bljesti" to="Bliješti" /> + <Word from="bojis" to="bojiš" /> + <Word from="braca" to="braća" /> + <Word from="Braca" to="Braća" /> + <Word from="broncane" to="brončane" /> + <Word from="broncanu" to="brončanu" /> + <Word from="budes" to="budeš" /> + <!--c--> + <!-- cic u čić - nikada automatski za sve! --> + <Word from="caj" to="čaj" /> + <Word from="caja" to="čaja" /> + <Word from="Cak" to="Čak" /> + <Word from="cak" to="čak" /> + <Word from="cale" to="tata" /> + <Word from="Cao" to="Ćao" /> + <Word from="cao" to="ćao" /> + <Word from="cas" to="sat" /> + <Word from="casno" to="časno" /> + <Word from="Casno" to="Časno" /> + <Word from="castis" to="častiš" /> + <Word from="casu" to="cašu" /> + <Word from="cašu" to="čašu" /> + <Word from="cebe" to="deku" /> + <Word from="cega" to="čega" /> + <Word from="Cek" to="Ček" /> + <Word from="cek" to="ček" /> + <Word from="cekali" to="čekali" /> + <Word from="cekas" to="čekaš" /> + <Word from="Cemu" to="Čemu" /> + <Word from="cemu" to="čemu" /> + <Word from="cerka" to="kći" /> + <Word from="Cerka" to="Kći" /> + <Word from="cerke" to="kćeri" /> + <Word from="Cerke" to="Kćeri" /> + <Word from="cerku" to="kćer" /> + <Word from="Cerku" to="Kćer" /> + <Word from="ces" to="ćeš" /> + <Word from="cesce" to="češće" /> + <Word from="Cesce" to="Češće" /> + <Word from="Ceskoj" to="Češkoj" /> + <Word from="cestitki" to="čestitki" /> + <Word from="cesto" to="često" /> + <Word from="Cesto" to="Često" /> + <Word from="cetiri" to="četiri" /> + <Word from="Cetiri" to="Četiri" /> + <Word from="cetri" to="četiri" /> + <Word from="cetu" to="četu" /> + <Word from="ceznja" to="čežnja" /> + <Word from="ceznje" to="čežnje" /> + <Word from="ceznji" to="čežnji" /> + <Word from="ceznjom" to="čežnjom" /> + <Word from="ceznju" to="čežnju" /> + <Word from="ceznu" to="čeznu" /> + <Word from="ceš" to="ćeš" /> + <Word from="Cija" to="Čija" /> + <Word from="cija" to="čija" /> + <Word from="cije" to="čije" /> + <Word from="Ciji" to="Čiji" /> + <Word from="ciji" to="čiji" /> + <Word from="cijih" to="čijih" /> + <Word from="Cijih" to="Čijih" /> + <Word from="cijim" to="čijim" /> + <Word from="Cijim" to="Čijim" /> + <Word from="Cim" to="Čim" /> + <Word from="cim" to="čim" /> + <Word from="cime" to="čime" /> + <Word from="cinila" to="činila" /> + <Word from="cinili" to="činili" /> + <Word from="cinio" to="činio" /> + <Word from="cinis" to="činiš" /> + <Word from="ciniti" to="činiti" /> + <Word from="cipka" to="čipka" /> + <Word from="cipku" to="čipku" /> + <Word from="cita" to="čita" /> + <Word from="citao" to="čitao" /> + <Word from="citas" to="čitaš" /> + <Word from="citavu" to="čitavu" /> + <Word from="cizme" to="čizme" /> + <Word from="clan" to="član" /> + <Word from="Clan" to="Član" /> + <Word from="clanke" to="članke" /> + <Word from="clanove" to="članove" /> + <Word from="clanovi" to="članovi" /> + <Word from="clanovima" to="članovima" /> + <Word from="cmo" to="ćemo" /> + <Word from="corsokak" to="slijepa ulica" /> + <Word from="corsokaku" to="slijepoj ulici" /> + <Word from="cosak" to="ugao" /> + <Word from="cosku" to="uglu" /> + <Word from="covece" to="čovječe" /> + <Word from="covek" to="čovjek" /> + <Word from="covjece" to="čovječe" /> + <Word from="covjecnost" to="čovječnost" /> + <Word from="covjek" to="čovjek" /> + <Word from="covjeka" to="čovjeka" /> + <Word from="covjeku" to="čovjeku" /> + <Word from="crpeci" to="crpeći" /> + <Word from="cte" to="ćete" /> + <Word from="Cu" to="Ću" /> + <Word from="Ceš" to="Ćeš" /> + <Word from="Ce" to="Će" /> + <Word from="Cemo" to="Ćemo" /> + <Word from="Cete" to="Ćete" /> + <Word from="cu" to="ću" /> + <Word from="ce" to="će" /> + <Word from="cemo" to="ćemo" /> + <Word from="cete" to="ćete" /> + <Word from="cudi" to="čudi" /> + <Word from="Cudo" to="Čudo" /> + <Word from="cudo" to="čudo" /> + <Word from="Cujte" to="Čujte" /> + <Word from="cula" to="čula" /> + <Word from="culi" to="čuli" /> + <Word from="Culi" to="Čuli" /> + <Word from="culima" to="čulima" /> + <Word from="cuo" to="čuo" /> + <Word from="Cuo" to="Čuo" /> + <Word from="cupam" to="čupam" /> + <Word from="cutanje" to="šutnja" /> + <Word from="Cutanje" to="Šutnja" /> + <Word from="cutao" to="šutio" /> + <Word from="Cutao" to="Šutio" /> + <Word from="cuti" to="čuti" /> + <Word from="cutljiv" to="šutljiv" /> + <Word from="cutnja" to="šutnja" /> + <Word from="cuvali" to="čuvali" /> + <Word from="cuveni" to="čuveni" /> + <!--d--> + <Word from="dace" to="dat će" /> + <Word from="dacemo" to="dat ćemo" /> + <Word from="davo" to="vrag" /> + <Word from="definise" to="definira" /> + <Word from="definisi" to="definiraj" /> + <Word from="Desava" to="Događa" /> + <Word from="desava" to="događa" /> + <Word from="disemo" to="dišemo" /> + <Word from="disi" to="diši" /> + <Word from="dobijes" to="dobiješ" /> + <Word from="dobivas" to="dobivaš" /> + <Word from="doci" to="doći" /> + <Word from="dode" to="dođe" /> + <Word from="dodem" to="dođem" /> + <Word from="dodes" to="dođeš" /> + <Word from="dodete" to="dođete" /> + <Word from="dodeš" to="dođeš" /> + <Word from="Dodi" to="Dođi" /> + <Word from="dodi" to="dođi" /> + <Word from="dodite" to="dođite" /> + <Word from="Dodji" to="Dođi" /> + <Word from="dodji" to="dođi" /> + <Word from="Dodjite" to="Dođite" /> + <Word from="dodjite" to="dođite" /> + <Word from="Dodju" to="Dođu" /> + <Word from="dodju" to="dođu" /> + <Word from="dodu" to="dođu" /> + <Word from="dolazis" to="dolaziš" /> + <Word from="dopustao" to="dopuštao" /> + <Word from="dorucak" to="doručak" /> + <Word from="dorucku" to="doručku" /> + <Word from="Dosao" to="Došao" /> + <Word from="dosao" to="došao" /> + <Word from="drhteci" to="drhteći" /> + <Word from="drhteći" to="drhteći" /> + <Word from="Drhteći" to="Drhteći" /> + <Word from="drugacija" to="drugačija" /> + <Word from="Drugacije" to="Drugačije" /> + <Word from="drugacije" to="drugačije" /> + <Word from="drugaciji" to="drugačiji" /> + <Word from="Drugaciji" to="Drugačiji" /> + <Word from="drukciji" to="drugačiji" /> + <Word from="drveca" to="drveća" /> + <Word from="drvece" to="drveće" /> + <Word from="drvecem" to="drvećem" /> + <Word from="drvecu" to="drveću" /> + <Word from="drzi" to="drži" /> + <Word from="Drzim" to="Držim" /> + <Word from="dugmici" to="gumbići" /> + <Word from="duze" to="duže" /> + <Word from="duzinom" to="dužinom" /> + <Word from="dzanki" to="ovisnik" /> + <Word from="Dzejk" to="Jake" /> + <Word from="Dzime" to="Jime" /> + <Word from="Dzone" to="Johne" /> + <Word from="flasom" to="flašom" /> + <Word from="flasu" to="flašu" /> + <Word from="fucka" to="fućka" /> + <Word from="funkcionisu" to="funkcioniraju" /> + <!--g--> + <Word from="gacice" to="gaćice" /> + <Word from="gadao" to="gađao" /> + <Word from="gadis" to="gadiš" /> + <Word from="Gadis" to="Gadiš" /> + <Word from="gdica" to="gđica" /> + <Word from="gdice" to="gđice" /> + <Word from="gdici" to="gđici" /> + <Word from="gdicu" to="gđicu" /> + <Word from="gdu" to="gđu" /> + <Word from="glupaco" to="glupačo" /> + <Word from="govoris" to="govoriš" /> + <Word from="gradani" to="građani" /> + <Word from="gradic" to="gradić" /> + <Word from="gradica" to="gradića" /> + <Word from="gradicu" to="gradiću" /> + <Word from="grancica" to="grančica" /> + <Word from="grancicu" to="grančicu" /> + <Word from="gresci" to="grešci" /> + <Word from="grese" to="griješe" /> + <Word from="greski" to="grešci" /> + <Word from="gresku" to="grešku" /> + <Word from="gubis" to="gubiš" /> + <Word from="Hoces" to="Hoćeš" /> + <Word from="hoces" to="hoćeš" /> + <Word from="hocu" to="hoću" /> + <Word from="Hocu" to="Hoću" /> + <Word from="hodas" to="hodaš" /> + <Word from="htjeo" to="htio" /> + <!--i--> + <Word from="iceg" to="ičeg" /> + <Word from="icega" to="ičega" /> + <Word from="icemu" to="ičemu" /> + <Word from="Ici" to="Ići" /> + <Word from="ici" to="ići" /> + <Word from="Ides" to="Ideš" /> + <Word from="ides" to="ideš" /> + <Word from="iduce" to="iduće" /> + <Word from="iduceg" to="idućeg" /> + <Word from="iducem" to="idućem" /> + <Word from="Iduci" to="Idući" /> + <Word from="iduci" to="idući" /> + <Word from="ignorisi" to="ignoriraj" /> + <Word from="ignorisi" to="ignoriraju" /> + <Word from="igras" to="igraš" /> + <Word from="Ijudi" to="ljudi" /> + <Word from="imas" to="imaš" /> + <Word from="imidz" to="imidž" /> + <Word from="inace" to="inače" /> + <Word from="Inace" to="Inače" /> + <Word from="isao" to="išao" /> + <Word from="Isao" to="Išao" /> + <Word from="iscupao" to="iščupao" /> + <Word from="isećemo" to="izrezati" /> + <Word from="isla" to="išla" /> + <Word from="istjece" to="istječe" /> + <Word from="istrazio" to="istrazio" /> + <Word from="Istrazio" to="Istrazio" /> + <Word from="isuvise" to="previše" /> + <Word from="izaci" to="izaći" /> + <Word from="Izaci" to="Izaći" /> + <Word from="izade" to="izađe" /> + <Word from="Izade" to="Izađe" /> + <Word from="izadem" to="izađem" /> + <Word from="izades" to="izađeš" /> + <Word from="izadete" to="izađete" /> + <Word from="Izadi" to="Izađi" /> + <Word from="izadi" to="izađi" /> + <Word from="izasao" to="izašao" /> + <Word from="izasla" to="izašla" /> + <Word from="izici" to="izići" /> + <Word from="izluduje" to="izluđuje" /> + <Word from="izluduju" to="izluđuju" /> + <Word from="izmedu" to="između" /> + <Word from="Izmedu" to="Između" /> + <Word from="izostri" to="izoštri" /> + <Word from="izostrim" to="izoštrim" /> + <Word from="izvuci" to="izvući" /> + <Word from="išcupao" to="iščupao" /> + <Word from="jebes" to="jebeš" /> + <Word from="Jebes" to="Jebeš" /> + <Word from="jos" to="još" /> + <Word from="Jos" to="Još" /> + <Word from="juce" to="jučer" /> + <Word from="Juce" to="Jučer" /> + <Word from="jucer" to="jučer" /> + <Word from="Jucer" to="Jučer" /> + <!--k--> + <Word from="kaslja" to="kašlja" /> + <Word from="kaze" to="kaže" /> + <Word from="Kaze" to="Kaže" /> + <Word from="kazemo" to="kažemo" /> + <Word from="kazite" to="kažite" /> + <Word from="Kazite" to="Kažite" /> + <Word from="kazu" to="kažu" /> + <Word from="Kcer" to="Kćer" /> + <Word from="kcer" to="kćer" /> + <Word from="kcerka" to="kći" /> + <Word from="Kcerka" to="Kći" /> + <Word from="kcerkama" to="kćerima" /> + <Word from="kcerku" to="kćer" /> + <Word from="Kcerku" to="Kćer" /> + <Word from="kecap" to="kečap" /> + <Word from="kecapa" to="kečapa" /> + <Word from="kise" to="kiše" /> + <Word from="kisi" to="kiši" /> + <Word from="kleknes" to="klekneš" /> + <Word from="kociji" to="kočiji" /> + <Word from="kolaca" to="kolača" /> + <Word from="kolace" to="kolače" /> + <Word from="komadic" to="komadić" /> + <Word from="komsijama" to="susjedima" /> + <Word from="komsije" to="susjedi" /> + <Word from="komsiji" to="susjedu" /> + <Word from="komsiluk" to="susjedstvo" /> + <Word from="komsiluku" to="susjedstvu" /> + <Word from="komšija" to="susjed" /> + <Word from="Komšija" to="Susjed" /> + <Word from="Konkurise" to="Konkurira" /> + <Word from="konkurise" to="konkurira" /> + <Word from="konkurisem" to="konkuriram" /> + <Word from="konkurisu" to="konkuriraju" /> + <Word from="kontrolisu" to="kontroliraju" /> + <Word from="kosulja" to="košulja" /> + <Word from="kosulje" to="košulje" /> + <Word from="kosulji" to="košulji" /> + <Word from="kosulju" to="košulju" /> + <Word from="kovceg" to="kovčeg" /> + <Word from="kovcegu" to="kovčegu" /> + <Word from="krada" to="krađa" /> + <Word from="Krada" to="Krađa" /> + <Word from="Krece" to="Kreće" /> + <Word from="krece" to="kreće" /> + <Word from="Kreci" to="Kreći" /> + <Word from="kreci" to="kreći" /> + <Word from="krecu" to="kreću" /> + <Word from="krećes" to="krećeš" /> + <Word from="krosnje" to="krošnje" /> + <Word from="krvaris" to="krvariš" /> + <Word from="kuca" to="kuća" /> + <Word from="kucama" to="kućama" /> + <Word from="kuce" to="kuće" /> + <Word from="kuci" to="kući" /> + <Word from="kusa" to="kuša" /> + <Word from="kusas" to="kušaš" /> + <Word from="kuča" to="kuća" /> + <Word from="kuči" to="kući" /> + <!--l--> + <Word from="lakocom" to="lakoćom" /> + <Word from="laz" to="laž" /> + <Word from="lazac" to="lažljivac" /> + <Word from="laze" to="laže" /> + <Word from="lazi" to="laži" /> + <Word from="lazne" to="lažne" /> + <Word from="lazni" to="lažni" /> + <Word from="lazov" to="lažljivac" /> + <Word from="ledja" to="leđa" /> + <Word from="ledjima" to="leđima" /> + <Word from="leprsa" to="leprša" /> + <Word from="lezala" to="ležala" /> + <Word from="lezali" to="ležali" /> + <Word from="lezati" to="ležati" /> + <Word from="lezis" to="ležiš" /> + <Word from="Lezis" to="Ležiš" /> + <Word from="lici" to="liči" /> + <Word from="licim" to="ličim" /> + <Word from="licis" to="ličiš" /> + <Word from="licnost" to="ličnost" /> + <Word from="licnosti" to="ličnosti" /> + <Word from="lijecniku" to="liječniku" /> + <Word from="ljubis" to="ljubiš" /> + <Word from="los" to="loš" /> + <Word from="losa" to="loša" /> + <Word from="losu" to="lošu" /> + <!--m--> + <Word from="majcine" to="majčine" /> + <Word from="masini" to="mašini" /> + <Word from="medu" to="među" /> + <Word from="Medutim" to="Međutim" /> + <Word from="medutim" to="međutim" /> + <Word from="mici" to="miči" /> + <Word from="Mici" to="Miči" /> + <Word from="micu" to="miču" /> + <Word from="mislis" to="misliš" /> + <Word from="Mislis" to="Misliš" /> + <Word from="mjesecevom" to="mjesečevom" /> + <Word from="mjesecine" to="mjesečine" /> + <Word from="mjesecini" to="mjesečini" /> + <Word from="mjesecinu" to="mjesečinu" /> + <Word from="mladic" to="mladić" /> + <Word from="moc" to="moć" /> + <Word from="moci" to="moći" /> + <Word from="motivisu" to="motiviraju" /> + <Word from="mozda" to="možda" /> + <Word from="Mozda" to="Možda" /> + <Word from="moze" to="može" /> + <Word from="mozete" to="možete" /> + <Word from="mreza" to="mreža" /> + <Word from="mrezu" to="mrežu" /> + <Word from="mrzis" to="mrziš" /> + <Word from="muce" to="muče" /> + <Word from="mucenik" to="mučenik" /> + <Word from="mucne" to="mučne" /> + <Word from="muska" to="muška" /> + <Word from="muz" to="muž" /> + <Word from="muza" to="muža" /> + <!--n--> + <Word from="naci" to="naći" /> + <Word from="Naci" to="Naći" /> + <Word from="nacin" to="način" /> + <Word from="nadem" to="nađem" /> + <Word from="Nadem" to="Nađem" /> + <Word from="nademo" to="nađemo" /> + <Word from="nades" to="nađeš" /> + <Word from="Nades" to="Nađeš" /> + <Word from="nadete" to="nađete" /> + <Word from="nadici" to="nadići" /> + <Word from="nadje" to="nađe" /> + <Word from="Nadje" to="Nađe" /> + <Word from="nadjen" to="nađen" /> + <Word from="nadjes" to="nađeš" /> + <Word from="Nadjes" to="Nađeš" /> + <Word from="nadjete" to="nađete" /> + <Word from="nagovestaj" to="nagovještaj" /> + <Word from="najvise" to="najvise" /> + <Word from="Najvise" to="Najviše" /> + <Word from="naklonoscu" to="nakolonošću" /> + <Word from="naocale" to="naočale" /> + <Word from="Napisite" to="Napišite" /> + <Word from="nasa" to="naša" /> + <Word from="Nase" to="Naše" /> + <Word from="nase" to="naše" /> + <Word from="naseg" to="našeg" /> + <Word from="nasi" to="naši" /> + <Word from="Nasi" to="Naši" /> + <Word from="nasao" to="našao" /> + <Word from="Nasao" to="Našao" /> + <Word from="nasla" to="našla" /> + <Word from="Nasla" to="Našla" /> + <Word from="nasli" to="našli" /> + <Word from="Nasli" to="Našli" /> + <Word from="nasoj" to="našoj" /> + <Word from="nasrecu" to="na sreću" /> + <Word from="nastavis" to="nastaviš" /> + <Word from="nasu" to="našu" /> + <Word from="nauce" to="nauče" /> + <Word from="neceg" to="nečeg" /> + <Word from="necega" to="nečega" /> + <Word from="necemo" to="nećemo" /> + <Word from="necemu" to="nečemu" /> + <Word from="necije" to="nečije" /> + <Word from="neciji" to="nečiji" /> + <Word from="necim" to="nečim" /> + <Word from="necovjecnost" to="nečovječnost" /> + <Word from="necovjecnosti" to="nečovječnosti" /> + <Word from="necu" to="neću" /> + <Word from="Necu" to="Neću" /> + <Word from="nekaze" to="ne kaže" /> + <Word from="nekoc" to="nekoć" /> + <Word from="Nemas" to="Nemaš" /> + <Word from="nemas" to="nemaš" /> + <Word from="Nesreca" to="Nesreća" /> + <Word from="nesto" to="nešto" /> + <Word from="Nesto" to="Nešto" /> + <Word from="new yorski" to="njujorški" /> + <Word from="Nezan" to="Nježan" /> + <Word from="nezan" to="nježan" /> + <Word from="nezna" to="nježna" /> + <Word from="Neznam" to="Ne znam" /> + <Word from="Neznas" to="Ne znas" /> + <Word from="Neznajuci" to="Ne znajući" /> + <Word from="Neznavsi" to="Ne znavši" /> + <Word from="neznam" to="ne znam" /> + <Word from="neznas" to="ne znas" /> + <Word from="neznajuci" to="ne znajući" /> + <Word from="neznavsi" to="ne znavši" /> + <Word from="nezni" to="nježni" /> + <Word from="neznih" to="nježnih" /> + <Word from="neznim" to="nježnim" /> + <Word from="nezno" to="nježno" /> + <Word from="neznu" to="nježnu" /> + <Word from="niceg" to="ničeg" /> + <Word from="nicega" to="ničega" /> + <Word from="nicemu" to="ničemu" /> + <Word from="nicija" to="ničija" /> + <Word from="niciji" to="ničiji" /> + <Word from="nicim" to="ničim" /> + <Word from="njezno" to="nježno" /> + <Word from="nju jorski" to="njujorški" /> + <Word from="noci" to="noći" /> + <Word from="nocnu" to="noćnu" /> + <Word from="nosac" to="nosač" /> + <Word from="nosices" to="nosit ćeš" /> + <Word from="nosis" to="nosiš" /> + <Word from="noz" to="nož" /> + <Word from="nozem" to="nožem" /> + <!--o--> + <Word from="Obecao" to="Obećao" /> + <Word from="Obezbedjuju" to="Osiguravaju" /> + <Word from="obezbedjuju" to="osiguravaju" /> + <Word from="obide" to="obiđe" /> + <Word from="objasnis" to="objasniš" /> + <Word from="obozavalac" to="obožavatelj" /> + <Word from="obracas" to="obraćaš" /> + <Word from="obraćas" to="obraćaš" /> + <Word from="obuce" to="obuče" /> + <Word from="obucem" to="obučem" /> + <Word from="oceve" to="očeve" /> + <Word from="ocito" to="očito" /> + <Word from="ocnjaci" to="očnjaci" /> + <Word from="odes" to="odeš" /> + <Word from="odlazis" to="odlaziš" /> + <Word from="odlezati" to="odležati" /> + <Word from="odlucim" to="odlučim" /> + <Word from="odmice" to="odmiče" /> + <Word from="odraduje" to="odrađuje" /> + <Word from="odreden" to="određen" /> + <Word from="odreduje" to="određuje" /> + <Word from="odredujemo" to="određujemo" /> + <Word from="odvec" to="odveć" /> + <Word from="ogrtac" to="ogrtač" /> + <Word from="ohrabrujuce" to="ohrabrujuće" /> + <Word from="ojacam" to="ojačam" /> + <Word from="okrece" to="okreće" /> + <Word from="opasac" to="opasač" /> + <Word from="operise" to="operira" /> + <Word from="operisemo" to="operiramo" /> + <Word from="operisete" to="operirate" /> + <Word from="operiseš" to="operiraš" /> + <Word from="osecaces" to="osjećat ćeš" /> + <Word from="osjecaces" to="osjećat ćeš" /> + <Word from="osjecam" to="osjećam" /> + <Word from="osjecanja" to="osjećanja" /> + <Word from="oslobada" to="oslobađa" /> + <Word from="ostra" to="oštra" /> + <Word from="ostre" to="oštre" /> + <Word from="ostri" to="oštri" /> + <Word from="ostrom" to="oštrom" /> + <Word from="ostru" to="oštru" /> + <Word from="osvrnes" to="osvrneš" /> + <Word from="Osvrnes" to="Osvrneš" /> + <Word from="otezala" to="otežala" /> + <Word from="otidi" to="otiđi" /> + <Word from="otidji" to="otiđi" /> + <Word from="otisao" to="otišao" /> + <Word from="oziljak" to="ožiljak" /> + <!--p--> + <Word from="palaca" to="palača" /> + <Word from="palaci" to="palači" /> + <Word from="palacu" to="palaču" /> + <Word from="papucama" to="papučama" /> + <Word from="parce" to="komadić" /> + <Word from="pateci" to="pateći" /> + <Word from="patis" to="patiš" /> + <Word from="pcela" to="pčela" /> + <Word from="pcele" to="pčele" /> + <Word from="pecini" to="pećini" /> + <Word from="pecinski" to="pećinski" /> + <Word from="peraca" to="perača" /> + <Word from="Peraci" to="Perači" /> + <Word from="pica" to="pića" /> + <Word from="pice" to="piće" /> + <Word from="picem" to="pićem" /> + <Word from="pijes" to="piješ" /> + <Word from="pisacoj" to="pisaćoj" /> + <Word from="pise" to="piše" /> + <Word from="pisem" to="pišem" /> + <Word from="pisemo" to="pišemo" /> + <Word from="pises" to="pišeš" /> + <Word from="pisite" to="pišite" /> + <Word from="pisu" to="pišu" /> + <Word from="pitas" to="pitaš" /> + <Word from="placa" to="plaća" /> + <Word from="placam" to="plaćam" /> + <Word from="placanje" to="plaćanje" /> + <Word from="placanjem" to="plaćanjem" /> + <Word from="place" to="plače" /> + <Word from="placem" to="plačem" /> + <Word from="placete" to="plačete" /> + <Word from="placeš" to="plačeš" /> + <Word from="placu" to="plaću" /> + <Word from="placuci" to="plačući" /> + <Word from="Plasi" to="Boji" /> + <Word from="plazi" to="plaži" /> + <Word from="plazu" to="plažu" /> + <Word from="plese" to="pleše" /> + <Word from="plesemo" to="plešemo" /> + <Word from="plesete" to="plešete" /> + <Word from="plesu" to="plešu" /> + <Word from="ploca" to="ploča" /> + <Word from="ploce" to="ploče" /> + <Word from="pluca" to="pluća" /> + <Word from="plucima" to="plućima" /> + <Word from="pobjeci" to="pobjeći" /> + <Word from="pobjeduje" to="pobjeđuje" /> + <Word from="poceli" to="počeli" /> + <Word from="poceo" to="počeo" /> + <Word from="pocetak" to="početak" /> + <Word from="pocevsi" to="počevši" /> + <Word from="pocevši" to="počevši" /> + <Word from="poci" to="poći" /> + <Word from="pocinje" to="počinje" /> + <Word from="pociva" to="počiva" /> + <Word from="pocivali" to="počivali" /> + <Word from="pocivao" to="počivao" /> + <Word from="pode" to="pođe" /> + <Word from="podi" to="pođi" /> + <Word from="podici" to="podići" /> + <Word from="Podici" to="Podići" /> + <Word from="podimo" to="pođimo" /> + <Word from="Podimo" to="Pođimo" /> + <Word from="podje" to="pođe" /> + <Word from="Podje" to="Pođe" /> + <Word from="Podji" to="Pođi" /> + <Word from="podji" to="pođi" /> + <Word from="podneses" to="podneseš" /> + <Word from="podocnjacima" to="podočnjacima" /> + <Word from="podocnjake" to="podočnjake" /> + <Word from="podstice" to="potiče" /> + <Word from="poduzeca" to="poduzeća" /> + <Word from="poduzece" to="poduzeće" /> + <Word from="poduzecu" to="poduzeću" /> + <Word from="pojesce" to="pojest će" /> + <Word from="pojiliste" to="pojilište" /> + <Word from="pokazi" to="pokaži" /> + <Word from="Pokazi" to="Pokaži" /> + <Word from="pokrece" to="pokreće" /> + <Word from="pokusaj" to="pokušaj" /> + <Word from="pokusam" to="pokušam" /> + <Word from="pokusas" to="pokušaš" /> + <Word from="poletis" to="poletiš" /> + <Word from="polozaja" to="položaja" /> + <Word from="polozaju" to="položaju" /> + <Word from="pomaci" to="pomaknuti" /> + <Word from="pomazes" to="pomažeš" /> + <Word from="pomislis" to="pomisliš" /> + <Word from="pomognes" to="pomogneš" /> + <Word from="poneses" to="poneseš" /> + <Word from="ponovis" to="ponoviš" /> + <Word from="poreci" to="poreći" /> + <Word from="porice" to="poriče" /> + <Word from="posalji" to="pošalji" /> + <Word from="Posalji" to="Pošalji" /> + <Word from="posaljite" to="pošaljite" /> + <Word from="posle" to="poslije" /> + <Word from="posluzili" to="poslužili" /> + <Word from="Posluzite" to="Poslužite" /> + <Word from="posluzite" to="poslužite" /> + <Word from="postaras" to="pobrineš" /> + <Word from="posto" to="pošto" /> + <Word from="Posto" to="Pošto" /> + <Word from="potece" to="poteče" /> + <Word from="potice" to="potiče" /> + <Word from="potici" to="potiči" /> + <Word from="potjece" to="potječe" /> + <Word from="potjecem" to="potječem" /> + <Word from="potjeces" to="potječeš" /> + <Word from="potpises" to="potpišeš" /> + <Word from="povedes" to="povedeš" /> + <Word from="pozuda" to="požuda" /> + <Word from="pozude" to="požude" /> + <Word from="pozudi" to="požudi" /> + <Word from="pozudu" to="požudu" /> + <Word from="prakticno" to="praktično" /> + <Word from="premasuje" to="premašuje" /> + <Word from="premasuju" to="premašuju" /> + <Word from="preporuca" to="preporučuje" /> + <Word from="presao" to="prešao" /> + <Word from="presjecen" to="presječen" /> + <Word from="Previse" to="Previše" /> + <Word from="previse" to="previše" /> + <Word from="preziveo" to="preživio" /> + <Word from="Priblizi" to="Približi" /> + <Word from="price" to="priče" /> + <Word from="prici" to="priči" /> + <Word from="pricu" to="priču" /> + <Word from="Pridji" to="Priđi" /> + <Word from="pridji" to="priđi" /> + <Word from="prijeci" to="prijeći" /> + <Word from="prijedi" to="prijeđi" /> + <Word from="prilazis" to="prilaziš" /> + <Word from="prisao" to="prišao" /> + <Word from="priusti" to="priušti" /> + <Word from="priustimo" to="priuštimo" /> + <Word from="priustiti" to="priuštiti" /> + <Word from="proci" to="proći" /> + <Word from="prodavac" to="prodavač" /> + <Word from="promasio" to="promašio" /> + <Word from="Promasio" to="Promašio" /> + <Word from="prosao" to="prošao" /> + <Word from="prosla" to="prošla" /> + <Word from="Prosle" to="Prošle" /> + <Word from="prosle" to="prošle" /> + <Word from="prosli" to="prošli" /> + <Word from="Prosli" to="Prošli" /> + <Word from="proslim" to="prošlim" /> + <Word from="proslo" to="prošlo" /> + <Word from="Proslo" to="Prošlo" /> + <Word from="provedes" to="provedeš" /> + <Word from="provlaci" to="provlači" /> + <Word from="provlacimo" to="provlačimo" /> + <Word from="pticica" to="ptičica" /> + <Word from="pticicu" to="ptičicu" /> + <Word from="pucini" to="pučini" /> + <Word from="pupcanu" to="pupčanu" /> + <Word from="pusac" to="pušač" /> + <Word from="pusaci" to="pušači" /> + <Word from="pusi" to="puši" /> + <Word from="pusimo" to="pušimo" /> + <Word from="pusite" to="pušite" /> + <Word from="pustam" to="puštam" /> + <!--r--> + <Word from="racunare" to="računala" /> + <Word from="racunari" to="računala" /> + <Word from="radis" to="radiš" /> + <Word from="Radis" to="Radiš" /> + <Word from="raskosni" to="raskošni" /> + <Word from="razumes" to="razumiješ" /> + <Word from="Razumes" to="Razumiješ" /> + <Word from="rec" to="riječ" /> + <Word from="rece" to="reče" /> + <Word from="Receno" to="Rečeno" /> + <Word from="receno" to="rečeno" /> + <Word from="recima" to="riječima" /> + <Word from="resimo" to="riješimo" /> + <Word from="rijec" to="riječ" /> + <Word from="Rijeci" to="Riječi" /> + <Word from="rijedji" to="rjeđi" /> + <Word from="rjedji" to="rjeđi" /> + <Word from="Rjesit" to="Riješit" /> + <Word from="rodena" to="rođena" /> + <Word from="rodeni" to="rođeni" /> + <Word from="rodis" to="rodiš" /> + <Word from="rodjen" to="rođen" /> + <Word from="rucno" to="ručno" /> + <Word from="ruza" to="ruža" /> + <Word from="ruzan" to="ružan" /> + <Word from="ruzu" to="ružu" /> + <!-- s --> + <Word from="sadrze" to="sadrže" /> + <Word from="sadrzi" to="sadrži" /> + <Word from="salje" to="šalje" /> + <Word from="saljes" to="šalješ" /> + <Word from="salju" to="šalju" /> + <Word from="sasila" to="sašila" /> + <Word from="sasili" to="sašili" /> + <Word from="sasio" to="sašio" /> + <Word from="sasiti" to="sašiti" /> + <Word from="savescu" to="savješću" /> + <Word from="savijescu" to="savješću" /> + <Word from="sedeces" to="sjedit ćeš" /> + <Word from="sedis" to="sjediš" /> + <Word from="sedista" to="sjedala" /> + <Word from="sediste" to="sjedište" /> + <Word from="sendvic" to="sendvič" /> + <Word from="sesir" to="šešir" /> + <Word from="sesirom" to="šeširom" /> + <Word from="sest" to="šest" /> + <Word from="setala" to="šetala" /> + <Word from="setam" to="šetam" /> + <Word from="setis" to="sjetiš" /> + <Word from="seva" to="ševa" /> + <Word from="sevu" to="ševu" /> + <Word from="sezdeset" to="šezdeset" /> + <Word from="Sidji" to="Siđi" /> + <Word from="sidji" to="siđi" /> + <Word from="sijecanj" to="siječanj" /> + <Word from="siroki" to="široki" /> + <Word from="sjecaju" to="sjećaju" /> + <Word from="sjecam" to="sjećam" /> + <Word from="Sjecam" to="Sjećam" /> + <Word from="sjecanja" to="sjećanja" /> + <Word from="sjecanje" to="sjećanje" /> + <Word from="skace" to="skače" /> + <Word from="skaci" to="skači" /> + <Word from="skacu" to="skaču" /> + <Word from="sklanjas" to="sklanjaš" /> + <Word from="sklonoscu" to="sklonošću" /> + <Word from="sklupcam" to="sklupčam" /> + <Word from="skola" to="škola" /> + <Word from="Skola" to="Škola" /> + <Word from="Skotska" to="Škotska" /> + <Word from="Skotskoj" to="Škotskoj" /> + <Word from="skrt" to="škrt" /> + <Word from="skrte" to="škrte" /> + <Word from="skrusena" to="skrušena" /> + <Word from="Skrusena" to="Skrušena" /> + <Word from="sledeca" to="sljedeća" /> + <Word from="Sledece" to="Sljedeće" /> + <Word from="sledeci" to="sljedeći" /> + <Word from="Sledeci" to="Sljedeći" /> + <Word from="slicno" to="slično" /> + <Word from="sljedeci" to="sljedeći" /> + <Word from="Sljedeci" to="Sljedeći" /> + <Word from="slozila" to="složila" /> + <Word from="slozili" to="složili" /> + <Word from="slozio" to="složio" /> + <Word from="sloziti" to="složiti" /> + <Word from="slucaja" to="slučaja" /> + <Word from="Smatras" to="Smatraš" /> + <Word from="smatras" to="smatraš" /> + <Word from="smece" to="smeće" /> + <Word from="smeda" to="smeđa" /> + <Word from="smedem" to="smeđem" /> + <Word from="smedi" to="smeđi" /> + <Word from="smedoj" to="smeđoj" /> + <Word from="smedu" to="smeđu" /> + <Word from="smesak" to="smješak" /> + <Word from="Smijes" to="Smiješ" /> + <Word from="smijes" to="smiješ" /> + <Word from="smionoscu" to="smionošću" /> + <Word from="smraci" to="smrači" /> + <Word from="smracilo" to="smračilo" /> + <Word from="smrcu" to="smrću" /> + <Word from="snimacete" to="snimat ćete" /> + <Word from="sokiras" to="šokiraš" /> + <Word from="spases" to="spasiš" /> + <Word from="Spases" to="Spasiš" /> + <Word from="spavaca" to="spavaća" /> + <Word from="spavacoj" to="spavaćoj" /> + <Word from="spominjes" to="spominješ" /> + <Word from="spustamo" to="spuštamo" /> + <Word from="srdacan" to="srdačan" /> + <Word from="srecom" to="srećom" /> + <Word from="sresce" to="srest će" /> + <Word from="srešce" to="srest će" /> + <Word from="srljas" to="srljaš" /> + <Word from="Sta" to="Što" /> + <Word from="sta" to="što" /> + <Word from="stab" to="stožer" /> + <Word from="Stab" to="Stožer" /> + <Word from="stagod" to="što god" /> + <Word from="stampa" to="tisak" /> + <Word from="stampati" to="tiskati" /> + <Word from="stampi" to="tisku" /> + <Word from="stampom" to="tiskom" /> + <Word from="stampu" to="tisak" /> + <Word from="standa" to="štanda" /> + <Word from="standu" to="štandu" /> + <Word from="stavis" to="staviš" /> + <Word from="Stavise" to="Štoviše" /> + <Word from="Stavićemo" to="Stavit ćemo" /> + <Word from="steceni" to="stečeni" /> + <Word from="stezuci" to="stežući" /> + <Word from="stici" to="stići" /> + <Word from="stojis" to="stojiš" /> + <Word from="Stojis" to="Stojiš" /> + <Word from="stp" to="što" /> + <Word from="strasan" to="strašan" /> + <Word from="strasno" to="strašno" /> + <Word from="sudeci" to="sudeći" /> + <Word from="sudenja" to="suđenja" /> + <Word from="sudenje" to="suđenje" /> + <Word from="sudenju" to="suđenju" /> + <Word from="sugerisu" to="predlažu" /> + <Word from="sumnjas" to="sumnjaš" /> + <Word from="sumska" to="šumska" /> + <Word from="sumski" to="šumski" /> + <Word from="sumskoj" to="šumskoj" /> + <Word from="supak" to="šupak" /> + <Word from="suraduj" to="surađuj" /> + <Word from="suraduje" to="surađuje" /> + <Word from="suradujemo" to="surađujemo" /> + <Word from="suraduju" to="surađuju" /> + <Word from="Suraduj" to="Surađuj" /> + <Word from="Suraduje" to="Surađuje" /> + <Word from="Suradujemo" to="Surađujemo" /> + <Word from="Suraduju" to="Surađuju" /> + <Word from="sustina" to="bit" /> + <Word from="sustine" to="biti" /> + <Word from="sustini" to="biti" /> + <Word from="Sustine" to="Biti" /> + <Word from="Sustini" to="Biti" /> + <Word from="Sustinom" to="Biti" /> + <Word from="sustinom" to="biti" /> + <Word from="sustinski" to="bitni" /> + <Word from="suti" to="šuti" /> + <Word from="Suti" to="Šuti" /> + <Word from="svacije" to="svačije" /> + <Word from="svaciji" to="svačiji" /> + <Word from="svaciju" to="svačiju" /> + <Word from="svecan" to="svečan" /> + <Word from="svecani" to="svečani" /> + <Word from="svez" to="svjež" /> + <Word from="sveza" to="svježa" /> + <Word from="svezu" to="svježu" /> + <Word from="svezi" to="svježi" /> + <Word from="sveze" to="svježe" /> + <Word from="svezim" to="svježim" /> + <Word from="svezom" to="svježom" /> + <Word from="svezoj" to="svježoj" /> + <Word from="svezinom" to="svježinom" /> + <Word from="svezina" to="svježina" /> + <Word from="svezinu" to="svježinu" /> + <Word from="svezini" to="svježini" /> + <Word from="svezine" to="svježine" /> + <Word from="Svida" to="Sviđa" /> + <Word from="svidala" to="sviđala" /> + <Word from="svidalo" to="sviđalo" /> + <Word from="svidam" to="sviđam" /> + <Word from="svidao" to="sviđao" /> + <Word from="sviras" to="sviraš" /> + <!--t--> + <Word from="taknes" to="takneš" /> + <Word from="takode" to="također" /> + <Word from="takoder" to="također" /> + <Word from="takodje" to="također" /> + <Word from="Takodje" to="Također" /> + <Word from="tece" to="teče" /> + <Word from="teska" to="teška" /> + <Word from="Teska" to="Teška" /> + <Word from="teske" to="teške" /> + <Word from="teski" to="teški" /> + <Word from="tesko" to="teško" /> + <Word from="Tesko" to="Teško" /> + <Word from="teskom" to="teškom" /> + <Word from="tezak" to="težak" /> + <Word from="Tezak" to="Težak" /> + <Word from="teze" to="teže" /> + <Word from="tezi" to="teži" /> + <Word from="Tezi" to="Teži" /> + <Word from="tezimo" to="težimo" /> + <Word from="Tezimo" to="Težimo" /> + <Word from="tezinu" to="težinu" /> + <Word from="tezis" to="težiš" /> + <Word from="Teziš" to="Težiš" /> + <Word from="tisuce" to="tisuće" /> + <Word from="tisucu" to="tisuću" /> + <Word from="Tocak" to="Kotač" /> + <Word from="tocak" to="kotač" /> + <Word from="tocka" to="točka" /> + <Word from="tocku" to="točku" /> + <Word from="trajace" to="trajat će" /> + <Word from="Trajace" to="Trajat će" /> + <Word from="trazis" to="tražiš" /> + <Word from="trcao" to="trčao" /> + <Word from="trce" to="trče" /> + <Word from="Trce" to="Trče" /> + <Word from="trci" to="trči" /> + <Word from="Trci" to="Trči" /> + <Word from="trcim" to="trčim" /> + <Word from="Trcim" to="Trčim" /> + <Word from="trcimo" to="trčimo" /> + <Word from="trebas" to="trebaš" /> + <Word from="Trebas" to="Trebaš" /> + <Word from="treci" to="treći" /> + <Word from="tricarija" to="tričarija" /> + <Word from="trudis" to="trudiš" /> + <Word from="trunuce" to="trunut će" /> + <Word from="tuce" to="tuče" /> + <Word from="tuces" to="tučeš" /> + <Word from="tucom" to="tučom" /> + <Word from="tucu" to="tučnjavu" /> + <Word from="tudje" to="tuđe" /> + <Word from="tudjeg" to="tuđeg" /> + <Word from="tudoj" to="tuđoj" /> + <Word from="tudom" to="tuđom" /> + <Word from="tudjem" to="tuđem" /> + <Word from="tudem" to="tuđem" /> + <Word from="tumaras" to="tumaraš" /> + <Word from="tvoris" to="tvoriš" /> + <!--u--> + <Word from="ubedjuju" to="uvjeravaju" /> + <Word from="ubijes" to="ubiješ" /> + <Word from="Ubijes" to="Ubiješ" /> + <Word from="uceni" to="učeni" /> + <Word from="uci" to="ući" /> + <Word from="ucine" to="učine" /> + <Word from="ucinimo" to="učinimo" /> + <Word from="ucinio" to="učinio" /> + <Word from="ucio" to="učio" /> + <Word from="Ucio" to="Učio" /> + <Word from="udas" to="udaš" /> + <Word from="udete" to="uđete" /> + <Word from="udeš" to="udeš" /> + <Word from="udi" to="uđi" /> + <Word from="Udi" to="Uđi" /> + <Word from="Udje" to="Uđe" /> + <Word from="udje" to="uđe" /> + <Word from="udjes" to="uđeš" /> + <Word from="ugriscu" to="ugrist ću" /> + <Word from="ukljestena" to="ukliještena" /> + <Word from="ukljucujuci" to="uključujući" /> + <Word from="umes" to="umiješ" /> + <Word from="umiruci" to="umirući" /> + <Word from="umrecu" to="umrijet ću" /> + <Word from="umres" to="umreš" /> + <Word from="unistice" to="uništit će" /> + <Word from="uopce" to="uopće" /> + <Word from="Uopce" to="Uopće" /> + <Word from="Uopste" to="Uopće" /> + <Word from="uopste" to="uopće" /> + <Word from="upoznas" to="upoznaš" /> + <Word from="uradis" to="učiniš" /> + <Word from="usao" to="ušao" /> + <Word from="Usao" to="Ušao" /> + <Word from="usli" to="ušli" /> + <Word from="Usmjerice" to="Usmjerit će" /> + <Word from="uspanicio" to="uspaničio" /> + <Word from="utapas" to="utapaš" /> + <Word from="utesi" to="utješi" /> + <Word from="utesim" to="utješim" /> + <Word from="uzinu" to="užinu" /> + <Word from="uzivo" to="uživo" /> + <!--v--> + <Word from="valda" to="valjda" /> + <Word from="vasa" to="vaša" /> + <Word from="vaseg" to="vašeg" /> + <Word from="Vaseg" to="Vašeg" /> + <Word from="vasem" to="vašem" /> + <Word from="vasi" to="vaši" /> + <Word from="vasoj" to="vašoj" /> + <Word from="vazi" to="vrijedi" /> + <Word from="Vec" to="Već" /> + <Word from="vec" to="već" /> + <Word from="vecan" to="vječan" /> + <Word from="vecera" to="večera" /> + <Word from="Veceras" to="Večeras" /> + <Word from="veceras" to="večeras" /> + <Word from="vecere" to="večere" /> + <Word from="veceri" to="večeri" /> + <Word from="veceru" to="večeru" /> + <Word from="vecih" to="većih" /> + <Word from="vecitim" to="vječitim" /> + <Word from="vecna" to="vječna" /> + <Word from="vecno" to="vječno" /> + <Word from="vecnost" to="vječnost" /> + <Word from="verovacu" to="vjerovat ću" /> + <Word from="vice" to="viče" /> + <Word from="vicem" to="vičem" /> + <Word from="vicemo" to="vičemo" /> + <Word from="vices" to="vičeš" /> + <Word from="vicete" to="vičete" /> + <Word from="viden" to="viđen" /> + <Word from="Viden" to="Viđen" /> + <Word from="vishe" to="više" /> + <Word from="vjencali" to="vjenčali" /> + <Word from="vjencati" to="vjenčati" /> + <Word from="vjerujes" to="vjeruješ" /> + <Word from="Vjerujes" to="Vjeruješ" /> + <Word from="vjetrenjace" to="vjetrenjače" /> + <Word from="voce" to="voće" /> + <Word from="vocka" to="voćka" /> + <Word from="vocku" to="voćku" /> + <Word from="vocnjak" to="voćnjak" /> + <Word from="vocnjaku" to="voćnjaku" /> + <Word from="vodic" to="vodič" /> + <Word from="vodju" to="vođu" /> + <Word from="vozac" to="vozač" /> + <Word from="Vozac" to="Vozač" /> + <Word from="vozaca" to="vozača" /> + <Word from="vracam" to="vraćam" /> + <Word from="vracen" to="vračen" /> + <Word from="vrazja" to="vražja" /> + <Word from="vrazji" to="vražji" /> + <Word from="vreca" to="vreča" /> + <Word from="vrece" to="vreće" /> + <Word from="vrecu" to="vreću" /> + <Word from="vredja" to="vrijeđa" /> + <Word from="vredjanje" to="vrijeđanje" /> + <Word from="vrtic" to="vrtić" /> + <Word from="vrtica" to="vrtića" /> + <Word from="vrticu" to="vrtiću" /> + <!--z--> + <Word from="zacepe" to="začepe" /> + <Word from="Zacepi" to="Začepi" /> + <Word from="Zadrzi" to="Zadrži" /> + <Word from="zadrzi" to="zadrži" /> + <Word from="zaduzen" to="zadužen" /> + <Word from="Zaduzen" to="Zadužen" /> + <Word from="zagrlis" to="zagrliš" /> + <Word from="zaljenja" to="žaljenja" /> + <Word from="zaljenje" to="žaljenje" /> + <Word from="zalosna" to="žalosna" /> + <Word from="Zalosna" to="Žalosna" /> + <Word from="zaokruzi" to="zaokruži" /> + <Word from="zaokruzim" to="zaokružim" /> + <Word from="zaokruzimo" to="zaokružimo" /> + <Word from="zapoceli" to="započeli" /> + <Word from="zarucen" to="zaručen" /> + <Word from="zasto" to="zašto" /> + <Word from="Zasto" to="Zašto" /> + <Word from="zateci" to="zateći" /> + <Word from="zatvoris" to="zatvoriš" /> + <Word from="zdrebe" to="ždrijebe" /> + <Word from="Zele" to="Žele" /> + <Word from="zele" to="žele" /> + <Word from="Zeleci" to="Želeći" /> + <Word from="zelila" to="željela" /> + <Word from="Zelis" to="Želiš" /> + <Word from="zelis" to="želiš" /> + <Word from="zene" to="žene" /> + <Word from="zenke" to="ženke" /> + <Word from="zesce" to="žešće" /> + <Word from="zezas" to="zezaš" /> + <Word from="zita" to="žita" /> + <Word from="zito" to="žito" /> + <Word from="zitu" to="žitu" /> + <Word from="ziv" to="živ" /> + <Word from="ziva" to="živa" /> + <Word from="zive" to="žive" /> + <Word from="zivi" to="živi" /> + <Word from="zivis" to="živiš" /> + <Word from="zivjeo" to="živio" /> + <Word from="Zivjeo" to="Živio" /> + <Word from="zmureo" to="žmirio" /> + <Word from="znacaj" to="značaj" /> + <Word from="znacaja" to="značaja" /> + <Word from="znace" to="znače" /> + <Word from="znaceš" to="znat ćeš" /> + <Word from="znas" to="znaš" /> + <Word from="Znas" to="Znaš" /> + <Word from="zuris" to="zuriš" /> + <Word from="zutoj" to="žutoj" /> + <Word from="zvanican" to="služben" /> + <Word from="ćes" to="ćeš" /> + <Word from="ćte" to="ćete" /> + <Word from="Čime" to="Čime" /> + <Word from="želis" to="želiš" /> + <Word from="Živeo" to="Živio" /> + </WholeWords> + <PartialWordsAlways /> + <PartialWords /> + <PartialLines> + <LinePart from="da nadjem" to="naći" /> + <LinePart from="da nadjes" to="naći" /> + <LinePart from="da budes" to="biti" /> + <LinePart from="da ides" to="ići" /> + <LinePart from="da prodemo" to="proći" /> + <LinePart from="da udem" to="ući" /> + <LinePart from="gdje ides" to="kamo ideš" /> + <LinePart from="Gdje ides" to="Kamo ideš" /> + <LinePart from="hocu da budem" to="želim biti" /> + <LinePart from="Hocu da budem" to="Želim biti" /> + <LinePart from="hocu da kazem" to="želim reći" /> + <LinePart from="hoces da kazes" to="želiš reći" /> + <LinePart from="hoce da kaze" to="želi reći" /> + <LinePart from="kao sto sam" to="kao što sam" /> + <LinePart from="me leda" to="me leđa" /> + <LinePart from="medu nama" to="među nama" /> + <LinePart from="moramo da idemo" to="moramo ići" /> + <LinePart from="moras da ides" to="moraš ići" /> + <LinePart from="na vecer" to="navečer" /> + <LinePart from="Na vecer" to="Navečer" /> + <LinePart from="ne cu" to="neću" /> + <LinePart from="ne ces" to="nećeš" /> + <LinePart from="nešto sto" to="nešto što"/> + <LinePart from="ono sto" to="ono što" /> + <LinePart from="Ono sto" to="Ono što" /> + <LinePart from="reci ću" to="reći ću" /> + <LinePart from="sto ti se ne" to="što ti se ne" /> + <LinePart from="sto vise" to="što više" /> + <LinePart from="sve sto" to="sve što" /> + <LinePart from="Zao mi" to="Žao mi" /> + <LinePart from="zao mi" to="žao mi" /> + <LinePart from="Zato sto" to="Zato što" /> + <LinePart from="zato sto" to="zato što" /> + <LinePart from="znas sto" to="znaš što" /> + <LinePart from="znaš sto" to="znaš što" /> + </PartialLines> + <PartialLinesAlways /> + <BeginLines /> + <EndLines /> + <WholeLines /> + <RegularExpressions> + <RegEx find="adas(?!v)" replaceWith="adaš" /> + <RegEx find="(?<![Pp]r|[Nn])adje(?!(v|n(e|u[olt]))\b)" replaceWith="ađe" /> + <RegEx find="ajuc" replaceWith="ajuć" /> + <RegEx find="ndj?el" replaceWith="nđel" /> + <RegEx find="(?<![ou])ndje" replaceWith="nđe" /> + <RegEx find="([0-9])-ogodisnj([aeiu])\b" replaceWith="$1-godišnj$2" /> + <RegEx find="(cetr|pet|ses)najst([aeiou]|i[mh]|o[mgj]|ima)\b" replaceWith="$1naest$2" /> + <RegEx find="ajsmijesnij" replaceWith="ajsmješnij" /> + <RegEx find="avljas" replaceWith="avljaš" /> + <RegEx find="bastensk" replaceWith="vrtn" /> + <RegEx find="beres" replaceWith="bereš" /> + <RegEx find="([bB])elesk" replaceWith="$1ilješk" /> + <RegEx find="([bB])elez" replaceWith="$1iljež" /> + <RegEx find="\b([bBpP])ice(s|mo|te)\b" replaceWith="$1it će$2" /> + <RegEx find="\b([bBpP])iti +c([ue]s?|emo|ete)\b" replaceWith="$1it ć$2" /> + <RegEx find="eznadez" replaceWith="eznad" /> + <RegEx find="([bB])ezanj" replaceWith="$1ježanj" /> + <RegEx find="([bB])i?j?ez([ei]|i[ms]|imo|ite|ao|al[aeio]|ati)\b" replaceWith="$1jež$2" /> + <RegEx find="boljs" replaceWith="boljš" /> + <RegEx find="([bB])oric" replaceWith="$1orit ć" /> + <RegEx find="([bB])ozij" replaceWith="$1ožj" /> + <RegEx find="[bB]o[zž]ic([aeiun]|em|ima)?\b" replaceWith="Božić$1" /> + <RegEx find="udu[cč]" replaceWith="uduć" /> + <RegEx find="([cCsS])vj?ec([aeiou]|[oe]m|ama)\b" replaceWith="$1vijeć$2" /> + <RegEx find="[Cc]acka" replaceWith="čačka" /> + <RegEx find="[cC]amac" replaceWith="čamac" /> + <RegEx find="[cC]amc" replaceWith="čamc" /> + <RegEx find="\bcaro" replaceWith="čaro" /> + <RegEx find="Caroli(?!n)" replaceWith="Čaroli" /> + <RegEx find="cast" replaceWith="čast" /> + <RegEx find="Cast" replaceWith="Čast" /> + <RegEx find="cas([au]|om|ovima)\b" replaceWith="sat$1" /> + <RegEx find="Cas([au]|om|ovima)\b" replaceWith="Sat$1" /> + <RegEx find="[cC]ascen" replaceWith="čašćen" /> + <RegEx find="[cC]ek" replaceWith="ček" /> + <RegEx find="[cC]ekov" replaceWith="čekov" /> + <RegEx find="[cC]etvrt" replaceWith="četvrt" /> + <RegEx find="cetv" replaceWith="četv" /> + <RegEx find="Cetv" replaceWith="Četv" /> + <RegEx find="[cC]ist" replaceWith="čist" /> + <RegEx find="[cC]isce" replaceWith="čišće" /> + <RegEx find="[cC]ita" replaceWith="čita" /> + <RegEx find="\bcin" replaceWith="čin" /> + <RegEx find="\bCin" replaceWith="Čin" /> + <RegEx find="[cCČč]istoc" replaceWith="čistoć" /> + <RegEx find="[cC]lan" replaceWith="član" /> + <RegEx find="[cC]okolad" replaceWith="čokolad" /> + <RegEx find="[cC]ovi?j?ek" replaceWith="čovjek" /> + <RegEx find="[cC]uda" replaceWith="čuda" /> + <RegEx find="[cC]udes" replaceWith="čudes" /> + <RegEx find="[cC]udn" replaceWith="čudn" /> + <RegEx find="[cCČč]udovi[sš]" replaceWith="čudoviš" /> + <RegEx find="\b[cC]uje" replaceWith="čuje" /> + <RegEx find="(?<!a)cuje" replaceWith="čuje" /> + <RegEx find="[cC]u([vl])a" replaceWith="ču$1a" /> + <RegEx find="cut([ei])" replaceWith="šut$1" /> + <RegEx find="Cut([ei])" replaceWith="Šut$1" /> + <RegEx find="cuta([ltšv])" replaceWith="šutje$1" /> + <RegEx find="Cuta([ltšv])" replaceWith="Šutje$1" /> + <RegEx find="[cC]vrst" replaceWith="čvrst" /> + <RegEx find="\b([dD])ac([eu])" replaceWith="$1at ć$2" /> + <RegEx find="dj?avol" replaceWith="vrag" /> + <RegEx find="([Dd])eck" replaceWith="$1ečk" /> + <RegEx find="vojcic" replaceWith="vojčic" /> + <RegEx find="\b([dD])elic" replaceWith="$1jelić" /> + <RegEx find="\b([dD])elimc" replaceWith="$1jelić" /> + <RegEx find="\b([dD])j?elis\b" replaceWith="$1ijeliš" /> + <RegEx find="\b([dD])ecic([aeiou]|om)\b" replaceWith="$1ječic$2" /> + <RegEx find="([dD])j?eca([kc])" replaceWith="$1ječa$2" /> + <RegEx find="([dD])eci?j([aeiou])" replaceWith="$1ječj$2" /> + <RegEx find="\b([dD])esic" replaceWith="$1ogodit ć" /> + <RegEx find="dnoslj" replaceWith="dnošlj" /> + <RegEx find="\b([dD])omac" replaceWith="$1omać" /> + <RegEx find="([ao])gada" replaceWith="$1gađa" /> + <RegEx find="saduj" replaceWith="sađuj" /> + <RegEx find="\b([dD])rustv" replaceWith="$1ruštv" /> + <RegEx find="drzim" replaceWith="držim" /> + <RegEx find="([dD])o[bc]ic([eu])" replaceWith="$1oći ć$2" /> + <RegEx find="\b([dDpP])o(d?)nj?ec([eu])" replaceWith="$1o$2nijet ć$3" /> + <RegEx find="ovesc([eu])" replaceWith="ovest ć$1" /> + <RegEx find="\bd[jz]ep" replaceWith="džep" /> + <RegEx find="\bD[jz]ep" replaceWith="Džep" /> + <!-- posao i pošao je drugačije pa ne može biti uopće u skripti --> + <RegEx find="([dD])osl([aio])\b" replaceWith="$1ošl$2" /> + <RegEx find="([dD])rza(?!k)" replaceWith="$1rža" /> + <RegEx find="druze" replaceWith="druže" /> + <RegEx find="\b([dD])us" replaceWith="$1uš" /> + <RegEx find="dzigeric" replaceWith="jetr" /> + <RegEx find="Dzigeric" replaceWith="Jetr" /> + <RegEx find="([dD])zinov" replaceWith="$1ivov" /> + <RegEx find="gipcan" replaceWith="gipćan" /> + <RegEx find="entise" replaceWith="entira" /> + <RegEx find="onise" replaceWith="onira" /> + <RegEx find="([gG])dj(?!e)" replaceWith="$1đ" /> + <RegEx find="ledac" replaceWith="ledat ć" /> + <RegEx find="([gG])oruc" replaceWith="$1oruć" /> + <RegEx find="(?<![pP])radj" replaceWith="rađ" /> + <RegEx find="\b([gG])rijesn" replaceWith="$1rješn" /> + <RegEx find="([gG])rj?esi([smotl])" replaceWith="$1riješi$2" /> + <RegEx find="([gG])reska" replaceWith="$1reška" /> + <RegEx find="([hH])o[cč]e([sš]|mo|te)?\b" replaceWith="$1oće$2" /> + <RegEx find="hri?scan" replaceWith="kršćan" /> + <RegEx find="Hri?scan" replaceWith="Kršćan" /> + <RegEx find="hronicn" replaceWith="kroničn" /> + <RegEx find="Hronicn" replaceWith="Kroničn" /> + <RegEx find="ijeci([lt])" replaceWith="iječi$1" /> + <RegEx find="gnorise" replaceWith="gnorira" /> + <RegEx find="gnori[sš]e[sš]" replaceWith="gnoriraš" /> + <RegEx find="\b([iI])mac([eu]|es|emo|ete)\b" replaceWith="$1mat ć$2" /> + <RegEx find="\b([iI])mas" replaceWith="$1maš" /> + <RegEx find="nsistirac" replaceWith="nzistirat ć" /> + <RegEx find="([iI])zadj" replaceWith="$1zađ" /> + <RegEx find="zbec" replaceWith="zbjeć" /> + <RegEx find="nadj?en" replaceWith="nađen" /> + <RegEx find="([iI])scezn" replaceWith="$1ščezn" /> + <RegEx find="(?<![ŠšSs])([Pp])rica" replaceWith="$1riča" /> + <RegEx find="([iI])znj?ec" replaceWith="$1znijet ć" /> + <RegEx find="zvesta" replaceWith="zvješta" /> + <RegEx find="jevandjelj" replaceWith="evanđelj" /> + <RegEx find="kasi[kc]" replaceWith="žlic" /> + <RegEx find="Kasi[kc]" replaceWith="Žlic" /> + <RegEx find="([kKLl])aze([mt])" replaceWith="$1aže$2" /> + <RegEx find="([kKLl])aze[sš]" replaceWith="$1ažeš" /> + <RegEx find="aznjava" replaceWith="ažnjava" /> + <RegEx find="kcerk[eio]" replaceWith="kćeri" /> + <RegEx find="Kcerk[eio]" replaceWith="Kćeri" /> + <RegEx find="kljuc" replaceWith="ključ" /> + <RegEx find="oledz" replaceWith="oledž" /> + <RegEx find="\b([kK])olicin" replaceWith="$1oličin" /> + <RegEx find="arise" replaceWith="ira" /> + <RegEx find="komsijsk" replaceWith="susjedn" /> + <RegEx find="onacn" replaceWith="onačn" /> + <RegEx find="centrise" replaceWith="centrira" /> + <RegEx find="centrisi" replaceWith="centriraj" /> + <RegEx find="trolise" replaceWith="trolira" /> + <RegEx find="([kK])ori[sš][tc]en" replaceWith="$1orišten" /> + <RegEx find="([kKTtSs])rece" replaceWith="$1reće" /> + <RegEx find="rivicn" replaceWith="aznen" /> + <RegEx find="krsten" replaceWith="kršten" /> + <RegEx find="([kK])uck" replaceWith="$1uj" /> + <RegEx find="([kK])uc([iueo]|no)" replaceWith="$1uć$2" /> + <RegEx find="kupic" replaceWith="kupit ć" /> + <RegEx find="\b([kK])rstask([aeiou]|om)?\b" replaceWith="$1rižarsk$2" /> + <RegEx find="\b([lL])j?eci([stol])?" replaceWith="$1iječi$2" /> + <RegEx find="([lL])j?ecni([kc])" replaceWith="$1iječni$2" /> + <RegEx find="\b([lL])j?ecen" replaceWith="$1iječen" /> + <RegEx find="\b([lL])aks" replaceWith="$1akš" /> + <RegEx find="laksava" replaceWith="akšava" /> + <RegEx find="([lL])eps" replaceWith="$1jepš" /> + <RegEx find="[lL]isce" replaceWith="lišće" /> + <RegEx find="([lL])ogic(?!i)" replaceWith="$1ogič" /> + <RegEx find="\blicn" replaceWith="osobn" /> + <RegEx find="\bLicn" replaceWith="Osobn" /> + <RegEx find="\b([lL])os([aeiu]|o[mj]|e[mg])" replaceWith="$1oš$2" /> + <RegEx find="udack([aeiou]|om)\b" replaceWith="uđa$1" /> + <RegEx find="mack" replaceWith="mačk" /> + <RegEx find="(?<![iI]|[kK]a)([mM])j?enjas\b" replaceWith="$1ijenjaš" /> + <RegEx find="([mM])ast([auoi](?!r))" replaceWith="$1ašt$2" /> + <!--** besmislicu ?**--> + <RegEx find="([mM])islic([eu])" replaceWith="$1islit ć$2" /> + <RegEx find="mislje" replaceWith="mišlje" /> + <RegEx find="([mM])j?esalic" replaceWith="$1iješalic" /> + <RegEx find="([mM])j?esa([jmns]|n[aio]|no[mgj]|nima?|mo|ju|njem|nju|l[aeio]|t[ei])\b" replaceWith="$1iješa$2" /> + <RegEx find="([mM])lj?ecn" replaceWith="$1liječn" /> + <RegEx find="\b([mMNn])oc([iuna])" replaceWith="$1oć$2" /> + <RegEx find="oguc" replaceWith="oguć" /> + <RegEx find="([mM])oras" replaceWith="$1oraš" /> + <RegEx find="([mM])orac([eu])" replaceWith="$1orat ć$2" /> + <RegEx find="otivise([mst])" replaceWith="otivira$1" /> + <RegEx find="medju" replaceWith="među" /> + <RegEx find="mjestaj" replaceWith="mještaj" /> + <RegEx find="([mMbB])oze" replaceWith="$1ože" /> + <RegEx find="([mM])o[zž]es" replaceWith="$1ožeš" /> + <RegEx find="([mM])racn" replaceWith="$1račn" /> + <RegEx find="([mM])rznj" replaceWith="$1ržnj" /> + <RegEx find="rzec" replaceWith="rzit ć" /> + <RegEx find="([mM])uci([mstol])" replaceWith="$1uči$2" /> + <RegEx find="uskar" replaceWith="uškar" /> + <RegEx find="uvas" replaceWith="otaš" /> + <RegEx find="muzick" replaceWith="glazben" /> + <RegEx find="Muzick" replaceWith="Glazben" /> + <RegEx find="([nNZz])acel" replaceWith="$1ačel" /> + <RegEx find="([nN])acin" replaceWith="$1ačin" /> + <RegEx find="(?<![iI])([nN])acic" replaceWith="$1aći ć" /> + <RegEx find="adji" replaceWith="ađi" /> + <RegEx find="aocit" replaceWith="aočit" /> + <RegEx find="avas" replaceWith="avaš" /> + <RegEx find="amj?enis" replaceWith="amijeniš" /> + <RegEx find="amesta" replaceWith="amješta" /> + <RegEx find="aocar(?!k)" replaceWith="aočal" /> + <RegEx find="(?<![[tT])apise" replaceWith="apiše" /> + <RegEx find="([nN])as([io])([mj])\b" replaceWith="$1aš$2" /> + <RegEx find="([nNvV])asi([mh])" replaceWith="$1aši$2" /> + <RegEx find="([nN])auci([mstl])" replaceWith="$1auči$2" /> + <RegEx find="(?<![[pP])aucic" replaceWith="aučit ć" /> + <RegEx find="naucn" replaceWith="znanstven" /> + <RegEx find="Naucn" replaceWith="Znanstven" /> + <RegEx find="([nN])a?zvac" replaceWith="$1azvat ć" /> + <RegEx find="([nN])eca([kc])" replaceWith="$1eća$2" /> + <RegEx find="\b([nN])ec([ue]|emo|ete)\b" replaceWith="$1eć$2" /> + <RegEx find="([Nn])eda[cč]" replaceWith="$1edać" /> + <RegEx find="(?<!j)emack" replaceWith="jemačk" /> + <RegEx find="rj?esen" replaceWith="riješen" /> + <RegEx find="eutralis[eu]" replaceWith="eutralizira" /> + <!-- ne diraj --> + <RegEx find="\b([nN])ista" replaceWith="$1išta" /> + <RegEx find="\b([nN])oc" replaceWith="$1oć" /> + <RegEx find="ovcan" replaceWith="ovčan" /> + <RegEx find="notez" replaceWith="notež" /> + <RegEx find="beca" replaceWith="beća" /> + <RegEx find="besen" replaceWith="bješen" /> + <RegEx find="bezbj?edjenj" replaceWith="siguranj" /> + <RegEx find="bezbj?edjivanj" replaceWith="siguravanj" /> + <RegEx find="bezbj?edjuje" replaceWith="sigurava" /> + <RegEx find="bidj" replaceWith="biđ" /> + <RegEx find="bicn" replaceWith="bičn" /> + <RegEx find="bozava" replaceWith="božava" /> + <RegEx find="([oO])brac(?!u)" replaceWith="$1brać" /> + <RegEx find="([oO])bracu" replaceWith="$1braču" /> + <RegEx find="bucen" replaceWith="bučen" /> + <RegEx find="\b([oO])caj" replaceWith="$1čaj" /> + <RegEx find="\b([oO])cev" replaceWith="$1čev" /> + <RegEx find="([oO])cek" replaceWith="$1ček" /> + <RegEx find="\b([oO])ci" replaceWith="$1či" /> + <RegEx find="dbacen" replaceWith="dbačen" /> + <RegEx find="([oO])dl([iu])can" replaceWith="$1dl$2can" /> + <RegEx find="\b([oO])dj?ec([aeiou]|om)" replaceWith="$1djeć$2" /> + <RegEx find="\b((?:[oO]|[pP]o|[rR]a|[sS]a)d?)sec" replaceWith="$1sjeć" /> + <RegEx find="dvesc([eu])" replaceWith="dvest ć$1" /> + <RegEx find="gadj?a" replaceWith="gađa" /> + <RegEx find="onizav" replaceWith="onižav" /> + <RegEx find="\b([oO])pci(?!j)" replaceWith="$1pći" /> + <RegEx find="rosti[cć]" replaceWith="rostit ć" /> + <RegEx find="ruzj" replaceWith="ružj" /> + <RegEx find="([oO])sj?e[cč]a" replaceWith="$1sjeća" /> + <RegEx find="slobodić" replaceWith="slobodit ć" /> + <RegEx find="([oO])sta[čć]([eu])" replaceWith="$1stat ć$2" /> + <RegEx find="([oO])svj?ez" replaceWith="$1svjež" /> + <RegEx find="tkri[cč]" replaceWith="tkrić" /> + <RegEx find="([oOSs])tici" replaceWith="$1tići" /> + <RegEx find="([oO])tis([al])" replaceWith="$1tiš$2" /> + <RegEx find="zledjen" replaceWith="zlijeđen" /> + <RegEx find="pam[cč]" replaceWith="pamć" /> + <RegEx find="([pP])az([nl])j" replaceWith="$1až$2j" /> + <RegEx find="\b([pP])j?es[cć]an" replaceWith="$1ješčan" /> + <RegEx find="([pP])esa([kc])" replaceWith="$1ješa$2" /> + <RegEx find="([pP](?:ita|lati|obrinu|okaza|oveza|rica))c" replaceWith="$1t ć" /> + <RegEx find="istolj" replaceWith="ištolj" /> + <RegEx find="isuc" replaceWith="išuć" /> + <RegEx find="pjevas" replaceWith="pjevaš" /> + <RegEx find="([pP])lasi([mslt])" replaceWith="$1laši$2" /> + <RegEx find="([pP])lace([sn])" replaceWith="$1laće$2" /> + <RegEx find="(?<![mM])ljacka" replaceWith="ljačka" /> + <RegEx find="prica" replaceWith="priča" /> + <RegEx find="([pP])obj?ec" replaceWith="$1objeć" /> + <RegEx find="objedis" replaceWith="obijediš" /> + <RegEx find="obacaj" replaceWith="obačaj" /> + <RegEx find="([pP])oce([tl])" replaceWith="$1oče$2" /> + <RegEx find="([pPTt])ocn" replaceWith="$1očn" /> + <RegEx find="\b([pP])o[dt]sj?etis?\b" replaceWith="$1odsjetiš" /> + <RegEx find="oducava" replaceWith="odučava" /> + <RegEx find="([pP])ogres" replaceWith="$1ogreš" /> + <RegEx find="([pP])ogrj?esi(o|l[aeio]|t[ei])?\b" replaceWith="$1ogriješi$2" /> + <RegEx find="okusa([jov])" replaceWith="okuša$1" /> + <RegEx find="([pP])omoc" replaceWith="$1omoć" /> + <RegEx find="([pP]o|[Ii]z)ludec" replaceWith="$1ludjet ć" /> + <RegEx find="([pP])onasa" replaceWith="$1onaša" /> + <RegEx find="porodicn" replaceWith="obiteljsk" /> + <RegEx find="Porodicn" replaceWith="Obiteljsk" /> + <RegEx find="([pP])os([lt])ac" replaceWith="$1os$2at ć" /> + <RegEx find="osten" replaceWith="ošten" /> + <RegEx find="(?<![gG])ostuje" replaceWith="oštuje" /> + <RegEx find="([pP])ostova" replaceWith="$1oštova" /> + <RegEx find="ovredj?en" replaceWith="ovrijeđen" /> + <RegEx find="([ao])vrj?edis" replaceWith="$1vrijediš" /> + <RegEx find="pozoris" replaceWith="kazališ" /> + <RegEx find="Pozoris" replaceWith="Kazališ" /> + <RegEx find="ozuri" replaceWith="ožuri" /> + <RegEx find="redjas" replaceWith="rijaš" /> + <RegEx find="redlaz" replaceWith="redlaž" /> + <RegEx find="(?<![Šš])([pP])rica" replaceWith="$1riča" /> + <RegEx find="rilicn" replaceWith="riličn" /> + <RegEx find="romj?enis" replaceWith="romijeniš" /> + <RegEx find="([pP](?:ri|od))sj?eca" replaceWith="$1sjeća" /> + <RegEx find="rosj?ec" replaceWith="rosječ" /> + <RegEx find="roslost" replaceWith="rošlost" /> + <RegEx find="([pP]r?[io])vesc" replaceWith="$1vest ć" /> + <RegEx find="rolec" replaceWith="roljeć" /> + <RegEx find="romj?eniš" replaceWith="romijeniš" /> + <RegEx find="ronac" replaceWith="ronać" /> + <RegEx find="([pP])ruzi([lt])" replaceWith="$1ruži$2" /> + <RegEx find="acun" replaceWith="ačun" /> + <RegEx find="azlicit" replaceWith="azličit" /> + <RegEx find="mislja" replaceWith="mišlja" /> + <RegEx find="azumijec" replaceWith="azumjeć" /> + <RegEx find="(?<!v)ecenic" replaceWith="ečenic" /> + <RegEx find="ecic" replaceWith="eći ć" /> + <RegEx find="rivlac" replaceWith="rivlač" /> + <RegEx find="([^d])rjesit" replaceWith="$1riješit" /> + <RegEx find="\b([rR])i?j?esava" replaceWith="$1ješava" /> + <RegEx find="([rR])i?j?esenj([aeiu])" replaceWith="$1ješenj$2" /> + <RegEx find="\b([rR])jec(i|ima)?\b" replaceWith="$1iječ$2" /> + <RegEx find="\b([rR])i?j?ecni([kc])" replaceWith="$1ječni$2" /> + <RegEx find="(?<!t)rocit" replaceWith="ročit" /> + <RegEx find="([dDrRvVg])odje" replaceWith="$1ođe" /> + <RegEx find="(?<![Cc])ucak" replaceWith="učak" /> + <RegEx find="ruce" replaceWith="ruče" /> + <RegEx find="rucio" replaceWith="ručio" /> + <RegEx find="arud[zž]bin" replaceWith="arudžb" /> + <RegEx find="([rR])uck([auo])" replaceWith="$1učk$2" /> + <RegEx find="\b([Rr])uca([lt])" replaceWith="$1uča$2" /> + <RegEx find="saceka" replaceWith="pričeka" /> + <RegEx find="Saceka" replaceWith="Pričeka" /> + <RegEx find="sagarep" replaceWith="mrkv" /> + <RegEx find="Sagarep" replaceWith="Mrkv" /> + <RegEx find="([sS])amoc" replaceWith="$1amoć" /> + <RegEx find="[sS]ans" replaceWith="šans" /> + <RegEx find="([sS])alj([eu])" replaceWith="$1alj$2" /> + <RegEx find="saobracaj(?!ac)" replaceWith="promet" /> + <RegEx find="Saobracaj(?!ac)" replaceWith="Promet" /> + <RegEx find="aosj?e[cč]a" replaceWith="uosjeća" /> + <RegEx find="aucesni([kc])" replaceWith="udioni$1" /> + <RegEx find="([sSZZ])avrs([ei])" replaceWith="$1avrš$2" /> + <RegEx find="azvac" replaceWith="azvat ć" /> + <RegEx find="azalj?eva" replaceWith="ažalijeva" /> + <RegEx find="\b([sS])eca([msšo]|mo|t[ei]|ju|l[aeio]|nj[aeu]|njem?)?\b" replaceWith="$1jeća$2" /> + <RegEx find="([sSŠš])ecer" replaceWith="šećer" /> + <RegEx find="([sS])edec" replaceWith="$1jedit ć" /> + <RegEx find="i[cč]u[sš]" replaceWith="ićuš" /> + <RegEx find="([sS])isark" replaceWith="češer" /> + <RegEx find="([sS])koci" replaceWith="$1koči" /> + <RegEx find="\b[sS]kol(?!a)" replaceWith="škol" /> + <RegEx find="([sS])li?j?ede[cč]" replaceWith="$1ljedeć" /> + <RegEx find="(?<!r)icn" replaceWith="ičn" /> + <RegEx find="([sS])lucaj" replaceWith="$1lučaj" /> + <RegEx find="([sS])lusa" replaceWith="$1luša" /> + <RegEx find="([sS])luz([eb])" replaceWith="$1luž$2" /> + <RegEx find="\b([sS])j?eca[sš]\b" replaceWith="$1jećaš" /> + <RegEx find="\b([sS])mj?es(n[aeiou]|no[mgj])\b" replaceWith="$1miješ$2" /> + <RegEx find="mestis" replaceWith="mjestiš" /> + <RegEx find="([sS])nazn" replaceWith="$1nažn" /> + <RegEx find="nizen" replaceWith="nižen" /> + <RegEx find="([sS])okira" replaceWith="šokira" /> + <RegEx find="spoljasnj?([aeiu])" replaceWith="vanjsk$1" /> + <RegEx find="Spoljasnj?([aeiu])" replaceWith="Vanjsk$1" /> + <RegEx find="pri?j?ecava" replaceWith="prječava" /> + <RegEx find="prj?ec([ei])" replaceWith="priječ$1" /> + <RegEx find="rdac" replaceWith="rdač" /> + <RegEx find="([sS])rec([aeiou])" replaceWith="$1reć$2" /> + <RegEx find="([sS])rec(a?)n" replaceWith="$1ret$2n" /> + <RegEx find="spijun" replaceWith="špijun" /> + <RegEx find="Spijun" replaceWith="Špijun" /> + <RegEx find="([sS])rusi" replaceWith="$1ruši" /> + <RegEx find="\b([sS])tac([eu])" replaceWith="$1tat ć$2" /> + <RegEx find="stanes" replaceWith="staneš" /> + <RegEx find="stomac" replaceWith="trbuš" /> + <RegEx find="Stomac" replaceWith="Trbuš" /> + <RegEx find="strasi" replaceWith="straši" /> + <RegEx find="trucn" replaceWith="tručn" /> + <RegEx find="sugerise" replaceWith="predlaže" /> + <RegEx find="Sugerise" replaceWith="Predlaže" /> + <RegEx find="vesteni([kc])" replaceWith="većeni$1" /> + <RegEx find="([Ss])olj" replaceWith="šalic" /> + <RegEx find="\bSpanij" replaceWith="Španjolsk" /> + <RegEx find="\bSpansk" replaceWith="Španjolsk" /> + <RegEx find="stabl" replaceWith="stožer" /> + <RegEx find="Stabl" replaceWith="Stožer" /> + <RegEx find="stamparsk" replaceWith="tiskovn" /> + <RegEx find="Stamparsk" replaceWith="Tiskovn" /> + <RegEx find="[sš]ticen" replaceWith="štićen" /> + <RegEx find="stedj?e" replaceWith="štedje" /> + <RegEx find="sicen" replaceWith="sićen" /> + <RegEx find="eskoc" replaceWith="eškoć" /> + <RegEx find="([sS])tize" replaceWith="$1tiže" /> + <RegEx find="uoci" replaceWith="uoči" /> + <RegEx find="\b([sS])uti" replaceWith="$1uti" /> + <RegEx find="([sS])vjez" replaceWith="$1vjež" /> + <RegEx find="resu([ct])" replaceWith="rešu$1" /> + <RegEx find="([DRVdrvg])odja" replaceWith="$1ođa" /> + <RegEx find="([sS])veći" replaceWith="$1vijeći" /> + <RegEx find="takmicenj" replaceWith="natjecanj" /> + <RegEx find="Takmicenj" replaceWith="Natjecanj" /> + <RegEx find="\b([tT])ac([an])" replaceWith="$1oč$2" /> + <RegEx find="ehnic(?!i)" replaceWith="ehnič" /> + <RegEx find="\b([tT])ice" replaceWith="$1iče" /> + <RegEx find="\b([tTSs])rcan" replaceWith="$1rčan" /> + <RegEx find="\b([tT])re[čc]in" replaceWith="$1rećin" /> + <RegEx find="\b([tTDd])rzis" replaceWith="$1ržiš" /> + <RegEx find="\b([tT])isin" replaceWith="$1išin" /> + <RegEx find="\b([tT])is([aeiu]|om|e[mg])\b" replaceWith="$1iš$2" /> + <RegEx find="\b([tT])raz([ei])" replaceWith="$1raž$2" /> + <RegEx find="\b([nN])etac([an])" replaceWith="$1etoč$2" /> + <RegEx find="\b([uU])cenj" replaceWith="$1čenj" /> + <RegEx find="\b([uU])ci([mntl])" replaceWith="$1či$2" /> + <RegEx find="([uU])ci([lt])" replaceWith="$1či$2" /> + <RegEx find="paljac" replaceWith="paljač" /> + <RegEx find="\b([uU])redj" replaceWith="$1ređ" /> + <RegEx find="([uU])spjes(an|n[aeiou]|no[mgj])" replaceWith="$1spješ$2" /> + <RegEx find="\b([uU])dje([mst])" replaceWith="$1đe$2" /> + <RegEx find="\b([uU])sl([aeio])" replaceWith="$1šl$2" /> + <RegEx find="\b([uU])zas(?!t)" replaceWith="$1žas" /> + <RegEx find="\b([uU])zec([eu])" replaceWith="$1zet ć$2" /> + <RegEx find="\b([uU])zmes" replaceWith="$1zmeš" /> + <RegEx find="\b([uU])ziva" replaceWith="$1živa" /> + <RegEx find="([vV])as([aeu]|o[jm])\b" replaceWith="$1aš$2" /> + <RegEx find="([vV]l?)azn([aeiu]|o[mgj])\b" replaceWith="$1ažn$2" /> + <RegEx find="([vV])ecn" replaceWith="$1ječn" /> + <RegEx find="([vV])e[cč]in" replaceWith="$1ećin" /> + <RegEx find="([vV])estin" replaceWith="$1ještin" /> + <RegEx find="elicin" replaceWith="eličin" /> + <RegEx find="\b([vV])i?j?enca" replaceWith="$1jenča" /> + <RegEx find="([vV])j?ezb" replaceWith="$1ježb" /> + <RegEx find="([vV])idj?ec" replaceWith="$1idjet ć" /> + <RegEx find="(?<!Da)([vV])idj?a" replaceWith="$1iđa" /> + <RegEx find="([vV])idis" replaceWith="$1idiš" /> + <RegEx find="\b([vV])ec([aeiu]|[ei]m|ima|o[mj])?\b" replaceWith="$1eć$2" /> + <!--pro/do/raz vezeš--> + <RegEx find="eze[sš]" replaceWith="ezeš" /> + <RegEx find="\b([vV])ise" replaceWith="$1iše" /> + <RegEx find="\b([vV])islj" replaceWith="$1iš" /> + <RegEx find="odj?enj(?!a[kc])" replaceWith="ođenj" /> + <RegEx find="([vV])olis" replaceWith="$1oliš" /> + <RegEx find="([vV])olj?ec" replaceWith="$1oljet ć" /> + <RegEx find="\b([vV])ozic([eu])" replaceWith="$1ozit ć$2" /> + <RegEx find="([vV])rac" replaceWith="$1rač" /> + <RegEx find="vrsen" replaceWith="vršen" /> + <RegEx find="\b([vV])ratic" replaceWith="$1ratit ć" /> + <RegEx find="zalost" replaceWith="žalost" /> + <RegEx find="zalosno" replaceWith="žalosno" /> + <RegEx find="zalosni" replaceWith="žalosni" /> + <RegEx find="zalosc" replaceWith="žalošć" /> + <RegEx find="gorca" replaceWith="gorča" /> + <RegEx find="ahtj?evas" replaceWith="ahtijevaš" /> + <RegEx find="\bz([ae])li" replaceWith="ž$1li" /> + <RegEx find="\bZ([ae])li" replaceWith="Ž$1li" /> + <RegEx find="[zZ]alic" replaceWith="žalit ć" /> + <RegEx find="apo[cč]mi" replaceWith="apočni" /> + <RegEx find="asluzuj" replaceWith="aslužuj" /> + <RegEx find="([zZ])astit" replaceWith="$1aštit" /> + <RegEx find="astrasujuc" replaceWith="astrašujuć" /> + <RegEx find="[zZ]edn" replaceWith="žedn" /> + <RegEx find="\b[zZ]en([aeui]|om|io|il[aei]|sk)" replaceWith="žen$1" /> + <RegEx find="[zZ]eli([mt])" replaceWith="želi$1" /> + <RegEx find="[zZ]ele([ltz])" replaceWith="želje$1" /> + <RegEx find="[zZ]elil" replaceWith="željel" /> + <RegEx find="[zZ]eli[sš]" replaceWith="želiš" /> + <!-- zaželio && poželio --> + <RegEx find="[zZ]elj?eo" replaceWith="želio" /> + <RegEx find="[zZ]elj([aeiou])" replaceWith="želj$1" /> + <RegEx find="\b[zZ]ive([lt])" replaceWith="živje$1" /> + <RegEx find="[zZ]ivec([eu])" replaceWith="živjet ć$1" /> + <RegEx find="([žŽ])ive([lt])" replaceWith="$1ivje$2" /> + <RegEx find="[zZ]ivi([mšt])" replaceWith="živi$1" /> + <RegEx find="\b[zZ]ivo([mgjt])" replaceWith="živo$1" /> + <RegEx find="[zZ]lj?ezd([aeiou])" replaceWith="žlijezd$1" /> + <RegEx find="\b([zZ])locin" replaceWith="$1ločin" /> + <RegEx find="([Zz])naci" replaceWith="$1nači" /> + <RegEx find="znajes" replaceWith="znaješ" /> + <RegEx find="([Zz])r?tv" replaceWith="žrtv" /> + <RegEx find="zur[ck]" replaceWith="zabav" /> + <RegEx find="Zur[ck]" replaceWith="Zabav" /> + <RegEx find="zvanicn" replaceWith="služben" /> + <RegEx find="Zvanicn" replaceWith="Služben" /> + <RegEx find="([zZ])vuca([lto])" replaceWith="$1vuča$2" /> + <RegEx find="\b([zZ])vuci" replaceWith="$1vuči" /> + <!-- yxy experimental --> + <RegEx find="acic" replaceWith="ačic" /> + <RegEx find="([aeiou])s([čć])" replaceWith="$1š$2" /> + <RegEx find="bracun" replaceWith="bračun" /> + <RegEx find="cupa" replaceWith="čupa" /> + <RegEx find="dajes" replaceWith="daješ" /> + <RegEx find="rosj?ecn" replaceWith="rosječn" /> + <RegEx find="([Rr])odj?en" replaceWith="$1ođen" /> + <RegEx find="jacanj" replaceWith="jačanj" /> + <RegEx find="zvecark" replaceWith="zvečark" /> + <RegEx find="locest" replaceWith="ločest" /> + <RegEx find="icn" replaceWith="ičn" /> + <RegEx find="zidem" replaceWith="ziđem" /> + <RegEx find="zludu" replaceWith="zluđu" /> + <RegEx find="zopacen" replaceWith="zopačen" /> + <RegEx find="eskuc" replaceWith="eskuć" /> + <RegEx find="([aez])vrsi" replaceWith="$1vrši" /> + <RegEx find="acma" replaceWith="ačma" /> + <RegEx find="aces" replaceWith="aćeš" /> + <RegEx find="ajvec" replaceWith="ajveć" /> + <RegEx find="amcen" replaceWith="amčen" /> + <RegEx find="antic([nk])" replaceWith="antič$1" /> + <RegEx find="aredu?j" replaceWith="aređ" /> + <RegEx find="arezlj" replaceWith="arežlj" /> + <RegEx find="aruci" replaceWith="aruči" /> + <RegEx find="avlac" replaceWith="avlač" /> + <RegEx find="azoc" replaceWith="azoč" /> + <RegEx find="bacen" replaceWith="bačen" /> + <RegEx find="bicaj" replaceWith="bičaj" /> + <RegEx find="bivse" replaceWith="bivše" /> + <RegEx find="blizn" replaceWith="bližn" /> + <RegEx find="buden" replaceWith="buđen" /> + <RegEx find="cemo" replaceWith="ćemo" /> + <RegEx find="ucestvuj" replaceWith="sudjeluj" /> + <RegEx find="cinje" replaceWith="činje" /> + <RegEx find="[Cc]injen" replaceWith="činjen" /> + <RegEx find="cisc" replaceWith="čišć" /> + <RegEx find="Cisc" replaceWith="Čišć" /> + <RegEx find="dacn" replaceWith="dačn" /> + <RegEx find="daces" replaceWith="dat ćeš" /> + <RegEx find="dinacn" replaceWith="dinačn" /> + <RegEx find="dlucn" replaceWith="dlučn" /> + <RegEx find="dlucuj" replaceWith="dlučuj" /> + <RegEx find="djem" replaceWith="đem" /> + <RegEx find="djit" replaceWith="đit" /> + <RegEx find="djuj" replaceWith="đuj" /> + <RegEx find="djujes" replaceWith="đuješ" /> + <RegEx find="draz([ao])" replaceWith="draž$1" /> + <RegEx find="(?<!a)druzi" replaceWith="druži" /> + <RegEx find="([dD])rzi([ia](?!k))" replaceWith="$1rž$2" /> + <RegEx find="e[cć]as" replaceWith="ećaš" /> + <RegEx find="emo[zž]e" replaceWith="e može" /> + <RegEx find="(?<![Rr])eces" replaceWith="ećeš" /> + <RegEx find="emoz" replaceWith="e mož" /> + <RegEx find="enadjen" replaceWith="enađen" /> + <RegEx find="erisu" replaceWith="eriraju" /> + <RegEx find="esavin" replaceWith="ešavin" /> + <RegEx find="estace[sš]" replaceWith="estat ćeš" /> + <RegEx find="ezoc" replaceWith="ezoč" /> + <RegEx find="fise" replaceWith="fira" /> + <RegEx find="frick" replaceWith="fričk" /> + <!-- popravlja i iz/nad/gledaš --> + <RegEx find="gledas" replaceWith="gledaš" /> + <RegEx find="granicava" replaceWith="graničava" /> + <RegEx find="grisc(?!i)" replaceWith="grist ć" /> + <RegEx find="guslj" replaceWith="gušlj" /> + <RegEx find="gusi" replaceWith="guši" /> + <RegEx find="(?<!\b[oO]zlo|\b[iI]sp(rip)?ov|i)jedjen" replaceWith="ijeđen" /> + <RegEx find="hic(k|en)" replaceWith="hić$1" /> + <RegEx find="hva[cč]a" replaceWith="hvaća" /> + <RegEx find="hva[cč]as" replaceWith="hvaćaš" /> + <RegEx find="hva([lt])is" replaceWith="hva$1iš" /> + <RegEx find="(?<![Gg]r|[Ll])icka" replaceWith="ička" /> + <RegEx find="(?<!M)ick([eoiu])" replaceWith="ičk$1" /> + <RegEx find="idja" replaceWith="iđa" /> + <RegEx find="idje([mv])" replaceWith="iđe$1" /> + <RegEx find="igrac" replaceWith="igrač" /> + <RegEx find="igraca" replaceWith="igrača" /> + <RegEx find="igrace" replaceWith="igrače" /> + <RegEx find="igraci" replaceWith="igrači" /> + <RegEx find="igracu" replaceWith="igraču" /> + <RegEx find="igraliste" replaceWith="igraliste" /> + <RegEx find="igralistu" replaceWith="igralistu" /> + <RegEx find="igralista" replaceWith="igralista" /> + <RegEx find="iznervira" replaceWith="iživcira" /> + <RegEx find="asnjav" replaceWith="ašnjav" /> + <RegEx find="jasnic([eu])" replaceWith="jasnit ć$1" /> + <RegEx find="juci" replaceWith="jući" /> + <RegEx find="kaslja" replaceWith="kašlja" /> + <RegEx find="krsi" replaceWith="krši" /> + <RegEx find="kruze" replaceWith="kruže" /> + <RegEx find="kusava" replaceWith="kušava" /> + <RegEx find="lican" replaceWith="ličan" /> + <RegEx find="lacen" replaceWith="lačen" /> + <RegEx find="l([ae])dj" replaceWith="l$1đ" /> + <RegEx find="mj?ecen" replaceWith="mjećen" /> + <RegEx find="([mv])edje" replaceWith="$1eđe" /> + <RegEx find="miruce" replaceWith="miruće" /> + <RegEx find="mec([eu])" replaceWith="meć$1" /> + <RegEx find="mrsav" replaceWith="mršav" /> + <RegEx find="naranc" replaceWith="naranč" /> + <RegEx find="nacenj" replaceWith="načenj" /> + <RegEx find="(?<![Rr]evo)lucio" replaceWith="lučio" /> + <RegEx find="(?<!sit)nisem" replaceWith="niram" /> + <RegEx find="(?<!sit)nises" replaceWith="niraš" /> + <RegEx find="([lrvn])adj" replaceWith="$1ađ" /> + <RegEx find="nise" replaceWith="nira" /> + <RegEx find="nisten" replaceWith="ništen" /> + <RegEx find="(?<![Ee]t|[Gg]e|[Rr]i|[Tt]am)noc" replaceWith="noć" /> + <RegEx find="oceju" replaceWith="oće" /> + <RegEx find="oceo" replaceWith="očeo" /> + <RegEx find="ocni" replaceWith="očni" /> + <RegEx find="o([mk])aze" replaceWith="o$1aže" /> + <RegEx find="/\bni[cć]k" replaceWith="ničk" /> + <RegEx find="nosc" replaceWith="nošć" /> + <RegEx find="sta([jn])es" replaceWith="sta$1eš" /> + <RegEx find="(?<!m)oroca" replaceWith="oroča" /> + <RegEx find="osvece" replaceWith="osveće" /> + <RegEx find="oti[cć]n" replaceWith="otičn" /> + <RegEx find="ozen" replaceWith="ožen" /> + <RegEx find="pecific" replaceWith="pecifič" /> + <RegEx find="plase" replaceWith="plaše" /> + <RegEx find="ptuz" replaceWith="ptuž" /> + <RegEx find="pustaj" replaceWith="puštaj" /> + <RegEx find="pustas" replaceWith="puštaš" /> + <RegEx find="pusten" replaceWith="pušten" /> + <RegEx find="racen" replaceWith="raćen" /> + <RegEx find="([auogz])raduj" replaceWith="$1rađuj" /> + <RegEx find="reden" replaceWith="ređen" /> + <RegEx find="redoce" replaceWith="redoče" /> + <RegEx find="rucin" replaceWith="rućin" /> + <RegEx find="([lr])adj" replaceWith="$1ađ" /> + <RegEx find="redje([nm])" replaceWith="ređe$1" /> + <RegEx find="ronad" replaceWith="ronađ" /> + <RegEx find="([KkPp])renes\b" replaceWith="$1reneš" /> + <RegEx find="sapni" replaceWith="šapni" /> + <RegEx find="setnj" replaceWith="šetnj" /> + <RegEx find="slusa" replaceWith="sluša" /> + <RegEx find="slusk" replaceWith="slušk" /> + <RegEx find="slj?edece" replaceWith="sljedeće" /> + <RegEx find="spesn" replaceWith="spješn" /> + <RegEx find="splac" replaceWith="splač" /> + <RegEx find="stand(?!a)" replaceWith="štand" /> + <RegEx find="sudj?en" replaceWith="suđen" /> + <RegEx find="tace" replaceWith="tat će" /> + <RegEx find="tces" replaceWith="t ćeš" /> + <RegEx find="teza([kv])" replaceWith="teža$1" /> + <RegEx find="tjesi" replaceWith="tješi" /> + <RegEx find="tocis" replaceWith="točiš" /> + <RegEx find="trazi([vo])" replaceWith="traži$1" /> + <RegEx find="trazuj" replaceWith="tražuj" /> + <RegEx find="trise" replaceWith="trira" /> + <RegEx find="trisi" replaceWith="triraj" /> + <RegEx find="tros([ek])" replaceWith="troš$1" /> + <RegEx find="tumaci" replaceWith="tumači" /> + <RegEx find="\b([DdtTRrNn])uzn" replaceWith="$1užn" /> + <RegEx find="\b([dtDTRr])uzan" replaceWith="$1užan" /> + <RegEx find="vrdj" replaceWith="vrđ" /> + <RegEx find="tvrden" replaceWith="tvrđen" /> + <RegEx find="\bujes\b" replaceWith="uješ" /> + <RegEx find="\bzes\b" replaceWith="žeš" /> + <RegEx find="ucis" replaceWith="učiš" /> + <RegEx find="ucice" replaceWith="učit će" /> + <RegEx find="(?<![Kk]lj)učiće" replaceWith="učit će" /> + <RegEx find="udiva" replaceWith="uđiva" /> + <RegEx find="udj([aiu])" replaceWith="uđ$1" /> + <RegEx find="([Uu])nisti" replaceWith="$1ništi" /> + <RegEx find="nistav" replaceWith="ništav" /> + <!--busenje je iznimka, ali bušenje nije, dakle češća riječ prevladava--> + <RegEx find="(?<![jk])us[cč]" replaceWith="ušć" /> + <RegEx find="usenj" replaceWith="ušenj" /> + <RegEx find="uspece" replaceWith="uspjet će" /> + <RegEx find="varas" replaceWith="varaš" /> + <RegEx find="vazn" replaceWith="važn" /> + <RegEx find="vadj" replaceWith="vađ" /> + <RegEx find="visis" replaceWith="visiš" /> + <RegEx find="([Vv])jecn" replaceWith="$1ječn" /> + <RegEx find="vjezb" replaceWith="vježb" /> + <RegEx find="(?<!p)rsten" replaceWith="ršten" /> + <RegEx find="vruc" replaceWith="vruć" /> + <!-- izvuče // razvuče // podvuče etc. --> + <RegEx find="vuce" replaceWith="vuče" /> + <RegEx find="\b([Sso])naci" replaceWith="$1naći" /> + <RegEx find="edjen" replaceWith="eđen" /> + <RegEx find="ziljk" replaceWith="žiljk" /> + <RegEx find="zitk" replaceWith="žitk" /> + <RegEx find="zgajivac" replaceWith="zgajivač" /> + <RegEx find="zogira" replaceWith="žogira" /> + <!-- preživeo/doživeo/nadživeo etc. --> + <RegEx find="zivj?e([lt])i" replaceWith="živje$1i" /> + <RegEx find="ziveo" replaceWith="živio" /> + <!-- pozoveš nazoveš sazoveš --> + <RegEx find="zoves" replaceWith="zoveš" /> + <RegEx find="zurb" replaceWith="žurb" /> + <RegEx find="Zurb" replaceWith="Žurb" /> + <RegEx find="zvucen" replaceWith="zvučen" /> + </RegularExpressions> +</OCRFixReplaceList> diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml index 4aedbabeb..2135ce878 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml @@ -592,6 +592,10 @@ <Word from="viljeg" to="vil jeg" /> <Word from="Sætjer" to="Sæt jer" /> <Word from="udsatham" to="udsat ham" /> + <Word from="afen" to="af en" /> + <Word from="påjorden" to="på jorden" /> + <Word from="afdem" to="af dem" /> + <Word from="kmt" to="km/t" /> </WholeWords> <PartialWordsAlways> <WordPart from="¤" to="o" /> diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml index 34e29504b..05adb1d9c 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml @@ -748,6 +748,7 @@ <Word from="jcke" to="joke" /> <Word from="jennifer" to="Jennifer" /> <Word from="joseph" to="Joseph" /> + <Word from="jsut" to="just" /> <Word from="Jumpthem" to="Jump them" /> <Word from="jusi" to="just" /> <Word from="jusl" to="just" /> @@ -2094,6 +2095,11 @@ <LinePart from="he)/" to="hey" /> <LinePart from="He)/" to="Hey" /> <LinePart from="HEA VY" to="HEAVY" /> + <LinePart from="Henry ll" to="Henry II" /> + <LinePart from="Henry lll" to="Henry III" /> + <LinePart from="Henry Vlll" to="Henry VIII" /> + <LinePart from="Henry Vll" to="Henry VII" /> + <LinePart from="Henry Vl" to="Henry VI" /> <LinePart from="Hold 0n" to="Hold on" /> <LinePart from="I am. ls" to="I am. Is" /> <LinePart from="I d0" to="I do" /> @@ -2260,6 +2266,13 @@ <LinePart from="wouldn 'tyou" to="wouldn't you" /> <LinePart from=" lgot it" to=" I got it" /> <LinePart from=" you,ve " to=" you've " /> + <LinePart from=" I ve " to=" I've " /> + <LinePart from=" I ii " to=" I'll " /> + <LinePart from=" I m " to=" I'm " /> + <LinePart from=" why d " to=" why'd " /> + <LinePart from=" couldn t " to=" couldn't " /> + <LinePart from=" that s " to=" that's " /> + <LinePart from=" i... " to=" I... " /> </PartialLines> <PartialLinesAlways> <LinePart from="forbest act" to="for best act" /> @@ -2358,6 +2371,15 @@ <Beginning from="lt'syour" to="It's your" /> <Beginning from="It'syour" to="It's your" /> <Beginning from="Ls " to="Is " /> + <Beginning from="I ve " to="I've " /> + <Beginning from="I ii " to="I'll " /> + <Beginning from="I m " to="I'm " /> + <Beginning from="Why d " to="Why'd " /> + <Beginning from="why d " to="Why'd " /> + <Beginning from="Couldn t " to="Couldn't " /> + <Beginning from="couldn t " to="Couldn't " /> + <Beginning from="That s " to="That's " /> + <Beginning from="that s " to="That's " /> </BeginLines> <EndLines> <Ending from=", sin" to=", sir." /> @@ -2366,6 +2388,8 @@ <Ending from=" openiL" to=" open it." /> <Ending from=" offl" to=" off!" /> <Ending from="pshycol" to="psycho!" /> + <Ending from=" i..." to=" I..." /> + <Ending from=" L." to=" I." /> </EndLines> <WholeLines> <!-- Whole lines - including -" etc --> @@ -2385,6 +2409,8 @@ <Line from="ISIGHS]" to="[SIGHS]" /> </WholeLines> <RegularExpressions> - <!-- <RegEx find="\bi\b" replaceWith="I" /> just an example - do not use this regex --> + <RegEx find="([a-z]) Won't " replaceWith="$1 won't " /> + <RegEx find=" L([,\r\n :;!?]+)" replaceWith=" I$1" /> + <RegEx find=" L.([,\r\n :;!?]+)" replaceWith=" I.$1" /> </RegularExpressions> -</OCRFixReplaceList> \ No newline at end of file +</OCRFixReplaceList> diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml index 942169045..4097a7519 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml @@ -7,8 +7,13 @@ <Word from="afirmiše" to="afirmira" /> <Word from="akcenat" to="naglasak" /> <Word from="akcionara" to="dioničara" /> + <Word from="akvarijum" to="akvarij" /> + <Word from="akvarijumu" to="akvariju" /> <Word from="amin" to="amen" /> <Word from="Amin" to="Amen" /> + <Word from="ans" to="nas" /> + <Word from="apsorbovanje" to="apsorbiranje" /> + <Word from="apsorbuje" to="apsorbira" /> <Word from="azot" to="dušik" /> <Word from="bašta" to="vrt" /> <Word from="Bašta" to="Vrt" /> @@ -22,15 +27,13 @@ <Word from="bede" to="bijede" /> <Word from="bedi" to="bijedi" /> <Word from="bejah" to="bijah" /> + <Word from="bejahu" to="bijahu" /> <Word from="belešci" to="bilješci" /> <Word from="bešike" to="mjehure" /> - <Word from="bimso" to="bismo" /> - <Word from="bioskop" to="kino" /> - <Word from="bioskopi" to="kina" /> - <Word from="bitci" to="bitki" /> - <Word from="blijeđi" to="bljeđi" /> + <Word from="bebisiterka" to="dadilja" /> <Word from="beg" to="bijeg" /> <Word from="begu" to="bijegu" /> + <Word from="begstva" to="bijega" /> <Word from="bejaše" to="bijaše" /> <Word from="bekstvo" to="bijeg" /> <Word from="bekstvu" to="bijegu" /> @@ -41,13 +44,21 @@ <Word from="besom" to="bijesom" /> <Word from="besu" to="bijesu" /> <Word from="beše" to="bješe" /> + <Word from="bimso" to="bismo" /> + <Word from="blijeđi" to="bljeđi" /> <Word from="bioje" to="bio je" /> <Word from="bi smo" to="bismo" /> <Word from="bi ste" to="biste" /> + <Word from="bioskop" to="kino" /> + <Word from="bioskopi" to="kina" /> + <Word from="bitci" to="bitki" /> <Word from="bled" to="blijed" /> <Word from="blede" to="blijede" /> <Word from="boksuješ" to="boksaš" /> <Word from="bolesan" to="bolestan" /> + <Word from="bolila" to="boljela" /> + <Word from="borićeš" to="borit ćeš" /> + <Word from="Borićeš" to="Borit ćeš" /> <Word from="braon" to="smeđa" /> <Word from="bregu" to="brijegu" /> <Word from="bti" to="biti" /> @@ -57,8 +68,28 @@ <Word from="cepa" to="cijepa" /> <Word from="cev" to="cijev" /> <Word from="cevi" to="cijevi" /> + <Word from="cjevi" to="cijevi" /> + <Word from="cevima" to="cijevima" /> + <Word from="Cevi" to="Cijevi" /> + <Word from="Cjevi" to="Cijevi" /> + <Word from="Cevima" to="Cijevima" /> + <Word from="Cjevima" to="Cijevima" /> <Word from="cevčica" to="cjevčica" /> <Word from="cevčicu" to="cjevčicu" /> + <Word from="cutanje" to="šutnja" /> + <Word from="čutanje" to="šutnja" /> + <Word from="ćutanje" to="šutnja" /> + <Word from="Cutanje" to="Šutnja" /> + <Word from="Čutanje" to="Šutnja" /> + <Word from="Ćutanje" to="Šutnja" /> + <Word from="cutanjem" to="šutnjom" /> + <Word from="čutanjem" to="šutnjom" /> + <Word from="ćutanjem" to="šutnjom" /> + <Word from="Cutanjem" to="Šutnjom" /> + <Word from="Čutanjem" to="Šutnjom" /> + <Word from="Ćutanjem" to="Šutnjom" /> + <Word from="cvetaju" to="cvjetaju" /> + <Word from="cvetove" to="cvjetove" /> <Word from="cvetu" to="cvijetu" /> <Word from="cvjetu" to="cvijetu" /> <Word from="cvetalo" to="cvjetalo" /> @@ -66,6 +97,7 @@ <Word from="Čakom" to="Chuckom" /> <Word from="čaršav" to="plahta" /> <Word from="čaršave" to="plahte" /> + <Word from="čaršavi" to="plahte" /> <Word from="čaršavima" to="plahtama" /> <Word from="čas" to="sat" /> <Word from="četvoro" to="četvero" /> @@ -80,6 +112,16 @@ <Word from="čerkom" to="kćeri" /> <Word from="kćerkom" to="kćeri" /> <Word from="kčerkom" to="kćeri" /> + <Word from="Ču" to="Ću" /> + <Word from="Češ" to="Ćeš" /> + <Word from="Če" to="Će" /> + <Word from="Čemo" to="Ćemo" /> + <Word from="Čete" to="Ćete" /> + <Word from="ču" to="ću" /> + <Word from="češ" to="ćeš" /> + <Word from="če" to="će" /> + <Word from="čemo" to="ćemo" /> + <Word from="čete" to="ćete" /> <Word from="ćebe" to="deku" /> <Word from="ćebetu" to="deki" /> <Word from="čk" to="čak" /> @@ -101,39 +143,56 @@ <Word from="Čućemo" to="Čut ćemo" /> <Word from="Čućete" to="Čut ćete" /> <Word from="Čuće" to="Čut će" /> + <Word from="ćuo" to="čuo" /> <Word from="ćutao" to="šutio" /> <Word from="Ćutao" to="Šutio" /> + <Word from="ćute" to="šute" /> + <Word from="Ćute" to="Šute" /> <Word from="cvetova" to="cvjetova" /> <Word from="daga" to="da ga" /> <Word from="damas" to="danas" /> + <Word from="date" to="dane" /> <Word from="deda" to="djed" /> <Word from="Deda" to="Djed" /> <Word from="dede" to="djeda" /> <Word from="dedi" to="djedu" /> <Word from="dedom" to="djedom" /> <Word from="definiše" to="definira" /> + <Word from="dejstvo" to="djelovanje" /> + <Word from="Dejstvo" to="Djelovanje" /> + <Word from="dejstvom" to="djelovanjem" /> + <Word from="Dejstvom" to="Djelovanjem" /> <Word from="deleći" to="dijeleći" /> <Word from="deo" to="dio" /> <Word from="Deo" to="Dio" /> <Word from="dešava" to="događa" /> <Word from="dete" to="dijete" /> + <Word from="Dete" to="Dijete" /> <Word from="diluje" to="dila" /> <Word from="diluju" to="dilaju" /> + <Word from="diskutuje" to="raspravlja" /> + <Word from="Diskutuje" to="Raspravlja" /> + <Word from="diskutujemo" to="raspravljamo" /> + <Word from="Diskutujemo" to="Raspravljamo" /> <Word from="djete" to="dijete" /> - <Word from="Dete" to="Dijete" /> <Word from="Djete" to="Dijete" /> <Word from="detektuje" to="detektira" /> <Word from="dodju" to="dođu" /> <Word from="dole" to="dolje" /> <Word from="Dole" to="Dolje" /> + <Word from="donijeo" to="donio" /> + <Word from="Donijeo" to="Donio" /> <Word from="Donijeću" to="Donijet ću" /> - <Word from="do ovde" to="dovde" /> + <Word from="dosledan" to="dosljedan" /> <!-- nije za regex [ni dospeo - ni dospeju - mora ostati ovako] --> <Word from="dospeo" to="dospio" /> <Word from="dospeju" to="dospiju" /> <Word from="dođavola" to="dovraga" /> <Word from="Dođavola" to="Dovraga" /> <Word from="drug" to="prijatelj" /> + <Word from="drugari" to="prijatelji" /> + <Word from="drugare" to="prijatelje" /> + <Word from="drugčiji" to="drugačiji" /> <Word from="drugde" to="drugdje" /> <Word from="duuga" to="dúga" /> <Word from="duvana" to="duhana" /> @@ -146,6 +205,7 @@ <Word from="džanki" to="ovisnik" /> <Word from="dželat" to="krvnik" /> <Word from="đubre" to="smeće" /> + <Word from="efekat" to="efekt" /> <Word from="eksperata" to="stručnjaka" /> <Word from="eksperti" to="stručnjaci" /> <Word from="Eksperti" to="Stručnjaci" /> @@ -155,7 +215,13 @@ <Word from="emitovati" to="emitirati" /> <Word from="emituje" to="emitira" /> <Word from="emitujem" to="emitiram" /> + <Word from="Emitujem" to="Emitiram" /> <Word from="emituju" to="emitiraju" /> + <Word from="evra" to="eura" /> + <Word from="familija" to="obitelj" /> + <Word from="Familija" to="Obitelj" /> + <Word from="familiju" to="obitelj" /> + <Word from="Familiju" to="Obitelj" /> <Word from="familijama" to="obiteljima" /> <Word from="familiji" to="obitelji" /> <Word from="flertuje" to="očijuka" /> @@ -164,12 +230,19 @@ <Word from="foke" to="tuljani" /> <Word from="fokama" to="tuljanima" /> <Word from="fotografišu" to="fotografiraju" /> + <Word from="gasova" to="plinova" /> <Word from="gde" to="gdje" /> <Word from="Gde" to="Gdje" /> <Word from="gluhonem" to="gluhonijem" /> <Word from="greše" to="griješe" /> + <Word from="grješe" to="griješe" /> + <Word from="greši" to="griješi" /> + <Word from="grješi" to="griješi" /> <Word from="greški" to="grešci" /> <Word from="grijehova" to="grijeha" /> + <Word from="grijehove" to="grijehe" /> + <Word from="hipnotisao" to="hipnotizirao" /> + <Word from="hipnotisana" to="hipnotizirana" /> <Word from="hipnotiše" to="hipnotizira" /> <Word from="Historija" to="Povijest" /> <Word from="Historiju" to="Povijest" /> @@ -184,10 +257,20 @@ <Word from="istorije" to="povijesti" /> <Word from="istoriji" to="povijesti" /> <Word from="istorijom" to="poviješću" /> + <Word from="hakuje" to="hakira" /> + <Word from="Hakuje" to="Hakira" /> + <Word from="hakujemo" to="hakiramo" /> + <Word from="Hakujemo" to="Hakiramo" /> + <Word from="Hakuju" to="Hakiraju" /> + <Word from="hakuju" to="hakiraju" /> <Word from="hoču" to="hoću" /> <Word from="Hoču" to="Hoću" /> <Word from="hteće" to="htjet će" /> <Word from="htedoh" to="htjedoh" /> + <Word from="Htjeo" to="Htio" /> + <Word from="Hteo" to="Htio" /> + <Word from="htjeo" to="htio" /> + <Word from="hteo" to="htio" /> <Word from="iči" to="ići" /> <Word from="Iči" to="Ići" /> <Word from="iko" to="itko" /> @@ -197,31 +280,47 @@ <Word from="Ignorišite" to="Ignorirajte" /> <Word from="ignorišu" to="ignoriraju" /> <Word from="ilustruju" to="ilustriraju" /> - <Word from="informiše" to="informira" /> - <Word from="informišu" to="informiraju" /> <Word from="inspirisao" to="inspirirao" /> + <Word from="interesantan" to="zanimljiv" /> + <Word from="Interesantan" to="Zanimljiv" /> <Word from="interesuje" to="zanima" /> <Word from="Interesuje" to="Zanima" /> + <Word from="interesujemo" to="zanimamo" /> + <Word from="Interesujemo" to="Zanimamo" /> + <Word from="interesujete" to="zanimate" /> + <Word from="Interesujete" to="Zanimate" /> <Word from="Interesuju" to="Zanimaju" /> <Word from="interesuju" to="zanimaju" /> <Word from="isekao" to="izrezao" /> <Word from="isterao" to="istjerao" /> <Word from="isteraš" to="istjeraš" /> <Word from="Isteraš" to="Istjeraš" /> + <Word from="istrebi" to="istrijebi" /> + <Word from="istrebiti" to="istrijebiti" /> <Word from="isuviše" to="previše" /> <Word from="ivica" to="rub" /> <Word from="ivice" to="ruba" /> <Word from="ivici" to="rubu" /> <Word from="ivicu" to="rub" /> + <Word from="izduvaj" to="ispuši" /> + <Word from="izduvamo" to="ispušemo" /> + <Word from="izoluje" to="izolira" /> + <Word from="izolujemo" to="izoliramo" /> + <Word from="izoluješ" to="izoliraš" /> <Word from="Izolujete" to="Izolirate" /> <Word from="Izolujte" to="Izolirajte" /> + <Word from="izolujte" to="izolirajte" /> <Word from="izgladneo" to="izgladnio" /> <Word from="izmeriti" to="izmjeriti" /> <Word from="izmerio" to="izmjerio" /> + <Word from="izmešane" to="izmiješane" /> <Word from="izneo" to="iznio" /> - <Word from="izolujte" to="izolirajte" /> <Word from="izneti" to="iznijeti" /> <Word from="izvestan" to="izvjestan" /> + <Word from="izvinem" to="ispričam" /> + <Word from="izvineš" to="ispričaš" /> + <Word from="Izvinem" to="Ispričam" /> + <Word from="Izvineš" to="Ispričaš" /> <Word from="izvinim" to="ispričam" /> <Word from="izviniš" to="ispričaš" /> <Word from="izviniti" to="ispričati" /> @@ -231,17 +330,32 @@ <Word from="jedamput" to="jedanput" /> <Word from="jelda" to="jel' da" /> <Word from="Ješćemo" to="Jest ćemo" /> + <Word from="Ješćeš" to="Jest ćeš" /> + <Word from="ješće" to="jest će" /> + <Word from="ješću" to="jest ću" /> + <Word from="Ješću" to="Jest ću" /> + <Word from="ješćeš" to="jest ćeš" /> + <Word from="ješćemo" to="jest ćemo" /> <Word from="juče" to="jučer" /> <Word from="Juče" to="Jučer" /> <Word from="kakava" to="kakva" /> + <Word from="kampovao" to="kampirao" /> <Word from="kampuje" to="kampira" /> <Word from="kampujemo" to="kampiramo" /> <Word from="kampuju" to="kampiraju" /> + <Word from="kancelarija" to="ured" /> + <Word from="kancelarijama" to="uredima" /> + <Word from="kancelariju" to="ured" /> + <Word from="Kancelarija" to="Ured" /> + <Word from="Kancelariju" to="Ured" /> <Word from="kancelariji" to="uredu" /> + <Word from="kancelarije" to="ureda" /> <Word from="kancelarijom" to="uredom" /> <Word from="kancera" to="raka" /> <Word from="kandidovati" to="kandidirati" /> <Word from="kandidujem" to="kandidiram" /> + <Word from="kapar" to="kopar" /> + <Word from="kapra" to="kopra" /> <Word from="karmin" to="ruž" /> <Word from="karminom" to="ružem" /> <Word from="kćerci" to="kćeri" /> @@ -258,6 +372,8 @@ <Word from="kiji" to="koji" /> <Word from="kijim" to="kojim" /> <Word from="klasifikuju" to="klasificiraju" /> + <Word from="klešta" to="kliješta" /> + <Word from="klješta" to="kliješta" /> <Word from="Ko" to="Tko" /> <Word from="koa" to="kao" /> <Word from="koaj" to="koja" /> @@ -266,6 +382,7 @@ <Word from="komandni" to="zapovjedni" /> <Word from="kombinuju" to="kombiniraju" /> <Word from="kompanija" to="tvrtka" /> + <Word from="komponovao" to="skladao" /> <Word from="komšija" to="susjed" /> <Word from="komšiji" to="susjedu" /> <Word from="komšiju" to="susjeda" /> @@ -274,6 +391,10 @@ <Word from="komšiluku" to="susjedstvu" /> <Word from="komšije" to="susjedi" /> <Word from="komšijama" to="susjedima" /> + <Word from="komšinica" to="susjeda" /> + <Word from="komšinicu" to="susjedu" /> + <Word from="konektovan" to="spojen" /> + <Word from="konektovati" to="spojiti" /> <Word from="kontrolišu" to="kontroliraju" /> <Word from="Kontrolišu" to="Kontroliraju" /> <Word from="Kontroliši" to="Kontroliraj" /> @@ -283,6 +404,7 @@ <Word from="korpu" to="košaru" /> <Word from="kritikuju" to="kritiziraju" /> <Word from="krsta" to="križa" /> + <Word from="krstaši" to="križari" /> <Word from="krstu" to="križu" /> <Word from="krstića" to="križića" /> <Word from="krstiću" to="križiću" /> @@ -300,6 +422,7 @@ <Word from="kupatilu" to="kupaoni" /> <Word from="kvalifikuju" to="kvalificiraju" /> <Word from="lažeju" to="lažu" /> + <Word from="Lažov" to="Lažljivac" /> <Word from="lažov" to="lažljivac" /> <Word from="lažovi" to="lažljivci" /> <Word from="lažovu" to="lažljivcu" /> @@ -318,10 +441,19 @@ <Word from="lešnik" to="lješnjak" /> <Word from="Leta" to="Ljeta" /> <Word from="leto" to="ljeto" /> + <Word from="Leto" to="Ljeto" /> + <Word from="letos" to="ljetos" /> <Word from="letiti" to="letjeti" /> <Word from="leve" to="lijeve" /> <Word from="loži" to="pali" /> <Word from="lza" to="Iza" /> + <Word from="ljepiti" to="lijepiti" /> + <Word from="ljepili" to="lijepili" /> + <Word from="magnezijuma" to="magnezija" /> + <Word from="magnezijumu" to="magneziju" /> + <Word from="maja" to="svibnja"/> + <Word from="maju" to="svibnju"/> + <Word from="majem" to="svibnjem"/> <Word from="majca" to="majica" /> <Word from="majce" to="majice" /> <Word from="majcu" to="majicu" /> @@ -330,7 +462,10 @@ <Word from="malopre" to="malo prije" /> <Word from="maloprije" to="malo prije" /> <Word from="manifestuje" to="manifestira" /> - <Word from="Mek" to="Mac" /> + <Word from="manifestuju" to="manifestiraju" /> + <Word from="marta" to="ožujka" /> + <Word from="martu" to="ožujku"/> + <Word from="martom" to="ožujkom" /> <Word from="mehur" to="mjehur" /> <Word from="menom" to="mnom" /> <Word from="merač" to="mjerač" /> @@ -338,23 +473,33 @@ <Word from="mere" to="mjere" /> <Word from="merdevine" to="ljestve" /> <Word from="merdevinama" to="ljestvama" /> + <Word from="merljivo" to="mjerljivo" /> <Word from="mešane" to="miješane" /> <Word from="mešavina" to="mješavina" /> <Word from="mešavine" to="mješavine" /> <Word from="mešavinu" to="mješavinu" /> - <Word from="meštana" to="mještana" /> <Word from="minut" to="minutu" /> + <Word from="mleo" to="mljeo" /> <Word from="moč" to="moć" /> <Word from="mofu" to="mogu" /> <Word from="momenat" to="trenutak" /> + <Word from="momenta" to="trena" /> <Word from="muzejem" to="muzejom" /> <Word from="muzici" to="glazbi" /> + <Word from="muzika" to="glazba" /> + <Word from="muzike" to="glazbe" /> + <Word from="muzikom" to="glazbom" /> + <Word from="Muzika" to="Glazba" /> + <Word from="Muzike" to="Glazbe" /> + <Word from="Muzikom" to="Glazbom" /> <Word from="nači" to="naći" /> + <Word from="nadevati" to="nadijevati" /> <Word from="naduvan" to="napušen" /> <Word from="najpre" to="najprije" /> <Word from="Najpre" to="Najprije" /> <Word from="najzad" to="napokon" /> <Word from="nanevši" to="nanjevši" /> + <Word from="nanjeli" to="nanijeli" /> <Word from="napastvuje" to="napastuje" /> <Word from="Napolje" to="Van" /> <Word from="napolje" to="van" /> @@ -369,7 +514,7 @@ <Word from="Napred" to="Naprijed" /> <Word from="naprimjer" to="na primjer" /> <Word from="naseo" to="nasjeo" /> - <Word from="nasmeši" to="nasmiješi" /> + <Word from="nasesti" to="nasjesti" /> <Word from="nasreću" to="na sreću" /> <Word from="nebi" to="ne bi" /> <Word from="nebih" to="ne bih" /> @@ -393,26 +538,31 @@ <Word from="Nemora" to="Ne mora" /> <Word from="nene" to="njene" /> <Word from="nešo" to="nešto" /> + <Word from="nevesta" to="nevjesta" /> <Word from="nevreme" to="nevrijeme" /> <Word from="nezi" to="njezi" /> + <Word from="niasm" to="nisam" /> <Word from="nigde" to="nigdje" /> <Word from="Nigde" to="Nigdje" /> + <Word from="nikakave" to="nikakve" /> <Word from="niko" to="nitko" /> <Word from="Niko" to="Nitko" /> <Word from="nisma" to="nisam" /> <Word from="Nisma" to="Nisam" /> <Word from="nećš" to="nećeš" /> <Word from="nejde" to="ne ide" /> + <Word from="Nejde" to="Ne ide" /> <Word from="neda" to="ne da" /> <Word from="nedam" to="ne dam" /> - <Word from="new yorški" to="njujorški" /> - <Word from="nju jorški" to="njujorški" /> + <Word from="negujem" to="njegujem" /> <Word from="njegi" to="njezi" /> <Word from="neželi" to="ne želi" /> <Word from="niej" to="nije" /> + <Word from="nili" to="niti" /> <Word from="njie" to="nije" /> <Word from="njem" to="nijem" /> <Word from="njeme" to="njene" /> + <Word from="nominovan" to="nominiran" /> <Word from="nsiam" to="nisam" /> <Word from="nteko" to="netko" /> <Word from="obe" to="obje" /> @@ -430,8 +580,12 @@ <Word from="obuhvata" to="obuhvaća" /> <Word from="odandje" to="odande" /> <Word from="odavdje" to="odavde" /> + <Word from="Odavdje" to="Odavde" /> + <Word from="odbićeš" to="odbit ćeš" /> + <Word from="odbićemo" to="odbit ćemo" /> <Word from="odela" to="odjela" /> <Word from="odelu" to="odjelu" /> + <Word from="odelenja" to="odjela" /> <Word from="odelenje" to="odjel" /> <Word from="odelenju" to="odjelu" /> <Word from="odeljak" to="odjeljak" /> @@ -446,19 +600,25 @@ <Word from="odneće" to="odnijet će" /> <Word from="odoliti" to="odoljeti" /> <Word from="odneti" to="odnijeti" /> - <Word from="odprilike" to="otprilike" /> <Word from="odseo" to="odsjeo" /> <Word from="odsela" to="odsjela" /> <Word from="odsesti" to="odsjesti" /> <!-- odseli ne može - jer je riječ u hrv [da se odseli] --> <Word from="odupreti" to="oduprijeti" /> + <Word from="oduvek" to="oduvijek" /> + <Word from="Oduvek" to="Oduvijek" /> + <Word from="oduvjek" to="oduvijek" /> + <Word from="Oduvjek" to="Oduvijek" /> <Word from="ogladneo" to="ogladnio" /> + <Word from="okoreli" to="okorjeli" /> <Word from="organizuju" to="organiziraju" /> <Word from="Organizuju" to="Organiziraju" /> <Word from="osjećanja" to="osjećaje" /> <Word from="osmehe" to="osmijehe" /> <Word from="osmehne" to="osmjehne" /> + <Word from="osmehnu" to="osmjehnu" /> <Word from="osobenosti" to="osobnosti" /> + <Word from="ostareli" to="ostarjeli" /> <Word from="ostrva" to="otoka" /> <Word from="ostrvu" to="otoku" /> <Word from="ostrvom" to="otokom" /> @@ -469,12 +629,18 @@ <Word from="osete" to="osjete" /> <Word from="ostrvo" to="otok" /> <Word from="Ostrvo" to="Otok" /> + <Word from="osvjetljen" to="osvijetljen" /> <Word from="ovde" to="ovdje" /> <Word from="Ovde" to="Ovdje" /> + <Word from="ovdej" to="ovdje" /> <Word from="ovdije" to="ovdje" /> <Word from="Ovdije" to="Ovdje" /> <Word from="ovjde" to="ovdje" /> <Word from="Ovjde" to="Ovdje" /> + <Word from="pakuje" to="pakira" /> + <Word from="Pakuje" to="Pakira" /> + <Word from="Pakuju" to="Pakiraju" /> + <Word from="pakuju" to="pakiraju" /> <Word from="palatama" to="palačama" /> <Word from="palate" to="palače" /> <Word from="palatu" to="palaču" /> @@ -485,8 +651,12 @@ <Word from="pantalonama" to="hlačama" /> <Word from="parče" to="komadić" /> <Word from="parčeta" to="komadića" /> + <Word from="parčetu" to="komadiću" /> <Word from="parčetom" to="komadićem" /> <Word from="paramparčad" to="komadići" /> + <Word from="pastuv" to="pastuh" /> + <Word from="pastuva" to="pastuha" /> + <Word from="pastuvu" to="pastuhu" /> <Word from="pd" to="od" /> <Word from="pemzija" to="penzija" /> <Word from="pemziju" to="penziju" /> @@ -497,12 +667,18 @@ <Word from="pesnicima" to="pjesnicima" /> <Word from="pešice" to="pješice" /> <Word from="Pešice" to="Pješice" /> + <Word from="peške" to="pješke" /> <Word from="plata" to="plaća" /> <Word from="plača" to="plaća" /> + <Word from="platom" to="plaćom" /> <Word from="platu" to="plaću" /> <Word from="plačanje" to="plaćanje" /> <Word from="plačanjem" to="plaćanjem" /> <Word from="plaćeš" to="plačeš" /> + <Word from="plen" to="plijen" /> + <Word from="Plen" to="Plijen" /> + <Word from="pljen" to="plijen" /> + <Word from="Pljen" to="Plijen" /> <Word from="počeću" to="počet ću" /> <Word from="podjelimo" to="podijelimo" /> <Word from="podnesti" to="podnijeti" /> @@ -518,22 +694,25 @@ <Word from="pomaći" to="pomaknuti" /> <Word from="pomaknim" to="pomaknem" /> <Word from="pomaknio" to="pomaknuo" /> + <Word from="pomakniš" to="pomakneš" /> <Word from="pomakniti" to="pomaknuti" /> <Word from="pomenu" to="spomenu" /> <Word from="Pomera" to="Miče" /> <Word from="pomera" to="miče" /> + <Word from="pomjera" to="pomiče" /> <Word from="pomerajte" to="mičite" /> <Word from="pomjeri" to="pomakni" /> <Word from="pomeraj" to="miči" /> <Word from="pomjeraj" to="miči" /> <Word from="pomeraju" to="miču" /> <Word from="pomerala" to="micala" /> + <Word from="pomjerala" to="pomicala" /> + <Word from="pomjeraju" to="pomiču" /> <Word from="pomeranja" to="pomicanja" /> <Word from="pomerati" to="micati" /> <Word from="pomjerati" to="pomicati" /> <Word from="pomeriš" to="pomakneš" /> <Word from="ponaosob" to="osobno" /> - <!-- nije za regex! --> <Word from="ponesla" to="ponijela" /> <Word from="Ponesla" to="Ponijela" /> <Word from="poređenje" to="usporedba" /> @@ -549,9 +728,11 @@ <Word from="porodicama" to="obiteljima" /> <Word from="porodicom" to="obitelji" /> <Word from="porodicu" to="obitelj" /> + <Word from="poslata" to="poslana" /> <Word from="posle" to="poslije" /> <Word from="Posle" to="Poslije" /> <Word from="poslje" to="poslije" /> + <Word from="posredi" to="posrijedi" /> <Word from="postara" to="pobrine" /> <Word from="Postaraću" to="Pobrinut ću" /> <Word from="postaraću" to="pobrinut ću" /> @@ -566,16 +747,24 @@ <Word from="Povinuju" to="Pokoravaju" /> <Word from="povinuju" to="pokoravaju" /> <Word from="pozadi" to="iza" /> + <Word from="poželeo" to="poželio" /> + <Word from="Poželeo" to="Poželio" /> + <Word from="Poželjeo" to="Poželio" /> + <Word from="poželjeo" to="poželio" /> <Word from="praktikuj" to="prakticiraj" /> <Word from="praktikuju" to="prakticiraju" /> <Word from="praktikovala" to="prakticirala" /> <Word from="praktikovati" to="prakticirati" /> <Word from="pre" to="prije" /> <Word from="Pre" to="Prije" /> + <Word from="predela" to="predjela" /> + <Word from="predelu" to="predjelu" /> <Word from="Preći" to="Prijeći" /> <Word from="preći" to="prijeći" /> + <Word from="prećutkuje" to="prešućuje" /> <Word from="predame" to="preda me" /> - <Word from="predelu" to="predjelu" /> + <Word from="predamnom" to="preda mnom" /> + <Word from="Predamnom" to="Preda mnom" /> <Word from="preformuliši" to="preformuliraj" /> <Word from="preklo" to="porijeklo" /> <Word from="preloma" to="prijeloma" /> @@ -586,6 +775,7 @@ <Word from="prenosom" to="prijenosom" /> <Word from="prenosu" to="prijenosu" /> <Word from="preneo" to="prenio" /> + <Word from="Preneo" to="Prenio" /> <Word from="prenela" to="prenijela" /> <Word from="prenjela" to="prenijela" /> <Word from="preneli" to="prenijeli" /> @@ -594,21 +784,33 @@ <Word from="preporuča" to="preporučuje" /> <Word from="preseći" to="presjeći" /> <Word from="preti" to="prijeti" /> + <Word from="prete" to="prijete" /> + <Word from="Prete" to="Prijete" /> + <Word from="prjeti" to="prijeti" /> + <Word from="prjete" to="prijete" /> <Word from="pretećim" to="prijetećim" /> <Word from="pretećih" to="prijetećih" /> <Word from="pretrpeo" to="pretrpio" /> <Word from="prevod" to="prijevod" /> <Word from="Prevod" to="Prijevod" /> <Word from="prezentovati" to="prezentirati" /> + <Word from="prezentovane" to="prezentirane" /> + <Word from="prezentovan" to="prezentiran" /> + <Word from="prezentovani" to="prezentirani" /> + <Word from="prezentovano" to="prezentirano" /> <Word from="pridonjeti" to="pridonijeti" /> <Word from="prijatan" to="ugodan" /> + <Word from="primećivao" to="primjećivao" /> <Word from="primedbi" to="primjedbi" /> <Word from="primjete" to="primijete" /> <Word from="prisetim" to="prisjetim" /> + <Word from="prisetio" to="prisjetio" /> + <Word from="prisetite" to="prisjetite" /> <Word from="pritiskam" to="pritišćem" /> <Word from="prmda" to="iako" /> <Word from="procenat" to="postotak" /> <Word from="procent" to="postotak" /> + <Word from="procenta" to="postotka" /> <Word from="procenata" to="postotaka" /> <Word from="procenti" to="postoci" /> <Word from="Procenti" to="Postoci" /> @@ -622,6 +824,7 @@ <Word from="projekat" to="projekt" /> <Word from="Projekat" to="Projekt" /> <Word from="promijena" to="promjena" /> + <Word from="prosledili" to="proslijedili" /> <Word from="protestvovat" to="protestirat" /> <Word from="Protestvovat" to="Protestirat" /> <Word from="Protestvujem" to="Protestiram" /> @@ -629,6 +832,10 @@ <Word from="protestvuju" to="protestiraju" /> <Word from="protestujući" to="protestirajući" /> <Word from="psihićki" to="psihički" /> + <Word from="pto" to="što" /> + <Word from="ptom" to="potom" /> + <Word from="punoletan" to="punoljetan" /> + <Word from="Punoletan" to="Punoljetan" /> <Word from="računari" to="računala" /> <Word from="računare" to="računala" /> <Word from="radijo" to="radio" /> @@ -639,12 +846,24 @@ <Word from="rasejan" to="rastresen" /> <Word from="rasejana" to="rastresena" /> <Word from="raspust" to="odmor" /> + <Word from="razbiću" to="razbit ću" /> + <Word from="razbijesneo" to="razbjesnio" /> + <Word from="rašće" to="rast će" /> + <Word from="Razbiću" to="Razbit ću" /> <Word from="razdeviče" to="razdjeviče" /> <Word from="razgovrati" to="razgovarati" /> <Word from="razreši" to="razriješi" /> <Word from="razume" to="razumije" /> <Word from="razumeju" to="razumiju" /> + <Word from="rečju" to="riječju" /> + <Word from="Rečju" to="Riječju" /> + <Word from="rječju" to="riječju" /> + <Word from="Rječju" to="Riječju" /> + <Word from="reagujte" to="reagirajte" /> + <Word from="redov" to="vojnik" /> + <Word from="redovu" to="vojniku" /> <Word from="ređe" to="rjeđe" /> + <Word from="ređi" to="rjeđi" /> <Word from="rejv" to="rave" /> <Word from="rejvu" to="raveu" /> <Word from="reko" to="rekao" /> @@ -655,10 +874,16 @@ <Word from="Resetujte" to="Resetirajte" /> <Word from="rijeđi" to="rjeđi" /> <Word from="Rizikuj" to="Riskiraj" /> + <Word from="rizikuju" to="riskiraju" /> + <Word from="rizikuje" to="riskira" /> + <Word from="rizikujte" to="riskirajte" /> + <Word from="rješio" to="riješio" /> <Word from="rokenrol" to="rock'n'roll" /> <Word from="ronioc" to="ronilac" /> <Word from="saviješću" to="savješću" /> <Word from="savešću" to="savješću" /> + <Word from="secka" to="sjecka" /> + <Word from="seckam" to="sjeckam" /> <Word from="sedećeš" to="sjedit ćeš" /> <Word from="sedeli" to="sjedili" /> <Word from="sedišta" to="sjedala" /> @@ -672,7 +897,9 @@ <Word from="sesti" to="sjesti" /> <Word from="sekire" to="sjekire" /> <Word from="sekiraj" to="brini" /> + <Word from="sekiram" to="brinem" /> <Word from="sekiramo" to="brinemo" /> + <Word from="sekiraš" to="brineš" /> <Word from="sekirate" to="brinete" /> <Word from="sekirajte" to="brinite" /> <Word from="seme" to="sjeme" /> @@ -684,9 +911,12 @@ <Word from="sigruno" to="sigurno" /> <Word from="siguan" to="siguran" /> <Word from="sija" to="sja" /> + <Word from="sijaju" to="sjaju" /> <Word from="sirće" to="ocat" /> <Word from="sirćeta" to="octa" /> <Word from="sirćetu" to="octu" /> + <Word from="sješću" to="sjest ću" /> + <Word from="sješće" to="sjest će" /> <Word from="sleće" to="slijeće" /> <Word from="sleću" to="slijeću" /> <Word from="slećemo" to="slijećemo" /> @@ -702,6 +932,8 @@ <Word from="Sme" to="Smije" /> <Word from="smećpm" to="smećem" /> <Word from="smej" to="smij" /> + <Word from="Smejte" to="Smijte" /> + <Word from="smejte" to="smijte" /> <Word from="smesta" to="smjesta" /> <Word from="Smesta" to="Smjesta" /> <Word from="smeste" to="smjeste" /> @@ -709,6 +941,7 @@ <Word from="smeši" to="smiješi" /> <Word from="Smeši" to="Smiješi" /> <Word from="smešio" to="smiješio" /> + <Word from="smešiš" to="smiješiš" /> <Word from="smeškom" to="smješkom" /> <Word from="smjeo" to="smio" /> <Word from="smrdeo" to="smrdio" /> @@ -716,9 +949,13 @@ <Word from="sitnisajzer" to="synthesizer" /> <Word from="skelet" to="kostur" /> <Word from="sočiva" to="leće" /> + <Word from="sočivima" to="lećama" /> <Word from="sočivo" to="leća" /> <Word from="sočivom" to="lećom" /> <Word from="sočivu" to="leći" /> + <Word from="Spakuj" to="Spakiraj" /> + <Word from="Spakujte" to="Spakirajte" /> + <Word from="spakujte" to="spakirajte" /> <Word from="spasao" to="spasio" /> <Word from="Spasao" to="Spasio" /> <Word from="spasen" to="spašen" /> @@ -726,9 +963,13 @@ <Word from="spasli" to="spasili" /> <Word from="speluje" to="sriče" /> <Word from="speluju" to="sriču" /> + <Word from="spojiće" to="spojit će" /> <Word from="spolja" to="izvana" /> + <Word from="Srediće" to="Sredit će" /> + <Word from="Srediću" to="Sredit ću" /> <!-- nisu za regex - ne odgovaraju zbog dodatnog ju na kraju --> <Word from="stabilizuju" to="stabiliziraju" /> + <Word from="starao" to="brinuo" /> <Word from="starati" to="brinuti" /> <Word from="Starati" to="Brinuti" /> <Word from="steni" to="stijeni" /> @@ -738,9 +979,13 @@ <Word from="stepenu" to="stupnju" /> <Word from="sticati" to="stjecati" /> <Word from="stiditi" to="stidjeti" /> + <Word from="streljamo" to="strijeljamo" /> + <Word from="streljati" to="strijeljati" /> <Word from="stoleća" to="stoljeća" /> <Word from="stobom" to="s tobom" /> <Word from="stvrano" to="stvarno" /> + <Word from="Stupiću" to="Stupit ću" /> + <Word from="stupiću" to="stupit ću" /> <Word from="subjekat" to="subjekt" /> <Word from="sudija" to="sudac" /> <Word from="Sudija" to="Sudac" /> @@ -752,18 +997,38 @@ <Word from="sudijskog" to="sudskog" /> <Word from="sugerišu" to="predlažu" /> <Word from="sugeriše" to="predlaže" /> + <Word from="supa" to="juha" /> + <Word from="supe" to="juhe" /> + <Word from="supi" to="juhi" /> + <Word from="supu" to="juhu" /> + <Word from="supom" to="juhom" /> + <Word from="supama" to="juhama" /> + <Word from="Supa" to="Juha" /> + <Word from="Supe" to="Juhe" /> + <Word from="Supi" to="Juhi" /> + <Word from="Supu" to="Juhu" /> + <Word from="Supom" to="Juhom" /> + <Word from="Supama" to="Juhama" /> <Word from="surfuje" to="surfa" /> <Word from="surfuješ" to="surfaš" /> <Word from="surfuju" to="surfaju" /> <Word from="suština" to="bit" /> <Word from="suštinski" to="bitni" /> + <Word from="suvom" to="suhom" /> + <Word from="suvog" to="suhog" /> + <Word from="suvoj" to="suhoj" /> + <Word from="Suvom" to="Suhom" /> + <Word from="Suvog" to="Suhog" /> + <Word from="Suvoj" to="Suhoj" /> <Word from="suvim" to="suhim" /> + <Word from="Suvim" to="Suhim" /> <Word from="svestan" to="svjestan" /> <Word from="svjest" to="svijest" /> <Word from="Svjest" to="Svijest" /> <Word from="svjesti" to="svijesti" /> <Word from="Svjesti" to="Svijesti" /> <Word from="svetova" to="svjetova" /> + <Word from="svetove" to="svjetove" /> <Word from="svugde" to="svugdje" /> <Word from="šolja" to="šalica" /> <Word from="šolju" to="šalicu" /> @@ -776,22 +1041,28 @@ <Word from="štampom" to="tiskom" /> <Word from="štampi" to="tisku" /> <Word from="štampati" to="tiskati" /> + <Word from="Šutjeće" to="Šutjet će" /> <Word from="tablu" to="ploču" /> + <Word from="taguje" to="tagira" /> <Word from="takođe" to="također" /> <Word from="Takođe" to="Također" /> <Word from="talas" to="val" /> <Word from="Talas" to="Val" /> <Word from="talasa" to="valova" /> - <Word from="talasima" to="valovima" /> <Word from="talase" to="valove" /> <Word from="talasi" to="valovi" /> <Word from="Talasi" to="Valovi" /> + <Word from="talasima" to="valovima" /> + <Word from="Talasima" to="Valovima" /> <Word from="tečnost" to="tekućina" /> <Word from="tečnosti" to="tekućine" /> <Word from="tečnošću" to="tekućinom" /> <Word from="tekšo" to="teško" /> <Word from="Tekšo" to="Teško" /> <Word from="terajte" to="tjerajte" /> + <Word from="tešio" to="tješio" /> + <Word from="tešiš" to="tješiš" /> + <Word from="tki" to="tko" /> <Word from="točak" to="kotač" /> <Word from="Točak" to="Kotač" /> <Word from="toha" to="toga" /> @@ -821,26 +1092,36 @@ <Word from="učtivošću" to="uljudnošću" /> <Word from="udata" to="udana" /> <Word from="Udata" to="Udana" /> + <Word from="udatoj" to="udanoj" /> <Word from="udeo" to="udio" /> + <Word from="ugljenik" to="ugljik" /> <Word from="uliva" to="ulijeva" /> <Word from="ulivali" to="ulijevali" /> <Word from="ulivate" to="ulijevate" /> <Word from="uljeva" to="ulijeva" /> - <Word from="u jutro" to="ujutro" /> <Word from="ujutru" to="ujutro" /> + <Word from="Ukoliko" to="Ako" /> + <Word from="ukoliko" to="ako" /> <Word from="ume" to="zna" /> <Word from="umem" to="umijem" /> <Word from="umeš" to="umiješ" /> <Word from="umesto" to="umjesto" /> + <Word from="Umesto" to="umjesto" /> + <Word from="umete" to="znate" /> + <Word from="umijesto" to="umjesto" /> + <Word from="Umijesto" to="Umjesto" /> <Word from="umetninama" to="umjetninama" /> <Word from="umreti" to="umrijeti" /> <Word from="Umret" to="Umrijet" /> + <Word from="umrijećeš" to="umrijet ćeš" /> + <Word from="umrijećete" to="umrijet ćete" /> <Word from="Uneću" to="Unijet ću" /> <Word from="univerzitet" to="sveučilište" /> <Word from="univerzitetu" to="sveučilištu" /> <Word from="Uopšte" to="Uopće" /> <Word from="uopšte" to="uopće" /> <Word from="uopče" to="uopće" /> + <Word from="upustva" to="uputstva" /> <Word from="uprkos" to="usprkos" /> <Word from="Uprkos" to="Usprkos" /> <Word from="uradio" to="učinio" /> @@ -849,6 +1130,9 @@ <Word from="Uspe" to="Uspije" /> <Word from="uspeo" to="uspio" /> <Word from="Uspeo" to="Uspio" /> + <Word from="uspećeš" to="uspjet ćeš" /> + <Word from="uspjećeš" to="uspjet ćeš" /> + <Word from="uspećemo" to="uspjet ćemo" /> <Word from="uspeš" to="uspiješ" /> <Word from="uspeju" to="uspiju" /> <Word from="uspjevala" to="uspijevala" /> @@ -862,17 +1146,34 @@ <Word from="ušunjate" to="ušuljate" /> <Word from="utehe" to="utjehe" /> <Word from="uveče" to="navečer" /> + <Word from="uvek" to="uvijek" /> + <Word from="Uvek" to="Uvijek" /> + <Word from="uvjek" to="uvijek" /> + <Word from="Uvjek" to="Uvijek" /> <Word from="uvijet" to="uvjet" /> + <Word from="uvijeti" to="uvjeti" /> + <Word from="uvijetima" to="uvjetima" /> + <Word from="uva" to="uha" /> + <Word from="Uva" to="Uha" /> <Word from="uvo" to="uho" /> + <Word from="Uvo" to="Uho" /> + <Word from="uvom" to="uhom" /> + <Word from="Uvom" to="Uhom" /> + <Word from="uvu" to="uhu" /> + <Word from="Uvu" to="Uhu" /> <Word from="vaistinu" to="uistinu" /> <Word from="Vaistinu" to="Uistinu" /> + <Word from="vajar" to="kipar" /> + <Word from="vakciniše" to="cijepi" /> <Word from="varnica" to="iskra" /> <Word from="varnicu" to="iskru" /> + <Word from="vaspitala" to="odgojila" /> <Word from="vaspitavan" to="odgajan" /> <Word from="vaspitavanju" to="odgoju" /> <Word from="vašljivi" to="ušljivi" /> <Word from="važi" to="vrijedi" /> <Word from="večan" to="vječan" /> + <Word from="većati" to="vijećati" /> <Word from="vek" to="stoljeće" /> <Word from="veka" to="stoljeća" /> <Word from="veke" to="vijeke" /> @@ -881,22 +1182,43 @@ <Word from="večnost" to="vječnost" /> <Word from="veoma" to="vrlo" /> <Word from="Veoma" to="Vrlo" /> + <Word from="vera" to="vjera" /> + <Word from="vere" to="vjere" /> + <Word from="veri" to="vjeri" /> + <Word from="verom" to="vjerom" /> + <Word from="veru" to="vjeru" /> + <Word from="veran" to="vjeran" /> + <Word from="verama" to="vjerama" /> + <Word from="Vera" to="Vjera" /> + <Word from="Vere" to="Vjere" /> + <Word from="Veri" to="Vjeri" /> + <Word from="Verom" to="Vjerom" /> + <Word from="Veru" to="Vjeru" /> + <Word from="Veran" to="Vjeran" /> + <Word from="Verama" to="Vjerama" /> <Word from="veren" to="zaručen" /> <Word from="Veren" to="Zaručen" /> <Word from="verena" to="zaručena" /> <Word from="vereni" to="zaručeni" /> <Word from="verimo" to="zaručimo" /> + <Word from="vest" to="vijest" /> + <Word from="Vest" to="Vijest" /> + <Word from="vesti" to="vijesti" /> + <Word from="Vesti" to="Vijesti" /> + <Word from="Vjesti" to="Vijesti" /> + <Word from="vjesti" to="vijesti" /> + <Word from="vestima" to="vijestima" /> + <Word from="Vestima" to="Vijestima" /> + <Word from="vjestima" to="vijestima" /> + <Word from="Vjestima" to="Vijestima" /> + <Word from="vešala" to="vješala" /> <Word from="vešću" to="viješću" /> <Word from="vešu" to="rublju" /> + <Word from="videše" to="vidješe" /> <Word from="vidjeo" to="vidio" /> <Word from="Vidjeo" to="Vidio" /> <Word from="vjerojatnoća" to="vjerojatnost" /> <Word from="vješću" to="viješću" /> - <Word from="vještačko" to="umjetno" /> - <Word from="vještački" to="umjetni" /> - <Word from="vještačkom" to="umjetnom" /> - <Word from="vještačkog" to="umjetnog" /> - <Word from="vještačku" to="umjetnu" /> <Word from="vlo" to="vrlo" /> <Word from="Vodiće" to="Vodit će" /> <Word from="Vodiću" to="Vodit ću" /> @@ -909,18 +1231,30 @@ <Word from="vrjeme" to="vrijeme" /> <Word from="Vrjeme" to="Vrijeme" /> <Word from="vrteo" to="vrtio" /> + <Word from="vrvela" to="vrvjela" /> <Word from="whiskey" to="viski" /> <Word from="zaceljivanje" to="zacjeljivanje" /> + <Word from="zagreva" to="zagrijava" /> + <Word from="Zagreva" to="Zagrijava" /> + <Word from="Zagrevate" to="Zagrijavate" /> <Word from="zagrevanje" to="zagrijavanje" /> + <Word from="zakunio" to="zakleo" /> <Word from="zalepili" to="zalijepili" /> <Word from="zalepiti" to="zalijepiti" /> + <Word from="zaliv" to="zaljev" /> + <Word from="zalivu" to="zaljevu" /> <Word from="zanm" to="znam" /> <Word from="zanma" to="zanima" /> + <Word from="zaplena" to="zapljena" /> + <Word from="zapleni" to="zaplijeni" /> + <Word from="zaplenu" to="zapljenu" /> <Word from="zaspem" to="zaspim" /> <Word from="zastareo" to="zastario" /> - <Word from="za uvijek" to="zauvijek" /> + <Word from="zauvek" to="zauvijek" /> + <Word from="Zauvek" to="Zauvijek" /> + <Word from="zauvjek" to="zauvijek" /> + <Word from="Zauvjek" to="Zauvijek" /> <Word from="zavera" to="zavjera" /> - <Word from="zavredili" to="zavrijedili" /> <Word from="zahtev" to="zahtjev" /> <Word from="Zahtev" to="Zahtjev" /> <Word from="zasede" to="zasjede" /> @@ -928,24 +1262,53 @@ <Word from="zasedu" to="zasjedu" /> <Word from="zatp" to="zato" /> <Word from="Zatp" to="Zato" /> + <Word from="zaželeo" to="zaželio" /> + <Word from="Zaželeo" to="Zaželio" /> + <Word from="Zaželjeo" to="Zaželio" /> + <Word from="zaželjeo" to="zaželio" /> <Word from="zbg" to="zbog" /> <Word from="zdrvo" to="zdravo" /> <Word from="Zdrvo" to="Zdravo" /> <Word from="zlodela" to="zlodjela" /> <Word from="znaći" to="znači" /> <Word from="zvaničan" to="služben" /> + <Word from="zvezdom" to="zvijezdom" /> <Word from="žemo" to="ćemo" /> + <Word from="želeo" to="želio" /> + <Word from="Želeo" to="Želio" /> + <Word from="Željeo" to="Želio" /> + <Word from="željeo" to="želio" /> <Word from="Živeo" to="Živio" /> + <Word from="živeo" to="živio" /> <Word from="žmureo" to="žmirio" /> <!-- imena --> + <Word from="Abi" to="Abby" /> + <Word from="Alis" to="Alice" /> + <Word from="Ajk" to="Ike" /> + <Word from="Ajku" to="Ikeu" /> + <Word from="Ajrin" to="Irene" /> + <Word from="Ajris" to="Iris" /> <Word from="Ajron" to="Iron" /> - <Word from="Arči" to="Archie" /> <Word from="Ajvi" to="Ivy" /> + <Word from="Anđeles" to="Angeles" /> + <Word from="Anđelesa" to="Angelesa" /> + <Word from="Anđelesu" to="Angelesu" /> + <Word from="Anđelesom" to="Angelesom" /> + <Word from="Antoni" to="Anthony" /> + <Word from="Antoniju" to="Anthonyju" /> + <Word from="Arči" to="Archie" /> <Word from="Beverli" to="Beverly" /> <Word from="Bejker" to="Baker" /> + <Word from="Bitls" to="Beatles" /> + <Word from="Bitlsi" to="Beatlesi" /> <Word from="Bridžit" to="Bridget" /> <Word from="Brižit" to="Brigitte" /> + <Word from="Bruks" to="Brooks" /> + <Word from="Dablin" to="Dublin" /> + <Word from="Dablina" to="Dublina" /> + <Word from="Dablinu" to="Dublinu" /> + <Word from="Dag" to="Doug" /> <Word from="Darvin" to="Darwin" /> <Word from="Darvina" to="Darwina" /> <Word from="Darvinu" to="Darwinu" /> @@ -956,66 +1319,153 @@ <Word from="Dejvu" to="Daveu" /> <Word from="Dejvom" to="Daveom" /> <Word from="Den" to="Dan" /> + <Word from="Deril" to="Daryl" /> + <Word from="Dijaz" to="Diaz" /> <Word from="Dru" to="Drew" /> - <Word from="Džosi" to="Josie" /> + <Word from="Đeni" to="Jenny" /> <Word from="Đošua" to="Joshua" /> + <Word from="Džejmi" to="Jamie" /> + <Word from="Džad" to="Jude" /> + <Word from="Džeri" to="Jerry" /> + <Word from="Džerija" to="Jerryja" /> + <Word from="Džo" to="Joe" /> + <Word from="Džoel" to="Joel" /> + <Word from="Džoelu" to="Joelu" /> + <Word from="Džoš" to="Josh" /> + <Word from="Džošu" to="Joshu" /> + <Word from="Džosi" to="Josie" /> + <Word from="Džozi" to="Josie" /> <Word from="Džes" to="Jess" /> <Word from="Džen" to="Jen" /> <Word from="Džej" to="Jay" /> <Word from="Džejn" to="Jane" /> <Word from="Džil" to="Jill" /> <Word from="Džodi" to="Jody" /> + <Word from="Džud" to="Jude" /> <Word from="Džuli" to="Julie" /> + <Word from="Ebi" to="Abby" /> <Word from="Ejb" to="Abe" /> + <Word from="Ejba" to="Abea" /> <Word from="Ejmi" to="Amy" /> <Word from="Ejpril" to="April" /> + <Word from="Empajer" to="Empire" /> + <Word from="Enđel" to="Angel" /> <Word from="Endži" to="Angie" /> <Word from="Entoni" to="Anthony" /> + <Word from="Ešford" to="Ashford" /> + <Word from="Ešforda" to="Ashforda" /> <Word from="Ešli" to="Ashley" /> <Word from="Fibi" to="Phoebe" /> + <Word from="Filovo" to="Philovo" /> + <Word from="Flober" to="Flaubert" /> + <Word from="Fokner" to="Faulkner" /> + <Word from="Fren" to="Fran" /> <Word from="Grečen" to="Gretchen" /> <Word from="Grejs" to="Grace" /> + <Word from="Hadson" to="Hudson" /> + <Word from="Hadsonu" to="Hudsonu" /> + <Word from="Hant" to="Hunt" /> + <Word from="Hemingvej" to="Hemingway" /> + <Word from="Henk" to="Hank" /> + <Word from="Hejstings" to="Hastings" /> <Word from="Hju" to="Hugh" /> <Word from="Hjua" to="Hugha" /> <Word from="Hjuz" to="Hughes" /> <Word from="Hjuza" to="Hughesa" /> <Word from="Hjuston" to="Houston" /> + <Word from="Hjustonu" to="Houstonu" /> + <Word from="Igo" to="Hugo" /> <Word from="Ilejn" to="Elaine" /> + <Word from="Židovin" to="Židov" /> + <Word from="Johni" to="Johnny" /> + <Word from="Judžin" to="Eugene" /> + <Word from="Kasl" to="Castle" /> + <Word from="Kejdž" to="Cage" /> + <Word from="Kejn" to="Kane" /> <Word from="Kejsi" to="Casey" /> + <Word from="Kejti" to="Katie" /> + <Word from="Keren" to="Karen" /> <Word from="Kerol" to="Carol" /> <Word from="Kerolajn" to="Caroline" /> - <Word from="Kloe" to="Chloe" /> + <Word from="Klajv" to="Clive" /> + <Word from="Klajva" to="Clivea" /> + <Word from="Klajve" to="Clive" /> + <Word from="Klajvu" to="Cliveu" /> + <Word from="Klarens" to="Clarence" /> + <Word from="Kler" to="Claire" /> + <Word from="Kloi" to="Chloe" /> + <Word from="Klod" to="Claude" /> + <Word from="Klode" to="Claude" /> + <Word from="Kol" to="Cole" /> + <Word from="Kolins" to="Collins" /> <Word from="Kortni" to="Courtney" /> - <Word from="Krejg" to="Craig" /> + <Word from="Krej?g" to="Craig" /> <Word from="Kristi" to="Christie" /> <Word from="Lajf" to="Life" /> + <Word from="Lajl" to="Lile" /> + <Word from="Lejk" to="Lake" /> + <Word from="Lorejn" to="Loraine" /> + <Word from="Lorens" to="Lawrence" /> <Word from="Lusi" to="Lucy" /> <Word from="Majk" to="Mike" /> + <Word from="Majkeve" to="Mikeove" /> + <Word from="Majlo" to="Milo" /> + <Word from="Maslou" to="Maslow" /> + <Word from="Medlin" to="Madelaine" /> <Word from="Medelin" to="Madeline" /> <Word from="Mejbel" to="Mabel" /> <Word from="Mejn" to="Maine" /> <Word from="Mejna" to="Mainea" /> <Word from="Mejnu" to="Maineu" /> <Word from="Mejnom" to="Maineom" /> + <Word from="Mejpls" to="Maples" /> + <Word from="Mejsi" to="Maisy" /> + <Word from="Mek" to="Mac" /> <Word from="Merilend" to="Maryland" /> <Word from="Mičel" to="Mitchell" /> - <Word from="Nejt" to="Nate" /> <Word from="Nensi" to="Nancy" /> <Word from="Niče" to="Nietzsche" /> + <Word from="Ničea" to="Nietzschea" /> + <Word from="Ničeu" to="Nietzscheu" /> + <Word from="Ničeom" to="Nietzscheom" /> <Word from="Odri" to="Audrey" /> <Word from="Ohajo" to="Ohio" /> + <Word from="Ohaja" to="Ohia" /> + <Word from="Ohaju" to="Ohiu" /> + <Word from="Olbrajt" to="Albright" /> + <Word from="O'Nil" to="O'Neal" /> + <Word from="Orlins" to="Orleans" /> + <Word from="Orlinsa" to="Orleansa" /> + <Word from="Orlinsu" to="Orleansu" /> <Word from="Pem" to="Pam" /> <Word from="Pejdž" to="Paige" /> + <Word from="Redži" to="Reggie" /> + <Word from="Redžinald" to="Reginald" /> + <Word from="Rej" to="Ray" /> <Word from="Rejčel" to="Rachel" /> + <Word from="Rič" to="Rich" /> <Word from="Rouz" to="Rose" /> - <Word from="Stejt" to="State" /> + <Word from="Sendi" to="Sandy" /> + <Word from="Sidnej" to="Sidney" /> + <Word from="Sindi" to="Cindy" /> + <Word from="Sojer" to="Sawyer" /> + <Word from="Sojeru" to="Sawyeru" /> + <Word from="Sole" to="Saule" /> <Word from="Stejsi" to="Stacy" /> + <Word from="Stoun" to="Stone" /> <Word from="Šeron" to="Sharon" /> <Word from="Šeril" to="Cheryl" /> + <Word from="Širli" to="Shirley" /> <Word from="Španiji" to="Španjolskoj" /> <Word from="Tajms" to="Times" /> <Word from="Tejlor" to="Taylor" /> + <Word from="Vajlder" to="Wilder" /> + <Word from="Valš" to="Walsh" /> + <Word from="Vins" to="Vince" /> + <Word from="Voren" to="Warren" /> + <Word from="Vud" to="Wood" /> <Word from="Žak" to="Jacques" /> + <Word from="Žil" to="Jules" /> <!-- imena mjeseci --> <Word from="januar" to="siječanj" /> <Word from="Januar" to="Siječanj" /> @@ -1036,6 +1486,7 @@ <Word from="juna" to="lipnja" /> <Word from="junu" to="lipnju" /> <Word from="Jun" to="Lipanj" /> + <Word from="Juni" to="Lipanj" /> <Word from="juli" to="srpanj" /> <Word from="jula" to="srpnja" /> <Word from="julu" to="srpnju" /> @@ -1044,6 +1495,8 @@ <Word from="Septembar" to="Rujan" /> <Word from="oktobar" to="listopad" /> <Word from="Oktobar" to="Listopad" /> + <Word from="oktobra" to="listopada" /> + <Word from="oktobru" to="listopadu" /> <Word from="novembar" to="studeni" /> <Word from="november" to="studeni" /> <Word from="novembra" to="studenog" /> @@ -1067,13 +1520,17 @@ <LinePart from="biti uredu" to="biti u redu" /> <LinePart from="bi da bude" to="bi biti" /> <LinePart from="Bi ste" to="Biste" /> + <LinePart from="Bilo ko" to="Bilo tko" /> <LinePart from="bilo ko" to="bilo tko" /> <LinePart from="će da dođe" to="će doći" /> + <LinePart from="Da li će" to="Hoće li" /> <LinePart from="Da li ćemo" to="Hoćemo li" /> + <LinePart from="Da li ću" to="Hoću li" /> <LinePart from="da li ću" to="hoću li" /> <LinePart from="dali ću" to="hoću li" /> <LinePart from="Da li je" to="Je li" /> <LinePart from="da li je" to="je li" /> + <LinePart from="dali je" to="je li" /> <LinePart from="Da li ste" to="Jeste li" /> <LinePart from="Da li si" to="Jesi li" /> <LinePart from="dali si" to="jesi li" /> @@ -1092,6 +1549,7 @@ <LinePart from="hoću da kažem" to="želim reći" /> <LinePart from="hoćeš da kažeš" to="želiš reći" /> <LinePart from="hoće da kaže" to="želi reći" /> + <LinePart from="hoću da živim" to="želim živjeti" /> <LinePart from="Izvini se" to="Ispričaj se" /> <LinePart from="izvini se" to="ispričaj se" /> <LinePart from="Izvinite me" to="Ispričajte me" /> @@ -1105,26 +1563,57 @@ <LinePart from="Jeli sve" to="Je li sve" /> <LinePart from="Jeli ti" to="Je li ti" /> <LinePart from="ko je" to="tko je" /> + <LinePart from="ko si" to="tko si" /> + <LinePart from="ko ti je" to="tko ti je" /> + <LinePart from="ko te je" to="tko te je" /> <LinePart from="ko zna" to="tko zna" /> + <LinePart from="moći da idemo" to="moći ići" /> <LinePart from="moglo da bude" to="moglo biti" /> <LinePart from="moje saučešće" to="moja sućut" /> <LinePart from="mora da bude" to="mora biti" /> + <LinePart from="moram da budem" to="moram biti" /> <LinePart from="Moram da idem" to="Moram ići" /> + <LinePart from="moram da idem" to="moram ići" /> + <LinePart from="Moraš da ideš" to="Moraš ići" /> <LinePart from="Moramo da idemo" to="Moramo ići" /> + <LinePart from="moram da vidim" to="moram vidjeti" /> + <LinePart from="moram da zaboravim" to="moram zaboraviti" /> + <LinePart from="moraš da zaboraviš" to="moraš zaboraviti" /> + <LinePart from="mora da zna" to="mora znati" /> + <LinePart from="moram da znam" to="moram znati" /> + <LinePart from="Moram da znam" to="Moram znati" /> + <LinePart from="moraš da znaš" to="moraš znati" /> <LinePart from="moraš da ideš" to="moraš ići" /> + <LinePart from="može da bude" to="može biti" /> + <LinePart from="možeš da budeš" to="možeš biti" /> + <LinePart from="može da diše" to="može disati" /> + <LinePart from="možeš da dobiješ" to="možeš dobiti" /> + <LinePart from="možemo da imamo" to="možemo imati" /> <LinePart from="na večer" to="navečer" /> <LinePart from="Na večer" to="Navečer" /> + <LinePart from="neće da bude" to="neće biti" /> + <LinePart from="nećeš da budeš" to="nećeš biti" /> + <LinePart from="nećeš da požališ" to="nećeš požaliti" /> + <LinePart from="Neko ko" to="Netko tko" /> <LinePart from="neko ko" to="netko tko" /> + <LinePart from="neko nešto" to="netko nešto" /> <LinePart from="nedjelju dana" to="tjedan dana" /> <LinePart from="Ne mogu da verujem" to="Ne mogu vjerovati" /> + <LinePart from="new yorški" to="njujorški" /> + <LinePart from="nju jorški" to="njujorški" /> <LinePart from="od kako" to="otkako" /> <LinePart from="Plašim se" to="Bojim se" /> <LinePart from="plašim se" to="bojim se" /> <LinePart from="pravo u oči" to="ravno u oči" /> + <LinePart from="sa njim" to="s njim" /> + <LinePart from="sa njima" to="s njima" /> <LinePart from="sa njom" to="s njom" /> <LinePart from="sa tim" to="s tim" /> <LinePart from="sa tom" to="s tom" /> <LinePart from="sa tobom" to="s tobom" /> + <LinePart from="sa vama" to="s vama" /> + <LinePart from="sam da budem" to="sam biti" /> + <LinePart from="sići dolje" to="sići" /> <LinePart from="Si dobro" to="Jesi li dobro" /> <LinePart from="Svako ko" to="Svatko tko" /> <LinePart from="Svo vreme" to="Sve vrijeme" /> @@ -1139,14 +1628,27 @@ <LinePart from="tamo natrag" to="tamo iza" /> <LinePart from="tamo je natrag" to="tamo je iza" /> <LinePart from="Tamo je natrag" to="Tamo je iza" /> + <LinePart from="treba da bude" to="treba biti" /> + <LinePart from="u jutro" to="ujutro" /> + <LinePart from="ući unutra" to="ući" /> + <LinePart from="vas je lagao" to="vam je lagao" /> + <LinePart from="za uvijek" to="zauvijek" /> <LinePart from="zato sto" to="zato što" /> + <LinePart from="zna da bude" to="zna biti" /> <LinePart from="zna ko" to="zna tko" /> <LinePart from="znati ko" to="znati tko" /> + <LinePart from="žele da budu" to="žele biti" /> + <LinePart from="želi da bude" to="želi biti" /> + <LinePart from="želio da budem" to="želio biti" /> <LinePart from="želim da budem" to="želim biti" /> <LinePart from="Želim da budem" to="Želim biti" /> <LinePart from="želiš da budeš" to="želiš biti" /> + <LinePart from="želim da idem" to="želim ići" /> <LinePart from="želim da odem" to="želim otići" /> <LinePart from="želiš da odeš" to="želiš otići" /> + <LinePart from="želiš da uđeš" to="želiš ući" /> + <LinePart from="želim da umrem" to="želim umrijeti" /> + <LinePart from="Želim da znam" to="Želim znati" /> <LinePart from="želim da znam" to="želim znati" /> <LinePart from="želiš da znaš" to="želiš znati" /> </PartialLines> @@ -1156,7 +1658,7 @@ <WholeLines /> <RegularExpressions> <!-- deklinacije imenica i konjugacije glagola --> - <RegEx find="([0-9])-ogodišnj([aeiu])\b" replaceWith="$1-godišnj$2" /> + <RegEx find="([0-9])-ogodišnj" replaceWith="$1-godišnj" /> <RegEx find="(jeda|dva|tri|četr|pet|šes|sedam|osam|devet)najst([aeiou]|i[mh]|o[mgj]|ima)\b" replaceWith="$1naest$2" /> <RegEx find="bsorbira" replaceWith="psorbira" /> <RegEx find="bstraktn" replaceWith="pstraktn" /> @@ -1182,10 +1684,13 @@ <RegEx find="beđivać" replaceWith="vjeravat ć" /> <RegEx find="beđujuć" replaceWith="vjeravajuć" /> <RegEx find="ekstv" replaceWith="ijeg" /> + <RegEx find="bj?elac" replaceWith="bijelac" /> <RegEx find="([bB])ele([šgž])" replaceWith="$1ilje$2" /> <!-- nikada sa velikim slovom jer je Bela ime --> <RegEx find="([bc])elin" replaceWith="$1jelin" /> + <RegEx find="belkinj" replaceWith="bjelkinj" /> <RegEx find="([bB])erz" replaceWith="$1urz" /> + <RegEx find="([bB])esom" replaceWith="$1jesom" /> <RegEx find="\bbezbj?ed" replaceWith="sigur" /> <RegEx find="\bBezbj?ed" replaceWith="Sigur" /> <RegEx find="\bbiblij([aeiou]|om|ama)\b" replaceWith="Biblij$1" /> @@ -1204,6 +1709,7 @@ <RegEx find="bioskop(?![si])" replaceWith="kin" /> <RegEx find="Bioskop(?![si])" replaceWith="Kin" /> <RegEx find="([bB])lj?ed([aeiouj])" replaceWith="$1lijed$2" /> + <RegEx find="bliži[čć]" replaceWith="bližit ć" /> <RegEx find="lagosloven" replaceWith="lagoslovljen" /> <RegEx find="ogat?st?v" replaceWith="ogatstv" /> <RegEx find="([bBvV])o[Il]e(n|l[aieo]|ti)\b" replaceWith="$1olje$2" /> @@ -1218,7 +1724,7 @@ <RegEx find="\b([cC])j?el([aeiou]|o[mgj]|i[mh]|ima?|osti)\b" replaceWith="$1ijel$2" /> <RegEx find="\b([cC])j?en([aeiou])" replaceWith="$1ijen$2" /> <RegEx find="([cC])j?enjen" replaceWith="$1ijenjen" /> - <RegEx find="\b([cC])j?ev(i|ima)\b" replaceWith="$1ijev$2" /> + <RegEx find="([cC])j?eni([lt])" replaceWith="$1ijeni$2" /> <RegEx find="([cC])rj?ev" replaceWith="$1rijev" /> <RegEx find="([cCsS])vj?e[ćč]([aeiou]|[oe]m|ama)\b" replaceWith="$1vijeć$2" /> <!-- časopisa » satopisa NE! - ne diraj te 2 linije! --> @@ -1226,23 +1732,17 @@ <RegEx find="Čas([au]|om|ov[aei]|ovima)\b" replaceWith="Sat$1" /> <RegEx find="([čČ])eka[čć]" replaceWith="$1ekat ć" /> <RegEx find="([čČ])ovi?j?e([kč])" replaceWith="$1ovje$2" /> - <RegEx find="\b[cč]([eu]|eš|emo|ete)\b" replaceWith="ć$1" /> - <RegEx find="\b[CČ]([eu]|eš|emo|ete)\b" replaceWith="Ć$1" /> - <RegEx find="ćut([ei])" replaceWith="šut$1" /> - <RegEx find="Ćut([ei])" replaceWith="Šut$1" /> + <RegEx find="ćopa" replaceWith="šepa" /> + <RegEx find="ćuti" replaceWith="šuti" /> + <RegEx find="Ćuti" replaceWith="Šuti" /> <RegEx find="\bćuta(?!o)" replaceWith="šutje" /> <RegEx find="\bĆuta(?!o)" replaceWith="Šutje" /> - <RegEx find="[cčć]utanje\b" replaceWith="šutnja" /> - <RegEx find="[CČĆ]utanje\b" replaceWith="Šutnja" /> - <RegEx find="[cčć]utanjem" replaceWith="šutnjom" /> - <RegEx find="[CČĆ]utanjem" replaceWith="Šutnjom" /> <RegEx find="[cčć]ut([ln])j" replaceWith="šut$1j" /> <RegEx find="[CČĆ]ut([ln])j" replaceWith="Šut$1j" /> <RegEx find="ćurk" replaceWith="puric" /> <RegEx find="Ćurk" replaceWith="Puric" /> <RegEx find="\b([dD])a[čć]([eu])" replaceWith="$1at ć$2" /> <RegEx find="ejstv(?!o)" replaceWith="jelovanj" /> - <RegEx find="ejstvo" replaceWith="jelo" /> <RegEx find="eklarisa" replaceWith="eklarira" /> <RegEx find="\b([dD])el([aou](?!x)|ić|ić[aeiu]|ima)" replaceWith="$1jel$2" /> <RegEx find="([dD])elova([lnt])" replaceWith="$1jelova$2" /> @@ -1253,8 +1753,6 @@ <RegEx find="([dD])eluj" replaceWith="$1jeluj" /> <RegEx find="([dD])isać" replaceWith="$1isat ć" /> <RegEx find="diskutova" replaceWith="raspravlja" /> - <RegEx find="diskutuje" replaceWith="raspravlja" /> - <RegEx find="Diskutuje" replaceWith="Raspravlja" /> <RegEx find="\b([dD])i?j?etet([au]|o[mv]|ov[aeiou]|ovo[mjg])\b" replaceWith="$1jetet$2" /> <RegEx find="\b([dD])ec([aeiou]|om)\b" replaceWith="$1jec$2" /> <RegEx find="\b([dD])e[čć]ic" replaceWith="$1ječic" /> @@ -1262,6 +1760,7 @@ <RegEx find="\b([dD])evi([cč])" replaceWith="$1jevi$2" /> <RegEx find="\b([dD])evoj" replaceWith="$1jevoj" /> <RegEx find="([dD])eča" replaceWith="$1ječa" /> + <RegEx find="delji" replaceWith="djelji" /> <RegEx find="([dD])j?eči?j" replaceWith="$1ječj" /> <RegEx find="([dD])etinj" replaceWith="$1jetinj" /> <RegEx find="\b([dD])esi(?!ć)" replaceWith="$1ogodi" /> @@ -1269,7 +1768,7 @@ <RegEx find="\b([dD])j?eljenj" replaceWith="$1ijeljenj" /> <RegEx find="\b([dD])ijec([aeiou]|om)\b" replaceWith="$1jec$2" /> <RegEx find="ragoce" replaceWith="ragocje" /> - <RegEx find="([dD])obi[čćc]([eu])" replaceWith="$1obit ć$2" /> + <RegEx find="([dD])obi[čćc](?!i)" replaceWith="$1obit ć" /> <RegEx find="\b([dD])obij(a|en)" replaceWith="$1obiv$2" /> <RegEx find="([dD])o[čć]ić([eu])" replaceWith="$1oći ć$2" /> <RegEx find="([dD])ol?j?nj" replaceWith="$1onj" /> @@ -1295,7 +1794,7 @@ <RegEx find="Džigeric" replaceWith="Jetr" /> <RegEx find="žinovsk" replaceWith="ivovsk" /> <RegEx find="\bđep" replaceWith="džep" /> - <RegEx find="\bĐep" replaceWith="Džep" /> + <RegEx find="Đep" replaceWith="Džep" /> <RegEx find="\bđubret" replaceWith="smeć" /> <RegEx find="\bđubriš" replaceWith="smetliš" /> <RegEx find="eklariše" replaceWith="eklarira" /> @@ -1303,26 +1802,26 @@ <RegEx find="Ekspert(?![ni])" replaceWith="Stručnjak" /> <RegEx find="ekspertn" replaceWith="stručn" /> <RegEx find="Ekspertn" replaceWith="Stručn" /> + <RegEx find="enerk" replaceWith="enirk" /> <RegEx find="vakuiše" replaceWith="vakuira" /> <RegEx find="vakuišu" replaceWith="vakuiraju" /> <RegEx find="volucij?on(?![ar])" replaceWith="volucijsk" /> - <RegEx find="\b([eE])vr([aeiou]|om|ima)\b" replaceWith="$1ur$2" /> - <RegEx find="[eE]vrop([aeiou])" replaceWith="Europ$1" /> - <RegEx find="vropsk" replaceWith="uropsk" /> + <RegEx find="vrop" replaceWith="urop" /> <RegEx find="fabri[kc]" replaceWith="tvornic" /> <RegEx find="Fabri[kc]" replaceWith="Tvornic" /> - <RegEx find="familij[au]\b" replaceWith="obitelj" /> - <RegEx find="Familij[au]\b" replaceWith="Obitelj" /> + <RegEx find="fabrič" replaceWith="tvornič" /> <RegEx find="\bfarb" replaceWith="boj" /> <RegEx find="Farb(?!er)" replaceWith="Boj" /> <RegEx find="fij?o[ck]" replaceWith="ladic" /> <RegEx find="Fij?o[ck]" replaceWith="Ladic" /> <RegEx find="inansi" replaceWith="inanci" /> + <RegEx find="ormacij?on" replaceWith="ormacijsk" /> <RegEx find="\bfu[dt]bal(?![se])" replaceWith="nogomet" /> <RegEx find="\bFu[dt]bal(?![se])" replaceWith="Nogomet" /> <RegEx find="fu[dt]balsk" replaceWith="nogometn" /> <RegEx find="cioniše" replaceWith="cionira" /> <RegEx find="([fF])orezni" replaceWith="$1orenzi" /> + <RegEx find="ejsbu" replaceWith="aceboo" /> <RegEx find="arant(uje|ova)" replaceWith="arantira" /> <RegEx find="([gGsS])luv" replaceWith="$1luh" /> <RegEx find="([gG])nev" replaceWith="$1njev" /> @@ -1330,6 +1829,7 @@ <RegEx find="([gG])odić" replaceWith="$1odit ć" /> <RegEx find="ospodj" replaceWith="ospođ" /> <RegEx find="([gG])ore([lt])" replaceWith="$1orje$2" /> + <!-- ne diraj! [dogorio/razgorio/ izgorio] --> <RegEx find="([gG])oreo" replaceWith="$1orio" /> <RegEx find="([gG])rej(?!p)" replaceWith="$1rij" /> <RegEx find="\b([gG])rj?e([hs])" replaceWith="$1rije$2" /> @@ -1337,8 +1837,6 @@ <RegEx find="([gG])rj?eši([šsmotl])" replaceWith="$1riješi$2" /> <RegEx find="gvožđ" replaceWith="željez" /> <RegEx find="Gvožđ" replaceWith="Željez" /> - <RegEx find="([hHpP])akuje" replaceWith="$1akira" /> - <RegEx find="([hHpP])pakuju" replaceWith="$1akiraju" /> <RegEx find="haos" replaceWith="kaos" /> <RegEx find="Haos" replaceWith="Kaos" /> <RegEx find="hemi(?![sfgmt])" replaceWith="kemi" /> @@ -1355,22 +1853,21 @@ <RegEx find="hleb" replaceWith="kruh" /> <RegEx find="Hleb" replaceWith="Kruh" /> <RegEx find="\b([hH])oče" replaceWith="$1oće" /> - <RegEx find="holesterol" replaceWith="kolesterol" /> - <RegEx find="Holesterol" replaceWith="Kolesterol" /> + <!-- [h->k]olesterol --> + <RegEx find="holest" replaceWith="kolest" /> + <RegEx find="Holest" replaceWith="Kolest" /> <RegEx find="\bhor([au]|om|ov[ia]|ovima)\b" replaceWith="zbor$1" /> <RegEx find="\bHor([au]|om|ov[ia]|ovima)\b" replaceWith="Zbor$1" /> <RegEx find="hri?šćan" replaceWith="kršćan" /> <RegEx find="Hri?šćan" replaceWith="Kršćan" /> <RegEx find="[kh]romo[sz]om" replaceWith="kromosom" /> <RegEx find="[KH]romo[sz]om" replaceWith="Kromosom" /> - <RegEx find="hroničn" replaceWith="kroničn" /> - <RegEx find="Hroničn" replaceWith="Kroničn" /> - <RegEx find="([hH])tj?eo" replaceWith="$1tio" /> + <RegEx find="hronič" replaceWith="kronič" /> + <RegEx find="Hronič" replaceWith="Kronič" /> <RegEx find="([hH])te([lt])" replaceWith="$1tje$2" /> + <RegEx find="idja" replaceWith="iđa" /> <RegEx find="\b([iI])mać" replaceWith="$1mat ć" /> - <RegEx find="nformacij?on" replaceWith="nformacijsk" /> <RegEx find="nostranstv" replaceWith="nozemstv" /> - <RegEx find="nsistirać" replaceWith="nzistirat ć" /> <RegEx find="nstikt" replaceWith="nstinkt" /> <RegEx find="interesantn" replaceWith="zanimljiv" /> <RegEx find="Interesantn" replaceWith="Zanimljiv" /> @@ -1382,9 +1879,8 @@ <RegEx find="ntezivn" replaceWith="ntenzivn" /> <RegEx find="([iI])seče" replaceWith="$1zreže" /> <RegEx find="spoljava" replaceWith="zražava" /> - <RegEx find="([iI])spovj?e(d|st)" replaceWith="$1spovije$2" /> + <RegEx find="spovj?e(d|st)" replaceWith="spovije$1" /> <RegEx find="zbe([gć])" replaceWith="zbje$1" /> - <RegEx find="sčez" replaceWith="ščez" /> <RegEx find="spresj?ecan" replaceWith="spresijecan" /> <RegEx find="spri[čć]ać" replaceWith="spričat ć" /> <RegEx find="italijan" replaceWith="talijan" /> @@ -1394,20 +1890,16 @@ <RegEx find="znj?el" replaceWith="znijel" /> <RegEx find="zolova" replaceWith="zolira" /> <RegEx find="zume([ltv])" replaceWith="zumje$1" /> - <RegEx find="zneveri" replaceWith="znevjeri" /> <RegEx find="zvesn" replaceWith="zvjesn" /> - <RegEx find="zvine([mš])" replaceWith="spriča$1" /> <RegEx find="zvinjava([mšojlt]) se" replaceWith="spričava$1 se" /> <RegEx find="([iI])zvin[iu]([lo])" replaceWith="$1spriča$2" /> + <RegEx find="jaket" replaceWith="jakn" /> <RegEx find="\b([jJ])agnje" replaceWith="$1anje" /> <RegEx find="jereti" replaceWith="hereti" /> <RegEx find="Jereti" replaceWith="Hereti" /> <RegEx find="jevanđelj" replaceWith="evanđelj" /> - <RegEx find="\bJovan([aeou])?" replaceWith="Ivan$1" /> <RegEx find="\b([kK])af([aeiou]|om|ama|anama|ic[aeiu]|an[aeiuo]|anom|ansk[aeiuo])\b" replaceWith="$1av$2" /> <RegEx find="([kK]alib(?:ar|r[aeui]))\. *([0-9])" replaceWith="$1 .$2" /> - <RegEx find="kancelarij[au]" replaceWith="ured" /> - <RegEx find="Kancelarij[au]" replaceWith="Ured" /> <RegEx find="arantin" replaceWith="aranten" /> <RegEx find="kašik" replaceWith="žlic" /> <RegEx find="Kašik" replaceWith="Žlic" /> @@ -1464,7 +1956,7 @@ <RegEx find="([lL])j?eči([mštol])" replaceWith="$1iječi$2" /> <RegEx find="([lL])j?e[čć]ni([cč])" replaceWith="$1iječni$2" /> <RegEx find="([lL])j?e[čć]nik(?!i)" replaceWith="$1iječnik" /> - <RegEx find="\b([lL])ekar([aeiou])?" replaceWith="$1iječnik$2" /> + <RegEx find="\b([lL])ekar(?![inso])" replaceWith="$1iječnik" /> <RegEx find="\b([lL])j?ek([au]|om|ov[aei]|ovima)?\b" replaceWith="$1ijek$2" /> <RegEx find="\b([iI]zl|[lL])j?ečen" replaceWith="$1iječen" /> <RegEx find="\blenj?([aeiou]|om|osti?|ošću|ima?|čin[aieou]|činama)?\b" replaceWith="lijen$1" /> @@ -1474,13 +1966,14 @@ <RegEx find="([lL])j?epot" replaceWith="$1jepot" /> <RegEx find="\b([lL])ep([šil])" replaceWith="$1jep$2" /> <RegEx find="\b([lL])ev(?!is)" replaceWith="$1ijev" /> - <RegEx find="([lL])eteo" replaceWith="$1etio" /> <RegEx find="(?<!p)([lL])ete([lt])" replaceWith="$1etje$2" /> + <!-- ne diraj! [uzletio/razletio/sletio/podletio] --> + <RegEx find="([lL])eteo" replaceWith="$1etio" /> <RegEx find="\b([lL])eto([ms])" replaceWith="$1jeto$2" /> <RegEx find="icemer" replaceWith="icemjer" /> <RegEx find="\bličn([aeiou]|im|o[mgj])" replaceWith="osobn$1" /> <RegEx find="\bLičn([aeiou]|im|o[mgj])" replaceWith="Osobn$1" /> - <RegEx find="([lL])obanj" replaceWith="$1ubanj" /> + <RegEx find="(?<![kz])obanj" replaceWith="ubanj" /> <RegEx find="([lL])ović" replaceWith="$1ovit ć" /> <RegEx find="\b([lL])jep([aeiou]|om|oj|ima)\b" replaceWith="$1ijep$2" /> <RegEx find="\b([lL])uda([kcč])" replaceWith="$1uđa$2" /> @@ -1496,14 +1989,15 @@ <RegEx find="\b([mM])er([aou]|i[lt]|e(?!d))" replaceWith="$1jer$2" /> <RegEx find="([mM])ese([cč])" replaceWith="$1jese$2" /> <RegEx find="\b([mM])est([aoiu])" replaceWith="$1jest$2" /> + <RegEx find="mešt(?!r)" replaceWith="mješt" /> <RegEx find="igracion" replaceWith="igracijsk" /> - <RegEx find="islić" replaceWith="islit ć" /> + <RegEx find="(is|si)lić" replaceWith="$1lit ć" /> <RegEx find="išič" replaceWith="išić" /> <RegEx find="([mM])j?ešalic" replaceWith="$1iješalic" /> <RegEx find="([mM])j?eša([jmnšo]|n[aio]|no[mgj]|nima?|mo|ju|njem|nj[aeu]|l[aeio]|t[ei])?\b" replaceWith="$1iješa$2" /> <RegEx find="([mM])edve([dđ])" replaceWith="$1edvje$2" /> <RegEx find="minđuš" replaceWith="naušnic" /> - <RegEx find="ilij?on" replaceWith="ilijun" /> + <RegEx find="ilij?[ou]n" replaceWith="ilijun" /> <RegEx find="(?<![iI]|[kK]a)([mM])j?enja([jmnšo]|mo|njem?|ju|l[aeio]|t[ei])?\b" replaceWith="$1ijenja$2" /> <RegEx find="([mM])lj?ek([aou])" replaceWith="$1lijek$2" /> <RegEx find="([mM])lj?ečn" replaceWith="$1liječn" /> @@ -1517,25 +2011,25 @@ <RegEx find="rzeć(?!i)" replaceWith="rzit ć" /> <RegEx find="([mM])uva([mjovšlt])" replaceWith="$1ota$2" /> <RegEx find="([mM])uv([eou])" replaceWith="$1uh$2" /> - <RegEx find="muzik([aeu]|om)\b" replaceWith="glazb$1" /> - <RegEx find="Muzik([aeu]|om)\b" replaceWith="Glazb$1" /> <RegEx find="muzičk" replaceWith="glazben" /> <RegEx find="Muzičk" replaceWith="Glazben" /> <RegEx find="nabdjeva(?!č)" replaceWith="nabdijeva" /> + <RegEx find="([nN])aden" replaceWith="$1adjen" /> + <RegEx find="([nN])amer" replaceWith="$1amjer" /> <RegEx find="agovj?est" replaceWith="agovijest" /> <RegEx find="ajcijenjen" replaceWith="ajcjenjen" /> <RegEx find="\b([nN])amj?en([aeiou])" replaceWith="$1amjen$2" /> <RegEx find="\b([nN])amj?eni([mštol])" replaceWith="$1amijeni$2" /> <RegEx find="(?<![zZ])amest" replaceWith="amjest" /> - <RegEx find="([nN]a|[Ss])mešta" replaceWith="$1mješta" /> <RegEx find="([nN])ane([lt])" replaceWith="$1anje$2" /> <RegEx find="aočar(?!k)" replaceWith="aočal" /> - <RegEx find="([nN])aran[đd]ž" replaceWith="$1aranč" /> + <RegEx find="aran[đd]ž" replaceWith="aranč" /> <RegEx find="arudžbin" replaceWith="arudžb" /> <RegEx find="([nN])asel([aeio])\b" replaceWith="$1asjel$2" /> <RegEx find="([nN]a|[Ii])smej" replaceWith="$1smij" /> <RegEx find="asle([dđ])" replaceWith="aslje$1" /> <RegEx find="([nN])atera" replaceWith="$1atjera" /> + <RegEx find="([nN])atj?erać" replaceWith="$1atjerat ć" /> <RegEx find="([nN])a(gradi|pravi|tera|uči|zva)ć" replaceWith="$1a$2t ć" /> <RegEx find="naučn" replaceWith="znanstven" /> <RegEx find="Naučn" replaceWith="Znanstven" /> @@ -1555,8 +2049,8 @@ <RegEx find="esmij" replaceWith="e smij" /> <RegEx find="esre[cćč]n" replaceWith="esretn" /> <RegEx find="esvj?est" replaceWith="esvijest" /> - <RegEx find="(?<!hv)ališ[eu]" replaceWith="alizira" /> - <RegEx find="([nN])ezna([mš]|mo|t[ei]|ju|jući)?\b" replaceWith="$1e zna$2" /> + <RegEx find="(?<!mhv)ališ[eu]" replaceWith="alizira" /> + <RegEx find="([nN])ezna(?![bčlnt])" replaceWith="$1e zna" /> <RegEx find="([nN])ežn" replaceWith="$1ježn" /> <RegEx find="\b([nN])oč([iu]|n[aeiou]|no[mjg]|nim)?" replaceWith="$1oć$2" /> <RegEx find="\b([oO])dbra" replaceWith="$1bra" /> @@ -1575,7 +2069,7 @@ <RegEx find="\b([oO])dj?elo" replaceWith="$1dijelo" /> <RegEx find="\b([oO])dnje(l[aeio]|t|t[ei])\b" replaceWith="$1odnije$2" /> <RegEx find="\b([oO]|[pP]o|[rR]a|[sS]a)(d?)se([cć])" replaceWith="$1$2sje$3" /> - <RegEx find="dvešć([eu])" replaceWith="dvest ć$1" /> + <RegEx find="dvešć" replaceWith="dvest ć" /> <RegEx find="oficir(?!s)" replaceWith="časnik" /> <RegEx find="oficirs" replaceWith="časnič" /> <RegEx find="gladne([lvt])" replaceWith="gladnje$1" /> @@ -1584,8 +2078,9 @@ <RegEx find="pklad" replaceWith="klad" /> <RegEx find="(?<![mdp])ostić" replaceWith="ostit ć" /> <RegEx find="psedn" replaceWith="psjedn" /> - <RegEx find="([oO])pšt([aeiu]|[eoi]m)" replaceWith="$1pć$2" /> + <RegEx find="(?<!d)([oO])pšt" replaceWith="$1pć" /> <RegEx find="\b([oO])rman" replaceWith="$1rmar" /> + <RegEx find="ortova([lt])" replaceWith="ortira$1" /> <RegEx find="ružij" replaceWith="ružj" /> <RegEx find="([oO])set" replaceWith="$1sjet" /> <RegEx find="(?<![dDPp]rv?)([oO])si?j?e[ćč]a" replaceWith="$1sjeća" /> @@ -1599,10 +2094,11 @@ <RegEx find="ovaploćenj" replaceWith="utjelovljenj" /> <RegEx find="Ovaploćenj" replaceWith="Utjelovljenj" /> <RegEx find="vlaš[cćč]en" replaceWith="vlašten" /> + <RegEx find="ozbir" replaceWith="obzir" /> <RegEx find="\b([oO])zli?j?ed([aeiu]|om|ama)\b" replaceWith="$1zljed$2" /> <RegEx find="\b([oO])zlj?edi([moštl])" replaceWith="$1zlijedi$2" /> <RegEx find="zleđen" replaceWith="zlijeđen" /> - <RegEx find="([pP])acj?ent" replaceWith="$1acijent" /> + <RegEx find="acj?ent" replaceWith="acijent" /> <RegEx find="pacov" replaceWith="štakor" /> <RegEx find="Pacov" replaceWith="Štakor" /> <RegEx find="(?<!\b[zZ]apre)([pP])ašć([eu])" replaceWith="$1ast ć$2" /> @@ -1638,6 +2134,7 @@ <RegEx find="lude([lt])" replaceWith="ludje$1" /> <RegEx find="([pP]o|[iI]z)ludeć" replaceWith="$1ludjet ć" /> <RegEx find="ludj?eo" replaceWith="ludio" /> + <RegEx find="pomarandž" replaceWith="naranč" /> <RegEx find="\bpomen" replaceWith="spomen" /> <RegEx find="\bPomen" replaceWith="Spomen" /> <RegEx find="pomera([mšt])" replaceWith="miče$1" /> @@ -1655,22 +2152,23 @@ <RegEx find="otcenjiva" replaceWith="odcjenjiva" /> <RegEx find="([pP])oter" replaceWith="$1otjer" /> <RegEx find="ovinuje" replaceWith="okorava" /> - <RegEx find="([pP]o|[uU])vrj?edi([lomšt])" replaceWith="$1vrijedi$2" /> + <RegEx find="vrj?edi([lomšt])" replaceWith="vrijedi$1" /> <RegEx find="([pP]r?)over" replaceWith="$1ovjer" /> <RegEx find="([uUo])ver(en|lji)" replaceWith="$1vjer$2" /> <RegEx find="pozoriš" replaceWith="kazališ" /> <RegEx find="Pozoriš" replaceWith="Kazališ" /> <RegEx find="raktikuje" replaceWith="rakticira" /> - <RegEx find="reci?j?edni([čk])" replaceWith="redsjedni$1" /> - <RegEx find="redsedni([čk])" replaceWith="redsjedni$1" /> + <RegEx find="rebić" replaceWith="rebit ć" /> + <RegEx find="reci?j?edni" replaceWith="redsjedni" /> + <RegEx find="redsedni" replaceWith="redsjedni" /> <RegEx find="rj?edlo([gz])" replaceWith="rijedlo$1" /> - <RegEx find="redamnom" replaceWith="reda mnom" /> - <RegEx find="red?postav" replaceWith="retpostav" /> + <RegEx find="repostav" replaceWith="retpostav" /> <RegEx find="ređaš" replaceWith="rijaš" /> <RegEx find="premić" replaceWith="premit ć" /> <RegEx find="renje([lt])" replaceWith="renije$1" /> - <RegEx find="([pP])rese([čk])" replaceWith="$1resje$2" /> + <RegEx find="rese([čk])" replaceWith="resje$1" /> <RegEx find="([pP])r([oe])ter" replaceWith="$1r$2tjer" /> + <RegEx find="([pP])rets" replaceWith="$1reds" /> <RegEx find="prevazi" replaceWith="nadi" /> <RegEx find="Prevazi" replaceWith="Nadi" /> <RegEx find="ridik" replaceWith="rodik" /> @@ -1684,7 +2182,7 @@ <RegEx find="(ri|[Ss])tiskaj" replaceWith="$1tišći" /> <RegEx find="rj?estupni([kc])([aeu]|om)\b" replaceWith="rijestupni$1$2" /> <RegEx find="\b([pP])rj?evoz([aiu]|om)?\b" replaceWith="$1rijevoz$2" /> - <RegEx find="([pP])rj?etnj" replaceWith="$1rijetnj" /> + <RegEx find="\b([pP])rj?etnj" replaceWith="$1rijetnj" /> <RegEx find="rimi?j?ećuj" replaceWith="rimjećuj" /> <RegEx find="\b([pP])rimj?e(ćen|ćen[aeiou]|tio?|til[aeio]|njen|šati|šan|[st]iti)\b" replaceWith="$1rimije$2" /> <RegEx find="([pP])rime([rn])" replaceWith="$1rimje$2" /> @@ -1703,9 +2201,10 @@ <RegEx find="romen(?!ad)" replaceWith="romjen" /> <RegEx find="([pP])romj?eni([mštl])" replaceWith="$1romijeni$2" /> <RegEx find="([pP])rotiv([adkoprstz])" replaceWith="$1rotu$2" /> - <RegEx find="([pP])rovid([an])" replaceWith="$1rozir$2" /> + <RegEx find="rovid([an])" replaceWith="rozir$1" /> <RegEx find="rovj?erić" replaceWith="rovjerit ć" /> - <RegEx find="ustić([eu])" replaceWith="ustit ć$1" /> + <RegEx find="punić" replaceWith="punit ć" /> + <RegEx find="ustić(?!i)" replaceWith="ustit ć" /> <RegEx find="put[ae]?r" replaceWith="maslac" /> <RegEx find="Put[ae]?r" replaceWith="Maslac" /> <RegEx find="(?<!g)([rR])a([dn])ić([eu])" replaceWith="$1a$2it ć$3" /> @@ -1721,7 +2220,6 @@ <RegEx find="([rRlL])e[čć]ić([eu])" replaceWith="$1eći ć$2" /> <RegEx find="egistrova" replaceWith="egistrira" /> <RegEx find="(?<!r)ištić" replaceWith="ištit ć" /> - <RegEx find="([rR])j?ečju" replaceWith="$1iječju" /> <RegEx find="([rR])editelj" replaceWith="$1edatelj" /> <RegEx find="egulis" replaceWith="egulir" /> <RegEx find="reme([sš])t" replaceWith="remje$1t" /> @@ -1729,7 +2227,7 @@ <RegEx find="\b([rR])i?j?ešava" replaceWith="$1ješava" /> <RegEx find="(?<!k)amj?enjen" replaceWith="amijenjen" /> <RegEx find="mjenjen" replaceWith="mijenjen" /> - <RegEx find="([rR])izik(ova|uje)" replaceWith="$1iskira" /> + <RegEx find="izik(ova|uje)" replaceWith="iskira" /> <RegEx find="([^d])rješit" replaceWith="$1riješit" /> <RegEx find="([Rr])j?ešić" replaceWith="$1iješit ć" /> <RegEx find="([rR])i?j?ešenj([aeiu])" replaceWith="$1ješenj$2" /> @@ -1742,7 +2240,6 @@ <RegEx find="Sačeka" replaceWith="Pričeka" /> <RegEx find="aglasno" replaceWith="uglasno" /> <RegEx find="\bsam sam\b" replaceWith="sam sâm" /> - <RegEx find="amoubist(a?)v" replaceWith="amoubojst$1v" /> <RegEx find="amoubic" replaceWith="amoubojic" /> <RegEx find="\bsanti" replaceWith="centi" /> <RegEx find="saobraćaj(?![ac])" replaceWith="promet" /> @@ -1799,6 +2296,7 @@ <RegEx find="([sS])pasen(?!j)" replaceWith="$1pašen" /> <RegEx find="spolja?š?nj?" replaceWith="vanjsk" /> <RegEx find="Spolja?š?nj?" replaceWith="Vanjsk" /> + <RegEx find="portist" replaceWith="portaš" /> <RegEx find="\bsprat" replaceWith="kat" /> <RegEx find="\bSprat" replaceWith="Kat" /> <RegEx find="pri?j?ečava" replaceWith="prječava" /> @@ -1821,12 +2319,9 @@ <RegEx find="sujever" replaceWith="praznovjer" /> <RegEx find="Sujever" replaceWith="Praznovjer" /> <RegEx find="([sS])umlj" replaceWith="$1umnj" /> - <RegEx find="([sS])unđer" replaceWith="$1pužva" /> - <RegEx find="\bsup([aeiu]|om|ama)\b" replaceWith="juh$1" /> - <RegEx find="\bSup([aeiu]|om|ama)\b" replaceWith="Juh$1" /> + <RegEx find="unđer" replaceWith="pužva" /> <RegEx find="used" replaceWith="usjed" /> <RegEx find="\b([sS])uv([aeiou])\b" replaceWith="$1uh$2" /> - <RegEx find="([sS])uvo([mgj])\b" replaceWith="$1uho$2" /> <RegEx find="suštin[eio]" replaceWith="biti" /> <RegEx find="Suštin[eio]" replaceWith="Biti" /> <RegEx find="vedo([čkc])" replaceWith="vjedo$1" /> @@ -1841,8 +2336,6 @@ <RegEx find="Šar?garep" replaceWith="Mrkv" /> <RegEx find="([šŠ])ečer" replaceWith="$1ećer" /> <RegEx find="([šŠ])olj" replaceWith="$1alic" /> - <RegEx find="\bŠpanij([aeou])" replaceWith="Španjolsk$1" /> - <RegEx find="\b([šŠ])pansk" replaceWith="$1panjolsk" /> <RegEx find="štab" replaceWith="stožer" /> <RegEx find="Štab" replaceWith="Stožer" /> <RegEx find="štamparsk" replaceWith="tiskovn" /> @@ -1879,7 +2372,7 @@ <RegEx find="bj?eđivanj" replaceWith="vjeravanj" /> <RegEx find="\b([uU])bic" replaceWith="$1bojic" /> <RegEx find="(?<!l)([Uu])([bd])ić" replaceWith="$1$2it ć" /> - <RegEx find="\b([uU])bist" replaceWith="$1bojst" /> + <RegEx find="(?<![Kk])([uU])bist" replaceWith="$1bojst" /> <RegEx find="ucać" replaceWith="ucat ć" /> <RegEx find="\b([uUoO])cen" replaceWith="$1cjen" /> <RegEx find="učestv" replaceWith="sudjel" /> @@ -1890,14 +2383,13 @@ <RegEx find="([uU])mešan" replaceWith="$1mješan" /> <RegEx find="([uU])metni([kcč])" replaceWith="$1mjetni$2" /> <RegEx find="([uU])metno" replaceWith="$1mjetno" /> - <RegEx find="([uU])mi?j?esto" replaceWith="$1mjesto" /> - <RegEx find="([uU])mrj?eć([eu])" replaceWith="$1mrijet ć$2" /> + <RegEx find="([uU])mrj?eć" replaceWith="$1mrijet ć" /> <RegEx find="\b([uU])nj?e([lt])" replaceWith="$1nije$2" /> <RegEx find="\b([uU]?)([nN])aprj?ed\b" replaceWith="$1$2aprijed" /> <RegEx find="([uU])pore" replaceWith="$1spore" /> <RegEx find="([uU])potrj?ebi([štol])" replaceWith="$1potrijebi$2" /> <RegEx find="propa[sš][čćc]ava" replaceWith="propaštava" /> - <RegEx find="([uU])radić([eu])" replaceWith="$1činit ć$2" /> + <RegEx find="([uU])radić" replaceWith="$1činit ć" /> <RegEx find="ezuslov" replaceWith="ezuvjet" /> <RegEx find="\b([uU])slov" replaceWith="$1vjet" /> <RegEx find="([uU])smer([aie])" replaceWith="$1smjer$2" /> @@ -1913,10 +2405,8 @@ <RegEx find="\buskrs([aeiu]|om|ima)?\b" replaceWith="Uskrs$1" /> <RegEx find="([uU])tiče" replaceWith="$1tječe" /> <RegEx find="\b([uU])ver([aeil])" replaceWith="$1vjer$2" /> - <RegEx find="([uU])vj?ek" replaceWith="$1vijek" /> <RegEx find="\b([uUcC])vet([aeiu]|om|ima|n[aeiou]|nima?|no[mgj])?\b" replaceWith="$1vjet$2" /> - <RegEx find="\b([uU])v([oau]|om)\b" replaceWith="$1h$2" /> - <RegEx find="\b([uU])zeć([eu])" replaceWith="$1zet ć$2" /> + <RegEx find="\b([uU])zeć" replaceWith="$1zet ć" /> <RegEx find="([uU])zok" replaceWith="$1zrok" /> <RegEx find="vajarstv" replaceWith="kiparstv" /> <RegEx find="Vajarstv" replaceWith="Kiparstv" /> @@ -1938,30 +2428,27 @@ <RegEx find="vazdušn" replaceWith="zračn" /> <RegEx find="Vazdušn" replaceWith="Zračn" /> <!-- bez e, jer mijenja veče(r) u veće, što je gnjavaža --> - <RegEx find="\b([vV])eč([aiu]|[ei]m|eg|ih|ima|o[mj])?\b" replaceWith="$1eć$2" /> + <RegEx find="\b([vV])eč([aiu]|[ei][mg]|ih|ima|in[iu]|inom|o[mj])?\b" replaceWith="$1eć$2" /> <RegEx find="([vV])e[čć]n" replaceWith="$1ječn" /> <RegEx find="([vV])ečit" replaceWith="$1ječit" /> <RegEx find="([vV])enča" replaceWith="$1jenča" /> - <RegEx find="\b([vV])er([aeiou]|an|n[aeiou]|no[mgj]|nosti?|nošću|om|ama|nik|nik[aeu]|ni[ck]om|nic[aeiu]|nic[ai]ma|sk[aeiou]|sko[mgj]|ski[mh]|oval[aeio]|ovanja|ovanjima]|ovati)\b" replaceWith="$1jer$2" /> - <RegEx find="\b([nN])ever([aeioun])" replaceWith="$1evjer$2" /> + <RegEx find="\b([vV])er([ova|ns])" replaceWith="$1jer$2" /> + <RegEx find="([nN])ever(?!b)" replaceWith="$1evjer" /> <RegEx find="([vV])erova" replaceWith="$1jerova" /> <RegEx find="([vV])j?ero[vj]at(a?)n" replaceWith="$1jerojat$2n" /> <RegEx find="([vV])eruj" replaceWith="$1jeruj" /> <RegEx find="\bvereni([ckč])" replaceWith="zaručni$1" /> <RegEx find="\bVereni([ckč])" replaceWith="Zaručni$1" /> - <RegEx find="\b([vV])j?est(i|ima)?\b" replaceWith="$1ijest$2" /> <RegEx find="([vV])ešanj" replaceWith="$1ješanj" /> <RegEx find="([vV])ešt" replaceWith="$1ješt" /> <RegEx find="\b([vV])j?en(ac|c[aeiu]m?)" replaceWith="$1ijen$2" /> - <RegEx find="\b([vV])enčan" replaceWith="$1jenčan" /> - <RegEx find="veštačk" replaceWith="umjetn" /> - <RegEx find="Veštačk" replaceWith="Umjetn" /> + <RegEx find="vj?eštačk" replaceWith="umjetn" /> + <RegEx find="Vj?eštačk" replaceWith="Umjetn" /> <RegEx find="([vV])et(ar|r[aeuo])" replaceWith="$1jet$2" /> <RegEx find="([vV])ever" replaceWith="$1jever" /> <RegEx find="([vV])ežb" replaceWith="$1ježb" /> <RegEx find="([vV])ide([hlt])" replaceWith="$1idje$2" /> - <!-- [eu] mora ostati!!! --> - <RegEx find="([vV])idj?eć([eu])" replaceWith="$1idjet ć$2" /> + <RegEx find="([vVTt])idj?eć(?!i)" replaceWith="$1idjet ć" /> <RegEx find="([vV])ideo(?!zapis|tek[aiue]|\s+(ka[zs]et[aeiu]|igri?c?[aeiou]|snim[kc]|trgovin[aeoiu]))\b" replaceWith="$1idio" /> <RegEx find="\b([vV])išlj" replaceWith="$1iš" /> <RegEx find="([vV])olj?eć" replaceWith="$1oljet ć" /> @@ -1993,8 +2480,7 @@ <RegEx find="\b([zZ])vj?ezd([aeiou]|ama)\b" replaceWith="$1vijezd$2" /> <RegEx find="([zZ])vezd([ai])" replaceWith="$1vjezd$2" /> <RegEx find="([žŽ])el[ei]([lz]|ti)" replaceWith="$1elje$2" /> - <RegEx find="([žŽ])eleć([eu])" replaceWith="$1eljet ć$2" /> - <RegEx find="([žŽ])elj?eo" replaceWith="$1elio" /> + <RegEx find="([žŽ])eleć(?!i)" replaceWith="$1eljet ć" /> <RegEx find="([žŽ])ive([lt])" replaceWith="$1ivje$2" /> <RegEx find="iveć(?!i)" replaceWith="ivjet ć" /> <RegEx find="lj?ezd" replaceWith="lijezd" /> @@ -2007,9 +2493,7 @@ <!-- mjeseci [\b mora biti nakon jun]--> <RegEx find="januar([au]|ima)" replaceWith="siječnj$1" /> <RegEx find="([Ss])j?ečnj([au]|ima)" replaceWith="$1iječnj$2" /> - <RegEx find="\bmart([au]|om)\b" replaceWith="ožujk$1" /> <RegEx find="april([au]|ima)" replaceWith="travnj$1" /> - <RegEx find="\bmaj([au]|em)\b" replaceWith="svibnj$1" /> <RegEx find="\ba[uv]gust" replaceWith="kolovoz" /> <RegEx find="septembr" replaceWith="rujn" /> <RegEx find="oktobr" replaceWith="listopad" /> @@ -2017,19 +2501,40 @@ <RegEx find="Januar(?!s)" replaceWith="Siječnj" /> <RegEx find="April(?!s)" replaceWith="Travnj" /> <!--Marta je ime / Maja je ime--> - <RegEx find="\bA[uv]gust" replaceWith="Kolovoz" /> + <RegEx find="\bA[uv]gust(?!o)" replaceWith="Kolovoz" /> <RegEx find="Septembr" replaceWith="Rujn" /> <RegEx find="Oktobr" replaceWith="Listopad" /> <RegEx find="Decembr" replaceWith="Prosinc" /> <!-- pridjevi optimalan, minimalan i maksimalan nemaju komparativ i superlativ. --> <RegEx find="[Nn]aj(opt|min|maks)imalnij" replaceWith="$1imaln" /> <!-- experimental --> + <RegEx find="ÄŤ" replaceWith="č" /> + <RegEx find="Ä" replaceWith="č" /> + <RegEx find="ć" replaceWith="ć" /> + <RegEx find="Ä‘" replaceWith="đ" /> + <RegEx find="Ĺľ" replaceWith="ž" /> + <RegEx find="ž" replaceWith="ž" /> + <RegEx find="š" replaceWith="š" /> + <RegEx find="Å¡" replaceWith="š" /> + <RegEx find="ÄŚ" replaceWith="Č" /> + <RegEx find="ÄŒ" replaceWith="Č" /> + <RegEx find="Ć" replaceWith="Ć" /> + <RegEx find="Ä" replaceWith="Đ" /> + <RegEx find="Ĺ " replaceWith="Š" /> + <RegEx find="Å " replaceWith="Š" /> + <RegEx find="Ĺ˝" replaceWith="Ž" /> + <RegEx find="Ž" replaceWith="Ž" /> <RegEx find="[^e]seda(?!m|tiv)" replaceWith="sjeda" /> <RegEx find="ii" replaceWith="i" /> <RegEx find="đž" replaceWith="dž" /> + <RegEx find="zž" replaceWith="ž" /> + <RegEx find="(?<![Hh])abs" replaceWith="aps" /> + <RegEx find="acel" replaceWith="acjel" /> <RegEx find="adji" replaceWith="ađi" /> + <RegEx find="adk" replaceWith="atk" /> <RegEx find="(?<![ml])a([blcrnz])ić" replaceWith="a$1it ć" /> <RegEx find="a(jm|mn)(t?)ić" replaceWith="a$1$2it ć" /> + <RegEx find="ajuc" replaceWith="ajuć" /> <RegEx find="\bajpod" replaceWith="iPod" /> <RegEx find="alepn" replaceWith="aljepn" /> <RegEx find="alj?epi" replaceWith="alijepi" /> @@ -2038,20 +2543,27 @@ <RegEx find="ampovan" replaceWith="ampiran" /> <RegEx find="(an|ru|men|mi)tovan" replaceWith="$1tiran" /> <RegEx find="(?<!gl|[Nn])avić" replaceWith="avit ć" /> + <RegEx find="asmj?eš" replaceWith="asmiješ" /> <RegEx find="asnić" replaceWith="asnit ć" /> + <RegEx find="ašić" replaceWith="ašit ć" /> <RegEx find="azać" replaceWith="azat ć" /> <RegEx find="atrać" replaceWith="atrat ć" /> <RegEx find="aterać" replaceWith="atjerat ć" /> <RegEx find="(?<!s)avešć" replaceWith="avest ć" /> <RegEx find="aviknuće" replaceWith="aviknut će" /> <RegEx find="avirin" replaceWith="abirin" /> + <RegEx find="([aeiou])z([kp])" replaceWith="$1s$2" /> <RegEx find="(?<![Ss]p)avać" replaceWith="avat ć" /> <RegEx find="be[čć]aje" replaceWith="bećava" /> + <RegEx find="begl" replaceWith="bjegl" /> <RegEx find="iliše" replaceWith="ilizira" /> <RegEx find="ilišu" replaceWith="iliziraju" /> + <RegEx find="izc" replaceWith="isc" /> <RegEx find="ćič" replaceWith="čić" /> <RegEx find="dilova" replaceWith="dila" /> + <RegEx find="diteljk" replaceWith="diteljic" /> <RegEx find="citov" replaceWith="citir" /> + <RegEx find="cjenil" replaceWith="cijenil" /> <RegEx find="dnačin" replaceWith="dnadžb" /> <RegEx find="\bdral" replaceWith="deral" /> <RegEx find="dranj" replaceWith="deranj" /> @@ -2062,9 +2574,8 @@ <RegEx find="editov" replaceWith="editir" /> <RegEx find="edituje" replaceWith="editira" /> <RegEx find="edituju" replaceWith="editiraju" /> - <RegEx find="edh" replaceWith="eth" /> <RegEx find="edjen" replaceWith="eđen" /> - <RegEx find="edp" replaceWith="etp" /> + <RegEx find="ed([kph])" replaceWith="et$1" /> <RegEx find="(?<![NnJj])edać" replaceWith="edat ć" /> <RegEx find="eide(?!n)" replaceWith="e ide" /> <RegEx find="eizbež" replaceWith="eizbjež" /> @@ -2074,43 +2585,50 @@ <!-- bjegunac--> <RegEx find="(?<!j)egun" replaceWith="jegun" /> <RegEx find="(?<!j)elokup" replaceWith="jelokup" /> + <RegEx find="enlj" replaceWith="enj" /> <RegEx find="eoni([cč])" replaceWith="ioni$1" /> <RegEx find="erišu" replaceWith="eriraju" /> <RegEx find="ermer" replaceWith="ramor" /> <!-- bez j zbog nesvjestica npr. --> <RegEx find="esvest" replaceWith="esvijest" /> - <RegEx find="ešćeš" replaceWith="est ćeš" /> <RegEx find="etektov" replaceWith="etektir" /> <RegEx find="evać" replaceWith="evat ć" /> <RegEx find="fanziv" replaceWith="fenziv" /> <RegEx find="figurisa" replaceWith="figurira" /> <RegEx find="(mpl|st|f)ikova([nlot])" replaceWith="$1icira$2" /> <RegEx find="fikuj" replaceWith="ficir" /> - <RegEx find="(fin|form)isa" replaceWith="$1ira" /> + <RegEx find="(fi[ln]|form)isa" replaceWith="$1ira" /> + <RegEx find="(?<!o)formiš" replaceWith="formiraj" /> <RegEx find="fi(sa|še)" replaceWith="fira" /> + <RegEx find="fiskov" replaceWith="fiscir" /> <RegEx find="frov" replaceWith="frir" /> <RegEx find="grišć" replaceWith="grist ć" /> + <RegEx find="grutova" replaceWith="grutira" /> + <RegEx find="haot" replaceWith="kaot" /> <RegEx find="hrono" replaceWith="krono" /> - <RegEx find="(?<!M)ick([eoiu])" replaceWith="ičk$1" /> + <RegEx find="(?<![MH])ick([eoiu])" replaceWith="ičk$1" /> <RegEx find="idev" replaceWith="idjev" /> - <RegEx find="ijoz" replaceWith="ioz" /> - <RegEx find="interesuje" replaceWith="zanima" /> + <RegEx find="ijo([absdegknptz])" replaceWith="io$1" /> <RegEx find="([ai])nić" replaceWith="$1nit ć" /> <RegEx find="(?<!\b[Oo]zlo|\b[Ii]sp(rip)?ov|i)jeđen" replaceWith="ijeđen" /> <RegEx find="(?<!hva)lisa([ol])" replaceWith="lira$1" /> <RegEx find="(?<!hva)lisati" replaceWith="lirati" /> + <RegEx find="irać" replaceWith="irat ć" /> <RegEx find="jći" replaceWith="jući" /> <RegEx find="jdin" replaceWith="jedin" /> + <RegEx find="kodnevnic" replaceWith="kodnevic" /> <RegEx find="([kKpPvVtT])ratić" replaceWith="$1ratit ć" /> <RegEx find="koriš[čć]a" replaceWith="korišta" /> <!-- doktorica / profesorica --> <RegEx find="(kt|s)ork" replaceWith="$1oric" /> <RegEx find="ktovanj" replaceWith="ktiranj" /> + <RegEx find="ktuj" replaceWith="ktiraj" /> <RegEx find="(?<![Oo]b)([nl])izuj[eu]" replaceWith="$1izira" /> <RegEx find="\bl([čćžzvsmrtpdbgkn])" replaceWith="i$1" /> <RegEx find="\bL([čćžzvsmrtpdbgkn])" replaceWith="I$1" /> <RegEx find="(?<![Hh])omić" replaceWith="omit ć" /> <RegEx find="laćać" replaceWith="laćat ć" /> + <RegEx find="ledov" replaceWith="ljedov" /> <RegEx find="lj?epić" replaceWith="lijepit ć" /> <RegEx find="lepš" replaceWith="ljepš" /> <RegEx find="lizankinj" replaceWith="lizank" /> @@ -2122,10 +2640,10 @@ <RegEx find="luparenj" replaceWith="lupiranj" /> <RegEx find="([mv])ešten" replaceWith="$1ješten" /> <RegEx find="miniš[eu]" replaceWith="minira" /> - <RegEx find="([mv])ijon" replaceWith="$1ion" /> <RegEx find="m([io]t?)rić" replaceWith="m$1rit ć" /> <RegEx find="mi?j?enić" replaceWith="mijenit ć" /> <RegEx find="mjenim" replaceWith="mijenim" /> + <RegEx find="napredi" replaceWith="naprijedi" /> <RegEx find="ngažuj" replaceWith="ngažiraj" /> <RegEx find="nho" replaceWith="nko" /> <RegEx find="nisa([nlot])" replaceWith="nira$1" /> @@ -2141,8 +2659,10 @@ <RegEx find="ntiše" replaceWith="ntira" /> <RegEx find="ntišu" replaceWith="ntiraju" /> <RegEx find="ntitj?el" replaceWith="ntitijel" /> + <RegEx find="nzuje" replaceWith="nzira" /> <RegEx find="atursk" replaceWith="aturaln" /> <RegEx find="azuij" replaceWith="azumij" /> + <RegEx find="([pg])asić" replaceWith="$1asit ć" /> <RegEx find="obed" replaceWith="objed" /> <RegEx find="([oO])besi" replaceWith="$1bjesi" /> <RegEx find="o[cčć]aren" replaceWith="očaran" /> @@ -2150,20 +2670,23 @@ <RegEx find="oćeju" replaceWith="oće" /> <RegEx find="očeće" replaceWith="očet će" /> <RegEx find="očmi" replaceWith="očni" /> + <RegEx find="odseč" replaceWith="odsječ" /> <RegEx find="odsetni" replaceWith="odsjetni" /> + <RegEx find="oež" replaceWith="ože" /> <RegEx find="oješć" replaceWith="ojest ć" /> <RegEx find="ojtn" replaceWith="ojatn" /> - <RegEx find="oletn" replaceWith="oljetn" /> + <RegEx find="(?<![Pp])oletn" replaceWith="oljetn" /> + <RegEx find="onova([lt])" replaceWith="onira$1" /> <RegEx find="(?<![nt])opić" replaceWith="opit ć" /> <RegEx find="([eoa])pisać" replaceWith="$1pisat ć" /> <RegEx find="oriće(mo|te)" replaceWith="orit će$1" /> <RegEx find="orks" replaceWith="orsk" /> <RegEx find="osejan" replaceWith="osijan" /> <RegEx find="o([dbjpv])ać(?!o)" replaceWith="o$1at ć" /> + <RegEx find="oslj?ep" replaceWith="oslijep" /> <RegEx find="sj?etić" replaceWith="sjetit ć" /> <RegEx find="osb" replaceWith="osob" /> <RegEx find="ovinova([lt])" replaceWith="okorava$1" /> - <RegEx find="podp" replaceWith="potp" /> <RegEx find="posel" replaceWith="posjel" /> <RegEx find="produkova" replaceWith="producira" /> <RegEx find="\bpominj" replaceWith="spominj" /> @@ -2172,24 +2695,30 @@ <RegEx find="(?<![Pp]r|[Nn])adje(?!(v|n(e|u[olt]))\b)" replaceWith="ađe" /> <RegEx find="par nedj?elja" replaceWith="par tjedana" /> <RegEx find="pendov" replaceWith="pendir" /> - <RegEx find="rasčist" replaceWith="raščist" /> + <RegEx find="ralijs" replaceWith="rals" /> <RegEx find="kratij" replaceWith="kracij" /> <RegEx find="(?<![is]|S)redić" replaceWith="rjedit ć" /> + <RegEx find="(?<![mr])ejt" replaceWith="ate" /> <RegEx find="rešć" replaceWith="rest ć" /> <!-- preduzeti / preduzetnik --> <RegEx find="reduz" replaceWith="oduz" /> <RegEx find="relj?ep" replaceWith="relijep" /> - <RegEx find="rime([dt])" replaceWith="rimje$1" /> + <RegEx find="(?<!e)rime([dt])" replaceWith="rimje$1" /> + <RegEx find="risać(?!o)" replaceWith="risat ć" /> <RegEx find="ristun" replaceWith="risutn" /> <RegEx find="(?<!k)rimić" replaceWith="rimit ć" /> <RegEx find="prostav" replaceWith="protstav" /> <RegEx find="pulis" replaceWith="pulir" /> + <RegEx find="rićemo" replaceWith="rit ćemo" /> + <RegEx find="rčaće" replaceWith="rčat će" /> <RegEx find="renaduvan" replaceWith="renapuhan" /> <RegEx find="rijedel" replaceWith="rijedil" /> <RegEx find="r([mv])isa" replaceWith="r$1ira" /> + <RegEx find="rj?evozn" replaceWith="rijevozn" /> + <RegEx find="rutuje" replaceWith="rutira" /> <RegEx find="rviši" replaceWith="rviraj" /> <RegEx find="ržać" replaceWith="ržat ć" /> - <RegEx find="sčup" replaceWith="ščup" /> + <RegEx find="s([čć])" replaceWith="š$1" /> <RegEx find="seden" replaceWith="sjeden" /> <RegEx find="smeva" replaceWith="smijava" /> <RegEx find="stać(?!i)" replaceWith="stat ć" /> @@ -2199,12 +2728,15 @@ <RegEx find="struis" replaceWith="struir" /> <RegEx find="struiše" replaceWith="struira" /> <RegEx find="struišu" replaceWith="struiraju" /> - <RegEx find="stvrn" replaceWith="stvarn" /> - <RegEx find="(?<!n)svesti([lt])" replaceWith="svijest$1" /> + <RegEx find="(?<!n)([sz])vesti([lt])" replaceWith="$1vijest$2" /> <RegEx find="svetić" replaceWith="svetit ć" /> + <RegEx find="svetlj(?!iv)" replaceWith="svjetlj" /> + <RegEx find="([šđ])ać" replaceWith="$1ač" /> <RegEx find="šević" replaceWith="ševit ć" /> <RegEx find="šunjać" replaceWith="šuljat ć" /> + <RegEx find="tambul" replaceWith="tanbul" /> <RegEx find="tarisa" replaceWith="tira" /> + <RegEx find="taun" replaceWith="town" /> <RegEx find="tćeš" replaceWith="t ćeš" /> <RegEx find="tideo" replaceWith="tidio" /> <RegEx find="tede(?![oć])" replaceWith="tedje" /> @@ -2224,6 +2756,7 @@ <RegEx find="ueln" replaceWith="ualn" /> <RegEx find="uisa" replaceWith="uira" /> <RegEx find="tvd" replaceWith="tvrd" /> + <RegEx find="tvrn" replaceWith="tvarn" /> <RegEx find="u([bd])ić" replaceWith="u$1it ć" /> <RegEx find="u([cdtš])ać" replaceWith="u$1at ć" /> <RegEx find="(?<![Kk]lj|[Uu]n|[Vv]|[jJ]ast|[Ss]and)učić" replaceWith="učit ć" /> @@ -2238,22 +2771,29 @@ <RegEx find="umere" replaceWith="umjere" /> <RegEx find="upoce" replaceWith="upocje" /> <RegEx find="urfovan" replaceWith="urfan" /> + <RegEx find="ušać" replaceWith="ušat ć" /> + <RegEx find="uzp" replaceWith="usp" /> <RegEx find="(?<!kr|m)užić" replaceWith="užit ć" /> <RegEx find="veri([lt])" replaceWith="vjeri$1" /> <RegEx find="([do])vešć" replaceWith="$1vest ć" /> + <RegEx find="vetion" replaceWith="vjetion" /> <RegEx find="visić" replaceWith="visit ć" /> <RegEx find="visa([lt])" replaceWith="vira$1" /> <RegEx find="([vV])jeov" replaceWith="$1jerov" /> <RegEx find="vljstv" replaceWith="voljstv" /> - <RegEx find="vodić" replaceWith="vodit ć" /> + <RegEx find="v([or])dić" replaceWith="v$1dit ć" /> <RegEx find="(?<![ČčĆć])vorić" replaceWith="vorit ć" /> + <RegEx find="vpj" replaceWith="voj" /> <!-- mijenja u korist češće riječi --> <RegEx find="([vV])rača" replaceWith="$1raća" /> <RegEx find="vršić" replaceWith="vršit ć" /> <RegEx find="zleči" replaceWith="zliječi" /> <RegEx find="zmern" replaceWith="zmjern" /> + <RegEx find="znst" replaceWith="znost" /> <RegEx find="(?<![Oo]bra|o)zova([lton])" replaceWith="zira$1" /> + <RegEx find="zpr" replaceWith="spr" /> <RegEx find="zuslov" replaceWith="zuvjet" /> + <RegEx find="zvešć" replaceWith="zvest ć" /> <RegEx find="zvolić" replaceWith="zvolit ć" /> <RegEx find="žalj?ev" replaceWith="žalijev" /> <RegEx find="živać" replaceWith="živat ć" /> @@ -2262,23 +2802,35 @@ <!-- osobna imena/prezimena i imena gradova/država itd. --> <RegEx find="Afghanistan" replaceWith="Afganistan" /> <RegEx find="Ajdah" replaceWith="Idah" /> - <RegEx find="Ajland" replaceWith="Island" /> + <RegEx find="Ajl[ae]nd" replaceWith="Island" /> + <RegEx find="Ajzak" replaceWith="Isaac" /> + <RegEx find="Ajzenhauer" replaceWith="Eisenhower" /> <RegEx find="([aA])l[cz]h[ae]jmer" replaceWith="$1lzheimer" /> <RegEx find="Atin" replaceWith="Aten" /> + <RegEx find="rčer" replaceWith="rcher" /> <RegEx find="Avgani" replaceWith="Afgani" /> + <RegEx find="Bejkon" replaceWith="Bacon" /> <RegEx find="Belgijan" replaceWith="Belgij" /> + <RegEx find="endž(?!o)" replaceWith="enj" /> <RegEx find="Betmen" replaceWith="Batman" /> + <RegEx find="Blejk" replaceWith="Blake" /> <RegEx find="Bruklin" replaceWith="Brooklyn" /> <RegEx find="Brajan" replaceWith="Brian" /> <RegEx find="Brajs" replaceWith="Bryce" /> <RegEx find="Braun" replaceWith="Brown" /> <RegEx find="Brussels" replaceWith="Bruxelles" /> <RegEx find="Čarls" replaceWith="Charles" /> + <RegEx find="Č[eu]rčil" replaceWith="Churchill" /> <RegEx find="Čikag" replaceWith="Chicag" /> - <RegEx find="Dajan([aeiou]|om)" replaceWith="Dian$1" /> + <RegEx find="Dajan" replaceWith="Dian" /> <RegEx find="Dankan" replaceWith="Duncan" /> <RegEx find="Dejvi([ds])" replaceWith="Davi$1" /> + <RegEx find="Dijeg" replaceWith="Dieg" /> + <RegEx find="Diznilend" replaceWith="Disneyland" /> + <RegEx find="Doson" replaceWith="Dawson" /> + <RegEx find="Dvajt" replaceWith="Dwight" /> <RegEx find="Džastin" replaceWith="Justin" /> + <RegEx find="Džef" replaceWith="Jeff" /> <RegEx find="Džejn" replaceWith="Jane" /> <RegEx find="Džejk" replaceWith="Jake" /> <RegEx find="Džejms" replaceWith="James" /> @@ -2291,7 +2843,10 @@ <RegEx find="Džoni" replaceWith="Johnny" /> <RegEx find="Džonson" replaceWith="Johnson" /> <RegEx find="Džordž" replaceWith="George" /> + <RegEx find="Džouns" replaceWith="Jones" /> <RegEx find="Džulij" replaceWith="Juli" /> + <RegEx find="Efrejm" replaceWith="Ephraim" /> + <RegEx find="Ejmos" replaceWith="Amos" /> <RegEx find="[EA]jnštajn" replaceWith="Einstein" /> <RegEx find="Endi" replaceWith="Andy" /> <RegEx find="Endrj?u" replaceWith="Andrew" /> @@ -2315,33 +2870,39 @@ <RegEx find="Jejl" replaceWith="Yale" /> <RegEx find="Jevrej" replaceWith="Židov" /> <RegEx find="jevrej" replaceWith="židov" /> + <RegEx find="Jovan" replaceWith="Ivan" /> <RegEx find="kadilak" replaceWith="Cadillac" /> <RegEx find="Kajl" replaceWith="Kyle" /> <RegEx find="Kavendiš" replaceWith="Cavendish" /> <RegEx find="Kejleb" replaceWith="Caleb" /> <RegEx find="Kembridž" replaceWith="Cambridge" /> <RegEx find="Kinkejd" replaceWith="Kincaid" /> + <RegEx find="Klej" replaceWith="Clay" /> + <RegEx find="Klif" replaceWith="Cliff" /> <RegEx find="Konn?ektik[aeu]t" replaceWith="Connecticut" /> <RegEx find="Korejan" replaceWith="Korej" /> <RegEx find="Kris(?!t)" replaceWith="Chris" /> + <RegEx find="Kvins" replaceWith="Queens" /> <RegEx find="Lajonel" replaceWith="Lionel" /> <RegEx find="Leri" replaceWith="Larry" /> + <RegEx find="Klivlend" replaceWith="Cleveland" /> <RegEx find="(?<![LT])ejl" replaceWith="ale" /> <RegEx find="Losanđeles" replaceWith="Los Angeles" /> - <RegEx find="Los Anđeles" replaceWith="Los Angeles" /> <RegEx find="Majami" replaceWith="Miami" /> <RegEx find="Majkl" replaceWith="Michael" /> + <RegEx find="Majls" replaceWith="Miles" /> <RegEx find="Marfi" replaceWith="Murphy" /> <RegEx find="Mejson" replaceWith="Mason" /> <RegEx find="Memfis" replaceWith="Memphis" /> <RegEx find="Menhetn" replaceWith="Manhattan" /> <RegEx find="Metju" replaceWith="Matthew" /> <RegEx find="Mexic" replaceWith="Meksik" /> + <RegEx find="ičigen" replaceWith="ichigan" /> <RegEx find="Misisipi" replaceWith="Mississippi" /> <RegEx find="Mocart" replaceWith="Mozart" /> <RegEx find="Nejt" replaceWith="Nate" /> <RegEx find="Nešvil" replaceWith="Nashville" /> - <RegEx find="\bNizuzem" replaceWith="Nizozem" /> + <RegEx find="Nizuzem" replaceWith="Nizozem" /> <RegEx find="Njutn" replaceWith="Newton" /> <RegEx find="N[jJ]u Džer[sz]i" replaceWith="New Jersey" /> <RegEx find="N[jJ]u Jork" replaceWith="New York" /> @@ -2349,6 +2910,7 @@ <RegEx find="Njujork" replaceWith="New York" /> <RegEx find="Njuton" replaceWith="Newton" /> <RegEx find="Pokipsi" replaceWith="Poughkeepsie" /> + <RegEx find="ulicer" replaceWith="ulitzer" /> <RegEx find="Rajan" replaceWith="Ryan" /> <RegEx find="Rič" replaceWith="Rich" /> <RegEx find="odže" replaceWith="oge" /> @@ -2364,16 +2926,21 @@ <RegEx find="Sančez" replaceWith="Sanchez" /> <RegEx find="Šejn" replaceWith="Shane" /> <RegEx find="Šerlok" replaceWith="Sherlock" /> + <RegEx find="Španij([aeou])" replaceWith="Španjolsk$1" /> + <RegEx find="([šŠ])pansk" replaceWith="$1panjolsk" /> <RegEx find="([šŠ])vetsk" replaceWith="$1vedsk" /> <RegEx find="Štokh?olm" replaceWith="Stockholm" /> - <RegEx find="vajcarsk" replaceWith="vicarsk" /> + <RegEx find="vajcar" replaceWith="vicar" /> <RegEx find="Tajms" replaceWith="Times" /> <RegEx find="Tajler" replaceWith="Tyler" /> + <RegEx find="Vajoming" replaceWith="Wyoming" /> <RegEx find="Valt" replaceWith="Walt" /> <RegEx find="V[ao]šington" replaceWith="Washington" /> + <RegEx find="Vavilon" replaceWith="Babilon" /> + <RegEx find="vavilons" replaceWith="babilons" /> <RegEx find="Vejn" replaceWith="Wayne" /> <RegEx find="Vejder" replaceWith="Vader" /> - <RegEx find="Vilijams" replaceWith="Williams" /> + <RegEx find="Vilijam" replaceWith="William" /> <RegEx find="Vinči" replaceWith="Vinci" /> <RegEx find="Vinsent" replaceWith="Vincent" /> <RegEx find="Viskonsin" replaceWith="Wisconsin" /> @@ -2381,6 +2948,8 @@ <RegEx find="Vots" replaceWith="Wats" /> <!-- 10kg » 10 kg | 20cm » 20 cm | 44dag » 44 dag --> <RegEx find="\b(\d+)([a-z]{2,4})\b" replaceWith="$1 $2" /> + <!-- 34m » 34 m --> + <RegEx find="([\d]){1}?m" replaceWith="$1 m" /> <!-- From here credit goes to: MilanRS [http://www.prijevodi-online.org] --> <RegEx find="([ks]ao)\.:" replaceWith="$1:" /> <RegEx find="([a-zčđšž])Ij([a-zčđšž])" replaceWith="$1lj$2" /> diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml new file mode 100644 index 000000000..64007ef91 --- /dev/null +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml @@ -0,0 +1,58 @@ +<ReplaceList> + <WholeWords> + <Word from="varjeg" to="var jeg" /> + <Word from="omjeg" to="om jeg" /> + <Word from="menjeg" to="men jeg" /> + <Word from="noejeg" to="noe jeg" /> + <Word from="førjeg" to="før jeg" /> + <Word from="harjobbet" to="har jobbet" /> + <Word from="Kunnejeg" to="Kunne jeg" /> + <Word from="haddejeg" to="hadde jeg" /> + <Word from="påjorden" to="på jorden" /> + <Word from="nårjeg" to="når jeg" /> + <Word from="tenkerjeg" to="tenker jeg" /> + <Word from="helejorden" to="hele jorden" /> + <Word from="menjorden" to="men jorden" /> + <Word from="rundtjorden" to="rundt jorden" /> + <Word from="forjorden" to="for jorden" /> + <Word from="avjordens" to="av jordens" /> + </WholeWords> + <PartialWords> + <!-- Will be used to check words not in dictionary --> + <!-- If new word(s) exists in spelling dictionary, it(they) is accepted --> + <WordPart from="fi" to="fi" /> + <WordPart from="fl" to="fl" /> + <WordPart from="/" to="l" /> + <WordPart from="vv" to="w" /> + <WordPart from="m" to="rn" /> + <WordPart from="l" to="i" /> + <WordPart from="€" to="e" /> + <WordPart from="I" to="l" /> + <WordPart from="c" to="o" /> + <WordPart from="i" to="t" /> + <WordPart from="cc" to="oo" /> + <WordPart from="ii" to="tt" /> + <WordPart from="n/" to="ry" /> + <WordPart from="ae" to="æ" /> + + <!-- "f " will be two words --> + <WordPart from="f" to="f " /> + <WordPart from="c" to="e" /> + <WordPart from="o" to="e" /> + <WordPart from="I" to="t" /> + <WordPart from="n" to="o" /> + <WordPart from="s" to="e" /> + <WordPart from="\A" to="Vi" /> + <WordPart from="n/" to="rv" /> + <WordPart from="Ã" to="Å" /> + <WordPart from="í" to="i" /> + </PartialWords> + <BeginLines /> + <EndLines /> + <WholeLines /> + <RemovedWholeWords /> + <RemovedPartialLines /> + <RemovedBeginLines /> + <RemovedEndLines /> + <RemovedWholeLines /> +</ReplaceList> \ No newline at end of file diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml index 1c463a05e..938e90a89 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml @@ -22,6 +22,7 @@ <Word from="ahi" to="ahí" /> <Word from="angel" to="ángel" /> <Word from="angeles" to="ángeles" /> + <Word from="ansian" to="ansían" /> <Word from="apagala" to="apágala" /> <Word from="aqui" to="aquí" /> <Word from="asi" to="así" /> @@ -80,6 +81,8 @@ <Word from="empezo" to="empezó" /> <Word from="empujon" to="empujón" /> <Word from="empujalo" to="empújalo" /> + <Word from="energia" to="energía" /> + <Word from="enfrian" to="enfrían" /> <Word from="escondanme" to="escóndanme" /> <Word from="esperame" to="espérame" /> <Word from="estara" to="estará" /> @@ -942,5 +945,8 @@ <RegEx find="\Bo(log[ao]s?\b)" replaceWith="ó$1" /> <RegEx find="\Ba(log[ao]s?\b)" replaceWith="á$1" /> <RegEx find="\Bi(log[ao]s?\b)" replaceWith="í$1" /> + + <RegEx find="\bIes\b" replaceWith="les" /> + <RegEx find="\bIos\b" replaceWith="los" /> </RegularExpressions> </OCRFixReplaceList> \ No newline at end of file diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml index c54bacd97..7b682c6fd 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml @@ -8,21 +8,46 @@ <Word from="ćmo" to="ćemo" /> <Word from="ćte" to="ćete" /> <Word from="čemo" to="ćemo" /> - <Word from="čete" to="čete" /> + <Word from="čete" to="ćete" /> <Word from="djete" to="dijete" /> <Word from="Hey" to="Hej" /> <Word from="hey" to="hej" /> <Word from="htjeo" to="htio" /> - <Word from="Hočeš" to="Hoćeš" /> - <Word from="hočeš" to="hoćeš" /> <Word from="iči" to="ići" /> <Word from="jel" to="je l'" /> <Word from="Jel" to="Je l'" /> + <Word from="Nebi" to="Ne bi" /> + <Word from="Nebih" to="Ne bih" /> + <Word from="nebi" to="ne bi" /> + <Word from="nebih" to="ne bih" /> <Word from="nedaj" to="ne daj" /> + <Word from="Nedaj" to="Ne daj" /> + <Word from="nedam" to="ne dam" /> + <Word from="Nedam" to="Ne dam" /> + <Word from="nedaš" to="ne daš" /> + <Word from="Nedaš" to="Ne daš" /> + <Word from="nemogu" to="ne mogu" /> + <Word from="Nemogu" to="Ne mogu" /> + <Word from="nemora" to="ne mora" /> + <Word from="Nemora" to="Ne mora" /> + <Word from="nemoraš" to="ne moraš" /> + <Word from="Nemoraš" to="Ne moraš" /> + <Word from="predamnom" to="preda mnom" /> + <Word from="Predamnom" to="Preda mnom" /> <Word from="Rješit" to="Riješit" /> + <Word from="samnom" to="sa mnom" /> + <Word from="Samnom" to="Sa mnom" /> <Word from="smjeo" to="smio" /> <Word from="uopče" to="uopće" /> + <Word from="Uopče" to="Uopće" /> + <Word from="umijesto" to="umjesto" /> + <Word from="Umijesto" to="Umjesto" /> + <Word from="uspiješan" to="uspješan" /> + <Word from="uvjek" to="uvijek" /> + <Word from="Uvjek" to="Uvijek" /> <Word from="valda" to="valjda" /> + <Word from="zamnom" to="za mnom" /> + <Word from="Zamnom" to="Za mnom" /> <Word from="želila" to="željela" /> </WholeWords> <PartialWordsAlways /> @@ -65,11 +90,7 @@ <LinePart from="jeli ti " to="je li ti" /> <LinePart from="Jeli to " to="Je li to" /> <LinePart from="Nebrini" to="Ne brini" /> - <LinePart from="nedaj" to="ne daj" /> <LinePart from="ne ću" to="neću" /> - <LinePart from="Nemogu" to="Ne mogu" /> - <LinePart from="ne mogu" to="ne mogu" /> - <LinePart from="Nemoraš" to="Ne moraš" /> <LinePart from="od kako" to="otkako" /> <LinePart from="Si dobro" to="Jesi li dobro" /> <LinePart from="Svo vreme" to="Sve vrijeme" /> @@ -81,6 +102,21 @@ <EndLines /> <WholeLines /> <RegularExpressions> + <RegEx find="ÄŤ" replaceWith="č" /> + <RegEx find="Ä" replaceWith="č" /> + <RegEx find="ć" replaceWith="ć" /> + <RegEx find="Ä‘" replaceWith="đ" /> + <RegEx find="Ĺľ" replaceWith="ž" /> + <RegEx find="ž" replaceWith="ž" /> + <RegEx find="š" replaceWith="š" /> + <RegEx find="Å¡" replaceWith="š" /> + <RegEx find="ÄŚ" replaceWith="Č" /> + <RegEx find="ÄŒ" replaceWith="Č" /> + <RegEx find="Ć" replaceWith="Ć" /> + <RegEx find="Ĺ " replaceWith="Š" /> + <RegEx find="Å " replaceWith="Š" /> + <RegEx find="Ĺ˝" replaceWith="Ž" /> + <RegEx find="Ž" replaceWith="Ž" /> <RegEx find="đž" replaceWith="dž" /> <RegEx find="ajsmiješnij" replaceWith="ajsmješnij" /> <RegEx find="boži[čć]([aeiu]|em|ima)?\b" replaceWith="Božić$1" /> @@ -90,46 +126,44 @@ <RegEx find="([gG])-đo +(?=[A-ZČĐŠŽ])" replaceWith="$1gđo " /> <RegEx find="gdina +(?=[A-ZČĐŠŽ])" replaceWith="g. " /> <RegEx find=" gosp +" replaceWith=" g. " /> + <RegEx find="([hH])oč" replaceWith="$1oć" /> <RegEx find="Jel si sigur" replaceWith="Jesi li sigur" /> <RegEx find="Jel' si sigur" replaceWith="Jesi li sigur" /> <RegEx find="\b([jJ])el\?" replaceWith="$1e l'?" /> <RegEx find="\bJel'" replaceWith="Je l'" /> <RegEx find="([kK]alib(?:ar|r[aeui]))\. *([0-9])" replaceWith="$1 .$2" /> - <RegEx find="([mM])jenjati" replaceWith="$1ijenjati" /> - <RegEx find="([mM])oguč" replaceWith="$1oguć" /> - <RegEx find="\b([nN])ebih?" replaceWith="$1e bi" /> + <RegEx find="([mM])jenja(?!č)" replaceWith="$1ijenja" /> + <RegEx find="oguč" replaceWith="oguć" /> <RegEx find="\b([nN])eč([ue]š?|emo|ete)\b" replaceWith="$1eć$2" /> - <RegEx find="\b([nN])emože(mo|š|te)?\b" replaceWith="$1e može$2" /> + <RegEx find="emo[zž]e" replaceWith="e može" /> <RegEx find="\b([nN])ezna([šm]o?|t[ei]|ju|jući|vši)?\b" replaceWith="$1e zna$2" /> <RegEx find="najcijenjen" replaceWith="najcjenjen" /> <RegEx find="N[jJ]u Jork" replaceWith="Njujork" /> <RegEx find="([oO])d([kp])" replaceWith="$1t$2" /> - <RegEx find="([oO])ružij([aeu])" replaceWith="$1ružj$2" /> + <RegEx find="ružij" replaceWith="ružj" /> <RegEx find="([oO])sječa" replaceWith="$1sjeća" /> <RegEx find="([pPdD])onje([lt])" replaceWith="$1onije$2" /> <RegEx find="([pP])objedi([mšto])" replaceWith="$1obijedi$2" /> - <RegEx find="redamnom" replaceWith="reda mnom" /> - <RegEx find="redpostav" replaceWith="retpostav" /> - <RegEx find="([pP])rimjeti" replaceWith="$1rimijeti" /> - <RegEx find="([pP])romjeni([mštol])" replaceWith="$1romijeni$2" /> - <RegEx find="([rR])azumijeć" replaceWith="$1azumjeć" /> - <RegEx find="rascjepljen" replaceWith="rascijepljen" /> - <RegEx find="redhodn" replaceWith="rethodn" /> + <RegEx find="ed([ph])" replaceWith="et$1" /> + <RegEx find="rimjeti" replaceWith="rimijeti" /> + <RegEx find="romjeni([mštol])" replaceWith="romijeni$1" /> + <RegEx find="azumijeć" replaceWith="azumjeć" /> + <RegEx find="([Cc])jepljen" replaceWith="$1ijepljen" /> <RegEx find="rimjenjen" replaceWith="rimijenjen" /> <RegEx find="([^d])rješit" replaceWith="$1riješit" /> - <RegEx find="([sSzZ])amnom" replaceWith="$1a mnom" /> - <RegEx find="([sS])lijede[čć]([aeiu]|e[mg])" replaceWith="$1ljedeć$2" /> + <RegEx find="lijede[čć]([aeiu]|e[mg])" replaceWith="ljedeć$1" /> <RegEx find="([sS])mješno" replaceWith="$1miješno" /> - <RegEx find="([uU])mijesto" replaceWith="$1mjesto" /> - <RegEx find="([uU])spijeh" replaceWith="$1spjeh" /> - <RegEx find="([uU])spiješ(an|n[aeiou]|no[mgj])" replaceWith="$1spješ$2" /> - <RegEx find="([uU])vjek" replaceWith="$1vijek" /> - <RegEx find="\b([vV])eč([aeiou])" replaceWith="$1eć$2" /> - <RegEx find="([zZ])ahtijeva" replaceWith="$1ahtjeva" /> + <RegEx find="spijeh" replaceWith="spjeh" /> + <RegEx find="spiješn" replaceWith="spješn" /> + <RegEx find="\b([vV])eč([aiu]|[ei][mg]|ih|ima|in[iu]|uom|o[mj])?\b" replaceWith="$1eć$2" /> <RegEx find="([zZ])ahtjeva([ojlmšt])" replaceWith="$1ahtijeva$2" /> <RegEx find="([ks]ao)\.:" replaceWith="$1:" /> <RegEx find="(?<=[a-zčđšž])Ij(?=[a-zčđšž])" replaceWith="lj" /> <RegEx find="(?<=[^A-ZČĐŠŽa-zčđšž])Iju(?=bav|d|t)" replaceWith="lju" /> + <!-- 10kg » 10 kg | 20cm » 20 cm | 44dag » 44 dag --> + <RegEx find="\b(\d+)([a-z]{2,4})\b" replaceWith="$1 $2" /> + <!-- 10m » 10 m --> + <RegEx find="([\d]){1}?m" replaceWith="$1 m" /> <!-- kad ima razmak između tagova </i> <i> --> <!-- <RegEx find="(>) +(<)" replaceWith="$1$2" /> --> <!-- ',"' to '",' --> @@ -231,4 +265,4 @@ <!-- <RegEx find="^\.{3}([a-zčđšž"<])" replaceWith="$1" /> --> <!-- <RegEx find=" +([.?!])" replaceWith="$1" /> --> </RegularExpressions> -</OCRFixReplaceList> \ No newline at end of file +</OCRFixReplaceList> diff --git a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml index edd3ae30e..9eadfca8a 100644 --- a/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml +++ b/Contents/Libraries/Shared/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml @@ -1,4 +1,5 @@ -<OCRFixReplaceList> +<?xml version="1.0" encoding="utf-8"?> +<OCRFixReplaceList> <WholeWords> <Word from="lârt" to="lärt" /> <Word from="hedervårda" to="hedervärda" /> @@ -354,10 +355,50 @@ <Word from="kundejag" to="kunde jag" /> <Word from="ärläget" to="är läget" /> <Word from="blirinte" to="blir inte" /> - <Word from="l'm" to="I'm" /> - <Word from="lt's" to="It's" /> <Word from="ijakt" to="i jakt" /> <Word from="avjordens" to="av jordens" /> + <Word from="90000O" to="900000" /> + <Word from="9O0" to="900" /> + <Word from="ärpå" to="är på" /> + <Word from="ärproteserna" to="är proteserna" /> + <Word from="ärytterst" to="är ytterst" /> + <Word from="beborjorden" to="bebor jorden" /> + <Word from="filmjag" to="film jag" /> + <Word from="fokuserarpå" to="fokuserar på" /> + <Word from="folkjag" to="folk jag" /> + <Word from="föreställdejag" to="föreställde jag" /> + <Word from="förpubliken" to="för publiken" /> + <Word from="gilladejag" to="gillade jag" /> + <Word from="hållerpå" to="håller på" /> + <Word from="harpå" to="har på" /> + <Word from="harplaner" to="har planer" /> + <Word from="harprylar" to="har prylar" /> + <Word from="kommerpubliken" to="kommer publiken" /> + <Word from="kostymerpå" to="kostymer på" /> + <Word from="litarpå" to="litar på" /> + <Word from="lngen" to="Ingen" /> + <Word from="lnom" to="Inom" /> + <Word from="lnte" to="Inte" /> + <Word from="ochjag" to="och jag" /> + <Word from="Ochjag" to="Och jag" /> + <Word from="ochjorden" to="och jorden" /> + <Word from="omjag" to="om jag" /> + <Word from="Omjag" to="Om jag" /> + <Word from="passarperfekt" to="passar perfekt" /> + <Word from="sättetjag" to="sättet jag" /> + <Word from="silverpå" to="silver på" /> + <Word from="skruvarjag" to="skruvar jag" /> + <Word from="somjag" to="som jag" /> + <Word from="Somjag" to="Som jag" /> + <Word from="talarpå" to="talar på" /> + <Word from="tänktejag" to="tänkte jag" /> + <Word from="tapparjag" to="tappar jag" /> + <Word from="tittarpå" to="tittar på" /> + <Word from="visstejag" to="visste jag" /> + <Word from="medjetpacks" to="med jetpacks" /> + <Word from="sätterpå" to="sätter på" /> + <Word from="stårpå" to="står på" /> + <Word from="tillhörpå" to="tillhör på" /> </WholeWords> <PartialWordsAlways /> <PartialWords> @@ -392,6 +433,12 @@ <WordPart from="å" to="ä" /> <WordPart from="à" to="å" /> <WordPart from="n/" to="rv" /> + <WordPart from="djag" to="d jag" /> + <WordPart from="sjag" to="s jag" /> + <WordPart from="rjag" to="r jag" /> + <WordPart from="tjag" to="t jag" /> + <WordPart from="ejag" to="e jag" /> + <WordPart from="ärp" to="är p" /> </PartialWords> <PartialLines /> <PartialLinesAlways /> diff --git a/Contents/Libraries/Shared/subzero/modification/exc.py b/Contents/Libraries/Shared/subzero/modification/exc.py new file mode 100644 index 000000000..38679a8ee --- /dev/null +++ b/Contents/Libraries/Shared/subzero/modification/exc.py @@ -0,0 +1,7 @@ +# coding=utf-8 +class EmptyEntryError(Exception): + pass + + +class EmptyLineError(Exception): + pass \ No newline at end of file diff --git a/Contents/Libraries/Shared/subzero/modification/main.py b/Contents/Libraries/Shared/subzero/modification/main.py index ec471817d..11adc0b0d 100644 --- a/Contents/Libraries/Shared/subzero/modification/main.py +++ b/Contents/Libraries/Shared/subzero/modification/main.py @@ -1,21 +1,28 @@ # coding=utf-8 import traceback - +import re import pysubs2 import logging import time -from mods import EMPTY_TAG_PROCESSOR, EmptyEntryError +from mods import EMPTY_TAG_PROCESSOR +from exc import EmptyEntryError from registry import registry +from subzero.language import Language logger = logging.getLogger(__name__) +lowercase_re = re.compile(ur'(?sux)[a-zà-ž]') + + class SubtitleModifications(object): debug = False language = None initialized_mods = {} + mods_used = [] + only_uppercase = False f = None font_style_tag_start = u"{\\" @@ -23,6 +30,7 @@ class SubtitleModifications(object): def __init__(self, debug=False): self.debug = debug self.initialized_mods = {} + self.mods_used = [] def load(self, fn=None, content=None, language=None, encoding="utf-8"): """ @@ -33,7 +41,8 @@ def load(self, fn=None, content=None, language=None, encoding="utf-8"): :param content: unicode :return: """ - self.language = language + if language: + self.language = Language.rebuild(language, forced=False) self.initialized_mods = {} try: if fn: @@ -73,12 +82,16 @@ def get_mod_signature(cls, identifier, **kwargs): return cls.get_mod_class(identifier).get_signature(**kwargs) def prepare_mods(self, *mods): - parsed_mods = [SubtitleModifications.parse_identifier(mod) for mod in mods] + parsed_mods = [(SubtitleModifications.parse_identifier(mod), mod) for mod in mods] final_mods = {} line_mods = [] non_line_mods = [] + used_mods = [] + mods_merged = {} + mods_merged_log = {} - for identifier, args in parsed_mods: + for mod_data, orig_identifier in parsed_mods: + identifier, args = mod_data if identifier not in registry.mods: logger.error("Mod %s not loaded", identifier) continue @@ -95,12 +108,61 @@ def prepare_mods(self, *mods): identifier, self.language) continue + if mod_cls.only_uppercase and not self.only_uppercase: + if self.debug: + logger.debug("Skipping %s, because the subtitle isn't all uppercase", identifier) + continue + # merge args of duplicate mods if possible - elif identifier in final_mods and mod_cls.args_mergeable: - final_mods[identifier] = mod_cls.merge_args(final_mods[identifier], args) + elif mod_cls.args_mergeable and identifier in mods_merged: + mods_merged[identifier] = mod_cls.merge_args(mods_merged[identifier], args) + mods_merged_log[identifier]["identifiers"].append(orig_identifier) + continue + + if mod_cls.args_mergeable: + mods_merged[identifier] = mod_cls.merge_args(args, {}) + mods_merged_log[identifier] = {"identifiers": [orig_identifier], "final_identifier": orig_identifier} + used_mods.append("%s_ORIG_POSITION" % identifier) + continue + + final_mods[identifier] = args + used_mods.append(orig_identifier) + + # finalize merged mods into final and used mods + for identifier, args in mods_merged.iteritems(): + pos_preserve_index = used_mods.index("%s_ORIG_POSITION" % identifier) + + # clear empty mods after merging + if not any(args.values()): + if self.debug: + logger.debug("Skipping %s, empty args", identifier) + + if pos_preserve_index > -1: + used_mods.pop(pos_preserve_index) + + mods_merged_log.pop(identifier) continue + + # clear empty args + final_mod_args = dict(filter(lambda (k, v): bool(v), args.iteritems())) + + _data = SubtitleModifications.get_mod_signature(identifier, **final_mod_args) + if _data == mods_merged_log[identifier]["final_identifier"]: + mods_merged_log.pop(identifier) + else: + mods_merged_log[identifier]["final_identifier"] = _data + + if pos_preserve_index > -1: + used_mods[pos_preserve_index] = _data + else: + # should never happen + used_mods.append(_data) final_mods[identifier] = args + if self.debug: + for identifier, data in mods_merged_log.iteritems(): + logger.debug("Merged %s to %s", data["identifiers"], data["final_identifier"]) + # separate all mods into line and non-line mods for identifier, args in final_mods.iteritems(): mod_cls = registry.mods[identifier] @@ -113,12 +175,45 @@ def prepare_mods(self, *mods): if identifier not in self.initialized_mods: self.initialized_mods[identifier] = mod_cls(self) - return line_mods, non_line_mods + return line_mods, non_line_mods, used_mods + + def detect_uppercase(self): + entries_used = 0 + for entry in self.f: + entry_used = False + for sub in entry.text.strip().split("\N"): + # skip HI bracket entries, those might actually be lowercase + sub = sub.strip() + for processor in registry.mods["remove_HI"].processors[:4]: + sub = processor.process(sub) + + if sub.strip(): + if lowercase_re.search(sub): + return False + + entry_used = True + else: + # skip full entry + break + + if entry_used: + entries_used += 1 + + if entries_used == 40: + break + + return True def modify(self, *mods): new_entries = [] start = time.time() - line_mods, non_line_mods = self.prepare_mods(*mods) + self.only_uppercase = self.detect_uppercase() + + if self.only_uppercase and self.debug: + logger.debug("Full-uppercase subtitle found") + + line_mods, non_line_mods, mods_used = self.prepare_mods(*mods) + self.mods_used = mods_used # apply non-last file mods if non_line_mods: @@ -152,6 +247,7 @@ def modify(self, *mods): if self.debug: logger.debug("Subtitle Modification took %ss", time.time() - start) + logger.debug("Mods applied: %s" % self.mods_used) def apply_non_line_mods(self, mods, only_last=False): for identifier, args in mods: @@ -198,15 +294,18 @@ def apply_line_mods(self, new_entries, mods): end_tag = line[-5:] line = line[:-5] + last_procs_mods = [] + + # fixme: this double loop is ugly for order, identifier, args in mods: mod = self.initialized_mods[identifier] try: - line = mod.modify(line.strip(), entry=entry.text, debug=self.debug, parent=self, index=index, + line = mod.modify(line.strip(), entry=t, debug=self.debug, parent=self, index=index, **args) except EmptyEntryError: if self.debug: - logger.debug(u"%d: %s: %r -> ''", index, identifier, entry.text) + logger.debug(u"%d: %s: %r -> ''", index, identifier, t) skip_entry = True break @@ -217,6 +316,33 @@ def apply_line_mods(self, new_entries, mods): break applied_mods.append(identifier) + if mod.last_processors: + last_procs_mods.append([identifier, args]) + + if skip_entry: + lines = [] + break + + if skip_line: + continue + + for identifier, args in last_procs_mods: + mod = self.initialized_mods[identifier] + + try: + line = mod.modify(line.strip(), entry=t, debug=self.debug, parent=self, index=index, + procs=["last_process"], **args) + except EmptyEntryError: + if self.debug: + logger.debug(u"%d: %s: %r -> ''", index, identifier, t) + skip_entry = True + break + + if not line: + if self.debug: + logger.debug(u"%d: %s: %r -> ''", index, identifier, old_line) + skip_line = True + break if skip_entry: lines = [] diff --git a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py index ecaa76b02..535d3e621 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/__init__.py @@ -17,9 +17,11 @@ class SubtitleModification(object): order = None modifies_whole_file = False # operates on the whole file, not individual entries apply_last = False + only_uppercase = False pre_processors = [] processors = [] post_processors = [] + last_processors = [] languages = [] def __init__(self, parent): @@ -38,6 +40,12 @@ def _process(self, content, processors, debug=False, parent=None, index=None, ** new_content = content for processor in _processors: + if not processor.supported(parent): + if debug and processor.enabled: + logger.debug("Processor not supported, skipping: %s", processor.name) + processor.enabled = False + continue + old_content = new_content new_content = processor.process(new_content, debug=debug, **kwargs) if not new_content: @@ -60,15 +68,16 @@ def process(self, content, debug=False, parent=None, **kwargs): def post_process(self, content, debug=False, parent=None, **kwargs): return self._process(content, self.post_processors, debug=debug, parent=parent, **kwargs) - def modify(self, content, debug=False, parent=None, **kwargs): + def modify(self, content, debug=False, parent=None, procs=None, **kwargs): if not content: return new_content = content - for method in ("pre_process", "process", "post_process"): + for method in procs or ("pre_process", "process", "post_process"): if not new_content: return - new_content = getattr(self, method)(new_content, debug=debug, parent=parent, **kwargs) + new_content = self._process(new_content, getattr(self, "%sors" % method), + debug=debug, parent=parent, **kwargs) return new_content @@ -98,5 +107,3 @@ class SubtitleTextModification(SubtitleModification): ] -class EmptyEntryError(Exception): - pass diff --git a/Contents/Libraries/Shared/subzero/modification/mods/color.py b/Contents/Libraries/Shared/subzero/modification/mods/color.py index d837ff366..9e883b101 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/color.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/color.py @@ -39,9 +39,7 @@ class Color(SubtitleModification): colors = COLOR_MAP - long_description = """\ - Adds the requested color to every line of the subtitle. Support depends on player. - """ + long_description = "Adds the requested color to every line of the subtitle. Support depends on player." def modify(self, content, debug=False, parent=None, **kwargs): color = self.colors.get(kwargs.get("name")) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/common.py b/Contents/Libraries/Shared/subzero/modification/mods/common.py index 8d7b34b1d..47b897f4c 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/common.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/common.py @@ -4,9 +4,13 @@ from subzero.language import Language from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, SubtitleModification -from subzero.modification.processors.string_processor import StringProcessor +from subzero.modification.processors import FuncProcessor from subzero.modification.processors.re_processor import NReProcessor from subzero.modification import registry +from tld import get_tld + + +ENGLISH = Language("eng") class CommonFixes(SubtitleTextModification): @@ -15,25 +19,42 @@ class CommonFixes(SubtitleTextModification): exclusive = True order = 40 - long_description = """\ - Fix common and whitespace/punctuation issues in subtitles - """ + long_description = "Fix common and whitespace/punctuation issues in subtitles" processors = [ + # normalize hyphens + NReProcessor(re.compile(ur'(?u)([‑‐﹘﹣])'), u"-", name="CM_hyphens"), + # -- = em dash NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"), # line = _/-/\s - NReProcessor(re.compile(r'(?u)(^\W*[-_.]+\W*$)'), "", name="CM_non_word_only"), + NReProcessor(re.compile(r'(?u)(^\W*[-_.:<>~"\']+\W*$)'), "", name="CM_non_word_only"), + + # remove >> + NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"), - # multi space - NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"), + # line = : text + NReProcessor(re.compile(r'(?u)(^\W*:\s*(?=\w+))'), "", name="CM_empty_colon_start"), # fix music symbols - NReProcessor(re.compile(ur'(?u)(^[*#¶\s]*[*#¶]+[*#¶\s]*$)'), u"♪", name="CM_music_symbols"), + NReProcessor(re.compile(ur'(?u)(^[-\s>~]*[*#¶]+\s+)|(\s*[*#¶]+\s*$)'), + lambda x: u"♪ " if x.group(1) else u" ♪", + name="CM_music_symbols"), # '' = " - StringProcessor("''", '"', name="CM_double_apostrophe"), + NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛][\'’ʼ❜‘‛]+)'), u'"', name="CM_double_apostrophe"), + + # double quotes instead of single quotes inside words + NReProcessor(re.compile(ur'(?u)([A-zÀ-ž])"([A-zÀ-ž])'), ur"\1'\2", name="CM_double_as_single"), + + # normalize quotes + NReProcessor(re.compile(ur'(?u)(\s*["”“‟„])\s*(["”“‟„]["”“‟„\s]*)'), + lambda match: '"' + (" " if match.group(2).endswith(" ") else ""), + name="CM_normalize_quotes"), + + # normalize single quotes + NReProcessor(re.compile(ur'(?u)([\'’ʼ❜‘‛])'), u"'", name="CM_normalize_squotes"), # remove leading ... NReProcessor(re.compile(r'(?u)^\.\.\.[\s]*'), "", name="CM_leading_ellipsis"), @@ -68,9 +89,6 @@ class CommonFixes(SubtitleTextModification): # space before ending doublequote? - # remove >> - NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"), - # replace uppercase I with lowercase L in words NReProcessor(re.compile(ur'(?u)([a-zà-ž]+)(I+)'), lambda match: ur'%s%s' % (match.group(1), "l" * len(match.group(2))), @@ -94,6 +112,15 @@ class CommonFixes(SubtitleTextModification): # remove spaces before punctuation; don't break spaced ellipses NReProcessor(re.compile(r'(?u)(?:(?<=^)|(?<=\w)) +([!?.,](?![!?.,]| \.))'), r"\1", name="CM_punctuation_space"), + + # add space after punctuation + NReProcessor(re.compile(r'(?u)(([^\s]*)([!?.,:])([A-zÀ-ž]{2,}))'), + lambda match: u"%s%s %s" % (match.group(2), match.group(3), match.group(4)) if not get_tld(match.group(1), fail_silently=True, fix_protocol=True) else match.group(1), + name="CM_punctuation_space2"), + + # fix lowercase I in english + NReProcessor(re.compile(r'(?u)(\b)i(\b)'), r"\1I\2", name="CM_EN_lowercase_i", + supported=lambda p: p.language == ENGLISH), ] post_processors = empty_line_post_processors @@ -105,9 +132,7 @@ class RemoveTags(SubtitleModification): exclusive = True modifies_whole_file = True - long_description = """\ - Removes all possible style tags from the subtitle, such as font, bold, color etc. - """ + long_description = "Removes all possible style tags from the subtitle, such as font, bold, color etc." def modify(self, content, debug=False, parent=None, **kwargs): for entry in parent.f: @@ -120,22 +145,51 @@ class ReverseRTL(SubtitleModification): description = "Reverse punctuation in RTL languages" exclusive = True order = 50 - languages = [Language("heb")] + languages = [Language(l) for l in ('heb', 'ara', 'fas')] - long_description = """\ - Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. - Applicable to languages: hebrew - """ + long_description = "Some playback devices don't properly handle right-to-left markers for punctuation. " \ + "Physically swap punctuation. Applicable to languages: hebrew, arabic, farsi, persian" processors = [ # new? (?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$); \5\4\3\2 #NReProcessor(re.compile(ur"(?u)((?=(?<=\b|^)|(?<=\s))([.!?-]+)([^.!?-]+)(?=\b|$|\s))"), r"\3\2", # name="CM_RTL_reverse") - NReProcessor(re.compile(ur"(?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$)"), r"\5\4\3\2", + NReProcessor(re.compile(ur"(?u)(^([\s.!?:,'-]*)(.+?)(\s*)(-?\s*)$)"), r"\5\4\3\2", name="CM_RTL_reverse") ] +split_upper_re = re.compile(ur"(\s*[.!?♪\-]\s*)") + + +class FixUppercase(SubtitleModification): + identifier = "fix_uppercase" + description = "Fixes all-uppercase subtitles" + modifies_whole_file = True + exclusive = True + order = 41 + only_uppercase = True + apply_last = True + + long_description = "Some subtitles are in all-uppercase letters. This at least makes them readable." + + def capitalize(self, c): + return u"".join([s.capitalize() for s in split_upper_re.split(c)]) + + def modify(self, content, debug=False, parent=None, **kwargs): + for entry in parent.f: + entry.plaintext = self.capitalize(entry.plaintext) + + +""" +subsync + +subsync --cli --offline --overwrite --window-size=600 --max-point-dist=2.0 --min-points-no=20 --min-word-prob=0.3 --min-word-len=5 --min-correlation=0.9999 --min-words-sim=0.6 --out-time-offset=-0.08 sync --out SUBTITLE -s SUBTITLE --sub-lang=eng --sub-enc=utf-8 -r REF_FILE --ref-stream-by-type=audio --ref-stream-by-lang=eng + +""" + + registry.register(CommonFixes) registry.register(RemoveTags) registry.register(ReverseRTL) +registry.register(FixUppercase) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/fps.py b/Contents/Libraries/Shared/subzero/modification/mods/fps.py index 4947a791d..b209eddff 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/fps.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/fps.py @@ -15,9 +15,7 @@ class ChangeFPS(SubtitleModification): advanced = True modifies_whole_file = True - long_description = """\ - Re-syncs the subtitle to the framerate of the current media file. - """ + long_description = "Re-syncs the subtitle to the framerate of the current media file." def modify(self, content, debug=False, parent=None, **kwargs): fps_from = kwargs.get("from") diff --git a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py index c5ab9900d..6af6e357b 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/hearing_impaired.py @@ -1,7 +1,8 @@ # coding=utf-8 import re -from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, EmptyEntryError, TAG +from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, TAG +from subzero.modification.exc import EmptyEntryError from subzero.modification.processors.re_processor import NReProcessor from subzero.modification import registry @@ -22,24 +23,38 @@ class HearingImpaired(SubtitleTextModification): exclusive = True order = 20 - long_description = """\ - Removes tags, text and characters from subtitles that are meant for hearing impaired people - """ + long_description = "Removes tags, text and characters from subtitles that are meant for hearing impaired people" processors = [ # full bracket entry, single or multiline; starting with brackets and ending with brackets FullBracketEntryProcessor(re.compile(ur'(?sux)^-?%(t)s[([].+(?=[^)\]]{3,}).+[)\]]%(t)s$' % {"t": TAG}), "", name="HI_brackets_full"), + # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, + # possibly with a dash in front; ignore anything ending with a quote + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s\->~]*(?=[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+]\s*[A-ZÀ-Ž&+])' + ur'[A-zÀ-ž-_0-9\s\"\'&+()\[\],:]+:(?![\"\'’ʼ❜‘‛”“‟„])(?:\s+|$))(?![0-9])'), "", + name="HI_before_colon_caps"), + + # any text before colon (at least 3 chars); at start or after a sentence, + # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if + # a space is inside the text; ignore anything ending with a quote + NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s\->~]*((?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])' + ur'[A-zÀ-ž-_0-9\s\"\'&+()\[\]]+:)(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), + lambda match: + match.group(1) if (match.group(2).count(" ") > 0 or match.group(1).count("-") > 0) + else "" if not match.group(1).startswith(" ") else " ", + name="HI_before_colon_noncaps"), + # brackets (only remove if at least 3 chars in brackets) - NReProcessor(re.compile(ur'(?sux)-?%(t)s[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % + NReProcessor(re.compile(ur'(?sux)-?%(t)s["\']*[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]]["\']*[\s:]*%(t)s' % {"t": TAG}), "", name="HI_brackets"), - NReProcessor(re.compile(ur'(?sux)-?%(t)s[([]%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+%(t)s$' % {"t": TAG}), - "", name="HI_bracket_open_start"), + #NReProcessor(re.compile(ur'(?sux)-?%(t)s[([]%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+%(t)s$' % {"t": TAG}), + # "", name="HI_bracket_open_start"), - NReProcessor(re.compile(ur'(?sux)-?%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "", - name="HI_bracket_open_end"), + #NReProcessor(re.compile(ur'(?sux)-?%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "", + # name="HI_bracket_open_end"), # text before colon (and possible dash in front), max 11 chars after the first whitespace (if any) # NReProcessor(re.compile(r'(?u)(^[A-z\-\'"_]+[\w\s]{0,11}:[^0-9{2}][\s]*)'), "", name="HI_before_colon"), @@ -48,20 +63,6 @@ class HearingImpaired(SubtitleTextModification): #NReProcessor(re.compile(ur'(?u)(\b|^)([\s-]*(?=[A-zÀ-ž-_0-9"\']{3,})[A-zÀ-ž-_0-9"\']+:\s*)'), "", # name="HI_before_colon"), - # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence, - # possibly with a dash in front; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s-]*(?=[A-ZÀ-Ž]\s*[A-ZÀ-Ž]\s*[A-ZÀ-Ž])' - ur'[A-ZÀ-Ž-_0-9\s\"\']+:(?![\"\'’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), "", - name="HI_before_colon_caps"), - - # any text before colon (at least 3 chars); at start or after a sentence, - # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if - # more than one space is inside the text; ignore anything ending with a quote - NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*(?=[A-zÀ-ž]\s*[A-zÀ-ž]\s*[A-zÀ-ž])' - ur'[A-zÀ-ž-_0-9\s\"\']+:(?![\"’ʼ❜‘‛”“‟„])\s*)(?![0-9])'), - lambda match: match.group(1) if (match.group(1).count(" ") > 1 - or match.group(1).count("-") > 1) else "", - name="HI_before_colon_noncaps"), # text in brackets at start, after optional dash, before colon or at end of line # fixme: may be too aggressive @@ -69,21 +70,30 @@ class HearingImpaired(SubtitleTextModification): # name="HI_brackets_special"), # all caps line (at least 4 consecutive uppercase chars) - NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž]{4,})[A-ZÀ-Ž-_\s]+$)'), "", name="HI_all_caps"), + NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZÀ-Ž&+]{4,})[A-ZÀ-Ž-_\s&+]+$)'), "", name="HI_all_caps", + supported=lambda p: not p.only_uppercase), + + # remove MAN: + NReProcessor(re.compile(ur'(?suxi)(\b(?:WO)MAN:\s*)'), "", name="HI_remove_man"), # dash in front # NReProcessor(re.compile(r'(?u)^\s*-\s*'), "", name="HI_starting_dash"), # all caps at start before new sentence NReProcessor(re.compile(ur'(?u)^(?=[A-ZÀ-Ž]{4,})[A-ZÀ-Ž-_\s]+\s([A-ZÀ-Ž][a-zà-ž].+)'), r"\1", - name="HI_starting_upper_then_sentence"), + name="HI_starting_upper_then_sentence", supported=lambda p: not p.only_uppercase), + ] + post_processors = empty_line_post_processors + last_processors = [ # remove music symbols NReProcessor(re.compile(ur'(?u)(^%(t)s[*#¶♫♪\s]*%(t)s[*#¶♫♪\s]+%(t)s[*#¶♫♪\s]*%(t)s$)' % {"t": TAG}), "", name="HI_music_symbols_only"), - ] - post_processors = empty_line_post_processors + # remove music entries + NReProcessor(re.compile(ur'(?ums)(^[-\s>~]*[*#¶♫♪]+\s*.+|.+\s*[*#¶♫♪]+\s*$)'), + "", name="HI_music", entry=True), + ] registry.register(HearingImpaired) diff --git a/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py b/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py index b817621ee..ec57ca006 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/ocr_fixes.py @@ -19,9 +19,7 @@ class FixOCR(SubtitleTextModification): order = 10 data_dict = None - long_description = """\ - Fix issues that happen when a subtitle gets converted from bitmap to text through OCR - """ + long_description = "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR" def __init__(self, parent): super(FixOCR, self).__init__(parent) @@ -42,7 +40,7 @@ def get_processors(self): # don't modify stuff inside quotes NReProcessor(re.compile(ur'(?u)(^[^"\'’ʼ❜‘‛”“‟„]*(?<=[A-ZÀ-Ž]{3})[A-ZÀ-Ž-_\s0-9]+)' ur'(["\'’ʼ❜‘‛”“‟„]*[.,‚،⹁、;]+)(\s*)(?!["\'’ʼ❜‘‛”“‟„])'), - r"\1:\3", name="OCR_fix_HI_colons"), + r"\1:\3", name="OCR_fix_HI_colons", supported=lambda p: not p.only_uppercase), # fix F'bla NReProcessor(re.compile(ur'(?u)(\bF)(\')([A-zÀ-ž]*\b)'), r"\1\3", name="OCR_fix_F"), WholeLineProcessor(self.data_dict["WholeLines"], name="OCR_replace_line"), diff --git a/Contents/Libraries/Shared/subzero/modification/mods/offset.py b/Contents/Libraries/Shared/subzero/modification/mods/offset.py index 705e714e9..2e342c0a1 100644 --- a/Contents/Libraries/Shared/subzero/modification/mods/offset.py +++ b/Contents/Libraries/Shared/subzero/modification/mods/offset.py @@ -16,21 +16,22 @@ class ShiftOffset(SubtitleModification): args_mergeable = True modifies_whole_file = True - long_description = """\ - Adds or substracts a certain amount of time from the whole subtitle to match your media - """ + long_description = "Adds or substracts a certain amount of time from the whole subtitle to match your media" @classmethod def merge_args(cls, args1, args2): new_args = dict((key, int(value)) for key, value in args1.iteritems()) for key, value in args2.iteritems(): + if not int(value): + continue + if key in new_args: new_args[key] += int(value) else: new_args[key] = int(value) - return new_args + return dict(filter(lambda (k, v): bool(v), new_args.iteritems())) def modify(self, content, debug=False, parent=None, **kwargs): parent.f.shift(h=int(kwargs.get("h", 0)), m=int(kwargs.get("m", 0)), s=int(kwargs.get("s", 0)), diff --git a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py index 17200d6e1..cc7613791 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/__init__.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/__init__.py @@ -7,10 +7,13 @@ class Processor(object): """ name = None parent = None + supported = None + enabled = True - def __init__(self, name=None, parent=None): + def __init__(self, name=None, parent=None, supported=None, **kwargs): self.name = name self.parent = parent + self.supported = supported if supported else lambda parent: True @property def info(self): @@ -27,3 +30,14 @@ def __str__(self): def __unicode__(self): return unicode(repr(self)) + + +class FuncProcessor(Processor): + func = None + + def __init__(self, func, name=None, parent=None, supported=None, **kwargs): + super(FuncProcessor, self).__init__(name=name, supported=supported) + self.func = func + + def process(self, content, debug=False, **kwargs): + return self.func(content) diff --git a/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py b/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py index 84c982989..3c5887458 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/re_processor.py @@ -2,6 +2,7 @@ import re import logging +from subzero.modification.exc import EmptyEntryError from subzero.modification.processors import Processor logger = logging.getLogger(__name__) @@ -14,13 +15,22 @@ class ReProcessor(Processor): pattern = None replace_with = None - def __init__(self, pattern, replace_with, name=None): - super(ReProcessor, self).__init__(name=name) + def __init__(self, pattern, replace_with, name=None, supported=None, entry=False, **kwargs): + super(ReProcessor, self).__init__(name=name, supported=supported) self.pattern = pattern self.replace_with = replace_with + self.use_entry = entry - def process(self, content, debug=False, **kwargs): - return self.pattern.sub(self.replace_with, content) + def process(self, content, debug=False, entry=None, **kwargs): + if not self.use_entry: + return self.pattern.sub(self.replace_with, content) + + ret = self.pattern.sub(self.replace_with, entry) + if not ret: + raise EmptyEntryError() + elif ret != entry: + return ret + return content class NReProcessor(ReProcessor): @@ -36,8 +46,8 @@ class MultipleWordReProcessor(ReProcessor): } replaces found key in pattern with the corresponding value in data """ - def __init__(self, snr_dict, name=None, parent=None): - super(ReProcessor, self).__init__(name=name) + def __init__(self, snr_dict, name=None, parent=None, supported=None, **kwargs): + super(ReProcessor, self).__init__(name=name, supported=supported) self.snr_dict = snr_dict def process(self, content, debug=False, **kwargs): diff --git a/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py b/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py index 77bf5669f..27b542c88 100644 --- a/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py +++ b/Contents/Libraries/Shared/subzero/modification/processors/string_processor.py @@ -12,8 +12,8 @@ class StringProcessor(Processor): String replacement processor base """ - def __init__(self, search, replace, name=None, parent=None): - super(StringProcessor, self).__init__(name=name) + def __init__(self, search, replace, name=None, parent=None, supported=None, **kwargs): + super(StringProcessor, self).__init__(name=name, supported=supported) self.search = search self.replace = replace @@ -31,8 +31,8 @@ class MultipleLineProcessor(Processor): "data": {"old_value": "new_value"} } """ - def __init__(self, snr_dict, name=None, parent=None): - super(MultipleLineProcessor, self).__init__(name=name) + def __init__(self, snr_dict, name=None, parent=None, supported=None, **kwargs): + super(MultipleLineProcessor, self).__init__(name=name, supported=supported) self.snr_dict = snr_dict def process(self, content, debug=False, **kwargs): diff --git a/Contents/Libraries/Shared/subzero/prefs.py b/Contents/Libraries/Shared/subzero/prefs.py new file mode 100644 index 000000000..252164fb9 --- /dev/null +++ b/Contents/Libraries/Shared/subzero/prefs.py @@ -0,0 +1,39 @@ +# coding=utf-8 +import traceback +from constants import PLUGIN_IDENTIFIER + + +def get_user_prefs(Prefs, Logger): + """ + loads all user prefs regardless of whether they exist in DefaultPrefs or not + :param Prefs: + :param Logger: + :return: + """ + + try: + prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER] + except: + Logger.Error("Loading user prefs failed: %s", traceback.format_exc()) + return {} + + user_prefs = {} + try: + xml_path = prefs_set._user_file_path + if not Prefs._core.storage.file_exists(xml_path): + return {} + prefs_str = Prefs._core.storage.load(xml_path, mtime_key=prefs_set) + prefs_xml = Prefs._core.data.xml.from_string(prefs_str) + for el in prefs_xml: + user_prefs[str(el.tag)] = str(el.text) + except: + Logger.Error("Loading user prefs failed: %s", traceback.format_exc()) + else: + return user_prefs + return {} + + +def update_user_prefs(update_prefs, Prefs, Logger): + prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER] + prefs_set.update_user_values(**update_prefs) + Logger.Info("User prefs updated") diff --git a/Contents/Libraries/Shared/subzero/subtitle_storage.py b/Contents/Libraries/Shared/subzero/subtitle_storage.py index 4c1ac1dc3..186a03a38 100644 --- a/Contents/Libraries/Shared/subzero/subtitle_storage.py +++ b/Contents/Libraries/Shared/subzero/subtitle_storage.py @@ -12,7 +12,7 @@ from json_tricks.nonp import loads from subzero.lib.json import dumps -from scandir import scandir +from scandir import scandir, scandir_generic as _scandir_generic from constants import mode_map logger = logging.getLogger(__name__) @@ -205,6 +205,18 @@ def get_all(self, part_id, lang): return part.get(str(lang)) + def set_current(self, part_id, lang, sub_key): + subs = self.get_all(part_id, lang) + if not subs: + return + + if sub_key not in subs: + logger.info("Tried setting unknown subtitle %s as current" % sub_key) + return + + subs["current"] = sub_key + logger.debug("Set subtitle %s as current for %s, %s" % (sub_key, part_id, lang)) + def get_by_provider(self, part_id, lang, provider_name): out = [] all_subs = self.get_all(part_id, lang) @@ -302,8 +314,9 @@ def get_json_data_path(self, bare_fn): return os.path.join(self.dataitems_path, "%s%s" % (bare_fn, self.extension)) return os.path.join(self.dataitems_path, bare_fn) - def get_all_files(self): - for entry in scandir(self.dataitems_path): + def get_all_files(self, scandir_generic=False): + _scandir = _scandir_generic if scandir_generic else scandir + for entry in _scandir(self.dataitems_path): if entry.is_file(follow_symlinks=False) and \ entry.name.startswith("subs_") and \ entry.name.endswith(self.extension): @@ -313,11 +326,17 @@ def get_recent_files(self, age_days=30): fl = [] root = self.dataitems_path recent_dt = datetime.datetime.now() - datetime.timedelta(days=age_days) - for fn in self.get_all_files(): - ctime = os.path.getctime(os.path.join(root, fn)) - created = datetime.datetime.fromtimestamp(ctime) - if created > recent_dt: - fl.append(fn) + + def run(scandir_generic=False): + for fn in self.get_all_files(scandir_generic=scandir_generic): + ctime = os.path.getctime(os.path.join(root, fn)) + created = datetime.datetime.fromtimestamp(ctime) + if created > recent_dt: + fl.append(fn) + try: + run() + except OSError: + run(scandir_generic=True) return fl def load_recent_files(self, age_days=30): @@ -329,7 +348,7 @@ def load_recent_files(self, age_days=30): out[fn] = data return out - def delete_missing(self, wanted_languages=set()): + def delete_missing(self, wanted_languages=set(), scandir_generic=False): deleted = [] def delete_fn(filename): @@ -338,7 +357,7 @@ def delete_fn(filename): else: self.legacy_delete(filename) - for fn in self.get_all_files(): + for fn in self.get_all_files(scandir_generic=scandir_generic): video_id = os.path.basename(fn).split(".")[0].split("subs_")[1] item = self.get_item(video_id) @@ -507,7 +526,7 @@ def save(self, subs_for_video): finally: f.close() except: - logger.error("Something REALLY went wrong when writing to: %s: %s", basename, + logger.error("Something went REALLY wrong when writing to: %s: %s", basename, traceback.format_exc()) else: with gzip.open(temp_fn, "wb", compresslevel=6) as f: diff --git a/Contents/Libraries/Shared/subzero/video.py b/Contents/Libraries/Shared/subzero/video.py index bfd9d2471..160e1afec 100644 --- a/Contents/Libraries/Shared/subzero/video.py +++ b/Contents/Libraries/Shared/subzero/video.py @@ -17,17 +17,25 @@ def has_external_subtitle(part_id, stored_subs, language): def set_existing_languages(video, video_info, external_subtitles=False, embedded_subtitles=False, known_embedded=None, - forced_only=False, stored_subs=None, languages=None, only_one=False): + stored_subs=None, languages=None, only_one=False, known_metadata_subs=None, + match_strictness="strict"): logger.debug(u"Determining existing subtitles for %s", video.name) + external_langs_found = set() # scan for external subtitles - external_langs_found = set(search_external_subtitles(video.name, forced_tag=forced_only, languages=languages, - only_one=only_one).values()) + if known_metadata_subs: + # existing metadata subtitles + external_langs_found = known_metadata_subs + + external_langs_found.update(set(search_external_subtitles(video.name, languages=languages, + only_one=only_one, + match_strictness=match_strictness).values())) # found external subtitles should be considered? if external_subtitles: # |= is update, thanks plex video.subtitle_languages.update(external_langs_found) + video.external_subtitle_languages.update(external_langs_found) else: # did we already download subtitles for this? @@ -40,24 +48,16 @@ def set_existing_languages(video, video_info, external_subtitles=False, embedded # add known embedded subtitles if embedded_subtitles and known_embedded: - embedded_subtitle_languages = set() # mp4 and stuff, check burned in for language in known_embedded: - try: - embedded_subtitle_languages.add(language_from_stream(language)) - - except LanguageError: - logger.error('Embedded subtitle track language %r is not a valid language', language) - embedded_subtitle_languages.add(Language('und')) - - logger.debug('Found embedded subtitle %r', embedded_subtitle_languages) - video.subtitle_languages.update(embedded_subtitle_languages) + logger.debug('Found embedded subtitle %r', language) + video.subtitle_languages.add(language) -def parse_video(fn, hints, skip_hashing=False, dry_run=False, providers=None): +def parse_video(fn, hints, skip_hashing=False, dry_run=False, providers=None, hash_from=None): logger.debug("Parsing video: %s, hints: %s", os.path.basename(fn), hints) return scan_video(fn, hints=hints, dont_use_actual_file=dry_run, providers=providers, - skip_hashing=skip_hashing) + skip_hashing=skip_hashing, hash_from=hash_from) def refine_video(video, no_refining=False, refiner_settings=None): @@ -115,6 +115,7 @@ def refine_video(video, no_refining=False, refiner_settings=None): video.year = year refine(video, **refine_kwargs) + logger.info(u"Using filename: %s", video.original_name) if hints["type"] == "movie" and not video.imdb_id: if plex_title: @@ -134,6 +135,11 @@ def refine_video(video, no_refining=False, refiner_settings=None): if video.imdb_id: logger.info(u"Adding PMS imdb_id info: %s", video.imdb_id) + elif hints["type"] == "movie" and plex_title: + pt = plex_title.replace(" - ", " ").replace(" -", " ").replace("- ", " ") + if pt != video.title: + video.alternative_titles.append(pt) + if hints["type"] == "episode": video.season = video_info.get("season", video.season) video.episode = video_info.get("episode", video.episode) @@ -149,6 +155,9 @@ def refine_video(video, no_refining=False, refiner_settings=None): video.alternative_series.append(old_title) + elif plex_title and video.series != plex_title: + video.alternative_series.append(plex_title) + # still no match? add our own data if not video.series_tvdb_id or not video.tvdb_id: logger.info(u"Adding PMS year info: %s", video_info.get("year")) diff --git a/Contents/Libraries/Shared/test.srt b/Contents/Libraries/Shared/test.srt index a7dc4dd78..e3a340ebc 100644 --- a/Contents/Libraries/Shared/test.srt +++ b/Contents/Libraries/Shared/test.srt @@ -3,22 +3,32 @@ (WHOOSHING) This is a phone number: 123 4325 123 H i. But not MATCH hindrance. +Ja, det är väl det. Tack och lov +att HD:s beslut var så solklart. +But this should. Peter: Yello! +- IMF:s stordator. 2 00:00:10,759 --> 00:00:12,678 ROSE: (Help us. Please. . .help us.) -What's "wrong"? over 9, 000! +What's "wrong"?over 9, 000! I can't keep running. L can't! 3 00:00:12,679 --> 00:00:16,097 -<b>I don't know. Some kind of wrong "1 00" number--- +<b>i don't know. Some kind of wrong "1 00" number--- of signal, drawing the Tardis off.... course.</b> +# I'm singing in the rain +www.website.com +www.nowebsite.badlol 4 00:00:16,099 --> 00:00:17,224 this <font color="#000000">is a"subtitle" test</font> "with a"text before colons and "peter"following: Where are we?." Mah numbar is wrong: 1 91 7 +: +: Peter is funny! +¶You're singing in the rain# 5 00:00:17,225 --> 00:00:19,684 @@ -26,6 +36,7 @@ Mah numbar is wrong: 1 91 7 MUSIC PLAYS What is that sound?! ls it , and a punctuation issue ? lol take them balls it. L like turtles !! ! this, . is bad . +All singing in the rain # 6 00:00:19,686 --> 00:00:21,103 @@ -38,6 +49,7 @@ But fix this: 81 ,00 <i>(laughing): lrn gonna And when are we? (chuckles) lrn gonna And when are we?</i> "I luv butts". +That'’s OK. 8 00:00:24,274 --> 00:00:26,649 @@ -3179,6 +3191,8 @@ Engage safety. 00:46:14,353 --> 00:46:17,384 MAN: Someone down there shouldn't be here. +weird man: oh yeah. +- man: shit. 745 00:46:19,985 --> 00:46:21,360 diff --git a/Contents/Libraries/Shared/tld/__init__.py b/Contents/Libraries/Shared/tld/__init__.py new file mode 100644 index 000000000..a0e456f85 --- /dev/null +++ b/Contents/Libraries/Shared/tld/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from .utils import get_fld, get_tld, get_tld_names, is_tld, parse_tld, Result, update_tld_names +__title__ = u'tld' +__version__ = u'0.11.10' +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'get_fld', u'get_tld', u'get_tld_names', u'is_tld', + u'parse_tld', u'Result', u'update_tld_names') diff --git a/Contents/Libraries/Shared/tld/base.py b/Contents/Libraries/Shared/tld/base.py new file mode 100644 index 000000000..420cd6a5e --- /dev/null +++ b/Contents/Libraries/Shared/tld/base.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from six import with_metaclass as _py_backwards_six_withmetaclass +from codecs import open as codecs_open +try: + from urllib.request import urlopen +except ImportError: + from six.moves.urllib.request import urlopen as urlopen +from .exceptions import TldIOError, TldImproperlyConfigured +from .helpers import project_dir +from .registry import Registry +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'BaseTLDSourceParser',) + + +class BaseTLDSourceParser( + _py_backwards_six_withmetaclass(Registry, *[object])): + u'Base TLD source parser.' + uid = None + source_url = None + local_path = None + + @classmethod + def validate(cls): + u'Constructor.' + if (not cls.uid): + raise TldImproperlyConfigured( + u'The `uid` property of the TLD source parser shall be defined.') + + @classmethod + def get_tld_names(cls, fail_silently=False, retry_count=0): + u'Get tld names.\n\n :param fail_silently:\n :param retry_count:\n :return:\n ' + cls.validate() + raise NotImplementedError( + u'Your TLD source parser shall implement `get_tld_names` method.') + + @classmethod + def update_tld_names(cls, fail_silently=False): + u'Update the local copy of the TLD file.\n\n :param fail_silently:\n :return:\n ' + try: + remote_file = urlopen(cls.source_url) + local_file = codecs_open(project_dir( + cls.local_path), u'wb', encoding='utf8') + local_file.write(remote_file.read().decode(u'utf8')) + local_file.close() + remote_file.close() + except Exception as err: + if fail_silently: + return False + raise TldIOError(err) + return True diff --git a/Contents/Libraries/Shared/tld/conf.py b/Contents/Libraries/Shared/tld/conf.py new file mode 100644 index 000000000..50d9a4c25 --- /dev/null +++ b/Contents/Libraries/Shared/tld/conf.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from typing import Any +from . import defaults +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'get_setting', u'reset_settings', u'set_setting', u'settings') + + +class Settings(object): + u'Settings registry.' + + def __init__(self): + self._settings = { + + } + self._settings_get = self._settings.get + + def set(self, name, value): + u'\n Override default settings.\n\n :param str name:\n :param mixed value:\n ' + self._settings[name] = value + + def get(self, name, default=None): + u'\n Gets a variable from local settings.\n\n :param str name:\n :param mixed default: Default value.\n :return mixed:\n ' + if (name in self._settings): + return self._settings_get(name, default) + elif hasattr(defaults, name): + return getattr(defaults, name, default) + return default + + def reset(self): + u'Reset settings.' + for name in defaults.__all__: + self.set(name, getattr(defaults, name)) + + +settings = Settings() +get_setting = settings.get +set_setting = settings.set +reset_settings = settings.reset diff --git a/Contents/Libraries/Shared/tld/defaults.py b/Contents/Libraries/Shared/tld/defaults.py new file mode 100644 index 000000000..35be13ab1 --- /dev/null +++ b/Contents/Libraries/Shared/tld/defaults.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from os.path import dirname +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'DEBUG', u'NAMES_LOCAL_PATH_PARENT') +NAMES_LOCAL_PATH_PARENT = dirname(__file__) +DEBUG = False diff --git a/Contents/Libraries/Shared/tld/exceptions.py b/Contents/Libraries/Shared/tld/exceptions.py new file mode 100644 index 000000000..2f0278b6e --- /dev/null +++ b/Contents/Libraries/Shared/tld/exceptions.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from .conf import get_setting +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'TldBadUrl', u'TldDomainNotFound', + u'TldImproperlyConfigured', u'TldIOError') + + +class TldIOError(IOError): + u'TldIOError.\n\n Supposed to be thrown when problems with reading/writing occur.\n ' + + def __init__(self, msg=None): + tld_names_local_path = get_setting(u'NAMES_LOCAL_PATH') + if (msg is None): + msg = (u"Can't read from or write to the %s file!" % + tld_names_local_path) + super(TldIOError, self).__init__(msg) + + +class TldDomainNotFound(ValueError): + u"TldDomainNotFound.\n\n Supposed to be thrown when domain name is not found (didn't match) the\n local TLD policy.\n " + + def __init__(self, domain_name): + super(TldDomainNotFound, self).__init__( + (u"Domain %s didn't match any existing TLD name!" % domain_name)) + + +class TldBadUrl(ValueError): + u'TldBadUrl.\n\n Supposed to be thrown when bad URL is given.\n ' + + def __init__(self, url): + super(TldBadUrl, self).__init__((u'Is not a valid URL %s!' % url)) + + +class TldImproperlyConfigured(Exception): + u'TldImproperlyConfigured.\n\n Supposed to be thrown when code is improperly configured. Typical use-case\n is when user tries to use `get_tld` function with both `search_public` and\n `search_private` set to False.\n ' + + def __init__(self, msg=None): + if (msg is None): + msg = u'Improperly configured.' + else: + msg = (u'Improperly configured. %s' % msg) + super(TldImproperlyConfigured, self).__init__(msg) diff --git a/Contents/Libraries/Shared/tld/helpers.py b/Contents/Libraries/Shared/tld/helpers.py new file mode 100644 index 000000000..951204dbe --- /dev/null +++ b/Contents/Libraries/Shared/tld/helpers.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from os.path import abspath, join +from .conf import get_setting +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'project_dir', u'PROJECT_DIR') + + +def project_dir(base): + u'Project dir.' + tld_names_local_path_parent = get_setting(u'NAMES_LOCAL_PATH_PARENT') + return abspath(join(tld_names_local_path_parent, base).replace(u'\\', u'/')) + + +PROJECT_DIR = project_dir diff --git a/Contents/Libraries/Shared/tld/parsers/__init__.py b/Contents/Libraries/Shared/tld/parsers/__init__.py new file mode 100644 index 000000000..5eaaa0a68 --- /dev/null +++ b/Contents/Libraries/Shared/tld/parsers/__init__.py @@ -0,0 +1,5 @@ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals diff --git a/Contents/Libraries/Shared/tld/parsers/mozilla.py b/Contents/Libraries/Shared/tld/parsers/mozilla.py new file mode 100644 index 000000000..5eaaa0a68 --- /dev/null +++ b/Contents/Libraries/Shared/tld/parsers/mozilla.py @@ -0,0 +1,5 @@ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals diff --git a/Contents/Libraries/Shared/tld/registry.py b/Contents/Libraries/Shared/tld/registry.py new file mode 100644 index 000000000..c83d6abae --- /dev/null +++ b/Contents/Libraries/Shared/tld/registry.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from typing import Type, Dict +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'Registry',) + + +class Registry(type): + REGISTRY = { + + } + + def __new__(cls, name, bases, attrs): + new_cls = type.__new__(cls, name, bases, attrs) + if getattr(new_cls, u'_uid', None): + cls.REGISTRY[new_cls._uid] = new_cls + return new_cls + + @property + def _uid(cls): + return getattr(cls, 'uid', cls.__name__) + + @classmethod + def reset(cls): + cls.REGISTRY = { + + } + + @classmethod + def get(cls, key, default=None): + return cls.REGISTRY.get(key, default) + + @classmethod + def items(cls): + return cls.REGISTRY.items() diff --git a/Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt b/Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt new file mode 100644 index 000000000..565efd225 --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/effective_tld_names.dat.txt @@ -0,0 +1,13056 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://www.amnic.net/policy/en/Policy_EN.pdf +am +co.am +com.am +commune.am +net.am +org.am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +catholic.edu.au +eq.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +// 4LDs +education.tas.edu.au +schools.nsw.edu.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn + +// bo : https://nic.bo/delegacion2015.php#h-1.10 +bo +com.bo +edu.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bhz.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +cri.br +cuiaba.br +curitiba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +tc.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html +aeroport.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://pandi.id/en/domain/registration-requirements/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-süd-tirol.it +trentino-sudtirol.it +trentino-südtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentino.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosüd-tirol.it +trentinosudtirol.it +trentinosüdtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it +valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano-altoadige.it +bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesena-forlì.it +cesenaforli.it +cesenaforlì.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlì-cesena.it +forlicesena.it +forlìcesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +südtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://www.nic.kw/policies/ +// Confirmed by registry <nic.tech@citra.gov.kw> +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://www.nic.ls/ +// Confirmed by registry <lsadmin@nic.ls> +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky <gug@cctld.ru> +ru + +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://sonic.so/policies/ +so +com.so +edu.so +gov.so +me.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// ss : https://registry.nic.ss/ +// Submitted by registry <technical@nic.ss> +ss +biz.ss +com.ss +edu.ss +gov.ss +net.ss +org.ss + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +mil.tr +k12.tr +kep.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +// Used by Northern Cyprus +nc.tr +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +// https://www.hkirc.hk/content.jsp?id=30#!/34 +香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky <gug@cctld.ru> +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + + +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2019-12-11T17:19:54Z +// This list is auto-generated, don't edit it manually. +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Minds + Machines Group Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Binky Moon, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Binky Moon, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// actor : 2013-12-12 Dog Beach, LLC +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Binky Moon, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 Dog Beach, LLC +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 Region Grand Est +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 Oath Inc. +aol + +// apartments : 2014-12-11 Binky Moon, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 Afilias Limited +archi + +// army : 2014-03-06 Dog Beach, LLC +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Binky Moon, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 Dog Beach, LLC +attorney + +// auction : 2014-03-20 Dog Beach, LLC +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon Registry Services, Inc. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon Registry Services, Inc. +author + +// auto : 2014-11-13 Cars Registry Limited +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Avianca Holdings S.A. +avianca + +// aws : 2015-06-25 Amazon Registry Services, Inc. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 XYZ.COM LLC +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 Dog Beach, LLC +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Binky Moon, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Minds + Machines Group Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias Limited +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Binky Moon, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Binky Moon, LLC +bingo + +// bio : 2014-03-06 Afilias Limited +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 Knock Knock WHOIS There, LLC +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 Bank of America Corporation +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 ShortDot SA +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon Registry Services, Inc. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 Boston TLD Management, LLC +boston + +// bot : 2014-12-18 Amazon Registry Services, Inc. +bot + +// boutique : 2013-11-14 Binky Moon, LLC +boutique + +// box : 2015-11-12 .BOX INC. +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 Dotbroker Registry Limited +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Minds + Machines Group Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Binky Moon, LLC +builders + +// business : 2013-11-07 Binky Moon, LLC +business + +// buy : 2014-12-18 Amazon Registry Services, Inc. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Binky Moon, LLC +cab + +// cafe : 2015-02-11 Binky Moon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon Registry Services, Inc. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Binky Moon, LLC +camera + +// camp : 2013-11-07 Binky Moon, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Binky Moon, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 Cars Registry Limited +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Binky Moon, LLC +cards + +// care : 2014-03-06 Binky Moon, LLC +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Binky Moon, LLC +careers + +// cars : 2014-11-13 Cars Registry Limited +cars + +// casa : 2013-11-21 Minds + Machines Group Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Binky Moon, LLC +cash + +// casino : 2014-12-18 Binky Moon, LLC +casino + +// catering : 2013-12-05 Binky Moon, LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Binky Moon, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 DotCFD Registry Limited +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association +chase + +// chat : 2014-12-04 Binky Moon, LLC +chat + +// cheap : 2013-11-14 Binky Moon, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Binky Moon, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon Registry Services, Inc. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Binky Moon, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Binky Moon, LLC +claims + +// cleaning : 2013-12-05 Binky Moon, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Binky Moon, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Binky Moon, LLC +clothing + +// cloud : 2015-04-16 Aruba PEC S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Binky Moon, LLC +coach + +// codes : 2013-10-31 Binky Moon, LLC +codes + +// coffee : 2013-10-17 Binky Moon, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 dotKoeln GmbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Binky Moon, LLC +community + +// company : 2013-11-07 Binky Moon, LLC +company + +// compare : 2015-10-08 Registry Services, LLC +compare + +// computer : 2013-10-24 Binky Moon, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Binky Moon, LLC +condos + +// construction : 2013-09-16 Binky Moon, LLC +construction + +// consulting : 2013-12-05 Dog Beach, LLC +consulting + +// contact : 2015-01-08 Dog Beach, LLC +contact + +// contractors : 2013-09-10 Binky Moon, LLC +contractors + +// cooking : 2013-11-21 Minds + Machines Group Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Binky Moon, LLC +cool + +// corsica : 2014-09-25 Collectivité de Corse +corsica + +// country : 2013-12-19 DotCountry LLC +country + +// coupon : 2015-02-26 Amazon Registry Services, Inc. +coupon + +// coupons : 2015-03-26 Binky Moon, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC +credit + +// creditcard : 2014-03-20 Binky Moon, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Binky Moon, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 Dog Beach, LLC +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Binky Moon, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Minds + Machines Group Limited +dds + +// deal : 2015-06-25 Amazon Registry Services, Inc. +deal + +// dealer : 2014-12-22 Intercap Registry Inc. +dealer + +// deals : 2014-05-22 Binky Moon, LLC +deals + +// degree : 2014-03-06 Dog Beach, LLC +degree + +// delivery : 2014-09-11 Binky Moon, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 Dog Beach, LLC +democrat + +// dental : 2014-03-20 Binky Moon, LLC +dental + +// dentist : 2014-03-20 Dog Beach, LLC +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 Binky Moon, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Binky Moon, LLC +digital + +// direct : 2014-04-10 Binky Moon, LLC +direct + +// directory : 2013-09-20 Binky Moon, LLC +directory + +// discount : 2014-03-06 Binky Moon, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Binky Moon, LLC +doctor + +// dog : 2014-12-04 Binky Moon, LLC +dog + +// domains : 2013-10-17 Binky Moon, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 DISH Technologies L.L.C. +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Binky Moon, LLC +education + +// email : 2013-10-31 Binky Moon, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Moon, LLC +energy + +// engineer : 2014-03-06 Dog Beach, LLC +engineer + +// engineering : 2014-03-06 Binky Moon, LLC +engineering + +// enterprises : 2013-09-20 Binky Moon, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Binky Moon, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Binky Moon, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Binky Moon, LLC +events + +// exchange : 2014-03-06 Binky Moon, LLC +exchange + +// expert : 2013-11-21 Binky Moon, LLC +expert + +// exposed : 2013-12-05 Binky Moon, LLC +exposed + +// express : 2015-02-11 Binky Moon, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Binky Moon, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 Dog Beach, LLC +family + +// fan : 2014-03-06 Dog Beach, LLC +fan + +// fans : 2014-11-07 ZDNS International Limited +fans + +// farm : 2013-11-07 Binky Moon, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Minds + Machines Group Limited +fashion + +// fast : 2014-12-18 Amazon Registry Services, Inc. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Canada Inc. +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Binky Moon, LLC +finance + +// financial : 2014-03-06 Binky Moon, LLC +financial + +// fire : 2015-06-25 Amazon Registry Services, Inc. +fire + +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Binky Moon, LLC +fish + +// fishing : 2013-11-21 Minds + Machines Group Limited +fishing + +// fit : 2014-11-07 Minds + Machines Group Limited +fit + +// fitness : 2014-03-06 Binky Moon, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Binky Moon, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Binky Moon, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Binky Moon, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 Dotforex Registry Limited +forex + +// forsale : 2014-05-22 Dog Beach, LLC +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 Binky Moon, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon Registry Services, Inc. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 DotSpace Inc. +fun + +// fund : 2014-03-20 Binky Moon, LLC +fund + +// furniture : 2014-03-20 Binky Moon, LLC +furniture + +// futbol : 2013-09-20 Dog Beach, LLC +futbol + +// fyi : 2015-04-02 Binky Moon, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Binky Moon, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 Dog Beach, LLC +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Minds + Machines Group Limited +garden + +// gay : 2019-05-23 Top Level Design, LLC +gay + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL NV +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 DotGift, LLC +gift + +// gifts : 2014-07-03 Binky Moon, LLC +gifts + +// gives : 2014-03-06 Dog Beach, LLC +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Binky Moon, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot Global Domain Registry Limited +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Binky Moon, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 Binky Moon, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Binky Moon, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon Registry Services, Inc. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Binky Moon, LLC +graphics + +// gratis : 2014-03-20 Binky Moon, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Binky Moon, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Binky Moon, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Binky Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Binky Moon, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 Dog Beach, LLC +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Binky Moon, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 Uniregistry, Corp. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Binky Moon, LLC +hockey + +// holdings : 2013-08-27 Binky Moon, LLC +holdings + +// holiday : 2013-11-07 Binky Moon, LLC +holiday + +// homedepot : 2015-04-02 Home Depot Product Authority, LLC +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Minds + Machines Group Limited +horse + +// hospital : 2016-10-20 Binky Moon, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon Registry Services, Inc. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Binky Moon, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 ShortDot SA +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon Registry Services, Inc. +imdb + +// immo : 2014-07-10 Binky Moon, LLC +immo + +// immobilien : 2013-11-07 Dog Beach, LLC +immobilien + +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Binky Moon, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Binky Moon, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Binky Moon, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Binky Moon, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Binky Moon, LLC +irish + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 Binky Moon, LLC +jetzt + +// jewelry : 2015-03-05 Binky Moon, LLC +jewelry + +// jio : 2015-04-02 Reliance Industries Limited +jio + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon Registry Services, Inc. +jot + +// joy : 2014-12-18 Amazon Registry Services, Inc. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 Dog Beach, LLC +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon Registry Services, Inc. +kindle + +// kitchen : 2013-09-20 Binky Moon, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 dotKoeln GmbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// land : 2013-09-10 Binky Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 LW TLD Limited +law + +// lawyer : 2014-03-20 Dog Beach, LLC +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Binky Moon, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Binky Moon, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Binky Moon, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 Binky Moon, LLC +lighting + +// like : 2014-12-18 Amazon Registry Services, Inc. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Binky Moon, LLC +limited + +// limo : 2013-10-17 Binky Moon, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 Dog Beach, LLC +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 Dot Registry LLC +llp + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 Binky Moon, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Binky Moon, LLC +ltd + +// ltda : 2014-04-17 InterNetX, Corp +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Minds + Machines Group Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Binky Moon, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 Binky Moon, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 Dog Beach, LLC +market + +// marketing : 2013-11-07 Binky Moon, LLC +marketing + +// markets : 2014-12-11 Dotmarkets Registry Limited +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Binky Moon, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Binky Moon, LLC +media + +// meet : 2014-01-16 Charleston Road Registry Inc. +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Dot Menu Registry, LLC +menu + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Minds + Machines Group Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// moda : 2013-11-07 Dog Beach, LLC +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon Registry Services, Inc. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Binky Moon, LLC +money + +// monster : 2015-09-11 XYZ.COM LLC +monster + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 Dog Beach, LLC +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Motorola Trademark Holdings, LLC +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 Binky Moon, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 Nadex Domains, Inc. +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 Dog Beach, LLC +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Binky Moon, LLC +network + +// neustar : 2013-12-05 Registry Services, LLC +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 Dog Beach, LLC +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 Dog Beach, LLC +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon Registry Services, Inc. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Top Level Spectrum, Inc. +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BRregistry, Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Osaka Registry Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 MédiaBC +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Binky Moon, LLC +partners + +// parts : 2013-12-05 Binky Moon, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon Registry Services, Inc. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias Limited +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Binky Moon, LLC +photography + +// photos : 2013-10-17 Binky Moon, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Binky Moon, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon Registry Services, Inc. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Binky Moon, LLC +pizza + +// place : 2014-04-24 Binky Moon, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Binky Moon, LLC +plumbing + +// plus : 2015-02-05 Binky Moon, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon Registry Services, Inc. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Binky Moon, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 Afilias Limited +promo + +// properties : 2013-12-05 Binky Moon, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 XYZ.COM LLC +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 Dog Beach, LLC +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 XYZ.COM LLC +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon Registry Services, Inc. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Binky Moon, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 Dog Beach, LLC +rehab + +// reise : 2014-03-13 Binky Moon, LLC +reise + +// reisen : 2014-03-06 Binky Moon, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 ZDNS International Limited +ren + +// rent : 2014-12-04 XYZ.COM LLC +rent + +// rentals : 2013-12-05 Binky Moon, LLC +rentals + +// repair : 2013-11-07 Binky Moon, LLC +repair + +// report : 2013-12-05 Binky Moon, LLC +report + +// republican : 2014-03-20 Dog Beach, LLC +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Binky Moon, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 Dog Beach, LLC +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 Dog Beach, LLC +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 Dog Beach, LLC +rocks + +// rodeo : 2013-12-19 Minds + Machines Group Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Canada Inc. +rogers + +// room : 2014-12-18 Amazon Registry Services, Inc. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Binky Moon, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BRregistry, Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon Registry Services, Inc. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 Dog Beach, LLC +sale + +// salon : 2014-12-11 Binky Moon, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sarl : 2014-07-03 Binky Moon, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon Registry Services, Inc. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Binky Moon, LLC +school + +// schule : 2014-03-06 Binky Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon Registry Services, Inc. +secure + +// security : 2015-05-14 XYZ.COM LLC +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 Registry Services, LLC +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Binky Moon, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Moon, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 Binky Moon, LLC +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Binky Moon, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon Registry Services, Inc. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Binky Moon, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 Afilias Limited +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky International AG +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 DISH Technologies L.L.C. +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon Registry Services, Inc. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Binky Moon, LLC +soccer + +// social : 2013-11-07 Dog Beach, LLC +social + +// softbank : 2015-07-02 SoftBank Group Corp. +softbank + +// software : 2014-03-20 Dog Beach, LLC +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Binky Moon, LLC +solar + +// solutions : 2013-11-07 Binky Moon, LLC +solutions + +// song : 2015-02-26 Amazon Registry Services, Inc. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 DotSpace Inc. +space + +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport + +// spot : 2015-02-26 Amazon Registry Services, Inc. +spot + +// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited +spreadbetting + +// srl : 2015-05-07 InterNetX, Corp +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 XYZ.COM LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 Dog Beach, LLC +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Ltd. +sucks + +// supplies : 2013-12-19 Binky Moon, LLC +supplies + +// supply : 2013-12-19 Binky Moon, LLC +supply + +// support : 2013-10-24 Binky Moon, LLC +support + +// surf : 2014-01-09 Minds + Machines Group Limited +surf + +// surgery : 2014-03-20 Binky Moon, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Binky Moon, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon Registry Services, Inc. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Binky Moon, LLC +tax + +// taxi : 2015-03-19 Binky Moon, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Binky Moon, LLC +team + +// tech : 2015-01-30 Personals TLD Inc. +tech + +// technology : 2013-09-13 Binky Moon, LLC +technology + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Binky Moon, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Home Depot Product Authority, LLC +thd + +// theater : 2015-03-19 Binky Moon, LLC +theater + +// theatre : 2015-05-07 XYZ.COM LLC +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Binky Moon, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Binky Moon, LLC +tips + +// tires : 2014-11-07 Binky Moon, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Binky Moon, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Binky Moon, LLC +tools + +// top : 2014-03-20 .TOP Registry +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Binky Moon, LLC +tours + +// town : 2014-03-06 Binky Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Binky Moon, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 Dottrading Registry Limited +trading + +// training : 2013-11-07 Binky Moon, LLC +training + +// travel : Dog Beach, LLC +travel + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 NCC Group Inc. +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon Registry Services, Inc. +tunes + +// tushu : 2014-12-18 Amazon Registry Services, Inc. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Binky Moon, LLC +university + +// uno : 2013-09-11 DotSite Inc. +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Binky Moon, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Moon, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 tldbox GmbH +versicherung + +// vet : 2014-03-06 Dog Beach, LLC +vet + +// viajes : 2013-10-17 Binky Moon, LLC +viajes + +// video : 2014-10-16 Dog Beach, LLC +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 Binky Moon, LLC +villas + +// vin : 2015-06-18 Binky Moon, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Binky Moon, LLC +vision + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Minds + Machines Group Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Binky Moon, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Wang Limited +wang + +// wanggou : 2014-12-18 Amazon Registry Services, Inc. +wanggou + +// watch : 2013-11-14 Binky Moon, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 International Business Machines Corporation +weather + +// weatherchannel : 2015-03-12 International Business Machines Corporation +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Minds + Machines Group Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 Binky Moon, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Minds + Machines Group Limited +work + +// works : 2013-11-14 Binky Moon, LLC +works + +// world : 2014-06-12 Binky Moon, LLC +world + +// wow : 2015-10-08 Amazon Registry Services, Inc. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Binky Moon, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +商标 + +// xn--czrs0t : 2013-12-19 Binky Moon, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +ポイント + +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Binky Moon, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +餐厅 + +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--otu796d : 2017-08-06 Internet DotTrademark Organisation Limited +招聘 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +書籍 + +// xn--ses554g : 2014-01-16 KNET Co., Ltd. +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Binky Moon, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Binky Moon, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +yamaxun + +// yandex : 2014-04-10 Yandex Europe B.V. +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Minds + Machines Group Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon Registry Services, Inc. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon Registry Services, Inc. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon Registry Services, Inc. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zone : 2013-11-14 Binky Moon, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// Adobe : https://www.adobe.com/ +// Submitted by Ian Boston <boston@adobe.com> +adobeaemcloud.com +adobeaemcloud.net +*.dev.adobeaemcloud.com + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov <avramov@alboto.ca> +barsy.ca + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas <tech_staff@altervista.it> +altervista.org + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amsterdam Wireless: https://www.amsterdamwireless.nl/ +// Submitted by Imre Jonk <hostmaster@amsterdamwireless.nl> +amsw.nl + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team <security@apigee.com> +apigee.io + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI <mail@aseinet.com> +user.aseinet.ne.jp +gv.vc +d.gv.vc + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz <olivier.benz@b-data.ch> +b-data.io + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// Balena : https://www.balena.io +// Submitted by Petros Angelatos <petrosagg@balena.io> +balena-devices.com + +// Banzai Cloud +// Submitted by Gabor Kozma <info@banzaicloud.com> +app.banzaicloud.io + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder <paul.crowder@blackbaud.com> +blackbaudcdn.net + +// Boomla : https://boomla.com +// Submitted by Tibor Halter <thalter@boomla.com> +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk> +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// Carrd : https://carrd.co +// Submitted by AJ <aj@carrd.co> +carrd.co +crd.co +uwu.ai + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar <rishabh.nambiar@discourse.org> +discourse.group + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam <noc@clever-cloud.com> +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti <colin@clerk.dev> +*.lcl.dev +*.stg.dev + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me +cloud66.ws +cloud66.zone + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek <noc@cloudaccess.net> +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Philip Langdale <security@cloudera.com> +cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Jake Riesterer <publicsuffixlist@cloudflare.com> +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen <patrick@clovyr.io> +wnext.app + +// co.ca : http://registry.co.ca/ +co.ca + +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis <govert@co-co.nl> +*.otap.co + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// Cloudeity Inc : https://cloudeity.com +// Submitted by Stefan Dimitrov <contact@cloudeity.com> +cloudeity.net + +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding <angelo@lahacker.net> +cnpy.gdn + +// CoDNS B.V. +co.nl +co.no + +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com> +webhosting.be +hosting-cluster.nl + +// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ +// Submitted by George Georgievsky <gug@cctld.ru> +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Submitted by Gregory Drake <support@dyn.com> +// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label +*.customer-oci.com +*.oci.customer-oci.com +*.ocp.customer-oci.com +*.ocs.customer-oci.com + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel <ph@datto.com> +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov <icqkill@gmail.com> +*.dapps.earth +*.bzz.dapps.earth + +// Dark, Inc. : https://darklang.com +// Submitted by Paul Biggar <ops@darklang.com> +builtwithdark.com + +// Datawire, Inc : https://www.datawire.io +// Submitted by Richard Li <secalert@datawire.io> +edgestack.me + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org> +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th> +online.th +shop.th + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang <mis@draytek.com> +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli <maxence@definima.com> +definima.net +definima.io + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge <chris@partridge.tech> +bci.dnstrace.pro + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye <sue@dynu.com> +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// En root‽ : https://en-root.org +// Submitted by Emmanuel Raviart <emmanuel@raviart.com> +en-root.fr + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier <thomas.cottier@enalean.com> +mytuleap.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by <frc1533@ecgrobotics.org> +onred.one +staging.onred.one + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta <aman@getchannels.com> +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastly-terrarium.com +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru> +fastpanel.direct +fastvps-server.com + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be> +mydobiss.com + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu <jason@owtware.com> +filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhub.com +flynnhosting.net + +// Frederik Braun https://frederik-braun.com +// Submitted by Frederik Braun <fb@frederik-braun.com> +0e.vc + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone <daniel@fooishbar.org> +freedesktop.org + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +*.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp> +gehirn.ne.jp +usercontent.jp + +// Gentlent, Inc. : https://www.gentlent.com +// Submitted by Tom Klein <tom@gentlent.com> +gentapps.com +lab.ms + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann <mads@glitch.com> +glitch.me + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko <admin@pepabo.com> +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell <tom.whitwell@digital.cabinet-office.gov.uk> +cloudapps.digital +london.cloudapps.digital + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +run.app +a.run.app +web.app +*.0emm.com +appspot.com +*.r.appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Group 53, LLC : https://www.group53.com +// Submitted by Tyler Todd <noc@nova53.net> +awsmppl.com + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov <security@hakaran.cz> +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm <md@md.vc> +hs.zone +hs.run + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura.app +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Hibernating Rhinos +// Submitted by Oren Eini <oren@ravendb.net> +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com> +bpl.biz +orx.biz +ng.city +biz.gl +ng.ink +col.ng +firm.ng +gen.ng +ltd.ng +ngo.ng +ng.school +sch.so + +// Häkkinen.fi +// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi> +häkkinen.fi + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +*.moonscale.io +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz <chris@in-berlin.de> +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater <whois@igloo.to> +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz <admin@intermetrics.de> +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu> +mein-iserv.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa <domains-admin@iodata.jp> +iobb.net + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin <ulyashin@jino.ru> +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker <hostmaster@kaashosting.nl> +kaas.gg +khplay.nl + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KingHost : https://king.host +// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br> +kinghost.net +uni5.net + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// KUROKU LTD : https://kuroku.ltd/ +// Submitted by DisposaBoy <security@oya.to> +oya.to + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn <info@lcube.de> +git-repos.de +lcube-server.de +svn-repos.de + +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle <domains@leadpages.net> +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin <publisuffix@lelux.site> +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator <support@lifetime.hosting> +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland <greg.holland@lmpm.com> +app.lmpm.com + +// Linki Tools UG : https://linki.tools +// Submitted by Paulo Matos <pmatos@linki.tools> +linkitools.space + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch> +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by <security@linode.com> +members.linode.com +nodebalancer.linode.com + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev <admin@liquidnetlimited.com> +we.bs + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach <remi.mach@loginline.com> +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl> +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs <admin@lug.org.uk> +uklugs.org +glug.org.uk +lug.org.uk +lugs.org.uk + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov <register@lukanet.com> +barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com +barsyonline.com +barsy.club +barsy.de +barsy.eu +barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi +barsy.net +barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.shop +barsy.site +barsy.support +barsy.uk + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland <info@mayfirst.org> +mayfirst.info +mayfirst.org + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell <domains@memset.com> +miniserver.com +memset.net + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz> +cloud.metacentrum.cz +custom.metacentrum.cz + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča <janca@cesnet.cz> +flt.cloud.muni.cz +usr.cloud.muni.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft Corporation : http://microsoft.com +// Submitted by Justin Luk <juluk@microsoft.com> +azurecontainer.io +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis <bfrancis@mozilla.com> +mozilla-iot.org + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru> +net.ru +org.ru +pp.ru + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen <infra@nabucasa.com> +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens <registry@names.of.london> or <james@jrcs.net> +pony.club +of.fashion +on.fashion +of.football +in.london +of.london +for.men +and.mom +for.mom +for.one +for.sale +of.work +to.work + +// NCTU.ME : https://nctu.me/ +// Submitted by Tocknicsu <admin@nctu.me> +nctu.me + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons <jessica@netlify.com> +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford <nick@nimbushosting.co.uk> +nh-serv.co.uk + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell <steve@now-dns.com> +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov <Nosov@nodeart.io> +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind <hello+publicsuffixlist@nodum.io> +nodum.co +nodum.io + +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak <piotr@nucleos.com> +pcloud.host + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack <dave.mccormack@nymnom.com> +nom.ae +nom.af +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nym.ec +nom.gd +nom.ge +nom.gl +nym.gr +nom.gt +nym.gy +nym.hk +nom.hn +nym.ie +nom.im +nom.ke +nym.kz +nym.la +nym.lc +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mn +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nym.ro +nom.rs +nom.si +nym.sk +nom.st +nym.su +nym.sx +nom.tj +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Observable, Inc. : https://observablehq.com +// Submitted by Mike Bostock <dns@observablehq.com> +static.observableusercontent.com + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep <cole@omnibond.com> +cloudycluster.net + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// Oursky Limited : https://skygear.io/ +// Submited by Skygear Developer <hello@skygear.io> +skygearapp.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider GmbH: http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com +own.pm + +// OX : http://www.ox.rs +// Submitted by Adam Grand <webmaster@mail.ox.rs> +ox.rs + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Perspecta : https://perspecta.com/ +// Submitted by Kenneth Van Alstyne <kvanalstyne@perspecta.com> +perspecta.cloud + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +*.platform.sh +*.platformsh.site + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder <maxi@zeug.co> +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais <pc@co.bn> +co.bn + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon <jonah@privacytools.io> +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns <noc@protocol.ai> +*.dweb.link + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr +byen.site + +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen <kor@pubtls.org> +pubtls.org + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock <xdecock@gmail.com> +qualifioapp.com + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer <jons@redstarconsultants.com> +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support <support@rasnet.ru> +ras.ru + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QCX +// Submitted by Cassandra Beelen <cassandra@beelen.one> +qcx.io +*.sys.qcx.io + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia <domains@rancher.com> +*.on-k3s.io +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer <team@readthedocs.org> +readthedocs.io + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// Render : https://render.com +// Submitted by Anurag Goel <dev@render.com> +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton <mason@repl.it> +repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry <tim@resin.io> +resindevice.io +devices.resinstaging.io + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting <jchits@rit.edu> +git-pages.rit.edu + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck <hanno@schokokeks.org> +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis <martin.ellis@gov.scot> +gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam <shante@skyhat.io> +scrysec.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon <craig@shopitcommerce.com> +shopitsite.com + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner <security@mo-siemens.io> +mo-siemens.io + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand <support@siteleaf.com> +siteleaf.net + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io> +stackhero-network.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind <info@speedpartner.de> +customer.speedpartner.de + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee <jacob@stdlib.com> +api.stdlib.com + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra <syscom@snt.utwente.nl> +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani <sysadmins@srcf.net> +soc.srcf.net +user.srcf.net + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller <dm@sub6.com> +temp-dns.com + +// Swisscom Application Cloud: https://developer.swisscom.com +// Submitted by Matthias.Winzeler <matthias.winzeler@swisscom.com> +applicationcloud.io +scapp.io + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier <fabien@symfony.com> +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin <syncloud@syncloud.it> +syncloud.it + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to +direct.quickconnect.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George <dominik.george@teckids.org> +edugit.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal <aj@telebit.cloud> +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield <joshua.bayfield@gwiddlefoundation.org.uk> +gwiddle.co.uk + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden <adi@thingdust.com> +thingdustdata.com +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink <mark@tlon.io> +arvo.network +azimuth.network + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de> +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : https://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space +*.uberspace.de + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz <sysadm@united-gameserver.de> +virtualuser.de +virtual-user.de + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs <danko@very.lv> +2038.io + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN <hostmaster@v-info.info> +v-info.info + +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel <info@voorloper.com> +voorloper.cloud + +// V.UA Domain Administrator : https://domain.v.ua/ +// Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua> +v.ua + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note <masa@blade.wafflecell.com> +wafflecell.com + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks <info@webhare.com> +*.webhare.dev + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente <security@wedeploy.com> +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda <yuvipanda@wikimedia.org> +wmflabs.org + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net> +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer <developer.xncloud@gmail.com> +xnbay.com +u2.xnbay.com +u2-local.xnbay.com + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +cistron.nl +demon.nl +xs4all.space + +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin <security+psl@yandex-team.ru> +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar <atul@yescourse.com> +official.academy + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud <security@yunohost.org> +nohost.me +noho.st + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja <olli@zeit.co> +now.sh + +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov <martin@zine.bg> +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl <esp@zitcom.dk> +basicserver.io +virtualserver.io +site.builder.nu +enterprisecloud.nu + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt new file mode 100644 index 000000000..ad507ba29 --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-07-19.dat.txt @@ -0,0 +1,10641 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : http://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : http://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : http://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see http://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +marketplace.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +taxi.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : http://en.wikipedia.org/wiki/.am +am + +// an : http://www.una.an/an_domreg/default.asp +an +com.an +net.an +org.an +edu.an + +// ao : http://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : http://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/normativa-vigente.xhtml +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +net.ar +org.ar +tur.ar + +// arpa : http://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : http://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : http://en.wikipedia.org/wiki/.asia +asia + +// at : http://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : http://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : http://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : http://en.wikipedia.org/wiki/.ax +ax + +// az : http://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://en.wikipedia.org/wiki/.ba +ba +org.ba +net.ba +edu.ba +gov.ba +mil.ba +unsa.ba +unbi.ba +co.ba +com.ba +rs.ba + +// bb : http://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : http://en.wikipedia.org/wiki/.bd +*.bd + +// be : http://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : http://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : http://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : http://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : http://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : http://en.wikipedia.org/wiki/.biz +biz + +// bj : http://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> 2014-08-11 +br +adm.br +adv.br +agr.br +am.br +arq.br +art.br +ato.br +b.br +bio.br +blog.br +bmd.br +cim.br +cng.br +cnt.br +com.br +coop.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +imb.br +ind.br +inf.br +jor.br +jus.br +leg.br +lel.br +mat.br +med.br +mil.br +mp.br +mus.br +net.br +*.nom.br +not.br +ntr.br +odo.br +org.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +radio.br +rec.br +slg.br +srv.br +taxi.br +teo.br +tmp.br +trd.br +tur.br +tv.br +vet.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : http://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> 2006-06-16 +bv + +// bw : http://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : http://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : http://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : http://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: http://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : http://en.wikipedia.org/wiki/.cat +cat + +// cc : http://en.wikipedia.org/wiki/.cc +cc + +// cd : http://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : http://en.wikipedia.org/wiki/.cf +cf + +// cg : http://en.wikipedia.org/wiki/.cg +cg + +// ch : http://en.wikipedia.org/wiki/.ch +ch + +// ci : http://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : http://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : http://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : http://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11 +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : http://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> 2008-06-11 +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : http://en.wikipedia.org/wiki/.com +com + +// coop : http://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : http://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : http://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : http://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://en.wikipedia.org/wiki/.cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : http://en.wikipedia.org/wiki/.cz +cz + +// de : http://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : http://en.wikipedia.org/wiki/.dj +dj + +// dk : http://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : http://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : http://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : http://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> 2008-07-04 +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : http://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : http://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : http://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : http://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : http://en.wikipedia.org/wiki/.eu +eu + +// fi : http://en.wikipedia.org/wiki/.fi +fi +// aland.fi : http://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : http://en.wikipedia.org/wiki/.fj +*.fj + +// fk : http://en.wikipedia.org/wiki/.fk +*.fk + +// fm : http://en.wikipedia.org/wiki/.fm +fm + +// fo : http://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : http://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12 +gb + +// gd : http://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : http://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : http://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : http://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> 2008-06-17 +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : http://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : http://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> 2008-06-09 +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : http://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : http://en.wikipedia.org/wiki/.gw +gw + +// gy : http://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +net.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry <hk.tech@hkirc.hk> 2008-06-11 +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : http://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : http://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://en.wikipedia.org/wiki/.il +*.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> 2013-11-15 +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : http://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an offical eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : http://en.wikipedia.org/wiki/.info +info + +// int : http://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : http://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : http://en.wikipedia.org/wiki/.jobs +jobs + +// jp : http://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> 2014-10-30 +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +hitoyoshi.kumamoto.jp +kamiamakusa.kumamoto.jp +kashima.kumamoto.jp +kikuchi.kumamoto.jp +kosa.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +kesennuma.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : http://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// http://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : http://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : http://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : http://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : http://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : http://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> 2008-06-10 +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : http://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> 2008-06-17 +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : http://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : http://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> 2008-06-17 +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : http://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : http://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : http://en.wikipedia.org/wiki/.md +md + +// me : http://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://www.nic.mg/tarif.htm +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg + +// mh : http://en.wikipedia.org/wiki/.mh +mh + +// mil : http://en.wikipedia.org/wiki/.mil +mil + +// mk : http://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: http://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : http://en.wikipedia.org/wiki/.mm +*.mm + +// mn : http://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : http://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : http://en.wikipedia.org/wiki/.mq +mq + +// mr : http://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> 2013-11-19 +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : http://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : http://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> 2008-06-19 +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.gobin.info/domainname/mz-template.doc +*.mz +!teledata.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc + +// ne : http://en.wikipedia.org/wiki/.ne +ne + +// net : http://en.wikipedia.org/wiki/.net +net + +// nf : http://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://psg.com/dns/ng/ +ng +com.ng +edu.ng +name.ng +net.ng +org.ng +sch.ng +gov.ng +mil.ng +mobi.ng + +// ni : http://www.nic.ni/dominios.htm +*.ni + +// nl : http://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Confirmed by registry <technician@cenpac.net.nr> 2008-06-17 +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : http://en.wikipedia.org/wiki/.nu +nu + +// nz : http://en.wikipedia.org/wiki/.nz +// Confirmed by registry <jay@nzrs.net.nz> 2014-05-19 +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : http://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// org : http://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : http://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> 2008-06-13 +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// updated by .PL registry on 2015-04-28 +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : http://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://www.nic.pro/support_faq.htm +pro +aca.pro +bar.pro +cpa.pro +jur.pro +law.pro +med.pro +eng.pro + +// ps : http://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : http://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Confirmed by registry 2012-10-03 +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +com.re +asso.re +nom.re + +// ro : http://www.rotld.ro/ +ro +com.ro +org.ro +tm.ro +nt.ro +nom.ro +info.ro +rec.ro +arts.ro +firm.ro +store.ro +www.ro + +// rs : http://en.wikipedia.org/wiki/.rs +rs +co.rs +org.rs +edu.rs +ac.rs +gov.rs +in.rs + +// ru : http://www.cctld.ru/ru/docs/aktiv_8.php +// Industry domains +ru +ac.ru +com.ru +edu.ru +int.ru +net.ru +org.ru +pp.ru +// Geographical domains +adygeya.ru +altai.ru +amur.ru +arkhangelsk.ru +astrakhan.ru +bashkiria.ru +belgorod.ru +bir.ru +bryansk.ru +buryatia.ru +cbg.ru +chel.ru +chelyabinsk.ru +chita.ru +chukotka.ru +chuvashia.ru +dagestan.ru +dudinka.ru +e-burg.ru +grozny.ru +irkutsk.ru +ivanovo.ru +izhevsk.ru +jar.ru +joshkar-ola.ru +kalmykia.ru +kaluga.ru +kamchatka.ru +karelia.ru +kazan.ru +kchr.ru +kemerovo.ru +khabarovsk.ru +khakassia.ru +khv.ru +kirov.ru +koenig.ru +komi.ru +kostroma.ru +krasnoyarsk.ru +kuban.ru +kurgan.ru +kursk.ru +lipetsk.ru +magadan.ru +mari.ru +mari-el.ru +marine.ru +mordovia.ru +// mosreg.ru Bug 1090800 - removed at request of Aleksey Konstantinov <konstantinovav@mosreg.ru> +msk.ru +murmansk.ru +nalchik.ru +nnov.ru +nov.ru +novosibirsk.ru +nsk.ru +omsk.ru +orenburg.ru +oryol.ru +palana.ru +penza.ru +perm.ru +ptz.ru +rnd.ru +ryazan.ru +sakhalin.ru +samara.ru +saratov.ru +simbirsk.ru +smolensk.ru +spb.ru +stavropol.ru +stv.ru +surgut.ru +tambov.ru +tatarstan.ru +tom.ru +tomsk.ru +tsaritsyn.ru +tsk.ru +tula.ru +tuva.ru +tver.ru +tyumen.ru +udm.ru +udmurtia.ru +ulan-ude.ru +vladikavkaz.ru +vladimir.ru +vladivostok.ru +volgograd.ru +vologda.ru +voronezh.ru +vrn.ru +vyatka.ru +yakutia.ru +yamal.ru +yaroslavl.ru +yekaterinburg.ru +yuzhno-sakhalinsk.ru +// More geographical domains +amursk.ru +baikal.ru +cmw.ru +fareast.ru +jamal.ru +kms.ru +k-uralsk.ru +kustanai.ru +kuzbass.ru +magnitka.ru +mytis.ru +nakhodka.ru +nkz.ru +norilsk.ru +oskol.ru +pyatigorsk.ru +rubtsovsk.ru +snz.ru +syzran.ru +vdonsk.ru +zgrad.ru +// State domains +gov.ru +mil.ru +// Technical domains +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> 2008-06-08 +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> 2008-06-17 +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : http://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> 2014-03-18 +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : http://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> 2008-06-16 +sj + +// sk : http://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> 2008-06-12 +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : http://en.wikipedia.org/wiki/.sm +sm + +// sn : http://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : http://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : http://en.wikipedia.org/wiki/.su +su +adygeya.su +arkhangelsk.su +balashov.su +bashkiria.su +bryansk.su +dagestan.su +grozny.su +ivanovo.su +kalmykia.su +kaluga.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +lenug.su +mordovia.su +msk.su +murmansk.su +nalchik.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +togliatti.su +troitsk.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : http://en.wikipedia.org/wiki/.sx +// Confirmed by registry <jcvignes@openregistry.com> 2012-05-31 +sx +gov.sx + +// sy : http://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : http://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : http://en.wikipedia.org/wiki/.tc +tc + +// td : http://en.wikipedia.org/wiki/.td +td + +// tel: http://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : http://en.wikipedia.org/wiki/.tf +tf + +// tg : http://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : http://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> 2008-06-17 +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : http://en.wikipedia.org/wiki/.tk +tk + +// tl : http://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : http://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : http://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> 2008-06-17 +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tp : No registrations at this time. +// Submitted by Ryan Sleevi <ryan.sleevi@gmail.com> 2014-01-03 +tp + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by <mehmetgurevin@gmail.com> 2014-07-19 +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : http://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : http://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : http://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Confirmed by registry <manager@tznic.or.tz> 2013-01-22 +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> 2012-04-27 +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// Private registries in .ua +co.ua +pp.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : http://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : http://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +lib.de.us +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed indepedently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated dorectly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : http://en.wikipedia.org/wiki/.va +va + +// vc : http://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> 2008-06-13 +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Confirmed by registry 2012-10-04 +// Updated 2014-05-20 - Bug 940478 +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : http://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : http://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : http://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// http://www.rnids.rs/en/the-.срб-domain +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agrica.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : http://en.wikipedia.org/wiki/.zm +*.zm + +// zw : http://en.wikipedia.org/wiki/.zw +*.zw + + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2015-07-09T11:20:15Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd +africamagic + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blog : 2015-05-14 PRIMER NIVEL S.A. +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// chloe : 2014-10-16 Richemont DNS Inc. +chloe + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// doosan : 2014-04-03 Doosan Corporation +doosan + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dstv : 2015-03-12 MultiChoice (Proprietary) Limited +dstv + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E.I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// flsmidth : 2014-07-24 FLSmidth A/S +flsmidth + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 Foggy Beach, LLC +games + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// gotv : 2015-03-12 MultiChoice (Proprietary) Limited +gotv + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// group : 2014-08-15 Romeo Town, LLC +group + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 dotHIV gemeinnuetziger e.V. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homes : 2014-01-09 DERHomes, LLC +homes + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// htc : 2015-04-02 HTC corporation +htc + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// iinet : 2014-07-03 Connect West Pty. Ltd. +iinet + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// international : 2013-11-07 Wild Way, LLC +international + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jetzt : 2014-01-09 New TLD Company AB +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd +kyknet + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd +mnet + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// montblanc : 2014-06-23 Richemont DNS Inc. +montblanc + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Charleston Road Registry Inc. +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited +multichoice + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// mutuelle : 2015-06-18 Fédération Nationale de la Mutualité Française +mutuelle + +// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd +mzansimagic + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// naspers : 2015-02-12 Intelprop (Proprietary) Limited +naspers + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Guardian News and Media Limited +observer + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// orientexpress : 2015-02-05 Belmond Ltd. +orientexpress + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. +pamperedchef + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// payu : 2015-02-12 MIH PayU B.V. +payu + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// promo : 2014-12-18 Play.PROMO Oy +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// racing : 2014-12-04 Premier Registry Limited +racing + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// security : 2015-05-14 Symantec Corporation +security + +// seek : 2014-12-04 Seek Limited +seek + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Limited +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited +supersport + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// theguardian : 2015-04-30 Guardian News and Media Limited +theguardian + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubs : 2014-12-11 UBS AG +ubs + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// versicherung : 2014-03-20 dotversicherung-registry GmbH +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +公司 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY.HONGKONG LIMITED +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ポイント + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED +餐厅 + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +書籍 + +// xn--ses554g : 2014-01-16 +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> 2013-03-22 +cloudfront.net + +// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/ +// Submitted by Osman Surkatty <osmans@amazon.com> 2014-12-16 +ap-northeast-1.compute.amazonaws.com +ap-southeast-1.compute.amazonaws.com +ap-southeast-2.compute.amazonaws.com +cn-north-1.compute.amazonaws.cn +compute.amazonaws.cn +compute.amazonaws.com +compute-1.amazonaws.com +eu-west-1.compute.amazonaws.com +eu-central-1.compute.amazonaws.com +sa-east-1.compute.amazonaws.com +us-east-1.amazonaws.com +us-gov-west-1.compute.amazonaws.com +us-west-1.compute.amazonaws.com +us-west-2.compute.amazonaws.com +z-1.compute-1.amazonaws.com +z-2.compute-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Adam Stein <astein@amazon.com> 2013-04-02 +elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Scott Vidmar <svidmar@amazon.com> 2013-03-27 +elb.amazonaws.com + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Eric Kinolik <kilo@amazon.com> 2015-04-08 +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-external-1.amazonaws.com +s3-external-2.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.eu-central-1.amazonaws.com + +// BetaInABox +// Submitted by adrian@betainabox.com 2012-09-13 +betainabox.com + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> 2012-09-27 +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04 +co.com + +// c.la : http://www.c.la/ +c.la + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> 2013-07-23 +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// CoDNS B.V. +co.nl +co.no + +// Commerce Guys, SAS +// Submitted by Damien Tournoud <damien@commerceguys.com> 2015-01-22 +*.platform.sh + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> 2013-10-08 +cupcake.is + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> 2012-10-02 +dreamhosters.com + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> 2015-05-17 +duckdns.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> 2015-04-17 + +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Fastly Inc. http://www.fastly.com/ +// Submitted by Vladimir Vuksan <vladimir@fastly.com> 2013-05-31 +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net +a.prod.fastly.net +global.prod.fastly.net + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> 2014-01-21 +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> 2014-07-12 +flynnhub.com + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> 2014-08-28 +service.gov.uk + +// GitHub, Inc. +// Submitted by Ben Toews <btoews@github.com> 2014-02-06 +github.io +githubusercontent.com + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> 2013-07-12 +ro.com + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> 2014-12-19 +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +withgoogle.com + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> 2013-05-02 +herokuapp.com +herokussl.com + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05 +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans <bdorrans@microsoft.com> 2014-01-24 +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> 2015-04-23 +4u.com + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> 2014-02-02 +nfshost.com + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> 2013-03-11 +nyc.mn + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> 2014-06-10 +nid.io + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> 2009-11-26 +operaunite.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> 2014-03-11 +outsystemscloud.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> 2008-06-09 +priv.at + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> 2012-10-24 +rhcloud.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> 2015-02-02 +sinaapp.com +vipsinaapp.com +1kapp.com + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> 2014-11-07 +hk.com +hk.org +ltd.hk +inc.hk + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> 2014-07-09 +yolasite.com + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> 2009-10-03 +za.net +za.org + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt new file mode 100644 index 000000000..cd4d3a2cf --- /dev/null +++ b/Contents/Libraries/Shared/tld/res/old/effective_tld_names-2015-11-22.dat.txt @@ -0,0 +1,11982 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://en.wikipedia.org/wiki/.am +am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : https://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +adm.br +adv.br +agr.br +am.br +arq.br +art.br +ato.br +b.br +bio.br +blog.br +bmd.br +cim.br +cng.br +cnt.br +com.br +coop.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +imb.br +ind.br +inf.br +jor.br +jus.br +leg.br +lel.br +mat.br +med.br +mil.br +mp.br +mus.br +net.br +*.nom.br +not.br +ntr.br +odo.br +org.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +radio.br +rec.br +slg.br +srv.br +taxi.br +teo.br +tmp.br +trd.br +tur.br +tv.br +vet.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : https://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by <mehmetgurevin@gmail.com> +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : https://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 AOL Inc. +aol + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blanco : 2015-07-16 BLANCO GmbH + Co KG +blanco + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 NMS Services, Inc. +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon EU S.à r.l. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 +boston + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// box : 2015-11-12 NS1 Limited +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// chloe : 2014-10-16 Richemont DNS Inc. +chloe + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// chrysler : 2015-07-30 FCA US LLC. +chrysler + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// compare : 2015-10-08 iSelect Ltd +compare + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Brice Trail, LLC +doctor + +// dodge : 2015-07-30 FCA US LLC. +dodge + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// duns : 2015-08-06 The Dun & Bradstreet Corporation +duns + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epost : 2015-07-23 Deutsche Post AG +epost + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Partnership +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon EU S.à r.l. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 +fun + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company +goodhands + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Romeo Town, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// honeywell : 2015-07-23 Honeywell GTLD LLC +honeywell + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// hospital : 2016-10-20 Ruby Pike, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon EU S.à r.l. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// htc : 2015-04-02 HTC corporation +htc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Wild Way, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC +ladbrokes + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// mcd : 2015-07-30 McDonald’s Corporation +mcd + +// mcdonalds : 2015-07-30 McDonald’s Corporation +mcdonalds + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// monster : 2015-09-11 Monster Worldwide, Inc. +monster + +// montblanc : 2014-06-23 Richemont DNS Inc. +montblanc + +// mopar : 2015-07-30 FCA US LLC. +mopar + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// orientexpress : 2015-02-05 +orientexpress + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. +pamperedchef + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon EU S.à r.l. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Partnership +rogers + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon EU S.à r.l. +secure + +// security : 2015-05-14 +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 iSelect Ltd +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 Hughes Satellite Systems Corporation +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// srt : 2015-07-30 FCA US LLC. +srt + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Ltd +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// uconnect : 2015-07-30 FCA US LLC. +uconnect + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wow : 2015-10-08 Amazon EU S.à r.l. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ポイント + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +餐厅 + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +書籍 + +// xn--ses554g : 2014-01-16 +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +*.alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +elasticbeanstalk.cn-north-1.amazonaws.com.cn +*.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// CoDNS B.V. +co.nl +co.no + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhub.com + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// Fusion Intranet : https://www.fusion-intranet.com +// Submitted by Matthias Burtscher <matthias.burtscher@fusonic.net> +myfusion.cloud + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com +githubcloud.com +*.api.githubcloud.com +*.ext.githubcloud.com +gist.githubcloud.com +*.githubcloudusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans <bdorrans@microsoft.com> +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +*.platform.sh +*.platformsh.site + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// SensioLabs, SAS : https://sensiolabs.com/ +// Submitted by Fabien Potencier <fabien.potencier@sensiolabs.com> +*.sensiosite.cloud + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He <info@stackspace.io> +stackspace.space + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TransIP : htts://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda <yuvipanda@wikimedia.org> +wmflabs.org + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +xs4all.space + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja <olli@zeit.co> +now.sh + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/result.py b/Contents/Libraries/Shared/tld/result.py new file mode 100644 index 000000000..ead92a246 --- /dev/null +++ b/Contents/Libraries/Shared/tld/result.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from typing import Dict +try: + from urllib.parse import SplitResult +except ImportError: + from six.moves.urllib_parse import SplitResult +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'Result',) + + +class Result(object): + u'Container.' + __slots__ = (u'subdomain', u'domain', u'tld', u'__fld', u'parsed_url') + + def __init__(self, tld, domain, subdomain, parsed_url): + self.tld = tld + self.domain = (domain if (domain != u'') else tld) + self.subdomain = subdomain + self.parsed_url = parsed_url + if domain: + self.__fld = u''.join( + [u'{}'.format(self.domain), u'.', u'{}'.format(self.tld)]) + else: + self.__fld = self.tld + + @property + def extension(self): + u'Alias of ``tld``.\n\n :return str:\n ' + return self.tld + suffix = extension + + @property + def fld(self): + u'First level domain.\n\n :return:\n :rtype: str\n ' + return self.__fld + + def __str__(self): + return self.tld + __repr__ = __str__ + + @property + def __dict__(self): + u'Mimic __dict__ functionality.\n\n :return:\n :rtype: dict\n ' + return { + u'tld': self.tld, + u'domain': self.domain, + u'subdomain': self.subdomain, + u'fld': self.fld, + u'parsed_url': self.parsed_url, + } diff --git a/Contents/Libraries/Shared/tld/tests/__init__.py b/Contents/Libraries/Shared/tld/tests/__init__.py new file mode 100644 index 000000000..9da93dcb3 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/__init__.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +import unittest +from .test_core import * +from .test_commands import * +if (__name__ == u'__main__'): + unittest.main() diff --git a/Contents/Libraries/Shared/tld/tests/base.py b/Contents/Libraries/Shared/tld/tests/base.py new file mode 100644 index 000000000..3029ada93 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/base.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from backports.functools_lru_cache import lru_cache +import logging +import socket +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'internet_available_only', u'log_info') +LOG_INFO = True +LOGGER = logging.getLogger(__name__) + + +def log_info(func): + u'Log some useful info.' + if (not LOG_INFO): + return func + + def inner(self, *args, **kwargs): + u'Inner.' + result = func(*([self] + list(args)), **kwargs) + LOGGER.debug(u'\n\n%s', func.__name__) + LOGGER.debug(u'============================') + if func.__doc__: + LOGGER.debug(u'""" %s """', func.__doc__.strip()) + LOGGER.debug(u'----------------------------') + if (result is not None): + LOGGER.debug(result) + LOGGER.debug(u'\n++++++++++++++++++++++++++++') + return result + return inner + + +@lru_cache(maxsize=32) +def is_internet_available(host='8.8.8.8', port=53, timeout=3): + u'Check if internet is available.\n\n Host: 8.8.8.8 (google-public-dns-a.google.com)\n OpenPort: 53/tcp\n Service: domain (DNS/TCP)\n ' + try: + socket.setdefaulttimeout(timeout) + socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port)) + return True + except socket.error as ex: + print(ex) + return False + + +def internet_available_only(func): + + def inner(self, *args, **kwargs): + u'Inner.' + if (not is_internet_available()): + LOGGER.debug(u'\n\n%s', func.__name__) + LOGGER.debug(u'============================') + if func.__doc__: + LOGGER.debug(u'""" %s """', func.__doc__.strip()) + LOGGER.debug(u'----------------------------') + LOGGER.debug(u'Skipping because no Internet connection available.') + LOGGER.debug(u'\n++++++++++++++++++++++++++++') + return None + result = func(*([self] + list(args)), **kwargs) + return result + return inner diff --git a/Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt b/Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt new file mode 100644 index 000000000..b3b05190c --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/res/effective_tld_names_custom.dat.txt @@ -0,0 +1,12993 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// This one actually does not exist, added for testing purposes +foreverchild + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://www.amnic.net/policy/en/Policy_EN.pdf +am +co.am +com.am +commune.am +net.am +org.am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +catholic.edu.au +eq.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +// 4LDs +education.tas.edu.au +schools.nsw.edu.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn + +// bo : https://nic.bo/delegacion2015.php#h-1.10 +bo +com.bo +edu.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bhz.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +cri.br +cuiaba.br +curitiba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +tc.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html +aeroport.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://pandi.id/en/domain/registration-requirements/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-süd-tirol.it +trentino-sudtirol.it +trentino-südtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentino.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosüd-tirol.it +trentinosudtirol.it +trentinosüdtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it +valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano-altoadige.it +bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesena-forlì.it +cesenaforli.it +cesenaforlì.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlì-cesena.it +forlicesena.it +forlìcesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +südtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://www.nic.kw/policies/ +// Confirmed by registry <nic.tech@citra.gov.kw> +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://www.nic.ls/ +// Confirmed by registry <lsadmin@nic.ls> +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://sonic.so/policies/ +so +com.so +edu.so +gov.so +me.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// ss : https://registry.nic.ss/ +// Submitted by registry <technical@nic.ss> +ss +biz.ss +com.ss +edu.ss +gov.ss +net.ss +org.ss + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +mil.tr +k12.tr +kep.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +// Used by Northern Cyprus +nc.tr +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +// https://www.hkirc.hk/content.jsp?id=30#!/34 +香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + + +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2019-11-20T17:10:44Z +// This list is auto-generated, don't edit it manually. +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Minds + Machines Group Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Binky Moon, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Binky Moon, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// actor : 2013-12-12 Dog Beach, LLC +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Binky Moon, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 Dog Beach, LLC +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 Region Grand Est +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 Oath Inc. +aol + +// apartments : 2014-12-11 Binky Moon, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 Afilias Limited +archi + +// army : 2014-03-06 Dog Beach, LLC +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Binky Moon, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 Dog Beach, LLC +attorney + +// auction : 2014-03-20 Dog Beach, LLC +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon Registry Services, Inc. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon Registry Services, Inc. +author + +// auto : 2014-11-13 Cars Registry Limited +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon Registry Services, Inc. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 XYZ.COM LLC +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 Dog Beach, LLC +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Binky Moon, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Minds + Machines Group Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias Limited +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Binky Moon, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Binky Moon, LLC +bingo + +// bio : 2014-03-06 Afilias Limited +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 Knock Knock WHOIS There, LLC +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 Bank of America Corporation +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 ShortDot SA +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon Registry Services, Inc. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 Boston TLD Management, LLC +boston + +// bot : 2014-12-18 Amazon Registry Services, Inc. +bot + +// boutique : 2013-11-14 Binky Moon, LLC +boutique + +// box : 2015-11-12 .BOX INC. +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 Dotbroker Registry Limited +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Minds + Machines Group Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Binky Moon, LLC +builders + +// business : 2013-11-07 Binky Moon, LLC +business + +// buy : 2014-12-18 Amazon Registry Services, Inc. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Binky Moon, LLC +cab + +// cafe : 2015-02-11 Binky Moon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon Registry Services, Inc. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Binky Moon, LLC +camera + +// camp : 2013-11-07 Binky Moon, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Binky Moon, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 Cars Registry Limited +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Binky Moon, LLC +cards + +// care : 2014-03-06 Binky Moon, LLC +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Binky Moon, LLC +careers + +// cars : 2014-11-13 Cars Registry Limited +cars + +// casa : 2013-11-21 Minds + Machines Group Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Binky Moon, LLC +cash + +// casino : 2014-12-18 Binky Moon, LLC +casino + +// catering : 2013-12-05 Binky Moon, LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Binky Moon, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 DotCFD Registry Limited +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association +chase + +// chat : 2014-12-04 Binky Moon, LLC +chat + +// cheap : 2013-11-14 Binky Moon, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Binky Moon, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon Registry Services, Inc. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Binky Moon, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Binky Moon, LLC +claims + +// cleaning : 2013-12-05 Binky Moon, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Binky Moon, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Binky Moon, LLC +clothing + +// cloud : 2015-04-16 Aruba PEC S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Binky Moon, LLC +coach + +// codes : 2013-10-31 Binky Moon, LLC +codes + +// coffee : 2013-10-17 Binky Moon, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 dotKoeln GmbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Binky Moon, LLC +community + +// company : 2013-11-07 Binky Moon, LLC +company + +// compare : 2015-10-08 Registry Services, LLC +compare + +// computer : 2013-10-24 Binky Moon, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Binky Moon, LLC +condos + +// construction : 2013-09-16 Binky Moon, LLC +construction + +// consulting : 2013-12-05 Dog Beach, LLC +consulting + +// contact : 2015-01-08 Dog Beach, LLC +contact + +// contractors : 2013-09-10 Binky Moon, LLC +contractors + +// cooking : 2013-11-21 Minds + Machines Group Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Binky Moon, LLC +cool + +// corsica : 2014-09-25 Collectivité de Corse +corsica + +// country : 2013-12-19 DotCountry LLC +country + +// coupon : 2015-02-26 Amazon Registry Services, Inc. +coupon + +// coupons : 2015-03-26 Binky Moon, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC +credit + +// creditcard : 2014-03-20 Binky Moon, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Binky Moon, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 Dog Beach, LLC +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Binky Moon, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Minds + Machines Group Limited +dds + +// deal : 2015-06-25 Amazon Registry Services, Inc. +deal + +// dealer : 2014-12-22 Intercap Registry Inc. +dealer + +// deals : 2014-05-22 Binky Moon, LLC +deals + +// degree : 2014-03-06 Dog Beach, LLC +degree + +// delivery : 2014-09-11 Binky Moon, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 Dog Beach, LLC +democrat + +// dental : 2014-03-20 Binky Moon, LLC +dental + +// dentist : 2014-03-20 Dog Beach, LLC +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 Binky Moon, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Binky Moon, LLC +digital + +// direct : 2014-04-10 Binky Moon, LLC +direct + +// directory : 2013-09-20 Binky Moon, LLC +directory + +// discount : 2014-03-06 Binky Moon, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Binky Moon, LLC +doctor + +// dog : 2014-12-04 Binky Moon, LLC +dog + +// domains : 2013-10-17 Binky Moon, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 DISH Technologies L.L.C. +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Binky Moon, LLC +education + +// email : 2013-10-31 Binky Moon, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Moon, LLC +energy + +// engineer : 2014-03-06 Dog Beach, LLC +engineer + +// engineering : 2014-03-06 Binky Moon, LLC +engineering + +// enterprises : 2013-09-20 Binky Moon, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Binky Moon, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Binky Moon, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Binky Moon, LLC +events + +// exchange : 2014-03-06 Binky Moon, LLC +exchange + +// expert : 2013-11-21 Binky Moon, LLC +expert + +// exposed : 2013-12-05 Binky Moon, LLC +exposed + +// express : 2015-02-11 Binky Moon, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Binky Moon, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 Dog Beach, LLC +family + +// fan : 2014-03-06 Dog Beach, LLC +fan + +// fans : 2014-11-07 ZDNS International Limited +fans + +// farm : 2013-11-07 Binky Moon, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Minds + Machines Group Limited +fashion + +// fast : 2014-12-18 Amazon Registry Services, Inc. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Canada Inc. +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Binky Moon, LLC +finance + +// financial : 2014-03-06 Binky Moon, LLC +financial + +// fire : 2015-06-25 Amazon Registry Services, Inc. +fire + +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Binky Moon, LLC +fish + +// fishing : 2013-11-21 Minds + Machines Group Limited +fishing + +// fit : 2014-11-07 Minds + Machines Group Limited +fit + +// fitness : 2014-03-06 Binky Moon, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Binky Moon, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Binky Moon, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Binky Moon, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 Dotforex Registry Limited +forex + +// forsale : 2014-05-22 Dog Beach, LLC +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 Binky Moon, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon Registry Services, Inc. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 DotSpace Inc. +fun + +// fund : 2014-03-20 Binky Moon, LLC +fund + +// furniture : 2014-03-20 Binky Moon, LLC +furniture + +// futbol : 2013-09-20 Dog Beach, LLC +futbol + +// fyi : 2015-04-02 Binky Moon, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Binky Moon, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 Dog Beach, LLC +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Minds + Machines Group Limited +garden + +// gay : 2019-05-23 Top Level Design, LLC +gay + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL NV +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 DotGift, LLC +gift + +// gifts : 2014-07-03 Binky Moon, LLC +gifts + +// gives : 2014-03-06 Dog Beach, LLC +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Binky Moon, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot Global Domain Registry Limited +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Binky Moon, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 Binky Moon, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Binky Moon, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon Registry Services, Inc. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Binky Moon, LLC +graphics + +// gratis : 2014-03-20 Binky Moon, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Binky Moon, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Binky Moon, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Binky Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Binky Moon, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 Dog Beach, LLC +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Binky Moon, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 Uniregistry, Corp. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Binky Moon, LLC +hockey + +// holdings : 2013-08-27 Binky Moon, LLC +holdings + +// holiday : 2013-11-07 Binky Moon, LLC +holiday + +// homedepot : 2015-04-02 Home Depot Product Authority, LLC +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Minds + Machines Group Limited +horse + +// hospital : 2016-10-20 Binky Moon, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon Registry Services, Inc. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Binky Moon, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 ShortDot SA +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon Registry Services, Inc. +imdb + +// immo : 2014-07-10 Binky Moon, LLC +immo + +// immobilien : 2013-11-07 Dog Beach, LLC +immobilien + +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Binky Moon, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Binky Moon, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Binky Moon, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Binky Moon, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Binky Moon, LLC +irish + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 Binky Moon, LLC +jetzt + +// jewelry : 2015-03-05 Binky Moon, LLC +jewelry + +// jio : 2015-04-02 Reliance Industries Limited +jio + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon Registry Services, Inc. +jot + +// joy : 2014-12-18 Amazon Registry Services, Inc. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 Dog Beach, LLC +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon Registry Services, Inc. +kindle + +// kitchen : 2013-09-20 Binky Moon, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 dotKoeln GmbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Binky Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 LW TLD Limited +law + +// lawyer : 2014-03-20 Dog Beach, LLC +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Binky Moon, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Binky Moon, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Binky Moon, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 Binky Moon, LLC +lighting + +// like : 2014-12-18 Amazon Registry Services, Inc. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Binky Moon, LLC +limited + +// limo : 2013-10-17 Binky Moon, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 Dog Beach, LLC +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 Dot Registry LLC +llp + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 Binky Moon, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Binky Moon, LLC +ltd + +// ltda : 2014-04-17 InterNetX, Corp +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Minds + Machines Group Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Binky Moon, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 Binky Moon, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 Dog Beach, LLC +market + +// marketing : 2013-11-07 Binky Moon, LLC +marketing + +// markets : 2014-12-11 Dotmarkets Registry Limited +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Binky Moon, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Binky Moon, LLC +media + +// meet : 2014-01-16 Charleston Road Registry Inc. +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Dot Menu Registry, LLC +menu + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Minds + Machines Group Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// moda : 2013-11-07 Dog Beach, LLC +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon Registry Services, Inc. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Binky Moon, LLC +money + +// monster : 2015-09-11 XYZ.COM LLC +monster + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 Dog Beach, LLC +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Motorola Trademark Holdings, LLC +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 Binky Moon, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 Nadex Domains, Inc. +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 Dog Beach, LLC +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Binky Moon, LLC +network + +// neustar : 2013-12-05 Registry Services, LLC +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 Dog Beach, LLC +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 Dog Beach, LLC +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon Registry Services, Inc. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Top Level Spectrum, Inc. +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BRregistry, Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Osaka Registry Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 MédiaBC +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Binky Moon, LLC +partners + +// parts : 2013-12-05 Binky Moon, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon Registry Services, Inc. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias Limited +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Binky Moon, LLC +photography + +// photos : 2013-10-17 Binky Moon, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Binky Moon, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon Registry Services, Inc. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Binky Moon, LLC +pizza + +// place : 2014-04-24 Binky Moon, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Binky Moon, LLC +plumbing + +// plus : 2015-02-05 Binky Moon, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon Registry Services, Inc. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Binky Moon, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 Afilias Limited +promo + +// properties : 2013-12-05 Binky Moon, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 XYZ.COM LLC +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 Dog Beach, LLC +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 XYZ.COM LLC +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon Registry Services, Inc. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Binky Moon, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 Dog Beach, LLC +rehab + +// reise : 2014-03-13 Binky Moon, LLC +reise + +// reisen : 2014-03-06 Binky Moon, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 ZDNS International Limited +ren + +// rent : 2014-12-04 XYZ.COM LLC +rent + +// rentals : 2013-12-05 Binky Moon, LLC +rentals + +// repair : 2013-11-07 Binky Moon, LLC +repair + +// report : 2013-12-05 Binky Moon, LLC +report + +// republican : 2014-03-20 Dog Beach, LLC +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Binky Moon, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 Dog Beach, LLC +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 Dog Beach, LLC +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 Dog Beach, LLC +rocks + +// rodeo : 2013-12-19 Minds + Machines Group Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Canada Inc. +rogers + +// room : 2014-12-18 Amazon Registry Services, Inc. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Binky Moon, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BRregistry, Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon Registry Services, Inc. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 Dog Beach, LLC +sale + +// salon : 2014-12-11 Binky Moon, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sarl : 2014-07-03 Binky Moon, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon Registry Services, Inc. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Binky Moon, LLC +school + +// schule : 2014-03-06 Binky Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon Registry Services, Inc. +secure + +// security : 2015-05-14 XYZ.COM LLC +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 Registry Services, LLC +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Binky Moon, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Moon, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 Binky Moon, LLC +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Binky Moon, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon Registry Services, Inc. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Binky Moon, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 Afilias Limited +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky International AG +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 DISH Technologies L.L.C. +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon Registry Services, Inc. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Binky Moon, LLC +soccer + +// social : 2013-11-07 Dog Beach, LLC +social + +// softbank : 2015-07-02 SoftBank Group Corp. +softbank + +// software : 2014-03-20 Dog Beach, LLC +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Binky Moon, LLC +solar + +// solutions : 2013-11-07 Binky Moon, LLC +solutions + +// song : 2015-02-26 Amazon Registry Services, Inc. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 DotSpace Inc. +space + +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport + +// spot : 2015-02-26 Amazon Registry Services, Inc. +spot + +// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited +spreadbetting + +// srl : 2015-05-07 InterNetX, Corp +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 XYZ.COM LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 Dog Beach, LLC +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Ltd. +sucks + +// supplies : 2013-12-19 Binky Moon, LLC +supplies + +// supply : 2013-12-19 Binky Moon, LLC +supply + +// support : 2013-10-24 Binky Moon, LLC +support + +// surf : 2014-01-09 Minds + Machines Group Limited +surf + +// surgery : 2014-03-20 Binky Moon, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Binky Moon, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon Registry Services, Inc. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Binky Moon, LLC +tax + +// taxi : 2015-03-19 Binky Moon, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Binky Moon, LLC +team + +// tech : 2015-01-30 Personals TLD Inc. +tech + +// technology : 2013-09-13 Binky Moon, LLC +technology + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Binky Moon, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Home Depot Product Authority, LLC +thd + +// theater : 2015-03-19 Binky Moon, LLC +theater + +// theatre : 2015-05-07 XYZ.COM LLC +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Binky Moon, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Binky Moon, LLC +tips + +// tires : 2014-11-07 Binky Moon, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Binky Moon, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Binky Moon, LLC +tools + +// top : 2014-03-20 .TOP Registry +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Binky Moon, LLC +tours + +// town : 2014-03-06 Binky Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Binky Moon, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 Dottrading Registry Limited +trading + +// training : 2013-11-07 Binky Moon, LLC +training + +// travel : Dog Beach, LLC +travel + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 NCC Group Inc. +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon Registry Services, Inc. +tunes + +// tushu : 2014-12-18 Amazon Registry Services, Inc. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Binky Moon, LLC +university + +// uno : 2013-09-11 DotSite Inc. +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Binky Moon, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Moon, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 tldbox GmbH +versicherung + +// vet : 2014-03-06 Dog Beach, LLC +vet + +// viajes : 2013-10-17 Binky Moon, LLC +viajes + +// video : 2014-10-16 Dog Beach, LLC +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 Binky Moon, LLC +villas + +// vin : 2015-06-18 Binky Moon, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Binky Moon, LLC +vision + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Minds + Machines Group Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Binky Moon, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Wang Limited +wang + +// wanggou : 2014-12-18 Amazon Registry Services, Inc. +wanggou + +// watch : 2013-11-14 Binky Moon, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 International Business Machines Corporation +weather + +// weatherchannel : 2015-03-12 International Business Machines Corporation +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Minds + Machines Group Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 Binky Moon, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Minds + Machines Group Limited +work + +// works : 2013-11-14 Binky Moon, LLC +works + +// world : 2014-06-12 Binky Moon, LLC +world + +// wow : 2015-10-08 Amazon Registry Services, Inc. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Binky Moon, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +商标 + +// xn--czrs0t : 2013-12-19 Binky Moon, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +ポイント + +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Binky Moon, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +餐厅 + +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--otu796d : 2017-08-06 Internet DotTrademark Organisation Limited +招聘 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +書籍 + +// xn--ses554g : 2014-01-16 KNET Co., Ltd. +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Binky Moon, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Binky Moon, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Minds + Machines Group Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon Registry Services, Inc. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon Registry Services, Inc. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon Registry Services, Inc. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zone : 2013-11-14 Binky Moon, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// This one actually does not exist, added for testing purposes +delusionalinsanity.am + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov <avramov@alboto.ca> +barsy.ca + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas <tech_staff@altervista.it> +altervista.org + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team <security@apigee.com> +apigee.io + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI <mail@aseinet.com> +user.aseinet.ne.jp +gv.vc +d.gv.vc + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz <olivier.benz@b-data.ch> +b-data.io + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// Balena : https://www.balena.io +// Submitted by Petros Angelatos <petrosagg@balena.io> +balena-devices.com + +// Banzai Cloud +// Submitted by Gabor Kozma <info@banzaicloud.com> +app.banzaicloud.io + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder <paul.crowder@blackbaud.com> +blackbaudcdn.net + +// Boomla : https://boomla.com +// Submitted by Tibor Halter <thalter@boomla.com> +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk> +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// Carrd : https://carrd.co +// Submitted by AJ <aj@carrd.co> +carrd.co +crd.co +uwu.ai + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar <rishabh.nambiar@discourse.org> +discourse.group + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam <noc@clever-cloud.com> +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti <colin@clerk.dev> +*.lcl.dev +*.stg.dev + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me +cloud66.ws +cloud66.zone + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek <noc@cloudaccess.net> +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Philip Langdale <security@cloudera.com> +cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Jake Riesterer <publicsuffixlist@cloudflare.com> +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen <patrick@clovyr.io> +wnext.app + +// co.ca : http://registry.co.ca/ +co.ca + +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis <govert@co-co.nl> +*.otap.co + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// Cloudeity Inc : https://cloudeity.com +// Submitted by Stefan Dimitrov <contact@cloudeity.com> +cloudeity.net + +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding <angelo@lahacker.net> +cnpy.gdn + +// CoDNS B.V. +co.nl +co.no + +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com> +webhosting.be +hosting-cluster.nl + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel <ph@datto.com> +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov <icqkill@gmail.com> +*.dapps.earth +*.bzz.dapps.earth + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org> +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th> +online.th +shop.th + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang <mis@draytek.com> +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli <maxence@definima.com> +definima.net +definima.io + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge <chris@partridge.tech> +bci.dnstrace.pro + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye <sue@dynu.com> +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier <thomas.cottier@enalean.com> +mytuleap.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by <frc1533@ecgrobotics.org> +onred.one +staging.onred.one + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta <aman@getchannels.com> +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastly-terrarium.com +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru> +fastpanel.direct +fastvps-server.com + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be> +mydobiss.com + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu <jason@owtware.com> +filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhub.com +flynnhosting.net + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone <daniel@fooishbar.org> +freedesktop.org + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +*.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp> +gehirn.ne.jp +usercontent.jp + +// Gentlent, Limited : https://www.gentlent.com +// Submitted by Tom Klein <tklein@gentlent.com> +lab.ms + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann <mads@glitch.com> +glitch.me + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko <admin@pepabo.com> +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell <tom.whitwell@digital.cabinet-office.gov.uk> +cloudapps.digital +london.cloudapps.digital + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +run.app +a.run.app +web.app +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov <security@hakaran.cz> +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm <md@md.vc> +hs.zone +hs.run + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura.app +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Hibernating Rhinos +// Submitted by Oren Eini <oren@ravendb.net> +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com> +bpl.biz +orx.biz +ng.city +biz.gl +ng.ink +col.ng +firm.ng +gen.ng +ltd.ng +ng.school +sch.so + +// Häkkinen.fi +// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi> +häkkinen.fi + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +*.moonscale.io +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz <chris@in-berlin.de> +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater <whois@igloo.to> +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz <admin@intermetrics.de> +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu> +mein-iserv.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa <domains-admin@iodata.jp> +iobb.net + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin <ulyashin@jino.ru> +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker <hostmaster@kaashosting.nl> +kaas.gg +khplay.nl + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KingHost : https://king.host +// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br> +kinghost.net +uni5.net + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn <info@lcube.de> +git-repos.de +lcube-server.de +svn-repos.de + +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle <domains@leadpages.net> +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin <publisuffix@lelux.site> +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator <support@lifetime.hosting> +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland <greg.holland@lmpm.com> +app.lmpm.com + +// Linki Tools UG : https://linki.tools +// Submitted by Paulo Matos <pmatos@linki.tools> +linkitools.space + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch> +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by <security@linode.com> +members.linode.com +nodebalancer.linode.com + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev <admin@liquidnetlimited.com> +we.bs + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach <remi.mach@loginline.com> +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl> +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs <admin@lug.org.uk> +uklugs.org +glug.org.uk +lug.org.uk +lugs.org.uk + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov <register@lukanet.com> +barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com +barsyonline.com +barsy.club +barsy.de +barsy.eu +barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi +barsy.net +barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.shop +barsy.site +barsy.support +barsy.uk + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland <info@mayfirst.org> +mayfirst.info +mayfirst.org + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell <domains@memset.com> +miniserver.com +memset.net + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz> +cloud.metacentrum.cz +custom.metacentrum.cz + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča <janca@cesnet.cz> +flt.cloud.muni.cz +usr.cloud.muni.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft Corporation : http://microsoft.com +// Submitted by Justin Luk <juluk@microsoft.com> +azurecontainer.io +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis <bfrancis@mozilla.com> +mozilla-iot.org + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru> +net.ru +org.ru +pp.ru + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen <infra@nabucasa.com> +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens <registry@names.of.london> or <james@jrcs.net> +pony.club +of.fashion +on.fashion +of.football +in.london +of.london +for.men +and.mom +for.mom +for.one +for.sale +of.work +to.work + +// NCTU.ME : https://nctu.me/ +// Submitted by Tocknicsu <admin@nctu.me> +nctu.me + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons <jessica@netlify.com> +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford <nick@nimbushosting.co.uk> +nh-serv.co.uk + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell <steve@now-dns.com> +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov <Nosov@nodeart.io> +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind <hello+publicsuffixlist@nodum.io> +nodum.co +nodum.io + +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak <piotr@nucleos.com> +pcloud.host + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack <dave.mccormack@nymnom.com> +nom.ae +nom.af +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nym.ec +nom.gd +nom.ge +nom.gl +nym.gr +nom.gt +nym.gy +nym.hk +nom.hn +nym.ie +nom.im +nom.ke +nym.kz +nym.la +nym.lc +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mn +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nym.ro +nom.rs +nom.si +nym.sk +nom.st +nym.su +nym.sx +nom.tj +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep <cole@omnibond.com> +cloudycluster.net + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider GmbH: http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com +own.pm + +// OX : http://www.ox.rs +// Submitted by Adam Grand <webmaster@mail.ox.rs> +ox.rs + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +*.platform.sh +*.platformsh.site + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder <maxi@zeug.co> +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais <pc@co.bn> +co.bn + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon <jonah@privacytools.io> +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns <noc@protocol.ai> +*.dweb.link + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr +byen.site + +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen <kor@pubtls.org> +pubtls.org + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock <xdecock@gmail.com> +qualifioapp.com + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer <jons@redstarconsultants.com> +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support <support@rasnet.ru> +ras.ru + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia <domains@rancher.com> +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer <team@readthedocs.org> +readthedocs.io + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// Render : https://render.com +// Submitted by Anurag Goel <dev@render.com> +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton <mason@repl.it> +repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry <tim@resin.io> +resindevice.io +devices.resinstaging.io + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting <jchits@rit.edu> +git-pages.rit.edu + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck <hanno@schokokeks.org> +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis <martin.ellis@gov.scot> +gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam <shante@skyhat.io> +scrysec.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon <craig@shopitcommerce.com> +shopitsite.com + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner <security@mo-siemens.io> +mo-siemens.io + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand <support@siteleaf.com> +siteleaf.net + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io> +stackhero-network.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind <info@speedpartner.de> +customer.speedpartner.de + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee <jacob@stdlib.com> +api.stdlib.com + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra <syscom@snt.utwente.nl> +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani <sysadmins@srcf.net> +soc.srcf.net +user.srcf.net + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller <dm@sub6.com> +temp-dns.com + +// Swisscom Application Cloud: https://developer.swisscom.com +// Submitted by Matthias.Winzeler <matthias.winzeler@swisscom.com> +applicationcloud.io +scapp.io + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier <fabien@symfony.com> +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin <syncloud@syncloud.it> +syncloud.it + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to +direct.quickconnect.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George <dominik.george@teckids.org> +edugit.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal <aj@telebit.cloud> +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield <joshua.bayfield@gwiddlefoundation.org.uk> +gwiddle.co.uk + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden <adi@thingdust.com> +thingdustdata.com +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink <mark@tlon.io> +arvo.network +azimuth.network + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de> +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : https://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space +*.uberspace.de + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz <sysadm@united-gameserver.de> +virtualuser.de +virtual-user.de + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs <danko@very.lv> +2038.io + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN <hostmaster@v-info.info> +v-info.info + +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel <info@voorloper.com> +voorloper.cloud + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note <masa@blade.wafflecell.com> +wafflecell.com + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks <info@webhare.com> +*.webhare.dev + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente <security@wedeploy.com> +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda <yuvipanda@wikimedia.org> +wmflabs.org + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net> +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer <developer.xncloud@gmail.com> +xnbay.com +u2.xnbay.com +u2-local.xnbay.com + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +cistron.nl +demon.nl +xs4all.space + +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin <security+psl@yandex-team.ru> +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar <atul@yescourse.com> +official.academy + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud <security@yunohost.org> +nohost.me +noho.st + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja <olli@zeit.co> +now.sh + +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov <martin@zine.bg> +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl <esp@zitcom.dk> +basicserver.io +virtualserver.io +site.builder.nu +enterprisecloud.nu + +// ===END PRIVATE DOMAINS=== diff --git a/Contents/Libraries/Shared/tld/tests/test_commands.py b/Contents/Libraries/Shared/tld/tests/test_commands.py new file mode 100644 index 000000000..23394fa61 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/test_commands.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +import logging +import unittest +import subprocess +from .base import log_info, internet_available_only +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'GPL 2.0/LGPL 2.1' +__all__ = (u'TestCommands',) +LOGGER = logging.getLogger(__name__) + + +class TestCommands(unittest.TestCase): + u'Tld commands tests.' + + def setUp(self): + u'Set up.' + + @internet_available_only + @log_info + def test_1_update_tld_names_command(self): + u'Test updating the tld names (re-fetch mozilla source).' + res = subprocess.check_output([u'update-tld-names']).strip() + self.assertEqual(res, b'') + return res + + @internet_available_only + @log_info + def test_1_update_tld_names_mozilla_command(self): + u'Test updating the tld names (re-fetch mozilla source).' + res = subprocess.check_output( + [u'update-tld-names', u'mozilla']).strip() + self.assertEqual(res, b'') + return res + + +if (__name__ == u'__main__'): + unittest.main() diff --git a/Contents/Libraries/Shared/tld/tests/test_core.py b/Contents/Libraries/Shared/tld/tests/test_core.py new file mode 100644 index 000000000..b1a71e113 --- /dev/null +++ b/Contents/Libraries/Shared/tld/tests/test_core.py @@ -0,0 +1,708 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import logging +from os.path import abspath, join +import unittest +from tempfile import gettempdir +from typing import Type +try: + from urllib.parse import urlsplit +except ImportError: + from six.moves.urllib_parse import urlsplit +from faker import Faker +from .. import defaults +from ..base import BaseTLDSourceParser +from ..conf import get_setting, reset_settings, set_setting +from ..exceptions import TldBadUrl, TldDomainNotFound, TldImproperlyConfigured, TldIOError +from ..helpers import project_dir +from ..registry import Registry +from ..utils import get_fld, get_tld, get_tld_names, get_tld_names_container, is_tld, MozillaTLDSourceParser, BaseMozillaTLDSourceParser, parse_tld, reset_tld_names, update_tld_names, update_tld_names_cli +from .base import internet_available_only, log_info +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'TestCore',) +LOGGER = logging.getLogger(__name__) + + +class TestCore(unittest.TestCase): + u'Core tld functionality tests.' + + @classmethod + def setUpClass(cls): + cls.faker = Faker() + cls.temp_dir = gettempdir() + + def setUp(self): + u'Set up.' + self.good_patterns = [{ + u'url': u'http://www.google.co.uk', + u'fld': u'google.co.uk', + u'subdomain': u'www', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.v2.google.co.uk', + u'fld': u'google.co.uk', + u'subdomain': u'www.v2', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://хром.гугл.рф', + u'fld': u'гугл.рф', + u'subdomain': u'хром', + u'domain': u'гугл', + u'suffix': u'рф', + u'tld': u'рф', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.google.co.uk:8001/lorem-ipsum/', + u'fld': u'google.co.uk', + u'subdomain': u'www', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.me.cloudfront.net', + u'fld': u'me.cloudfront.net', + u'subdomain': u'www', + u'domain': u'me', + u'suffix': u'cloudfront.net', + u'tld': u'cloudfront.net', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.v2.forum.tech.google.co.uk:8001/lorem-ipsum/', + u'fld': u'google.co.uk', + u'subdomain': u'www.v2.forum.tech', + u'domain': u'google', + u'suffix': u'co.uk', + u'tld': u'co.uk', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'https://pantheon.io/', + u'fld': u'pantheon.io', + u'subdomain': u'', + u'domain': u'pantheon', + u'suffix': u'io', + u'tld': u'io', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'v2.www.google.com', + u'fld': u'google.com', + u'subdomain': u'v2.www', + u'domain': u'google', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'//v2.www.google.com', + u'fld': u'google.com', + u'subdomain': u'v2.www', + u'domain': u'google', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'http://foo@bar.com', + u'fld': u'bar.com', + u'subdomain': u'', + u'domain': u'bar', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://user:foo@bar.com', + u'fld': u'bar.com', + u'subdomain': u'', + u'domain': u'bar', + u'suffix': u'com', + u'tld': u'com', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'https://faguoren.xn--fiqs8s', + u'fld': u'faguoren.xn--fiqs8s', + u'subdomain': u'', + u'domain': u'faguoren', + u'suffix': u'xn--fiqs8s', + u'tld': u'xn--fiqs8s', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'blogs.lemonde.paris', + u'fld': u'lemonde.paris', + u'subdomain': u'blogs', + u'domain': u'lemonde', + u'suffix': u'paris', + u'tld': u'paris', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'axel.brighton.ac.uk', + u'fld': u'brighton.ac.uk', + u'subdomain': u'axel', + u'domain': u'brighton', + u'suffix': u'ac.uk', + u'tld': u'ac.uk', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'm.fr.blogspot.com.au', + u'fld': u'fr.blogspot.com.au', + u'subdomain': u'm', + u'domain': u'fr', + u'suffix': u'blogspot.com.au', + u'tld': u'blogspot.com.au', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'help.www.福岡.jp', + u'fld': u'www.福岡.jp', + u'subdomain': u'help', + u'domain': u'www', + u'suffix': u'福岡.jp', + u'tld': u'福岡.jp', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'syria.arabic.variant.سوريا', + u'fld': u'variant.سوريا', + u'subdomain': u'syria.arabic', + u'domain': u'variant', + u'suffix': u'سوريا', + u'tld': u'سوريا', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': u'http://www.help.kawasaki.jp', + u'fld': u'www.help.kawasaki.jp', + u'subdomain': u'', + u'domain': u'www', + u'suffix': u'help.kawasaki.jp', + u'tld': u'help.kawasaki.jp', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.city.kawasaki.jp', + u'fld': u'city.kawasaki.jp', + u'subdomain': u'www', + u'domain': u'city', + u'suffix': u'kawasaki.jp', + u'tld': u'kawasaki.jp', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://fedoraproject.org', + u'fld': u'fedoraproject.org', + u'subdomain': u'', + u'domain': u'fedoraproject', + u'suffix': u'org', + u'tld': u'org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.cloud.fedoraproject.org', + u'fld': u'www.cloud.fedoraproject.org', + u'subdomain': u'', + u'domain': u'www', + u'suffix': u'cloud.fedoraproject.org', + u'tld': u'cloud.fedoraproject.org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'https://www.john.app.os.fedoraproject.org', + u'fld': u'john.app.os.fedoraproject.org', + u'subdomain': u'www', + u'domain': u'john', + u'suffix': u'app.os.fedoraproject.org', + u'tld': u'app.os.fedoraproject.org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'ftp://www.xn--mxail5aa.xn--11b4c3d', + u'fld': u'xn--mxail5aa.xn--11b4c3d', + u'subdomain': u'www', + u'domain': u'xn--mxail5aa', + u'suffix': u'xn--11b4c3d', + u'tld': u'xn--11b4c3d', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://cloud.fedoraproject.org', + u'fld': u'cloud.fedoraproject.org', + u'subdomain': u'', + u'domain': u'cloud.fedoraproject.org', + u'suffix': u'cloud.fedoraproject.org', + u'tld': u'cloud.fedoraproject.org', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'github.io', + u'fld': u'github.io', + u'subdomain': u'', + u'domain': u'github.io', + u'suffix': u'github.io', + u'tld': u'github.io', + u'kwargs': { + u'fail_silently': True, + u'fix_protocol': True, + }, + }, { + u'url': urlsplit(u'http://lemonde.fr/article.html'), + u'fld': u'lemonde.fr', + u'subdomain': u'', + u'domain': u'lemonde', + u'suffix': u'fr', + u'tld': u'fr', + u'kwargs': { + u'fail_silently': True, + }, + }] + self.bad_patterns = { + u'v2.www.google.com': { + u'exception': TldBadUrl, + }, + u'/index.php?a=1&b=2': { + u'exception': TldBadUrl, + }, + u'http://www.tld.doesnotexist': { + u'exception': TldDomainNotFound, + }, + u'https://2001:0db8:0000:85a3:0000:0000:ac1f:8001': { + u'exception': TldDomainNotFound, + }, + u'http://192.169.1.1': { + u'exception': TldDomainNotFound, + }, + u'http://localhost:8080': { + u'exception': TldDomainNotFound, + }, + u'https://localhost': { + u'exception': TldDomainNotFound, + }, + u'https://localhost2': { + u'exception': TldImproperlyConfigured, + u'kwargs': { + u'search_public': False, + u'search_private': False, + }, + }, + } + self.invalid_tlds = {u'v2.www.google.com', u'tld.doesnotexist', + u'2001:0db8:0000:85a3:0000:0000:ac1f', u'192.169.1.1', 'localhost', u'google.com'} + self.tld_names_local_path_custom = project_dir( + join(u'tests', u'res', u'effective_tld_names_custom.dat.txt')) + self.good_patterns_custom_parser = [{ + u'url': u'http://www.foreverchild', + u'fld': u'www.foreverchild', + u'subdomain': u'', + u'domain': u'www', + u'suffix': u'foreverchild', + u'tld': u'foreverchild', + u'kwargs': { + u'fail_silently': True, + }, + }, { + u'url': u'http://www.v2.foreverchild', + u'fld': u'v2.foreverchild', + u'subdomain': u'www', + u'domain': u'v2', + u'suffix': u'foreverchild', + u'tld': u'foreverchild', + u'kwargs': { + u'fail_silently': True, + }, + }] + reset_settings() + + def tearDown(self): + u'Tear down.' + reset_settings() + Registry.reset() + + @property + def good_url(self): + return self.good_patterns[0][u'url'] + + @property + def bad_url(self): + return list(self.bad_patterns.keys())[0] + + def get_custom_parser_class(self, uid='custom_mozilla', source_url=None, local_path='tests/res/effective_tld_names_custom.dat.txt'): + parser_class = type('CustomMozillaTLDSourceParser', (BaseMozillaTLDSourceParser,), { + 'uid': uid, + 'source_url': source_url, + 'local_path': local_path, + }) + return parser_class + + @log_info + def test_0_tld_names_loaded(self): + u'Test if tld names are loaded.' + get_fld(u'http://www.google.co.uk') + from ..utils import tld_names + res = (len(tld_names) > 0) + self.assertTrue(res) + return res + + @internet_available_only + @log_info + def test_1_update_tld_names(self): + u'Test updating the tld names (re-fetch mozilla source).' + res = update_tld_names(fail_silently=False) + self.assertTrue(res) + return res + + @log_info + def test_2_fld_good_patterns_pass(self): + u'Test good URL patterns.' + res = [] + for data in self.good_patterns: + _res = get_fld(data[u'url'], **data[u'kwargs']) + self.assertEqual(_res, data[u'fld']) + res.append(_res) + return res + + @log_info + def test_3_fld_bad_patterns_pass(self): + u'Test bad URL patterns.' + res = [] + for (url, params) in self.bad_patterns.items(): + _res = get_fld(url, fail_silently=True) + self.assertEqual(_res, None) + res.append(_res) + return res + + @log_info + def test_4_override_settings(self): + u'Testing settings override.' + + def override_settings(): + u'Override settings.' + return get_setting(u'DEBUG') + self.assertEqual(defaults.DEBUG, override_settings()) + set_setting(u'DEBUG', True) + self.assertEqual(True, override_settings()) + return override_settings() + + @log_info + def test_5_tld_good_patterns_pass_parsed_object(self): + u'Test good URL patterns.' + res = [] + for data in self.good_patterns: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'as_object': True, + }) + _res = get_tld(data[u'url'], **kwargs) + self.assertEqual(_res.tld, data[u'tld']) + self.assertEqual(_res.subdomain, data[u'subdomain']) + self.assertEqual(_res.domain, data[u'domain']) + self.assertEqual(_res.suffix, data[u'suffix']) + self.assertEqual(_res.fld, data[u'fld']) + self.assertEqual(unicode(_res).encode(u'utf8'), + data[u'tld'].encode(u'utf8')) + self.assertEqual(_res.__dict__, { + u'tld': _res.tld, + u'domain': _res.domain, + u'subdomain': _res.subdomain, + u'fld': _res.fld, + u'parsed_url': _res.parsed_url, + }) + res.append(_res) + return res + + @log_info + def test_6_override_full_names_path(self): + default = project_dir(u'dummy.txt') + override_base = u'/tmp/test' + set_setting(u'NAMES_LOCAL_PATH_PARENT', override_base) + modified = project_dir(u'dummy.txt') + self.assertNotEqual(default, modified) + self.assertEqual(modified, abspath(u'/tmp/test/dummy.txt')) + + @log_info + def test_7_public_private(self): + res = get_fld(u'http://silly.cc.ua', + fail_silently=True, search_private=False) + self.assertEqual(res, None) + res = get_fld(u'http://silly.cc.ua', + fail_silently=True, search_private=True) + self.assertEqual(res, u'silly.cc.ua') + res = get_fld(u'mercy.compute.amazonaws.com', + fail_silently=True, search_private=False, fix_protocol=True) + self.assertEqual(res, None) + res = get_fld(u'http://whatever.com', + fail_silently=True, search_public=False) + self.assertEqual(res, None) + + @log_info + def test_8_fld_bad_patterns_exceptions(self): + u'Test exceptions.' + res = [] + for (url, params) in self.bad_patterns.items(): + kwargs = (params[u'kwargs'] if (u'kwargs' in params) else { + + }) + kwargs.update({ + u'fail_silently': False, + }) + with self.assertRaises(params[u'exception']): + _res = get_fld(url, **kwargs) + res.append(_res) + return res + + @log_info + def test_9_tld_good_patterns_pass(self): + u'Test `get_tld` good URL patterns.' + res = [] + for data in self.good_patterns: + _res = get_tld(data[u'url'], **data[u'kwargs']) + self.assertEqual(_res, data[u'tld']) + res.append(_res) + return res + + @log_info + def test_10_tld_bad_patterns_pass(self): + u'Test `get_tld` bad URL patterns.' + res = [] + for (url, params) in self.bad_patterns.items(): + _res = get_tld(url, fail_silently=True) + self.assertEqual(_res, None) + res.append(_res) + return res + + @log_info + def test_11_parse_tld_good_patterns(self): + u'Test `parse_tld` good URL patterns.' + res = [] + for data in self.good_patterns: + _res = parse_tld(data[u'url'], **data[u'kwargs']) + self.assertEqual( + _res, (data[u'tld'], data[u'domain'], data[u'subdomain'])) + res.append(_res) + return res + + @log_info + def test_12_is_tld_good_patterns(self): + u'Test `is_tld` good URL patterns.' + for data in self.good_patterns: + self.assertTrue(is_tld(data[u'tld'])) + + @log_info + def test_13_is_tld_bad_patterns(self): + u'Test `is_tld` bad URL patterns.' + for _tld in self.invalid_tlds: + self.assertFalse(is_tld(_tld)) + + @log_info + def test_14_fail_update_tld_names(self): + u'Test fail `update_tld_names`.' + parser_class = self.get_custom_parser_class( + uid='custom_mozilla_2', source_url='i-do-not-exist') + with self.assertRaises(TldIOError): + update_tld_names(fail_silently=False, parser_uid=parser_class.uid) + self.assertFalse(update_tld_names( + fail_silently=True, parser_uid=parser_class.uid)) + + @log_info + def test_15_fail_get_fld_wrong_kwargs(self): + u'Test fail `get_fld` with wrong kwargs.' + with self.assertRaises(TldImproperlyConfigured): + get_fld(self.good_url, as_object=True) + + @log_info + def test_16_fail_parse_tld(self): + u'Test fail `parse_tld`.\n\n Assert raise TldIOError on wrong `NAMES_SOURCE_URL` for `parse_tld`.\n ' + parser_class = self.get_custom_parser_class( + source_url='i-do-not-exist') + parsed_tld = parse_tld( + self.bad_url, fail_silently=False, parser_class=parser_class) + self.assertEqual(parsed_tld, (None, None, None)) + + @log_info + def test_17_get_tld_names_and_reset_tld_names(self): + u'Test fail `get_tld_names` and repair using `reset_tld_names`.' + tmp_filename = join(gettempdir(), u''.join( + [u'{}'.format(self.faker.uuid4()), u'.dat.txt'])) + parser_class = self.get_custom_parser_class( + source_url='i-do-not-exist', local_path=tmp_filename) + reset_tld_names() + if True: + with self.assertRaises(TldIOError): + get_tld_names(fail_silently=False, parser_class=parser_class) + tmp_filename = join(gettempdir(), u''.join( + [u'{}'.format(self.faker.uuid4()), u'.dat.txt'])) + parser_class_2 = self.get_custom_parser_class( + source_url='i-do-not-exist-2', local_path=tmp_filename) + reset_tld_names() + if True: + self.assertIsNone(get_tld_names( + fail_silently=True, parser_class=parser_class_2)) + + @internet_available_only + @log_info + def test_18_update_tld_names_cli(self): + u'Test the return code of the CLI version of `update_tld_names`.' + reset_tld_names() + res = update_tld_names_cli() + self.assertEqual(res, 0) + + @log_info + def test_19_parse_tld_custom_tld_names_good_patterns(self): + u'Test `parse_tld` good URL patterns for custom tld names.' + res = [] + for data in self.good_patterns_custom_parser: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'parser_class': self.get_custom_parser_class(), + }) + _res = parse_tld(data[u'url'], **kwargs) + self.assertEqual( + _res, (data[u'tld'], data[u'domain'], data[u'subdomain'])) + res.append(_res) + return res + + @log_info + def test_20_tld_custom_tld_names_good_patterns_pass_parsed_object(self): + u'Test `get_tld` good URL patterns for custom tld names.' + res = [] + for data in self.good_patterns_custom_parser: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'as_object': True, + u'parser_class': self.get_custom_parser_class(), + }) + _res = get_tld(data[u'url'], **kwargs) + self.assertEqual(_res.tld, data[u'tld']) + self.assertEqual(_res.subdomain, data[u'subdomain']) + self.assertEqual(_res.domain, data[u'domain']) + self.assertEqual(_res.suffix, data[u'suffix']) + self.assertEqual(_res.fld, data[u'fld']) + self.assertEqual(unicode(_res).encode(u'utf8'), + data[u'tld'].encode(u'utf8')) + self.assertEqual(_res.__dict__, { + u'tld': _res.tld, + u'domain': _res.domain, + u'subdomain': _res.subdomain, + u'fld': _res.fld, + u'parsed_url': _res.parsed_url, + }) + res.append(_res) + return res + + @log_info + def test_21_reset_tld_names_for_custom_parser(self): + u'Test `reset_tld_names` for `tld_names_local_path`.' + res = [] + parser_class = self.get_custom_parser_class() + for data in self.good_patterns_custom_parser: + kwargs = copy.copy(data[u'kwargs']) + kwargs.update({ + u'as_object': True, + u'parser_class': self.get_custom_parser_class(), + }) + _res = get_tld(data[u'url'], **kwargs) + self.assertEqual(_res.tld, data[u'tld']) + self.assertEqual(_res.subdomain, data[u'subdomain']) + self.assertEqual(_res.domain, data[u'domain']) + self.assertEqual(_res.suffix, data[u'suffix']) + self.assertEqual(_res.fld, data[u'fld']) + self.assertEqual(unicode(_res).encode(u'utf8'), + data[u'tld'].encode(u'utf8')) + self.assertEqual(_res.__dict__, { + u'tld': _res.tld, + u'domain': _res.domain, + u'subdomain': _res.subdomain, + u'fld': _res.fld, + u'parsed_url': _res.parsed_url, + }) + res.append(_res) + tld_names = get_tld_names_container() + self.assertIn(parser_class.local_path, tld_names) + reset_tld_names(parser_class.local_path) + self.assertNotIn(parser_class.local_path, tld_names) + return res + + @log_info + def test_22_fail_define_custom_parser_class_without_uid(self): + u'Test fail define custom parser class without `uid`.' + + class CustomParser(BaseTLDSourceParser): + pass + + class AnotherCustomParser(BaseTLDSourceParser): + uid = u'another-custom-parser' + with self.assertRaises(TldImproperlyConfigured): + CustomParser.get_tld_names() + with self.assertRaises(NotImplementedError): + AnotherCustomParser.get_tld_names() + + @log_info + def test_23_len_trie_nodes(self): + u'Test len of the trie nodes.' + get_tld(u'http://delusionalinsanity.com') + tld_names = get_tld_names_container() + self.assertGreater( + len(tld_names[MozillaTLDSourceParser.local_path]), 0) + + @log_info + def test_24_get_tld_names_no_arguments(self): + u'Test len of the trie nodes.' + tld_names = get_tld_names() + self.assertGreater(len(tld_names), 0) + + +if (__name__ == u'__main__'): + unittest.main() diff --git a/Contents/Libraries/Shared/tld/trie.py b/Contents/Libraries/Shared/tld/trie.py new file mode 100644 index 000000000..c9365f8a5 --- /dev/null +++ b/Contents/Libraries/Shared/tld/trie.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'Trie', u'TrieNode') + + +class TrieNode(object): + u'Class representing a single Trie node.' + __slots__ = (u'children', u'exception', u'leaf', u'private') + + def __init__(self): + self.children = None + self.exception = None + self.leaf = False + self.private = False + + +class Trie(object): + u'An adhoc Trie data structure to store tlds in reverse notation order.' + + def __init__(self): + self.root = TrieNode() + self.__nodes = 0 + + def __len__(self): + return self.__nodes + + def add(self, tld, private=False): + node = self.root + for part in reversed(tld.split(u'.')): + if part.startswith(u'!'): + node.exception = part[1:] + break + if (node.children is None): + node.children = { + + } + child = TrieNode() + else: + child = node.children.get(part) + if (child is None): + child = TrieNode() + node.children[part] = child + node = child + node.leaf = True + if private: + node.private = True + self.__nodes += 1 diff --git a/Contents/Libraries/Shared/tld/utils.py b/Contents/Libraries/Shared/tld/utils.py new file mode 100644 index 000000000..d8ef62acd --- /dev/null +++ b/Contents/Libraries/Shared/tld/utils.py @@ -0,0 +1,271 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals +from __future__ import unicode_literals +import argparse +from codecs import open as codecs_open +from backports.functools_lru_cache import lru_cache +from os.path import isabs +import sys +from typing import Dict, Type, Union, Tuple, List +try: + from urllib.parse import urlsplit, SplitResult +except ImportError: + from six.moves.urllib_parse import urlsplit, SplitResult +from .base import BaseTLDSourceParser +from .exceptions import TldBadUrl, TldDomainNotFound, TldImproperlyConfigured, TldIOError +from .helpers import project_dir +from .trie import Trie +from .registry import Registry +from .result import Result +__author__ = u'Artur Barseghyan' +__copyright__ = u'2013-2019 Artur Barseghyan' +__license__ = u'MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later' +__all__ = (u'BaseMozillaTLDSourceParser', u'get_fld', u'get_tld', u'get_tld_names', u'get_tld_names_container', u'is_tld', u'MozillaTLDSourceParser', u'parse_tld', + u'pop_tld_names_container', u'process_url', u'reset_tld_names', u'Result', u'update_tld_names', u'update_tld_names_cli', u'update_tld_names_container') +tld_names = { + +} + + +def get_tld_names_container(): + u'Get container of all tld names.\n\n :return:\n :rtype dict:\n ' + global tld_names + return tld_names + + +def update_tld_names_container(tld_names_local_path, trie_obj): + u'Update TLD Names container item.\n\n :param tld_names_local_path:\n :param trie_obj:\n :return:\n ' + global tld_names + tld_names.update({ + tld_names_local_path: trie_obj, + }) + + +def pop_tld_names_container(tld_names_local_path): + u'Remove TLD names container item.\n\n :param tld_names_local_path:\n :return:\n ' + global tld_names + tld_names.pop(tld_names_local_path, None) + + +@lru_cache(maxsize=128, typed=True) +def update_tld_names(fail_silently=False, parser_uid=None): + u'Update TLD names.\n\n :param fail_silently:\n :param parser_uid:\n :return:\n ' + results = [] + results_append = results.append + if parser_uid: + parser_cls = Registry.get(parser_uid, None) + if (parser_cls and parser_cls.source_url): + results_append(parser_cls.update_tld_names( + fail_silently=fail_silently)) + else: + for (parser_uid, parser_cls) in Registry.items(): + if (parser_cls and parser_cls.source_url): + results_append(parser_cls.update_tld_names( + fail_silently=fail_silently)) + return all(results) + + +def update_tld_names_cli(): + u'CLI wrapper for update_tld_names.\n\n Since update_tld_names returns True on success, we need to negate the\n result to match CLI semantics.\n ' + parser = argparse.ArgumentParser(description='Update TLD names') + parser.add_argument(u'parser_uid', nargs='?', default=None, + help='UID of the parser to update TLD names for.') + parser.add_argument(u'--fail-silently', dest='fail_silently', + default=False, action='store_true', help='Fail silently') + args = parser.parse_args(sys.argv[1:]) + parser_uid = args.parser_uid + fail_silently = args.fail_silently + return int((not update_tld_names(parser_uid=parser_uid, fail_silently=fail_silently))) + + +def get_tld_names(fail_silently=False, retry_count=0, parser_class=None): + u'Build the ``tlds`` list if empty. Recursive.\n\n :param fail_silently: If set to True, no exceptions are raised and None\n is returned on failure.\n :param retry_count: If greater than 1, we raise an exception in order\n to avoid infinite loops.\n :param parser_class:\n :type fail_silently: bool\n :type retry_count: int\n :type parser_class: BaseTLDSourceParser\n :return: List of TLD names\n :rtype: obj:`tld.utils.Trie`\n ' + if (not parser_class): + parser_class = MozillaTLDSourceParser + return parser_class.get_tld_names(fail_silently=fail_silently, retry_count=retry_count) + + +class BaseMozillaTLDSourceParser(BaseTLDSourceParser): + + @classmethod + def get_tld_names(cls, fail_silently=False, retry_count=0): + u'Parse.\n\n :param fail_silently:\n :param retry_count:\n :return:\n ' + if (retry_count > 1): + if fail_silently: + return None + else: + raise TldIOError + global tld_names + _tld_names = tld_names + if ((cls.local_path in _tld_names) and (_tld_names[cls.local_path] is not None)): + return _tld_names + local_file = None + try: + if isabs(cls.local_path): + local_path = cls.local_path + else: + local_path = project_dir(cls.local_path) + local_file = codecs_open(local_path, u'r', encoding='utf8') + trie = Trie() + trie_add = trie.add + private_section = False + for line in local_file: + if (u'===BEGIN PRIVATE DOMAINS===' in line): + private_section = True + if (u'// xn--' in line): + line = line.split()[1] + if (line[0] in (u'/', u'\n')): + continue + trie_add(u''.join([u'{}'.format(line.strip())]), + private=private_section) + update_tld_names_container(cls.local_path, trie) + local_file.close() + except IOError as err: + cls.update_tld_names(fail_silently=fail_silently) + retry_count += 1 + return cls.get_tld_names(fail_silently=fail_silently, retry_count=retry_count) + except Exception as err: + if fail_silently: + return None + else: + raise err + finally: + try: + local_file.close() + except Exception: + pass + return _tld_names + + +class MozillaTLDSourceParser(BaseMozillaTLDSourceParser): + u'Mozilla TLD source.' + uid = u'mozilla' + source_url = u'http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1' + local_path = u'res/effective_tld_names.dat.txt' + + +def process_url(url, fail_silently=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u'Process URL.\n\n :param parser_class:\n :param url:\n :param fail_silently:\n :param fix_protocol:\n :param search_public:\n :param search_private:\n :return:\n ' + if (not (search_public or search_private)): + raise TldImproperlyConfigured( + u'Either `search_public` or `search_private` (or both) shall be set to True.') + _tld_names = get_tld_names( + fail_silently=fail_silently, parser_class=parser_class) + if (not isinstance(url, SplitResult)): + url = url.lower() + if (fix_protocol and (not url.startswith((u'//', u'http://', u'https://')))): + url = u''.join([u'https://', u'{}'.format(url)]) + parsed_url = urlsplit(url) + else: + parsed_url = url + domain_name = parsed_url.hostname + if (not domain_name): + if fail_silently: + return (None, None, parsed_url) + else: + raise TldBadUrl(url=url) + domain_parts = domain_name.split(u'.') + tld_names_local_path = parser_class.local_path + node = _tld_names[tld_names_local_path].root + current_length = 0 + tld_length = 0 + match = None + len_domain_parts = len(domain_parts) + for i in reversed(range(len_domain_parts)): + part = domain_parts[i] + if (node.children is None): + break + if (part == node.exception): + break + child = node.children.get(part) + if (child is None): + child = node.children.get(u'*') + if (child is None): + break + current_length += 1 + node = child + if node.leaf: + tld_length = current_length + match = node + if ((match is None) or (not match.leaf) or ((not search_public) and (not match.private)) or ((not search_private) and match.private)): + if fail_silently: + return (None, None, parsed_url) + else: + raise TldDomainNotFound(domain_name=domain_name) + if (len_domain_parts == tld_length): + non_zero_i = (- 1) + else: + non_zero_i = max(1, (len_domain_parts - tld_length)) + return (domain_parts, non_zero_i, parsed_url) + + +def get_fld(url, fail_silently=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser, **kwargs): + u"Extract the first level domain.\n\n Extract the top level domain based on the mozilla's effective TLD names\n dat file. Returns a string. May throw ``TldBadUrl`` or\n ``TldDomainNotFound`` exceptions if there's bad URL provided or no TLD\n match found respectively.\n\n :param url: URL to get top level domain from.\n :param fail_silently: If set to True, no exceptions are raised and None\n is returned on failure.\n :param fix_protocol: If set to True, missing or wrong protocol is\n ignored (https is appended instead).\n :param search_public: If set to True, search in public domains.\n :param search_private: If set to True, search in private domains.\n :param parser_class:\n :type url: str\n :type fail_silently: bool\n :type fix_protocol: bool\n :type search_public: bool\n :type search_private: bool\n :return: String with top level domain (if ``as_object`` argument\n is set to False) or a ``tld.utils.Result`` object (if ``as_object``\n argument is set to True); returns None on failure.\n :rtype: str\n " + if (u'as_object' in kwargs): + raise TldImproperlyConfigured( + u'`as_object` argument is deprecated for `get_fld`. Use `get_tld` instead.') + (domain_parts, non_zero_i, parsed_url) = process_url(url=url, fail_silently=fail_silently, + fix_protocol=fix_protocol, search_public=search_public, search_private=search_private, parser_class=parser_class) + if (domain_parts is None): + return None + if (non_zero_i < 0): + return parsed_url.hostname + return u'.'.join(domain_parts[(non_zero_i - 1):]) + + +def get_tld(url, fail_silently=False, as_object=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u"Extract the top level domain.\n\n Extract the top level domain based on the mozilla's effective TLD names\n dat file. Returns a string. May throw ``TldBadUrl`` or\n ``TldDomainNotFound`` exceptions if there's bad URL provided or no TLD\n match found respectively.\n\n :param url: URL to get top level domain from.\n :param fail_silently: If set to True, no exceptions are raised and None\n is returned on failure.\n :param as_object: If set to True, ``tld.utils.Result`` object is returned,\n ``domain``, ``suffix`` and ``tld`` properties.\n :param fix_protocol: If set to True, missing or wrong protocol is\n ignored (https is appended instead).\n :param search_public: If set to True, search in public domains.\n :param search_private: If set to True, search in private domains.\n :param parser_class:\n :type url: str\n :type fail_silently: bool\n :type as_object: bool\n :type fix_protocol: bool\n :type search_public: bool\n :type search_private: bool\n :return: String with top level domain (if ``as_object`` argument\n is set to False) or a ``tld.utils.Result`` object (if ``as_object``\n argument is set to True); returns None on failure.\n :rtype: str\n " + (domain_parts, non_zero_i, parsed_url) = process_url(url=url, fail_silently=fail_silently, + fix_protocol=fix_protocol, search_public=search_public, search_private=search_private, parser_class=parser_class) + if (domain_parts is None): + return None + if (not as_object): + if (non_zero_i < 0): + return parsed_url.hostname + return u'.'.join(domain_parts[non_zero_i:]) + if (non_zero_i < 0): + subdomain = u'' + domain = u'' + _tld = parsed_url.hostname + else: + subdomain = u'.'.join(domain_parts[:(non_zero_i - 1)]) + domain = u'.'.join(domain_parts[(non_zero_i - 1):non_zero_i]) + _tld = u'.'.join(domain_parts[non_zero_i:]) + return Result(subdomain=subdomain, domain=domain, tld=_tld, parsed_url=parsed_url) + + +def parse_tld(url, fail_silently=False, fix_protocol=False, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u'Parse TLD into parts.\n\n :param url:\n :param fail_silently:\n :param fix_protocol:\n :param search_public:\n :param search_private:\n :param parser_class:\n :return:\n :rtype: tuple\n ' + try: + obj = get_tld(url, fail_silently=fail_silently, as_object=True, fix_protocol=fix_protocol, + search_public=search_public, search_private=search_private, parser_class=parser_class) + _tld = obj.tld + domain = obj.domain + subdomain = obj.subdomain + except (TldBadUrl, TldDomainNotFound, TldImproperlyConfigured, TldIOError): + _tld = None + domain = None + subdomain = None + return (_tld, domain, subdomain) + + +def is_tld(value, search_public=True, search_private=True, parser_class=MozillaTLDSourceParser): + u'Check if given URL is tld.\n\n :param value: URL to get top level domain from.\n :param search_public: If set to True, search in public domains.\n :param search_private: If set to True, search in private domains.\n :param parser_class:\n :type value: str\n :type search_public: bool\n :type search_private: bool\n :return:\n :rtype: bool\n ' + _tld = get_tld(url=value, fail_silently=True, fix_protocol=True, + search_public=search_public, search_private=search_private, parser_class=parser_class) + return (value == _tld) + + +def reset_tld_names(tld_names_local_path=None): + u'Reset the ``tld_names`` to empty value.\n\n If ``tld_names_local_path`` is given, removes specified\n entry from ``tld_names`` instead.\n\n :param tld_names_local_path:\n :type tld_names_local_path: str\n :return:\n ' + if tld_names_local_path: + pop_tld_names_container(tld_names_local_path) + else: + global tld_names + tld_names = { + + } diff --git a/Contents/Libraries/Shared/typing.py b/Contents/Libraries/Shared/typing.py new file mode 100644 index 000000000..dd16d9af9 --- /dev/null +++ b/Contents/Libraries/Shared/typing.py @@ -0,0 +1,2550 @@ +from __future__ import absolute_import, unicode_literals + +import abc +from abc import abstractmethod, abstractproperty +import collections +import functools +import re as stdlib_re # Avoid confusion with the re we export. +import sys +import types +import copy +try: + import collections.abc as collections_abc +except ImportError: + import collections as collections_abc # Fallback for PY3.2. + + +# Please keep __all__ alphabetized within each category. +__all__ = [ + # Super-special typing primitives. + 'Any', + 'Callable', + 'ClassVar', + 'Final', + 'Generic', + 'Literal', + 'Optional', + 'Protocol', + 'Tuple', + 'Type', + 'TypeVar', + 'Union', + + # ABCs (from collections.abc). + 'AbstractSet', # collections.abc.Set. + 'GenericMeta', # subclass of abc.ABCMeta and a metaclass + # for 'Generic' and ABCs below. + 'ByteString', + 'Container', + 'ContextManager', + 'Hashable', + 'ItemsView', + 'Iterable', + 'Iterator', + 'KeysView', + 'Mapping', + 'MappingView', + 'MutableMapping', + 'MutableSequence', + 'MutableSet', + 'Sequence', + 'Sized', + 'ValuesView', + + # Structural checks, a.k.a. protocols. + 'Reversible', + 'SupportsAbs', + 'SupportsComplex', + 'SupportsFloat', + 'SupportsIndex', + 'SupportsInt', + + # Concrete collection types. + 'Counter', + 'Deque', + 'Dict', + 'DefaultDict', + 'List', + 'Set', + 'FrozenSet', + 'NamedTuple', # Not really a type. + 'TypedDict', # Not really a type. + 'Generator', + + # One-off things. + 'AnyStr', + 'cast', + 'final', + 'get_type_hints', + 'NewType', + 'no_type_check', + 'no_type_check_decorator', + 'NoReturn', + 'overload', + 'runtime_checkable', + 'Text', + 'TYPE_CHECKING', +] + +# The pseudo-submodules 're' and 'io' are part of the public +# namespace, but excluded from __all__ because they might stomp on +# legitimate imports of those modules. + + +def _qualname(x): + if sys.version_info[:2] >= (3, 3): + return x.__qualname__ + else: + # Fall back to just name. + return x.__name__ + + +def _trim_name(nm): + whitelist = ('_TypeAlias', '_ForwardRef', '_TypingBase', '_FinalTypingBase') + if nm.startswith('_') and nm not in whitelist: + nm = nm[1:] + return nm + + +class TypingMeta(type): + """Metaclass for most types defined in typing module + (not a part of public API). + + This also defines a dummy constructor (all the work for most typing + constructs is done in __new__) and a nicer repr(). + """ + + _is_protocol = False + + def __new__(cls, name, bases, namespace): + return super(TypingMeta, cls).__new__(cls, str(name), bases, namespace) + + @classmethod + def assert_no_subclassing(cls, bases): + for base in bases: + if isinstance(base, cls): + raise TypeError("Cannot subclass %s" % + (', '.join(map(_type_repr, bases)) or '()')) + + def __init__(self, *args, **kwds): + pass + + def _eval_type(self, globalns, localns): + """Override this in subclasses to interpret forward references. + + For example, List['C'] is internally stored as + List[_ForwardRef('C')], which should evaluate to List[C], + where C is an object found in globalns or localns (searching + localns first, of course). + """ + return self + + def _get_type_vars(self, tvars): + pass + + def __repr__(self): + qname = _trim_name(_qualname(self)) + return '%s.%s' % (self.__module__, qname) + + +class _TypingBase(object): + """Internal indicator of special typing constructs.""" + __metaclass__ = TypingMeta + __slots__ = ('__weakref__',) + + def __init__(self, *args, **kwds): + pass + + def __new__(cls, *args, **kwds): + """Constructor. + + This only exists to give a better error message in case + someone tries to subclass a special typing object (not a good idea). + """ + if (len(args) == 3 and + isinstance(args[0], str) and + isinstance(args[1], tuple)): + # Close enough. + raise TypeError("Cannot subclass %r" % cls) + return super(_TypingBase, cls).__new__(cls) + + # Things that are not classes also need these. + def _eval_type(self, globalns, localns): + return self + + def _get_type_vars(self, tvars): + pass + + def __repr__(self): + cls = type(self) + qname = _trim_name(_qualname(cls)) + return '%s.%s' % (cls.__module__, qname) + + def __call__(self, *args, **kwds): + raise TypeError("Cannot instantiate %r" % type(self)) + + +class _FinalTypingBase(_TypingBase): + """Internal mix-in class to prevent instantiation. + + Prevents instantiation unless _root=True is given in class call. + It is used to create pseudo-singleton instances Any, Union, Optional, etc. + """ + + __slots__ = () + + def __new__(cls, *args, **kwds): + self = super(_FinalTypingBase, cls).__new__(cls, *args, **kwds) + if '_root' in kwds and kwds['_root'] is True: + return self + raise TypeError("Cannot instantiate %r" % cls) + + def __reduce__(self): + return _trim_name(type(self).__name__) + + +class _ForwardRef(_TypingBase): + """Internal wrapper to hold a forward reference.""" + + __slots__ = ('__forward_arg__', '__forward_code__', + '__forward_evaluated__', '__forward_value__') + + def __init__(self, arg): + super(_ForwardRef, self).__init__(arg) + if not isinstance(arg, basestring): + raise TypeError('Forward reference must be a string -- got %r' % (arg,)) + try: + code = compile(arg, '<string>', 'eval') + except SyntaxError: + raise SyntaxError('Forward reference must be an expression -- got %r' % + (arg,)) + self.__forward_arg__ = arg + self.__forward_code__ = code + self.__forward_evaluated__ = False + self.__forward_value__ = None + + def _eval_type(self, globalns, localns): + if not self.__forward_evaluated__ or localns is not globalns: + if globalns is None and localns is None: + globalns = localns = {} + elif globalns is None: + globalns = localns + elif localns is None: + localns = globalns + self.__forward_value__ = _type_check( + eval(self.__forward_code__, globalns, localns), + "Forward references must evaluate to types.") + self.__forward_evaluated__ = True + return self.__forward_value__ + + def __eq__(self, other): + if not isinstance(other, _ForwardRef): + return NotImplemented + return (self.__forward_arg__ == other.__forward_arg__ and + self.__forward_value__ == other.__forward_value__) + + def __hash__(self): + return hash((self.__forward_arg__, self.__forward_value__)) + + def __instancecheck__(self, obj): + raise TypeError("Forward references cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Forward references cannot be used with issubclass().") + + def __repr__(self): + return '_ForwardRef(%r)' % (self.__forward_arg__,) + + +class _TypeAlias(_TypingBase): + """Internal helper class for defining generic variants of concrete types. + + Note that this is not a type; let's call it a pseudo-type. It cannot + be used in instance and subclass checks in parameterized form, i.e. + ``isinstance(42, Match[str])`` raises ``TypeError`` instead of returning + ``False``. + """ + + __slots__ = ('name', 'type_var', 'impl_type', 'type_checker') + + def __init__(self, name, type_var, impl_type, type_checker): + """Initializer. + + Args: + name: The name, e.g. 'Pattern'. + type_var: The type parameter, e.g. AnyStr, or the + specific type, e.g. str. + impl_type: The implementation type. + type_checker: Function that takes an impl_type instance. + and returns a value that should be a type_var instance. + """ + assert isinstance(name, basestring), repr(name) + assert isinstance(impl_type, type), repr(impl_type) + assert not isinstance(impl_type, TypingMeta), repr(impl_type) + assert isinstance(type_var, (type, _TypingBase)), repr(type_var) + self.name = name + self.type_var = type_var + self.impl_type = impl_type + self.type_checker = type_checker + + def __repr__(self): + return "%s[%s]" % (self.name, _type_repr(self.type_var)) + + def __getitem__(self, parameter): + if not isinstance(self.type_var, TypeVar): + raise TypeError("%s cannot be further parameterized." % self) + if self.type_var.__constraints__ and isinstance(parameter, type): + if not issubclass(parameter, self.type_var.__constraints__): + raise TypeError("%s is not a valid substitution for %s." % + (parameter, self.type_var)) + if isinstance(parameter, TypeVar) and parameter is not self.type_var: + raise TypeError("%s cannot be re-parameterized." % self) + return self.__class__(self.name, parameter, + self.impl_type, self.type_checker) + + def __eq__(self, other): + if not isinstance(other, _TypeAlias): + return NotImplemented + return self.name == other.name and self.type_var == other.type_var + + def __hash__(self): + return hash((self.name, self.type_var)) + + def __instancecheck__(self, obj): + if not isinstance(self.type_var, TypeVar): + raise TypeError("Parameterized type aliases cannot be used " + "with isinstance().") + return isinstance(obj, self.impl_type) + + def __subclasscheck__(self, cls): + if not isinstance(self.type_var, TypeVar): + raise TypeError("Parameterized type aliases cannot be used " + "with issubclass().") + return issubclass(cls, self.impl_type) + + +def _get_type_vars(types, tvars): + for t in types: + if isinstance(t, TypingMeta) or isinstance(t, _TypingBase): + t._get_type_vars(tvars) + + +def _type_vars(types): + tvars = [] + _get_type_vars(types, tvars) + return tuple(tvars) + + +def _eval_type(t, globalns, localns): + if isinstance(t, TypingMeta) or isinstance(t, _TypingBase): + return t._eval_type(globalns, localns) + return t + + +def _type_check(arg, msg): + """Check that the argument is a type, and return it (internal helper). + + As a special case, accept None and return type(None) instead. + Also, _TypeAlias instances (e.g. Match, Pattern) are acceptable. + + The msg argument is a human-readable error message, e.g. + + "Union[arg, ...]: arg should be a type." + + We append the repr() of the actual value (truncated to 100 chars). + """ + if arg is None: + return type(None) + if isinstance(arg, basestring): + arg = _ForwardRef(arg) + if ( + isinstance(arg, _TypingBase) and type(arg).__name__ == '_ClassVar' or + not isinstance(arg, (type, _TypingBase)) and not callable(arg) + ): + raise TypeError(msg + " Got %.100r." % (arg,)) + # Bare Union etc. are not valid as type arguments + if ( + type(arg).__name__ in ('_Union', '_Optional') and + not getattr(arg, '__origin__', None) or + isinstance(arg, TypingMeta) and arg._gorg in (Generic, Protocol) + ): + raise TypeError("Plain %s is not valid as type argument" % arg) + return arg + + +def _type_repr(obj): + """Return the repr() of an object, special-casing types (internal helper). + + If obj is a type, we return a shorter version than the default + type.__repr__, based on the module and qualified name, which is + typically enough to uniquely identify a type. For everything + else, we fall back on repr(obj). + """ + if isinstance(obj, type) and not isinstance(obj, TypingMeta): + if obj.__module__ == '__builtin__': + return _qualname(obj) + return '%s.%s' % (obj.__module__, _qualname(obj)) + if obj is Ellipsis: + return '...' + if isinstance(obj, types.FunctionType): + return obj.__name__ + return repr(obj) + + +class ClassVarMeta(TypingMeta): + """Metaclass for _ClassVar""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(ClassVarMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _ClassVar(_FinalTypingBase): + """Special type construct to mark class variables. + + An annotation wrapped in ClassVar indicates that a given + attribute is intended to be used as a class variable and + should not be set on instances of that class. Usage:: + + class Starship: + stats = {} # type: ClassVar[Dict[str, int]] # class variable + damage = 10 # type: int # instance variable + + ClassVar accepts only types and cannot be further subscribed. + + Note that ClassVar is not a class itself, and should not + be used with isinstance() or issubclass(). + """ + + __metaclass__ = ClassVarMeta + __slots__ = ('__type__',) + + def __init__(self, tp=None, _root=False): + self.__type__ = tp + + def __getitem__(self, item): + cls = type(self) + if self.__type__ is None: + return cls(_type_check(item, + '{} accepts only types.'.format(cls.__name__[1:])), + _root=True) + raise TypeError('{} cannot be further subscripted' + .format(cls.__name__[1:])) + + def _eval_type(self, globalns, localns): + return type(self)(_eval_type(self.__type__, globalns, localns), + _root=True) + + def __repr__(self): + r = super(_ClassVar, self).__repr__() + if self.__type__ is not None: + r += '[{}]'.format(_type_repr(self.__type__)) + return r + + def __hash__(self): + return hash((type(self).__name__, self.__type__)) + + def __eq__(self, other): + if not isinstance(other, _ClassVar): + return NotImplemented + if self.__type__ is not None: + return self.__type__ == other.__type__ + return self is other + + +ClassVar = _ClassVar(_root=True) + + +class _FinalMeta(TypingMeta): + """Metaclass for _Final""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(_FinalMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _Final(_FinalTypingBase): + """A special typing construct to indicate that a name + cannot be re-assigned or overridden in a subclass. + For example: + + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker + + class Connection: + TIMEOUT: Final[int] = 10 + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker + + There is no runtime checking of these properties. + """ + + __metaclass__ = _FinalMeta + __slots__ = ('__type__',) + + def __init__(self, tp=None, **kwds): + self.__type__ = tp + + def __getitem__(self, item): + cls = type(self) + if self.__type__ is None: + return cls(_type_check(item, + '{} accepts only single type.'.format(cls.__name__[1:])), + _root=True) + raise TypeError('{} cannot be further subscripted' + .format(cls.__name__[1:])) + + def _eval_type(self, globalns, localns): + new_tp = _eval_type(self.__type__, globalns, localns) + if new_tp == self.__type__: + return self + return type(self)(new_tp, _root=True) + + def __repr__(self): + r = super(_Final, self).__repr__() + if self.__type__ is not None: + r += '[{}]'.format(_type_repr(self.__type__)) + return r + + def __hash__(self): + return hash((type(self).__name__, self.__type__)) + + def __eq__(self, other): + if not isinstance(other, _Final): + return NotImplemented + if self.__type__ is not None: + return self.__type__ == other.__type__ + return self is other + + +Final = _Final(_root=True) + + +def final(f): + """This decorator can be used to indicate to type checkers that + the decorated method cannot be overridden, and decorated class + cannot be subclassed. For example: + + class Base: + @final + def done(self) -> None: + ... + class Sub(Base): + def done(self) -> None: # Error reported by type checker + ... + @final + class Leaf: + ... + class Other(Leaf): # Error reported by type checker + ... + + There is no runtime checking of these properties. + """ + return f + + +class _LiteralMeta(TypingMeta): + """Metaclass for _Literal""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(_LiteralMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _Literal(_FinalTypingBase): + """A type that can be used to indicate to type checkers that the + corresponding value has a value literally equivalent to the + provided parameter. For example: + + var: Literal[4] = 4 + + The type checker understands that 'var' is literally equal to the + value 4 and no other value. + + Literal[...] cannot be subclassed. There is no runtime checking + verifying that the parameter is actually a value instead of a type. + """ + + __metaclass__ = _LiteralMeta + __slots__ = ('__values__',) + + def __init__(self, values=None, **kwds): + self.__values__ = values + + def __getitem__(self, item): + cls = type(self) + if self.__values__ is None: + if not isinstance(item, tuple): + item = (item,) + return cls(values=item, + _root=True) + raise TypeError('{} cannot be further subscripted' + .format(cls.__name__[1:])) + + def _eval_type(self, globalns, localns): + return self + + def __repr__(self): + r = super(_Literal, self).__repr__() + if self.__values__ is not None: + r += '[{}]'.format(', '.join(map(_type_repr, self.__values__))) + return r + + def __hash__(self): + return hash((type(self).__name__, self.__values__)) + + def __eq__(self, other): + if not isinstance(other, _Literal): + return NotImplemented + if self.__values__ is not None: + return self.__values__ == other.__values__ + return self is other + + +Literal = _Literal(_root=True) + + +class AnyMeta(TypingMeta): + """Metaclass for Any.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(AnyMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _Any(_FinalTypingBase): + """Special type indicating an unconstrained type. + + - Any is compatible with every type. + - Any assumed to have all methods. + - All values assumed to be instances of Any. + + Note that all the above statements are true from the point of view of + static type checkers. At runtime, Any should not be used with instance + or class checks. + """ + __metaclass__ = AnyMeta + __slots__ = () + + def __instancecheck__(self, obj): + raise TypeError("Any cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Any cannot be used with issubclass().") + + +Any = _Any(_root=True) + + +class NoReturnMeta(TypingMeta): + """Metaclass for NoReturn.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + self = super(NoReturnMeta, cls).__new__(cls, name, bases, namespace) + return self + + +class _NoReturn(_FinalTypingBase): + """Special type indicating functions that never return. + Example:: + + from typing import NoReturn + + def stop() -> NoReturn: + raise Exception('no way') + + This type is invalid in other positions, e.g., ``List[NoReturn]`` + will fail in static type checkers. + """ + __metaclass__ = NoReturnMeta + __slots__ = () + + def __instancecheck__(self, obj): + raise TypeError("NoReturn cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("NoReturn cannot be used with issubclass().") + + +NoReturn = _NoReturn(_root=True) + + +class TypeVarMeta(TypingMeta): + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + return super(TypeVarMeta, cls).__new__(cls, name, bases, namespace) + + +class TypeVar(_TypingBase): + """Type variable. + + Usage:: + + T = TypeVar('T') # Can be anything + A = TypeVar('A', str, bytes) # Must be str or bytes + + Type variables exist primarily for the benefit of static type + checkers. They serve as the parameters for generic types as well + as for generic function definitions. See class Generic for more + information on generic types. Generic functions work as follows: + + def repeat(x: T, n: int) -> List[T]: + '''Return a list containing n references to x.''' + return [x]*n + + def longest(x: A, y: A) -> A: + '''Return the longest of two strings.''' + return x if len(x) >= len(y) else y + + The latter example's signature is essentially the overloading + of (str, str) -> str and (bytes, bytes) -> bytes. Also note + that if the arguments are instances of some subclass of str, + the return type is still plain str. + + At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError. + + Type variables defined with covariant=True or contravariant=True + can be used do declare covariant or contravariant generic types. + See PEP 484 for more details. By default generic types are invariant + in all type variables. + + Type variables can be introspected. e.g.: + + T.__name__ == 'T' + T.__constraints__ == () + T.__covariant__ == False + T.__contravariant__ = False + A.__constraints__ == (str, bytes) + """ + + __metaclass__ = TypeVarMeta + __slots__ = ('__name__', '__bound__', '__constraints__', + '__covariant__', '__contravariant__') + + def __init__(self, name, *constraints, **kwargs): + super(TypeVar, self).__init__(name, *constraints, **kwargs) + bound = kwargs.get('bound', None) + covariant = kwargs.get('covariant', False) + contravariant = kwargs.get('contravariant', False) + self.__name__ = name + if covariant and contravariant: + raise ValueError("Bivariant types are not supported.") + self.__covariant__ = bool(covariant) + self.__contravariant__ = bool(contravariant) + if constraints and bound is not None: + raise TypeError("Constraints cannot be combined with bound=...") + if constraints and len(constraints) == 1: + raise TypeError("A single constraint is not allowed") + msg = "TypeVar(name, constraint, ...): constraints must be types." + self.__constraints__ = tuple(_type_check(t, msg) for t in constraints) + if bound: + self.__bound__ = _type_check(bound, "Bound must be a type.") + else: + self.__bound__ = None + + def _get_type_vars(self, tvars): + if self not in tvars: + tvars.append(self) + + def __repr__(self): + if self.__covariant__: + prefix = '+' + elif self.__contravariant__: + prefix = '-' + else: + prefix = '~' + return prefix + self.__name__ + + def __instancecheck__(self, instance): + raise TypeError("Type variables cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Type variables cannot be used with issubclass().") + + +# Some unconstrained type variables. These are used by the container types. +# (These are not for export.) +T = TypeVar('T') # Any type. +KT = TypeVar('KT') # Key type. +VT = TypeVar('VT') # Value type. +T_co = TypeVar('T_co', covariant=True) # Any type covariant containers. +V_co = TypeVar('V_co', covariant=True) # Any type covariant containers. +VT_co = TypeVar('VT_co', covariant=True) # Value type covariant containers. +T_contra = TypeVar('T_contra', contravariant=True) # Ditto contravariant. + +# A useful type variable with constraints. This represents string types. +# (This one *is* for export!) +AnyStr = TypeVar('AnyStr', bytes, unicode) + + +def _replace_arg(arg, tvars, args): + """An internal helper function: replace arg if it is a type variable + found in tvars with corresponding substitution from args or + with corresponding substitution sub-tree if arg is a generic type. + """ + + if tvars is None: + tvars = [] + if hasattr(arg, '_subs_tree') and isinstance(arg, (GenericMeta, _TypingBase)): + return arg._subs_tree(tvars, args) + if isinstance(arg, TypeVar): + for i, tvar in enumerate(tvars): + if arg == tvar: + return args[i] + return arg + + +# Special typing constructs Union, Optional, Generic, Callable and Tuple +# use three special attributes for internal bookkeeping of generic types: +# * __parameters__ is a tuple of unique free type parameters of a generic +# type, for example, Dict[T, T].__parameters__ == (T,); +# * __origin__ keeps a reference to a type that was subscripted, +# e.g., Union[T, int].__origin__ == Union; +# * __args__ is a tuple of all arguments used in subscripting, +# e.g., Dict[T, int].__args__ == (T, int). + + +def _subs_tree(cls, tvars=None, args=None): + """An internal helper function: calculate substitution tree + for generic cls after replacing its type parameters with + substitutions in tvars -> args (if any). + Repeat the same following __origin__'s. + + Return a list of arguments with all possible substitutions + performed. Arguments that are generic classes themselves are represented + as tuples (so that no new classes are created by this function). + For example: _subs_tree(List[Tuple[int, T]][str]) == [(Tuple, int, str)] + """ + + if cls.__origin__ is None: + return cls + # Make of chain of origins (i.e. cls -> cls.__origin__) + current = cls.__origin__ + orig_chain = [] + while current.__origin__ is not None: + orig_chain.append(current) + current = current.__origin__ + # Replace type variables in __args__ if asked ... + tree_args = [] + for arg in cls.__args__: + tree_args.append(_replace_arg(arg, tvars, args)) + # ... then continue replacing down the origin chain. + for ocls in orig_chain: + new_tree_args = [] + for arg in ocls.__args__: + new_tree_args.append(_replace_arg(arg, ocls.__parameters__, tree_args)) + tree_args = new_tree_args + return tree_args + + +def _remove_dups_flatten(parameters): + """An internal helper for Union creation and substitution: flatten Union's + among parameters, then remove duplicates and strict subclasses. + """ + + # Flatten out Union[Union[...], ...]. + params = [] + for p in parameters: + if isinstance(p, _Union) and p.__origin__ is Union: + params.extend(p.__args__) + elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union: + params.extend(p[1:]) + else: + params.append(p) + # Weed out strict duplicates, preserving the first of each occurrence. + all_params = set(params) + if len(all_params) < len(params): + new_params = [] + for t in params: + if t in all_params: + new_params.append(t) + all_params.remove(t) + params = new_params + assert not all_params, all_params + # Weed out subclasses. + # E.g. Union[int, Employee, Manager] == Union[int, Employee]. + # If object is present it will be sole survivor among proper classes. + # Never discard type variables. + # (In particular, Union[str, AnyStr] != AnyStr.) + all_params = set(params) + for t1 in params: + if not isinstance(t1, type): + continue + if any(isinstance(t2, type) and issubclass(t1, t2) + for t2 in all_params - {t1} + if not (isinstance(t2, GenericMeta) and + t2.__origin__ is not None)): + all_params.remove(t1) + return tuple(t for t in params if t in all_params) + + +def _check_generic(cls, parameters): + # Check correct count for parameters of a generic cls (internal helper). + if not cls.__parameters__: + raise TypeError("%s is not a generic class" % repr(cls)) + alen = len(parameters) + elen = len(cls.__parameters__) + if alen != elen: + raise TypeError("Too %s parameters for %s; actual %s, expected %s" % + ("many" if alen > elen else "few", repr(cls), alen, elen)) + + +_cleanups = [] + + +def _tp_cache(func): + maxsize = 128 + cache = {} + _cleanups.append(cache.clear) + + @functools.wraps(func) + def inner(*args): + key = args + try: + return cache[key] + except TypeError: + # Assume it's an unhashable argument. + return func(*args) + except KeyError: + value = func(*args) + if len(cache) >= maxsize: + # If the cache grows too much, just start over. + cache.clear() + cache[key] = value + return value + + return inner + + +class UnionMeta(TypingMeta): + """Metaclass for Union.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + return super(UnionMeta, cls).__new__(cls, name, bases, namespace) + + +class _Union(_FinalTypingBase): + """Union type; Union[X, Y] means either X or Y. + + To define a union, use e.g. Union[int, str]. Details: + + - The arguments must be types and there must be at least one. + + - None as an argument is a special case and is replaced by + type(None). + + - Unions of unions are flattened, e.g.:: + + Union[Union[int, str], float] == Union[int, str, float] + + - Unions of a single argument vanish, e.g.:: + + Union[int] == int # The constructor actually returns int + + - Redundant arguments are skipped, e.g.:: + + Union[int, str, int] == Union[int, str] + + - When comparing unions, the argument order is ignored, e.g.:: + + Union[int, str] == Union[str, int] + + - When two arguments have a subclass relationship, the least + derived argument is kept, e.g.:: + + class Employee: pass + class Manager(Employee): pass + Union[int, Employee, Manager] == Union[int, Employee] + Union[Manager, int, Employee] == Union[int, Employee] + Union[Employee, Manager] == Employee + + - Similar for object:: + + Union[int, object] == object + + - You cannot subclass or instantiate a union. + + - You can use Optional[X] as a shorthand for Union[X, None]. + """ + + __metaclass__ = UnionMeta + __slots__ = ('__parameters__', '__args__', '__origin__', '__tree_hash__') + + def __new__(cls, parameters=None, origin=None, *args, **kwds): + self = super(_Union, cls).__new__(cls, parameters, origin, *args, **kwds) + if origin is None: + self.__parameters__ = None + self.__args__ = None + self.__origin__ = None + self.__tree_hash__ = hash(frozenset(('Union',))) + return self + if not isinstance(parameters, tuple): + raise TypeError("Expected parameters=<tuple>") + if origin is Union: + parameters = _remove_dups_flatten(parameters) + # It's not a union if there's only one type left. + if len(parameters) == 1: + return parameters[0] + self.__parameters__ = _type_vars(parameters) + self.__args__ = parameters + self.__origin__ = origin + # Pre-calculate the __hash__ on instantiation. + # This improves speed for complex substitutions. + subs_tree = self._subs_tree() + if isinstance(subs_tree, tuple): + self.__tree_hash__ = hash(frozenset(subs_tree)) + else: + self.__tree_hash__ = hash(subs_tree) + return self + + def _eval_type(self, globalns, localns): + if self.__args__ is None: + return self + ev_args = tuple(_eval_type(t, globalns, localns) for t in self.__args__) + ev_origin = _eval_type(self.__origin__, globalns, localns) + if ev_args == self.__args__ and ev_origin == self.__origin__: + # Everything is already evaluated. + return self + return self.__class__(ev_args, ev_origin, _root=True) + + def _get_type_vars(self, tvars): + if self.__origin__ and self.__parameters__: + _get_type_vars(self.__parameters__, tvars) + + def __repr__(self): + if self.__origin__ is None: + return super(_Union, self).__repr__() + tree = self._subs_tree() + if not isinstance(tree, tuple): + return repr(tree) + return tree[0]._tree_repr(tree) + + def _tree_repr(self, tree): + arg_list = [] + for arg in tree[1:]: + if not isinstance(arg, tuple): + arg_list.append(_type_repr(arg)) + else: + arg_list.append(arg[0]._tree_repr(arg)) + return super(_Union, self).__repr__() + '[%s]' % ', '.join(arg_list) + + @_tp_cache + def __getitem__(self, parameters): + if parameters == (): + raise TypeError("Cannot take a Union of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + if self.__origin__ is None: + msg = "Union[arg, ...]: each arg must be a type." + else: + msg = "Parameters to generic types must be types." + parameters = tuple(_type_check(p, msg) for p in parameters) + if self is not Union: + _check_generic(self, parameters) + return self.__class__(parameters, origin=self, _root=True) + + def _subs_tree(self, tvars=None, args=None): + if self is Union: + return Union # Nothing to substitute + tree_args = _subs_tree(self, tvars, args) + tree_args = _remove_dups_flatten(tree_args) + if len(tree_args) == 1: + return tree_args[0] # Union of a single type is that type + return (Union,) + tree_args + + def __eq__(self, other): + if isinstance(other, _Union): + return self.__tree_hash__ == other.__tree_hash__ + elif self is not Union: + return self._subs_tree() == other + else: + return self is other + + def __hash__(self): + return self.__tree_hash__ + + def __instancecheck__(self, obj): + raise TypeError("Unions cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("Unions cannot be used with issubclass().") + + +Union = _Union(_root=True) + + +class OptionalMeta(TypingMeta): + """Metaclass for Optional.""" + + def __new__(cls, name, bases, namespace): + cls.assert_no_subclassing(bases) + return super(OptionalMeta, cls).__new__(cls, name, bases, namespace) + + +class _Optional(_FinalTypingBase): + """Optional type. + + Optional[X] is equivalent to Union[X, None]. + """ + + __metaclass__ = OptionalMeta + __slots__ = () + + @_tp_cache + def __getitem__(self, arg): + arg = _type_check(arg, "Optional[t] requires a single type.") + return Union[arg, type(None)] + + +Optional = _Optional(_root=True) + + +def _next_in_mro(cls): + """Helper for Generic.__new__. + + Returns the class after the last occurrence of Generic or + Generic[...] in cls.__mro__. + """ + next_in_mro = object + # Look for the last occurrence of Generic or Generic[...]. + for i, c in enumerate(cls.__mro__[:-1]): + if isinstance(c, GenericMeta) and c._gorg is Generic: + next_in_mro = cls.__mro__[i + 1] + return next_in_mro + + +def _make_subclasshook(cls): + """Construct a __subclasshook__ callable that incorporates + the associated __extra__ class in subclass checks performed + against cls. + """ + if isinstance(cls.__extra__, abc.ABCMeta): + # The logic mirrors that of ABCMeta.__subclasscheck__. + # Registered classes need not be checked here because + # cls and its extra share the same _abc_registry. + def __extrahook__(cls, subclass): + res = cls.__extra__.__subclasshook__(subclass) + if res is not NotImplemented: + return res + if cls.__extra__ in getattr(subclass, '__mro__', ()): + return True + for scls in cls.__extra__.__subclasses__(): + if isinstance(scls, GenericMeta): + continue + if issubclass(subclass, scls): + return True + return NotImplemented + else: + # For non-ABC extras we'll just call issubclass(). + def __extrahook__(cls, subclass): + if cls.__extra__ and issubclass(subclass, cls.__extra__): + return True + return NotImplemented + return classmethod(__extrahook__) + + +class GenericMeta(TypingMeta, abc.ABCMeta): + """Metaclass for generic types. + + This is a metaclass for typing.Generic and generic ABCs defined in + typing module. User defined subclasses of GenericMeta can override + __new__ and invoke super().__new__. Note that GenericMeta.__new__ + has strict rules on what is allowed in its bases argument: + * plain Generic is disallowed in bases; + * Generic[...] should appear in bases at most once; + * if Generic[...] is present, then it should list all type variables + that appear in other bases. + In addition, type of all generic bases is erased, e.g., C[int] is + stripped to plain C. + """ + + def __new__(cls, name, bases, namespace, + tvars=None, args=None, origin=None, extra=None, orig_bases=None): + """Create a new generic class. GenericMeta.__new__ accepts + keyword arguments that are used for internal bookkeeping, therefore + an override should pass unused keyword arguments to super(). + """ + if tvars is not None: + # Called from __getitem__() below. + assert origin is not None + assert all(isinstance(t, TypeVar) for t in tvars), tvars + else: + # Called from class statement. + assert tvars is None, tvars + assert args is None, args + assert origin is None, origin + + # Get the full set of tvars from the bases. + tvars = _type_vars(bases) + # Look for Generic[T1, ..., Tn]. + # If found, tvars must be a subset of it. + # If not found, tvars is it. + # Also check for and reject plain Generic, + # and reject multiple Generic[...]. + gvars = None + for base in bases: + if base is Generic: + raise TypeError("Cannot inherit from plain Generic") + if (isinstance(base, GenericMeta) and + base.__origin__ in (Generic, Protocol)): + if gvars is not None: + raise TypeError( + "Cannot inherit from Generic[...] or" + " Protocol[...] multiple times.") + gvars = base.__parameters__ + if gvars is None: + gvars = tvars + else: + tvarset = set(tvars) + gvarset = set(gvars) + if not tvarset <= gvarset: + raise TypeError( + "Some type variables (%s) " + "are not listed in %s[%s]" % + (", ".join(str(t) for t in tvars if t not in gvarset), + "Generic" if any(b.__origin__ is Generic + for b in bases) else "Protocol", + ", ".join(str(g) for g in gvars))) + tvars = gvars + + initial_bases = bases + if extra is None: + extra = namespace.get('__extra__') + if extra is not None and type(extra) is abc.ABCMeta and extra not in bases: + bases = (extra,) + bases + bases = tuple(b._gorg if isinstance(b, GenericMeta) else b for b in bases) + + # remove bare Generic from bases if there are other generic bases + if any(isinstance(b, GenericMeta) and b is not Generic for b in bases): + bases = tuple(b for b in bases if b is not Generic) + namespace.update({'__origin__': origin, '__extra__': extra}) + self = super(GenericMeta, cls).__new__(cls, name, bases, namespace) + super(GenericMeta, self).__setattr__('_gorg', + self if not origin else origin._gorg) + + self.__parameters__ = tvars + # Be prepared that GenericMeta will be subclassed by TupleMeta + # and CallableMeta, those two allow ..., (), or [] in __args___. + self.__args__ = tuple(Ellipsis if a is _TypingEllipsis else + () if a is _TypingEmpty else + a for a in args) if args else None + # Speed hack (https://github.com/python/typing/issues/196). + self.__next_in_mro__ = _next_in_mro(self) + # Preserve base classes on subclassing (__bases__ are type erased now). + if orig_bases is None: + self.__orig_bases__ = initial_bases + + # This allows unparameterized generic collections to be used + # with issubclass() and isinstance() in the same way as their + # collections.abc counterparts (e.g., isinstance([], Iterable)). + if ( + '__subclasshook__' not in namespace and extra or + # allow overriding + getattr(self.__subclasshook__, '__name__', '') == '__extrahook__' + ): + self.__subclasshook__ = _make_subclasshook(self) + + if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2. + self.__qualname__ = origin.__qualname__ + self.__tree_hash__ = (hash(self._subs_tree()) if origin else + super(GenericMeta, self).__hash__()) + return self + + def __init__(self, *args, **kwargs): + super(GenericMeta, self).__init__(*args, **kwargs) + if isinstance(self.__extra__, abc.ABCMeta): + self._abc_registry = self.__extra__._abc_registry + self._abc_cache = self.__extra__._abc_cache + elif self.__origin__ is not None: + self._abc_registry = self.__origin__._abc_registry + self._abc_cache = self.__origin__._abc_cache + + # _abc_negative_cache and _abc_negative_cache_version + # realised as descriptors, since GenClass[t1, t2, ...] always + # share subclass info with GenClass. + # This is an important memory optimization. + @property + def _abc_negative_cache(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache + return self._gorg._abc_generic_negative_cache + + @_abc_negative_cache.setter + def _abc_negative_cache(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache = value + else: + self._abc_generic_negative_cache = value + + @property + def _abc_negative_cache_version(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache_version + return self._gorg._abc_generic_negative_cache_version + + @_abc_negative_cache_version.setter + def _abc_negative_cache_version(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache_version = value + else: + self._abc_generic_negative_cache_version = value + + def _get_type_vars(self, tvars): + if self.__origin__ and self.__parameters__: + _get_type_vars(self.__parameters__, tvars) + + def _eval_type(self, globalns, localns): + ev_origin = (self.__origin__._eval_type(globalns, localns) + if self.__origin__ else None) + ev_args = tuple(_eval_type(a, globalns, localns) for a + in self.__args__) if self.__args__ else None + if ev_origin == self.__origin__ and ev_args == self.__args__: + return self + return self.__class__(self.__name__, + self.__bases__, + dict(self.__dict__), + tvars=_type_vars(ev_args) if ev_args else None, + args=ev_args, + origin=ev_origin, + extra=self.__extra__, + orig_bases=self.__orig_bases__) + + def __repr__(self): + if self.__origin__ is None: + return super(GenericMeta, self).__repr__() + return self._tree_repr(self._subs_tree()) + + def _tree_repr(self, tree): + arg_list = [] + for arg in tree[1:]: + if arg == (): + arg_list.append('()') + elif not isinstance(arg, tuple): + arg_list.append(_type_repr(arg)) + else: + arg_list.append(arg[0]._tree_repr(arg)) + return super(GenericMeta, self).__repr__() + '[%s]' % ', '.join(arg_list) + + def _subs_tree(self, tvars=None, args=None): + if self.__origin__ is None: + return self + tree_args = _subs_tree(self, tvars, args) + return (self._gorg,) + tuple(tree_args) + + def __eq__(self, other): + if not isinstance(other, GenericMeta): + return NotImplemented + if self.__origin__ is None or other.__origin__ is None: + return self is other + return self.__tree_hash__ == other.__tree_hash__ + + def __hash__(self): + return self.__tree_hash__ + + @_tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + if not params and self._gorg is not Tuple: + raise TypeError( + "Parameter list to %s[...] cannot be empty" % _qualname(self)) + msg = "Parameters to generic types must be types." + params = tuple(_type_check(p, msg) for p in params) + if self in (Generic, Protocol): + # Generic can only be subscripted with unique type variables. + if not all(isinstance(p, TypeVar) for p in params): + raise TypeError( + "Parameters to %s[...] must all be type variables" % self.__name__) + if len(set(params)) != len(params): + raise TypeError( + "Parameters to %s[...] must all be unique" % self.__name__) + tvars = params + args = params + elif self in (Tuple, Callable): + tvars = _type_vars(params) + args = params + elif self.__origin__ in (Generic, Protocol): + # Can't subscript Generic[...] or Protocol[...]. + raise TypeError("Cannot subscript already-subscripted %s" % + repr(self)) + else: + # Subscripting a regular Generic subclass. + _check_generic(self, params) + tvars = _type_vars(params) + args = params + + prepend = (self,) if self.__origin__ is None else () + return self.__class__(self.__name__, + prepend + self.__bases__, + dict(self.__dict__), + tvars=tvars, + args=args, + origin=self, + extra=self.__extra__, + orig_bases=self.__orig_bases__) + + def __subclasscheck__(self, cls): + if self.__origin__ is not None: + # These should only be modules within the standard library. + # singledispatch is an exception, because it's a Python 2 backport + # of functools.singledispatch. + whitelist = ['abc', 'functools', 'singledispatch'] + if (sys._getframe(1).f_globals['__name__'] in whitelist or + # The second frame is needed for the case where we came + # from _ProtocolMeta.__subclasscheck__. + sys._getframe(2).f_globals['__name__'] in whitelist): + return False + raise TypeError("Parameterized generics cannot be used with class " + "or instance checks") + if self is Generic: + raise TypeError("Class %r cannot be used with class " + "or instance checks" % self) + return super(GenericMeta, self).__subclasscheck__(cls) + + def __instancecheck__(self, instance): + # Since we extend ABC.__subclasscheck__ and + # ABC.__instancecheck__ inlines the cache checking done by the + # latter, we must extend __instancecheck__ too. For simplicity + # we just skip the cache check -- instance checks for generic + # classes are supposed to be rare anyways. + if hasattr(instance, "__class__"): + return issubclass(instance.__class__, self) + return False + + def __setattr__(self, attr, value): + # We consider all the subscripted genrics as proxies for original class + if ( + attr.startswith('__') and attr.endswith('__') or + attr.startswith('_abc_') + ): + super(GenericMeta, self).__setattr__(attr, value) + else: + super(GenericMeta, self._gorg).__setattr__(attr, value) + + +def _copy_generic(self): + """Hack to work around https://bugs.python.org/issue11480 on Python 2""" + return self.__class__(self.__name__, self.__bases__, dict(self.__dict__), + self.__parameters__, self.__args__, self.__origin__, + self.__extra__, self.__orig_bases__) + + +copy._copy_dispatch[GenericMeta] = _copy_generic + + +# Prevent checks for Generic to crash when defining Generic. +Generic = None + + +def _generic_new(base_cls, cls, *args, **kwds): + # Assure type is erased on instantiation, + # but attempt to store it in __orig_class__ + if cls.__origin__ is None: + if (base_cls.__new__ is object.__new__ and + cls.__init__ is not object.__init__): + return base_cls.__new__(cls) + else: + return base_cls.__new__(cls, *args, **kwds) + else: + origin = cls._gorg + if (base_cls.__new__ is object.__new__ and + cls.__init__ is not object.__init__): + obj = base_cls.__new__(origin) + else: + obj = base_cls.__new__(origin, *args, **kwds) + try: + obj.__orig_class__ = cls + except AttributeError: + pass + obj.__init__(*args, **kwds) + return obj + + +class Generic(object): + """Abstract base class for generic types. + + A generic type is typically declared by inheriting from + this class parameterized with one or more type variables. + For example, a generic mapping type might be defined as:: + + class Mapping(Generic[KT, VT]): + def __getitem__(self, key: KT) -> VT: + ... + # Etc. + + This class can then be used as follows:: + + def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: + try: + return mapping[key] + except KeyError: + return default + """ + + __metaclass__ = GenericMeta + __slots__ = () + + def __new__(cls, *args, **kwds): + if cls._gorg is Generic: + raise TypeError("Type Generic cannot be instantiated; " + "it can be used only as a base class") + return _generic_new(cls.__next_in_mro__, cls, *args, **kwds) + + +class _TypingEmpty(object): + """Internal placeholder for () or []. Used by TupleMeta and CallableMeta + to allow empty list/tuple in specific places, without allowing them + to sneak in where prohibited. + """ + + +class _TypingEllipsis(object): + """Internal placeholder for ... (ellipsis).""" + + +class TupleMeta(GenericMeta): + """Metaclass for Tuple (internal).""" + + @_tp_cache + def __getitem__(self, parameters): + if self.__origin__ is not None or self._gorg is not Tuple: + # Normal generic rules apply if this is not the first subscription + # or a subscription of a subclass. + return super(TupleMeta, self).__getitem__(parameters) + if parameters == (): + return super(TupleMeta, self).__getitem__((_TypingEmpty,)) + if not isinstance(parameters, tuple): + parameters = (parameters,) + if len(parameters) == 2 and parameters[1] is Ellipsis: + msg = "Tuple[t, ...]: t must be a type." + p = _type_check(parameters[0], msg) + return super(TupleMeta, self).__getitem__((p, _TypingEllipsis)) + msg = "Tuple[t0, t1, ...]: each t must be a type." + parameters = tuple(_type_check(p, msg) for p in parameters) + return super(TupleMeta, self).__getitem__(parameters) + + def __instancecheck__(self, obj): + if self.__args__ is None: + return isinstance(obj, tuple) + raise TypeError("Parameterized Tuple cannot be used " + "with isinstance().") + + def __subclasscheck__(self, cls): + if self.__args__ is None: + return issubclass(cls, tuple) + raise TypeError("Parameterized Tuple cannot be used " + "with issubclass().") + + +copy._copy_dispatch[TupleMeta] = _copy_generic + + +class Tuple(tuple): + """Tuple type; Tuple[X, Y] is the cross-product type of X and Y. + + Example: Tuple[T1, T2] is a tuple of two elements corresponding + to type variables T1 and T2. Tuple[int, float, str] is a tuple + of an int, a float and a string. + + To specify a variable-length tuple of homogeneous type, use Tuple[T, ...]. + """ + + __metaclass__ = TupleMeta + __extra__ = tuple + __slots__ = () + + def __new__(cls, *args, **kwds): + if cls._gorg is Tuple: + raise TypeError("Type Tuple cannot be instantiated; " + "use tuple() instead") + return _generic_new(tuple, cls, *args, **kwds) + + +class CallableMeta(GenericMeta): + """ Metaclass for Callable.""" + + def __repr__(self): + if self.__origin__ is None: + return super(CallableMeta, self).__repr__() + return self._tree_repr(self._subs_tree()) + + def _tree_repr(self, tree): + if self._gorg is not Callable: + return super(CallableMeta, self)._tree_repr(tree) + # For actual Callable (not its subclass) we override + # super(CallableMeta, self)._tree_repr() for nice formatting. + arg_list = [] + for arg in tree[1:]: + if not isinstance(arg, tuple): + arg_list.append(_type_repr(arg)) + else: + arg_list.append(arg[0]._tree_repr(arg)) + if arg_list[0] == '...': + return repr(tree[0]) + '[..., %s]' % arg_list[1] + return (repr(tree[0]) + + '[[%s], %s]' % (', '.join(arg_list[:-1]), arg_list[-1])) + + def __getitem__(self, parameters): + """A thin wrapper around __getitem_inner__ to provide the latter + with hashable arguments to improve speed. + """ + + if self.__origin__ is not None or self._gorg is not Callable: + return super(CallableMeta, self).__getitem__(parameters) + if not isinstance(parameters, tuple) or len(parameters) != 2: + raise TypeError("Callable must be used as " + "Callable[[arg, ...], result].") + args, result = parameters + if args is Ellipsis: + parameters = (Ellipsis, result) + else: + if not isinstance(args, list): + raise TypeError("Callable[args, result]: args must be a list." + " Got %.100r." % (args,)) + parameters = (tuple(args), result) + return self.__getitem_inner__(parameters) + + @_tp_cache + def __getitem_inner__(self, parameters): + args, result = parameters + msg = "Callable[args, result]: result must be a type." + result = _type_check(result, msg) + if args is Ellipsis: + return super(CallableMeta, self).__getitem__((_TypingEllipsis, result)) + msg = "Callable[[arg, ...], result]: each arg must be a type." + args = tuple(_type_check(arg, msg) for arg in args) + parameters = args + (result,) + return super(CallableMeta, self).__getitem__(parameters) + + +copy._copy_dispatch[CallableMeta] = _copy_generic + + +class Callable(object): + """Callable type; Callable[[int], str] is a function of (int) -> str. + + The subscription syntax must always be used with exactly two + values: the argument list and the return type. The argument list + must be a list of types or ellipsis; the return type must be a single type. + + There is no syntax to indicate optional or keyword arguments, + such function types are rarely used as callback types. + """ + + __metaclass__ = CallableMeta + __extra__ = collections_abc.Callable + __slots__ = () + + def __new__(cls, *args, **kwds): + if cls._gorg is Callable: + raise TypeError("Type Callable cannot be instantiated; " + "use a non-abstract subclass instead") + return _generic_new(cls.__next_in_mro__, cls, *args, **kwds) + + +def cast(typ, val): + """Cast a value to a type. + + This returns the value unchanged. To the type checker this + signals that the return value has the designated type, but at + runtime we intentionally don't check anything (we want this + to be as fast as possible). + """ + return val + + +def _get_defaults(func): + """Internal helper to extract the default arguments, by name.""" + code = func.__code__ + pos_count = code.co_argcount + arg_names = code.co_varnames + arg_names = arg_names[:pos_count] + defaults = func.__defaults__ or () + kwdefaults = func.__kwdefaults__ + res = dict(kwdefaults) if kwdefaults else {} + pos_offset = pos_count - len(defaults) + for name, value in zip(arg_names[pos_offset:], defaults): + assert name not in res + res[name] = value + return res + + +def get_type_hints(obj, globalns=None, localns=None): + """In Python 2 this is not supported and always returns None.""" + return None + + +def no_type_check(arg): + """Decorator to indicate that annotations are not type hints. + + The argument must be a class or function; if it is a class, it + applies recursively to all methods and classes defined in that class + (but not to methods defined in its superclasses or subclasses). + + This mutates the function(s) or class(es) in place. + """ + if isinstance(arg, type): + arg_attrs = arg.__dict__.copy() + for attr, val in arg.__dict__.items(): + if val in arg.__bases__ + (arg,): + arg_attrs.pop(attr) + for obj in arg_attrs.values(): + if isinstance(obj, types.FunctionType): + obj.__no_type_check__ = True + if isinstance(obj, type): + no_type_check(obj) + try: + arg.__no_type_check__ = True + except TypeError: # built-in classes + pass + return arg + + +def no_type_check_decorator(decorator): + """Decorator to give another decorator the @no_type_check effect. + + This wraps the decorator with something that wraps the decorated + function in @no_type_check. + """ + + @functools.wraps(decorator) + def wrapped_decorator(*args, **kwds): + func = decorator(*args, **kwds) + func = no_type_check(func) + return func + + return wrapped_decorator + + +def _overload_dummy(*args, **kwds): + """Helper for @overload to raise when called.""" + raise NotImplementedError( + "You should not call an overloaded function. " + "A series of @overload-decorated functions " + "outside a stub module should always be followed " + "by an implementation that is not @overload-ed.") + + +def overload(func): + """Decorator for overloaded functions/methods. + + In a stub file, place two or more stub definitions for the same + function in a row, each decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + + In a non-stub file (i.e. a regular .py file), do the same but + follow it with an implementation. The implementation should *not* + be decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + def utf8(value): + # implementation goes here + """ + return _overload_dummy + + +_PROTO_WHITELIST = ['Callable', 'Iterable', 'Iterator', + 'Hashable', 'Sized', 'Container', 'Collection', + 'Reversible', 'ContextManager'] + + +class _ProtocolMeta(GenericMeta): + """Internal metaclass for Protocol. + + This exists so Protocol classes can be generic without deriving + from Generic. + """ + def __init__(cls, *args, **kwargs): + super(_ProtocolMeta, cls).__init__(*args, **kwargs) + if not cls.__dict__.get('_is_protocol', None): + cls._is_protocol = any(b is Protocol or + isinstance(b, _ProtocolMeta) and + b.__origin__ is Protocol + for b in cls.__bases__) + if cls._is_protocol: + for base in cls.__mro__[1:]: + if not (base in (object, Generic) or + base.__module__ == '_abcoll' and + base.__name__ in _PROTO_WHITELIST or + isinstance(base, TypingMeta) and base._is_protocol or + isinstance(base, GenericMeta) and base.__origin__ is Generic): + raise TypeError('Protocols can only inherit from other protocols,' + ' got %r' % base) + cls._callable_members_only = all(callable(getattr(cls, attr)) + for attr in cls._get_protocol_attrs()) + + def _no_init(self, *args, **kwargs): + if type(self)._is_protocol: + raise TypeError('Protocols cannot be instantiated') + cls.__init__ = _no_init + + def _proto_hook(cls, other): + if not cls.__dict__.get('_is_protocol', None): + return NotImplemented + if not isinstance(other, type): + # Similar error as for issubclass(1, int) + # (also not a chance for old-style classes) + raise TypeError('issubclass() arg 1 must be a new-style class') + for attr in cls._get_protocol_attrs(): + for base in other.__mro__: + if attr in base.__dict__: + if base.__dict__[attr] is None: + return NotImplemented + break + else: + return NotImplemented + return True + if '__subclasshook__' not in cls.__dict__: + cls.__subclasshook__ = classmethod(_proto_hook) + + def __instancecheck__(self, instance): + # We need this method for situations where attributes are assigned in __init__ + if isinstance(instance, type): + # This looks like a fundamental limitation of Python 2. + # It cannot support runtime protocol metaclasses, On Python 2 classes + # cannot be correctly inspected as instances of protocols. + return False + if ((not getattr(self, '_is_protocol', False) or + self._callable_members_only) and + issubclass(instance.__class__, self)): + return True + if self._is_protocol: + if all(hasattr(instance, attr) and + (not callable(getattr(self, attr)) or + getattr(instance, attr) is not None) + for attr in self._get_protocol_attrs()): + return True + return super(GenericMeta, self).__instancecheck__(instance) + + def __subclasscheck__(self, cls): + if (self.__dict__.get('_is_protocol', None) and + not self.__dict__.get('_is_runtime_protocol', None)): + if (sys._getframe(1).f_globals['__name__'] in ['abc', 'functools'] or + # This is needed because we remove subclasses from unions on Python 2. + sys._getframe(2).f_globals['__name__'] == 'typing'): + return False + raise TypeError("Instance and class checks can only be used with" + " @runtime_checkable protocols") + if (self.__dict__.get('_is_runtime_protocol', None) and + not self._callable_members_only): + if sys._getframe(1).f_globals['__name__'] in ['abc', 'functools']: + return super(GenericMeta, self).__subclasscheck__(cls) + raise TypeError("Protocols with non-method members" + " don't support issubclass()") + return super(_ProtocolMeta, self).__subclasscheck__(cls) + + def _get_protocol_attrs(self): + attrs = set() + for base in self.__mro__[:-1]: # without object + if base.__name__ in ('Protocol', 'Generic'): + continue + annotations = getattr(base, '__annotations__', {}) + for attr in list(base.__dict__.keys()) + list(annotations.keys()): + if (not attr.startswith('_abc_') and attr not in ( + '__abstractmethods__', '__annotations__', '__weakref__', + '_is_protocol', '_is_runtime_protocol', '__dict__', + '__args__', '__slots__', '_get_protocol_attrs', + '__next_in_mro__', '__parameters__', '__origin__', + '__orig_bases__', '__extra__', '__tree_hash__', + '__doc__', '__subclasshook__', '__init__', '__new__', + '__module__', '_MutableMapping__marker', + '__metaclass__', '_gorg', '_callable_members_only')): + attrs.add(attr) + return attrs + + +class Protocol(object): + """Base class for protocol classes. Protocol classes are defined as:: + + class Proto(Protocol): + def meth(self): + # type: () -> int + pass + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self): + # type: () -> int + return 0 + + def func(x): + # type: (Proto) -> int + return x.meth() + + func(C()) # Passes static type check + + See PEP 544 for details. Protocol classes decorated with @typing.runtime_checkable + act as simple-minded runtime protocols that checks only the presence of + given attributes, ignoring their type signatures. + + Protocol classes can be generic, they are defined as:: + + class GenProto(Protocol[T]): + def meth(self): + # type: () -> T + pass + """ + + __metaclass__ = _ProtocolMeta + __slots__ = () + _is_protocol = True + + def __new__(cls, *args, **kwds): + if cls._gorg is Protocol: + raise TypeError("Type Protocol cannot be instantiated; " + "it can be used only as a base class") + return _generic_new(cls.__next_in_mro__, cls, *args, **kwds) + + +def runtime_checkable(cls): + """Mark a protocol class as a runtime protocol, so that it + can be used with isinstance() and issubclass(). Raise TypeError + if applied to a non-protocol class. + + This allows a simple-minded structural check very similar to the + one-offs in collections.abc such as Hashable. + """ + if not isinstance(cls, _ProtocolMeta) or not cls._is_protocol: + raise TypeError('@runtime_checkable can be only applied to protocol classes,' + ' got %r' % cls) + cls._is_runtime_protocol = True + return cls + + +# Various ABCs mimicking those in collections.abc. +# A few are simply re-exported for completeness. + +Hashable = collections_abc.Hashable # Not generic. + + +class Iterable(Generic[T_co]): + __slots__ = () + __extra__ = collections_abc.Iterable + + +class Iterator(Iterable[T_co]): + __slots__ = () + __extra__ = collections_abc.Iterator + + +@runtime_checkable +class SupportsInt(Protocol): + __slots__ = () + + @abstractmethod + def __int__(self): + pass + + +@runtime_checkable +class SupportsFloat(Protocol): + __slots__ = () + + @abstractmethod + def __float__(self): + pass + + +@runtime_checkable +class SupportsComplex(Protocol): + __slots__ = () + + @abstractmethod + def __complex__(self): + pass + + +@runtime_checkable +class SupportsIndex(Protocol): + __slots__ = () + + @abstractmethod + def __index__(self): + pass + + +@runtime_checkable +class SupportsAbs(Protocol[T_co]): + __slots__ = () + + @abstractmethod + def __abs__(self): + pass + + +if hasattr(collections_abc, 'Reversible'): + class Reversible(Iterable[T_co]): + __slots__ = () + __extra__ = collections_abc.Reversible +else: + @runtime_checkable + class Reversible(Protocol[T_co]): + __slots__ = () + + @abstractmethod + def __reversed__(self): + pass + + +Sized = collections_abc.Sized # Not generic. + + +class Container(Generic[T_co]): + __slots__ = () + __extra__ = collections_abc.Container + + +# Callable was defined earlier. + + +class AbstractSet(Sized, Iterable[T_co], Container[T_co]): + __slots__ = () + __extra__ = collections_abc.Set + + +class MutableSet(AbstractSet[T]): + __slots__ = () + __extra__ = collections_abc.MutableSet + + +# NOTE: It is only covariant in the value type. +class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co]): + __slots__ = () + __extra__ = collections_abc.Mapping + + +class MutableMapping(Mapping[KT, VT]): + __slots__ = () + __extra__ = collections_abc.MutableMapping + + +if hasattr(collections_abc, 'Reversible'): + class Sequence(Sized, Reversible[T_co], Container[T_co]): + __slots__ = () + __extra__ = collections_abc.Sequence +else: + class Sequence(Sized, Iterable[T_co], Container[T_co]): + __slots__ = () + __extra__ = collections_abc.Sequence + + +class MutableSequence(Sequence[T]): + __slots__ = () + __extra__ = collections_abc.MutableSequence + + +class ByteString(Sequence[int]): + pass + + +ByteString.register(str) +ByteString.register(bytearray) + + +class List(list, MutableSequence[T]): + __slots__ = () + __extra__ = list + + def __new__(cls, *args, **kwds): + if cls._gorg is List: + raise TypeError("Type List cannot be instantiated; " + "use list() instead") + return _generic_new(list, cls, *args, **kwds) + + +class Deque(collections.deque, MutableSequence[T]): + __slots__ = () + __extra__ = collections.deque + + def __new__(cls, *args, **kwds): + if cls._gorg is Deque: + return collections.deque(*args, **kwds) + return _generic_new(collections.deque, cls, *args, **kwds) + + +class Set(set, MutableSet[T]): + __slots__ = () + __extra__ = set + + def __new__(cls, *args, **kwds): + if cls._gorg is Set: + raise TypeError("Type Set cannot be instantiated; " + "use set() instead") + return _generic_new(set, cls, *args, **kwds) + + +class FrozenSet(frozenset, AbstractSet[T_co]): + __slots__ = () + __extra__ = frozenset + + def __new__(cls, *args, **kwds): + if cls._gorg is FrozenSet: + raise TypeError("Type FrozenSet cannot be instantiated; " + "use frozenset() instead") + return _generic_new(frozenset, cls, *args, **kwds) + + +class MappingView(Sized, Iterable[T_co]): + __slots__ = () + __extra__ = collections_abc.MappingView + + +class KeysView(MappingView[KT], AbstractSet[KT]): + __slots__ = () + __extra__ = collections_abc.KeysView + + +class ItemsView(MappingView[Tuple[KT, VT_co]], + AbstractSet[Tuple[KT, VT_co]], + Generic[KT, VT_co]): + __slots__ = () + __extra__ = collections_abc.ItemsView + + +class ValuesView(MappingView[VT_co]): + __slots__ = () + __extra__ = collections_abc.ValuesView + + +class ContextManager(Generic[T_co]): + __slots__ = () + + def __enter__(self): + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + return None + + @classmethod + def __subclasshook__(cls, C): + if cls is ContextManager: + # In Python 3.6+, it is possible to set a method to None to + # explicitly indicate that the class does not implement an ABC + # (https://bugs.python.org/issue25958), but we do not support + # that pattern here because this fallback class is only used + # in Python 3.5 and earlier. + if (any("__enter__" in B.__dict__ for B in C.__mro__) and + any("__exit__" in B.__dict__ for B in C.__mro__)): + return True + return NotImplemented + + +class Dict(dict, MutableMapping[KT, VT]): + __slots__ = () + __extra__ = dict + + def __new__(cls, *args, **kwds): + if cls._gorg is Dict: + raise TypeError("Type Dict cannot be instantiated; " + "use dict() instead") + return _generic_new(dict, cls, *args, **kwds) + + +class DefaultDict(collections.defaultdict, MutableMapping[KT, VT]): + __slots__ = () + __extra__ = collections.defaultdict + + def __new__(cls, *args, **kwds): + if cls._gorg is DefaultDict: + return collections.defaultdict(*args, **kwds) + return _generic_new(collections.defaultdict, cls, *args, **kwds) + + +class Counter(collections.Counter, Dict[T, int]): + __slots__ = () + __extra__ = collections.Counter + + def __new__(cls, *args, **kwds): + if cls._gorg is Counter: + return collections.Counter(*args, **kwds) + return _generic_new(collections.Counter, cls, *args, **kwds) + + +# Determine what base class to use for Generator. +if hasattr(collections_abc, 'Generator'): + # Sufficiently recent versions of 3.5 have a Generator ABC. + _G_base = collections_abc.Generator +else: + # Fall back on the exact type. + _G_base = types.GeneratorType + + +class Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]): + __slots__ = () + __extra__ = _G_base + + def __new__(cls, *args, **kwds): + if cls._gorg is Generator: + raise TypeError("Type Generator cannot be instantiated; " + "create a subclass instead") + return _generic_new(_G_base, cls, *args, **kwds) + + +# Internal type variable used for Type[]. +CT_co = TypeVar('CT_co', covariant=True, bound=type) + + +# This is not a real generic class. Don't use outside annotations. +class Type(Generic[CT_co]): + """A special construct usable to annotate class objects. + + For example, suppose we have the following classes:: + + class User: ... # Abstract base for User classes + class BasicUser(User): ... + class ProUser(User): ... + class TeamUser(User): ... + + And a function that takes a class argument that's a subclass of + User and returns an instance of the corresponding class:: + + U = TypeVar('U', bound=User) + def new_user(user_class: Type[U]) -> U: + user = user_class() + # (Here we could write the user object to a database) + return user + + joe = new_user(BasicUser) + + At this point the type checker knows that joe has type BasicUser. + """ + __slots__ = () + __extra__ = type + + +def NamedTuple(typename, fields): + """Typed version of namedtuple. + + Usage:: + + Employee = typing.NamedTuple('Employee', [('name', str), ('id', int)]) + + This is equivalent to:: + + Employee = collections.namedtuple('Employee', ['name', 'id']) + + The resulting class has one extra attribute: _field_types, + giving a dict mapping field names to types. (The field names + are in the _fields attribute, which is part of the namedtuple + API.) + """ + fields = [(n, t) for n, t in fields] + cls = collections.namedtuple(typename, [n for n, t in fields]) + cls._field_types = dict(fields) + # Set the module to the caller's module (otherwise it'd be 'typing'). + try: + cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + return cls + + +def _check_fails(cls, other): + try: + if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools', 'typing']: + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') + except (AttributeError, ValueError): + pass + return False + + +def _dict_new(cls, *args, **kwargs): + return dict(*args, **kwargs) + + +def _typeddict_new(cls, _typename, _fields=None, **kwargs): + total = kwargs.pop('total', True) + if _fields is None: + _fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + + ns = {'__annotations__': dict(_fields), '__total__': total} + try: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + + return _TypedDictMeta(_typename, (), ns) + + +class _TypedDictMeta(type): + def __new__(cls, name, bases, ns, total=True): + # Create new typed dict class object. + # This method is called directly when TypedDict is subclassed, + # or via _typeddict_new when TypedDict is instantiated. This way + # TypedDict supports all three syntaxes described in its docstring. + # Subclasses and instances of TypedDict return actual dictionaries + # via _dict_new. + ns['__new__'] = _typeddict_new if name == b'TypedDict' else _dict_new + tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) + + anns = ns.get('__annotations__', {}) + msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" + anns = {n: _type_check(tp, msg) for n, tp in anns.items()} + for base in bases: + anns.update(base.__dict__.get('__annotations__', {})) + tp_dict.__annotations__ = anns + if not hasattr(tp_dict, '__total__'): + tp_dict.__total__ = total + return tp_dict + + __instancecheck__ = __subclasscheck__ = _check_fails + + +TypedDict = _TypedDictMeta(b'TypedDict', (dict,), {}) +TypedDict.__module__ = __name__ +TypedDict.__doc__ = \ + """A simple typed name space. At runtime it is equivalent to a plain dict. + + TypedDict creates a dictionary type that expects all of its + instances to have a certain set of keys, with each key + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info could be accessed via Point2D.__annotations__. TypedDict + supports an additional equivalent form:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + """ + + +def NewType(name, tp): + """NewType creates simple unique types with almost zero + runtime overhead. NewType(name, tp) is considered a subtype of tp + by static type checkers. At runtime, NewType(name, tp) returns + a dummy function that simply returns its argument. Usage:: + + UserId = NewType('UserId', int) + + def name_by_id(user_id): + # type: (UserId) -> str + ... + + UserId('user') # Fails type check + + name_by_id(42) # Fails type check + name_by_id(UserId(42)) # OK + + num = UserId(5) + 1 # type: int + """ + + def new_type(x): + return x + + # Some versions of Python 2 complain because of making all strings unicode + new_type.__name__ = str(name) + new_type.__supertype__ = tp + return new_type + + +# Python-version-specific alias (Python 2: unicode; Python 3: str) +Text = unicode + + +# Constant that's True when type checking, but False here. +TYPE_CHECKING = False + + +class IO(Generic[AnyStr]): + """Generic base class for TextIO and BinaryIO. + + This is an abstract, generic version of the return of open(). + + NOTE: This does not distinguish between the different possible + classes (text vs. binary, read vs. write vs. read/write, + append-only, unbuffered). The TextIO and BinaryIO subclasses + below capture the distinctions between text vs. binary, which is + pervasive in the interface; however we currently do not offer a + way to track the other distinctions in the type system. + """ + + __slots__ = () + + @abstractproperty + def mode(self): + pass + + @abstractproperty + def name(self): + pass + + @abstractmethod + def close(self): + pass + + @abstractproperty + def closed(self): + pass + + @abstractmethod + def fileno(self): + pass + + @abstractmethod + def flush(self): + pass + + @abstractmethod + def isatty(self): + pass + + @abstractmethod + def read(self, n=-1): + pass + + @abstractmethod + def readable(self): + pass + + @abstractmethod + def readline(self, limit=-1): + pass + + @abstractmethod + def readlines(self, hint=-1): + pass + + @abstractmethod + def seek(self, offset, whence=0): + pass + + @abstractmethod + def seekable(self): + pass + + @abstractmethod + def tell(self): + pass + + @abstractmethod + def truncate(self, size=None): + pass + + @abstractmethod + def writable(self): + pass + + @abstractmethod + def write(self, s): + pass + + @abstractmethod + def writelines(self, lines): + pass + + @abstractmethod + def __enter__(self): + pass + + @abstractmethod + def __exit__(self, type, value, traceback): + pass + + +class BinaryIO(IO[bytes]): + """Typed version of the return of open() in binary mode.""" + + __slots__ = () + + @abstractmethod + def write(self, s): + pass + + @abstractmethod + def __enter__(self): + pass + + +class TextIO(IO[unicode]): + """Typed version of the return of open() in text mode.""" + + __slots__ = () + + @abstractproperty + def buffer(self): + pass + + @abstractproperty + def encoding(self): + pass + + @abstractproperty + def errors(self): + pass + + @abstractproperty + def line_buffering(self): + pass + + @abstractproperty + def newlines(self): + pass + + @abstractmethod + def __enter__(self): + pass + + +class io(object): + """Wrapper namespace for IO generic classes.""" + + __all__ = ['IO', 'TextIO', 'BinaryIO'] + IO = IO + TextIO = TextIO + BinaryIO = BinaryIO + + +io.__name__ = __name__ + b'.io' +sys.modules[io.__name__] = io + + +Pattern = _TypeAlias('Pattern', AnyStr, type(stdlib_re.compile('')), + lambda p: p.pattern) +Match = _TypeAlias('Match', AnyStr, type(stdlib_re.match('', '')), + lambda m: m.re.pattern) + + +class re(object): + """Wrapper namespace for re type aliases.""" + + __all__ = ['Pattern', 'Match'] + Pattern = Pattern + Match = Match + + +re.__name__ = __name__ + b'.re' +sys.modules[re.__name__] = re diff --git a/Contents/Libraries/Shared/tzlocal/__init__.py b/Contents/Libraries/Shared/tzlocal/__init__.py new file mode 100644 index 000000000..c8196d66d --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/__init__.py @@ -0,0 +1,5 @@ +import sys +if sys.platform == 'win32': + from tzlocal.win32 import get_localzone, reload_localzone +else: + from tzlocal.unix import get_localzone, reload_localzone diff --git a/Contents/Libraries/Shared/tzlocal/unix.py b/Contents/Libraries/Shared/tzlocal/unix.py new file mode 100644 index 000000000..ad944454e --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/unix.py @@ -0,0 +1,164 @@ +import os +import pytz +import re + +from tzlocal import utils + +_cache_tz = None + + +def _tz_from_env(tzenv): + if tzenv[0] == ':': + tzenv = tzenv[1:] + + # TZ specifies a file + if os.path.exists(tzenv): + with open(tzenv, 'rb') as tzfile: + return pytz.tzfile.build_tzinfo('local', tzfile) + + # TZ specifies a zoneinfo zone. + try: + tz = pytz.timezone(tzenv) + # That worked, so we return this: + return tz + except pytz.UnknownTimeZoneError: + raise pytz.UnknownTimeZoneError( + "tzlocal() does not support non-zoneinfo timezones like %s. \n" + "Please use a timezone in the form of Continent/City") + + +def _try_tz_from_env(): + tzenv = os.environ.get('TZ') + if tzenv: + try: + return _tz_from_env(tzenv) + except pytz.UnknownTimeZoneError: + pass + + +def _get_localzone(_root='/'): + """Tries to find the local timezone configuration. + + This method prefers finding the timezone name and passing that to pytz, + over passing in the localtime file, as in the later case the zoneinfo + name is unknown. + + The parameter _root makes the function look for files like /etc/localtime + beneath the _root directory. This is primarily used by the tests. + In normal usage you call the function without parameters.""" + + tzenv = _try_tz_from_env() + if tzenv: + return tzenv + + # Now look for distribution specific configuration files + # that contain the timezone name. + for configfile in ('etc/timezone', 'var/db/zoneinfo'): + tzpath = os.path.join(_root, configfile) + try: + with open(tzpath, 'rb') as tzfile: + data = tzfile.read() + + # Issue #3 was that /etc/timezone was a zoneinfo file. + # That's a misconfiguration, but we need to handle it gracefully: + if data[:5] == b'TZif2': + continue + + etctz = data.strip().decode() + if not etctz: + # Empty file, skip + continue + for etctz in data.decode().splitlines(): + # Get rid of host definitions and comments: + if ' ' in etctz: + etctz, dummy = etctz.split(' ', 1) + if '#' in etctz: + etctz, dummy = etctz.split('#', 1) + if not etctz: + continue + return pytz.timezone(etctz.replace(' ', '_')) + except IOError: + # File doesn't exist or is a directory + continue + + # CentOS has a ZONE setting in /etc/sysconfig/clock, + # OpenSUSE has a TIMEZONE setting in /etc/sysconfig/clock and + # Gentoo has a TIMEZONE setting in /etc/conf.d/clock + # We look through these files for a timezone: + + zone_re = re.compile(r'\s*ZONE\s*=\s*\"') + timezone_re = re.compile(r'\s*TIMEZONE\s*=\s*\"') + end_re = re.compile('\"') + + for filename in ('etc/sysconfig/clock', 'etc/conf.d/clock'): + tzpath = os.path.join(_root, filename) + try: + with open(tzpath, 'rt') as tzfile: + data = tzfile.readlines() + + for line in data: + # Look for the ZONE= setting. + match = zone_re.match(line) + if match is None: + # No ZONE= setting. Look for the TIMEZONE= setting. + match = timezone_re.match(line) + if match is not None: + # Some setting existed + line = line[match.end():] + etctz = line[:end_re.search(line).start()] + + # We found a timezone + return pytz.timezone(etctz.replace(' ', '_')) + except IOError: + # File doesn't exist or is a directory + continue + + # systemd distributions use symlinks that include the zone name, + # see manpage of localtime(5) and timedatectl(1) + tzpath = os.path.join(_root, 'etc/localtime') + if os.path.exists(tzpath) and os.path.islink(tzpath): + tzpath = os.path.realpath(tzpath) + start = tzpath.find("/")+1 + while start is not 0: + tzpath = tzpath[start:] + try: + return pytz.timezone(tzpath) + except pytz.UnknownTimeZoneError: + pass + start = tzpath.find("/")+1 + + # Are we under Termux on Android? It's not officially supported, because + # there is no reasonable way to run tests for this, but let's make an effort. + if os.path.exists('/system/bin/getprop'): + import subprocess + androidtz = subprocess.check_output(['getprop', 'persist.sys.timezone']) + return pytz.timezone(androidtz.strip().decode()) + + # No explicit setting existed. Use localtime + for filename in ('etc/localtime', 'usr/local/etc/localtime'): + tzpath = os.path.join(_root, filename) + + if not os.path.exists(tzpath): + continue + with open(tzpath, 'rb') as tzfile: + return pytz.tzfile.build_tzinfo('local', tzfile) + + raise pytz.UnknownTimeZoneError('Can not find any timezone configuration') + + +def get_localzone(): + """Get the computers configured local timezone, if any.""" + global _cache_tz + if _cache_tz is None: + _cache_tz = _get_localzone() + + utils.assert_tz_offset(_cache_tz) + return _cache_tz + + +def reload_localzone(): + """Reload the cached localzone. You need to call this if the timezone has changed.""" + global _cache_tz + _cache_tz = _get_localzone() + utils.assert_tz_offset(_cache_tz) + return _cache_tz diff --git a/Contents/Libraries/Shared/tzlocal/utils.py b/Contents/Libraries/Shared/tzlocal/utils.py new file mode 100644 index 000000000..bd9d663e8 --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/utils.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +import datetime + + +def get_system_offset(): + """Get system's timezone offset using built-in library time. + + For the Timezone constants (altzone, daylight, timezone, and tzname), the + value is determined by the timezone rules in effect at module load time or + the last time tzset() is called and may be incorrect for times in the past. + + To keep compatibility with Windows, we're always importing time module here. + """ + import time + if time.daylight and time.localtime().tm_isdst > 0: + return -time.altzone + else: + return -time.timezone + + +def get_tz_offset(tz): + """Get timezone's offset using built-in function datetime.utcoffset().""" + return int(datetime.datetime.now(tz).utcoffset().total_seconds()) + + +def assert_tz_offset(tz): + """Assert that system's timezone offset equals to the timezone offset found. + + If they don't match, we probably have a misconfiguration, for example, an + incorrect timezone set in /etc/timezone file in systemd distributions.""" + tz_offset = get_tz_offset(tz) + system_offset = get_system_offset() + if tz_offset != system_offset: + msg = ('Timezone offset does not match system offset: {0} != {1}. ' + 'Please, check your config files.').format( + tz_offset, system_offset + ) + raise ValueError(msg) diff --git a/Contents/Libraries/Shared/tzlocal/win32.py b/Contents/Libraries/Shared/tzlocal/win32.py new file mode 100644 index 000000000..fcc42a23f --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/win32.py @@ -0,0 +1,104 @@ +try: + import _winreg as winreg +except ImportError: + import winreg + +import pytz + +from tzlocal.windows_tz import win_tz +from tzlocal import utils + +_cache_tz = None + + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dict = {} + size = winreg.QueryInfoKey(key)[1] + for i in range(size): + data = winreg.EnumValue(key, i) + dict[data[0]] = data[1] + return dict + + +def get_localzone_name(): + # Windows is special. It has unique time zone names (in several + # meanings of the word) available, but unfortunately, they can be + # translated to the language of the operating system, so we need to + # do a backwards lookup, by going through all time zones and see which + # one matches. + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + + TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + localtz = winreg.OpenKey(handle, TZLOCALKEYNAME) + keyvalues = valuestodict(localtz) + localtz.Close() + + if 'TimeZoneKeyName' in keyvalues: + # Windows 7 (and Vista?) + + # For some reason this returns a string with loads of NUL bytes at + # least on some systems. I don't know if this is a bug somewhere, I + # just work around it. + tzkeyname = keyvalues['TimeZoneKeyName'].split('\x00', 1)[0] + else: + # Windows 2000 or XP + + # This is the localized name: + tzwin = keyvalues['StandardName'] + + # Open the list of timezones to look up the real name: + TZKEYNAME = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" + tzkey = winreg.OpenKey(handle, TZKEYNAME) + + # Now, match this value to Time Zone information + tzkeyname = None + for i in range(winreg.QueryInfoKey(tzkey)[0]): + subkey = winreg.EnumKey(tzkey, i) + sub = winreg.OpenKey(tzkey, subkey) + data = valuestodict(sub) + sub.Close() + try: + if data['Std'] == tzwin: + tzkeyname = subkey + break + except KeyError: + # This timezone didn't have proper configuration. + # Ignore it. + pass + + tzkey.Close() + handle.Close() + + if tzkeyname is None: + raise LookupError('Can not find Windows timezone configuration') + + timezone = win_tz.get(tzkeyname) + if timezone is None: + # Nope, that didn't work. Try adding "Standard Time", + # it seems to work a lot of times: + timezone = win_tz.get(tzkeyname + " Standard Time") + + # Return what we have. + if timezone is None: + raise pytz.UnknownTimeZoneError('Can not find timezone ' + tzkeyname) + + return timezone + + +def get_localzone(): + """Returns the zoneinfo-based tzinfo object that matches the Windows-configured timezone.""" + global _cache_tz + if _cache_tz is None: + _cache_tz = pytz.timezone(get_localzone_name()) + + utils.assert_tz_offset(_cache_tz) + return _cache_tz + + +def reload_localzone(): + """Reload the cached localzone. You need to call this if the timezone has changed.""" + global _cache_tz + _cache_tz = pytz.timezone(get_localzone_name()) + utils.assert_tz_offset(_cache_tz) + return _cache_tz diff --git a/Contents/Libraries/Shared/tzlocal/windows_tz.py b/Contents/Libraries/Shared/tzlocal/windows_tz.py new file mode 100644 index 000000000..60f9ff5eb --- /dev/null +++ b/Contents/Libraries/Shared/tzlocal/windows_tz.py @@ -0,0 +1,693 @@ +# This file is autogenerated by the update_windows_mapping.py script +# Do not edit. +win_tz = {'AUS Central Standard Time': 'Australia/Darwin', + 'AUS Eastern Standard Time': 'Australia/Sydney', + 'Afghanistan Standard Time': 'Asia/Kabul', + 'Alaskan Standard Time': 'America/Anchorage', + 'Aleutian Standard Time': 'America/Adak', + 'Altai Standard Time': 'Asia/Barnaul', + 'Arab Standard Time': 'Asia/Riyadh', + 'Arabian Standard Time': 'Asia/Dubai', + 'Arabic Standard Time': 'Asia/Baghdad', + 'Argentina Standard Time': 'America/Buenos_Aires', + 'Astrakhan Standard Time': 'Europe/Astrakhan', + 'Atlantic Standard Time': 'America/Halifax', + 'Aus Central W. Standard Time': 'Australia/Eucla', + 'Azerbaijan Standard Time': 'Asia/Baku', + 'Azores Standard Time': 'Atlantic/Azores', + 'Bahia Standard Time': 'America/Bahia', + 'Bangladesh Standard Time': 'Asia/Dhaka', + 'Belarus Standard Time': 'Europe/Minsk', + 'Bougainville Standard Time': 'Pacific/Bougainville', + 'Canada Central Standard Time': 'America/Regina', + 'Cape Verde Standard Time': 'Atlantic/Cape_Verde', + 'Caucasus Standard Time': 'Asia/Yerevan', + 'Cen. Australia Standard Time': 'Australia/Adelaide', + 'Central America Standard Time': 'America/Guatemala', + 'Central Asia Standard Time': 'Asia/Almaty', + 'Central Brazilian Standard Time': 'America/Cuiaba', + 'Central Europe Standard Time': 'Europe/Budapest', + 'Central European Standard Time': 'Europe/Warsaw', + 'Central Pacific Standard Time': 'Pacific/Guadalcanal', + 'Central Standard Time': 'America/Chicago', + 'Central Standard Time (Mexico)': 'America/Mexico_City', + 'Chatham Islands Standard Time': 'Pacific/Chatham', + 'China Standard Time': 'Asia/Shanghai', + 'Cuba Standard Time': 'America/Havana', + 'Dateline Standard Time': 'Etc/GMT+12', + 'E. Africa Standard Time': 'Africa/Nairobi', + 'E. Australia Standard Time': 'Australia/Brisbane', + 'E. Europe Standard Time': 'Europe/Chisinau', + 'E. South America Standard Time': 'America/Sao_Paulo', + 'Easter Island Standard Time': 'Pacific/Easter', + 'Eastern Standard Time': 'America/New_York', + 'Eastern Standard Time (Mexico)': 'America/Cancun', + 'Egypt Standard Time': 'Africa/Cairo', + 'Ekaterinburg Standard Time': 'Asia/Yekaterinburg', + 'FLE Standard Time': 'Europe/Kiev', + 'Fiji Standard Time': 'Pacific/Fiji', + 'GMT Standard Time': 'Europe/London', + 'GTB Standard Time': 'Europe/Bucharest', + 'Georgian Standard Time': 'Asia/Tbilisi', + 'Greenland Standard Time': 'America/Godthab', + 'Greenwich Standard Time': 'Atlantic/Reykjavik', + 'Haiti Standard Time': 'America/Port-au-Prince', + 'Hawaiian Standard Time': 'Pacific/Honolulu', + 'India Standard Time': 'Asia/Calcutta', + 'Iran Standard Time': 'Asia/Tehran', + 'Israel Standard Time': 'Asia/Jerusalem', + 'Jordan Standard Time': 'Asia/Amman', + 'Kaliningrad Standard Time': 'Europe/Kaliningrad', + 'Korea Standard Time': 'Asia/Seoul', + 'Libya Standard Time': 'Africa/Tripoli', + 'Line Islands Standard Time': 'Pacific/Kiritimati', + 'Lord Howe Standard Time': 'Australia/Lord_Howe', + 'Magadan Standard Time': 'Asia/Magadan', + 'Magallanes Standard Time': 'America/Punta_Arenas', + 'Marquesas Standard Time': 'Pacific/Marquesas', + 'Mauritius Standard Time': 'Indian/Mauritius', + 'Middle East Standard Time': 'Asia/Beirut', + 'Montevideo Standard Time': 'America/Montevideo', + 'Morocco Standard Time': 'Africa/Casablanca', + 'Mountain Standard Time': 'America/Denver', + 'Mountain Standard Time (Mexico)': 'America/Chihuahua', + 'Myanmar Standard Time': 'Asia/Rangoon', + 'N. Central Asia Standard Time': 'Asia/Novosibirsk', + 'Namibia Standard Time': 'Africa/Windhoek', + 'Nepal Standard Time': 'Asia/Katmandu', + 'New Zealand Standard Time': 'Pacific/Auckland', + 'Newfoundland Standard Time': 'America/St_Johns', + 'Norfolk Standard Time': 'Pacific/Norfolk', + 'North Asia East Standard Time': 'Asia/Irkutsk', + 'North Asia Standard Time': 'Asia/Krasnoyarsk', + 'North Korea Standard Time': 'Asia/Pyongyang', + 'Omsk Standard Time': 'Asia/Omsk', + 'Pacific SA Standard Time': 'America/Santiago', + 'Pacific Standard Time': 'America/Los_Angeles', + 'Pacific Standard Time (Mexico)': 'America/Tijuana', + 'Pakistan Standard Time': 'Asia/Karachi', + 'Paraguay Standard Time': 'America/Asuncion', + 'Romance Standard Time': 'Europe/Paris', + 'Russia Time Zone 10': 'Asia/Srednekolymsk', + 'Russia Time Zone 11': 'Asia/Kamchatka', + 'Russia Time Zone 3': 'Europe/Samara', + 'Russian Standard Time': 'Europe/Moscow', + 'SA Eastern Standard Time': 'America/Cayenne', + 'SA Pacific Standard Time': 'America/Bogota', + 'SA Western Standard Time': 'America/La_Paz', + 'SE Asia Standard Time': 'Asia/Bangkok', + 'Saint Pierre Standard Time': 'America/Miquelon', + 'Sakhalin Standard Time': 'Asia/Sakhalin', + 'Samoa Standard Time': 'Pacific/Apia', + 'Sao Tome Standard Time': 'Africa/Sao_Tome', + 'Saratov Standard Time': 'Europe/Saratov', + 'Singapore Standard Time': 'Asia/Singapore', + 'South Africa Standard Time': 'Africa/Johannesburg', + 'Sri Lanka Standard Time': 'Asia/Colombo', + 'Sudan Standard Time': 'Africa/Khartoum', + 'Syria Standard Time': 'Asia/Damascus', + 'Taipei Standard Time': 'Asia/Taipei', + 'Tasmania Standard Time': 'Australia/Hobart', + 'Tocantins Standard Time': 'America/Araguaina', + 'Tokyo Standard Time': 'Asia/Tokyo', + 'Tomsk Standard Time': 'Asia/Tomsk', + 'Tonga Standard Time': 'Pacific/Tongatapu', + 'Transbaikal Standard Time': 'Asia/Chita', + 'Turkey Standard Time': 'Europe/Istanbul', + 'Turks And Caicos Standard Time': 'America/Grand_Turk', + 'US Eastern Standard Time': 'America/Indianapolis', + 'US Mountain Standard Time': 'America/Phoenix', + 'UTC': 'Etc/GMT', + 'UTC+12': 'Etc/GMT-12', + 'UTC+13': 'Etc/GMT-13', + 'UTC-02': 'Etc/GMT+2', + 'UTC-08': 'Etc/GMT+8', + 'UTC-09': 'Etc/GMT+9', + 'UTC-11': 'Etc/GMT+11', + 'Ulaanbaatar Standard Time': 'Asia/Ulaanbaatar', + 'Venezuela Standard Time': 'America/Caracas', + 'Vladivostok Standard Time': 'Asia/Vladivostok', + 'W. Australia Standard Time': 'Australia/Perth', + 'W. Central Africa Standard Time': 'Africa/Lagos', + 'W. Europe Standard Time': 'Europe/Berlin', + 'W. Mongolia Standard Time': 'Asia/Hovd', + 'West Asia Standard Time': 'Asia/Tashkent', + 'West Bank Standard Time': 'Asia/Hebron', + 'West Pacific Standard Time': 'Pacific/Port_Moresby', + 'Yakutsk Standard Time': 'Asia/Yakutsk'} + +# Old name for the win_tz variable: +tz_names = win_tz + +tz_win = {'Africa/Abidjan': 'Greenwich Standard Time', + 'Africa/Accra': 'Greenwich Standard Time', + 'Africa/Addis_Ababa': 'E. Africa Standard Time', + 'Africa/Algiers': 'W. Central Africa Standard Time', + 'Africa/Asmera': 'E. Africa Standard Time', + 'Africa/Bamako': 'Greenwich Standard Time', + 'Africa/Bangui': 'W. Central Africa Standard Time', + 'Africa/Banjul': 'Greenwich Standard Time', + 'Africa/Bissau': 'Greenwich Standard Time', + 'Africa/Blantyre': 'South Africa Standard Time', + 'Africa/Brazzaville': 'W. Central Africa Standard Time', + 'Africa/Bujumbura': 'South Africa Standard Time', + 'Africa/Cairo': 'Egypt Standard Time', + 'Africa/Casablanca': 'Morocco Standard Time', + 'Africa/Ceuta': 'Romance Standard Time', + 'Africa/Conakry': 'Greenwich Standard Time', + 'Africa/Dakar': 'Greenwich Standard Time', + 'Africa/Dar_es_Salaam': 'E. Africa Standard Time', + 'Africa/Djibouti': 'E. Africa Standard Time', + 'Africa/Douala': 'W. Central Africa Standard Time', + 'Africa/El_Aaiun': 'Morocco Standard Time', + 'Africa/Freetown': 'Greenwich Standard Time', + 'Africa/Gaborone': 'South Africa Standard Time', + 'Africa/Harare': 'South Africa Standard Time', + 'Africa/Johannesburg': 'South Africa Standard Time', + 'Africa/Juba': 'E. Africa Standard Time', + 'Africa/Kampala': 'E. Africa Standard Time', + 'Africa/Khartoum': 'Sudan Standard Time', + 'Africa/Kigali': 'South Africa Standard Time', + 'Africa/Kinshasa': 'W. Central Africa Standard Time', + 'Africa/Lagos': 'W. Central Africa Standard Time', + 'Africa/Libreville': 'W. Central Africa Standard Time', + 'Africa/Lome': 'Greenwich Standard Time', + 'Africa/Luanda': 'W. Central Africa Standard Time', + 'Africa/Lubumbashi': 'South Africa Standard Time', + 'Africa/Lusaka': 'South Africa Standard Time', + 'Africa/Malabo': 'W. Central Africa Standard Time', + 'Africa/Maputo': 'South Africa Standard Time', + 'Africa/Maseru': 'South Africa Standard Time', + 'Africa/Mbabane': 'South Africa Standard Time', + 'Africa/Mogadishu': 'E. Africa Standard Time', + 'Africa/Monrovia': 'Greenwich Standard Time', + 'Africa/Nairobi': 'E. Africa Standard Time', + 'Africa/Ndjamena': 'W. Central Africa Standard Time', + 'Africa/Niamey': 'W. Central Africa Standard Time', + 'Africa/Nouakchott': 'Greenwich Standard Time', + 'Africa/Ouagadougou': 'Greenwich Standard Time', + 'Africa/Porto-Novo': 'W. Central Africa Standard Time', + 'Africa/Sao_Tome': 'Sao Tome Standard Time', + 'Africa/Timbuktu': 'Greenwich Standard Time', + 'Africa/Tripoli': 'Libya Standard Time', + 'Africa/Tunis': 'W. Central Africa Standard Time', + 'Africa/Windhoek': 'Namibia Standard Time', + 'America/Adak': 'Aleutian Standard Time', + 'America/Anchorage': 'Alaskan Standard Time', + 'America/Anguilla': 'SA Western Standard Time', + 'America/Antigua': 'SA Western Standard Time', + 'America/Araguaina': 'Tocantins Standard Time', + 'America/Argentina/La_Rioja': 'Argentina Standard Time', + 'America/Argentina/Rio_Gallegos': 'Argentina Standard Time', + 'America/Argentina/Salta': 'Argentina Standard Time', + 'America/Argentina/San_Juan': 'Argentina Standard Time', + 'America/Argentina/San_Luis': 'Argentina Standard Time', + 'America/Argentina/Tucuman': 'Argentina Standard Time', + 'America/Argentina/Ushuaia': 'Argentina Standard Time', + 'America/Aruba': 'SA Western Standard Time', + 'America/Asuncion': 'Paraguay Standard Time', + 'America/Atka': 'Aleutian Standard Time', + 'America/Bahia': 'Bahia Standard Time', + 'America/Bahia_Banderas': 'Central Standard Time (Mexico)', + 'America/Barbados': 'SA Western Standard Time', + 'America/Belem': 'SA Eastern Standard Time', + 'America/Belize': 'Central America Standard Time', + 'America/Blanc-Sablon': 'SA Western Standard Time', + 'America/Boa_Vista': 'SA Western Standard Time', + 'America/Bogota': 'SA Pacific Standard Time', + 'America/Boise': 'Mountain Standard Time', + 'America/Buenos_Aires': 'Argentina Standard Time', + 'America/Cambridge_Bay': 'Mountain Standard Time', + 'America/Campo_Grande': 'Central Brazilian Standard Time', + 'America/Cancun': 'Eastern Standard Time (Mexico)', + 'America/Caracas': 'Venezuela Standard Time', + 'America/Catamarca': 'Argentina Standard Time', + 'America/Cayenne': 'SA Eastern Standard Time', + 'America/Cayman': 'SA Pacific Standard Time', + 'America/Chicago': 'Central Standard Time', + 'America/Chihuahua': 'Mountain Standard Time (Mexico)', + 'America/Coral_Harbour': 'SA Pacific Standard Time', + 'America/Cordoba': 'Argentina Standard Time', + 'America/Costa_Rica': 'Central America Standard Time', + 'America/Creston': 'US Mountain Standard Time', + 'America/Cuiaba': 'Central Brazilian Standard Time', + 'America/Curacao': 'SA Western Standard Time', + 'America/Danmarkshavn': 'UTC', + 'America/Dawson': 'Pacific Standard Time', + 'America/Dawson_Creek': 'US Mountain Standard Time', + 'America/Denver': 'Mountain Standard Time', + 'America/Detroit': 'Eastern Standard Time', + 'America/Dominica': 'SA Western Standard Time', + 'America/Edmonton': 'Mountain Standard Time', + 'America/Eirunepe': 'SA Pacific Standard Time', + 'America/El_Salvador': 'Central America Standard Time', + 'America/Ensenada': 'Pacific Standard Time (Mexico)', + 'America/Fort_Nelson': 'US Mountain Standard Time', + 'America/Fortaleza': 'SA Eastern Standard Time', + 'America/Glace_Bay': 'Atlantic Standard Time', + 'America/Godthab': 'Greenland Standard Time', + 'America/Goose_Bay': 'Atlantic Standard Time', + 'America/Grand_Turk': 'Turks And Caicos Standard Time', + 'America/Grenada': 'SA Western Standard Time', + 'America/Guadeloupe': 'SA Western Standard Time', + 'America/Guatemala': 'Central America Standard Time', + 'America/Guayaquil': 'SA Pacific Standard Time', + 'America/Guyana': 'SA Western Standard Time', + 'America/Halifax': 'Atlantic Standard Time', + 'America/Havana': 'Cuba Standard Time', + 'America/Hermosillo': 'US Mountain Standard Time', + 'America/Indiana/Knox': 'Central Standard Time', + 'America/Indiana/Marengo': 'US Eastern Standard Time', + 'America/Indiana/Petersburg': 'Eastern Standard Time', + 'America/Indiana/Tell_City': 'Central Standard Time', + 'America/Indiana/Vevay': 'US Eastern Standard Time', + 'America/Indiana/Vincennes': 'Eastern Standard Time', + 'America/Indiana/Winamac': 'Eastern Standard Time', + 'America/Indianapolis': 'US Eastern Standard Time', + 'America/Inuvik': 'Mountain Standard Time', + 'America/Iqaluit': 'Eastern Standard Time', + 'America/Jamaica': 'SA Pacific Standard Time', + 'America/Jujuy': 'Argentina Standard Time', + 'America/Juneau': 'Alaskan Standard Time', + 'America/Kentucky/Monticello': 'Eastern Standard Time', + 'America/Knox_IN': 'Central Standard Time', + 'America/Kralendijk': 'SA Western Standard Time', + 'America/La_Paz': 'SA Western Standard Time', + 'America/Lima': 'SA Pacific Standard Time', + 'America/Los_Angeles': 'Pacific Standard Time', + 'America/Louisville': 'Eastern Standard Time', + 'America/Lower_Princes': 'SA Western Standard Time', + 'America/Maceio': 'SA Eastern Standard Time', + 'America/Managua': 'Central America Standard Time', + 'America/Manaus': 'SA Western Standard Time', + 'America/Marigot': 'SA Western Standard Time', + 'America/Martinique': 'SA Western Standard Time', + 'America/Matamoros': 'Central Standard Time', + 'America/Mazatlan': 'Mountain Standard Time (Mexico)', + 'America/Mendoza': 'Argentina Standard Time', + 'America/Menominee': 'Central Standard Time', + 'America/Merida': 'Central Standard Time (Mexico)', + 'America/Metlakatla': 'Pacific Standard Time', + 'America/Mexico_City': 'Central Standard Time (Mexico)', + 'America/Miquelon': 'Saint Pierre Standard Time', + 'America/Moncton': 'Atlantic Standard Time', + 'America/Monterrey': 'Central Standard Time (Mexico)', + 'America/Montevideo': 'Montevideo Standard Time', + 'America/Montreal': 'Eastern Standard Time', + 'America/Montserrat': 'SA Western Standard Time', + 'America/Nassau': 'Eastern Standard Time', + 'America/New_York': 'Eastern Standard Time', + 'America/Nipigon': 'Eastern Standard Time', + 'America/Nome': 'Alaskan Standard Time', + 'America/Noronha': 'UTC-02', + 'America/North_Dakota/Beulah': 'Central Standard Time', + 'America/North_Dakota/Center': 'Central Standard Time', + 'America/North_Dakota/New_Salem': 'Central Standard Time', + 'America/Ojinaga': 'Mountain Standard Time', + 'America/Panama': 'SA Pacific Standard Time', + 'America/Pangnirtung': 'Eastern Standard Time', + 'America/Paramaribo': 'SA Eastern Standard Time', + 'America/Phoenix': 'US Mountain Standard Time', + 'America/Port-au-Prince': 'Haiti Standard Time', + 'America/Port_of_Spain': 'SA Western Standard Time', + 'America/Porto_Acre': 'SA Pacific Standard Time', + 'America/Porto_Velho': 'SA Western Standard Time', + 'America/Puerto_Rico': 'SA Western Standard Time', + 'America/Punta_Arenas': 'Magallanes Standard Time', + 'America/Rainy_River': 'Central Standard Time', + 'America/Rankin_Inlet': 'Central Standard Time', + 'America/Recife': 'SA Eastern Standard Time', + 'America/Regina': 'Canada Central Standard Time', + 'America/Resolute': 'Central Standard Time', + 'America/Rio_Branco': 'SA Pacific Standard Time', + 'America/Santa_Isabel': 'Pacific Standard Time (Mexico)', + 'America/Santarem': 'SA Eastern Standard Time', + 'America/Santiago': 'Pacific SA Standard Time', + 'America/Santo_Domingo': 'SA Western Standard Time', + 'America/Sao_Paulo': 'E. South America Standard Time', + 'America/Scoresbysund': 'Azores Standard Time', + 'America/Shiprock': 'Mountain Standard Time', + 'America/Sitka': 'Alaskan Standard Time', + 'America/St_Barthelemy': 'SA Western Standard Time', + 'America/St_Johns': 'Newfoundland Standard Time', + 'America/St_Kitts': 'SA Western Standard Time', + 'America/St_Lucia': 'SA Western Standard Time', + 'America/St_Thomas': 'SA Western Standard Time', + 'America/St_Vincent': 'SA Western Standard Time', + 'America/Swift_Current': 'Canada Central Standard Time', + 'America/Tegucigalpa': 'Central America Standard Time', + 'America/Thule': 'Atlantic Standard Time', + 'America/Thunder_Bay': 'Eastern Standard Time', + 'America/Tijuana': 'Pacific Standard Time (Mexico)', + 'America/Toronto': 'Eastern Standard Time', + 'America/Tortola': 'SA Western Standard Time', + 'America/Vancouver': 'Pacific Standard Time', + 'America/Virgin': 'SA Western Standard Time', + 'America/Whitehorse': 'Pacific Standard Time', + 'America/Winnipeg': 'Central Standard Time', + 'America/Yakutat': 'Alaskan Standard Time', + 'America/Yellowknife': 'Mountain Standard Time', + 'Antarctica/Casey': 'W. Australia Standard Time', + 'Antarctica/Davis': 'SE Asia Standard Time', + 'Antarctica/DumontDUrville': 'West Pacific Standard Time', + 'Antarctica/Macquarie': 'Central Pacific Standard Time', + 'Antarctica/Mawson': 'West Asia Standard Time', + 'Antarctica/McMurdo': 'New Zealand Standard Time', + 'Antarctica/Palmer': 'Magallanes Standard Time', + 'Antarctica/Rothera': 'SA Eastern Standard Time', + 'Antarctica/South_Pole': 'New Zealand Standard Time', + 'Antarctica/Syowa': 'E. Africa Standard Time', + 'Antarctica/Vostok': 'Central Asia Standard Time', + 'Arctic/Longyearbyen': 'W. Europe Standard Time', + 'Asia/Aden': 'Arab Standard Time', + 'Asia/Almaty': 'Central Asia Standard Time', + 'Asia/Amman': 'Jordan Standard Time', + 'Asia/Anadyr': 'Russia Time Zone 11', + 'Asia/Aqtau': 'West Asia Standard Time', + 'Asia/Aqtobe': 'West Asia Standard Time', + 'Asia/Ashgabat': 'West Asia Standard Time', + 'Asia/Ashkhabad': 'West Asia Standard Time', + 'Asia/Atyrau': 'West Asia Standard Time', + 'Asia/Baghdad': 'Arabic Standard Time', + 'Asia/Bahrain': 'Arab Standard Time', + 'Asia/Baku': 'Azerbaijan Standard Time', + 'Asia/Bangkok': 'SE Asia Standard Time', + 'Asia/Barnaul': 'Altai Standard Time', + 'Asia/Beirut': 'Middle East Standard Time', + 'Asia/Bishkek': 'Central Asia Standard Time', + 'Asia/Brunei': 'Singapore Standard Time', + 'Asia/Calcutta': 'India Standard Time', + 'Asia/Chita': 'Transbaikal Standard Time', + 'Asia/Choibalsan': 'Ulaanbaatar Standard Time', + 'Asia/Chongqing': 'China Standard Time', + 'Asia/Chungking': 'China Standard Time', + 'Asia/Colombo': 'Sri Lanka Standard Time', + 'Asia/Dacca': 'Bangladesh Standard Time', + 'Asia/Damascus': 'Syria Standard Time', + 'Asia/Dhaka': 'Bangladesh Standard Time', + 'Asia/Dili': 'Tokyo Standard Time', + 'Asia/Dubai': 'Arabian Standard Time', + 'Asia/Dushanbe': 'West Asia Standard Time', + 'Asia/Famagusta': 'GTB Standard Time', + 'Asia/Gaza': 'West Bank Standard Time', + 'Asia/Harbin': 'China Standard Time', + 'Asia/Hebron': 'West Bank Standard Time', + 'Asia/Hong_Kong': 'China Standard Time', + 'Asia/Hovd': 'W. Mongolia Standard Time', + 'Asia/Irkutsk': 'North Asia East Standard Time', + 'Asia/Jakarta': 'SE Asia Standard Time', + 'Asia/Jayapura': 'Tokyo Standard Time', + 'Asia/Jerusalem': 'Israel Standard Time', + 'Asia/Kabul': 'Afghanistan Standard Time', + 'Asia/Kamchatka': 'Russia Time Zone 11', + 'Asia/Karachi': 'Pakistan Standard Time', + 'Asia/Kashgar': 'Central Asia Standard Time', + 'Asia/Katmandu': 'Nepal Standard Time', + 'Asia/Khandyga': 'Yakutsk Standard Time', + 'Asia/Krasnoyarsk': 'North Asia Standard Time', + 'Asia/Kuala_Lumpur': 'Singapore Standard Time', + 'Asia/Kuching': 'Singapore Standard Time', + 'Asia/Kuwait': 'Arab Standard Time', + 'Asia/Macao': 'China Standard Time', + 'Asia/Macau': 'China Standard Time', + 'Asia/Magadan': 'Magadan Standard Time', + 'Asia/Makassar': 'Singapore Standard Time', + 'Asia/Manila': 'Singapore Standard Time', + 'Asia/Muscat': 'Arabian Standard Time', + 'Asia/Nicosia': 'GTB Standard Time', + 'Asia/Novokuznetsk': 'North Asia Standard Time', + 'Asia/Novosibirsk': 'N. Central Asia Standard Time', + 'Asia/Omsk': 'Omsk Standard Time', + 'Asia/Oral': 'West Asia Standard Time', + 'Asia/Phnom_Penh': 'SE Asia Standard Time', + 'Asia/Pontianak': 'SE Asia Standard Time', + 'Asia/Pyongyang': 'North Korea Standard Time', + 'Asia/Qatar': 'Arab Standard Time', + 'Asia/Qostanay': 'Central Asia Standard Time', + 'Asia/Qyzylorda': 'West Asia Standard Time', + 'Asia/Rangoon': 'Myanmar Standard Time', + 'Asia/Riyadh': 'Arab Standard Time', + 'Asia/Saigon': 'SE Asia Standard Time', + 'Asia/Sakhalin': 'Sakhalin Standard Time', + 'Asia/Samarkand': 'West Asia Standard Time', + 'Asia/Seoul': 'Korea Standard Time', + 'Asia/Shanghai': 'China Standard Time', + 'Asia/Singapore': 'Singapore Standard Time', + 'Asia/Srednekolymsk': 'Russia Time Zone 10', + 'Asia/Taipei': 'Taipei Standard Time', + 'Asia/Tashkent': 'West Asia Standard Time', + 'Asia/Tbilisi': 'Georgian Standard Time', + 'Asia/Tehran': 'Iran Standard Time', + 'Asia/Tel_Aviv': 'Israel Standard Time', + 'Asia/Thimbu': 'Bangladesh Standard Time', + 'Asia/Thimphu': 'Bangladesh Standard Time', + 'Asia/Tokyo': 'Tokyo Standard Time', + 'Asia/Tomsk': 'Tomsk Standard Time', + 'Asia/Ujung_Pandang': 'Singapore Standard Time', + 'Asia/Ulaanbaatar': 'Ulaanbaatar Standard Time', + 'Asia/Ulan_Bator': 'Ulaanbaatar Standard Time', + 'Asia/Urumqi': 'Central Asia Standard Time', + 'Asia/Ust-Nera': 'Vladivostok Standard Time', + 'Asia/Vientiane': 'SE Asia Standard Time', + 'Asia/Vladivostok': 'Vladivostok Standard Time', + 'Asia/Yakutsk': 'Yakutsk Standard Time', + 'Asia/Yekaterinburg': 'Ekaterinburg Standard Time', + 'Asia/Yerevan': 'Caucasus Standard Time', + 'Atlantic/Azores': 'Azores Standard Time', + 'Atlantic/Bermuda': 'Atlantic Standard Time', + 'Atlantic/Canary': 'GMT Standard Time', + 'Atlantic/Cape_Verde': 'Cape Verde Standard Time', + 'Atlantic/Faeroe': 'GMT Standard Time', + 'Atlantic/Jan_Mayen': 'W. Europe Standard Time', + 'Atlantic/Madeira': 'GMT Standard Time', + 'Atlantic/Reykjavik': 'Greenwich Standard Time', + 'Atlantic/South_Georgia': 'UTC-02', + 'Atlantic/St_Helena': 'Greenwich Standard Time', + 'Atlantic/Stanley': 'SA Eastern Standard Time', + 'Australia/ACT': 'AUS Eastern Standard Time', + 'Australia/Adelaide': 'Cen. Australia Standard Time', + 'Australia/Brisbane': 'E. Australia Standard Time', + 'Australia/Broken_Hill': 'Cen. Australia Standard Time', + 'Australia/Canberra': 'AUS Eastern Standard Time', + 'Australia/Currie': 'Tasmania Standard Time', + 'Australia/Darwin': 'AUS Central Standard Time', + 'Australia/Eucla': 'Aus Central W. Standard Time', + 'Australia/Hobart': 'Tasmania Standard Time', + 'Australia/LHI': 'Lord Howe Standard Time', + 'Australia/Lindeman': 'E. Australia Standard Time', + 'Australia/Lord_Howe': 'Lord Howe Standard Time', + 'Australia/Melbourne': 'AUS Eastern Standard Time', + 'Australia/NSW': 'AUS Eastern Standard Time', + 'Australia/North': 'AUS Central Standard Time', + 'Australia/Perth': 'W. Australia Standard Time', + 'Australia/Queensland': 'E. Australia Standard Time', + 'Australia/South': 'Cen. Australia Standard Time', + 'Australia/Sydney': 'AUS Eastern Standard Time', + 'Australia/Tasmania': 'Tasmania Standard Time', + 'Australia/Victoria': 'AUS Eastern Standard Time', + 'Australia/West': 'W. Australia Standard Time', + 'Australia/Yancowinna': 'Cen. Australia Standard Time', + 'Brazil/Acre': 'SA Pacific Standard Time', + 'Brazil/DeNoronha': 'UTC-02', + 'Brazil/East': 'E. South America Standard Time', + 'Brazil/West': 'SA Western Standard Time', + 'CST6CDT': 'Central Standard Time', + 'Canada/Atlantic': 'Atlantic Standard Time', + 'Canada/Central': 'Central Standard Time', + 'Canada/Eastern': 'Eastern Standard Time', + 'Canada/Mountain': 'Mountain Standard Time', + 'Canada/Newfoundland': 'Newfoundland Standard Time', + 'Canada/Pacific': 'Pacific Standard Time', + 'Canada/Saskatchewan': 'Canada Central Standard Time', + 'Canada/Yukon': 'Pacific Standard Time', + 'Chile/Continental': 'Pacific SA Standard Time', + 'Chile/EasterIsland': 'Easter Island Standard Time', + 'Cuba': 'Cuba Standard Time', + 'EST5EDT': 'Eastern Standard Time', + 'Egypt': 'Egypt Standard Time', + 'Eire': 'GMT Standard Time', + 'Etc/GMT': 'UTC', + 'Etc/GMT+1': 'Cape Verde Standard Time', + 'Etc/GMT+10': 'Hawaiian Standard Time', + 'Etc/GMT+11': 'UTC-11', + 'Etc/GMT+12': 'Dateline Standard Time', + 'Etc/GMT+2': 'UTC-02', + 'Etc/GMT+3': 'SA Eastern Standard Time', + 'Etc/GMT+4': 'SA Western Standard Time', + 'Etc/GMT+5': 'SA Pacific Standard Time', + 'Etc/GMT+6': 'Central America Standard Time', + 'Etc/GMT+7': 'US Mountain Standard Time', + 'Etc/GMT+8': 'UTC-08', + 'Etc/GMT+9': 'UTC-09', + 'Etc/GMT-1': 'W. Central Africa Standard Time', + 'Etc/GMT-10': 'West Pacific Standard Time', + 'Etc/GMT-11': 'Central Pacific Standard Time', + 'Etc/GMT-12': 'UTC+12', + 'Etc/GMT-13': 'UTC+13', + 'Etc/GMT-14': 'Line Islands Standard Time', + 'Etc/GMT-2': 'South Africa Standard Time', + 'Etc/GMT-3': 'E. Africa Standard Time', + 'Etc/GMT-4': 'Arabian Standard Time', + 'Etc/GMT-5': 'West Asia Standard Time', + 'Etc/GMT-6': 'Central Asia Standard Time', + 'Etc/GMT-7': 'SE Asia Standard Time', + 'Etc/GMT-8': 'Singapore Standard Time', + 'Etc/GMT-9': 'Tokyo Standard Time', + 'Etc/UTC': 'UTC', + 'Europe/Amsterdam': 'W. Europe Standard Time', + 'Europe/Andorra': 'W. Europe Standard Time', + 'Europe/Astrakhan': 'Astrakhan Standard Time', + 'Europe/Athens': 'GTB Standard Time', + 'Europe/Belfast': 'GMT Standard Time', + 'Europe/Belgrade': 'Central Europe Standard Time', + 'Europe/Berlin': 'W. Europe Standard Time', + 'Europe/Bratislava': 'Central Europe Standard Time', + 'Europe/Brussels': 'Romance Standard Time', + 'Europe/Bucharest': 'GTB Standard Time', + 'Europe/Budapest': 'Central Europe Standard Time', + 'Europe/Busingen': 'W. Europe Standard Time', + 'Europe/Chisinau': 'E. Europe Standard Time', + 'Europe/Copenhagen': 'Romance Standard Time', + 'Europe/Dublin': 'GMT Standard Time', + 'Europe/Gibraltar': 'W. Europe Standard Time', + 'Europe/Guernsey': 'GMT Standard Time', + 'Europe/Helsinki': 'FLE Standard Time', + 'Europe/Isle_of_Man': 'GMT Standard Time', + 'Europe/Istanbul': 'Turkey Standard Time', + 'Europe/Jersey': 'GMT Standard Time', + 'Europe/Kaliningrad': 'Kaliningrad Standard Time', + 'Europe/Kiev': 'FLE Standard Time', + 'Europe/Kirov': 'Russian Standard Time', + 'Europe/Lisbon': 'GMT Standard Time', + 'Europe/Ljubljana': 'Central Europe Standard Time', + 'Europe/London': 'GMT Standard Time', + 'Europe/Luxembourg': 'W. Europe Standard Time', + 'Europe/Madrid': 'Romance Standard Time', + 'Europe/Malta': 'W. Europe Standard Time', + 'Europe/Mariehamn': 'FLE Standard Time', + 'Europe/Minsk': 'Belarus Standard Time', + 'Europe/Monaco': 'W. Europe Standard Time', + 'Europe/Moscow': 'Russian Standard Time', + 'Europe/Oslo': 'W. Europe Standard Time', + 'Europe/Paris': 'Romance Standard Time', + 'Europe/Podgorica': 'Central Europe Standard Time', + 'Europe/Prague': 'Central Europe Standard Time', + 'Europe/Riga': 'FLE Standard Time', + 'Europe/Rome': 'W. Europe Standard Time', + 'Europe/Samara': 'Russia Time Zone 3', + 'Europe/San_Marino': 'W. Europe Standard Time', + 'Europe/Sarajevo': 'Central European Standard Time', + 'Europe/Saratov': 'Saratov Standard Time', + 'Europe/Simferopol': 'Russian Standard Time', + 'Europe/Skopje': 'Central European Standard Time', + 'Europe/Sofia': 'FLE Standard Time', + 'Europe/Stockholm': 'W. Europe Standard Time', + 'Europe/Tallinn': 'FLE Standard Time', + 'Europe/Tirane': 'Central Europe Standard Time', + 'Europe/Tiraspol': 'E. Europe Standard Time', + 'Europe/Ulyanovsk': 'Astrakhan Standard Time', + 'Europe/Uzhgorod': 'FLE Standard Time', + 'Europe/Vaduz': 'W. Europe Standard Time', + 'Europe/Vatican': 'W. Europe Standard Time', + 'Europe/Vienna': 'W. Europe Standard Time', + 'Europe/Vilnius': 'FLE Standard Time', + 'Europe/Volgograd': 'Russian Standard Time', + 'Europe/Warsaw': 'Central European Standard Time', + 'Europe/Zagreb': 'Central European Standard Time', + 'Europe/Zaporozhye': 'FLE Standard Time', + 'Europe/Zurich': 'W. Europe Standard Time', + 'GB': 'GMT Standard Time', + 'GB-Eire': 'GMT Standard Time', + 'GMT+0': 'UTC', + 'GMT-0': 'UTC', + 'GMT0': 'UTC', + 'Greenwich': 'UTC', + 'Hongkong': 'China Standard Time', + 'Iceland': 'Greenwich Standard Time', + 'Indian/Antananarivo': 'E. Africa Standard Time', + 'Indian/Chagos': 'Central Asia Standard Time', + 'Indian/Christmas': 'SE Asia Standard Time', + 'Indian/Cocos': 'Myanmar Standard Time', + 'Indian/Comoro': 'E. Africa Standard Time', + 'Indian/Kerguelen': 'West Asia Standard Time', + 'Indian/Mahe': 'Mauritius Standard Time', + 'Indian/Maldives': 'West Asia Standard Time', + 'Indian/Mauritius': 'Mauritius Standard Time', + 'Indian/Mayotte': 'E. Africa Standard Time', + 'Indian/Reunion': 'Mauritius Standard Time', + 'Iran': 'Iran Standard Time', + 'Israel': 'Israel Standard Time', + 'Jamaica': 'SA Pacific Standard Time', + 'Japan': 'Tokyo Standard Time', + 'Kwajalein': 'UTC+12', + 'Libya': 'Libya Standard Time', + 'MST7MDT': 'Mountain Standard Time', + 'Mexico/BajaNorte': 'Pacific Standard Time (Mexico)', + 'Mexico/BajaSur': 'Mountain Standard Time (Mexico)', + 'Mexico/General': 'Central Standard Time (Mexico)', + 'NZ': 'New Zealand Standard Time', + 'NZ-CHAT': 'Chatham Islands Standard Time', + 'Navajo': 'Mountain Standard Time', + 'PRC': 'China Standard Time', + 'PST8PDT': 'Pacific Standard Time', + 'Pacific/Apia': 'Samoa Standard Time', + 'Pacific/Auckland': 'New Zealand Standard Time', + 'Pacific/Bougainville': 'Bougainville Standard Time', + 'Pacific/Chatham': 'Chatham Islands Standard Time', + 'Pacific/Easter': 'Easter Island Standard Time', + 'Pacific/Efate': 'Central Pacific Standard Time', + 'Pacific/Enderbury': 'UTC+13', + 'Pacific/Fakaofo': 'UTC+13', + 'Pacific/Fiji': 'Fiji Standard Time', + 'Pacific/Funafuti': 'UTC+12', + 'Pacific/Galapagos': 'Central America Standard Time', + 'Pacific/Gambier': 'UTC-09', + 'Pacific/Guadalcanal': 'Central Pacific Standard Time', + 'Pacific/Guam': 'West Pacific Standard Time', + 'Pacific/Honolulu': 'Hawaiian Standard Time', + 'Pacific/Johnston': 'Hawaiian Standard Time', + 'Pacific/Kiritimati': 'Line Islands Standard Time', + 'Pacific/Kosrae': 'Central Pacific Standard Time', + 'Pacific/Kwajalein': 'UTC+12', + 'Pacific/Majuro': 'UTC+12', + 'Pacific/Marquesas': 'Marquesas Standard Time', + 'Pacific/Midway': 'UTC-11', + 'Pacific/Nauru': 'UTC+12', + 'Pacific/Niue': 'UTC-11', + 'Pacific/Norfolk': 'Norfolk Standard Time', + 'Pacific/Noumea': 'Central Pacific Standard Time', + 'Pacific/Pago_Pago': 'UTC-11', + 'Pacific/Palau': 'Tokyo Standard Time', + 'Pacific/Pitcairn': 'UTC-08', + 'Pacific/Ponape': 'Central Pacific Standard Time', + 'Pacific/Port_Moresby': 'West Pacific Standard Time', + 'Pacific/Rarotonga': 'Hawaiian Standard Time', + 'Pacific/Saipan': 'West Pacific Standard Time', + 'Pacific/Samoa': 'UTC-11', + 'Pacific/Tahiti': 'Hawaiian Standard Time', + 'Pacific/Tarawa': 'UTC+12', + 'Pacific/Tongatapu': 'Tonga Standard Time', + 'Pacific/Truk': 'West Pacific Standard Time', + 'Pacific/Wake': 'UTC+12', + 'Pacific/Wallis': 'UTC+12', + 'Poland': 'Central European Standard Time', + 'Portugal': 'GMT Standard Time', + 'ROC': 'Taipei Standard Time', + 'ROK': 'Korea Standard Time', + 'Singapore': 'Singapore Standard Time', + 'Turkey': 'Turkey Standard Time', + 'US/Alaska': 'Alaskan Standard Time', + 'US/Aleutian': 'Aleutian Standard Time', + 'US/Arizona': 'US Mountain Standard Time', + 'US/Central': 'Central Standard Time', + 'US/Eastern': 'Eastern Standard Time', + 'US/Hawaii': 'Hawaiian Standard Time', + 'US/Indiana-Starke': 'Central Standard Time', + 'US/Michigan': 'Eastern Standard Time', + 'US/Mountain': 'Mountain Standard Time', + 'US/Pacific': 'Pacific Standard Time', + 'US/Samoa': 'UTC-11', + 'UTC': 'UTC', + 'Universal': 'UTC', + 'W-SU': 'Russian Standard Time', + 'Zulu': 'UTC'} diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/__init__.py b/Contents/Libraries/Shared/urllib3/__init__.py similarity index 93% rename from Contents/Libraries/Shared/requests/packages/urllib3/__init__.py rename to Contents/Libraries/Shared/urllib3/__init__.py index ac3ff838d..61915465f 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/__init__.py +++ b/Contents/Libraries/Shared/urllib3/__init__.py @@ -23,16 +23,11 @@ # 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 +from logging import NullHandler __author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' __license__ = 'MIT' -__version__ = '1.20' +__version__ = '1.24.2' __all__ = ( 'HTTPConnectionPool', diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/_collections.py b/Contents/Libraries/Shared/urllib3/_collections.py similarity index 88% rename from Contents/Libraries/Shared/requests/packages/urllib3/_collections.py rename to Contents/Libraries/Shared/urllib3/_collections.py index 77cee0170..34f23811c 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/_collections.py +++ b/Contents/Libraries/Shared/urllib3/_collections.py @@ -1,5 +1,8 @@ from __future__ import absolute_import -from collections import Mapping, MutableMapping +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping try: from threading import RLock except ImportError: # Platform-specific: No threads available @@ -11,10 +14,8 @@ 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 collections import OrderedDict +from .exceptions import InvalidHeader from .packages.six import iterkeys, itervalues, PY3 @@ -144,7 +145,7 @@ def __init__(self, headers=None, **kwargs): self.extend(kwargs) def __setitem__(self, key, val): - self._container[key.lower()] = (key, val) + self._container[key.lower()] = [key, val] return self._container[key.lower()] def __getitem__(self, key): @@ -215,18 +216,11 @@ def add(self, key, val): 'bar, baz' """ key_lower = key.lower() - new_vals = key, val + new_vals = [key, val] # Keep the common case aka no item present as fast as possible vals = self._container.setdefault(key_lower, new_vals) if new_vals is not vals: - # new_vals was not inserted, as there was a previous one - if isinstance(vals, list): - # If already several items got inserted, we have a list - vals.append(val) - else: - # vals should be a tuple then, i.e. only one item so far - # Need to convert the tuple to list for further extension - self._container[key_lower] = [vals[0], vals[1], val] + vals.append(val) def extend(self, *args, **kwargs): """Generic import function for any type of header-like object. @@ -254,24 +248,26 @@ def extend(self, *args, **kwargs): for key, value in kwargs.items(): self.add(key, value) - def getlist(self, key): + def getlist(self, key, default=__marker): """Returns a list of all the values for the named field. Returns an empty list if the key doesn't exist.""" try: vals = self._container[key.lower()] except KeyError: - return [] + if default is self.__marker: + return [] + return default else: - if isinstance(vals, tuple): - return [vals[1]] - else: - return vals[1:] + return vals[1:] # Backwards compatibility for httplib getheaders = getlist getallmatchingheaders = getlist iget = getlist + # Backwards compatibility for http.cookiejar + get_all = getlist + def __repr__(self): return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) @@ -310,13 +306,22 @@ def from_httplib(cls, message): # Python 2 # python2.7 does not expose a proper API for exporting multiheaders # efficiently. This function re-reads raw lines from the message # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') headers = [] for line in message.headers: - if line.startswith((' ', '\t')): - key, value = headers[-1] - headers[-1] = (key, value + '\r\n' + line.rstrip()) - continue + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue key, value = line.split(':', 1) headers.append((key, value.strip())) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/connection.py b/Contents/Libraries/Shared/urllib3/connection.py similarity index 81% rename from Contents/Libraries/Shared/requests/packages/urllib3/connection.py rename to Contents/Libraries/Shared/urllib3/connection.py index 9f06c3958..02b36654b 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/connection.py +++ b/Contents/Libraries/Shared/urllib3/connection.py @@ -2,7 +2,6 @@ import datetime import logging import os -import sys import socket from socket import error as SocketError, timeout as SocketTimeout import warnings @@ -56,10 +55,11 @@ class ConnectionError(Exception): 'https': 443, } -# When updating RECENT_DATE, move it to -# within two years of the current date, and no -# earlier than 6 months ago. -RECENT_DATE = datetime.date(2016, 1, 1) +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) class DummyConnection(object): @@ -77,9 +77,6 @@ class HTTPConnection(_HTTPConnection, object): - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - ``source_address``: Set the source address for the current connection. - - .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x - - ``socket_options``: Set specific options on the underlying socket. If not specified, then defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. @@ -107,23 +104,44 @@ def __init__(self, *args, **kw): if six.PY3: # Python 3 kw.pop('strict', None) - # Pre-set source_address in case we have an older Python like 2.6. + # Pre-set source_address. self.source_address = kw.get('source_address') - if sys.version_info < (2, 7): # Python 2.6 - # _HTTPConnection on Python 2.6 will balk at this keyword arg, but - # not newer versions. We can still use it when creating a - # connection though, so we pop it *after* we have saved it as - # self.source_address. - kw.pop('source_address', None) - #: The socket options provided by the user. If no options are #: provided, we use the default options. self.socket_options = kw.pop('socket_options', self.default_socket_options) - # Superclass also sets self.source_address in Python 2.7+. _HTTPConnection.__init__(self, *args, **kw) + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + def _new_conn(self): """ Establish a socket connection and set nodelay settings on it. @@ -138,7 +156,7 @@ def _new_conn(self): try: conn = connection.create_connection( - (self.host, self.port), self.timeout, **extra_kw) + (self._dns_host, self.port), self.timeout, **extra_kw) except SocketTimeout as e: raise ConnectTimeoutError( @@ -153,10 +171,7 @@ def _new_conn(self): def _prepare_conn(self, conn): self.sock = conn - # the _tunnel_host attribute was added in python 2.6.3 (via - # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do - # not have them. - if getattr(self, '_tunnel_host', None): + if self._tunnel_host: # TODO: Fix tunnel so it doesn't depend on self.sock state. self._tunnel() # Mark this connection as not reusable @@ -187,13 +202,13 @@ def request_chunked(self, method, url, body=None, headers=None): self.endheaders() if body is not None: - stringish_types = six.string_types + (six.binary_type,) + stringish_types = six.string_types + (bytes,) if isinstance(body, stringish_types): body = (body,) for chunk in body: if not chunk: continue - if not isinstance(chunk, six.binary_type): + if not isinstance(chunk, bytes): chunk = chunk.encode('utf8') len_str = hex(len(chunk))[2:] self.send(len_str.encode('utf-8')) @@ -212,7 +227,7 @@ class HTTPSConnection(HTTPConnection): def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, **kw): + ssl_context=None, server_hostname=None, **kw): HTTPConnection.__init__(self, host, port, strict=strict, timeout=timeout, **kw) @@ -220,6 +235,7 @@ def __init__(self, host, port=None, key_file=None, cert_file=None, self.key_file = key_file self.cert_file = cert_file self.ssl_context = ssl_context + self.server_hostname = server_hostname # Required property for Google AppEngine 1.9.0 which otherwise causes # HTTPS requests to go out as HTTP. (See Issue #356) @@ -240,6 +256,7 @@ def connect(self): keyfile=self.key_file, certfile=self.cert_file, ssl_context=self.ssl_context, + server_hostname=self.server_hostname ) @@ -282,12 +299,9 @@ def set_cert(self, key_file=None, cert_file=None, def connect(self): # Add certificate verification conn = self._new_conn() - hostname = self.host - if getattr(self, '_tunnel_host', None): - # _tunnel_host was added in Python 2.6.3 - # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + if self._tunnel_host: self.sock = conn # Calls self._set_hostport(), so self.host is # self._tunnel_host below. @@ -298,6 +312,10 @@ def connect(self): # Override the host with the one we're requesting data from. hostname = self._tunnel_host + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + is_time_off = datetime.date.today() < RECENT_DATE if is_time_off: warnings.warn(( @@ -322,14 +340,18 @@ def connect(self): certfile=self.cert_file, ca_certs=self.ca_certs, ca_cert_dir=self.ca_cert_dir, - server_hostname=hostname, + server_hostname=server_hostname, ssl_context=context) if self.assert_fingerprint: assert_fingerprint(self.sock.getpeercert(binary_form=True), self.assert_fingerprint) elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. cert = self.sock.getpeercert() if not cert.get('subjectAltName', ()): warnings.warn(( @@ -339,7 +361,7 @@ def connect(self): 'for details.)'.format(hostname)), SubjectAltNameWarning ) - _match_hostname(cert, self.assert_hostname or hostname) + _match_hostname(cert, self.assert_hostname or server_hostname) self.is_verified = ( context.verify_mode == ssl.CERT_REQUIRED or diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py b/Contents/Libraries/Shared/urllib3/connectionpool.py similarity index 93% rename from Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py rename to Contents/Libraries/Shared/urllib3/connectionpool.py index b4f1166a6..f7a8f193d 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py +++ b/Contents/Libraries/Shared/urllib3/connectionpool.py @@ -40,13 +40,10 @@ from .util.response import assert_header_parsing from .util.retry import Retry from .util.timeout import Timeout -from .util.url import get_host, Url +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue -if six.PY2: - # Queue is imported for side effects on MS Windows - import Queue as _unused_module_Queue # noqa: F401 - xrange = six.moves.xrange log = logging.getLogger(__name__) @@ -62,13 +59,14 @@ class ConnectionPool(object): """ scheme = None - QueueCls = queue.LifoQueue + QueueCls = LifoQueue def __init__(self, host, port=None): if not host: raise LocationValueError("No host specified.") - self.host = _ipv6_host(host).lower() + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() self.port = port def __str__(self): @@ -91,7 +89,7 @@ def close(self): # This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} class HTTPConnectionPool(ConnectionPool, RequestMethods): @@ -203,8 +201,8 @@ def _new_conn(self): Return a fresh :class:`HTTPConnection`. """ self.num_connections += 1 - log.debug("Starting new HTTP connection (%d): %s", - self.num_connections, self.host) + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") conn = self.ConnectionCls(host=self.host, port=self.port, timeout=self.timeout.connect_timeout, @@ -315,7 +313,7 @@ def _raise_timeout(self, err, url, 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 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) def _make_request(self, conn, method, url, timeout=_Default, chunked=False, @@ -377,7 +375,7 @@ def _make_request(self, conn, method, url, timeout=_Default, chunked=False, try: try: # Python 2.7, use buffering of HTTP responses httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older, Python 3 + except TypeError: # Python 3 try: httplib_response = conn.getresponse() except Exception as e: @@ -396,7 +394,7 @@ def _make_request(self, conn, method, url, timeout=_Default, chunked=False, try: assert_header_parsing(httplib_response.msg) - except HeaderParsingError as hpe: # Platform-specific: Python 3 + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 log.warning( 'Failed to parse headers (url=%s): %s', self._absolute_url(url), hpe, exc_info=True) @@ -410,6 +408,8 @@ def close(self): """ Close all pooled connections and disable the pool. """ + if self.pool is None: + return # Disable access to the pool old_pool, self.pool = self.pool, None @@ -433,7 +433,7 @@ def is_same_host(self, url): # TODO: Add optional support for socket.gethostbyname checking. scheme, host, port = get_host(url) - host = _ipv6_host(host).lower() + host = _ipv6_host(host, self.scheme) # Use explicit default port for comparison when none is given if self.port and not port: @@ -622,25 +622,14 @@ def urlopen(self, method, url, body=None, headers=None, retries=None, # 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. - clean_exit = False - raise SSLError(e) - - except SSLError: - # Treat SSLError separately from BaseSSLError to preserve - # traceback. - clean_exit = False - raise - - except (TimeoutError, HTTPException, SocketError, ProtocolError) as e: + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: # Discard the connection for these exceptions. It will be - # be replaced during the next _get_conn() call. + # replaced during the next _get_conn() call. clean_exit = False - - if isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: e = ProxyError('Cannot connect to proxy.', e) elif isinstance(e, (SocketError, HTTPException)): e = ProtocolError('Connection aborted.', e) @@ -677,6 +666,15 @@ def urlopen(self, method, url, body=None, headers=None, retries=None, release_conn=release_conn, body_pos=body_pos, **response_kw) + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + # Handle redirect? redirect_location = redirect and response.get_redirect_location() if redirect_location: @@ -687,12 +685,15 @@ def urlopen(self, method, url, body=None, headers=None, retries=None, retries = retries.increment(method, url, response=response, _pool=self) except MaxRetryError: if retries.raise_on_redirect: - # Release the connection for this response, since we're not - # returning it to be released manually. - response.release_conn() + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) raise return response + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + retries.sleep_for_retry(response) log.debug("Redirecting %s -> %s", url, redirect_location) return self.urlopen( @@ -710,11 +711,15 @@ def urlopen(self, method, url, body=None, headers=None, retries=None, retries = retries.increment(method, url, response=response, _pool=self) except MaxRetryError: if retries.raise_on_status: - # Release the connection for this response, since we're not - # returning it to be released manually. - response.release_conn() + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) raise return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + retries.sleep(response) log.debug("Retry: %s", url) return self.urlopen( @@ -796,17 +801,7 @@ def _prepare_proxy(self, conn): Establish tunnel connection early, because otherwise httplib would improperly set Host: header to proxy's IP:port. """ - # 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) - + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) conn.connect() def _new_conn(self): @@ -814,8 +809,8 @@ def _new_conn(self): Return a fresh :class:`httplib.HTTPSConnection`. """ self.num_connections += 1 - log.debug("Starting new HTTPS connection (%d): %s", - self.num_connections, self.host) + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") if not self.ConnectionCls or self.ConnectionCls is DummyConnection: raise SSLError("Can't connect to HTTPS URL because the SSL " @@ -880,7 +875,7 @@ def connection_from_url(url, **kw): return HTTPConnectionPool(host, port=port, **kw) -def _ipv6_host(host): +def _ipv6_host(host, scheme): """ Process IPv6 address literals """ @@ -896,4 +891,6 @@ def _ipv6_host(host): # percent sign might be URIencoded, convert it back into ASCII if host.startswith('[') and host.endswith(']'): host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() return host diff --git a/Contents/Libraries/Shared/urllib3/contrib/__init__.py b/Contents/Libraries/Shared/urllib3/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py b/Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py new file mode 100644 index 000000000..f3e00942c --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/Contents/Libraries/Shared/urllib3/contrib/_securetransport/__init__.py b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 000000000..bcf41c02b --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + 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 absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 000000000..b13cd9e72 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py b/Contents/Libraries/Shared/urllib3/contrib/appengine.py similarity index 92% rename from Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py rename to Contents/Libraries/Shared/urllib3/contrib/appengine.py index 814b0222d..2952f114d 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py +++ b/Contents/Libraries/Shared/urllib3/contrib/appengine.py @@ -39,8 +39,8 @@ """ from __future__ import absolute_import +import io import logging -import os import warnings from ..packages.six.moves.urllib.parse import urljoin @@ -53,11 +53,11 @@ SSLError ) -from ..packages.six import BytesIO from ..request import RequestMethods from ..response import HTTPResponse from ..util.timeout import Timeout from ..util.retry import Retry +from . import _appengine_environ try: from google.appengine.api import urlfetch @@ -236,12 +236,21 @@ def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): encodings.remove('chunked') urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) - return HTTPResponse( + original_response = HTTPResponse( # In order for decoding to work, we must present the content as # a file-like object. - body=BytesIO(urlfetch_resp.content), + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), headers=urlfetch_resp.headers, status=urlfetch_resp.status_code, + original_response=original_response, **response_kw ) @@ -271,26 +280,10 @@ def _get_retries(self, retries, redirect): return retries -def is_appengine(): - return (is_local_appengine() or - is_prod_appengine() or - is_prod_appengine_mvms()) - - -def is_appengine_sandbox(): - return is_appengine() and not is_prod_appengine_mvms() - - -def is_local_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Development/' in os.environ['SERVER_SOFTWARE']) - - -def is_prod_appengine(): - return ('APPENGINE_RUNTIME' in os.environ and - 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and - not is_prod_appengine_mvms()) - +# Alias methods from _appengine_environ to maintain public API interface. -def is_prod_appengine_mvms(): - return os.environ.get('GAE_VM', False) == 'true' +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py b/Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py similarity index 98% rename from Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py rename to Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py index 642e99ed2..8ea127c58 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py +++ b/Contents/Libraries/Shared/urllib3/contrib/ntlmpool.py @@ -43,8 +43,7 @@ def _new_conn(self): log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', self.num_connections, self.host, self.authurl) - headers = {} - headers['Connection'] = 'Keep-Alive' + headers = {'Connection': 'Keep-Alive'} req_header = 'Authorization' resp_header = 'www-authenticate' diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py b/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py similarity index 88% rename from Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py rename to Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py index eb4d4765b..5ab7803ac 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py +++ b/Contents/Libraries/Shared/urllib3/contrib/pyopenssl.py @@ -47,6 +47,12 @@ from cryptography import x509 from cryptography.hazmat.backends.openssl import backend as openssl_backend from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass from socket import timeout, error as SocketError from io import BytesIO @@ -59,7 +65,7 @@ import logging import ssl -import six +from ..packages import six import sys from .. import util @@ -157,6 +163,9 @@ def _dnsname_to_stdlib(name): from ASCII bytes. We need to idna-encode that string to get it back, and then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. """ def idna_encode(name): """ @@ -166,14 +175,22 @@ def idna_encode(name): """ import idna - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + if ':' in name: + return name name = idna_encode(name) - if sys.version_info >= (3, 0): + if name is None: + return None + elif sys.version_info >= (3, 0): name = name.decode('utf-8') return name @@ -183,9 +200,12 @@ def get_subj_alt_name(peer_cert): Given an PyOpenSSL certificate, provides all the subject alternative names. """ # Pass the cert to cryptography, which has much better APIs for this. - # This is technically using private APIs, but should work across all - # relevant versions until PyOpenSSL gets something proper for this. - cert = _Certificate(openssl_backend, peer_cert._x509) + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) # We want to find the SAN extension. Ask Cryptography to locate it (it's # faster than looping in Python) @@ -196,7 +216,7 @@ def get_subj_alt_name(peer_cert): except x509.ExtensionNotFound: # No such extension, return the empty list. return [] - except (x509.DuplicateExtension, x509.UnsupportedExtension, + except (x509.DuplicateExtension, UnsupportedExtension, x509.UnsupportedGeneralNameType, UnicodeError) as e: # A problem has been found with the quality of the certificate. Assume # no SAN field is present. @@ -214,9 +234,10 @@ def get_subj_alt_name(peer_cert): # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 # decoded. This is pretty frustrating, but that's what the standard library # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. names = [ - ('DNS', _dnsname_to_stdlib(name)) - for name in ext.get_values_for_type(x509.DNSName) + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None ] names.extend( ('IP Address', str(name)) @@ -264,8 +285,7 @@ def recv(self, *args, **kwargs): else: raise except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(self.socket, self.socket.gettimeout()) - if not rd: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): raise timeout('The read operation timed out') else: return self.recv(*args, **kwargs) @@ -286,8 +306,7 @@ def recv_into(self, *args, **kwargs): else: raise except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(self.socket, self.socket.gettimeout()) - if not rd: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): raise timeout('The read operation timed out') else: return self.recv_into(*args, **kwargs) @@ -300,10 +319,11 @@ def _send_until_done(self, data): try: return self.connection.send(data) except OpenSSL.SSL.WantWriteError: - wr = util.wait_for_write(self.socket, self.socket.gettimeout()) - if not wr: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): raise timeout() continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) def sendall(self, data): total_sent = 0 @@ -413,7 +433,7 @@ def load_verify_locations(self, cafile=None, capath=None, cadata=None): self._ctx.load_verify_locations(BytesIO(cadata)) def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_file(certfile) + self._ctx.use_certificate_chain_file(certfile) if password is not None: self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) self._ctx.use_privatekey_file(keyfile or certfile) @@ -435,8 +455,7 @@ def wrap_socket(self, sock, server_side=False, try: cnx.do_handshake() except OpenSSL.SSL.WantReadError: - rd = util.wait_for_read(sock, sock.gettimeout()) - if not rd: + if not util.wait_for_read(sock, sock.gettimeout()): raise timeout('select timed out') continue except OpenSSL.SSL.Error as e: diff --git a/Contents/Libraries/Shared/urllib3/contrib/securetransport.py b/Contents/Libraries/Shared/urllib3/contrib/securetransport.py new file mode 100644 index 000000000..77cb59ed7 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py b/Contents/Libraries/Shared/urllib3/contrib/socks.py similarity index 96% rename from Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py rename to Contents/Libraries/Shared/urllib3/contrib/socks.py index 39e92fde1..811e312ec 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py +++ b/Contents/Libraries/Shared/urllib3/contrib/socks.py @@ -152,6 +152,10 @@ def __init__(self, proxy_url, username=None, password=None, num_pools=10, headers=None, **connection_pool_kw): parsed = parse_url(proxy_url) + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split if parsed.scheme == 'socks5': socks_version = socks.PROXY_TYPE_SOCKS5 rdns = False diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py b/Contents/Libraries/Shared/urllib3/exceptions.py similarity index 99% rename from Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py rename to Contents/Libraries/Shared/urllib3/exceptions.py index 6c4be5810..7bbaa9871 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py +++ b/Contents/Libraries/Shared/urllib3/exceptions.py @@ -154,7 +154,7 @@ class ResponseError(HTTPError): class SecurityWarning(HTTPWarning): - "Warned when perfoming security reducing actions" + "Warned when performing security reducing actions" pass diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/fields.py b/Contents/Libraries/Shared/urllib3/fields.py similarity index 98% rename from Contents/Libraries/Shared/requests/packages/urllib3/fields.py rename to Contents/Libraries/Shared/urllib3/fields.py index 19b0ae0c8..37fe64a3e 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/fields.py +++ b/Contents/Libraries/Shared/urllib3/fields.py @@ -121,7 +121,7 @@ def _render_parts(self, header_parts): 'Content-Disposition' fields. :param header_parts: - A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format as `k1="v1"; k2="v2"; ...`. """ parts = [] diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/filepost.py b/Contents/Libraries/Shared/urllib3/filepost.py similarity index 91% rename from Contents/Libraries/Shared/requests/packages/urllib3/filepost.py rename to Contents/Libraries/Shared/urllib3/filepost.py index cd11cee46..78f1e19b0 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/filepost.py +++ b/Contents/Libraries/Shared/urllib3/filepost.py @@ -1,7 +1,8 @@ from __future__ import absolute_import +import binascii import codecs +import os -from uuid import uuid4 from io import BytesIO from .packages import six @@ -15,7 +16,10 @@ def choose_boundary(): """ Our embarrassingly-simple replacement for mimetools.choose_boundary. """ - return uuid4().hex + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary def iter_field_objects(fields): @@ -65,7 +69,7 @@ def encode_multipart_formdata(fields, boundary=None): :param boundary: If not specified, then a random boundary will be generated using - :func:`mimetools.choose_boundary`. + :func:`urllib3.filepost.choose_boundary`. """ body = BytesIO() if boundary is None: diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py b/Contents/Libraries/Shared/urllib3/packages/__init__.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py rename to Contents/Libraries/Shared/urllib3/packages/__init__.py diff --git a/Contents/Libraries/Shared/urllib3/packages/backports/__init__.py b/Contents/Libraries/Shared/urllib3/packages/backports/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py b/Contents/Libraries/Shared/urllib3/packages/backports/makefile.py similarity index 96% rename from Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py rename to Contents/Libraries/Shared/urllib3/packages/backports/makefile.py index 75b80dcf8..740db377d 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py +++ b/Contents/Libraries/Shared/urllib3/packages/backports/makefile.py @@ -16,7 +16,7 @@ def backport_makefile(self, mode="r", buffering=None, encoding=None, """ Backport of ``socket.makefile`` from Python 3.5. """ - if not set(mode) <= set(["r", "w", "b"]): + if not set(mode) <= {"r", "w", "b"}: raise ValueError( "invalid mode %r (only r, w, b allowed)" % (mode,) ) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py b/Contents/Libraries/Shared/urllib3/packages/six.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py rename to Contents/Libraries/Shared/urllib3/packages/six.py diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/__init__.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py rename to Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/__init__.py diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py similarity index 98% rename from Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py rename to Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py index 1fd42f38a..d6e66c019 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +++ b/Contents/Libraries/Shared/urllib3/packages/ssl_match_hostname/_implementation.py @@ -9,8 +9,7 @@ # ipaddress has been backported to 2.6+ in pypi. If it is installed on the # system, use it to handle IPAddress ServerAltnames (this was added in # python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used all the way back to -# python-2.4. +# backports.ssl_match_hostname to continue to be used in Python 2.7. try: import ipaddress except ImportError: diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py b/Contents/Libraries/Shared/urllib3/poolmanager.py similarity index 60% rename from Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py rename to Contents/Libraries/Shared/urllib3/poolmanager.py index cc5a00e4b..32bd97302 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py +++ b/Contents/Libraries/Shared/urllib3/poolmanager.py @@ -7,6 +7,7 @@ from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool from .connectionpool import port_by_scheme from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages import six from .packages.six.moves.urllib.parse import urljoin from .request import RequestMethods from .util.url import parse_url @@ -21,28 +22,43 @@ SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', 'ssl_version', 'ca_cert_dir', 'ssl_context') -# The base fields to use when determining what pool to get a connection from; -# these do not rely on the ``connection_pool_kw`` and can be determined by the -# URL and potentially the ``urllib3.connection.port_by_scheme`` dictionary. -# -# All custom key schemes should include the fields in this key at a minimum. -BasePoolKey = collections.namedtuple('BasePoolKey', ('scheme', 'host', 'port')) - -# The fields to use when determining what pool to get a HTTP and HTTPS -# connection from. All additional fields must be present in the PoolManager's -# ``connection_pool_kw`` instance variable. -HTTPPoolKey = collections.namedtuple( - 'HTTPPoolKey', BasePoolKey._fields + ('timeout', 'retries', 'strict', - 'block', 'source_address') -) -HTTPSPoolKey = collections.namedtuple( - 'HTTPSPoolKey', HTTPPoolKey._fields + SSL_KEYWORDS +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str ) +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + def _default_key_normalizer(key_class, request_context): """ - Create a pool key of type ``key_class`` for a request. + Create a pool key out of a request context dictionary. According to RFC 3986, both the scheme and host are case-insensitive. Therefore, this function normalizes both before constructing the pool @@ -52,26 +68,50 @@ def _default_key_normalizer(key_class, request_context): :param key_class: The class to use when constructing the key. This should be a namedtuple with the ``scheme`` and ``host`` keys at a minimum. - + :type key_class: namedtuple :param request_context: A dictionary-like object that contain the context for a request. - It should contain a key for each field in the :class:`HTTPPoolKey` + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey """ - context = {} - for key in key_class._fields: - context[key] = request_context.get(key) + # Since we mutate the dictionary, make a copy first + context = request_context.copy() context['scheme'] = context['scheme'].lower() context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + return key_class(**context) -# A dictionary that maps a scheme to a callable that creates a pool key. -# This can be used to alter the way pool keys are constructed, if desired. -# Each PoolManager makes a copy of this dictionary so they can be configured -# globally here, or individually on the instance. +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. key_fn_by_scheme = { - 'http': functools.partial(_default_key_normalizer, HTTPPoolKey), - 'https': functools.partial(_default_key_normalizer, HTTPSPoolKey), + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), } pool_classes_by_scheme = { @@ -129,22 +169,32 @@ def __exit__(self, exc_type, exc_val, exc_tb): # Return False to re-raise any potential exceptions return False - def _new_pool(self, scheme, host, port): + def _new_pool(self, scheme, host, port, request_context=None): """ - Create a new :class:`ConnectionPool` based on host, port and scheme. + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. - 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. + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. 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 = self.pool_classes_by_scheme[scheme] - kwargs = self.connection_pool_kw + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + if scheme == 'http': - kwargs = self.connection_pool_kw.copy() for kw in SSL_KEYWORDS: - kwargs.pop(kw, None) + request_context.pop(kw, None) - return pool_cls(host, port, **kwargs) + return pool_cls(host, port, **request_context) def clear(self): """ @@ -155,18 +205,21 @@ def clear(self): """ self.pools.clear() - def connection_from_host(self, host, port=None, scheme='http'): + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): """ 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``. + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. """ if not host: raise LocationValueError("No host specified.") - request_context = self.connection_pool_kw.copy() + request_context = self._merge_pool_kwargs(pool_kwargs) request_context['scheme'] = scheme or 'http' if not port: port = port_by_scheme.get(request_context['scheme'].lower(), 80) @@ -186,9 +239,9 @@ def connection_from_context(self, request_context): pool_key_constructor = self.key_fn_by_scheme[scheme] pool_key = pool_key_constructor(request_context) - return self.connection_from_pool_key(pool_key) + return self.connection_from_pool_key(pool_key, request_context=request_context) - def connection_from_pool_key(self, pool_key): + def connection_from_pool_key(self, pool_key, request_context=None): """ Get a :class:`ConnectionPool` based on the provided pool key. @@ -204,22 +257,48 @@ def connection_from_pool_key(self, pool_key): return pool # Make a fresh ConnectionPool of the desired type - pool = self._new_pool(pool_key.scheme, pool_key.host, pool_key.port) + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) self.pools[pool_key] = pool return pool - def connection_from_url(self, url): + def connection_from_url(self, url, pool_kwargs=None): """ - 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. + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. """ u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs def urlopen(self, method, url, redirect=True, **kw): """ @@ -235,8 +314,9 @@ def urlopen(self, method, url, redirect=True, **kw): kw['assert_same_host'] = False kw['redirect'] = False + if 'headers' not in kw: - kw['headers'] = self.headers + kw['headers'] = self.headers.copy() if self.proxy is not None and u.scheme == "http": response = conn.urlopen(method, url, **kw) @@ -258,6 +338,16 @@ def urlopen(self, method, url, redirect=True, **kw): if not isinstance(retries, Retry): retries = Retry.from_int(retries, redirect=redirect) + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + headers = list(six.iterkeys(kw['headers'])) + for header in headers: + if header.lower() in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + try: retries = retries.increment(method, url, response=response, _pool=conn) except MaxRetryError: @@ -281,7 +371,7 @@ class ProxyManager(PoolManager): The URL of the proxy to be used. :param proxy_headers: - A dictionary contaning headers that will be sent to the proxy. In case + A dictionary containing 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. @@ -322,13 +412,13 @@ def __init__(self, proxy_url, num_pools=10, headers=None, super(ProxyManager, self).__init__( num_pools, headers, **connection_pool_kw) - def connection_from_host(self, host, port=None, scheme='http'): + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): if scheme == "https": return super(ProxyManager, self).connection_from_host( - host, port, scheme) + host, port, scheme, pool_kwargs=pool_kwargs) return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme) + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) def _set_proxy_headers(self, url, headers=None): """ diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/request.py b/Contents/Libraries/Shared/urllib3/request.py similarity index 94% rename from Contents/Libraries/Shared/requests/packages/urllib3/request.py rename to Contents/Libraries/Shared/urllib3/request.py index c0fddff04..8f2f44bb2 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/request.py +++ b/Contents/Libraries/Shared/urllib3/request.py @@ -36,7 +36,7 @@ class RequestMethods(object): explicitly. """ - _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) + _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} def __init__(self, headers=None): self.headers = headers or {} @@ -44,8 +44,8 @@ def __init__(self, headers=None): 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.") + raise NotImplementedError("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") def request(self, method, url, fields=None, headers=None, **urlopen_kw): """ @@ -60,6 +60,8 @@ def request(self, method, url, fields=None, headers=None, **urlopen_kw): """ method = method.upper() + urlopen_kw['request_url'] = url + if method in self._encode_url_methods: return self.request_encode_url(method, url, fields=fields, headers=headers, @@ -117,7 +119,7 @@ def request_encode_body(self, method, url, fields=None, headers=None, } When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimick behavior of browsers. + tuple) is optional but recommended to best mimic 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 diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/response.py b/Contents/Libraries/Shared/urllib3/response.py similarity index 82% rename from Contents/Libraries/Shared/requests/packages/urllib3/response.py rename to Contents/Libraries/Shared/urllib3/response.py index 6f1b63c8a..c112690b0 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/response.py +++ b/Contents/Libraries/Shared/urllib3/response.py @@ -11,7 +11,7 @@ BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, ResponseNotChunked, IncompleteRead, InvalidHeader ) -from .packages.six import string_types as basestring, binary_type, PY3 +from .packages.six import string_types as basestring, PY3 from .packages.six.moves import http_client as httplib from .connection import HTTPException, BaseSSLError from .util.response import is_fp_closed, is_response_to_head @@ -23,7 +23,7 @@ class DeflateDecoder(object): def __init__(self): self._first_try = True - self._data = binary_type() + self._data = b'' self._obj = zlib.decompressobj() def __getattr__(self, name): @@ -38,7 +38,11 @@ def decompress(self, data): self._data += data try: - return self._obj.decompress(data) + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed except zlib.error: self._first_try = False self._obj = zlib.decompressobj(-zlib.MAX_WBITS) @@ -48,21 +52,69 @@ def decompress(self, data): self._data = None +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + class GzipDecoder(object): def __init__(self): self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER def __getattr__(self, name): return getattr(self._obj, name) def decompress(self, data): - if not data: - return data - return self._obj.decompress(data) + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + if mode == 'gzip': return GzipDecoder() @@ -85,9 +137,8 @@ class is also compatible with the Python standard library's :mod:`io` 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. + If True, will attempt to decode the body based on the + 'content-encoding' header. :param original_response: When this HTTPResponse wrapper is generated from an httplib.HTTPResponse @@ -108,8 +159,9 @@ class is also compatible with the Python standard library's :mod:`io` 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, - retries=None, enforce_content_length=False, request_method=None): + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): if isinstance(headers, HTTPHeaderDict): self.headers = headers @@ -128,8 +180,10 @@ def __init__(self, body='', headers=None, status=0, version=0, reason=None, self._fp = None self._original_response = original_response self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url - if body and isinstance(body, (basestring, binary_type)): + if body and isinstance(body, (basestring, bytes)): self._body = body self._pool = pool @@ -187,6 +241,9 @@ def data(self): def connection(self): return self._connection + def isclosed(self): + return is_fp_closed(self._fp) + def tell(self): """ Obtain the number of bytes pulled over the wire so far. May differ from @@ -201,18 +258,18 @@ def _init_length(self, request_method): """ length = self.headers.get('content-length') - if length is not None and self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning("Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked.") - return None - - elif length is not None: + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + try: # RFC 7230 section 3.3.2 specifies multiple content lengths can # be sent in a single Content-Length header @@ -250,8 +307,13 @@ def _init_decoder(self): # 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 and content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) def _decode(self, data, decode_content, flush_decoder): """ @@ -470,6 +532,10 @@ def getheaders(self): def getheader(self, name, default=None): return self.headers.get(name, default) + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + # Overrides from io.IOBase def close(self): if not self.closed: @@ -565,6 +631,11 @@ def read_chunked(self, amt=None, decode_content=None): Similar to :meth:`HTTPResponse.read`, but with an additional parameter: ``decode_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. @@ -580,12 +651,17 @@ def read_chunked(self, amt=None, decode_content=None): "Body should be httplib.HTTPResponse like. " "It should have have an fp attribute which returns raw chunks.") - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + while True: self._update_chunk_length() if self.chunk_left == 0: @@ -616,3 +692,14 @@ def read_chunked(self, amt=None, decode_content=None): # We read everything; close the "file". if self._original_response: self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py b/Contents/Libraries/Shared/urllib3/util/__init__.py similarity index 95% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py rename to Contents/Libraries/Shared/urllib3/util/__init__.py index 5ced5a446..2f2770b62 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py +++ b/Contents/Libraries/Shared/urllib3/util/__init__.py @@ -7,6 +7,7 @@ SSLContext, HAS_SNI, IS_PYOPENSSL, + IS_SECURETRANSPORT, assert_fingerprint, resolve_cert_reqs, resolve_ssl_version, @@ -32,6 +33,7 @@ __all__ = ( 'HAS_SNI', 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', 'SSLContext', 'Retry', 'Timeout', diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py b/Contents/Libraries/Shared/urllib3/util/connection.py similarity index 86% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py rename to Contents/Libraries/Shared/urllib3/util/connection.py index bf699cfd0..5ad70b2f1 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py +++ b/Contents/Libraries/Shared/urllib3/util/connection.py @@ -1,7 +1,7 @@ from __future__ import absolute_import import socket -from .wait import wait_for_read -from .selectors import HAS_SELECT, SelectorError +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ def is_connection_dropped(conn): # Platform-specific @@ -19,14 +19,11 @@ def is_connection_dropped(conn): # Platform-specific return False if sock is None: # Connection already closed (such as by httplib). return True - - if not HAS_SELECT: - return False - try: - return bool(wait_for_read(sock, timeout=0.0)) - except SelectorError: - return True + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False # This function is copied from socket.py in the Python 2.7 standard @@ -109,6 +106,13 @@ def _has_ipv6(host): sock = None has_ipv6 = False + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + if socket.has_ipv6: # has_ipv6 returns true if cPython was compiled with IPv6 support. # It does not tell us if the system has IPv6 support enabled. To diff --git a/Contents/Libraries/Shared/urllib3/util/queue.py b/Contents/Libraries/Shared/urllib3/util/queue.py new file mode 100644 index 000000000..d3d379a19 --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/request.py b/Contents/Libraries/Shared/urllib3/util/request.py similarity index 97% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/request.py rename to Contents/Libraries/Shared/urllib3/util/request.py index 974fc40a7..3ddfcd559 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/request.py +++ b/Contents/Libraries/Shared/urllib3/util/request.py @@ -108,7 +108,7 @@ def rewind_body(body, body_pos): try: body_seek(body_pos) except (IOError, OSError): - raise UnrewindableBodyError("An error occured when rewinding request " + raise UnrewindableBodyError("An error occurred when rewinding request " "body for redirect/retry.") elif body_pos is _FAILEDTELL: raise UnrewindableBodyError("Unable to record file position for rewinding " diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/response.py b/Contents/Libraries/Shared/urllib3/util/response.py similarity index 87% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/response.py rename to Contents/Libraries/Shared/urllib3/util/response.py index 67cf730ab..3d5486485 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/response.py +++ b/Contents/Libraries/Shared/urllib3/util/response.py @@ -59,8 +59,14 @@ def assert_header_parsing(headers): get_payload = getattr(headers, 'get_payload', None) unparsed_data = None - if get_payload: # Platform-specific: Python 3. - unparsed_data = get_payload() + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload if defects or unparsed_data: raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py b/Contents/Libraries/Shared/urllib3/util/retry.py similarity index 91% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py rename to Contents/Libraries/Shared/urllib3/util/retry.py index c9e7d2873..02429ee8e 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py +++ b/Contents/Libraries/Shared/urllib3/util/retry.py @@ -19,6 +19,7 @@ log = logging.getLogger(__name__) + # Data structure for representing the metadata of requests that result in a retry. RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", "status", "redirect_location"]) @@ -85,6 +86,14 @@ class Retry(object): Set to ``False`` to disable and imply ``raise_on_redirect=False``. + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + :param iterable method_whitelist: Set of uppercased HTTP method verbs that we should retry on. @@ -106,7 +115,7 @@ class Retry(object): (most errors are resolved immediately by a second try without a delay). urllib3 will sleep for:: - {backoff factor} * (2 ^ ({number of total retries} - 1)) + {backoff factor} * (2 ** ({number of total retries} - 1)) seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer @@ -131,6 +140,10 @@ class Retry(object): Whether to respect Retry-After header on status codes defined as :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. """ DEFAULT_METHOD_WHITELIST = frozenset([ @@ -138,17 +151,21 @@ class Retry(object): RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + #: Maximum backoff time. BACKOFF_MAX = 120 - def __init__(self, total=10, connect=None, read=None, redirect=None, + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, backoff_factor=0, raise_on_redirect=True, raise_on_status=True, - history=None, respect_retry_after_header=True): + history=None, respect_retry_after_header=True, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): self.total = total self.connect = connect self.read = read + self.status = status if redirect is False or total is False: redirect = 0 @@ -162,17 +179,20 @@ def __init__(self, total=10, connect=None, read=None, redirect=None, self.raise_on_status = raise_on_status self.history = history or tuple() self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = frozenset([ + h.lower() for h in remove_headers_on_redirect]) def new(self, **kw): params = dict( total=self.total, - connect=self.connect, read=self.read, redirect=self.redirect, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, method_whitelist=self.method_whitelist, status_forcelist=self.status_forcelist, backoff_factor=self.backoff_factor, raise_on_redirect=self.raise_on_redirect, raise_on_status=self.raise_on_status, history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect ) params.update(kw) return type(self)(**params) @@ -300,7 +320,7 @@ def is_retry(self, method, status_code, has_retry_after=False): def is_exhausted(self): """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect) + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) retry_counts = list(filter(None, retry_counts)) if not retry_counts: return False @@ -330,6 +350,7 @@ def increment(self, method=None, url=None, response=None, error=None, connect = self.connect read = self.read redirect = self.redirect + status_count = self.status cause = 'unknown' status = None redirect_location = None @@ -361,6 +382,8 @@ def increment(self, method=None, url=None, response=None, error=None, # status_forcelist and a the given method is in the whitelist cause = ResponseError.GENERIC_ERROR if response and response.status: + if status_count is not None: + status_count -= 1 cause = ResponseError.SPECIFIC_ERROR.format( status_code=response.status) status = response.status @@ -369,7 +392,7 @@ def increment(self, method=None, url=None, response=None, error=None, new_retry = self.new( total=total, - connect=connect, read=read, redirect=redirect, + connect=connect, read=read, redirect=redirect, status=status_count, history=history) if new_retry.is_exhausted(): @@ -381,7 +404,7 @@ def increment(self, method=None, url=None, response=None, error=None, def __repr__(self): return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' - 'read={self.read}, redirect={self.redirect})').format( + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( cls=type(self), self=self) diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py b/Contents/Libraries/Shared/urllib3/util/ssl_.py similarity index 76% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py rename to Contents/Libraries/Shared/urllib3/util/ssl_.py index c4c55df63..5ae435827 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py +++ b/Contents/Libraries/Shared/urllib3/util/ssl_.py @@ -2,16 +2,19 @@ import errno import warnings import hmac +import socket from binascii import hexlify, unhexlify from hashlib import md5, sha1, sha256 from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six SSLContext = None HAS_SNI = False IS_PYOPENSSL = False +IS_SECURETRANSPORT = False # Maps the length of a digest to a possible hash function producing this digest HASHFUNC_MAP = { @@ -52,6 +55,26 @@ def _const_compare_digest_backport(a, b): OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 OP_NO_COMPRESSION = 0x20000 + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + # A secure default. # Sources for more information on TLS ciphers: # @@ -60,13 +83,17 @@ def _const_compare_digest_backport(a, b): # - 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 TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), # - prefer ECDHE over DHE for better performance, # - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and # security, # - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, # - disable NULL authentication, MD5 MACs and DSS for security reasons. DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', 'ECDH+AESGCM', 'ECDH+CHACHA20', 'DH+AESGCM', @@ -87,10 +114,7 @@ def _const_compare_digest_backport(a, b): except ImportError: import sys - class SSLContext(object): # Platform-specific: Python 2 & 3.1 - supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or - (3, 2) <= sys.version_info) - + class SSLContext(object): # Platform-specific: Python 2 def __init__(self, protocol_version): self.protocol = protocol_version # Use default values from a real SSLContext @@ -113,12 +137,6 @@ def load_verify_locations(self, cafile=None, capath=None): raise SSLError("CA directories not supported in older Pythons") 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, server_side=False): @@ -139,10 +157,7 @@ def wrap_socket(self, socket, server_hostname=None, server_side=False): 'ssl_version': self.protocol, 'server_side': server_side, } - 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) + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) def assert_fingerprint(cert, fingerprint): @@ -178,7 +193,7 @@ def resolve_cert_reqs(candidate): 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. + :mod:`ssl` module or its abbreviation. (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. @@ -248,6 +263,8 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None, """ context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + # Setting the default here, as we may have no ssl module on import cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs @@ -263,9 +280,6 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None, 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 # We do our own verification, including fingerprints and alternative @@ -288,8 +302,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, 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. + A string of ciphers we wish the client to support. :param ca_cert_dir: A directory containing CA certificates in multiple separate files, as supported by OpenSSL's -CApath flag or the capath argument to @@ -306,7 +319,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, if ca_certs or ca_cert_dir: try: context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + except IOError as e: # Platform-specific: Python 2.7 raise SSLError(e) # Py33 raises FileNotFoundError which subclasses OSError # These are not equivalent unless we check the errno attribute @@ -314,23 +327,58 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, if e.errno == errno.ENOENT: raise SSLError(e) raise - elif getattr(context, 'load_default_certs', None) is not None: + + # Don't load system certs unless there were no CA certs or + # SSLContext object specified manually. + elif ssl_context is None and hasattr(context, 'load_default_certs'): # try to load OS default certs; works well on Windows (require Python3.4+) context.load_default_certs() 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) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Subject Name ' - 'Indication) extension to TLS is not available on this platform. ' - 'This may cause the server to present an incorrect TLS ' - 'certificate, which can cause validation failures. You can upgrade to ' - 'a newer version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - SNIMissingWarning - ) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py b/Contents/Libraries/Shared/urllib3/util/timeout.py similarity index 100% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py rename to Contents/Libraries/Shared/urllib3/util/timeout.py diff --git a/Contents/Libraries/Shared/requests/packages/urllib3/util/url.py b/Contents/Libraries/Shared/urllib3/util/url.py similarity index 96% rename from Contents/Libraries/Shared/requests/packages/urllib3/util/url.py rename to Contents/Libraries/Shared/urllib3/util/url.py index 61a326e44..6b6f9968d 100644 --- a/Contents/Libraries/Shared/requests/packages/urllib3/util/url.py +++ b/Contents/Libraries/Shared/urllib3/util/url.py @@ -6,6 +6,10 @@ url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + class Url(namedtuple('Url', url_attrs)): """ @@ -21,7 +25,7 @@ def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, path = '/' + path if scheme: scheme = scheme.lower() - if host: + if host and scheme in NORMALIZABLE_SCHEMES: host = host.lower() return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) diff --git a/Contents/Libraries/Shared/urllib3/util/wait.py b/Contents/Libraries/Shared/urllib3/util/wait.py new file mode 100644 index 000000000..4db71bafd --- /dev/null +++ b/Contents/Libraries/Shared/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/Contents/Strings/da.json b/Contents/Strings/da.json new file mode 100644 index 000000000..61d4b3b34 --- /dev/null +++ b/Contents/Strings/da.json @@ -0,0 +1,441 @@ +{ + "sq": "Albansk", + "ar": "Arabisk", + "be": "Hviderussisk", + "bs": "Bosnisk", + "bg": "Bulgarisk", + "ca": "Catalansk", + "zh": "Kinesisk", + "hr": "Kroatisk", + "cs": "Tjekkisk", + "da": "Dansk", + "nl": "Hollansk", + "en": "Engelsk", + "et": "Estisk", + "fa": "Persisk", + "fi": "Finsk", + "fr": "Fransk", + "de": "Tysk", + "el": "Græsk", + "he": "Hebrarisk", + "hi": "Hindi", + "hu": "Ungarsk", + "is": "Islansk", + "id": "Indonesisk", + "it": "Italiensk", + "ja": "Japansk", + "ko": "Koreansk", + "lv": "Lettisk", + "lt": "Litauisk", + "mk": "Makedonsk", + "ms": "Malajsisk", + "no": "Norsk", + "pl": "Polsk", + "pt": "Portugisisk", + "pt-br": "Portugisisk (Brasiliansk)", + "ro": "Romansk", + "ru": "Russisk", + "sr": "Serbisk", + "sr-cyrl": "Serbisk (Cyrillic)", + "sr-latn": "Serbisk (Latin)", + "sk": "Slovakisk", + "sl": "Slovensk", + "es": "Spansk", + "sv": "Svensk", + "th": "Thaisk", + "tr": "Tyrkisk", + "uk": "Ukrainsk", + "vi": "Vietnamesisk", + "Internal stuff, pay attention!": "Interne ting, vær opmærksom!", + "Advanced": "Avanceret", + "advanced": "avanceret", + "Enter PIN": "Indtast Pin", + "The owner has restricted the access to this menu. Please enter the correct pin": "Ejeren har begrænset adgangen til denne menu. Venligst indtast den rigtige PIN kode", + "Restart the plugin": "Genstart Plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Hent mine logs (kopier det viste link og åben det i din browser)", + "Copy the appearing link and open it in your browser, please": "Kopier det viste link og åben det i din browser", + "Trigger find better subtitles": "Trigger find bedre undertekster", + "Skip next find better subtitles (sets last run to now)": "Spring næste Find bedre undertekster over (sæt sidste kørsel til nu)", + "Trigger subtitle storage maintenance": "Start undertekst lager vedligehold", + "Trigger subtitle storage migration (expensive)": "Start migration af undertekst lagre (dyrt?)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Start cache vedligehold (for refiners, udbydere og pakker/arkiver)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Brug de standard konfigurede undertekst-mods til alle (aktive) gemte undertekster", + "Re-Apply mods of all stored subtitles": "Genindsæt alle mods for alle gemte undertekster", + "Log the plugin's scheduled tasks state storage": "Log plugins planlagte aktivitets lagerstatus", + "Log the plugin's internal ignorelist storage": "Log plugins interne ignoreliste lager", + "Log the plugin's complete state storage": "Log plugins komplette lager status", + "Reset the plugin's scheduled tasks state storage": "Nulstil plugins planlagte aktivitets lagerstatus", + "Reset the plugin's internal ignorelist storage": "Nulstil plugins internet ignoreliste lager", + "Invalidate Sub-Zero metadata caches (subliminal)": "Afkræft Sub-Zero metadata cache (subliminale)", + "Reset provider throttle states": "Nulstil udbyders throttle status", + "Restarting the plugin": "Genstarter plugin", + "Restart triggered, please wait about 5 seconds": "Genstart aktiveret, vent venligst ca. 5 sekunder", + "Reset subtitle storage": "Nulstil undertekst lager", + "Are you sure?": "Er du sikker?", + "Are you really sure?": "Er du helt sikker?", + "Success": "Succes", + "FindBetterSubtitles triggered": "FindBedreUndertekster startet", + "FindBetterSubtitles skipped": "FindBedreUndertekster sprunget over", + "SubtitleStorageMaintenance triggered": "Undertekst lager vedligehold startet", + "MigrateSubtitleStorage triggered": "Migration af undertekst lager startet", + "TriggerCacheMaintenance triggered": "Udløseren for Cache vedligehold startet", + "This may take some time ...": "Dette kan tage et stykke tid ...", + "Download Logs": "Download logs", + "Sorry, feature unavailable": "Beklager, men ikke tilgængelig", + "Universal Plex token not available": "Universal Plex token er ikke tilgængelig", + "Copy this link and open this in your browser, please": "Kopier venligst dette link, og åben i en browser", + "Cache invalidated": "Cache ugyldig", + "Enter PIN number ": "Indtast PIN nummer ", + "PIN correct": "PIN korrekt", + "Reset": "Nulstil", + "Menu locked": "Menu låst", + "Provider throttles reset": "Udbyders throttle nulstilles", + "Information Storage (%s) reset": "Informationslager (%s) nulstilles", + "Information Storage (%s) logged": "Informationslager (%s) logget", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex retunerede ingen information vedr. mediet. Venligst opdater det i Plex, og forsøg igen", + "Item not found: %s!": "Media ikke fundet: %s!", + "< Back to %s": "< Tilbage til %s", + "Back to %s > %s": "Tilbage til %s > %s", + "Refresh: %s": "Opdater: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Start en tvungen opdatering som ignorer kendte undertekster og søger efter nye", + "Extract and activate embedded subtitle streams": "Extrakt og aktiver undertekster fra selve mediet", + "Inspect currently blacklisted subtitles": "Undersøg nuværende undertekster i karantæne", + "Subtitle saved to disk": "Undertekster gemt på disk", + "Remove subtitle from blacklist": "Fjern undertekst fra karantæne", + "No subtitles found": "Ingen undertekster fundet", + " (unknown)": " (Ukendt)", + " (forced)": " (Tvunget)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Udpakker indlejrede undertekster %s som del af %s:%s startet", + "Insufficient permissions": "Utilstrækkelig rettigheder", + "I'm not enabled!": "Jeg er ikke aktiveret!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Venligst aktiver mig til nogle af dine biblioteker i dine server indstillinger; lige nu gør jeg ingenting", + "Working ... refresh here": "Arbejder ... Opdater her", + "Current state: %s; Last state: %s": "Nuværende status: %s; Sidste status: %s", + "On-deck items": "Skrivebords medier", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Viser de %s sidste afspillede titler og giver dig mulighed for individuelt (gennem tvinge) at opdatere deres metadata/undertekster. ", + "Recently-added items": "Nylig tilføjet media", + "Recently played items": "Nylig afspillet media", + "Shows the recently added items per section.": "Vis seneste tilføjede media pr. sektion", + "Show recently added items with missing subtitles": "Vis seneste tilføjede hvor undertekster mangler", + "Browse all items": "Gennemse alle media", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Gå igennem hele dit bibliotek og håndter din ignorer-liste. Du kan også (gennemtvinge) en opdatering af metadata/undertekster og de enkelte elementer.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Sidste gennemgang: %s; Næste planlagte gennemgang: %s; Sidste gennemløbs tid: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Søg efter manglende undertekster (blandt de sidste tilføjede titler, maksimal alder: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatisk periodisk gennemløb af jobplanlæggeren, såfremt konfigureret. %s.", + "Show the current ignore list (mainly used for the automatic tasks)": "Hvis den nuværende ignorer liste (hovedsageligt brugt for de automatiske opgaver)", + "History": "Historie", + "Show the last %i downloaded subtitles": "Vis de sidste %i hentede undertekster", + "Refresh": "Opdater", + "Re-lock menu(s)": "Gen aflås meny(er)", + "Enabled the PIN again for menu(s)": "Aktiver PIN igen for meny(er)", + "Throttled providers: %s": "Throttled udbydere: %s", + "Advanced functions": "Avancerede funktioner", + "Use at your own risk": "Brug for egen risiko", + "Items On Deck": "Elementer på skrivebord", + "Recently Played": "Nyeligt afspillede", + "Items with missing subtitles": "Titler som mangler undertekster", + "Find recent items with missing subtitles": "Find seneste medias hvor undertekster mangler", + "Updating, refresh here ...": "Opdaterer, klik her for ny status ...", + "Missing: %s": "Mangler: %s", + "Didn't change the ignore list": "Ændre ikke ignorer-listen", + "Sections": "Sektioner", + "All": "Alle", + "show": "vis", + "movie": "film", + "<< Back to home": "<< Tilbage til hoved menu", + "Auto-Find subtitles: %s": "Auto-Find undertekster: %s", + "Extracting of embedded subtitles for %s triggered": "Udpakning af indlejrede undertekster for %s fundne", + "< Back to subtitle options for: %s": "< Tilbage til undertekst muligheder for: %s", + "Remove last applied mod (%s)": "Fjern sidste aktive", + "none": "ingen", + "Manage applied mods": "Håndter de gældende mods", + "Reapply applied mods": "Genaktiver de pågældende mods", + "Restore original version": "Gendan orginal version", + "< Back to subtitle modification menu": "< Tilbage til undertekst modifikations meny", + "subs constantly getting faster": "Undertekster bliver konstant hurtigere", + "subs constantly getting slower": "Undertekster bliver konstant langsommere", + "< Back to subtitle modifications": "< Tilbage til undertekst ændringer", + "< Back to unit selection": "< Tilbage til enheds valg ", + "Subtitle Language (1)": "Undertekst sprog (1)", + "Subtitle Language (2)": "Undertekst sprog (2)", + "Subtitle Language (3)": "Undertekst sprog (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Flere Undertekst sprog (brug ISO-639-1 koder; kommasepareret)", + "Only download foreign/forced subtitles": "Download kun fremmede/gennemtvungne undertekster", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Vis sprog med lande attributer som i ISO639-1 (f.eks. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Behandel sprog med lande attributer som i ISO 639-1 (f.eks hent ikke pt-BR hvis pt undertekster findes)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Indskrænk til et sprog (tilføj ikke \".lang\" til underteksters filnavn; brug kun \"Undertekst sprog (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Indlejrede undertekster: Behandel \"Udefineret\" som sprog 1", + "I rename my files using": "Jeg omdøber mine filer med", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Genskab det originale filnavn fra .file_info/file_info indeks filer (se wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (tilføj URL databse hvis konfigureret)", + "Sonarr API key": "Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (tilføj URL database hvos konfigireret, min. version: 0.2.0.897)", + "Radarr API key": "Radarr API key", + "Provider: Enable OpenSubtitles": "Provider: Aktiver OpenSubtitles", + "Opensubtitles Username": "Opensubtitles Brugernavn", + "Opensubtitles Password": "Opensubtitles Kodeord", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (reklamefri undertekster, 1000 undertekster/dag, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Provider: Aktiver Podnapisi.NET", + "Provider: Enable Titlovi.com": "Provider: Aktiver Titlovi.com", + "Provider: Enable Addic7ed": "Provider: Aktiver Addic7ed", + "Addic7ed Username": "Addic7ed Brugernavn", + "Addic7ed Password": "Addic7ed Kodeord", + "Addic7ed: boost score (if requirements met)": "Addic7ed: boost score (hvis betingelser er opfyldt)", + "Addic7ed: Use random user agents": "Addic7ed: Brug tilfældig bruger agent", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Provider: Aktiver Legendas TV (for det meste pt-BR; UNRAR skal være tilgængelig)", + "Legendas TV Username": "Legendas TV Brugernavn", + "Legendas TV Password": "Legendas TV Kodeord", + "Provider: Enable TVsubtitles.net": "Provider: Aktiver TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)": "Provider: Aktiver NapiProjekt.pl (Polsk)", + "Provider: Enable SubScene (TV shows)": "Provider: Aktiver SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: Aktiver hosszupuskasub.com (Ungaren)", + "Provider: Enable aRGENTeaM (Spanish)": "Provider: Aktiver aRGENTeaM (Spansk)", + "Search enabled providers simultaneously (multithreading)": "Søg flere providers samtidigt (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Udpak automatisk og brug indlejrede undertekster når nyt indlægges (med konfigurerede default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Efter automatisk udpakning af indlejrede undertekster skal der straks søges efter tilgængelige undertekster?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Søg ikke efter undertekster for et sprog når der er indlejrede undertekster i et medies fil (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Søg ikke efter undertekster for et sprog hvis det allerede eksisterer i filsystemet (metadata/filsystem)?", + "How strict should these subtitles existing on the filesystem be detected?": "Hvor eksakt skal undertekster på fil systemet blive fundet?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Inkluder ikke-tekst undertekst formater (alt andet end .srt/.ssa/.ass/.vtt; indlejret eller eksternt) i det ovenstående?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; læs http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimum score for film(min: 60, def/sane: 69, min-ideal: 82; læs http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Hent undertekster for hørehæmmet", + "Remove Hearing Impaired tags from downloaded subtitles": "Fjern hørehæmmet dele fra undertekst", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Fjern formatering fra hentede undertekster (fremhævet, kursiv, understreget, farver ...)", + "Fix common issues in subtitles": "Fix std. fejl med undertekster", + "Fix common OCR errors in downloaded subtitles": "Fix almindelige OCR fejl i downloadede undertekster", + "Reverse punctuation in RTL languages (heb)": "Genindkald tegnsætning i RTL sprog (hebræisk)", + "Change colors of subtitles to": "Slå farve på undertekster til", + "Store subtitles next to media files (instead of metadata)": "Gem undertekster sammen med medie filer (Istedet for internt i Plex)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Undertekster formater der gemmes (non-SRT virker kun såfremt forrige option er aktiveret)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Undertekst bibliotek (\"Nuværede bibliotek\" er det bibliotek som det aktive medies fil lever i)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Brugertilpas Undertekst bibliotek (overskriver \"Undertekst bibliotek\"; udregner den rette sti)", + "Fall back to metadata storage if filesystem storage failed": "Fald tilbage til metadata lager såfremt filsystem lager fejlede", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Sæt undertekst fils egenskaber til (integer, f.eks: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Slet automatisk overskuds/ubrugte (eksternt gemte) undertekster", + "On media playback: search for missing subtitles (refresh item)": "Ved mediets playback: søg efter manglende undertekster (genindlæs dem)", + "Scheduler: Periodically search for recent items with missing subtitles": "Jobplanlægger: Periodisk søgning efter titler med manglende undertekster", + "Scheduler: Item age to be considered recent": "Jobplanlægger: En titles alder anses som fornylig", + "Scheduler: Recent items to consider per library": "Jobplanlægger: Fornylige titler at blive undersøgt per bibliotek", + "Scheduler: Periodically search for better subtitles": "Jobplanlægger:Periodisk søgning efter bedre undertekster", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Jobplanlægger: Dage til søgning efter bedre undertekster (max: 30 dage)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Jobplanlægger: Søg ikke efter bedre undertekster såfremt titlens dato er ældre end", + "Scheduler: Overwrite manually selected subtitles when better found": "Jobplanlægger: Overskriv manuelt valgte undertekster når bedre er fundet", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Jobplanlægger: Overskriv undertekster når ikke-default undertekster ændringer såfremt bedre er fundet", + "History: amount of items to store historical data for": "Historie: antallet af titler som der skal gemmes historiske data for", + "How many download tries per subtitle (on timeout or error)": "Hvormange downloads forsøg per titel (på timeout eller fejl)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignorer biblioteker (med \"subzero.ignore/.subzero.ignore/.nosz\" filer i dem)", + "Ignore anything in the following paths (comma-separated)": "Ignorer alting i det følgende bibliotek (kommesepareret)", + "Sub-Zero mode": "Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)": "PIN (tilfældig antal af nummere , 0-9)", + "Access PIN valid for minutes": "Pin er gyldig i minutter", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Brug PIN til at hindre adgang til (kræver plugin eller PMS genstart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Kald denne eksekverebare såfremt undertekst download (se i WIKI for detaljer)", + "Check for correct folder permissions of every library on plugin start": "Undersøg for de korrekte biblioteks tilladelser på hvert bibliotek når plugin stater op", + "Use new style caching (for subliminal)": "Brug ny stil cacing (til sublimiral)", + "Low impact mode (for remote filesystems)": "Lille indvirkrning tilstand (for remote filsystemer)", + "Timeout for API requests sent to the PMS": "Timeout for kommunikation med Plex server", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy til brug for udbydere (understøtter legitimation)", + "How verbose should the logging be?": "Hvor ordrig/omfattende skal logning være?", + "How many log backups to keep?": "Hvormange log backups skal gemmes?", + "Log subtitle modification (debug)": "Log til modifikation af undertekster (debug)", + "Log to console (for development/debugging)": "Log til console (for udvikling/fejlfinding)", + "Collect anonymous usage statistics": "Indsaml anonymt brugs statistik", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (indsæt api information nedenfor)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symlink til original fil", + "I keep the original filenames": "Jeg beholder de orginale fil navne", + "none of the above": "Ingen af ovenstående", + "exact: media filename match": "eksakt: mediets filnavn stemmer", + "loose: filename contains media filename": "løs: filnavn indeholder mediets filnavn", + "any": "alle", + "prefer": "foretræk", + "don't prefer": "foretræk ikke", + "force HI": "brug kun hørehæmmet", + "force non-HI": "brug ikke hørehæmmet", + "don't change": "skift ikke", + "white": "hvid", + "light-grey": "lysegrå", + "red": "rød", + "green": "grøn", + "yellow": "gul", + "blue": "blå", + "magenta": "magenta", + "cyan": "cyan", + "black": "sort", + "dark-red": "mørkerød", + "dark-green": "mørkegrøn", + "dark-yellow": "mørkegul", + "dark-blue": "mørkeblå", + "dark-magenta": "mørkemagenta", + "dark-cyan": "mørkecyan", + "dark-grey": "mørkegrå", + "current folder": "nuværende folder", + "never": "aldrig", + "current media item": "nuværende titel", + "next episode (series)": "næste episode (serier)", + "hybrid: current item or next episode": "hybrid: nuværende titel eller næste afsnit", + "hybrid-plus: current item and next episode": "hybrid-plus: nuværende titel eller næste afsnit", + "every 6 hours": "hver 6 time", + "every 12 hours": "hver 12 time", + "every 24 hours": "hver 24 time", + "1 days": "hver dag", + "2 days": "hver 2 dag", + "3 days": "hver 3 dag", + "4 days": "hver 4 dag", + "1 weeks": "hver uge", + "2 weeks": "hver 2 uge", + "3 weeks": "hver 3 uge", + "4 weeks": "hver 4 uge", + "5 weeks": "hver 5 uge", + "6 weeks": "hver 6 uge", + "12 weeks": "hver 12 uge", + "don't limit": "ingen begrænsning", + "1 year": "1 år", + "2 years": "2 år", + "3 years": "3 år", + "4 years": "4 år", + "5 years": "5 år", + "6 years": "6 år", + "7 years": "7 år", + "8 years": "8 år", + "9 years": "9 år", + "10 years": "10 år", + "only agent": "kun agent", + "disabled": "ikke aktiv", + "advanced menu": "advanceret menu", + "CRITICAL": "KRITISK", + "ERROR": "FEJL", + "WARNING": "ADVARSEL", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Gennemtving-find undertekster: %(item_title)s", + "File %(file_part_index)s: ": "Fil %(file_part_index)s:␣", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)s Ingen undertekster for nuværende gemt", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sNuværende undertekst: %(provider_name)s (tilføjet: %(date_added)s, %(mode)s), Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sAdministrer %(language)s undertekster", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sVis %(language)s undertekster", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sIndlejrede undertekster (%(language)s)", + "Select active %(language)s subtitle": "Vælg aktive %(language)s undertekster", + "%(count)d subtitles in storage": "%(count)d undertekster gemt", + "List available %(language)s subtitles": "Vis tilgængelige %(language)s undertekster", + "Modify current %(language)s subtitle": "Modificer nuværende %(language)s undertekst", + "Currently applied mods: %(mod_list)s": "Nuværende gældende mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Blacklist nuværende %(language)s undertekst og søg efter en ny", + "Manage blacklist (%(amount)s contained)": "Administrer blacklist (%(amount)s indeholdt)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ": "Nuværende: ", + "Stored: ": "Gemt: ", + "by %(release_group)s": "af %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Nuværende: %(provider_name)s (%(score)s)␣", + "Search for %(language)s subs (%(video_data)s)": "Søg efter %(language)s undertekster (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sFilenavn: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Søger efter %(language)s undertekster (%(video_data)s), opdater her...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " ␣(forkert FPS, undertekst: %(subtitle_fps)s, medie: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": "␣(forkert FPS, undertekst: %(subtitle_fps)s, medie: ukendt, lav betydnings modus)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Udgivelse: %(release_info)s, Stemmer: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Henter undertekster for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Udpak stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s med gældende mods", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Udpak stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Utilstrækkelig tilladelser for bibliotek %(title)s, Sti: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Kører: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Vis ignorer listen (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s indtil %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Udpakker undertekst %(stream_index)s af %(filename)s", + "Extract missing %(language)s embedded subtitles": "Udpakker manglende %(language)s indlejrede undertekster", + "Extract and activate %(language)s embedded subtitles": "Udpak og aktiver %(language)s indlejrede undertekster", + "None": "Ingen", + "Idle": "Venter", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Justeret med %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "tilføjet: %(date_added)s, %(mode)s, Sprog: %(language)s, Score: %(score)i, Lager: %(storage_type)s", + "Remove: %(mod_name)s": "Fjern: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Undertekst download fejlede (%(item_id)s)", + "agent + interface": "agent + interface", + "only interface": "kun interface", + "interface": "interface", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Vis nuværende desktop titler og du kan individuelt (gennemtvinge) en opdatering af metadata/undertekster.", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Vis titler med manglende undertekster. Klik på \"Find seneste titler med manglende undertekster\" for at opdatere listen", + "Add %(kind)s %(title)s to the ignore list": "Tilføj %(kind)s %(title)s til ignorer listen", + "Remove %(kind)s %(title)s from the ignore list": "Fjern %(kind)s %(title)s fra ignorer listen", + "%(title)s added to the ignore list": "%(title)s tilføjet til ignorer listen", + "%(title)s removed from the ignore list": "%(title)s fjernet fra ignorer listen", + "Triggering refresh for %(title)s": "Aktiver genindlæsning for %(title)s", + "Triggering forced refresh for %(title)s": "Aktiver gennemtvunget opdatering for %(title)s", + "Refresh of item %(item_id)s triggered": "Opdatering af %(item_id)s titler er aktiveret", + "Forced refresh of item %(item_id)s triggered": "Gennemtvunget opdatering af %(item_id)s titler er aktiveret", + "Ignore %(kind)s \"%(title)s\"": "Ignorer %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Ikke-ignorer %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Genindlæser %(title)s", + "Force-refreshing %(title)s": "Gennentvunget-opdatering %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Udpakker de endnu ikke udpakkede indlejrede undertekster fra alle afsnit for nuværende sæson ved brug af de konfigurede default indstillede rettelser \n", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Udpakker indlejrede undertekster fra alle afsnit for nuværende sæson ved brug af de konfigurede default indstillede rettelser", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Genindlæser %(the_movie_series_season_episode)s, sandsynligvis søges der efter manglende undertekster ellers anvendes nye fra disken", + "the movie": "filmen", + "the series": "serien", + "the episode": "episoden", + "the season": "sæsonen", + "Change the color of the subtitle": "Skift farve på underteksten", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Tilføjer den valgte farve til hver linje i underteksten. Support afhænger af afspiller.", + "Basic common fixes": "Basale fælles rettelser", + "Fix common and whitespace/punctuation issues in subtitles": "Ret fælles og whitespace/tegnsætnings problemer i undertekster", + "Remove all style tags": "Fjern alle style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Fjern alle mulige style tags fra underteksten såsom font, fed, farve osv.", + "Reverse punctuation in RTL languages": "Omvend tegnsætning i RTL sprog", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Nogle afspille håndterer ikke højre-til-venstre tegnsætning korrekt. Fysisk ændring af tegnsætning. Gældende for sprog som: hebræisk", + "Change the FPS of the subtitle": "Ændre FPS for undertekst", + "Re-syncs the subtitle to the framerate of the current media file.": "Gensynkroniser underteksten med frameraten på den nuværende medie fil.", + "Remove Hearing Impaired tags": "Fjern Høresvækkede tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Fjern tags, tekst og tegn fra underteksten som er tiltænkt høresvækkede mennesker", + "Fix common OCR issues": "Ret fælles OCR problemer", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Ret problemer når en undertekst bliver oversat fra bitmap eller gennem OCR", + "Change the timing of the subtitle": "Ændre timingen på underteksten", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Tilføj eller fjern en vis tid fra underteksten så den matcher din medie", + "Available": "Tilgængelig", + "Current": "Nuværende", + "Custom path to advanced_settings.json": "Bruger defineret sti til advanced_settings.json", + "zh-hant": "Kinesisk (Traditionelt)", + "zh-hans": "Kinesisk (Simpel)", + "Reset the plugin's menu history storage": "Reset plugin'ens meny historie lager ", + "forced": "gennemtvunget", + "%s in %s (%s, score: %s), %s": "%s i %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Udtræk indlejrede undertekster", + "Display %(incl_excl_list_name)s (%(count)d)": "Vis %(incl_excl_list_name)s liste (%(count)d)", + "include list": "inkluder liste", + "ignore list": "ignorer liste", + "Include list": "Inkluder lsite", + "Ignore list": "Ignorer liste", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Vis den aktuelle %(incl_excl_list_name)s liste (mest brugt af det automatiske job)", + "Didn't change the %(incl_excl_list_name)s": "Ændrede ikke %(incl_excl_list_name)s", + "%(title)s added to the include list": "%(title)s føjet til listen som skal indsættes", + "%(title)s removed from the include list": "%(title)s fjernet fra listen som skal indsættes", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Aktiver Sub-Zero for %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deaktiver Sub-Zero for %(kind)s \"%(title)s\"", + "Download subtitles": "Download undertekster", + "Never": "Aldrig", + "Always": "Altid", + "When main audio stream is not Subtitle Language (1)": "Når primær lyd ikke er undertekst sprog (1)", + "When main audio stream is not any configured language": "Når primær lyd ikke er det indstillede sprog", + "When any audio stream is not Subtitle Language (1)": "Når ingen lyd er Undertekst sprog (1)", + "When any audio stream is not any configured language": "Når ingen lyd er det indstillede sprog", + "Download foreign/forced subtitles": "Download fremmede/tvungne undertekster", + "Only for Subtitle Language (1)": "Kun for Undertekst Sprog (1)", + "Only for Subtitle Language (2)": "Kun for Undertekst Sprog (2)", + "Only for Subtitle Language (3)": "Kun for Undertekst Sprog (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Indlejrede stream: Behandl \"Udefineret\" (und) som sprog 1", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Fortryd tegnsætning i RTL sprog (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Ændre kun for store-bogstaver undertekster", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Skal SZ være aktiveret eller ikke aktiveret som standard? (har indflydelse på indstillinger nedenfor og i plugin's meny)", + "enable SZ for all items by default, use ignore mode": "aktiver SZ for alle titler som standard og brug ignorer modus", + "disable SZ for all items by default, use include mode": "deaktiver SZ for alle titler som standard og brug inkluder modus", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Brug \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) eller \"subzero.include/.subzero.include/.sz\" (include mode) på filer i biblioteker", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiver/deaktiver Sub-Zero i følgende stier (komma-spareret; ovenstående indstilling har indflydelse på det)", + "auto": "Auto", + "manual": "Manuelt", + "auto-better": "Auto-bedre", + "Unknown": "Ukendt", + "embedded": "Indlejret", +} \ No newline at end of file diff --git a/Contents/Strings/de.json b/Contents/Strings/de.json new file mode 100644 index 000000000..a477872d9 --- /dev/null +++ b/Contents/Strings/de.json @@ -0,0 +1,448 @@ +{ + "sq": "Albanisch", + "ar": "Arabisch", + "be": "Weißrussisch", + "bs": "Bosnisch", + "bg": "Bulgarisch", + "ca": "Katalanisch", + "zh": "Chinesisch", + "hr": "Kroatisch", + "cs": "Tschechisch", + "da": "Dänisch", + "nl": "Holländisch", + "en": "Englisch", + "et": "Estnisch", + "fa": "Persisch", + "fi": "Finnisch", + "fr": "Französisch", + "de": "Deutsch", + "el": "Griechisch", + "he": "Hebräisch", + "hi": "Hindi", + "hu": "Ungarisch", + "is": "Isländisch", + "id": "Indonesisch", + "it": "Italienisch", + "ja": "Japanisch", + "ko": "Koreanisch", + "lv": "Lettisch", + "lt": "Litauisch", + "mk": "Mazedonisch", + "ms": "Malaiisch", + "no": "Norwegisch", + "pl": "Polnisch", + "pt": "Portugiesisch", + "pt-br": "Portigiesisch (Brasilien)", + "ro": "Rumänisch", + "ru": "Russisch", + "sr": "Serbisch", + "sr-cyrl": "Serbisch (Kyrillisch)", + "sr-latn": "Serbisch (Lateinisch)", + "sk": "Slowakisch", + "sl": "Slowenisch", + "es": "Spanisch", + "sv": "Schwedisch", + "th": "Thailändisch", + "tr": "Türkisch", + "uk": "Ukrainisch", + "vi": "Vietnamesisch", + "Internal stuff, pay attention!": "Internes, bitte aufpassen!", + "Advanced": "Erweitert", + "advanced": "erweitert", + "Enter PIN": "PIN eingeben", + "The owner has restricted the access to this menu. Please enter the correct pin": "Der Inhaber hat den Zugriff zu diesem Menü eingeschränkt, bitte die korrekte PIN eingeben", + "Restart the plugin": "Plugin neustarten", + "Get my logs (copy the appearing link and open it in your browser, please)": "Hole meine Logs (bitte den erscheinenden Link kopieren und im Browser öffnen)", + "Copy the appearing link and open it in your browser, please": "Bitte den erscheinenden Link kopieren und im Browser öffnen", + "Trigger find better subtitles": "Bessere Untertitel finden anstoßen", + "Skip next find better subtitles (sets last run to now)": "Das nächste Bessere-Untertitel-Finden überspringen (setzt den letzten Laufzeitpunkt auf jetzt)", + "Trigger subtitle storage maintenance": "Unterstitelspeicher-Wartung anstoßen", + "Trigger subtitle storage migration (expensive)": "Untertitelspeicher-Migration anstoßen (teuer)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Cache-Wartung anstoßen (Refiner, Anbieter, Pakete/Archive)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Alle Standard-Untertitel-Mods auf alle (aktiven) gespeicherten Untertitel anwenden", + "Re-Apply mods of all stored subtitles": "Alle Mods aller gespeicherten Untertitel abermals anwenden", + "Log the plugin's scheduled tasks state storage": "Den Geplante-Aufgaben-Status-Speicher protokollieren", + "Log the plugin's internal ignorelist storage": "Den internen Ignore-Listen-Speicher protokollieren", + "Log the plugin's complete state storage": "Den kompletten internen State-Speicher protokollieren", + "Reset the plugin's scheduled tasks state storage": "Den Geplante-Aufgaben-Status-Speicher zurücksetzen", + "Reset the plugin's internal ignorelist storage": "Den internen Ignore-Listen-Speicher zurücksetzen", + "Invalidate Sub-Zero metadata caches (subliminal)": "Die Sub-Zero Metadaten-Caches invalidieren (subliminal)", + "Reset provider throttle states": "Den Anbieter-Drosselungsstatus zurücksetzen", + "Restarting the plugin": "Starte das Plugin neu", + "Restart triggered, please wait about 5 seconds": "Neustart angestoßen, bitte circa 5 Sekunden warten", + "Reset subtitle storage": "Untertitelspeicher zurücksetzen", + "Are you sure?": "Sicher?", + "Are you really sure?": "Wirklich sicher?", + "Success": "Erfolg", + "FindBetterSubtitles triggered": "FindBetterSubtitles angestoßen", + "FindBetterSubtitles skipped": "FindBetterSubtitles übersprungen", + "SubtitleStorageMaintenance triggered": "SubtitleStorageMaintenance angestoßen", + "MigrateSubtitleStorage triggered": "MigrateSubtitleStorage angestoßen", + "TriggerCacheMaintenance triggered": "TriggerCacheMaintenance angestoßen", + "This may take some time ...": "Dies könnte ein wenig dauern ...", + "Download Logs": "Logs herunterladen", + "Sorry, feature unavailable": "Entschuldigung, Funktion nicht verfügbar", + "Universal Plex token not available": "Universeller Plex-Token nicht verfügbar", + "Copy this link and open this in your browser, please": "Bitte diesen Link kopieren und im Browser öffnen", + "Cache invalidated": "Cache invalidiert", + "Enter PIN number ": "PIN eingeben", + "PIN correct": "PIN ist korrekt", + "Reset": "Zurücksetzen", + "Menu locked": "Menü gesperrt", + "Provider throttles reset": "Anbieter-Drosselung zurückgesetzt", + "Information Storage (%s) reset": "Informationsspeicher (%s) zurückgesetzt", + "Information Storage (%s) logged": "Informationsspeicher (%s) protokolliert", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex hat leider keine Informationen über dieses Element, bitte dieses aktualisieren und noch mal probieren", + "Item not found: %s!": "Element nicht gefunden: %s!", + "< Back to %s": "< Zurück zu %s", + "Back to %s > %s": "Zurück zu %s > %s", + "Refresh: %s": "Aktualisieren: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Startet eine erzwungene Aktualisierung; ignoriert dabei bereits bekannte Untertitel und sucht nach neuen", + "Extract and activate embedded subtitle streams": "Eingebettete Untertitel extrahieren und aktivieren", + "Inspect currently blacklisted subtitles": "Untertitel-Sperrliste ansehen", + "Subtitle saved to disk": "Untertitel gespeichert", + "Remove subtitle from blacklist": "Untertitel von der Sperrliste entfernen", + "No subtitles found": "Keine Untertitel gefunden", + " (unknown)": " (unbekannt)", + " (forced)": " (erzwungen)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extraktion des eingebetteten Untertitels %s des Teils %s:%s angestoßen", + "Insufficient permissions": "Unzureichende Berechtigungen", + "I'm not enabled!": "Ich bin nicht aktiv!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Bitte für wenigstens eine Medienbibliothek aktivieren, aktuell tue ich nichts", + "Working ... refresh here": "In Arbeit ... hier aktualisieren", + "Current state: %s; Last state: %s": "Aktueller Status: %s; Letzter Status: %s", + "On-deck items": "Aktuelle Medien", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Zeigt die letzten %s abgespielten Medien und ermöglicht die (erzwungene) Aktualisierung derer Metadaten/Untertitel", + "Recently-added items": "Zuletzt hinzugefügte Medien", + "Recently played items": "Zuletzt abgespielte Medien", + "Shows the recently added items per section.": "Zeigt die zuletzt hinzugefügten Medien pro Bereich", + "Show recently added items with missing subtitles": "Zeigt zuletzt hinzugefügte Medien mit fehlenden Untertiteln", + "Browse all items": "Alle Medien durchsuchen", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Die gesamten Medienbibliothek durchsuchen und die Ignore-Listen verwalten. Hier können ebenfalls die Metadaten/Untertitel einzelner Medien (erzwungen) aktualisiert werden", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Letzter Durchlauf: %s; Nächster geplanter Durchlauf: %s; Letzte Laufzeit: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Nach fehlenden Untertiteln suchen (für zuletzt hinzugefügte Medien, maximales Alter: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatisch regelmäßig vom Scheduler ausgeführt, wenn konfiguriert. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Zeige die aktuelle Ignore-Liste (hauptsächlich für Hintergrundaufgaben genutzt)", + "History": "Verlauf", + "Show the last %i downloaded subtitles": "Zeige die letzten %i heruntergeladenen Untertitel", + "Refresh": "Aktualisieren", + "Re-lock menu(s)": "Menüs wieder sperren", + "Enabled the PIN again for menu(s)": "PIN für Menüs wieder aktiviert", + "Throttled providers: %s": "Gedrosselte Anbieter: %s", + "Advanced functions": "Erweiterte Funktionen", + "Use at your own risk": "Benutzung auf eigene Gefahr", + "Items On Deck": "Aktuelle Medien", + "Recently Played": "Zuletzt abgespielt", + "Items with missing subtitles": "Medien mit fehlenden Untertiteln", + "Find recent items with missing subtitles": "Finde zuletzt hinzugefügte Medien mit fehlenden Untertiteln", + "Updating, refresh here ...": "Update, hier aktualisieren ...", + "Missing: %s": "Fehlt: %s", + "Didn't change the ignore list": "Ignore-Liste wurde nicht verändert", + "Sections": "Bereiche", + "All": "Alle", + "show": "Serie", + "movie": "Film", + "<< Back to home": "<< Zurück zum Anfang", + "Auto-Find subtitles: %s": "Untertitel automatisch finden: %s", + "Extracting of embedded subtitles for %s triggered": "Extraktion eingebetteter Untertitel für %s angestoßen", + "< Back to subtitle options for: %s": "< Zurück zu den Untertiteloptionen für: %s", + "Remove last applied mod (%s)": "Die zuletzt angewandte Modifikation entfernen (%s)", + "none": "keine", + "Manage applied mods": "Angewandte Modifikationen verwalten", + "Reapply applied mods": "Angewandte Modifikationen erneut anwenden", + "Restore original version": "Originalversion wiederherstellen", + "< Back to subtitle modification menu": "< Zurück zum Untertitel-Modifikations-Menü", + "subs constantly getting faster": "Untertitel werden konstant schneller", + "subs constantly getting slower": "Untertitel werden konstant langsamer", + "< Back to subtitle modifications": "< Zurück zu den Untertitel-Modifikationen", + "< Back to unit selection": "< Zurück zur Einheiten-Auswahl", + "Subtitle Language (1)": "Untertitel-Sprache (1)", + "Subtitle Language (2)": "Untertitel-Sprache (2)", + "Subtitle Language (3)": "Untertitel-Sprache (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Weitere Untertitel-Sprachen (ISO-639-1 Kodierung benutzen, kommagetrennt)", + "Only download foreign/forced subtitles": "Nur erzwungende/fremdsprachige Untertitel herunterladen", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Sprachen mit Landesattribut als ISO 639-1 anzeigen (z. B. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Sprachen mit Landesattribut als ISO 639-1 behandeln (pt-BR nicht herunterladen, wenn ein pt Untertitel existiert)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Auf eine Sprache beschränken (fügt dem Dateinamen kein \".lang.\"-Suffix hinzu; benutzt nur \"Untertitel Sprache (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Eingebettete Untertitel: behandle Unbekannte Sprache als Sprache 1", + "I rename my files using": "Ich benenne meine Dateien um, mit:", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Originale Dateinamen von .file_info/file_info Indexdateien beziehen (siehe Wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (URL-Basis hinzufügen, wenn konfiguriert)", + "Sonarr API key": "Sonarr API-Schlüssel", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (URL-Basis hinzufügen, wenn konfiguriert; minimale Version: 0.2.0.897)", + "Radarr API key": "Radarr API-Schlüssel", + "Provider: Enable OpenSubtitles": "Anbieter: OpenSubtitles aktivieren", + "Opensubtitles Username": "OpenSubtitles Benutzername", + "Opensubtitles Password": "OpenSubtitles Passwort", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (werbefreie Untertitel, 1000 Untertitel/Tag, no-cache VIP-Server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Anbieter: Podnapisi.NET aktivieren", + "Provider: Enable Titlovi.com": "Anbieter: Titlovi.com aktivieren", + "Provider: Enable Addic7ed": "Anbieter: Addic7ed aktivieren", + "Addic7ed Username": "Addic7ed Benutzername", + "Addic7ed Password": "Addic7ed Passwort", + "Addic7ed: boost score (if requirements met)": "Addic7ed: Punktzahl anheben (wenn Voraussetzungen erfüllt)", + "Addic7ed: Use random user agents": "Addic7ed: Zufällige User-Agents benutzen", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Anbieter: Legendas TV aktivieren (meist pt-BR; UNRAR erforderlich!)", + "Legendas TV Username": "Legendas TV Benutzername", + "Legendas TV Password": "Legendas TV Passwort", + "Provider: Enable TVsubtitles.net": "Anbieter: TVsubtitles.net aktivieren", + "Provider: Enable NapiProjekt.pl (Polish)": "Anbieter: NapiProjekt.pl aktivieren (polnisch)", + "Provider: Enable SubScene (TV shows)": "Anbieter: SubScene aktivieren (Serien)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Anbieter: Hosszupuskasub.com aktivieren (ungarisch)", + "Provider: Enable aRGENTeaM (Spanish)": "Anbieter: aRGENTeaM aktivieren (spanisch)", + "Search enabled providers simultaneously (multithreading)": "Durchsuche aktive Anbieter gleichzeitig (Multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extrahiere und aktiviere eingebettete Untertitel automatisch nach dem Hinzufügen der Medien (mit den konfigurierten Standard-Mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Soll nach der automatischen Extraktion eingebetteter Untertitel zusätzlich auch sofort nach verfügbaren gesucht werden?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Nicht nach Untertiteln einer Sprache suchen, wenn bereits einer als eingebetteter Untertitel in der Mediendatei existiert (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Nicht nach Untertiteln einer Sprache suchen, wenn bereits einer im Dateisystem existiert (Metadaten/Dateisystem)?", + "How strict should these subtitles existing on the filesystem be detected?": "Wie genau soll die Erkennung existierender Untertitel auf dem Dateisystem sein?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Dabei nicht-textbasierte Untertitelformate einbeziehen? (Alles außer .srt/.ssa/.ass/.vtt; eingebettet oder extern)", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimale Punktzahl für Serien (min: 240, sinnvoll: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimale Punktzahl für Filme (min: 60, def/sane: 69, sinnvoll: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Untertitel für Hörgeschädigte herunterladen.", + "Remove Hearing Impaired tags from downloaded subtitles": "Inhalte für Hörgeschädigte von heruntergeladenen Untertiteln entfernen", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Textformatierungen von heruntergeladenen Untertiteln entfernen (fett, kursiv, unterstrichen, Farben, ...)", + "Fix common issues in subtitles": "Häufige Probleme in Untertiteln beheben", + "Fix common OCR errors in downloaded subtitles": "Häufige Texterkennungsfehler in Untertiteln beheben", + "Reverse punctuation in RTL languages (heb)": "Zeichensetzung in linksläufigen Schriften umkehren (heb)", + "Change colors of subtitles to": "Farbe der Untertitel ändern zu", + "Store subtitles next to media files (instead of metadata)": "Speichere Untertitel neben den Medien (anstatt im Metadatenspeicher)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Zu speichernde Untertitelformate (Nicht-SRT funktioniert nur, wenn die vorherige Option aktiv ist)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Untertitel-Ordner (\"aktueller Ordner\" ist der, in dem die Mediendatei liegt)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Benutzerdefinierter Untertitelordner (überschreibt \"Untertitel-Ordner\"; wird zu echten Pfaden aufgelöst)", + "Fall back to metadata storage if filesystem storage failed": "Im Notfall im Metadatenspeicher speichern, wenn nicht auf dem Dateisystem gespeichert werden konnte", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Untertitel-Berechtigungen setzen auf (Ganzzahl, z. B.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Automatisch übrig gebliebene/ungenutzte (extern gespeicherter) Untertitel löschen", + "On media playback: search for missing subtitles (refresh item)": "Beim Abspielen von Median nach fehlenden Untertiteln suchen (Element aktualisieren)", + "Scheduler: Periodically search for recent items with missing subtitles": "Hintergrundaufgaben: Regelmäßig nach aktuellen Medien mit fehlenden Untertiteln suchen", + "Scheduler: Item age to be considered recent": "Hintergrundaufgaben: Medien-Alter um als \"aktuell\" zu gelten", + "Scheduler: Recent items to consider per library": "Hintergrundaufgaben: Anzahl an zu berücksichtigenden Medien pro Bibliothek", + "Scheduler: Periodically search for better subtitles": "Hintergrundaufgaben: Regelmäßig nach besseren Untertiteln suchen", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Hintergrundaufgaben: Wie viele Tage soll nach besseren Untertiteln gesucht werden (max: 30 Tage)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Hintergrundaufgaben: Nicht nach besseren Untertiteln suchen, wenn der Ausstrahlungszeitpunkt älter ist als", + "Scheduler: Overwrite manually selected subtitles when better found": "Hintergrundaufgaben: Manuell ausgewählte Untertitel überschreiben, wenn bessere gefunden wurden", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Hintergrundaufgaben: Untertitel mit Nicht-Standard-Modifikationen überschreiben, wenn bessere gefunden wurden", + "History: amount of items to store historical data for": "Verlauf: Anzahl der Elemente", + "How many download tries per subtitle (on timeout or error)": "Wie oft soll der Download pro Untertitel versucht werden (bei Fehlern)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignoriere Ordner mit \"subzero.ignore/.subzero.ignore/.nosz\"-Dateien", + "Ignore anything in the following paths (comma-separated)": "Ignoriere folgende Pfade", + "Sub-Zero mode": "Sub-Zero Modus", + "Access PIN (any amount of numbers, 0-9)": "Zugriffs-PIN (beliebige Anzahl Zahlen, 0-9)", + "Access PIN valid for minutes": "Zugriffs-PIN gültig für Minuten", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Benutze PIN um den Zugriff einzuschränken für (benötigt Plugin- oder PMS-Neustart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Diese ausführbare Datei nach erfolgreichem Untertitel-Download aufrufen (siehe Wiki für Details)", + "Check for correct folder permissions of every library on plugin start": "Korrekte Ordnerberechtigungen bei jedem Plugin-Start überprüfen", + "Use new style caching (for subliminal)": "Modernes Caching benutzen (für subliminal)", + "Low impact mode (for remote filesystems)": "Belastungsarmer Modus (für rechnerferne Dateisysteme)", + "Timeout for API requests sent to the PMS": "Timeout für Plex-API-Anfragen", + "HTTP proxy to use for providers (supports credentials)": "Benutze HTTP-Proxy für Untertitel-Anbieter (unterstützt Anmeldeinformationen)", + "How verbose should the logging be?": "Wie ausführlich soll die Protokollierung sein?", + "How many log backups to keep?": "Wie viele Protokoll-Sicherungen sollen behalten werden?", + "Log subtitle modification (debug)": "Untertitelmodifikationen protokollieren (debug)", + "Log to console (for development/debugging)": "Protokollausgabe in der Konsole (für Entwicklung/Debugging)", + "Collect anonymous usage statistics": "Anonyme Nutzungsstatistiken sammeln", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (API info unten ergänzen)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symbolischer Link zur Originaldatei", + "I keep the original filenames": "Ich behalte die originalen Dateinamen", + "none of the above": "keine dieser Optionen", + "exact: media filename match": "Exakt: Dateiname stimmt überein", + "loose: filename contains media filename": "Locker: Untertiteldateiname enthält Mediendateiname", + "any": "alle", + "prefer": "bevorzugen", + "don't prefer": "nicht bevorzugen", + "force HI": "HI erzwingen", + "force non-HI": "Non-HI erzwingen", + "don't change": "nicht ändern", + "white": "weiß", + "light-grey": "hellgrau", + "red": "rot", + "green": "grün", + "yellow": "gelb", + "blue": "blau", + "magenta": "Magentarot", + "cyan": "türkis", + "black": "schwarz", + "dark-red": "dunkelrot", + "dark-green": "dunkelgrün", + "dark-yellow": "ocker", + "dark-blue": "dunkelblau", + "dark-magenta": "dunkles Magentarot", + "dark-cyan": "dunkles Türkis", + "dark-grey": "dunkelgrau", + "current folder": "aktueller Ordner", + "never": "nie", + "current media item": "aktuelle Mediendatei", + "next episode (series)": "nächste Episode (Serien)", + "hybrid: current item or next episode": "hybrid: aktuelle Mediendatei oder nächste Episode", + "hybrid-plus: current item and next episode": "hybrid-plus: aktuelle Mediendatei und nächste Episode", + "every 6 hours": "alle 6 Stunden", + "every 12 hours": "alle 12 Stunden", + "every 24 hours": "alle 24 Stunden", + "1 days": "1 Tag", + "2 days": "2 Tage", + "3 days": "3 Tage", + "4 days": "4 Tage", + "1 weeks": "1 Woche", + "2 weeks": "2 Wochen", + "3 weeks": "3 Wochen", + "4 weeks": "4 Wochen", + "5 weeks": "5 Wochen", + "6 weeks": "6 Wochen", + "12 weeks": "12 Wochen", + "don't limit": "keine Limitierung", + "1 year": "1 Jahr", + "2 years": "2 Jahre", + "3 years": "3 Jahre", + "4 years": "4 Jahre", + "5 years": "5 Jahre", + "6 years": "6 Jahre", + "7 years": "7 Jahre", + "8 years": "8 Jahre", + "9 years": "9 Jahre", + "10 years": "10 Jahre", + "only agent": "nur Metadaten-Agent", + "disabled": "deaktiviert", + "advanced menu": "erweitertes Menü", + "CRITICAL": "CRITICAL", + "ERROR": "ERROR", + "WARNING": "WARNING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Erzwinge Suche nach Untertiteln: %(item_title)s", + "File %(file_part_index)s: ": "Datei %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sKein aktueller Untertitel im Speicher", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sAktueller Untertitel: %(provider_name)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s%(language)s: Untertitel verwalten", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s%(language)s: Untertitel auflisten", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEingebettete Untertitel (%(languages)s)", + "Select active %(language)s subtitle": "%(language)s: Aktiven Untertitel auswählen", + "%(count)d subtitles in storage": "%(count)d Untertitel im Speicher", + "List available %(language)s subtitles": "%(language)s: Verfügbare Untertitel auflisten", + "Modify current %(language)s subtitle": "%(language)s: Aktiven Untertitel modifizieren", + "Currently applied mods: %(mod_list)s": "Aktuell angewandte Modifikationen: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "%(language)s: Aktuellen Untertitel zur Sperrliste hinzufügen und nach einem neuen suchen", + "Manage blacklist (%(amount)s contained)": "Sperrliste verwalten (enthält %(amount)s)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Punktzahl: %(score)s", + "Current: ": "Aktuell: ", + "Stored: ": "Gespeichert: ", + "by %(release_group)s": "von %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Aktuell: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)": "%(language)s: Nach Untertiteln suchen (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sDateiname: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "%(language)s: Suche nach Untertiteln (%(video_data)s), hier aktualisieren ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (falsche FPS, Untertitel: %(subtitle_fps)s, Video: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (falsche FPS, Untertitel: %(subtitle_fps)s, Video: Unbekannt, belastungsarmer Modus aktiv)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, Punktzahl: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Übereinstimmungen: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Lade Untertitel für %(title_or_id)s herunter", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Stream mit Standard-Mods extrahieren: %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Stream extrahieren: %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (hinzugefügt: %(date_added)s, %(mode)s), Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Ungenügende Berechtigungen der Bibliothek %(title)s, Ordner: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Läuft: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Ignore-Liste anzeigen (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s bis %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extrahiere Untertitel %(stream_index)s von %(filename)s", + "Extract missing %(language)s embedded subtitles": "%(language)s: Extrahiere fehlende, eingebettete Untertitel", + "Extract and activate %(language)s embedded subtitles": "%(language)s: Extrahiere und aktiviere eingebettete Untertitel", + "None": "Nichts", + "Idle": "Inaktiv", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Verschieben um %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "hinzugefügt: %(date_added)s, %(mode)s, Sprache: %(language)s, Punktzahl: %(score)i, Speicher: %(storage_type)s", + "Remove: %(mod_name)s": "%(mod_name)s entfernen", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Herunterladen von Untertitel fehlgeschlagen (%(item_id)s)", + "agent + interface": "Metadatenagent + Benutzeroberfläche", + "only interface": "nur Benutzeroberfläche", + "interface": "Benutzeroberfläche", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Zeigt die aktuellen Medien und ermöglicht die (erzwungene) Aktualisierung derer Metadaten/Untertitel", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Zeigt Medien mit fehlenden Untertiteln. Auf \"Finde zuletzt hinzugefügte Medien mit fehlenden Untertiteln\" klicken, um die Liste zu aktualisieren", + "Add %(kind)s %(title)s to the ignore list": "Füge %(kind)s %(title)s zur Ignore-Liste hinzu", + "Remove %(kind)s %(title)s from the ignore list": "Entferne %(kind)s %(title)s von der Ignore-Liste", + "%(title)s added to the ignore list": "%(title)s zur Ignore-Liste hinzugefügt", + "%(title)s removed from the ignore list": "%(title)s von der Ignore-Liste entfernt", + "Triggering refresh for %(title)s": "Stoße Aktualisierung an, für: %(title)s", + "Triggering forced refresh for %(title)s": "Stoße erzwungene Aktualisieren an, für %(title)s", + "Refresh of item %(item_id)s triggered": "Aktualisierung von %(item_id)s angestoßen", + "Forced refresh of item %(item_id)s triggered": "Erzwungene Aktualisierung von %(item_id)s angestoßen", + "Ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" ignorieren", + "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" nicht mehr ignorieren", + "Refreshing %(title)s": "Aktualisiere %(title)s", + "Force-refreshing %(title)s": "Erzwinge Aktualisierung von %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extrahiert die noch nicht extrahierten, eingebetteten Untertitel aller Episoden der aktuellen Staffel, mit allen konfigurierten Standard-Modifikationen", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extrahiert eingebettete Untertitel aller Episoden der aktuellen Staffel, mit allen konfigurierten Standard-Modifikationen", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Aktualisiert %(the_movie_series_season_episode)s, möglicherweise mit einer Suche nach fehlenden Untertiteln, sowie Auffinden von Untertiteln im Dateisystem", + "the movie": "den Film", + "the series": "die Serie", + "the episode": "die Episode", + "the season": "die Staffel", + "Change the color of the subtitle": "Untertitel-Farben ändern", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Fügt die gewählte Farbe zu jeder Untertitelzeile hinzu. Wird nicht von jedem Abspielgerät unterstützt", + "Basic common fixes": "Behebe häufige Probleme in Untertiteln", + "Fix common and whitespace/punctuation issues in subtitles": "Behebe häufige und Leerraum/Zeichensetzungs-Probleme in Untertiteln", + "Remove all style tags": "Entferne alle Textformatierungen", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Entfernt alle möglichen Textformatierungen von Untertiteln, wie z. B. Schriftart, Fettschrift, Farben etc.", + "Reverse punctuation in RTL languages": "Zeichensetzung in linksläufigen Schriften umkehren", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Einige Abspielgeräte verarbeiten nötige Marker für linksläufige Schriften nicht korrekt. Invertiere die Zeichensetzung, um dies zu beheben. Anwendbar auf: hebräisch", + "Change the FPS of the subtitle": "Ändern der Bildwiederholrate des Untertitels", + "Re-syncs the subtitle to the framerate of the current media file.": "Synchronisiert den Untertitel zur Bildwiederholrate der Mediendatei.", + "Remove Hearing Impaired tags": "Inhalte für Hörgeschädigte von heruntergeladenen Untertiteln entfernen", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Entfernt Markierungen, Text und Zeichen von Untertiteln, die Inhalte für Hörgeschädigte enthalten", + "Fix common OCR issues": "Häufige Texterkennungsfehler in Untertiteln beheben", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Behebt Fehler, die auftreten, wenn ein Untertitel vom Bitmap-Format zu Text konvertiert werden (OCR).", + "Change the timing of the subtitle": "Die zeitliche Abstimmung des Untertitels ändern", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Verschiebt den Untertitel um eine bestimmte Zeiteinheit", + "Available": "Verfügbar", + "Current": "Aktuell", + "Custom path to advanced_settings.json": "Spezifischer Pfad zu advanced_settings.json", + "zh-hant": "Chinesisch (traditionell)", + "zh-hans": "Chinesisch (vereinfacht)", + "Reset the plugin's menu history storage": "Den internen Menühistorie-Speicher zurücksetzen", + "forced": "erzwungen", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, Punktzahl: %s), %s", + "Extract embedded subtitle streams": "Eingebettete Untertitel extrahieren", + "Display %(incl_excl_list_name)s (%(count)d)": "%(incl_excl_list_name)s anzeigen (%(count)d)", + "include list": "Include-Liste", + "ignore list": "Ignore-Liste", + "Include list": "Include-Liste", + "Ignore list": "Ignore-Liste", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Zeige die aktuelle %(incl_excl_list_name)s (hauptsächlich für Hintergrundaufgaben genutzt)", + "Didn't change the %(incl_excl_list_name)s": "%(incl_excl_list_name)s wurde nicht verändert", + "%(title)s added to the include list": "%(title)s zur Include-Liste hinzugefügt", + "%(title)s removed from the include list": "%(title)s von der Include-Liste entfernt", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Aktiviere Sub-Zero für %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deaktiviere Sub-Zero für %(kind)s \"%(title)s\"", + "Download subtitles": "Untertitel herunterladen", + "Never": "Nie", + "Always": "Immer", + "When main audio stream is not Subtitle Language (1)": "Wenn der Haupt-Audiostream nicht Subtitle Sprache (1) entspricht", + "When main audio stream is not any configured language": "Wenn der Haupt-Audiostream nicht irgendeiner konfigurierten Sprache entspricht", + "When any audio stream is not Subtitle Language (1)": "Wenn keiner der Audiostreams Subtitle Sprache (1) entspricht", + "When any audio stream is not any configured language": "Wenn keiner der Audiostreams irgendeiner konfigurierten Sprache entspricht", + "Download foreign/forced subtitles": "Erzwungende/fremdsprachige Untertitel herunterladen", + "Only for Subtitle Language (1)": "Nur für Untertitel Sprache (1)", + "Only for Subtitle Language (2)": "Nur für Untertitel Sprache (2)", + "Only for Subtitle Language (3)": "Nur für Untertitel Sprache (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Eingebettete Streams: behandle Unbekannte Sprache als Sprache 1", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Zeichensetzung in linksläufigen Schriften umkehren (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Nur-Großschreibung in Untertiteln beheben", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Soll SZ standardmäßig aktiviert oder deaktiviert sein? (Beeinflusst Einstellungen und Menü)", + "enable SZ for all items by default, use ignore mode": "SZ standardmäßig für alle Medien aktivieren, benutze Ignore-Modus", + "disable SZ for all items by default, use include mode": "SZ standardmäßig für alle Medien deaktivieren, benutze Include-Modus", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Benutze \"subzero.ignore/.subzero.ignore/.nosz\" (Ignore-Modus) oder \"subzero.include/.subzero.include/.sz\" (Include-Modus) Dateien in Ordnern", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Aktiviere/deaktiviere Sub-Zero für folgende Pfade (kommasepariert; siehe Einstellung oben)", + "auto": "auto", + "manual": "manuell", + "auto-better": "auto-besser", + "Unknown": "Unbekannt", + "embedded": "eingebettet", + "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)": "Benutzerdefinierten DNS benutzen (IPs, Komma-Separiert, leer lassen für System-DNS. Default: Google/CF)", + "Don't search for subtitles if a subtitle in any configured language exists as": "Nicht nach Untertiteln suchen, wenn wenigstens ein Untertitel in einer konfigurierten Sprache gefunden wurde", + "External or embedded subtitle": "Externe oder eingebettete Untertitel", + "External or embedded subtitle (not foreign/forced)": "Externe oder eingebettete Untertitel (keine erzwungenden/fremdsprachigen)", + "External subtitle": "Externe Untertitel", + "External subtitle (not foreign/forced)": "Externe Untertitel (keine erzwungenden/fremdsprachigen)", + "Always search for all configured languages": "Immer nach allen konfigurierten Sprachen suchen" +} \ No newline at end of file diff --git a/Contents/Strings/en.json b/Contents/Strings/en.json old mode 100755 new mode 100644 index 8d5307873..da75365db --- a/Contents/Strings/en.json +++ b/Contents/Strings/en.json @@ -1,49 +1,448 @@ { - "sq":"Albanian", - "ar":"Arabic", - "be":"Belarusian", - "bs":"Bosnian", - "bg":"Bulgarian", - "ca":"Catalan", - "zh":"Chinese", - "hr":"Croatian", - "cs":"Czech", - "da":"Danish", - "nl":"Dutch", - "en":"English", - "et":"Estonian", - "fa":"Persian (Farsi)", - "fi":"Finnish", - "fr":"French", - "de":"German", - "el":"Greek", - "he":"Hebrew", - "hi":"Hindi", - "hu":"Hungarian", - "is":"Icelandic", - "id":"Indonesian", - "it":"Italian", - "ja":"Japanese", - "ko":"Korean", - "lv":"Latvian", - "lt":"Lithuanian", - "mk":"Macedonian", - "ms":"Malay", - "no":"Norwegian", - "pl":"Polish", - "pt":"Portuguese", - "pt-br":"Portuguese (Brasil)", - "ro":"Romanian", - "ru":"Russian", - "sr":"Serbian", - "sr-cyrl":"Serbian (Cyrillic)", - "sr-latn":"Serbian (Latin)", - "sk":"Slovak", - "sl":"Slovenian", - "es":"Spanish", - "sv":"Swedish", - "th":"Thai", - "tr":"Turkish", - "uk":"Ukranian", - "vi":"Vietnamese" -} + "sq": "Albanian", + "ar": "Arabic", + "be": "Belarusian", + "bs": "Bosnian", + "bg": "Bulgarian", + "ca": "Catalan", + "zh": "Chinese", + "hr": "Croatian", + "cs": "Czech", + "da": "Danish", + "nl": "Dutch", + "en": "English", + "et": "Estonian", + "fa": "Persian (Farsi)", + "fi": "Finnish", + "fr": "French", + "de": "German", + "el": "Greek", + "he": "Hebrew", + "hi": "Hindi", + "hu": "Hungarian", + "is": "Icelandic", + "id": "Indonesian", + "it": "Italian", + "ja": "Japanese", + "ko": "Korean", + "lv": "Latvian", + "lt": "Lithuanian", + "mk": "Macedonian", + "ms": "Malay", + "no": "Norwegian", + "pl": "Polish", + "pt": "Portuguese", + "pt-br": "Portuguese (Brasil)", + "ro": "Romanian", + "ru": "Russian", + "sr": "Serbian", + "sr-cyrl": "Serbian (Cyrillic)", + "sr-latn": "Serbian (Latin)", + "sk": "Slovak", + "sl": "Slovenian", + "es": "Spanish", + "sv": "Swedish", + "th": "Thai", + "tr": "Turkish", + "uk": "Ukranian", + "vi": "Vietnamese", + "Internal stuff, pay attention!": "Internal stuff, pay attention!", + "Advanced": "Advanced", + "advanced": "advanced", + "Enter PIN": "Enter PIN", + "The owner has restricted the access to this menu. Please enter the correct pin": "The owner has restricted the access to this menu. Please enter the correct pin", + "Restart the plugin": "Restart the plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Get my logs (copy the appearing link and open it in your browser, please)", + "Copy the appearing link and open it in your browser, please": "Copy the appearing link and open it in your browser, please", + "Trigger find better subtitles": "Trigger find better subtitles", + "Skip next find better subtitles (sets last run to now)": "Skip next find better subtitles (sets last run to now)", + "Trigger subtitle storage maintenance": "Trigger subtitle storage maintenance", + "Trigger subtitle storage migration (expensive)": "Trigger subtitle storage migration (expensive)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Trigger cache maintenance (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Apply configured default subtitle mods to all (active) stored subtitles", + "Re-Apply mods of all stored subtitles": "Re-Apply mods of all stored subtitles", + "Log the plugin's scheduled tasks state storage": "Log the plugin's scheduled tasks state storage", + "Log the plugin's internal ignorelist storage": "Log the plugin's internal ignorelist storage", + "Log the plugin's complete state storage": "Log the plugin's complete state storage", + "Reset the plugin's scheduled tasks state storage": "Reset the plugin's scheduled tasks state storage", + "Reset the plugin's internal ignorelist storage": "Reset the plugin's internal ignorelist storage", + "Invalidate Sub-Zero metadata caches (subliminal)": "Invalidate Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states": "Reset provider throttle states", + "Restarting the plugin": "Restarting the plugin", + "Restart triggered, please wait about 5 seconds": "Restart triggered, please wait about 5 seconds", + "Reset subtitle storage": "Reset subtitle storage", + "Are you sure?": "Are you sure?", + "Are you really sure?": "Are you really sure?", + "Success": "Success", + "FindBetterSubtitles triggered": "FindBetterSubtitles triggered", + "FindBetterSubtitles skipped": "FindBetterSubtitles skipped", + "SubtitleStorageMaintenance triggered": "SubtitleStorageMaintenance triggered", + "MigrateSubtitleStorage triggered": "MigrateSubtitleStorage triggered", + "TriggerCacheMaintenance triggered": "TriggerCacheMaintenance triggered", + "This may take some time ...": "This may take some time ...", + "Download Logs": "Download Logs", + "Sorry, feature unavailable": "Sorry, feature unavailable", + "Universal Plex token not available": "Universal Plex token not available", + "Copy this link and open this in your browser, please": "Copy this link and open this in your browser, please", + "Cache invalidated": "Cache invalidated", + "Enter PIN number ": "Enter PIN number ", + "PIN correct": "PIN correct", + "Reset": "Reset", + "Menu locked": "Menu locked", + "Provider throttles reset": "Provider throttles reset", + "Information Storage (%s) reset": "Information Storage (%s) reset", + "Information Storage (%s) logged": "Information Storage (%s) logged", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex didn't return any information about the item, please refresh it and come back later", + "Item not found: %s!": "Item not found: %s!", + "< Back to %s": "< Back to %s", + "Back to %s > %s": "Back to %s > %s", + "Refresh: %s": "Refresh: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Issues a forced refresh, ignoring known subtitles and searching for new ones", + "Extract and activate embedded subtitle streams": "Extract and activate embedded subtitle streams", + "Inspect currently blacklisted subtitles": "Inspect currently blacklisted subtitles", + "Subtitle saved to disk": "Subtitle saved to disk", + "Remove subtitle from blacklist": "Remove subtitle from blacklist", + "No subtitles found": "No subtitles found", + " (unknown)": " (unknown)", + " (forced)": " (forced)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extracting of embedded subtitle %s of part %s:%s triggered", + "Insufficient permissions": "Insufficient permissions", + "I'm not enabled!": "I'm not enabled!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Please enable me for some of your libraries in your server settings; currently I do nothing", + "Working ... refresh here": "Working ... refresh here", + "Current state: %s; Last state: %s": "Current state: %s; Last state: %s", + "On-deck items": "On-deck items", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.", + "Recently-added items": "Recently-added items", + "Recently played items": "Recently played items", + "Shows the recently added items per section.": "Shows the recently added items per section.", + "Show recently added items with missing subtitles": "Show recently added items with missing subtitles", + "Browse all items": "Browse all items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Last run: %s; Next scheduled run: %s; Last runtime: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Search for missing subtitles (in recently-added items, max-age: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatically run periodically by the scheduler, if configured. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Show the current ignore list (mainly used for the automatic tasks)", + "History": "History", + "Show the last %i downloaded subtitles": "Show the last %i downloaded subtitles", + "Refresh": "Refresh", + "Re-lock menu(s)": "Re-lock menu(s)", + "Enabled the PIN again for menu(s)": "Enabled the PIN again for menu(s)", + "Throttled providers: %s": "Throttled providers: %s", + "Advanced functions": "Advanced functions", + "Use at your own risk": "Use at your own risk", + "Items On Deck": "Items On Deck", + "Recently Played": "Recently Played", + "Items with missing subtitles": "Items with missing subtitles", + "Find recent items with missing subtitles": "Find recent items with missing subtitles", + "Updating, refresh here ...": "Updating, refresh here ...", + "Missing: %s": "Missing: %s", + "Didn't change the ignore list": "Didn't change the ignore list", + "Sections": "Sections", + "All": "All", + "show": "show", + "movie": "movie", + "<< Back to home": "<< Back to home", + "Auto-Find subtitles: %s": "Auto-Find subtitles: %s", + "Extracting of embedded subtitles for %s triggered": "Extracting of embedded subtitles for %s triggered", + "< Back to subtitle options for: %s": "< Back to subtitle options for: %s", + "Remove last applied mod (%s)": "Remove last applied mod (%s)", + "none": "none", + "Manage applied mods": "Manage applied mods", + "Reapply applied mods": "Reapply applied mods", + "Restore original version": "Restore original version", + "< Back to subtitle modification menu": "< Back to subtitle modification menu", + "subs constantly getting faster": "subs constantly getting faster", + "subs constantly getting slower": "subs constantly getting slower", + "< Back to subtitle modifications": "< Back to subtitle modifications", + "< Back to unit selection": "< Back to unit selection", + "Subtitle Language (1)": "Subtitle Language (1)", + "Subtitle Language (2)": "Subtitle Language (2)", + "Subtitle Language (3)": "Subtitle Language (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)", + "Only download foreign/forced subtitles": "Only download foreign/forced subtitles", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Embedded subtitles: Treat \"Undefined\" (und) as language 1", + "I rename my files using": "I rename my files using", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Retrieve original filename from .file_info/file_info index files (see wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (add URL base if configured)", + "Sonarr API key": "Sonarr API key", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (add URL base if configured, min. version: 0.2.0.897)", + "Radarr API key": "Radarr API key", + "Provider: Enable OpenSubtitles": "Provider: Enable OpenSubtitles", + "Opensubtitles Username": "Opensubtitles Username", + "Opensubtitles Password": "Opensubtitles Password", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Provider: Enable Podnapisi.NET", + "Provider: Enable Titlovi.com": "Provider: Enable Titlovi.com", + "Provider: Enable Addic7ed": "Provider: Enable Addic7ed", + "Addic7ed Username": "Addic7ed Username", + "Addic7ed Password": "Addic7ed Password", + "Addic7ed: boost score (if requirements met)": "Addic7ed: boost score (if requirements met)", + "Addic7ed: Use random user agents": "Addic7ed: Use random user agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)", + "Legendas TV Username": "Legendas TV Username", + "Legendas TV Password": "Legendas TV Password", + "Provider: Enable TVsubtitles.net": "Provider: Enable TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)": "Provider: Enable NapiProjekt.pl (Polish)", + "Provider: Enable SubScene (TV shows)": "Provider: Enable SubScene (TV shows)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: Enable hosszupuskasub.com (Hungarian)", + "Provider: Enable aRGENTeaM (Spanish)": "Provider: Enable aRGENTeaM (Spanish)", + "Search enabled providers simultaneously (multithreading)": "Search enabled providers simultaneously (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Automatically extract and use embedded subtitles upon media addition (with configured default mods)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "After automatic extraction of embedded subtitles, also immediately search for available subtitles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?", + "How strict should these subtitles existing on the filesystem be detected?": "How strict should these subtitles existing on the filesystem be detected?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Download hearing impaired subtitles.", + "Remove Hearing Impaired tags from downloaded subtitles": "Remove Hearing Impaired tags from downloaded subtitles", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)", + "Fix common issues in subtitles": "Fix common issues in subtitles", + "Fix common OCR errors in downloaded subtitles": "Fix common OCR errors in downloaded subtitles", + "Reverse punctuation in RTL languages (heb)": "Reverse punctuation in RTL languages (heb)", + "Change colors of subtitles to": "Change colors of subtitles to", + "Store subtitles next to media files (instead of metadata)": "Store subtitles next to media files (instead of metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Subtitle formats to save (non-SRT only works if the previous option is enabled)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Subtitle Folder (\"current folder\" is the folder the current media file lives in)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)", + "Fall back to metadata storage if filesystem storage failed": "Fall back to metadata storage if filesystem storage failed", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Set subtitle file permissions to (integer, e.g.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Automatically delete leftover/unused (externally saved) subtitles", + "On media playback: search for missing subtitles (refresh item)": "On media playback: search for missing subtitles (refresh item)", + "Scheduler: Periodically search for recent items with missing subtitles": "Scheduler: Periodically search for recent items with missing subtitles", + "Scheduler: Item age to be considered recent": "Scheduler: Item age to be considered recent", + "Scheduler: Recent items to consider per library": "Scheduler: Recent items to consider per library", + "Scheduler: Periodically search for better subtitles": "Scheduler: Periodically search for better subtitles", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Scheduler: Days to search for better subtitles (max: 30 days)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Scheduler: Don't search for better subtitles if the item's air date is older than", + "Scheduler: Overwrite manually selected subtitles when better found": "Scheduler: Overwrite manually selected subtitles when better found", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found", + "History: amount of items to store historical data for": "History: amount of items to store historical data for", + "How many download tries per subtitle (on timeout or error)": "How many download tries per subtitle (on timeout or error)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)", + "Ignore anything in the following paths (comma-separated)": "Ignore anything in the following paths (comma-separated)", + "Sub-Zero mode": "Sub-Zero mode", + "Access PIN (any amount of numbers, 0-9)": "Access PIN (any amount of numbers, 0-9)", + "Access PIN valid for minutes": "Access PIN valid for minutes", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Use PIN to restrict access to (needs plugin or PMS restart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Call this executable upon successful subtitle download (see Wiki for details)", + "Check for correct folder permissions of every library on plugin start": "Check for correct folder permissions of every library on plugin start", + "Use new style caching (for subliminal)": "Use new style caching (for subliminal)", + "Low impact mode (for remote filesystems)": "Low impact mode (for remote filesystems)", + "Timeout for API requests sent to the PMS": "Timeout for API requests sent to the PMS", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy to use for providers (supports credentials)", + "How verbose should the logging be?": "How verbose should the logging be?", + "How many log backups to keep?": "How many log backups to keep?", + "Log subtitle modification (debug)": "Log subtitle modification (debug)", + "Log to console (for development/debugging)": "Log to console (for development/debugging)", + "Collect anonymous usage statistics": "Collect anonymous usage statistics", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (fill api info below)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symlink to original file", + "I keep the original filenames": "I keep the original filenames", + "none of the above": "none of the above", + "exact: media filename match": "exact: media filename match", + "loose: filename contains media filename": "loose: filename contains media filename", + "any": "any", + "prefer": "prefer", + "don't prefer": "don't prefer", + "force HI": "force HI", + "force non-HI": "force non-HI", + "don't change": "don't change", + "white": "white", + "light-grey": "light-grey", + "red": "red", + "green": "green", + "yellow": "yellow", + "blue": "blue", + "magenta": "magenta", + "cyan": "cyan", + "black": "black", + "dark-red": "dark-red", + "dark-green": "dark-green", + "dark-yellow": "dark-yellow", + "dark-blue": "dark-blue", + "dark-magenta": "dark-magenta", + "dark-cyan": "dark-cyan", + "dark-grey": "dark-grey", + "current folder": "current folder", + "never": "never", + "current media item": "current media item", + "next episode (series)": "next episode (series)", + "hybrid: current item or next episode": "hybrid: current item or next episode", + "hybrid-plus: current item and next episode": "hybrid-plus: current item and next episode", + "every 6 hours": "every 6 hours", + "every 12 hours": "every 12 hours", + "every 24 hours": "every 24 hours", + "1 days": "1 days", + "2 days": "2 days", + "3 days": "3 days", + "4 days": "4 days", + "1 weeks": "1 weeks", + "2 weeks": "2 weeks", + "3 weeks": "3 weeks", + "4 weeks": "4 weeks", + "5 weeks": "5 weeks", + "6 weeks": "6 weeks", + "12 weeks": "12 weeks", + "don't limit": "don't limit", + "1 year": "1 year", + "2 years": "2 years", + "3 years": "3 years", + "4 years": "4 years", + "5 years": "5 years", + "6 years": "6 years", + "7 years": "7 years", + "8 years": "8 years", + "9 years": "9 years", + "10 years": "10 years", + "only agent": "only agent", + "disabled": "disabled", + "advanced menu": "advanced menu", + "CRITICAL": "CRITICAL", + "ERROR": "ERROR", + "WARNING": "WARNING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Force-find subtitles: %(item_title)s", + "File %(file_part_index)s: ": "File %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNo current subtitle in storage", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sManage %(language)s subtitle", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sList %(language)s subtitles", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sEmbedded subtitles (%(languages)s)", + "Select active %(language)s subtitle": "Select active %(language)s subtitle", + "%(count)d subtitles in storage": "%(count)d subtitles in storage", + "List available %(language)s subtitles": "List available %(language)s subtitles", + "Modify current %(language)s subtitle": "Modify current %(language)s subtitle", + "Currently applied mods: %(mod_list)s": "Currently applied mods: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Blacklist current %(language)s subtitle and search for a new one", + "Manage blacklist (%(amount)s contained)": "Manage blacklist (%(amount)s contained)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ": "Current: ", + "Stored: ": "Stored: ", + "by %(release_group)s": "by %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Current: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)": "Search for %(language)s subs (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sFilename: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Searching for %(language)s subs (%(video_data)s), refresh here ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s%(wrong_series_state)s%(wrong_season_ep_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Matches: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Downloading subtitle for %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Insufficient permissions on library %(title)s, folder: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Display ignore list (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s until %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extracting subtitle %(stream_index)s of %(filename)s", + "Extract missing %(language)s embedded subtitles": "Extract missing %(language)s embedded subtitles", + "Extract and activate %(language)s embedded subtitles": "Extract and activate %(language)s embedded subtitles", + "None": "None", + "Idle": "Idle", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Adjust by %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s", + "Remove: %(mod_name)s": "Remove: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Subtitle download failed (%(item_id)s)", + "agent + interface": "agent + interface", + "only interface": "only interface", + "interface": "interface", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list", + "Add %(kind)s %(title)s to the ignore list": "Add %(kind)s %(title)s to the ignore list", + "Remove %(kind)s %(title)s from the ignore list": "Remove %(kind)s %(title)s from the ignore list", + "%(title)s added to the ignore list": "%(title)s added to the ignore list", + "%(title)s removed from the ignore list": "%(title)s removed from the ignore list", + "Triggering refresh for %(title)s": "Triggering refresh for %(title)s", + "Triggering forced refresh for %(title)s": "Triggering forced refresh for %(title)s", + "Refresh of item %(item_id)s triggered": "Refresh of item %(item_id)s triggered", + "Forced refresh of item %(item_id)s triggered": "Forced refresh of item %(item_id)s triggered", + "Ignore %(kind)s \"%(title)s\"": "Ignore %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Un-ignore %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Refreshing %(title)s", + "Force-refreshing %(title)s": "Force-refreshing %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extracts embedded subtitles of all episodes for the current season with all configured default modifications", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk", + "the movie": "the movie", + "the series": "the series", + "the episode": "the episode", + "the season": "the season", + "Change the color of the subtitle": "Change the color of the subtitle", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Adds the requested color to every line of the subtitle. Support depends on player.", + "Basic common fixes": "Basic common fixes", + "Fix common and whitespace/punctuation issues in subtitles": "Fix common and whitespace/punctuation issues in subtitles", + "Remove all style tags": "Remove all style tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Removes all possible style tags from the subtitle, such as font, bold, color etc.", + "Reverse punctuation in RTL languages": "Reverse punctuation in RTL languages", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew", + "Change the FPS of the subtitle": "Change the FPS of the subtitle", + "Re-syncs the subtitle to the framerate of the current media file.": "Re-syncs the subtitle to the framerate of the current media file.", + "Remove Hearing Impaired tags": "Remove Hearing Impaired tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Removes tags, text and characters from subtitles that are meant for hearing impaired people", + "Fix common OCR issues": "Fix common OCR issues", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR", + "Change the timing of the subtitle": "Change the timing of the subtitle", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Adds or substracts a certain amount of time from the whole subtitle to match your media", + "Available": "Available", + "Current": "Current", + "Custom path to advanced_settings.json": "Custom path to advanced_settings.json", + "zh-hant": "Chinese (Traditional)", + "zh-hans": "Chinese (Simplified)", + "Reset the plugin's menu history storage": "Reset the plugin's menu history storage", + "forced": "forced", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Extract embedded subtitle streams", + "Display %(incl_excl_list_name)s (%(count)d)": "Display %(incl_excl_list_name)s (%(count)d)", + "include list": "include list", + "ignore list": "ignore list", + "Include list": "Include list", + "Ignore list": "Ignore list", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)", + "Didn't change the %(incl_excl_list_name)s": "Didn't change the %(incl_excl_list_name)s", + "%(title)s added to the include list": "%(title)s added to the include list", + "%(title)s removed from the include list": "%(title)s removed from the include list", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Enable Sub-Zero for %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Disable Sub-Zero for %(kind)s \"%(title)s\"", + "Download subtitles": "Download subtitles", + "Never": "Never", + "Always": "Always", + "When main audio stream is not Subtitle Language (1)": "When main audio stream is not Subtitle Language (1)", + "When main audio stream is not any configured language": "When main audio stream is not any configured language", + "When any audio stream is not Subtitle Language (1)": "When any audio stream is not Subtitle Language (1)", + "When any audio stream is not any configured language": "When any audio stream is not any configured language", + "Download foreign/forced subtitles": "Download foreign/forced subtitles", + "Only for Subtitle Language (1)": "Only for Subtitle Language (1)", + "Only for Subtitle Language (2)": "Only for Subtitle Language (2)", + "Only for Subtitle Language (3)": "Only for Subtitle Language (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Embedded streams: Treat \"Undefined\" (und) as language 1", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Reverse punctuation in RTL languages (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Fix only uppercase downloaded subtitles", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)", + "enable SZ for all items by default, use ignore mode": "enable SZ for all items by default, use ignore mode", + "disable SZ for all items by default, use include mode": "disable SZ for all items by default, use include mode", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)", + "auto": "auto", + "manual": "manual", + "auto-better": "auto-better", + "Unknown": "Unknown", + "embedded": "embedded", + "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)": "Use custom DNS (IPs, comma-separated, leave empty for default DNS. Default: Google/CF)", + "Don't search for subtitles if a subtitle in any configured language exists as": "Don't search for subtitles if a subtitle in any configured language exists as", + "External or embedded subtitle": "External or embedded subtitle", + "External or embedded subtitle (not foreign/forced)": "External or embedded subtitle (not foreign/forced)", + "External subtitle": "External subtitle", + "External subtitle (not foreign/forced)": "External subtitle (not foreign/forced)", + "Always search for all configured languages": "Always search for all configured languages" +} \ No newline at end of file diff --git a/Contents/Strings/es.json b/Contents/Strings/es.json new file mode 100644 index 000000000..108aa105f --- /dev/null +++ b/Contents/Strings/es.json @@ -0,0 +1,441 @@ +{ + "sq": "Albanés", + "ar": "Árabe", + "be": "Bieloruso", + "bs": "Bosnio", + "bg": "Búlgaro", + "ca": "Catalán", + "zh": "Chino", + "hr": "Croata", + "cs": "Checo", + "da": "Danés", + "nl": "Neerlandés", + "en": "Inglés", + "et": "Estonio", + "fa": "Persa", + "fi": "Finés", + "fr": "Francés", + "de": "Alemán", + "el": "Griego", + "he": "Hebreo", + "hi": "Hindi", + "hu": "Húngaro", + "is": "Islandés", + "id": "Indonesio", + "it": "Italiano", + "ja": "Japonés", + "ko": "Coreano", + "lv": "Letonio", + "lt": "Lituano", + "mk": "Macedonio", + "ms": "Malayo", + "no": "Noruego", + "pl": "Polaco", + "pt": "Portugués", + "pt-br": "Portugués (Brasil)", + "ro": "Rumano", + "ru": "Ruso", + "sr": "Serbio", + "sr-cyrl": "Serbio (Cirílico)", + "sr-latn": "Serbio (Latín)", + "sk": "Eslovaco", + "sl": "Slovaco", + "es": "Español", + "sv": "Sueco", + "th": "Tailandés", + "tr": "Turco", + "uk": "Ucraniano", + "vi": "Vietnamita", + "Internal stuff, pay attention!": "Asunto interno, ¡prestar atención!", + "Advanced": "Avanzado", + "advanced": "avanzado", + "Enter PIN": "Ingresar PIN", + "The owner has restricted the access to this menu. Please enter the correct pin": "El dueño ha restringido el acceso a este menú. Por favor ingrese el PIN adecuado", + "Restart the plugin": "Reiniciar el plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Obtener mis bitácoras (copia el enlace que aparece y ábrelo en tu navegador, por favor)", + "Copy the appearing link and open it in your browser, please": "Copia el enlace que aparece y ábrelo en tu navegador, por favor", + "Trigger find better subtitles": "Provocar búsqueda de Mejores Subtítulos", + "Skip next find better subtitles (sets last run to now)": "Evitar la próxima búsqueda de Mejores Subtítulos (fija a Ahora la última búsqueda)", + "Trigger subtitle storage maintenance": "Provocar el mantenimiento del almacenamiento de subtítulos", + "Trigger subtitle storage migration (expensive)": "Provocar la migración del almacenamiento de subtítulos (lento)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Provocar el mantenimiento de la caché (refinadores, proveedores y paquetes)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Aplicar las modificaciones de la configuración de subtítulos a todos los subtítulos \nalmacenados y activos", + "Re-Apply mods of all stored subtitles": "Reaplicar modificaciones a todos los subtítulos almacenados", + "Log the plugin's scheduled tasks state storage": "Anotar en el log las tareas de las descargar programadas del plugin", + "Log the plugin's internal ignorelist storage": "Anotar en el log la lista a ignorar en las descargas", + "Log the plugin's complete state storage": "Anotar en el log el estado completo de las descargas", + "Reset the plugin's scheduled tasks state storage": "Reiniciar el plugin de descargas programadas", + "Reset the plugin's internal ignorelist storage": "Reiniciar el plugin de la lista a ignorar en las descargas", + "Invalidate Sub-Zero metadata caches (subliminal)": "Invalidar el caché de metadata Sub-Zero (subliminal)", + "Reset provider throttle states": "Reiniciar estado en proveedores ralentizados", + "Restarting the plugin": "Reiniciar el plugin", + "Restart triggered, please wait about 5 seconds": "Reinicio provocado, por favor espere 5 segundos", + "Reset subtitle storage": "Limpiar carpeta de almacenamiento de subtítulos", + "Are you sure?": "¿Estás seguro?", + "Are you really sure?": "¿Estás realmente seguro?", + "Success": "Éxito", + "FindBetterSubtitles triggered": "Buscar Mejores Subtítulos provocado", + "FindBetterSubtitles skipped": "Buscar Mejores Subtítulos evitado", + "SubtitleStorageMaintenance triggered": "Mantenimiento del almacenamiento de subtítulos provocado", + "MigrateSubtitleStorage triggered": "Migración del almacenamiento de subtítulos provocada", + "TriggerCacheMaintenance triggered": "Mantenimiento de la caché provocado", + "This may take some time ...": "Esto podría tomar algún tiempo...", + "Download Logs": "Descargar logs", + "Sorry, feature unavailable": "Lo sentimos, característica no disponible", + "Universal Plex token not available": "Token universal Plex no disponible", + "Copy this link and open this in your browser, please": "Copia este enlace y ábrelo en tu navegador, por favor", + "Cache invalidated": "Caché invalidado", + "Enter PIN number ": "Ingrese número PIN␣", + "PIN correct": "PIN correcto", + "Reset": "Resetear", + "Menu locked": "Menú bloqueado", + "Provider throttles reset": "Reiniciar proveedores ralentizados", + "Information Storage (%s) reset": "Almacén de Información (%s) reiniciado", + "Information Storage (%s) logged": "Almacén de Información (%s) logueado", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex no retornó información del elemento, por favor actualice y vuelva más tarde", + "Item not found: %s!": "¡Elemento no encontrado: %s!", + "< Back to %s": "< Regresar a %s", + "Back to %s > %s": "Regresar a %s > %s", + "Refresh: %s": "Refrescar: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Ejecuta una actualización forzada, ignorando subtítulos presentes y buscando nuevos", + "Extract and activate embedded subtitle streams": "Extraer y activar subtítulos integrados", + "Inspect currently blacklisted subtitles": "Inspeccionar la actual lista de bloqueados", + "Subtitle saved to disk": "Subtítulo guardado en disco", + "Remove subtitle from blacklist": "Eliminar subtítulo de la lista de bloqueados", + "No subtitles found": "No se han encontrado subtítulos", + " (unknown)": "␣(desconocido)", + " (forced)": "␣(forzado)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Extracción del subtítulo integrado %s de la parte %s:%s lanzada", + "Insufficient permissions": "Permisos insuficientes", + "I'm not enabled!": "¡No estoy habilitado!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Por favor, habilítame para alguna biblioteca en tu servidor; ahora mismo no puedo hacer nada", + "Working ... refresh here": "Trabajando... refresque aquí", + "Current state: %s; Last state: %s": "Estado actual: %s; Último estado: %s", + "On-deck items": "Archivos On-deck", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Muestra los últimos %s elementos reproducidos y permite refrescar individualmente sus metadatos y subtítulos.", + "Recently-added items": "Elementos recién añadidos", + "Recently played items": "Elementos recién reproducidos", + "Shows the recently added items per section.": "Muestra los elementos recién añadidos por sección.", + "Show recently added items with missing subtitles": "Mostrar los elementos recién añadidos sin subtítulos", + "Browse all items": "Ver todos los elementos", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Navega a través de la colección completa y gestiona la Lista de Ignorados. Puede además refrescar individualmente sus metadatos y subtítulos", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Última ejecución: %s; Próxima ejecución: %s; Duración de la última ejecución: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Buscar subtítulos faltantes (en elementos recién añadidos, antigüedad máxima: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Ejecuta automáticamente las tareas programadas, si están configuradas. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Muestra la Lista de Ignorados actual (principalmente usado por tareas automáticas)", + "History": "Historial", + "Show the last %i downloaded subtitles": "Muestra lo últimos %i subtítulos descargados", + "Refresh": "Refrescar", + "Re-lock menu(s)": "Bloquear menús", + "Enabled the PIN again for menu(s)": "Habilitado el PIN de nuevo en los menús", + "Throttled providers: %s": "Proveedores ralentizados: %s", + "Advanced functions": "Funciones avanzadas", + "Use at your own risk": "Use bajo su responsabilidad", + "Items On Deck": "Elementos En Progreso", + "Recently Played": "Recién Reproducidos", + "Items with missing subtitles": "Elementos sin subtítulos", + "Find recent items with missing subtitles": "Buscar elementos recientes sin subtítulos", + "Updating, refresh here ...": "Actualizando, refresque aquí...", + "Missing: %s": "Falta: %s", + "Didn't change the ignore list": "La Lista de Ignorados no ha cambiado", + "Sections": "Secciones", + "All": "Todo", + "show": "serie", + "movie": "película", + "<< Back to home": "<< Volver a Inicio", + "Auto-Find subtitles: %s": "Auto-búsqueda de subtítulos: %s ", + "Extracting of embedded subtitles for %s triggered": "Extracción lanzada para los subtítulos integrados de %s", + "< Back to subtitle options for: %s": "< Regresar a las opciones de subtítulos para: %s", + "Remove last applied mod (%s)": "Quitar la última modificación realizada (%s)", + "none": "ninguno", + "Manage applied mods": "Gestionar modificaciones realizadas", + "Reapply applied mods": "Reaplicar modificaciones realizadas", + "Restore original version": "Restaurar versión original", + "< Back to subtitle modification menu": "< Regresar al menú de modificación de subtítulos", + "subs constantly getting faster": "los subtítulos van más rápido constantemente", + "subs constantly getting slower": "los subtítulos van más lento constantemente", + "< Back to subtitle modifications": "< Regresar a las modificaciones de subtítulos", + "< Back to unit selection": "< Regresar a la selección", + "Subtitle Language (1)": "Idioma del Subtítulo (1)", + "Subtitle Language (2)": "Idioma del Subtítulo (2)", + "Subtitle Language (3)": "Idioma del Subtítulo (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Idiomas adicionales de subtítulos (use códigos ISO-639-1 separados por comas)", + "Only download foreign/forced subtitles": "Descargar sólo subtítulos extranjeros o forzados", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Mostrar idiomas con atributos de país tipo ISO 639-1 (p. ej. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Tratar idiomas con atributos de país como ISO 639-1 (es decir, no descargar pt-BR si existe un subtítulo pt)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Restringir a un idioma (evita añadir \".lang\" al nombre del fichero del subtítulo; solo usa el \"Idioma del Subtítulo (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Subtítulos integrados: tratar \"Undefined\" (und) como primer idioma", + "I rename my files using": "Renombro los archivos usando", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Obtener el nombre original del archivo de los archivos tipo \"file_info\" (ver wiki)", + "Sonarr URL (add URL base if configured)": "URL de Sonarr (añadir la URL base si está configurada)", + "Sonarr API key": "Clave API de Sonarr", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "URL de Radarr (añadir la URL base si está configurada, versión mínima: 0.2.0.897)", + "Radarr API key": "Clave API de Radarr", + "Provider: Enable OpenSubtitles": "Proveedor: Habilitar OpenSubtitles", + "Opensubtitles Username": "Usuario de OpenSubtitles", + "Opensubtitles Password": "Contraseña de OpenSubtitles", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "¿Es usuario VIP de OpenSubtitles? (http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Proveedor: Habilitar Podnapisi.net", + "Provider: Enable Titlovi.com": "Proveedor: Habilitar Titlovi.com", + "Provider: Enable Addic7ed": "Proveedor: Habilitar Addic7ed", + "Addic7ed Username": "Usuario de Addic7ed", + "Addic7ed Password": "Contraseña de Addic7ed", + "Addic7ed: boost score (if requirements met)": "Addic7ed: puntuación incentivada si cumple los requisitos", + "Addic7ed: Use random user agents": "Addic7ed: Usar agentes aleatorios", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Proveedor: Habilitar Legendas TV (sobre todo pt-BR, requiere UNRAR)", + "Legendas TV Username": "Usuario de Legendas TV", + "Legendas TV Password": "Contraseña de Legendas TV", + "Provider: Enable TVsubtitles.net": "Proveedor: Habilitar TVsubtitles.net", + "Provider: Enable NapiProjekt.pl (Polish)": "Proveedor: Habilitar NapiProjekt.pl (polaco)", + "Provider: Enable SubScene (TV shows)": "Proveedor: Habilitar SubScene (series de tv)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Proveedor: Habilitar hosszupuskasub.com (húngaro)", + "Provider: Enable aRGENTeaM (Spanish)": "Proveedor: Habilitar aRGENTeaM (español)", + "Search enabled providers simultaneously (multithreading)": "Buscar proveedores habilitados simultáneamente (multihebra)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Extraer automáticamente y usar subtítulos integrados al añadir contenido (con las modificaciones que ha configurado)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Después de la extracción automática de subtítulos integrados ¿buscar inmediatamente los subtítulos disponibles?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "¿No buscar subtítulos de un idioma si existen subtítulos integrados dentro del archivo (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "¿No buscar subtítulos de un idioma si ya existen en el sistema de ficheros o en los metadatos?", + "How strict should these subtitles existing on the filesystem be detected?": "¿Cómo de estricta debe ser la detección de estos subtítulos en el sistema de archivos?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "¿Incluir subtítulos que no sean tipo texto (diferentes a .srt/.ssa/.ass/.vtt; integrados o externos) en lo anterior?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Puntuación mínima para Series de TV (mínimo: 240, sano: 337, recomendable: 352; ver http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Puntuación mínima para Películas (mínimo: 60, sano: 69, recomendado: 82; ver \nhttp://v.ht/szscores)", + "Download hearing impaired subtitles.": "Descargar subtítulos para sordos", + "Remove Hearing Impaired tags from downloaded subtitles": "Eliminar etiquetas para sordos de los subtítulos descargados", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Eliminar etiquetas y estilos de los subtítulos descargados (negrita, cursiva, subrayado, colores, ...)", + "Fix common issues in subtitles": "Arreglar problemas comunes en los subtítullos", + "Fix common OCR errors in downloaded subtitles": "Arreglar errores comunes de OCR en los subtítulos descargados", + "Reverse punctuation in RTL languages (heb)": "Invertir puntuación en idiomas RTL (heb)", + "Change colors of subtitles to": "Cambiar color de los subtítulos a", + "Store subtitles next to media files (instead of metadata)": "Almacenar los subtítulos junto a los archivos de video (en lugar de incluirlos en los metadatos)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Formatos de subtítulos a guardar (lo que no sean SRT sólo funcionan si la opción anterior está habilitada)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Carpeta de subtítulos (\"carpeta actual\" es la carpeta donde los archivos de video están guardados)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Carpeta de subtítulos personalizada (sustituye a la \"Carpeta de subtítulos\", calculada con las rutas reales)", + "Fall back to metadata storage if filesystem storage failed": "Activar como segunda opción el almacenamiento en los metadatos si falla en el sistema de almacenamiento", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Fijar los permisos de los subtítulos a (nº entero, p. ej.: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Borrar automáticamente los subtítulos sin uso (grabados externamente)", + "On media playback: search for missing subtitles (refresh item)": "Al reproducir un vídeo: buscar subtítulos automáticamente", + "Scheduler: Periodically search for recent items with missing subtitles": "Programador: Buscar subtítulos periódicamente para elementos recién añadidos que no tengan", + "Scheduler: Item age to be considered recent": "Programador: Antigüedad del elemento para ser considerado como Reciente", + "Scheduler: Recent items to consider per library": "Programador: Elementos recientes a considerar por biblioteca", + "Scheduler: Periodically search for better subtitles": "Programador: Buscar periódicamente Mejores Subtítulos", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Programador: Días a buscar Mejores Subtítulos (máximo 30)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Programador: No buscar Mejores Subtítulos si la fecha de emisión del elemento es mayor que", + "Scheduler: Overwrite manually selected subtitles when better found": "Programador: Sobreescribir subtítulos seleccionados manualmente cuando se encuentren Mejores Subtítulos", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Programador: Sobreecribir subtítulos con modificaciones que no sean por defecto cuando se encuentren Mejores Subtítulos", + "History: amount of items to store historical data for": "Historial: Cantidad de elementos de los que se guardará datos históricos", + "How many download tries per subtitle (on timeout or error)": "¿Cuántos intentos se deben realizar por subtítulos, cuando se produzca un error o supere el tiempo de espera?", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Ignorar carpetas (con archivos tipo \"subzero.ignore/.subzero.ignore/.nosz\" en ellas)", + "Ignore anything in the following paths (comma-separated)": "Ignorar cualquier cosa en las siguientes rutas, separadas por comas", + "Sub-Zero mode": "Modo Sub-Zero", + "Access PIN (any amount of numbers, 0-9)": "PIN de acceso (cualquier cantidad de números, 0-9)", + "Access PIN valid for minutes": "Minutos de validez para el PIN de acceso ", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Usar PIN para restringir el acceso (necesitar reinicio)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Llamar a este ejecutable tras las descarga correcta de un subtítulo (ver detalles en la Wiki)", + "Check for correct folder permissions of every library on plugin start": "Comprobar permisos de carpeta para cada biblioteca al iniciar el plugin", + "Use new style caching (for subliminal)": "Usar nuevo estilo de caché (para Subliminal)", + "Low impact mode (for remote filesystems)": "Modo de bajo impacto (para sistemas de archivo remotos)", + "Timeout for API requests sent to the PMS": "Tiempo de espera para peticiones API enviadas al PMS", + "HTTP proxy to use for providers (supports credentials)": "Proxy HTTP a usar para proveedores (permite credenciales)", + "How verbose should the logging be?": "¿Cómo de extenso debe ser el detalle del log?", + "How many log backups to keep?": "¿Cuántas copias del log quiere mantener?", + "Log subtitle modification (debug)": "Anotar en el log las modificaciones de subtítulos (en pruebas)", + "Log to console (for development/debugging)": "Anotar log en consola (para desarrollar o depurar)", + "Collect anonymous usage statistics": "Recolectar estadísticas anónimas de uso", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (rellenar información de la API)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Enlace simbólico al archivo original", + "I keep the original filenames": "Mantener los nombres de archivo originales", + "none of the above": "ninguno de los anteriores", + "exact: media filename match": "exacta: coincidencia por nombre de archivo del vídeo", + "loose: filename contains media filename": "parcial: el nombre del vídeo aparece en el nombre del archivo", + "any": "cualquiera", + "prefer": "preferir", + "don't prefer": "no preferir", + "force HI": "forzar Alta", + "force non-HI": "forzar No Alta", + "don't change": "sin cambios", + "white": "blanco", + "light-grey": "gris claro", + "red": "rojo", + "green": "verde", + "yellow": "amarillo", + "blue": "azul", + "magenta": "magenta", + "cyan": "cyan", + "black": "negro", + "dark-red": "rojo-oscuro", + "dark-green": "verde-oscuro", + "dark-yellow": "amarillo-oscuro", + "dark-blue": "azul-oscuro", + "dark-magenta": "magenta-oscuro", + "dark-cyan": "cyan-oscuro", + "dark-grey": "gris-oscuro", + "current folder": "carpeta actual", + "never": "nunca", + "current media item": "elemento multimedia actual", + "next episode (series)": "siguiente episodio (serie)", + "hybrid: current item or next episode": "híbrido: elemento actual o siguiente episodio", + "hybrid-plus: current item and next episode": "híbrido-plus: elemento actual y siguiente episodio", + "every 6 hours": "cada 6 horas", + "every 12 hours": "cada 12 horas", + "every 24 hours": "cada 24 horas", + "1 days": "1 día", + "2 days": "2 días", + "3 days": "3 días", + "4 days": "4 días", + "1 weeks": "1 semana", + "2 weeks": "2 semanas", + "3 weeks": "3 semanas", + "4 weeks": "4 semanas", + "5 weeks": "5 semanas", + "6 weeks": "6 semanas", + "12 weeks": "12 semanas", + "don't limit": "no limitar", + "1 year": "1 año", + "2 years": "2 años", + "3 years": "3 años", + "4 years": "4 años", + "5 years": "5 años", + "6 years": "5 años", + "7 years": "7 años", + "8 years": "8 años", + "9 years": "9 años", + "10 years": "10 años", + "only agent": "sólo agente", + "disabled": "deshabilitado", + "advanced menu": "menú avanzado", + "CRITICAL": "CRÍTICO", + "ERROR": "ERROR", + "WARNING": "ADVERTENCIA", + "INFO": "INFO", + "DEBUG": "DEPURACIÓN", + "Force-find subtitles: %(item_title)s": "Forzar búsqueda de subtítulos: %(item_title)s", + "File %(file_part_index)s: ": "Archivo %(file_part_index)s:␣", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNo hay un subtítulo guardado", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)s Subtítulo actual: %(provider_name)s (añadido: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)s Gestionar subtítulo en %(language)s", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s Mostrar subtítulo en %(language)s", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sSubtítulos integrados en (%(languages)s)", + "Select active %(language)s subtitle": "Elegir subtítulo activo en %(language)s", + "%(count)d subtitles in storage": "%(count)d subtítulos almacenados", + "List available %(language)s subtitles": "Mostrar subtítulos disponibles en %(language)s", + "Modify current %(language)s subtitle": "Modificar el subtítulo actual en %(language)s", + "Currently applied mods: %(mod_list)s": "Modificaciones aplicadas actualmente: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Bloquear el actual subtítulo en %(language)s y buscar uno nuevo ", + "Manage blacklist (%(amount)s contained)": "Gestionar lista de bloqueados (total: %(amount)s)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Puntuación: %(score)s", + "Current: ": "Actual: ", + "Stored: ": "Almacenado: ", + "by %(release_group)s": "por %(release_group)s", + "Current: %(provider_name)s (%(score)s) ": "Actual: %(provider_name)s (%(score)s)␣", + "Search for %(language)s subs (%(video_data)s)": "Buscar subtítulos en %(language)s (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sNombre de archivo: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Buscando subtítulos en %(language)s para (%(video_data)s), actualice aquí...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": "␣(FPS incorrectos, sub: %(subtitle_fps)s, archivo: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " ␣(FPS incorrectos, sub: %(subtitle_fps)s, archivo: desconocido, modo de bajo impacto)\n", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, puntuación: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Coincidencia: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Descargando subtítulo para %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Extraer flujo %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s con las modificaciones por defecto", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Extraer flujo %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Permisos insuficientes en biblioteca %(title)s, carpeta: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Ejecutando: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Mostrar lista de ignorados (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s hasta %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Extrayendo subtítulos %(stream_index)s de %(filename)s", + "Extract missing %(language)s embedded subtitles": "Extraer subtítulos integrados faltantes en %(language)s", + "Extract and activate %(language)s embedded subtitles": "Extraer y activar subtítulos integrados en %(language)s", + "None": "Ninguno", + "Idle": "Parado", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Ajustar a %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "añadido: %(date_added)s, %(mode)s, Idioma: %(language)s, Puntuación: %(score)i, Almacenamiento: %(storage_type)s\n", + "Remove: %(mod_name)s": "Quitar: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Fallo la descarga del subtítulos(%(item_id)s)", + "agent + interface": "agente + interfaz", + "only interface": "sólo interfaz", + "interface": "interfaz", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Muestra los elementos En Progreso y permite actualiza individualmente los metadatos y subtítulos", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Muestra elementos sin subtítulos. Haz clic en \"Buscar elementos recientes sin subtítulos\" para actualizar la lista", + "Add %(kind)s %(title)s to the ignore list": "Añadir %(kind)s %(title)s a la lista de ignorados", + "Remove %(kind)s %(title)s from the ignore list": "Eliminar %(kind)s %(title)s de la lista de ignorados", + "%(title)s added to the ignore list": "%(title)s añadido a la lista de ignorados", + "%(title)s removed from the ignore list": "%(title)s eliminados de la lista de ignorados", + "Triggering refresh for %(title)s": "Actualización lanzada para %(title)s", + "Triggering forced refresh for %(title)s": "Actualización forzada para%(title)s", + "Refresh of item %(item_id)s triggered": "Actualización de elementos %(item_id)s lanzada", + "Forced refresh of item %(item_id)s triggered": "Actualización de elementos %(item_id)s forzada", + "Ignore %(kind)s \"%(title)s\"": "Ignorar %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Dejar de ignorar %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Refrescando %(title)s", + "Force-refreshing %(title)s": "Forzando refresco de %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Extraer los subtítulos integrados no extraídos de todos los episodios de la actual temporada con las modificaciones configuradas por defecto", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Extraer los subtítulos integrados de todos los episodios de la actual temporada con las modificaciones configuradas por defecto", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Actualiza %(the_movie_series_season_episode)s, tratando de localizar nuevos subtítulos almacenados", + "the movie": "la película", + "the series": "la serie", + "the episode": "el episodio", + "the season": "la temporada", + "Change the color of the subtitle": "cambiar el color del subtítulo", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Añade el color seleccionado a todos los subtítulos. El funcionamiento depende del reproductor.", + "Basic common fixes": "Arreglos comunes básicos", + "Fix common and whitespace/punctuation issues in subtitles": "Arregla problemas comunes, espacios y puntuación en los subtítulos", + "Remove all style tags": "Elimina toda las etiquetas de estilo", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Elimina todas las posibles etiquetas de estilo del subtítulo, como fuente, negrita, color, etc.", + "Reverse punctuation in RTL languages": "Invertir puntuación en idiomas RTL", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Algunos reproductores no saben tratar correctamente la puntuación de derecha a izquierda, que aplica al idioma hebreo", + "Change the FPS of the subtitle": "Cambiar los FPS del subtítulo", + "Re-syncs the subtitle to the framerate of the current media file.": "Resincronizar los subtítulos a la tasa de frames del archivo original", + "Remove Hearing Impaired tags": "Eliminar etiquetas para sordos", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Eliminar etiquetas, textos y caracteres de los subtítulos puestos para sordos", + "Fix common OCR issues": "Arreglar errores OCR comunes", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Arreglar fallos que ocurren cuando los subtítulos se convierten de imagen a texto por un OCR", + "Change the timing of the subtitle": "Cambiar el \"timing\" de los subtítulos", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Añadir o quitar cierta cantidad de tiempo de todo el subtítulos para emparejarlo con el vídeo", + "Available": "Disponible", + "Current": "Actual", + "Custom path to advanced_settings.json": "Ruta personalizada para advanced_settings.json", + "zh-hant": "Chino (Tradicional)", + "zh-hans": "Chino (Simplificado)", + "Reset the plugin's menu history storage": "Vaciar el historial de almacenamiento del plugin", + "forced": "forzadp", + "%s in %s (%s, score: %s), %s": "%s en %s (%s, puntuación: %s), %s", + "Extract embedded subtitle streams": "Extraer la cola de subtítulos integrados", + "Display %(incl_excl_list_name)s (%(count)d)": "Mostrar la lista de %(incl_excl_list_name)s (%(count)d)", + "include list": "lista de inclusión", + "ignore list": "lista de ignorados", + "Include list": "Lista de inclusión", + "Ignore list": "Lista de ignorados", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Mostrar la lista %(incl_excl_list_name)s actuar (utilizado principalmente para tarea automáticas)", + "Didn't change the %(incl_excl_list_name)s": "No se cambió la %(incl_excl_list_name)s", + "%(title)s added to the include list": "%(title)s añadido/s a la lista de inclusión", + "%(title)s removed from the include list": "%(title)s eliminados de la lista de inclusión", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Habilitar Sub-Zero para %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Deshabilitar Sub-Zero para %(kind)s \"%(title)s\"", + "Download subtitles": "Descargar subtítulos", + "Never": "Nunca", + "Always": "Siempre", + "When main audio stream is not Subtitle Language (1)": "Cuando el audio principal no equivale al Idioma del Subtítulo (1)", + "When main audio stream is not any configured language": "Cuando el audio principal no equivale a ningún idioma configurado", + "When any audio stream is not Subtitle Language (1)": "Cuando ninguna pista de audio equivale al Idioma del Subtítulo (1)", + "When any audio stream is not any configured language": "Cuando ninguna pista de audio coincide con ningún idioma configurado", + "Download foreign/forced subtitles": "Descargar subtítulos forzados/extranjeros", + "Only for Subtitle Language (1)": "Solo para el Idioma del Subtítulo (1)", + "Only for Subtitle Language (2)": "Solo para el Idioma del Subtítulo (2)", + "Only for Subtitle Language (3)": "Solo para el Idioma del Subtítulo (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Pistas integradas: tratar \"Undefined\" (und) como primer idioma", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Invertir puntuación en idiomas RTL (heb, ara, fas)", + "Fix only uppercase downloaded subtitles": "Arreglar solo las letras capitales en los subtítulos descargados", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "¿Debe SZ habilitarse o deshabilitarse por defecto? (Impacta en los ajustes de debajo y del menu del plugin)", + "enable SZ for all items by default, use ignore mode": "Habilitar SZ para todos los elementos por defecto, usar Modo Ignorar", + "disable SZ for all items by default, use include mode": "Deshabilitar SZ para todos los elementos por defecto, usar Modo Incluir", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Usar \"subzero.ignore/.subzero.ignore/.nosz\" (Modo Ignorar) o \"subzero.include/.subzero.include/.sz\" (Modo Incluir) en los archivos dentro de las carpetas", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Habilitar/deshabilitar Sub-Zero en las siguientes rutas (separadas por coma; los ajustes de arriba afectan a esto)", + "auto": "auto", + "manual": "manual", + "auto-better": "auto-mejorar", + "Unknown": "Desconocido", + "embedded": "Integrado" +} \ No newline at end of file diff --git a/Contents/Strings/hu.json b/Contents/Strings/hu.json new file mode 100644 index 000000000..b5f246eb7 --- /dev/null +++ b/Contents/Strings/hu.json @@ -0,0 +1,441 @@ +{ + "sq": "Albán", + "ar": "Arab", + "be": "Fehérorosz", + "bs": "Bosnyák", + "bg": "Bolgár", + "ca": "Katalán", + "zh": "Kínai", + "hr": "Horváth", + "cs": "Cseh", + "da": "Dán", + "nl": "Holland", + "en": "Angol", + "et": "Észt", + "fa": "Perzsa", + "fi": "Finn", + "fr": "Francia", + "de": "Németh", + "el": "Görög", + "he": "Héber", + "hi": "Hindu", + "hu": "Magyar", + "is": "Izlandi", + "id": "Indonéz", + "it": "Olasz", + "ja": "Japán", + "ko": "Koreai", + "lv": "Lett", + "lt": "Litván", + "mk": "Makedón", + "ms": "Maláj", + "no": "Norwég", + "pl": "Lengyel", + "pt": "Portugál", + "pt-br": "Portugál (Brazil)", + "ro": "Román", + "ru": "Orosz", + "sr": "Szerb", + "sr-cyrl": "Szerb (Cirill)", + "sr-latn": "Szerb (Latin)", + "sk": "Szlovák", + "sl": "Szlovén", + "es": "Spanyol", + "sv": "Svéd", + "th": "Thai", + "tr": "Török", + "uk": "Ukrán", + "vi": "Vietnámi", + "Internal stuff, pay attention!": "Belső dolog, figyelem!", + "Advanced": "Haladó", + "advanced": "haladó", + "Enter PIN": "Írd be a PIN-t", + "The owner has restricted the access to this menu. Please enter the correct pin": "A tulajdonos korlátozta a hozzáférést a menühöz. Kérlek írd be a jó pint-t", + "Restart the plugin": "Bővítmény újrainditása", + "Get my logs (copy the appearing link and open it in your browser, please)": "Logok lekérése (másold ki a megjelenő linket és nyisd meg a böngészőben)", + "Copy the appearing link and open it in your browser, please": "Másold ki a megjelenő linket és nyisd meg a böngészőben", + "Trigger find better subtitles": "Jobban passzoló feliratok keresése", + "Skip next find better subtitles (sets last run to now)": "Ugrás a következőre, keress jobb feliratot\n", + "Trigger subtitle storage maintenance": "Feliarttár karbantartás indítása", + "Trigger subtitle storage migration (expensive)": "Felirattár migrálás indítása (költséges)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Gyorsitótár karbantartás indítása (refiners, providers and packs/archives)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Alapértelmezett módosítások alkalmazása az összes (aktív) feliratra", + "Re-Apply mods of all stored subtitles": "Módosítások újra alkalmazása az összes feliratra", + "Log the plugin's scheduled tasks state storage": "Bővítmény ütemezett feladatainak logolása", + "Log the plugin's internal ignorelist storage": "A bővítmény mellőzendő listájának naplózása.", + "Log the plugin's complete state storage": "Bővítmény teljes állapotának naplózása", + "Reset the plugin's scheduled tasks state storage": "Bővítmény ütemezett feladatainak visszaállítása", + "Reset the plugin's internal ignorelist storage": "A bővítmény mellőzendő listájának alaphelyzetbe állítása", + "Invalidate Sub-Zero metadata caches (subliminal)": "Sub-Zero metaadat tár érvénytelenítése (subliminal)", + "Reset provider throttle states": "Szolgáltató túlterhelési állapotának alaphelyzetbe állítása", + "Restarting the plugin": "Bővítmény újraindítása", + "Restart triggered, please wait about 5 seconds": "Újraindítás folyamatban, várj körülbelül 5 másodpercet", + "Reset subtitle storage": "Felirattár alaphelyzetbe állitása", + "Are you sure?": "Biztos vagy benne?", + "Are you really sure?": "Teljesen biztos vagy benne?", + "Success": "Sikerült", + "FindBetterSubtitles triggered": "Jobb felirat keresése elindítva", + "FindBetterSubtitles skipped": "Jobb felirat keresése kihagyva", + "SubtitleStorageMaintenance triggered": "Felirat tár karbantartás elindítva", + "MigrateSubtitleStorage triggered": "Felirat tár migrálás elindítva", + "TriggerCacheMaintenance triggered": "Gyorsítótár karbantartás elindítva", + "This may take some time ...": "Ez egy kis időt vehet igénybe ...", + "Download Logs": "Naplófájlok letöltése", + "Sorry, feature unavailable": "Sajnálom, ez a funkció nem elérhető", + "Universal Plex token not available": "Univerzális Plex Token nem elérhető", + "Copy this link and open this in your browser, please": "Kérlek másold ki ezt a linket és nyisd meg a böngésződben", + "Cache invalidated": "Gyorsítótár érvénytelenítse", + "Enter PIN number ": "Írd be a PIN kódot", + "PIN correct": "PIN elfogadva", + "Reset": "Alaphelyzetbe állitás", + "Menu locked": "Menü zárolva", + "Provider throttles reset": "Szolgáltató túlterhelés védelem apahelyzetbe állítása", + "Information Storage (%s) reset": "Információs tár ( %s) alaphelyzetbe állítása", + "Information Storage (%s) logged": "Információs tár (%s) naplózva", + "Plex didn't return any information about the item, please refresh it and come back later": "A plex nem adott vissza semmi információt az elemről. Frissítsd és gyere vissza később.", + "Item not found: %s!": "Elem nem található: %s!", + "< Back to %s": "< Vissza %s", + "Back to %s > %s": "Vissza %s > %s", + "Refresh: %s": "Frissítés: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Kényszerített frissítés, figyelmen kívül hagyja az ismert feliratokat és újakat keres", + "Extract and activate embedded subtitle streams": "Beágyazott felirat kitömörítése és aktiválása", + "Inspect currently blacklisted subtitles": "Feketelistás feliratok megvizsgálása", + "Subtitle saved to disk": "Felirat lemezre mentve", + "Remove subtitle from blacklist": "Felirat eltávolítása a feketelistáról", + "No subtitles found": "Felirat nem található", + " (unknown)": " (ismeretlen)", + " (forced)": " (kiegészítő felirat)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Beágyazott felirat %s of part %s:%s kitömörítése elindítva", + "Insufficient permissions": "Nincs elegendő engedély", + "I'm not enabled!": "Bővitmény nincs bekapcsolva", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Aktiválj valamelyik könyvtáradhoz a server beállításoknál.\njelenleg semmit nem csinálok.", + "Working ... refresh here": "Folyamatban ... Frissíts it", + "Current state: %s; Last state: %s": "Jelenlegi állapot: %s; Utolsó állapot: %s", + "On-deck items": "Lejátszás alatt lévő elemek", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Mutassa a %s most játszott elemeket és adjon lehetőséget a metaadataik egyenként történő frissítésére,", + "Recently-added items": "Mostanában hozzáadott elemek", + "Recently played items": "Mostanában játszottak elemek", + "Shows the recently added items per section.": "Mostanában hozzáadott elemek mutatása könyvtáranként", + "Show recently added items with missing subtitles": "Mutasd a mostanában hozzáadott felirat nélküli elemeket", + "Browse all items": "Összes elme böngészése", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Végig megy a teljes könyvtáron és kezeli a mellőzendők listáját. Lehetőség van az egyes metaadatok és feliratok (erőltetett-) frissítésre is az egyes elemeknél.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Utolsó futás: %s, Következő időzített futás: %s, Utolsó futás hossza: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Hiányzó feliratok keresése (újonnan hozzáadott elemek, max. kor: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Automatikus futtatás az ütemező által konfigurálva. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Mellőzendő lista megjelenése (elsősorban automatikus feladatokhoz)", + "History": "Előzmények", + "Show the last %i downloaded subtitles": "Mutasd az utolsó %i letöltött feliratot", + "Refresh": "Frissités", + "Re-lock menu(s)": "menü(k) újrazárolása", + "Enabled the PIN again for menu(s)": "PIN újra engedélyezése a menü(k)-höz", + "Throttled providers: %s": "Túlterhelt szolgáltatók: %s", + "Advanced functions": "Fejlett funkciók", + "Use at your own risk": "Csak saját felelősségre használd", + "Items On Deck": "Lejátszás alatt álló elemek", + "Recently Played": "Mostanában játszott elemek", + "Items with missing subtitles": "Hiányzó felirattal rendelkező elemek", + "Find recent items with missing subtitles": "Mostanában hozzáadott hiányzó felirattal rendelkező elemek keresése", + "Updating, refresh here ...": "Frissítés folyamatban, frissíts itt ...", + "Missing: %s": "Hiányzó: %s", + "Didn't change the ignore list": "Ne változzon a mellőzendő lista ", + "Sections": "Könyvtárak", + "All": "Mind", + "show": "mutasd", + "movie": "Film", + "<< Back to home": "<< Vissza a kezdőképernyőre", + "Auto-Find subtitles: %s": "Felirat autó keresése: %s", + "Extracting of embedded subtitles for %s triggered": "Beágyazott felirat kitömörítése a %s -hez elindítva", + "< Back to subtitle options for: %s": "< Vissza a felirat beállításokhoz: %s", + "Remove last applied mod (%s)": "Utoljára alkalmazott (%s) módosítás visszavonása", + "none": "egyik sem", + "Manage applied mods": "Használatban lévő módositások kezelése", + "Reapply applied mods": "Módosítások újra alkalmazása", + "Restore original version": "Eredeti verzió visszaállítása", + "< Back to subtitle modification menu": "< Vissza a felirat módosítás menübe", + "subs constantly getting faster": "feliratok folyamatosan gyorsabbak lesznek", + "subs constantly getting slower": "feliratok folyamatosan lassabbak lesznek", + "< Back to subtitle modifications": "< Vissza a felirat módosításokhoz: %s", + "< Back to unit selection": "< Vissza a unit választáshoz", + "Subtitle Language (1)": "Felirat Nyelve (1)", + "Subtitle Language (2)": "Felirat Nyelve (2)", + "Subtitle Language (3)": "Felirat Nyelve (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "További felirat nyelvei (ISO-639-1 kódok vesszővel elválasztva)", + "Only download foreign/forced subtitles": "Csak külföldi / kényszerített feliratok letöltése", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Nyelvek megjelentetési az ISO 639-1 es kódolásnak megfelelő ország attribútummal (pl. pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Ország attribútummal rendelkező nyelveket kezeljen ISO 639-1 esként (pl. ne töltsön le pt-BR-t ha pt már le van töltve)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Korlátozás egy nyelvre (nem adja hozzá a \".nyelv\"-et a felirat fájl nevéhez.)", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Beágyazott feliratok: \"Ismeretlen\" nyelvet úgy tekinti mintha az elsődleges lenne", + "I rename my files using": "Átneveztem a fájlokat a következő segitségével", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Eredeti fájlnév meghatározása a .file_info/file_info index fájlokból. (lásd wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (base url hozzáadása ha be van állítva)", + "Sonarr API key": "Sonarr API kulcs", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (base url hozzáadása ha be van állítva) min. verzió: 0.2.0.897", + "Radarr API key": "Radarr API kulcs", + "Provider: Enable OpenSubtitles": "Szolgáltató: OpenSubtitles használata", + "Opensubtitles Username": "Opensubtitles Felhasználónév", + "Opensubtitles Password": "Opensubtitles Jelszó", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (hirdetésmentes feliratok, 1000 felirat/nap, VIP server: http://v.ht/osvip)", + "Provider: Enable Podnapisi.NET": "Szolgáltató: Podnapisi.NET használata", + "Provider: Enable Titlovi.com": "Szolgáltató: Titlovi.com használata", + "Provider: Enable Addic7ed": "Szolgáltató: Titlovi.com használata", + "Addic7ed Username": "Addic7ed Felhasználónév", + "Addic7ed Password": "Addic7ed Jelszó", + "Addic7ed: boost score (if requirements met)": "Addic7ed: találati esély növelése (ha a feltételek teljesülnek)", + "Addic7ed: Use random user agents": "Addic7ed: Random \"user agent\" használata", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Szolgáltató: Legendas TV használata (jellemzően pt-BR nyelvhez) ", + "Legendas TV Username": "Legendas TV felhasználói név", + "Legendas TV Password": "Legendas TV jelszó", + "Provider: Enable TVsubtitles.net": "Szolgáltató: Tvsubtitles.net engedélyezése", + "Provider: Enable NapiProjekt.pl (Polish)": "Szolgáltató: NapiProjekt.pl (Lengyel) engedélyezése", + "Provider: Enable SubScene (TV shows)": "Szolgáltató: SubScene (TV sorozatok) engedélyezése", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Szolgáltató: hosszupuskasub.com (Magyar) engedélyezése", + "Provider: Enable aRGENTeaM (Spanish)": "Szolgáltató: aRGENTeaM (Spanyol) engedélyezése", + "Search enabled providers simultaneously (multithreading)": "Párhuzamos keresés az engedélyezett szolgáltatóknál ( multithreading )", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Automatikusan tömörítse ki és használja a beágyazott feliratot a media hozzáadásakor (a beállított alapmódosításokkal )", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "A beágyazott felirat automatikus kitömörítés után azonnal keressen elérhető feliratot?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Ne keressen feliratot ahhoz a nyelvhez amihez van beágyazott felirat a média fájlban (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Ne keressen feliratot olyan nyelvhez ami már megtalálható a fájlrendszeren (metaadat/fájlrendszer)", + "How strict should these subtitles existing on the filesystem be detected?": "Mennyire szigorúan nézze ezeknek a feliratoknak a meglétét a fájlrendszeren?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Nem szöveg alapú feliratok használat (bármi más mint srt/.ssa/.ass/.vtt; beágyazott vagy külső)", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimum pontszám Sorozatokhoz (min: 240, def/sane: 337, min-ideális: 352; bővebben: http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimum pontszám Filmekhez (min: 60, def/sane: 69, min-ideal: 82; bővebben: http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Halláskárosult feliratok letöltése", + "Remove Hearing Impaired tags from downloaded subtitles": "Halláskárosult címke törlése a letöltött feliratokról", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Stílus címkék törlése a letöltött feliratokról (vastag, dőlt, aláhúzott, színek, ...)", + "Fix common issues in subtitles": "Gyakori hibák javítása a feliratokban", + "Fix common OCR errors in downloaded subtitles": "Általános OCR hibák javítása a letöltött feliratokban", + "Reverse punctuation in RTL languages (heb)": "Fordított írásjelek RTL nyelveken (heb)", + "Change colors of subtitles to": "Felirat színének megváltoztatása erre", + "Store subtitles next to media files (instead of metadata)": "Feliratok tárolása a videó fájlok mellet (az adatbázis helyett)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Felirat mentési formátuma (a non-SRT csak akkor működik ha az előző opció be van kapcsolva)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Felirat mappa (az \"aktuális mappa\" az az aktuális médiafájl mappája)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Egyéni felirat mappa (felülbírálja a \"Felirat mappa\" -át, valós útvonalnak megfelelően)", + "Fall back to metadata storage if filesystem storage failed": "A fájlok tárolásának meghiúsulása esetén térjen vissza a metaadat-tároláshoz", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Felirat fájl engedélyeinek beállítása erre (egész szám, például: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Elhagyott/használatlan (egyénileg mentett) feliratok automatikus törlése", + "On media playback: search for missing subtitles (refresh item)": "Lejátszás esetén: keressen hiányzó feliratot ( elem frissítése )", + "Scheduler: Periodically search for recent items with missing subtitles": "Ütemező: Rendszeresen keressen feliratot a felirattal nem rendelkező friss elemekhez", + "Scheduler: Item age to be considered recent": "Ütemező: Elem frissnek tekinthető ha a kora", + "Scheduler: Recent items to consider per library": "Ütemező: Könyvtáranként ennyi elemet vegyen figyelembe mint friss", + "Scheduler: Periodically search for better subtitles": "Ütemező: Rendszeresen keressen jobb feliratot", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Ütemező: Ennyi napig keressen jobb feliratot (max 30 nap)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Ütemező: Ne keressen jobb feliratot ha az elem vetítési dátuma régebbi mint", + "Scheduler: Overwrite manually selected subtitles when better found": "Ütemező: Manuálisan kiválasztott felirat felülírása ha van jobb találat", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Ütemező: Írja felül a feliratot ha van jobb", + "History: amount of items to store historical data for": "Előzmények: ennyi elemnek tárolja az előzményeit", + "How many download tries per subtitle (on timeout or error)": "Hány letöltési próbálkozás történjen feliratonként (időtúllépés vagy hiba esetén)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Mappák figyelmen kívül hagyása (amik tartalmazzák a \"subzero.ignore/.subzero.ignore/.nosz\" kifejezést)", + "Ignore anything in the following paths (comma-separated)": "Minden kihagyása a következő helyeken (vesszővel elválasztva)", + "Sub-Zero mode": "Sub-Zero mód", + "Access PIN (any amount of numbers, 0-9)": "PIN Hozzáférés (tetszőleges hosszuságú szám, 0-9)", + "Access PIN valid for minutes": "PIN hozzáférés ennyi percig valid: ", + "Use PIN to restrict access to (needs plugin or PMS restart)": "PIN használta hogy hozzáférj (Bővítmény vagy PMS újraindítás szükséges)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Ennek a programnak az indítása sikeres felirat letöltés esetén (Részletek a Wiki-n)", + "Check for correct folder permissions of every library on plugin start": "Megfelelő mappa engedélyek ellenőrzése minden bővítmény indításnál", + "Use new style caching (for subliminal)": "Új stílusú gyorsitótár használata (subliminalhoz) ", + "Low impact mode (for remote filesystems)": "Alacsony hatású mód (távoli fájlrendszerek esetén)", + "Timeout for API requests sent to the PMS": "A PMS-hez küldött API-kérelmek időtúllépése", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy használata a szolgáltatók eléréséhez (supports credentials)", + "How verbose should the logging be?": "Milyen mértékű legyen a naplózás?", + "How many log backups to keep?": "Hány napló-mentés maradjon?", + "Log subtitle modification (debug)": "Felirat módosítások naplózása (Debug esetén)", + "Log to console (for development/debugging)": "Naplózás konzolra (fejlesztéshez/hiba kereséshez)", + "Collect anonymous usage statistics": "Anonim használati statisztikák gyűjtése", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (API infó kitöltése lent)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot", + "Symlink to original file": "Symlink az eredeti fájlra", + "I keep the original filenames": "Megtartottam az eredeti fájl neveket", + "none of the above": "Egyiksem", + "exact: media filename match": "pontos: média fájl neve egyezik", + "loose: filename contains media filename": "gyenge: fájlnév tartalmazza a média fájl nevét.", + "any": "bármelyik", + "prefer": "javasolt", + "don't prefer": "nem javasolt", + "force HI": "HI erőltetésé", + "force non-HI": "non-Hi eröltetése", + "don't change": "nincs módositás", + "white": "fehér", + "light-grey": "világos-szürke", + "red": "piros", + "green": "zöld", + "yellow": "sárga", + "blue": "kék", + "magenta": "magenta", + "cyan": "cián", + "black": "fekete", + "dark-red": "sötét-piros", + "dark-green": "sötét-zöld", + "dark-yellow": "sötét-sárga", + "dark-blue": "sötét-két", + "dark-magenta": "sötét-magenta", + "dark-cyan": "sötét-cián", + "dark-grey": "sötét-szürke", + "current folder": "jelenlegi mappa", + "never": "soha", + "current media item": "jelenlegi média elem", + "next episode (series)": "következő rész (sorozat)", + "hybrid: current item or next episode": "hybrid: jelenlegi elem vagy következő rész", + "hybrid-plus: current item and next episode": "hybrid-plus: jelenlegi elem és következő rész", + "every 6 hours": "6 óránként", + "every 12 hours": "12 óránként", + "every 24 hours": "24 óránként", + "1 days": "1 nap", + "2 days": "2 nap", + "3 days": "3 nap", + "4 days": "4 nap", + "1 weeks": "1 hét", + "2 weeks": "2 hét", + "3 weeks": "3 hét", + "4 weeks": "4 hét", + "5 weeks": "5 hét", + "6 weeks": "6 hét", + "12 weeks": "12 hét", + "don't limit": "Nem korlátozott", + "1 year": "1 év", + "2 years": "2 év", + "3 years": "3 év", + "4 years": "4 év", + "5 years": "5 év", + "6 years": "6 év", + "7 years": "7 év", + "8 years": "8 év", + "9 years": "9 év", + "10 years": "10 év", + "only agent": "csak ügynök", + "disabled": "inaktiv", + "advanced menu": "fejlett menü", + "CRITICAL": "CRITICAL", + "ERROR": "ERROR", + "WARNING": "WARNING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Erőltetett felirat keresés: %(item_title)s", + "File %(file_part_index)s: ": "Fájl %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sNincs jelenlegi felirat", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sJelenlegi felirat: %(provider_name)s (hozzáadva: %(date_added)s, %(mode)s), Nyelv: %(language)s, Pontszám: %(score)i, Tárolás: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sKezelje a(z) %(language)s feliratot", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)sListázza a(z) %(language)s feliratokat", + "%(part_summary)sEmbedded subtitles (%(languages)s)": "%(part_summary)sBeágyazott feliratok (%(languages)s)", + "Select active %(language)s subtitle": "Aktív %(language)s felirat kiválasztása", + "%(count)d subtitles in storage": "%(count)d felirat tárolva", + "List available %(language)s subtitles": "%(language)s feliratok listázása", + "Modify current %(language)s subtitle": "%(language)s felirat módosítása", + "Currently applied mods: %(mod_list)s": "Már alkalmazott módosítások: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Tegye feketelistára a mostani %(language)s feliratot és keressen újat", + "Manage blacklist (%(amount)s contained)": "Feketelista kezelése ((%(amount)s tartalmaz))", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Pontszám: %(score)s", + "Current: ": "Jelenlegi: ", + "Stored: ": "Tárolt: ", + "by %(release_group)s": "%(release_group)s alapján", + "Current: %(provider_name)s (%(score)s) ": "Jelenlegi: %(provider_name)s (%(score)s)␣", + "Search for %(language)s subs (%(video_data)s)": "Keressen %(language)s feliratot (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sFájlnév: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Keresés folyamatban a %(language)s felirathoz (%(video_data)s), \nSearching for %(language)s subs (%(video_data)s), frissíts itt ...", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (rossz FPS, felirat: %(subtitle_fps)s, média: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (rossz FPS, felirat: %(subtitle_fps)s, média: ismeretlen, low impact mód)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, Pont: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Release: %(release_info)s, Találatok: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Felirat letöltése ehhez: %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Tömöritsd ki a stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s alap beállításokkal", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Tömörítsd ki a sream %(stream_index)s -t, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (hozzáadva: %(date_added)s, %(mode)s), Nyelv: %(language)s, Pontszám: %(score)i, Tárolás: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Nem megfelelő jogosultság ehhez %(title)s, mappa: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Folyamatban: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Mutasd a mellőzendők listáját (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s %(until_date)s ig (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Felirat kitömörítése %(stream_index)s a %(filename)s -ból", + "Extract missing %(language)s embedded subtitles": "Hiányzó %(language)s beágyazott felirat kitömörítése", + "Extract and activate %(language)s embedded subtitles": "Beágyazott %(language)s felirat kitömörítése és aktiválása", + "None": "Egyik sem", + "Idle": "Tétlen", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Igazítás %(time_and_unit)s -val ", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "Hozzáadva: %(date_added)s, %(mode)s, Nyelv: %(language)s, Pontszám: %(score)i, Tárolás: %(storage_type)s", + "Remove: %(mod_name)s": "Eltávolít: %(mod_name)s", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Felirat letöltés nem sikerült (%(item_id)s)", + "agent + interface": "Ügynök + interfész", + "only interface": "Csak interfész", + "interface": "Interfész", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Mutassa a most játszott elemeket, és adjon lehetősége egyesével történő metaadat/felirat frissítéshez", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Hiányzó felirattal rendelkező elemek listázása. Kattints a \"Mostanában hozzáadott hiányzó felirattal rendelkező elemek keresése\"-re hogy frissítsd a listát", + "Add %(kind)s %(title)s to the ignore list": "%(kind)s %(title)s hozzáadása a listára", + "Remove %(kind)s %(title)s from the ignore list": "%(kind)s %(title)s eltávolítása a listáról ", + "%(title)s added to the ignore list": "%(title)s hozzáadva a listára", + "%(title)s removed from the ignore list": "%(title)s kivéve a listáról", + "Triggering refresh for %(title)s": "Frissítés indítása a(z) %(title)s -hez", + "Triggering forced refresh for %(title)s": "Erőltetett frissítés indítása a(z) %(title)s -hez", + "Refresh of item %(item_id)s triggered": "Frissítés a %(item_id)s elemhez elindítva", + "Forced refresh of item %(item_id)s triggered": "Erőltetett frissítés a %(item_id)s elemhez elindítva", + "Ignore %(kind)s \"%(title)s\"": "Hagyd figyelmen kívül: %(kind)s \"%(title)s\"", + "Un-ignore %(kind)s \"%(title)s\"": "Ne hagyd figyelmen kívül: Un-ignore %(kind)s \"%(title)s\"", + "Refreshing %(title)s": "Frissítés: %(title)s", + "Force-refreshing %(title)s": "Erőltetett frissítés: %(title)s", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "A még nem kitömörített beágyazott feliratok kitömörítése a kiválasztott évad összes részéből az összes beállított alapmódosítással", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "A beágyazott feliratok kitömörítése a kiválasztott évad összes részéből az összes beállított alapmódosítással", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Frissítse %(the_movie_series_season_episode)s, új feliratot keres vagy hozzáad a meghajtón lévőkből.", + "the movie": "a film", + "the series": "a sorozat", + "the episode": "az epizód", + "the season": "az évadot", + "Change the color of the subtitle": "Felirat színének megváltoztatása", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Kért szín hozzáadása a felirat minden sorához. Támogatása a lejátszótól függ.", + "Basic common fixes": "Általános alap javítások", + "Fix common and whitespace/punctuation issues in subtitles": "Általános szóköz/írásjel hibák javítása a feliratokban", + "Remove all style tags": "Minden stílus tag eltávolítása", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Eltávolítja az összes lehetséges stílust a feliratból, például betűtípus, félkövér, szín stb.", + "Reverse punctuation in RTL languages": "Fordított írásjelek RTL nyelveken", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Néhány lejátszóeszköz nem megfelelően kezeli a jobbról balra történő írásnál az írásjeleket. Fizikálisan felcseréli az írásjeleket. A következő nyelvekhez alkalmazható: héber", + "Change the FPS of the subtitle": "Feliratok FPS-ének megváltoztatása", + "Re-syncs the subtitle to the framerate of the current media file.": "Felirat képkocka-sebességének szinkronizálása az aktuális médiához", + "Remove Hearing Impaired tags": "Hallássérülteknek szánt információ eltávolitása ", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Hallás sérültek számára hozzáadott szövegek, karakterek, tagek eltávolítása a feliratokból.", + "Fix common OCR issues": "Általános OCR hibák javitása", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Felirat képből szöveggé történő átalakítása(OCR) során keletkezett hibák javítása", + "Change the timing of the subtitle": "Felirat időzítésének módosítása", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Hozzáad vagy elvesz a feliratból egy bizonyos időtartamot hogy illeszkedjen a médiához.", + "Available": "Elérhető", + "Current": "Jelenlegi", + "Custom path to advanced_settings.json": "Egyéni útvonal az advanced_settings.json fájlhoz", + "zh-hant": "Kínai (Tradicionális)", + "zh-hans": "Kínai (Egyszerűsített)", + "Reset the plugin's menu history storage": "", + "forced": "", + "%s in %s (%s, score: %s), %s": "", + "Extract embedded subtitle streams": "", + "Display %(incl_excl_list_name)s (%(count)d)": "", + "include list": "", + "ignore list": "", + "Include list": "", + "Ignore list": "", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "", + "Didn't change the %(incl_excl_list_name)s": "", + "%(title)s added to the include list": "", + "%(title)s removed from the include list": "", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "", + "Download subtitles": "", + "Never": "", + "Always": "", + "When main audio stream is not Subtitle Language (1)": "", + "When main audio stream is not any configured language": "", + "When any audio stream is not Subtitle Language (1)": "", + "When any audio stream is not any configured language": "", + "Download foreign/forced subtitles": "", + "Only for Subtitle Language (1)": "", + "Only for Subtitle Language (2)": "", + "Only for Subtitle Language (3)": "", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "", + "Reverse punctuation in RTL languages (heb, ara, fas)": "", + "Fix only uppercase downloaded subtitles": "", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "", + "enable SZ for all items by default, use ignore mode": "", + "disable SZ for all items by default, use include mode": "", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "", + "auto": "", + "manual": "", + "auto-better": "", + "Unknown": "", + "embedded": "" +} \ No newline at end of file diff --git a/Contents/Strings/nl.json b/Contents/Strings/nl.json new file mode 100644 index 000000000..12da134bc --- /dev/null +++ b/Contents/Strings/nl.json @@ -0,0 +1,441 @@ +{ + "sq": "Albanees", + "ar": "Arabisch", + "be": "Wit-Russisch", + "bs": "Bosnisch", + "bg": "Bulgaars", + "ca": "Catalaans\n", + "zh": "Chinees", + "hr": "Kroatisch", + "cs": "Czech", + "da": "Deens", + "nl": "Nederlands", + "en": "Engels", + "et": "Estlands", + "fa": "Perzisch (Farsi)", + "fi": "Fins", + "fr": "Frans", + "de": "Duits", + "el": "Grieks", + "he": "Hebreeuws", + "hi": "Hindi", + "hu": "Hongaars", + "is": "IJslands", + "id": "Indonesisch", + "it": "Italiaans", + "ja": "Japanees", + "ko": "Koreaans", + "lv": "Lets", + "lt": "Litouws", + "mk": "Macedonisch", + "ms": "Maleis", + "no": "Noors", + "pl": "Pools", + "pt": "Portugees", + "pt-br": "Portugees (Braziliaans)", + "ro": "Roemeens", + "ru": "Russisch", + "sr": "Servisch", + "sr-cyrl": "Servisch (Cyrillisch)", + "sr-latn": "Servisch (Latijns)", + "sk": "Slowaaks", + "sl": "Sloveens", + "es": "Spaans", + "sv": "Zweeds", + "th": "Thais", + "tr": "Turks", + "uk": "Oekraïens", + "vi": "Vietnamees", + "Internal stuff, pay attention!": "Interne dingen, Opletten!", + "Advanced": "Geavanceerd", + "advanced": "geavanceerd", + "Enter PIN": "PIN invoeren", + "The owner has restricted the access to this menu. Please enter the correct pin": "De eigenaar heeft de toegang beperkt tot dit menu. Vul a.u.b. de correcte PIN in.", + "Restart the plugin": "Herstart de plugin", + "Get my logs (copy the appearing link and open it in your browser, please)": "Haal mijn logs op (kopieer de link en open deze in je browser, a.u.b.)", + "Copy the appearing link and open it in your browser, please": "Kopieer a.u.b. de link en open deze in je browser.", + "Trigger find better subtitles": "Activeer zoek betere ondertiteling", + "Skip next find better subtitles (sets last run to now)": "Sla volgende zoek beter ondertiteling over (stelt de laatste uitvoering op nu)", + "Trigger subtitle storage maintenance": "Activeer ondertiteling opslag onderhoud", + "Trigger subtitle storage migration (expensive)": "Activeer ondertiteling opslag migratie (zwaar)", + "Trigger cache maintenance (refiners, providers and packs/archives)": "Activeer Cache onderhoud (filters, providers en packs/archieven)", + "Apply configured default subtitle mods to all (active) stored subtitles": "Pas geconfigureerde standaard ondertiteling modificaties toe op alle (actieve) opgeslagen ondertiteling", + "Re-Apply mods of all stored subtitles": "Pas modificaties op alle opgeslagen ondertiteling opnieuw toe", + "Log the plugin's scheduled tasks state storage": "Log de plugin's geplande takenstaat opslag", + "Log the plugin's internal ignorelist storage": "Log de plugin's interne negeerlijst opslag", + "Log the plugin's complete state storage": "Log de plugin's compleetstaat opslag", + "Reset the plugin's scheduled tasks state storage": "Reset de plugin's geplande takenstaat opslag", + "Reset the plugin's internal ignorelist storage": "Reset de plugin's interne negeerlijst opslag", + "Invalidate Sub-Zero metadata caches (subliminal)": "Invalideer Sub-Zero metadata caches (subliminal)", + "Reset provider throttle states": "Reset pauze status van providers", + "Restarting the plugin": "Plugin herstarten", + "Restart triggered, please wait about 5 seconds": "Herstart geactiveerd, wacht a.u.b. ongeveer 5 seconden", + "Reset subtitle storage": "Reset ondertiteling opslag", + "Are you sure?": "Weet je het zeker?", + "Are you really sure?": "Weet je het heel zeker?", + "Success": "Succes", + "FindBetterSubtitles triggered": "ZoekBetereOndertiteling geactiveerd", + "FindBetterSubtitles skipped": "ZoekBetereOndertiteling overgeslagen", + "SubtitleStorageMaintenance triggered": "OndertitelingOpslagOnderhoud geactiveerd", + "MigrateSubtitleStorage triggered": "MigreerOndertitelingOpslag geactiveerd", + "TriggerCacheMaintenance triggered": "CacheOnderhoud geactiveerd", + "This may take some time ...": "Dit kan even duren...", + "Download Logs": "Download Logs", + "Sorry, feature unavailable": "Sorry, eigenschap is niet beschikbaar", + "Universal Plex token not available": "Universele Plex token niet beschikbaar", + "Copy this link and open this in your browser, please": "Kopieer a.u.b. deze link en open deze in je browser.", + "Cache invalidated": "Cache is geinvalideerd", + "Enter PIN number ": "Voer PIN nummer in ", + "PIN correct": "PIN is correct", + "Reset": "Reset", + "Menu locked": "Menu geblokeerd", + "Provider throttles reset": "Provider pauzes reset", + "Information Storage (%s) reset": "Informatie opslag (%s) gereset", + "Information Storage (%s) logged": "Informatie opslag (%s) geregistreerd", + "Plex didn't return any information about the item, please refresh it and come back later": "Plex heeft geen informatie over het item gegeven, ververs a.u.b. het item en kom later terug", + "Item not found: %s!": "Item niet gevonden: %s!", + "< Back to %s": "< Terug naar %s", + "Back to %s > %s": "Terug naar %s > %s", + "Refresh: %s": "Ververs: %s", + "Issues a forced refresh, ignoring known subtitles and searching for new ones": "Voert een geforceerde vernieuwing uit, negeert bekende ondertiteling en zoekt naar nieuwe", + "Extract and activate embedded subtitle streams": "Geëmbedde ondertiteling streams exporteren en activeren", + "Inspect currently blacklisted subtitles": "Inspecteer de ondertiteling op de zwarte lijst", + "Subtitle saved to disk": "Ondertitel opgeslagen op schijf", + "Remove subtitle from blacklist": "Verwijder ondertitel van zwarte lijst", + "No subtitles found": "Geen ondertiteling gevonden", + " (unknown)": " (onbekend)", + " (forced)": " (geforceerd)", + "Extracting of embedded subtitle %s of part %s:%s triggered": "Exporteren van geëmbedde ondertitel %s van deel %s:%s geactiveerd", + "Insufficient permissions": "Niet genoeg rechten", + "I'm not enabled!": "Ik ben niet ingeschakeld!", + "Please enable me for some of your libraries in your server settings; currently I do nothing": "Schakel me alstublieft in voor enkele van uw bibliotheken in uw serverinstellingen; momenteel doe ik niets", + "Working ... refresh here": "Bezig... ververs hier", + "Current state: %s; Last state: %s": "Huidige staat: %s, Laatste staat: %s", + "On-deck items": "On-deck items", + "Shows the %s recently played items and allows you to individually (force-) refresh their metadata/subtitles.": "Toont de %s recentelijk afgespeelde items en stelt je instaat om hiervan de metadata/ondertiteling individueel (geforceerd) te verversen", + "Recently-added items": "Recentelijk toegevoegde items", + "Recently played items": "Recentelijk afgespeelde items", + "Shows the recently added items per section.": "Toont de recentelijk toegevoegde items per sectie", + "Show recently added items with missing subtitles": "Laat de recentelijk toegevoegde items met missende ondertiteling zien", + "Browse all items": "Blader door alle items", + "Go through your whole library and manage your ignore list. You can also (force-) refresh the metadata/subtitles of individual items.": "Ga door je hele bibliotheek heen en beheer je negeerlijst. Je kan ook de metadata/ondertiteling van individuele items (geforceerd) verversen.", + "Last run: %s; Next scheduled run: %s; Last runtime: %s": "Laatste uitvoering: %s; Volgend geplande uitvoering: %s; Laatste uitvoeringstijd: %s", + "Search for missing subtitles (in recently-added items, max-age: %s)": "Zoek naar missende ondertiteling (in recentelijk toegevoegde items, maximale leeftijd: %s)", + "Automatically run periodically by the scheduler, if configured. %s": "Voer automatisch periodiek uit door de taakplanner, indien ingesteld. %s", + "Show the current ignore list (mainly used for the automatic tasks)": "Laat de huidige negeerlijst zien (hoofdzakelijk gebruikt voor automatische taken)", + "History": "Geschiedenis", + "Show the last %i downloaded subtitles": "Laat de laatste %i gedownloade ondertiteling zien", + "Refresh": "Ververs", + "Re-lock menu(s)": "Her-blokkeer menu('s)", + "Enabled the PIN again for menu(s)": "PIN opnieuw ingeschakeld voor menu('s)", + "Throttled providers: %s": "Gepauzeerde providers: %s", + "Advanced functions": "Geavanceerde functies", + "Use at your own risk": "Gebruik op eigen risico", + "Items On Deck": "Items On-deck", + "Recently Played": "Recentelijk afgespeeld", + "Items with missing subtitles": "Items met missende ondertiteling", + "Find recent items with missing subtitles": "Zoek recente items met missende ondertiteling", + "Updating, refresh here ...": "Updaten, ververs hier...", + "Missing: %s": "Missend: %s", + "Didn't change the ignore list": "De negeerlijst is niet gewijzigd", + "Sections": "Secties", + "All": "Alles", + "show": "serie", + "movie": "film", + "<< Back to home": "<< Terug naar start", + "Auto-Find subtitles: %s": "Auto-Vind ondertiteling: %s", + "Extracting of embedded subtitles for %s triggered": "Exporteren van geëmbedde ondertiteling voor %s is geactiveerd", + "< Back to subtitle options for: %s": "< Teug naar ondertitel opties voor: %s", + "Remove last applied mod (%s)": "Verwijder laatst toegepaste modificatie (%s)", + "none": "geen", + "Manage applied mods": "Beheer toegepaste modificaties", + "Reapply applied mods": "Opnieuw toepassen van toegepaste modificaties", + "Restore original version": "Herstel originele versie", + "< Back to subtitle modification menu": "< Terug naar ondertitel modificatie menu", + "subs constantly getting faster": "ondertiteling wordt constant sneller", + "subs constantly getting slower": "ondertiteling wordt constant langzamer", + "< Back to subtitle modifications": "< Terug naar ondertitel modificaties", + "< Back to unit selection": "< Terug naar eenheid selectie", + "Subtitle Language (1)": "Ondertitel taal (1)", + "Subtitle Language (2)": "Ondertitel taal (2)", + "Subtitle Language (3)": "Ondertitel taal (3)", + "Additional Subtitle Languages (use ISO-639-1 codes; comma-separated)": "Additionele ondertitel talen (gebruik ISO-639-1 codes; komma-gescheiden)", + "Only download foreign/forced subtitles": "Download enkel ondertiteling voor buitenlands gesproken delen (forced)", + "Display languages with country attribute as ISO 639-1 (e.g. pt-BR = pt)": "Geef talen weer met landattribuut als ISO 639-1 (bijvoorbeeld pt-BR = pt)", + "Treat languages with country attribute as ISO 639-1 (e.g. don't download pt-BR if pt subtitle exists)": "Behandel talen met landattribuut als ISO 639-1 (bijvoorbeeld download geen pt-BR als pt ondertitel bestaat)", + "Restrict to one language (skips adding \".lang.\" to the subtitle filename; only uses \"Subtitle Language (1)\")": "Beperken tot één taal (slaat het toevoegen van \".lang.\" aan de ondertitel bestandsnaam over, gebruikt alleen \"Ondertitel taal (1)\")", + "Embedded subtitles: Treat \"Undefined\" (und) as language 1": "Geëmbedde ondertiteling: Behandel \"Ongedefineerd\" (und) als \"Ondertitel taal (1)\"", + "I rename my files using": "Ik hernoem mijn bestanden met", + "Retrieve original filename from .file_info/file_info index files (see wiki)": "Oorspronkelijke bestandsnaam ophalen uit .file_info / file_info indexbestanden (zie wiki)", + "Sonarr URL (add URL base if configured)": "Sonarr URL (voeg URL-basis toe indien geconfigureerd)", + "Sonarr API key": "Sonarr API sleutel", + "Radarr URL (add URL base if configured, min. version: 0.2.0.897)": "Radarr URL (voeg URL-basis toe indien geconfigureerd, minimaal benodigde versie:0.2.0.897)", + "Radarr API key": "Radarr API sleutel", + "Provider: Enable OpenSubtitles": "Provider: Opensubtitles inschakelen", + "Opensubtitles Username": "Opensubtitles gebruikersnaam", + "Opensubtitles Password": "Opensubtitles wachtwoord", + "OpenSubtitles VIP? (ad-free subs, 1000 subs/day, no-cache VIP server: http://v.ht/osvip)": "OpenSubtitles VIP? (reclame vrije ondertiteling, 1000 ondertitels/dag, geen-cache, VIP server: http://v.ht/osvip) ", + "Provider: Enable Podnapisi.NET": "Provider: Podnapisi.NET inschakelen", + "Provider: Enable Titlovi.com": "Provider:Titlovi.com inschakelen", + "Provider: Enable Addic7ed": "Provider: Addic7ed inschakelen", + "Addic7ed Username": "Addic7ed gebruikersnaam", + "Addic7ed Password": "Addic7ed wachtwoord", + "Addic7ed: boost score (if requirements met)": "Addic7ed: verhoog score (indien aan eisen wordt voldaan)", + "Addic7ed: Use random user agents": "Addic7ed: gebruik willekeurige user-agents", + "Provider: Enable Legendas TV (mostly pt-BR; UNRAR NEEDED)": "Provider: Legendas TV inschakelen (meestal pt-BR; UNRAR NODIG)", + "Legendas TV Username": "Legendas TV gebruikersnaam", + "Legendas TV Password": "Legendas TV wachtwoord", + "Provider: Enable TVsubtitles.net": "Provider: Tvsubtitles.net inschakelen", + "Provider: Enable NapiProjekt.pl (Polish)": "Provider: NapiProjekt.pl inschakelen (Pools)", + "Provider: Enable SubScene (TV shows)": "Provider: SubScene inschakelen (TV series)", + "Provider: Enable hosszupuskasub.com (Hungarian)": "Provider: hosszupuskasub.com inschakelen (Hongaars)", + "Provider: Enable aRGENTeaM (Spanish)": "Provider: aRGENTeaM inschakelen (Spaans)", + "Search enabled providers simultaneously (multithreading)": "Zoek gelijkertijd bij ingeschakelde providers (multithreading)", + "Automatically extract and use embedded subtitles upon media addition (with configured default mods)": "Exporteer en gebruik geëmbedde ondertiteling automatisch bij media toevoeging (met geconfigureerde standaard modificaties)", + "After automatic extraction of embedded subtitles, also immediately search for available subtitles?": "Na het automatisch exporteren van geëmbedde ondertiteling, ook gelijk zoeken naar beschikbare ondertiteling?", + "Don't search for subtitles of a language if there are embedded subtitles inside the media file (MKV/MP4)?": "Niet zoeken naar ondertiteling van een taal als er al geëmbedde ondertiteling bestaat in het media bestand (MKV/MP4)?", + "Don't search for subtitles of a language if they already exist on the filesystem (metadata/filesystem)?": "Niet zoeken naar ondertiteling van een taal als er ondertiteling bestaat op het bestandssysteem (metadata/bestandssysteem)?", + "How strict should these subtitles existing on the filesystem be detected?": "Hoe strikt moet deze ondertiteling op het bestandssysteem worden gedetecteerd?", + "Include non-text subtitle formats (anything else than .srt/.ssa/.ass/.vtt; embedded or external) in the above?": "Gebruik niet-tekst ondertiteling formaten (iets anders dan .srt / .ssa / .ass / .vtt; geëmbed of extern) in het bovenstaande?", + "Minimum score for TV (min: 240, def/sane: 337, min-ideal: 352; see http://v.ht/szscores)": "Minimale score voor TV (minimaal: 240, verstandig: 337, minimaal ideaal: 352; zie http://v.ht/szscores)", + "Minimum score for movies (min: 60, def/sane: 69, min-ideal: 82; see http://v.ht/szscores)": "Minimale score voor films (minimaal: 60, verstandig: 69, minimaal ideaal: 82; zie http://v.ht/szscores)", + "Download hearing impaired subtitles.": "Download ondertiteling voor slechthorende", + "Remove Hearing Impaired tags from downloaded subtitles": "Verwijder slecthorende-tags uit ondertiteling", + "Remove style tags from downloaded subtitles (bold, italic, underline, colors, ...)": "Verwijder stijl-tags uit de ondertiteling (dik gedrukt, schuin, onderlijnt, kleuren, ...)", + "Fix common issues in subtitles": "Repareer veel voorkomende fouten in ondertiteling", + "Fix common OCR errors in downloaded subtitles": "Repareer veel voorkomende OCR fouten in gedownloade ondertiteling", + "Reverse punctuation in RTL languages (heb)": "Draai leestekens in RTL (rechts naar links) talen om (Hebreeuws)", + "Change colors of subtitles to": "Wijzig kleur van ondertiteling naar", + "Store subtitles next to media files (instead of metadata)": "Sla ondertiteling naast de media bestanden op (in plaats van in de metadata)", + "Subtitle formats to save (non-SRT only works if the previous option is enabled)": "Ondertiteling formaten om op te slaan (niet-SRT werkt alleen als de vorige optie is ingeschakeld)", + "Subtitle Folder (\"current folder\" is the folder the current media file lives in)": "Ondertiteling map (\"huidige map\" is de map waar de huidige media is opgelsagen)", + "Custom Subtitle folder (overrides \"Subtitle Folder\"; computes to real paths)": "Aangepaste ondertiteling map (overschrijft de \"Ondertiteling map\"; gebruikt echte paden)", + "Fall back to metadata storage if filesystem storage failed": "Val terug naar metadata opslag indien het bestandssysteem faalt", + "Set subtitle file permissions to (integer, e.g.: 0775)": "Stel rechten voor ondertitel bestanden in (geheel getal, bijv .: 0775)", + "Automatically delete leftover/unused (externally saved) subtitles": "Verwijder automatisch achtergebleven/ongebruikte (extern opgeslagen) ondertiteling", + "On media playback: search for missing subtitles (refresh item)": "Bij media afspelen: zoek naar missende ondertiteling (ververs item)", + "Scheduler: Periodically search for recent items with missing subtitles": "Taakplanner: Zoek periodiek naar recente items met missende ondertiteling", + "Scheduler: Item age to be considered recent": "Taakplanner: Item leeftijd die als recent moet worden beschouwd", + "Scheduler: Recent items to consider per library": "Taakplanner: Recente items om te overwegen per bibliotheek", + "Scheduler: Periodically search for better subtitles": "Taakplanner: Zoek periodiek naar betere ondertiteling", + "Scheduler: Days to search for better subtitles (max: 30 days)": "Taakplanner: Dagen om te zoeken naar betere ondertiteling (maximaal 30 dagen)", + "Scheduler: Don't search for better subtitles if the item's air date is older than": "Taakplanner: Niet zoeken naar betere ondertiteling als de uitzenddatum ouder is dan", + "Scheduler: Overwrite manually selected subtitles when better found": "Taakplanner: Overschrijf handmatig geselecteerde ondertiteling als betere ondertiteling is gevonden", + "Scheduler: Overwrite subtitles with non-default subtitle modifications when better found": "Taakplanner: Overschrijf ondertiteling met niet-standaard ondertitel modificaties als betere ondertiteling is gevonden", + "History: amount of items to store historical data for": "Geschiedenis: aantal items om historische gegevens voor op te slaan", + "How many download tries per subtitle (on timeout or error)": "Hoeveel download pogingen per ondertitel (bij time-out of fout)", + "Ignore folders (with \"subzero.ignore/.subzero.ignore/.nosz\" files in them)": "Negeer mappen (met \"subzero.ignore/.subzero.ignore/.nosz\" bestanden in de mappen)", + "Ignore anything in the following paths (comma-separated)": "Negeer alles in de volgende paden (komma-gescheiden)", + "Sub-Zero mode": "Sub-Zero modus", + "Access PIN (any amount of numbers, 0-9)": "ToegangsPIN (elk aantal cijfers, 0-9)", + "Access PIN valid for minutes": "ToegangsPIN geldig voor minuten", + "Use PIN to restrict access to (needs plugin or PMS restart)": "Gebruik PIN om toegang te beperken tot (hiervoor moet de plugin of PMS worden herstart)", + "Call this executable upon successful subtitle download (see Wiki for details)": "Voer dit uitvoerbare bestand uit na succesvolle ondertitel download (zie Wiki voor details)", + "Check for correct folder permissions of every library on plugin start": "Controleer op juiste map rechten van elke bibliotheek bij het starten van de plugin", + "Use new style caching (for subliminal)": "Gebruik nieuwe manier van caching (voor subliminal)", + "Low impact mode (for remote filesystems)": "Lage impact modus (voor externe bestandssystemen)", + "Timeout for API requests sent to the PMS": "Time-out voor API-aanvragen die naar PMS worden verzonden", + "HTTP proxy to use for providers (supports credentials)": "HTTP proxy om te gebruiken voor providers (ondersteunt inloggegevens)", + "How verbose should the logging be?": "Hoe uitgebreid moet de logging zijn?", + "How many log backups to keep?": "Hoeveel log bestanden moeten worden bewaard?", + "Log subtitle modification (debug)": "Log ondertitel modificatie (debug)", + "Log to console (for development/debugging)": "Log naar console (voor ontwikkeling/debugging)", + "Collect anonymous usage statistics": "Verzamel anonieme gebruiksstatistieken", + "Sonarr/Radarr (fill api info below)": "Sonarr/Radarr (vul API informatie hieronder in)", + "Filebot": "Filebot", + "Sonarr/Radarr/Filebot": "Sonarr/Radarr/Filebot ", + "Symlink to original file": "Symlink naar origineel bestand", + "I keep the original filenames": "Ik bewaar de originele bestandsnamen", + "none of the above": "geen van de bovenstaande", + "exact: media filename match": "Precies: media bestandsnaam overeenkomst", + "loose: filename contains media filename": "Los: Bestandsnaam bevat media bestandsnaam", + "any": "elk", + "prefer": "prefereren", + "don't prefer": "niet refereren", + "force HI": "forceer slechthorend", + "force non-HI": "forceer niet slechthorend", + "don't change": "niet wijzigen", + "white": "wit", + "light-grey": "licht grijs", + "red": "rood", + "green": "groen", + "yellow": "geel", + "blue": "blauw", + "magenta": "magenta", + "cyan": "cyaan", + "black": "zwart", + "dark-red": "donker rood", + "dark-green": "donker groen", + "dark-yellow": "donker geel", + "dark-blue": "donker blauw", + "dark-magenta": "donker magenta", + "dark-cyan": "donker cyaan", + "dark-grey": "donker grijs", + "current folder": "huidige map", + "never": "nooit", + "current media item": "huidig media item", + "next episode (series)": "volgende aflevering (series)", + "hybrid: current item or next episode": "Hybride: huidig item of volgende aflevering", + "hybrid-plus: current item and next episode": "Hybride-plus: huidig item en volgende aflevering", + "every 6 hours": "elke 6 uur", + "every 12 hours": "elke 12 uur", + "every 24 hours": "elk 24 uur", + "1 days": "1 dag", + "2 days": "2 dagen", + "3 days": "3 dagen", + "4 days": "4 dagen", + "1 weeks": "1 week", + "2 weeks": "2 weken", + "3 weeks": "3 weken", + "4 weeks": "4 weken", + "5 weeks": "5 weken", + "6 weeks": "6 weken", + "12 weeks": "12 weken", + "don't limit": "niet limiteren", + "1 year": "1 jaar", + "2 years": "2 jaar", + "3 years": "3 jaar", + "4 years": "4 jaar", + "5 years": "5 jaar", + "6 years": "6 jaar", + "7 years": "7 jaar", + "8 years": "8 jaar", + "9 years": "9 jaar", + "10 years": "10 jaar", + "only agent": "enkel agent", + "disabled": "uitgeschakeld", + "advanced menu": "geavanceerd menu", + "CRITICAL": "KRITISCH", + "ERROR": "ERROR", + "WARNING": "WAARSCHUWING", + "INFO": "INFO", + "DEBUG": "DEBUG", + "Force-find subtitles: %(item_title)s": "Geforceerd ondertiteling zoeken: %(item_title)s", + "File %(file_part_index)s: ": "Bestand %(file_part_index)s: ", + "%(part_summary)sNo current subtitle in storage": "%(part_summary)sGeen huidige ondertitel gevonden in opslag", + "%(part_summary)sCurrent subtitle: %(provider_name)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(part_summary)sHuidige ondertitel: %(provider_name)s (toegevoegd: %(date_added)s, %(mode)s), Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", + "%(part_summary)sManage %(language)s subtitle": "%(part_summary)sBeheer %(language)se ondertitel", + "%(part_summary)sList %(language)s subtitles": "%(part_summary)s %(language)se ondertiteling weergeven", + "%(part_summary)sEmbedded subtitles (%(languages)s)": " %(part_summary)sGeëmbedde ondertiteling (%(languages)s) ", + "Select active %(language)s subtitle": "Selecteer actieve %(language)se ondertitel", + "%(count)d subtitles in storage": "%(count)d ondertitels gevonden in opslag", + "List available %(language)s subtitles": "Beschikbare %(language)se ondertiteling weergeven", + "Modify current %(language)s subtitle": "Wijzig huidige %(language)se ondertitel", + "Currently applied mods: %(mod_list)s": "Huidig toegepaste modificaties: %(mod_list)s", + "Blacklist current %(language)s subtitle and search for a new one": "Zet de huidige %(language)se ondertitel op de zwarte lijst en zoek naar nieuwe", + "Manage blacklist (%(amount)s contained)": "Beheer de zwarte lijst (bevat er %(amount)s)", + "%(current_state)s%(subtitle_name)s, Score: %(score)s": "%(current_state)s%(subtitle_name)s, Score: %(score)s", + "Current: ": "Huidig: ", + "Stored: ": "Opgeslagen: ", + "by %(release_group)s": " door %(release_group)s ", + "Current: %(provider_name)s (%(score)s) ": "Huidig: %(provider_name)s (%(score)s) ", + "Search for %(language)s subs (%(video_data)s)": "Zoek naar %(language)se ondertiteling (%(video_data)s)", + "%(current_info)sFilename: %(filename)s": "%(current_info)sBestandsnaam: %(filename)s", + "Searching for %(language)s subs (%(video_data)s), refresh here ...": "Zoeken naar %(language)se ondertiteling (%(video_data)s), ververs hier", + " (wrong FPS, sub: %(subtitle_fps)s, media: %(media_fps)s)": " (verkeerde FPS, ondertitel: %(subtitle_fps)s, media: %(media_fps)s)", + " (wrong FPS, sub: %(subtitle_fps)s, media: unknown, low impact mode)": " (verkeerde FPS, ondertitel: %(subtitle_fps)s, media: onbekend, lage impact modus)", + "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s": "%(blacklisted_state)s%(current_state)s: %(provider_name)s, score: %(score)s%(wrong_fps_state)s", + "Release: %(release_info)s, Matches: %(matches)s": "Uitgave: %(release_info)s, Overeenkomst: %(matches)s", + "Downloading subtitle for %(title_or_id)s": "Ondertitel downloaden voor %(title_or_id)s", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s with default mods": "Exporteer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s met standaard modificaties", + "Extract stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s": "Exporteer stream %(stream_index)s, %(language)s%(unknown_state)s%(forced_state)s%(stream_title)s", + "%(provider_name)s, %(subtitle_id)s (added: %(date_added)s, %(mode)s), Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "%(provider_name)s, %(subtitle_id)s (Toegevoegd: %(date_added)s, %(mode)s), Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", + "Insufficient permissions on library %(title)s, folder: %(path)s": "Niet genoeg rechten op bibliotheek %(title)s, map: %(path)s", + "Running: %(items_done)s/%(items_searching)s (%(percentage)s%%)": "Uitvoeren: %(items_done)s/%(items_searching)s (%(percentage)s%%)", + "Display ignore list (%(ignored_count)d)": "Negeerlijst weergeven (%(ignored_count)d)", + "%(throttled_provider)s until %(until_date)s (%(reason)s)": "%(throttled_provider)s tot %(until_date)s (%(reason)s)", + "Extracting subtitle %(stream_index)s of %(filename)s": "Exporteren van ondertitel %(stream_index)s van %(filename)s", + "Extract missing %(language)s embedded subtitles": "Exporteer missende %(language)s geëmbedde ondertiteling", + "Extract and activate %(language)s embedded subtitles": "Exporteer en activeer %(language)s geëmbedde ondertiteling", + "None": "Geen", + "Idle": "Idle", + "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)": "%(from_fps)s fps -> %(to_fps)s fps (%(slower_or_faster_indicator)s)", + "Adjust by %(time_and_unit)s": "Aanpassen met %(time_and_unit)s", + "added: %(date_added)s, %(mode)s, Language: %(language)s, Score: %(score)i, Storage: %(storage_type)s": "Toegevoegd: %(date_added)s, %(mode)s, Taal: %(language)s, Score: %(score)i, Opslag: %(storage_type)s", + "Remove: %(mod_name)s": "Verwijder: %(mod_name)s ", + "%(class_name)s: Subtitle download failed (%(item_id)s)": "%(class_name)s: Downloaden van ondertitel mislukt (%(item_id)s)", + "agent + interface": "agent + interface", + "only interface": "enkel de interface", + "interface": "interface", + "Shows the current on deck items and allows you to individually (force-) refresh their metadata/subtitles.": "Toont de huidige on-deck items en stelt je instaat om hiervan de metadata/ondertiteling individueel (geforceerd) te verversen", + "Lists items with missing subtitles. Click on \"Find recent items with missing subs\" to update list": "Items met missende ondertiteling weergeven. Klik op \"Zoek recente items met missende ondertiteling\" om de lijst te updaten", + "Add %(kind)s %(title)s to the ignore list": "Voeg %(kind)s %(title)s toe aan negeerlijst", + "Remove %(kind)s %(title)s from the ignore list": "Verwijder %(kind)s %(title)s van negeerlijst", + "%(title)s added to the ignore list": "%(title)s toegevoegd aan negeerlijst", + "%(title)s removed from the ignore list": "%(title)s verwijderd van negeerlijst", + "Triggering refresh for %(title)s": "Activeer een verversing voor %(title)s", + "Triggering forced refresh for %(title)s": "Activeer een geforceerde verversing voor %(title)s", + "Refresh of item %(item_id)s triggered": "Verversing van item %(item_id)s geactiveerd", + "Forced refresh of item %(item_id)s triggered": "Geforceerde verversing van item %(item_id)s geactiveerd", + "Ignore %(kind)s \"%(title)s\"": "Negeer %(kind)s \"%(title)s\" ", + "Un-ignore %(kind)s \"%(title)s\"": "%(kind)s \"%(title)s\" niet meer negeren", + "Refreshing %(title)s": "%(title)s aan het verversen", + "Force-refreshing %(title)s": "%(title)s aan het geforceerd verversen", + "Extracts the not yet extracted embedded subtitles of all episodes for the current season with all configured default modifications": "Exporteert de nog niet geëxporteerde geëmbedde ondertiteling van alle afleveringen voor het huidige seizoen met alle geconfigureerde standaard modificaties", + "Extracts embedded subtitles of all episodes for the current season with all configured default modifications": "Exporteert geëmbedde ondertiteling van alle afleveringen voor het huidig seizoen met alle geconfigureerde standaard modificaties", + "Refreshes %(the_movie_series_season_episode)s, possibly searching for missing and picking up new subtitles on disk": "Ververst %(the_movie_series_season_episode)s, mogelijk zoeken naar missende ondertiteling en nieuwe ondertiteling op schijf", + "the movie": "de film", + "the series": "de serie", + "the episode": "de aflevering", + "the season": "het zeizoen", + "Change the color of the subtitle": "Wijzig de kleur van de ondertiteling", + "Adds the requested color to every line of the subtitle. Support depends on player.": "Voegt de ingestelde kleur toe aan elke regel van de ondertiteling. Ondersteuning is afhankelijk van de speler.", + "Basic common fixes": "Basis veel voorkomende reparaties", + "Fix common and whitespace/punctuation issues in subtitles": "Repareer veel voorkomende en wit ruimte/leestekens fouten in ondertiteling", + "Remove all style tags": "Verwijder alle stijl-tags", + "Removes all possible style tags from the subtitle, such as font, bold, color etc.": "Verwijder alle mogelijke stijl-tags uit de ondertiteling, zoals lettertype, dik gedrukt, kleur enz.", + "Reverse punctuation in RTL languages": "Draai leestekens in RTL (rechts naar links) talen om", + "Some playback devices don't properly handle right-to-left markers for punctuation. Physically swap punctuation. Applicable to languages: hebrew": "Sommige afspeelapparaten kunnen de leestekens van rechts naar links niet goed verwerken. Wissel interpunctie fysiek. Van toepassing op talen: hebreeuws", + "Change the FPS of the subtitle": "Wijzig de FPS van de ondertitel", + "Re-syncs the subtitle to the framerate of the current media file.": "Synchroniseert de ondertitel naar de framerate van het huidige mediabestand opnieuw.", + "Remove Hearing Impaired tags": "Verwijder slecthorende-tags", + "Removes tags, text and characters from subtitles that are meant for hearing impaired people": "Verwijderd tags. tekst en karakters uit ondertiteling die zijn bedoeld voor slechthorende mensen", + "Fix common OCR issues": "Repareer veel voorkomende OCR fouten", + "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR": "Repareer fouten die optreden als een ondertitel is geconverteerd van bitmap naar tekst met OCR", + "Change the timing of the subtitle": "Wijzig de timing van de ondertitel", + "Adds or substracts a certain amount of time from the whole subtitle to match your media": "Voegt een bepaalde hoeveelheid tijd toe of trekt een bepaalde tijd af van de hele ondertitel zodat deze overeenkomt met uw media", + "Available": "Beschikbaar", + "Current": "Huidig", + "Custom path to advanced_settings.json": "Aangepast pad naar advanced_settings.json", + "zh-hant": "Chinees (Traditioneel)", + "zh-hans": "Chinees (Versimpeld)", + "Reset the plugin's menu history storage": "Reset geschiedenis opslag", + "forced": "geforceerd", + "%s in %s (%s, score: %s), %s": "%s in %s (%s, score: %s), %s", + "Extract embedded subtitle streams": "Geëmbedde ondertiteling streams exporteren", + "Display %(incl_excl_list_name)s (%(count)d)": "%(incl_excl_list_name)s weergeven (%(count)d)", + "include list": "gebruiklijst", + "ignore list": "negeerlijst", + "Include list": "Gerbuiklijst", + "Ignore list": "Negeerlijst", + "Show the current %(incl_excl_list_name)s (mainly used for the automatic tasks)": "Laat de huidige %(incl_excl_list_name)s zien (hoofdzakelijk gebruikt voor automatische taken)", + "Didn't change the %(incl_excl_list_name)s": "%(incl_excl_list_name)s is niet veranderd", + "%(title)s added to the include list": "%(title)s toegevoegd aan de gebruiklijst", + "%(title)s removed from the include list": "%(title)s verwijderd van de gebruiklijst", + "Enable Sub-Zero for %(kind)s \"%(title)s\"": "Sub-Zero inschakelen voor %(kind)s \"%(title)s\"", + "Disable Sub-Zero for %(kind)s \"%(title)s\"": "Sub-Zero uitschakelen voor %(kind)s \"%(title)s\"", + "Download subtitles": "Download ondertiteling", + "Never": "Nooit", + "Always": "Altijd", + "When main audio stream is not Subtitle Language (1)": "Wanneer de hoofd audio stream niet Ondertitel taal (1) is", + "When main audio stream is not any configured language": "Wanneer de hoofd audio stream niet een geconfigureerde taal is", + "When any audio stream is not Subtitle Language (1)": "Wanneer een audio stream niet Ondertitel taal (1) is", + "When any audio stream is not any configured language": "Wanneer een audio stream niet een geconfigureerde taal is", + "Download foreign/forced subtitles": "Download vreemde/geforceerde ondertiteling", + "Only for Subtitle Language (1)": "Alleen voor Ondertitel taal (1)", + "Only for Subtitle Language (2)": "Alleen voor Ondertitel taal (2)", + "Only for Subtitle Language (3)": "Alleen voor Ondertitel taal (3)", + "Embedded streams: Treat \"Undefined\" (und) as language 1": "Geëmbedde streams: Behandel \"Undefined\" (und) als Ondertitel taal (1)", + "Reverse punctuation in RTL languages (heb, ara, fas)": "Draai leestekens in RTL (rechts naar links) talen om (Hebreeuws, Arabisch, Perzisch)", + "Fix only uppercase downloaded subtitles": "Repareer enkel gedownloade ondertiteling met hoofdletters", + "Should SZ be enabled or disabled by default? (impacts the settings below and the plugin menu)": "Moet SZ standaard ingeschakeld of uitgeschakeld zijn? (beïnvloedt de instellingen hieronder en het plug-in menu)", + "enable SZ for all items by default, use ignore mode": "SZ standaard inschakelen voor alle items, gebruik negeerlijst", + "disable SZ for all items by default, use include mode": "SZ standaard uitschakelen voor alle items, gebruik gebruiklijst", + "Use \"subzero.ignore/.subzero.ignore/.nosz\" (ignore mode) or \"subzero.include/.subzero.include/.sz\" (include mode) files inside folders": "Gebruik \"subzero.ignore/.subzero.ignore/.nosz\" (negeer modus) of \"subzero.include/.subzero.include/.sz\" (gebruik modus) bestanden in mappen", + "Enable/disable Sub-Zero in the following paths (comma-separated; the setting above impacts this)": "Sub-Zero inschakelen/uitschakelen voor de volgende paden (kommagescheiden; de instelling hierboven beïnvloedt dit)", + "auto": "automatisch", + "manual": "handmatig", + "auto-better": "automatisch-verbeter", + "Unknown": "Onbekend", + "embedded": "geëmbedde" +} \ No newline at end of file diff --git a/Contents/advanced_settings.json.template b/Contents/advanced_settings.json.template index 7a7ce4bad..8f5c6d4ce 100644 --- a/Contents/advanced_settings.json.template +++ b/Contents/advanced_settings.json.template @@ -22,7 +22,19 @@ Don't expect support if you mess this up. // when the find better subtitles task finds a subtitle for an item that has an active extracted embedded subtitle // set, what should be the minimum score that subtitle has to have in order to be considered better? "find_better_as_extracted_tv_score": 352, - "find_better_as_extracted_movie_score": 82, + "find_better_as_extracted_movie_score": 112, + + // SZ can use mediainfo if present to detect titles/forced state of MP4 MOV_TEXT, because the PMS currently doesn't + // set the title attribute + "dont_use_mediainfo_mp4": false, + + // specific mediainfo binary path + "mediainfo_bin": null, + + "debug_i18n": false, + + // refresh item after plugin refresh has been called (default: 5) + "refresh_after_called": 5, // per-provider-config "providers": { @@ -42,6 +54,9 @@ Don't expect support if you mess this up. "enabled_for": ["series", "movies"], "use_https": true, "timeout": 15, + // skip subtitles with a mismatched FPS value; might lead to more results when disabled + // but also to more false-positives + "skip_wrong_fps": true, }, "podnapisi": { "enabled_for": ["series", "movies"], @@ -73,9 +88,12 @@ Don't expect support if you mess this up. "sonarr": { // don't verify HTTPS certificates? Set to True for self-signed certificates "ssl_no_verify": false, + // custom path to certificate pem file + "pem_file": null, }, "radarr": { "ssl_no_verify": false, + "pem_file": null, }, } } \ No newline at end of file diff --git a/Licenses/cloudscaper/LICENSE.txt b/Licenses/cloudscaper/LICENSE.txt new file mode 100644 index 000000000..548bfc029 --- /dev/null +++ b/Licenses/cloudscaper/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 VeNoMouS + +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. diff --git a/Licenses/dns/LICENSE b/Licenses/dns/LICENSE new file mode 100644 index 000000000..2896ca974 --- /dev/null +++ b/Licenses/dns/LICENSE @@ -0,0 +1,16 @@ +ISC License + +Copyright (C) 2001-2003 Nominum, Inc. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose with or without fee is hereby granted, +provided that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Licenses/idna/LICENSE.rst b/Licenses/idna/LICENSE.rst new file mode 100644 index 000000000..3ee64fba2 --- /dev/null +++ b/Licenses/idna/LICENSE.rst @@ -0,0 +1,80 @@ +License +------- + +Copyright (c) 2013-2018, Kim Davies. 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 copyright holder nor the names of the + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +#. THIS SOFTWARE IS PROVIDED BY THE 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 HOLDERS 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. + +Portions of the codec implementation and unit tests are derived from the +Python standard library, which carries the `Python Software Foundation +License <https://docs.python.org/2/license.html>`_: + + Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved + +Portions of the unit tests are derived from the Unicode standard, which +is subject to the Unicode, Inc. License Agreement: + + Copyright (c) 1991-2014 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in + <http://www.unicode.org/copyright.html>. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that + + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, + + (b) this copyright and permission notice appear in associated + documentation, and + + (c) there is clear notice in each modified Data File or in the Software + as well as in the documentation associated with the Data File(s) or + Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. diff --git a/Licenses/inflect/LICENSE b/Licenses/inflect/LICENSE new file mode 100644 index 000000000..5e795a61f --- /dev/null +++ b/Licenses/inflect/LICENSE @@ -0,0 +1,7 @@ +Copyright Jason R. Coombs + +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. diff --git a/Licenses/requests/LICENSE b/Licenses/requests/LICENSE index db78ea69f..841c6023b 100644 --- a/Licenses/requests/LICENSE +++ b/Licenses/requests/LICENSE @@ -1,10 +1,10 @@ -Copyright 2017 Kenneth Reitz +Copyright 2018 Kenneth Reitz Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/Licenses/urllib3/LICENSE.txt b/Licenses/urllib3/LICENSE.txt new file mode 100644 index 000000000..1c3283ee5 --- /dev/null +++ b/Licenses/urllib3/LICENSE.txt @@ -0,0 +1,19 @@ +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright 2008-2016 Andrey Petrov and contributors (see CONTRIBUTORS.txt) + +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. diff --git a/README.md b/README.md index c2f21de26..6d395286e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,41 @@ # Sub-Zero for Plex -[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest)<!--[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle/all.svg?maxAge=2592000&label=testing+2.0+RC9)](https://github.com/pannal/Sub-Zero.bundle/releases)--> [![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() -[![Maintenance](https://img.shields.io/maintenance/yes/2018.svg)]() +[![](https://img.shields.io/github/release/pannal/Sub-Zero.bundle.svg?style=flat&label=stable)](https://github.com/pannal/Sub-Zero.bundle/releases/latest) +[![master](https://img.shields.io/badge/master-stable-green.svg?maxAge=2592000)]() +[![Maintenance](https://img.shields.io/maintenance/yes/2024.svg)]() [![Slack Status](https://szslack.fragstore.net/badge.svg)](https://szslack.fragstore.net) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_shield) <img src="https://raw.githubusercontent.com/pannal/Sub-Zero.bundle/master/Contents/Resources/subzero.gif" align="left" height="100"> <font size="5"><b>Subtitles done right!</b></font><br /> Check out **[the Sub-Zero Wiki](https://github.com/pannal/Sub-Zero.bundle/wiki)** by [@ukdtom](https://github.com/ukdtom) and [@mmgoodnow](https://github.com/mmgoodnow) <br /> <br style="clear:left;"/> -If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="http://www.wenspencer.com/wp-content/uploads/2017/02/patreon-button.png" height="42" /></a> <br>or use the OpenSubtitles Sub-Zero affiliate link to become VIP <br>**10€/year, ad-free subs, 1000 subs/day, no-cache *VIP* server**<br><a href="http://v.ht/osvip" target="_blank"><img src="https://static.opensubtitles.org/gfx/logo.gif" height="50" /></a> +<br /> + +# DEPRECATED, USE [BAZARR](https://www.bazarr.media/) + +## Legacy maintenance mode +This addon will not be developed any further. It still works and arguably is still the best for managing subtitles when using Plex. As long as Plex Inc. supports agents, Sub-Zero will be maintained to work with the latest PMS version. + +--- + +**[Kitana is now required to have a UI](https://github.com/pannal/Kitana)** + +--- + +**[The future of Sub-Zero](https://www.reddit.com/r/PleX/comments/9n9qjl/subzero_the_future/)** + +--- + +## Helping development + +If you like this, buy me a beer: <br>[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9VKR2B8PMNKG) <br>or become a Patreon starting at **1 $ / month** <br><a href="https://www.patreon.com/subzero_plex" target="_blank"><img src="https://images.squarespace-cdn.com/content/v1/56c7831bf8baf3ae17ce9259/1561826418792-IJOMFASTOR6CW80N5W0Z/ke17ZwdGBToddI8pDm48kEycOuEejcFJqqLot0yQ4VVZw-zPPgdn4jUwVcJE1ZvWEtT5uBSRWt4vQZAgTJucoTqqXjS3CfNDSuuf31e0tVFrfGYmOrPFZFUXr1UxW4wA0PgPOjs31URy2JeWL9DdYhur-lC0WofN0YB1wFg-ZW0/footer-patreon.png?format=500w" height="54" /></a> + +If you register with an anti-captcha service and you decide to use [Anti-Captcha.com](http://getcaptchasolution.com/kkvviom7nh), you can use [this affiliate link](http://getcaptchasolution.com/kkvviom7nh) to help development. ## Introduction #### What's Sub-Zero? -Sub-Zero is a metadata agent and channel at the same time, for the popular Plex Media Server environment. +Sub-Zero is a metadata agent and interface-plugin at the same time, for the popular Plex Media Server environment. #### Why not use the builtin OpenSubtitles agent? Because it doesn't deliver. Especially for very new media items it may pick up none or bad subtitles for your media. Also it doesn't know when "better" subtitles get released for your media file. @@ -42,8 +65,8 @@ Via the preferences you can configure almost every parameter Sub-Zero uses when From an infinite number of different languages to search for, to hearing impaired settings, foreign/forced-only captions, embedded subtitle handling and many more. -#### Channel menu -The automatic matching Sub-Zero does has been improved massively over the last years and reaches an extremely high accuracy for recently-released items, in the first 6 hours. It still might be, that you want some manual managability over your library and its subtitles. This is where the channel menu comes into play. +#### Interface +The automatic matching Sub-Zero does has been improved massively over the last years and reaches an extremely high accuracy for recently-released items, in the first 6 hours. It still might be, that you want some manual managability over your library and its subtitles. This is where the interface comes into play. It allows you to trigger background tasks, browse your library based on several different starting points, adds a recently-viewed menu for instant access to your recently played media and allows you to list and select available subtitles for any item in your library. @@ -54,11 +77,13 @@ They currently consist of six individual mods: - **FPS**: Your subtitle is getting slower over time, or faster over time? Maybe the framerate is wrong. The FPS mod can fix that. - **Hearing Impaired**: Removes HI-tags from subtitles (such as `(SIRENS WAIL)`, `DOCTOR: Rose!`) - **Color**: Adds color to your subtitles (for playback devices/software that don't ship their own color modes; only works for players that support color tags) -- **Common**: fixes common issues in subtitles, such as punctuation (`-- I don't know!` -> `... I don't know!`; `over 9 000!` -> `over 9000!`) -- **OCR**: fixes problems in subtitles introduced by OCR (custom implementation of [SubtitleEdit](https://github.com/SubtitleEdit/subtitleedit)'s dictionaries) (`hands agaInst the waII!` -> `hands against the wall!`) -- **Remove Tags**: removes any font style tags from the subtitles (bold, italic, underline, colors, ...) +- **Common**: Fixes common issues in subtitles, such as punctuation (`-- I don't know!` -> `... I don't know!`; `over 9 000!` -> `over 9000!`) +- **OCR**: Fixes problems in subtitles introduced by OCR (custom implementation of [SubtitleEdit](https://github.com/SubtitleEdit/subtitleedit)'s dictionaries) (`hands agaInst the waII!` -> `hands against the wall!`) +- **Remove Tags**: Removes any font style tags from the subtitles (bold, italic, underline, colors, ...) +- **Reverse RTL**: Reverses the punctuation in right-to-left subtitles for problematic playback devices +- **Fix Uppercase**: Tries to make subtitles that are completely uppercase readable -Hearing Impaired, Common, OCR and Color can be applied automatically on every subtitle downloaded. All mods are manually managable via the channel menu. +Hearing Impaired, Common, OCR, Fix Uppercase, Reverse RTL and Color can be applied automatically on every subtitle downloaded. All mods are manually managable via the interface. Mods are applied on-the-fly, the original content of the subtitle stays available, so mods are completely reversible. @@ -66,42 +91,51 @@ In addition to that Sub-Zero also fixes problems introduced by the subtitle crea Ever had broken music icons in a subtitle? Nordic characters like `Å` which turned into `Ã¥`? Not anymore. ## Installation -Simply go to the Plex Plugins in your Plex Media Server, search for Sub-Zero and install it. -For further help or manual installation, [please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki). +[Please go to the wiki](https://github.com/pannal/Sub-Zero.bundle/wiki/Installation). -## Big thanks to the beta testing team (in no particular order)! -the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, -eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, -Clay, mmgoodnow, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, -Jacob K, Ninjouz, chopeta, fvb, Jose +## Big thanks to the beta/i18n testing team (in no particular order)! +the.vbm, mmgoodnow, Vertig0ne, thliu78, tattoomees, ostman, count_confucius, eherberg, tywilliams_88, Swanny, Jippo, Joost1991 / joost, Marik, Jon, AmbyDK, Clay, Abenlog, michael, smikwily, shoghicp, Zuikkis, Isilorn, Jacob K, Ninjouz, chopeta, fvb, Uthman, Claus Møller, Semi Doludizgin, Rafael, sugarman402, Morpheus1333, Yamil.llanos, Notorius28 ## Changelog -2.5.4.2527 +2.6.5.3280 + +temporarily enable OpenSubtitles.com instead of OpenSubtitles.org. +You need to have an account there and an API consumer configured. Enter your API key in settings. + +This is barely tested but should work for basic usage. + +THIS PLUGIN IS DEPRECATED, PLEASE USE BAZARR! -- core: bugfixes -- core: get_item: don't fail on socket timeout; fixes #498 -- core: fix scandir encoding errors; #453 #461 #441 -- core: clamp menu history to 25 items -- add UnRAR for aarch64 (untested), arm (armv5tel, untested), linux/i386, MacOSX/i386; fixes #311 -- add 3rd party licenses -- menu: new debounce/history mechanism; fixes the back button usage -- config: add custom path option for advanced_settings.json -- providers: opensubtitles: re-add support for throttling based on HTTP response codes, which got ditched due to new connection interface -- providers: legendastv: disable if unrar wasn't found -- providers: addic7ed: reduce show cache to 1 week -- advanced settings: sonarr/radarr: make ssl verification optional -- advanced settings: opensubtitles: add configurable connection timeout -- refiners: drone: use certifi for HTTPS connections -- tasks: SearchAllRecentlyAddedMissing: fix ZeroDivisionError in edgecases; fixes #496 +Changelog +- cheaply backport opensubtitlescom from bazarr +2.6.5.3277 +- core: fix enabled library/agents detection (Plex removed certain features) + fix Plex agent integration; Plex Inc removed certain attributes; SZ is now limited to thetvdb, thetvdbdvdorder, hama, themoviedb, imdb) +2.6.5.3268 +subscene, addic7ed +- either of those providers might impose a reCAPTCHA verification. In order to use those providers, please create an account at an AntiCaptcha service ([anti-captcha.com](http://getcaptchasolution.com/kkvviom7nh) or [deathbycaptcha.com](http://deathbycaptcha.com)), add funds, then supply your credentials/apikey in the configuration + +Changelog +- clarify README +- core: fix custom folder handling; #761 +- core: providers: screwzira: move to ktuvit and wizdom +- core: add option to not download subtitles for certain audio languages existing; and/or no audio stream; fix #756 +- core: delay item refreshes after refresh call (default: 5 seconds; exposed in advanced settings) +- menu: allow extraction of embedded subtitles for whole tv shows + [older changes](CHANGELOG.md) -Subtitles provided by [OpenSubtitles.org](http://www.opensubtitles.org/), [Podnapisi.NET](https://www.podnapisi.net/), [TVSubtitles.net](http://www.tvsubtitles.net/), [Addic7ed.com](http://www.addic7ed.com/), [Legendas TV](http://legendas.tv/), [Napi Projekt](http://www.napiprojekt.pl/), [Shooter](http://shooter.cn/), [Titlovi](http://titlovi.com), [aRGENTeaM](http://argenteam.net), [SubScene](https://subscene.com/), [Hosszupuska](http://hosszupuskasub.com/) +Subtitles provided by [OpenSubtitles.org](http://www.opensubtitles.org/), [Podnapisi.NET](https://www.podnapisi.net/), [TVSubtitles.net](http://www.tvsubtitles.net/), [Addic7ed.com](http://www.addic7ed.com/), [Legendas TV](http://legendas.tv/), [Napi Projekt](http://www.napiprojekt.pl/), [Shooter](http://shooter.cn/), [Titlovi](http://titlovi.com), [aRGENTeaM](http://argenteam.net), [SubScene](https://subscene.com/), [Hosszupuska](http://hosszupuskasub.com/), [Napisy24](https://napisy24.pl/) [3rd party licenses](https://github.com/pannal/Sub-Zero.bundle/tree/master/Licenses) + + +## License +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpannal%2FSub-Zero.bundle?ref=badge_large)