[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2\njobs:\n  build:\n    docker:\n      - image: circleci/node:7.10\n\n    working_directory: ~/repo\n\n    steps:\n      - checkout\n\n      - restore_cache:\n          keys:\n          - v2-dependencies-build-{{ checksum \"omega-build/package.json\" }}\n          - v2-dependencies-build\n      - restore_cache:\n          keys:\n          - v2-dependencies-pac-{{ checksum \"omega-pac/package.json\" }}\n          - v2-dependencies-pac\n      - restore_cache:\n          keys:\n          - v2-dependencies-target-{{ checksum \"omega-target/package.json\" }}\n          - v2-dependencies-target\n      - restore_cache:\n          keys:\n          - v2-dependencies-web-{{ checksum \"omega-web/package.json\" }}\n          - v2-dependencies-web\n      - restore_cache:\n          keys:\n          - v2-dependencies-webbower-{{ checksum \"omega-web/bower.json\" }}\n          - v2-dependencies-webbower\n      - restore_cache:\n          keys:\n          - v2-dependencies-targetchromium-{{ checksum \"omega-target-chromium-extension/package.json\" }}\n          - v2-dependencies-targetchromium\n\n      - run: sudo npm install -g grunt-cli@1.2.0 bower web-ext json\n      - run: (cd omega-build && npm run deps)\n\n      - save_cache:\n          paths:\n            - omega-build/node_modules\n          key: v2-dependencies-build-{{ checksum \"omega-build/package.json\" }}\n      - save_cache:\n          paths:\n            - omega-pac/node_modules\n          key: v2-dependencies-pac-{{ checksum \"omega-pac/package.json\" }}\n      - save_cache:\n          paths:\n            - omega-web/node_modules\n          key: v2-dependencies-web-{{ checksum \"omega-web/package.json\" }}\n      - save_cache:\n          paths:\n            - omega-web/bower_components\n          key: v2-dependencies-webbower-{{ checksum \"omega-web/bower.json\" }}\n      - save_cache:\n          paths:\n            - omega-target-chromium-extension/node_modules\n          key: v2-dependencies-targetchromium-{{ checksum \"omega-target-chromium-extension/package.json\" }}\n\n      - run: (cd omega-build && sudo npm run dev)\n      - run: (cd omega-pac && npm test)\n      - run: (cd omega-target && npm test)\n      - run: (cd omega-build && grunt)\n\n      - run: \n          name: Prepare for package builds\n          command: |\n            cd omega-target-chromium-extension\n            mkdir packages\n            base_ver=$(json -f \"overlay/manifest.json\" version)\n            commit_rev=$(git rev-parse --short HEAD)\n            FULL_VER=\"${base_ver}-${CIRCLE_BUILD_NUM}.ci.${commit_rev}\"\n            echo \"export FULL_VER='$FULL_VER'\" >> $BASH_ENV\n            cd ..\n\n      - run:\n          name: Build unsigned ZIP package for Chromium\n          command: |\n            cd omega-target-chromium-extension\n            grunt release\n            dest_file=\"packages/SwitchyOmega_${FULL_VER}_Chromium_UNSIGNED.zip\"\n            mv release.zip \"$dest_file\"\n            cd ..\n\n      - run: (cd omega-target-chromium-extension && web-ext -s build lint)\n\n      - run:\n          name: Build unsigned ZIP package for Firefox\n          command: |\n            cd omega-target-chromium-extension\n            web-ext -s build build\n            dest_file=\"packages/SwitchyOmega_${FULL_VER}_Firefox_UNSIGNED.xpi\"\n            mv web-ext-artifacts/*.zip \"$dest_file\"\n            cd ..\n      - store_artifacts:\n          path: omega-target-chromium-extension/packages\n          destination: packages\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!-- BEFORE YOU START / 请先读我\n\nSwitchyOmega is an open source project for proxy configuration. We cannot help\nyou troubleshoot any proxy servers, proxy server software, or your network.\nWe do not know how to make SwitchyOmega work with Software X or Company Y's Network.\nPlease contact your network administrator or read the server manual.\n\nPlease read the FAQ first: https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ\nAnd then search the issue list: https://github.com/FelisCatus/SwitchyOmega/issues\nThen, feel free to delete this whole section and move on.\n\n----\n\nSwitchyOmega 是一个开源项目，用于代理设置。SwitchyOmega 不是翻墙软件。我们无法\n帮您分析代理服务器、代理软件、您所在地点的网络问题等。我们不知道怎样才能让\nSwitchyOmega 和某某软件（例如翻墙软件）一起工作，也不知道某公司、某地区的网络\n应该怎么设置代理。这些问题请联系您的网络管理员或者阅读代理服务器文档。\n\n（这里只进行 SwitchyOmega 项目开发、功能、故障有关的讨论，不是论坛或者问答社区。）\n\n请先阅读常见问题： https://github.com/FelisCatus/SwitchyOmega/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98\n然后再搜索下现有的 Issue 列表： https://github.com/FelisCatus/SwitchyOmega/issues\n\nCLEAR ABOVE AFTER READ / 阅读后可删除以上内容 -->\n\n### SwitchyOmega version / SwitchyOmega 版本\n\n\n### Browser version & OS version / 浏览器名称、版本及操作系统版本\n\n\n### Problem description / 问题描述\n\n(Please provide as much detail as possible. We recommend the following format.)\n(请尽可能多提供一些细节。我们推荐使用下面的格式。)\n\n#### Steps to reproduce issue / 重现错误所需步骤\n\n(What did you do? / 你做了什么？)\n\n1.\n2.\n3.\n\n#### Expected behavior / 期望发生的情况\n\n\n#### Actual (or suggested) behavior / 实际发生的情况（或建议修改后的行为）\n\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "### What does this PR do?\n- [ ] Bug fix\n- [ ] Improvement\n- [ ] New feature\n\n(Note: Translations and typo fixes should be done on https://hosted.weblate.org/projects/switchyomega/ instead of PR.)\n\nPlease explain the changes in details here...\n\n#### Compatibility\n\nIs this PR compatible with old versions? Can users simply upgrade the extension?\nPlease describe any possible breaking changes (or surprising UX differences).\n\n#### Screenshots (if applicable)\n\n---\n\nAfter creating the PR:\n\n- Please make sure the CircleCI test passes. Feel free to add more commits for\nbug or style fixes.\n- Any merge conflicts should be fixed on *your* side. Prefer rebasing to merging.\n- Allow some time for project maintainers to review and merge the change.\n- New features & behavior changes are subject to discussion. Please understand\nthat project maintainers may reject new features, or request changes.\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\nbower_components\n"
  },
  {
    "path": ".tern-project",
    "content": "{\n  \"libs\": [\n    \"chai\"\n  ],\n  \"plugins\": {\n    \"node\": {},\n    \"coffee\": {}\n  }\n}\n"
  },
  {
    "path": "AUTHORS",
    "content": "# SwitchyOmega authors:\n\nFelisCatus <catusx@gmail.com>\n\n# SwitchyOmega translators:\n\nFilip <filip@havlin.cz>\nMichal Čihař <michal@cihar.com>\nmasoud Rahmani <mrem71@gmail.com>\n\n# SwitchyOmega includes or links to (unchanged):\n# * jQuery UI (custom build)\n#     => omega-web/lib/jquery-ui-*.js\n#     => Copyright 2014 jQuery Foundation and other contributors; Licensed MIT\n# * Many npm packages and bower packages\n#     => **/node_modules, **/bower_components\n#     => Please refer to their project homepages or npm package pages for the\n#        copyright and license information of each package.\n"
  },
  {
    "path": "COPYING",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "SwitchyOmega\n============\n\nManage and switch between multiple proxies quickly & easily.\n\n[![Translation status](https://hosted.weblate.org/widgets/switchyomega/-/svg-badge.svg)](https://hosted.weblate.org/engage/switchyomega/?utm_source=widget)\n\nChromium Extension\n------------------\nThe project is available as a Chromium Extension.\n\nYou can try it on [Chrome Web Store](https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif),\nor grab a packaged extension file (CRX) for offline installation on the [Releases page](https://github.com/FelisCatus/SwitchyOmega/releases).\n\nPlease [report issues on the issue tracker.](https://github.com/FelisCatus/SwitchyOmega/issues)\n\nFirefox Addon (Experimental)\n----------------------------\n\nThere is also an experimental WebExtension port, which allows installing in\n**Firefox Nightly Version >= 56**.\n\n**Since the WebExtensions API is still under heavy development on Mozilla's side,\nwe strongly recommended using the Nightly channel (>= 56.0) and update frequently.**\n\nThe Developer Edition and Beta channels will not receive fixes as often and\ntherefore unsupported by SwitchyOmega. Some users report that it works with the\nFirefox Developer Edition (>= 55) as well, but we strongly advise against doing\nso. It won't work at all in Firefox 54 Stable.\n\nYou can try it on [Mozilla Add-ons](https://addons.mozilla.org/en-US/firefox/addon/switchyomega/),\nor grab a packaged extension file (XPI) for offline installation on the [Releases page](https://github.com/FelisCatus/SwitchyOmega/releases).\n\nPlease make sure that you are using the latest Nightly build before you\n[report issues](https://github.com/FelisCatus/SwitchyOmega/issues).\nBuild number AND build date should be mentioned somewhere in the issue.\n\nNOTE: PAC Profiles DO NOT work on Firefox due to AMO review policies. We will see what we can do.\n\nDevelopment status\n------------------\n\n## PAC generator\nThis project contains a PAC generating module called `omega-pac`, which handles\nthe profiles model and compile profiles into PAC scripts. This module is standalone\nand can be published to npm when the documentation is ready.\n\n## Options manager\nThe folder `omega-target` contains browser-independent logic for managing the\noptions and applying profiles. Every public method is well documented in the comments.\nFunctions related to browser are not included, and shall be implemented in subclasses\nof the `omega-target` classes.\n\n`omega-web` is a web-based configuration interface for various options and profiles.\nThe interface works great with `omega-target` as the back-end.\n\n`omega-web` alone is incomplete and requires a file named `omega_target_web.js`\ncontaining an angular module `omegaTarget`. The module contains browser-dependent\ncode to communicate with `omega-target` back-end, and other code retrieving\nbrowser-related state and information.\nSee the `omega-target-chromium-extension/omega_target_web.coffee` file for an\nexample of such module.\n\n## Targets\nThe `omega-target-*` folders should contain environment-dependent code such as\nbrowser API calls.\n\nEach target folder should contain an extended `OmegaTarget` object, which\ncontains subclasses of the abstract base classes like `Options`. The classes\ncontains implementation of the abstract methods, and can override other methods\nat will.\n\nA target can copy the files in `omega-web` into its build to provide a web-based\nconfiguration interface. If so, the target must provide the `omega_target_web.js`\nfile as described in the Options manager section.\n\nAdditionally, each target can contain other files and resources required for the\ntarget, such as background pages and extension manifests.\n\nFor now, only one target has been implemented: The WebExtension target.\nThis target allows the project to be used as a Chromium extension in most\nChromium-based browsers and also as a Firefox Addon as mentioned above.\n\n## Translation\n\nTranslation is hosted on Weblate. If you want to help improve the translated\ntext or start translation for your language, please follow the link of the picture\nbelow.\n\n本项目翻译由Weblate托管。如果您希望帮助改进翻译，或将本项目翻译成一种新的语言，请\n点击下方图片链接进入翻译。\n\n[![Translation status](https://hosted.weblate.org/widgets/switchyomega/-/287x66-white.png)](https://hosted.weblate.org/engage/switchyomega/?utm_source=widget)\n\n## Building the project\n\nSwitchyOmega has migrated to use npm and grunt for building. Please note that\nnpm 2.x is required for this project.\n\nTo build the project:\n\n    # Install node and npm first (make sure npm --version > 2.0), then:\n    \n    sudo npm install -g grunt-cli@1.2.0 bower\n    # In the project folder:\n    cd omega-build\n    npm run deps # This runs npm install in every module.\n    npm run dev # This runs npm link to aid local development.\n    # Note: the previous command may require sudo in some environments.\n    # The modules are now working. We can build now:\n    grunt\n    # After building, a folder will be generated:\n    cd .. # Return to project root.\n    ls omega-chromium-extension/build/\n    # The folder above can be loaded as an unpacked extension in Chromium now.\n\nTo enable `grunt watch`, run `grunt watch` once in the `omega-build` directory.\nThis will effectively run `grunt watch` in every module in this project.\n\nLicense\n-------\n![GPLv3](https://www.gnu.org/graphics/gplv3-127x51.png)\n\nSwitchyOmega is licensed under [GNU General Public License](https://www.gnu.org/licenses/gpl.html) Version 3 or later.\n\nSwitchyOmega is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nSwitchyOmega is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with SwitchyOmega.  If not, see <http://www.gnu.org/licenses/>.\n\nNotice\n------\n\nSwitchyOmega currently does not have a dedicated project homepage. `switchyomega.com` and similar webites are NOT affiliated with the SwitchyOmega project in any way, nor are they maintained by SwitchyOmega project members. Please refer to this Github repository and wiki for official information.\n\nSwitchyOmega is not cooperating with any proxy providers, VPN providers or ISPs at the moment. No advertisement is displayed in SwitchyOmega project or software. Proxy providers are welcome to recommend SwitchyOmega as part of the solution in tutorials, but it must be made clear that SwitchyOmega is an independent project, is not affiliated with the provider and therefore cannot provide any support on network connections or proxy technology.\n\n重要声明\n--------\n\nSwitchyOmega 目前没有专门的项目主页。 `switchyomega.com` 等网站与 SwitchyOmega 项目并无任何关联，也并非由 SwitchyOmega 项目成员维护。一切信息请以 Github 上的项目和 wiki 为准。\n\nSwitchyOmega 目前未与任何代理提供商、VPN提供商或 ISP 达成任何合作协议，项目或软件中不包含任何此类广告。欢迎代理提供商在教程或说明中推荐 SwitchyOmega ，但请明确说明此软件是独立项目，与代理提供商无关，且不提供任何关于网络连接或代理技术的支持。\n"
  },
  {
    "path": "omega-build/Gruntfile.coffee",
    "content": "module.exports = (grunt) ->\n  submodules = ['omega-pac', 'omega-target', 'omega-web', 'omega-target-*']\n  hubConfig =\n    all:\n      options:\n        concurrent: Infinity\n      src: \"../*/Gruntfile.*\"\n  for module in submodules\n    hubConfig[module] =\n      src: \"../#{module}/Gruntfile.*\"\n\n  hubAll = (task) -> \"hub:#{module}:#{task}\" for module in submodules\n\n  grunt.initConfig {\n    hub: hubConfig\n  }\n\n  grunt.loadNpmTasks 'grunt-hub'\n\n  grunt.registerTask 'default', hubAll('default')\n  grunt.registerTask 'test', hubAll('test')\n  grunt.registerTask 'watch', ['hub:all:watch']\n"
  },
  {
    "path": "omega-build/package.json",
    "content": "{\n  \"name\": \"omega-build\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.1\",\n    \"grunt-hub\": \"^0.7.0\"\n  },\n  \"scripts\": {\n    \"deps\": \"npm install && (cd ../omega-pac && npm install) && (cd ../omega-target && npm install) && (cd ../omega-web && npm install && bower install) && (cd ../omega-target-chromium-extension/ && npm install)\",\n    \"dev\": \"(cd ../omega-pac && npm run dev) && (cd ../omega-target && npm run dev) && (cd ../omega-web && npm run dev) && (cd ../omega-target-chromium-extension/ && npm run dev)\"\n  }\n}\n"
  },
  {
    "path": "omega-locales/ach/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2015-02-13 10:29+0000\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: ach\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 2.2-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Manage and switch between multiple proxies quickly & easily.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Loading…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Auto Switch\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direct]\"\n\nmsgid \"profile_system\"\nmsgstr \"[System Proxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host wildcard\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Matches hosts (domain names) by wildcard.<br><b>The asterisk <code>*</code></\"\n\"b> matches zero or more characters.<br><b>The question mark <code>?</code></\"\n\"b> matches exactly one character.<br><br>Note that rules beginning with \"\n\"<code>*.</code> are specially treated only in Host wildcard conditions.\"\n\"<br>Example: <code>*.example.com</code> will match www.example.com <b>AND \"\n\"example.com as well.</b><br>To match subdomains <b>only</b>, use <b>two</b> \"\n\"asterisks like <code>**.example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Like Host wildcard condition, but matches hosts (domain names) by <a \"\n\"href='https://www.google.com/search?q=regular%20expression'>regular \"\n\"expression</a>.<br>Regular expressions can be hard to construct (and read).\"\n\"<br>It is recommended to use wildcards for most cases and only use regex for \"\n\"conditions that cannot be achieved by any other condition type.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Host levels\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host level in within the given range.\"\n\"<br>Host level is defined as the <b>number of dot-separated segments</b> of \"\n\"the host (domain name).<br>Example: <code>www.example.com</code> is with a \"\n\"host level of 3, while <code>internal</code> is of host level 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://\"\n\"*.example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?\"\n\"q=regular%20expression'>regular expression</a>.<br>However, regular \"\n\"expressions can be hard to construct (and read).<br>It is recommended to use \"\n\"wildcards for most cases and only use regex for conditions that cannot be \"\n\"achieved by any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Keyword\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern \"\n\"<code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Disabled)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condition ignored when matching)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. \"\n\"A Disabled condition act as if it does not exist.<br>This feature can be \"\n\"used to disable conditions temporarily.<br>Disabled conditions still hold \"\n\"the previous information (like patterns) and can be re-enabled by setting \"\n\"the condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Current Time\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Day of the Week\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Special\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Missing '@with result' directive!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Unknown profile: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Missing result profile name at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Invalid rule at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Close\"\n\nmsgid \"dialog_save\"\nmsgstr \"Save changes\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancel\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Clear\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Restore\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Options\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Settings\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"New profile…\"\n\nmsgid \"options_apply\"\nmsgstr \"Apply changes\"\n\nmsgid \"options_discard\"\nmsgstr \"Discard changes\"\n\nmsgid \"options_reset\"\nmsgstr \"Reset options\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Misc Options\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirm on condition deletion.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Refresh current tab on profile change.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Keyboard Shortcut\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Pressing the shortcut will open the switch popup menu. (Defaults to Alt+Shift\"\n\"+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"The items in the popup menu can also be accessed using the keyboard. Press ? \"\n\"(or /) in the menu to learn more.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configure shortcut\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Switch Options\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Startup Profile\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Current profile)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Show advanced condition types\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Unlocks new types of advanced but complicated switch conditions. For most \"\n\"senarios, the basic condition types should be enough, so this option is not \"\n\"recommended.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Quick Switch\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"You need to select at least 2 profiles to enable this function! You can drag \"\n\"them from the box below.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"A yellow badge will be displayed on the icon if some resources fail to load,\"\n\"<br>and you can set the profile for such resources conveniently via the \"\n\"popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Download Interval\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hour\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hours\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hours\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hours\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Every day\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Export the current profile as a PAC file, so you can use it in other \"\n\"browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those \"\n\"projects.<br>Please consider advising your audience to upgrade to \"\n\"SwitchyOmega for the improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Settings\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Make a full backup of your options (including profiles and all other \"\n\"options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices \"\n\"(including this one) for the syncing to actually work. <br> You may check \"\n\"this section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servers for which you do not want to use any proxy: (One server on each \"\n\"line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to \"\n\"browser limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of \"\n\"$PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Skip guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Apply Options\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Your modifications to the options have not been saved and will be lost if \"\n\"you proceed!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup \"\n\"menu. However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use \"\n\"$ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try \"\n\"to create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.\"\n\"<br>Profiles are the the basic configuration units in SwitchyOmega.<br>We \"\n\"have already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega \"\n\"<b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through \"\n\"the mighty <b>Switch Profile</b>.<br>However, its features cannot be covered \"\n\"in this quick guide.<br>You can open this profile to unlock its power some \"\n\"time later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on \"\n\"<b>conditions</b>.<br> For example, the <b>Host wildcard</b> condition \"\n\"allows you to set the profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> \"\n\"Click on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching \"\n\"the condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause \"\n\"the request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be \"\n\"used. <br>Conditions are always considered <b>from top to bottom</b> in \"\n\"order.<br>You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to \"\n\"it in the popup menu.</b><br/> The icon will show you the <b>final result</\"\n\"b> profile applied for the current tab. <br/> <b>Hovering</b> on the icon \"\n\"will reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and \"\n\"browser settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"You cannot switch profiles with SwitchyOmega unless you fix the problem \"\n\"above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"A few resources failed to load due to issues with your network, proxy server \"\n\"or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspect proxy used for this Element\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/cs/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2020-08-19 11:32+0000\\n\"\n\"Last-Translator: WXC <winexec@gmail.com>\\n\"\n\"Language-Team: Czech <https://hosted.weblate.org/projects/switchyomega/main/\"\n\"cs/>\\n\"\n\"Language: cs\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.2-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy přepínač SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Správa a přepínání mezi více proxy servery .\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Načítám…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Automatický přepínač\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Přímé připojení]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Systémová Proxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host wildcard\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Zápasy hostitelé (názvy domén) od zástupný znak.<br><b>Hvězdičky \"\n\"<code>*</code></b> odpovídá žádnému nebo více znakům.<br><b>Otazník \"\n\"<code>?</code></b> odpovídá právě jeden znak.<br><br>Poznámka, že pravidla s \"\n\"<code>*.</code> jsou speciálně ošetřeny pouze v podmínkách hostitele \"\n\"zástupné. <br>Příklad: <code>*. priklad.cz</code> bude odpovídat \"\n\"www.example.com <b>a example.com stejně.</b><br>Subdomény <b>pouze</b> \"\n\"zápas, použijte <b>dvě</b> hvězdičky jako <code>**. example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Regulární výraz host\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Jako hostitele zástupné stav, ale zápasy hostí (názvy domén) <a \"\n\"href='https://www.google.com/search?q=regular%20expression'> regulární</a> \"\n\"výraz.<br>Regulární výrazy mohou být těžké sestavit (a číst).<br>Se \"\n\"doporučuje použít zástupné znaky pro většinu případů a pouze používat regex \"\n\"pro podmínky, které nelze dosáhnout jiným typ podmínky.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Host úrovně\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Odpovídá žádosti pokud úroveň hostitele v v daném rozsahu.Úroveň hostitele \"\n\"<br>je definována jako <b>počet segmentů oddělených tečkou</b> hostitele (\"\n\"název domény).<br>Příklad: <code>www.example.com</code> je na úrovni \"\n\"hostitele 3, zatímco <code>vnitřní</code> hostitele úrovně 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Odpovídá URL požadavku pomocí zástupných znaků.<br>Viz hostitele zástupné \"\n\"sekce výše pro rychlé zástupných.<br>Všimněte si, že URL zástupné znaky \"\n\"nejsou speciálně ošetřené (bez subdomény magic jako v hostitele \"\n\"zástupné).<br>Tak <code>*://*.example.com/*</code> zápasy \"\n\"http://www.example.com/ ale <b>není</b> odpovídat http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regulární výraz\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Adresa URL odpovídá mimořádně mocné <a \"\n\"href='https://www.google.com/search?q=regular%20expression'> regulární \"\n\"výraz</a>.<br>Však může být obtížné sestavit (a číst) regulární výrazy.<br>\"\n\"Se doporučuje použít zástupné znaky pro většinu případů a pouze používat \"\n\"regex pro podmínky, které nelze dosáhnout jiným typ podmínky.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Klíčové slovo\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"Klíčové slovo stav odpovídá, pokud je adresa URL protokol HTTP a vzorek je \"\n\"přesný dílčí řetězec adresy URL.<br>Se chová jako maska zástupných znaků \"\n\"adresy URL <code>http://* <b>vzor</b> *</code>, kde <b>vzorek</b> je vzorek \"\n\"klíčové slovo.<br>Klíčové podmínky jsou užitečné, pokud chcete obejít \"\n\"firewall blokuje některá klíčová slova v URL, vyžádáním takových URL \"\n\"prostřednictvím serveru proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Vypnuto)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Podmínky ignorovány při porovnání)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"Podmínku můžete zakázat nastavením jeho typ <code>(</code> zakázáno). Stav \"\n\"zakázáno chovat, jako by již neexistuje.<br>Tuto funkci lze použít k \"\n\"zakázání podmínky dočasně.<br>Zakázáno podmínky stále drží předchozí \"\n\"informace (např modely) a lze znovu povolit nastavením podmínky typ zpět do \"\n\"předchozího typu.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Aktuální čas\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Den v týdnu\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Speciální\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Přepínač\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"Automatická Proxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Schází '@s výsledkem' directive!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Neznámý profil: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Schází výsledný profil na řádce $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Nesprávná podmínka na řádku $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Chybí výchozí pravidlo s catch-all '*' podmínkou!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Zavřít\"\n\nmsgid \"dialog_save\"\nmsgstr \"Uložit změny\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Storno\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Vymazat\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Obnovit\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Nastavení\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Nastavení\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profily\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Akce\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Rozhraní\"\n\nmsgid \"options_tab_general\"\nmsgstr \"Obecné\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Nový profil…\"\n\nmsgid \"options_apply\"\nmsgstr \"Použít změny\"\n\nmsgid \"options_discard\"\nmsgstr \"Zahodit změny\"\n\nmsgid \"options_reset\"\nmsgstr \"Obnovit nastavení\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Ostatní nastavení\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Potvrdit smazání podmínky.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Obnovit aktuální záložku při změnu profilu.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Povolit kontrolu proxy pro prvky stránky přes kontextové menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Klávesové zkratky\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"Stisknutím zástupce aktivujete místní nabídku.  (Výchozí Alt+Shift+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"Položky v kontextovém menu jsou také přistupné pomocí klávesnice. Stisknutím \"\n\"? (nebo /)  v menu se dozvíte více.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Konfigurovat zástupce\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Nastavení přepínání\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Profil při spuštění\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Aktuální profil)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Zobrazit pokročilé typy podmínek\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Odemknout nové typy pokročilých, ale komplikovaných přepínačů. Pro běžnou \"\n\"práci stačí základní nastavení, proto se tato možnost nedoporučuje.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Rychlé přepínání\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Opakované profily\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"Pokud kliknete na ikonu (nebo použijte klávesovou zkratku), následující \"\n\"profily budou řazeny dle jejich pořadí.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"Pro tuto funkci musíte vybrat alespoň 2 profily! Můžete je přetáhnout z níže \"\n\"uvedeného pole.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Ne-opakované profily\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Změny proxy\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Reverzní proxy změněné jinou aplikací.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Konflikty\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Síťové požadavky\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\"Zobrazit počet neúspěšných webových žádostí o prostředky na aktuální kartě.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"Žlutý odznak se zobrazí na ikoně Pokud některé zdroje selhání načtení, <br>a \"\n\"můžete nastavit profil pro tyto zdroje přes místní nabídku.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Nastavení stahování\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Konfigurace četnosti aktualizace online pravidla seznamů a PAC skriptů.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Interval stahování\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 minut\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hodina\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hodiny\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hodin\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hodin\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Každý den\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Nikdy\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profil\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Exportovat jako PAC soubor\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Exportujte aktuální profil jako soubor PAC, takže můžete použít v jiných \"\n\"prohlížečích.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\"Chcete-li exportovat profil, pomocí panelu Akce shora zprava na stránce \"\n\"profil.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Exportovat pravidla seznamy pomocí Proxy Switchy!/SwitchyPlus/SwitchySharp \"\n\"kompatibilní formát pokud je to možné.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Tuto možnost použijte, pouze v případě, že publikujete pravidlo seznamy pro \"\n\"uživatele těchto projektů.<br>Prosím zvažte aktualizovat na  SwitchyOmega \"\n\"pro zlepšení.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Nastavení\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Provést zálohu\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Provést plnou záloho Vašeho nastavení (obsahuje profily a veškeré další \"\n\"nastavení).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Obnovit ze souboru\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Obnovit Vaše SwitchyOmega nastavení z lokálního souboru.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Obnovit z online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"URL souboru nastavení (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Obnovit\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Synchronizace (Experimentální)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Povolit synchronizaci\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Stáhnout ze synchronizace\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Zrušit synchronizaci\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Odstranit vzdálenou kopii\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"Vy můžete nyní automaticky synchronizovat Vaše nastavení, profily napříč \"\n\"všemi desktop spuštěnými Chrome prohlížeči.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Vaše nastavení jsou automaticky synchronizování s dalšími zařízeními.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Vezměte prosím na vědomí, že musíte se přihlásit k Chrome na každém zařízení \"\n\"(včetně této) pro synchronizaci skutečně pracovat. <br>Můžete zkontrolovat \"\n\"tuto sekci na jiných zařízeních, aby bylo zajištěno, že to funguje.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"Načetli jste kopii svých nastavení/možností na jiném zařízení \"\n\"prostřednictvím synchronizace.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"Pokud budete chtít můžete stáhnout vzdálenou kopii do zařízení. <br>To tak \"\n\"by však <b>přepsat stávající nastavení a profily</b> v tomto zařízení.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Možnosti synchronizace není podporována na platformě nebo prohlížeče. Pro \"\n\"tuto chvíli je podporován pouze prohlížeč Chrome na desktopu.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Synchronizace je vypnutá pro tento profil.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\"Synchronizace je zakázána pro tento profil pro použití příliš mnoho úložného \"\n\"prostoru.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profil :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Přejmenovat\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Smazat\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publikovat tento seznam podmínek\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Exportovat podmínky jako prostý text pro publikování.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Exportovat PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Nepodporovaný profil typu $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"Tato možnost může zlobit s novější verzí tohoto programu.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Editovat zdrojový kód\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Zobraz nápovědu o formátování zdrojového kódu\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servery\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Schéma\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protokol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Ověřování\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Varování: Uživatelské jméno a heslo může být nečekané serverům zaslána \"\n\"vrácenou skriptem PAC.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Ujistěte se prosím, důvěryhodných skriptů poskytované prostřednictvím adresy \"\n\"URL nad před vstupem do citlivých pověření.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Přesvědčte se, zda důvěřovat skript níže než poskytnutí citlivých pověření.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Navíc použití tohoto profilu v jiných profilech (např. profil Switch) může \"\n\"způsobit uživatelské jméno a heslo k odeslání k serverům proxy, které jsou \"\n\"nakonfigurovány v jiných profilech.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(výchozí)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"PŘÍMÉ\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(použít výchozí)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Používejte proxy výše pro všechny protokoly.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Zobraz pokročilé\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Seznam vynechaných serverů\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servery, které chcete použít při  proxy: (jeden server na každém řádku.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available...)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"PAC skript bude aktualizován z této adresy URL. Pokud je ponechán prázdný, \"\n\"následující skript bude použit přímo.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profily s souboru: adresy URL lze použít pouze přímo. Jejich nelze \"\n\"použít jako výsledek profily, protože místní soubory není přístupná z důvodu \"\n\"omezení prohlížeče.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Proto nelze použít místní soubor PAC pro tento profil. Pokud opravdu chcete, \"\n\"můžete vytvořit nový profil PAC.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Skript\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC skript stažený v $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC skript je zastaralá kvůli změně adresy URL. Stiskněte tlačítko Stáhnout \"\n\"výše k aktualizaci.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtuální profil\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Cíl\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"Při použití tohoto profilu, funguje stejně jako profilu vybraný níže.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrovat do virtuálního profilu\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Nahradit cílový profil\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"Můžete migrovat existující možnosti používat tento virtuální profil namísto \"\n\"$PROFILE$. Tak bude aktualizovat všechny existující pravidla týkající se \"\n\"$PROFILE$ a nasměrovat do tohoto virtuálního profilu tak, aby jejich \"\n\"výsledek profil je možné ovládat zde.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Konfigurace seznamu pravidel\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Formát seznamu podmínek\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Seznam pravidel výsledků profilů\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Porovnat profil\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Výchozí profil\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Adresa URL podmínek\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"Seznam pravidel bude aktualizován z této adresy URL. Pokud je ponechán \"\n\"prázdný, bude následující text analyzován.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Text seznamu pravidel\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Seznam pravidel stažen $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Seznam pravidel je zastaralá kvůli změně adresy URL. Stiskněte tlačítko \"\n\"Stáhnout výše k aktualizaci.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Přepínač pravidel\"\n\nmsgid \"options_sort\"\nmsgstr \"Řadit\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Typ podmínek\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Zobrazit nápovědu\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Podrobnosti o podmínce\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profil\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Akce\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Přidat podmínku\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Klonovat\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Pravidlo seznamu pravidel\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Každá žádost odpovídající pravidlo seznam níže)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Seznam pravidel je ZAKÁZÁN)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Výchozí\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host úrovně ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"O typech podmínek\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Importovat seznamy online pravidla\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Přidat seznam pravidel\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"Můžete použít on-line sbírku podmínek vydané ostatními a přidáním do seznamu \"\n\"pravidel.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Vítejte v SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"Úspěšně jste nainstalovali SwitchyOmega, ultimate proxy přepínač.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Prosím, řekněte SwitchyOmega o vaší proxy prostřednictvím stránky možnosti. \"\n\"Podívejme se, jak.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"Úspěšně jste inovovali na SwitchyOmega. Buďte v klidu, vaše stávající \"\n\"možnosti jsou plně zachovány.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Teď pojďme projít stručného průvodce a nové možnosti stránky.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Další\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Hotovo\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Přeskočit průvodce\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Použít možnosti\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"Vaše změny nebyly uloženy a budou ztracena, pokud budete pokračovat!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Než budete pokračovat, je třeba použít vaše změny možností.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Přejete si uložit a aplikovat nastavení?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Přejmenovat profil\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"Název nového profilu\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"Profil s tímto názvem již existuje.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profil názvy začínající dvojité podtržítko, jsou vyhrazena.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profily s názvy začínají podtržítkem skrytý v místní nabídce. Však stále \"\n\"používají se v místech, jako je přepnutí profilu výsledky.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Nahradit profil\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Nahradit profil\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Opravdu chcete nahradit $FromProfile$ s $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"Budete-li pokračovat, všechna pravidla, směřující na $FromProfile$ bude \"\n\"aktualizován tak, místo toho použít $ToProfile$. Další možnosti, například \"\n\"při spuštění profilu a rychlé přepínače budou také změněny podle potřeby. \"\n\"Však sami dva profil nebude být změněn nebo odstraněn.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Nastavení aktualizováno.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Odstranit profil\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Opravdu chcete odstranit tento profil?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Nelze odstranit profil\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"Tento profil nelze odstranit, protože se označuje následující profily:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"Je třeba upravit tyto profily a zastavit, odkazující k tomuto profilu \"\n\"předtím, než můžete odstranit.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"Název profilu nesmí být prázdný.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Vyskakovací okno\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Ověřování proxy serveru\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Uživatelské jméno\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Heslo\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"Bez ověřování\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Odstranit pravidlo\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Opravdu chcete odstranit toto pravidlo?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Odstranit\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Obnovit pravidla\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Jste si jisti, nastavte profil výsledek všech pravidel pro tento profil?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Obnovit pravidla\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Nastavit profil pro všechna pravidla\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Odstranit seznam pravidel\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Opravdu chcete odstranit seznam pravidel z aktuálního profilu?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ řádky pravidel\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Odstranit seznam pravidel\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Nový profil\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Název profilu\"\n\nmsgid \"options_profileType\"\nmsgstr \"Vyberte prosím typ profilu:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Profil serveru proxy\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunelování provozu přes proxy servery.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profil\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Volba proxy pomocí skriptu PAC online nebo místní.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"Budete potřebovat pouze to máte PAC skript nebo URL k němu. Nesnažte se \"\n\"vytvořit jeden, pokud nemáte znalosti o PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Přepnout profil\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Použití různých profilů automaticky na různých podmínkách domén nebo vzory.\\n\"\n\" Můžete také importovat pravidla zveřejněny online pro snadnější přepínání. (\"\n\"Nahrazuje automatické přepínání režimu + seznam pravidlo.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Pravidla seznamu profilu\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Opětovné použití on-line sbírku podmínek vydané ostatní.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtuální profil\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"Virtuální profil mohou působit jako kterýkoli z ostatních profilů na \"\n\"požádání. To funguje dobře s SwitchProfile, což umožňuje změnit výsledek \"\n\"více podmínek jedním kliknutím.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Vytvořit\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Obnovit nastavení\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Opravdu chcete obnovit možnosti? Všechny profily a nastavení bude ztraceno!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Opravte chyby na této stránce.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profil $PROFILE$ neexistuje! Nastavení může být špatné.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Obnovit nastavení.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Nastavení uloženo.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Nastavení importováno.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Soubor ze zálohy je neplatný!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Chyba při stahování zálohovaného souboru!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Profil byl úspěšně aktualizován.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Chyba při stahování dat profilu!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Stáhnout profil\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"<b>Proxy profil</b> obsahuje nastavení jako server ip a port serveru \"\n\"proxy.<br>Profily jsou základní konfiguraci jednotky v SwitchyOmega.<br>Jsme \"\n\"již vytvořili příklad profil pro vás. Pokuste se jej otevřít.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"Můžete vyplnit serveru proxy a portu zde jak se vám líbí.<br>, SwitchyOmega, \"\n\"<b>nepřichází s proxy servery</b>.<br>Prosím poraďte se s poskytovatelem \"\n\"sítě nebo server proxy software manuál Pokud nevíte, co by mělo být vyplněno \"\n\"zde.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"Poznáte SwitchyOmega přepínat mezi proxy automaticky prostřednictvím mohutné \"\n\"<b>Přepnutí profilu</b>.<br>Však nelze pokrýt jeho rysy v tomto rychlém \"\n\"průvodci.<br>Můžete otevřít tento profil odemknout její moci nějaký čas \"\n\"později.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Potřebujete další profily? Pro potřeby vaší proxy, můžete vždy přidat více \"\n\"<b>Proxy, Switch a další profily</b> <br>. <br>Užijte si proxy!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega profily je možné použít různé žádosti na základě \"\n\"<b>podmínek</b>.<br>Například <b>hostitele zástupné</b> stavu umožňuje \"\n\"nastavit profil pro všechny adresy URL v doméně.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"Můžete použít různé typy podmínek hostitele nebo úplnou adresu URL. <br>\"\n\"Klepněte na otazník zobrazíte typ odkazu.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega použije vybraný profil zde na <b>žádost odpovídající \"\n\"podmínky.</b> <br>Speciální <b>\\\"[]\\\" profilu</b> způsobí požadavek na \"\n\"odeslání bez jakékoli proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"Pokud žádná podmínka se vztahuje na některé žádosti, bude použit profil \\\"\"\n\"Výchozí\\\". <br>Podmínky jsou vždy považovány za <b>shora dolů</b> v \"\n\"pořadí.<br>Jejich pořadí můžete změnit přetažením ikony řazení.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"Po dokončení nastavení přepínače profilu, nezapomeňte <b>Přepněte do ní v \"\n\"kontextovém menu.</b> <br/> Ikona se zobrazí <b>konečný výsledek</b> profilu \"\n\"použité pro aktuální kartu <br/> <b>Hovering</b> na ikonu odhalí tooltip s \"\n\"detaily.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(Externí profil)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"název profilu\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"Nastavení serveru proxy jsou řízeny jinými app(s) nebo přípony. Zakázat nebo \"\n\"odinstalovat aplikace nebo rozšíření v konfliktu.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"Nastavení serveru proxy byly přepsány politikou. Obraťte se na správce \"\n\"systému.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"Nastavení serveru proxy nelze ovládat. Zkontrolujte nastavení systému a \"\n\"prohlížeče.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"Nastavení serveru proxy jsou zakázány výslovný požadavek od jiných app(s) \"\n\"nebo rozšířeními.\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\"Nastavení serveru proxy jsou nyní řízeny pomocí novější verze SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"Dokud nevyřešíte problém výše, nelze přepnout profily s SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"Současně nelze povolit dvě (nebo více) verze SwitchyOmega. Zakažte jednu z \"\n\"nich.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Správa rozšíření\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Přidat podmínku do\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Přidat podmínku\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Možnosti\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report problémů\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Uložit protokol chyb\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ chybových požadavků\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Zdroje, které se nepodařilo načíst\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"Několik zdrojů se nepodařilo načíst kvůli potížím se sítí.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"SwitchyOmega jen reportuje tyto chyby, ale není příčinou těchto chyb.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"Můžete zkontrolovat následující domény a použít proxy server pro ně v \"\n\"případě potřeby.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"Můžete přidat podmínky, přepínač se použije pouze při použití Přepnout \"\n\"profil.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Konfigurovat monitor sítě\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Použít tento profil pro všechny vybrané domény\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"Přeložil Filip Havlin\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC skript)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(kontrolované jinými rozšířeními nebo prostředím)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(nepoužívá žádné proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(přepínání na základě podmínek)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(přepínání na základě seznamu pravidel)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"Switchy Omega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"Switchy Omega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"Chyba: Novější verze SwitchOmega je potřeba pro uložené nastavení/možnosti.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\"Chyba: Uložené volby jsou poškozeny. Chcete-li obnovit možnosti klikněte zde.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Upozornění: Nepodařilo se stáhnout PAC skripty nebo seznam pravidel.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\"Poznámka: Nastavení serveru proxy jsou v současnosti řízena jinými \"\n\"aplikacemi.\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Prohlédnout] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(výchozí)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"PŘÍMÉ\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(DOČASNÉ) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Zkontrolujte proxy pro tuto stránku\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Zkontrolujte proxy pro tento Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Zkontrolujte, zda server proxy používaná tento prvek\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Zkontrolujte, zda server proxy používaná tento prvek\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Povolit rychlé přepínání\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/de/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2019-05-14 08:49+0000\\n\"\n\"Last-Translator: ssantos <ssantos@web.de>\\n\"\n\"Language-Team: German <https://hosted.weblate.org/projects/switchyomega/main/\"\n\"de/>\\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\"Einfach & schnell mehrere Proxies verwalten und zwischen ihnen wechseln.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Laden…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Automatisches Wechseln\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direkt]\"\n\nmsgid \"profile_system\"\nmsgstr \"[System Proxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host wildcard\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Übereinstimmungen mit Hosts (Domänennamen) per Wildcard.<br><b>Das Sternchen \"\n\"<code>*</code></b> entspricht null oder mehr Zeichen.<br><b>Das Fragezeichen \"\n\"<code>?</code></b> entspricht genau einem Zeichen.<br><br>Beachten Sie, dass \"\n\"Regeln, die mit <code>*.</code> beginnen, speziell nur in Hosts mit Wildcard \"\n\"behandelt werden.<br>Beispiel: <code>*.example.com</code> passt auch zu \"\n\"www.example.com <b>UND auch example.com.</b><br>Zur Übereinstimmung \"\n\"<b>nur</b> von Subdomains, verwenden Sie <b>zwei</b> Sternchen wie \"\n\"<code>**.example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Wie die Host Platzhalter Bedingung, aber gleicht hosts (domain namen) bei <a \"\n\"href='https://www.google.com/search?q=regular%20expression'>Regulärer \"\n\"Ausdruck</a>.<br>Regulärer Ausdruck können schwer zu erstellen und/oder zu \"\n\"lesen sein.<br>Es wird im Normalfall Platzhalter zu verwenden und Regulärer \"\n\"Ausdrücke nur für Bedingungen Typen die nicht mit anderen Bedingungen Typen \"\n\"möglich sind zu benutzen.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Host levels\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host level in within the given range.\"\n\"<br>Host level is defined as the <b>number of dot-separated segments</b> of \"\n\"the host (domain name).<br>Example: <code>www.example.com</code> is with a \"\n\"host level of 3, while <code>internal</code> is of host level 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://\"\n\"*.example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?\"\n\"q=regular%20expression'>regular expression</a>.<br>However, regular \"\n\"expressions can be hard to construct (and read).<br>It is recommended to use \"\n\"wildcards for most cases and only use regex for conditions that cannot be \"\n\"achieved by any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Schlüsselwort\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern \"\n\"<code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Ausgeschaltet)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Bedingung wird ignoriert wenn zutreffend)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. \"\n\"A Disabled condition act as if it does not exist.<br>This feature can be \"\n\"used to disable conditions temporarily.<br>Disabled conditions still hold \"\n\"the previous information (like patterns) and can be re-enabled by setting \"\n\"the condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Current Time\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Day of the Week\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Spezial\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Missing '@with result' directive!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Unbekanntes Profil: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Benötigt Ergebnis Profil Name in Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Invalid rule at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Close\"\n\nmsgid \"dialog_save\"\nmsgstr \"Save changes\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancel\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Clear\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Restore\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Options\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Settings\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"New profile…\"\n\nmsgid \"options_apply\"\nmsgstr \"Apply changes\"\n\nmsgid \"options_discard\"\nmsgstr \"Discard changes\"\n\nmsgid \"options_reset\"\nmsgstr \"Reset options\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Misc Options\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirm on condition deletion.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Refresh current tab on profile change.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Keyboard Shortcut\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Pressing the shortcut will open the switch popup menu. (Defaults to Alt+Shift\"\n\"+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"The items in the popup menu can also be accessed using the keyboard. Press ? \"\n\"(or /) in the menu to learn more.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configure shortcut\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Switch Options\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Startup Profile\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Current profile)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Show advanced condition types\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Erschließt neue Arten von fortgeschrittenen, aber komplizierten \"\n\"Schalterbedingungen. Für die meisten Szenarien sollten die \"\n\"Grundbedingungsarten ausreichen, so dass diese Option nicht empfohlen wird.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Quick Switch\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"You need to select at least 2 profiles to enable this function! You can drag \"\n\"them from the box below.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"A yellow badge will be displayed on the icon if some resources fail to load,\"\n\"<br>and you can set the profile for such resources conveniently via the \"\n\"popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Download Interval\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hour\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hours\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hours\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hours\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Every day\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Export the current profile as a PAC file, so you can use it in other \"\n\"browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those \"\n\"projects.<br>Please consider advising your audience to upgrade to \"\n\"SwitchyOmega for the improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Settings\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Make a full backup of your options (including profiles and all other \"\n\"options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices \"\n\"(including this one) for the syncing to actually work. <br> You may check \"\n\"this section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servers for which you do not want to use any proxy: (One server on each \"\n\"line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to \"\n\"browser limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of \"\n\"$PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Skip guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Apply Options\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Your modifications to the options have not been saved and will be lost if \"\n\"you proceed!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup \"\n\"menu. However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use \"\n\"$ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try \"\n\"to create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.\"\n\"<br>Profiles are the the basic configuration units in SwitchyOmega.<br>We \"\n\"have already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega \"\n\"<b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through \"\n\"the mighty <b>Switch Profile</b>.<br>However, its features cannot be covered \"\n\"in this quick guide.<br>You can open this profile to unlock its power some \"\n\"time later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on \"\n\"<b>conditions</b>.<br> For example, the <b>Host wildcard</b> condition \"\n\"allows you to set the profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> \"\n\"Click on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching \"\n\"the condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause \"\n\"the request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be \"\n\"used. <br>Conditions are always considered <b>from top to bottom</b> in \"\n\"order.<br>You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to \"\n\"it in the popup menu.</b><br/> The icon will show you the <b>final result</\"\n\"b> profile applied for the current tab. <br/> <b>Hovering</b> on the icon \"\n\"will reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and \"\n\"browser settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"You cannot switch profiles with SwitchyOmega unless you fix the problem \"\n\"above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"A few resources failed to load due to issues with your network, proxy server \"\n\"or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspect proxy used for this Element\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/en_US/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2018-06-13 01:52+0000\\n\"\n\"Last-Translator: Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\\n\"\n\"Language-Team: English (United States) <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/en_US/>\\n\"\n\"Language: en_US\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.0.1\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Manage and switch between multiple proxies quickly & easily.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Loading…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Auto Switch\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direct]\"\n\nmsgid \"profile_system\"\nmsgstr \"[System Proxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host wildcard\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Matches hosts (domain names) by wildcard.<br><b>The asterisk <code>*</code></\"\n\"b> matches zero or more characters.<br><b>The question mark <code>?</code></b> \"\n\"matches exactly one character.<br><br>Note that rules beginning with <code>*.</\"\n\"code> are specially treated only in Host wildcard conditions.<br>Example: <\"\n\"code>*.example.com</code> will match www.example.com <b>AND example.com as \"\n\"well.</b><br>To match subdomains <b>only</b>, use <b>two</b> asterisks like <\"\n\"code>**.example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Like Host wildcard condition, but matches hosts (domain names) by <a href='\"\n\"https://www.google.com/search?q=regular%20expression'>regular expression</a>.<\"\n\"br>Regular expressions can be hard to construct (and read).<br>It is \"\n\"recommended to use wildcards for most cases and only use regex for conditions \"\n\"that cannot be achieved by any other condition type.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Host levels\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host level in within the given range.<\"\n\"br>Host level is defined as the <b>number of dot-separated segments</b> of \"\n\"the host (domain name).<br>Example: <code>www.example.com</code> is with a \"\n\"host level of 3, while <code>internal</code> is of host level 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://*.\"\n\"example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?q=\"\n\"regular%20expression'>regular expression</a>.<br>However, regular expressions \"\n\"can be hard to construct (and read).<br>It is recommended to use wildcards \"\n\"for most cases and only use regex for conditions that cannot be achieved by \"\n\"any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Keyword\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern <\"\n\"code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Disabled)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condition ignored when matching)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. A \"\n\"Disabled condition act as if it does not exist.<br>This feature can be used \"\n\"to disable conditions temporarily.<br>Disabled conditions still hold the \"\n\"previous information (like patterns) and can be re-enabled by setting the \"\n\"condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Current Time\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Day of the Week\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Special\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Missing '@with result' directive!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Unknown profile: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Missing result profile name at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Invalid rule at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Close\"\n\nmsgid \"dialog_save\"\nmsgstr \"Save changes\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancel\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Clear\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Restore\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Options\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Settings\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"New profile…\"\n\nmsgid \"options_apply\"\nmsgstr \"Apply changes\"\n\nmsgid \"options_discard\"\nmsgstr \"Discard changes\"\n\nmsgid \"options_reset\"\nmsgstr \"Reset options\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Misc Options\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirm on condition deletion.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Refresh current tab on profile change.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Keyboard Shortcut\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Pressing the shortcut will open the switch popup menu. (Defaults to Alt+Shift+\"\n\"O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"The items in the popup menu can also be accessed using the keyboard. Press ? (\"\n\"or /) in the menu to learn more.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configure shortcut\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Switch Options\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Startup Profile\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Current profile)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Show advanced condition types\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Unlocks new types of advanced but complicated switch conditions. For most \"\n\"scenarios, the basic condition types should be enough, so this option is not \"\n\"recommended.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Quick Switch\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"You need to select at least 2 profiles to enable this function! You can drag \"\n\"them from the box below.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"A yellow badge will be displayed on the icon if some resources fail to load,<br>\"\n\"and you can set the profile for such resources conveniently via the popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Download Interval\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hour\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hours\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hours\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hours\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Every day\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"Export the current profile as a PAC file, so you can use it in other browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those projects.<\"\n\"br>Please consider advising your audience to upgrade to SwitchyOmega for the \"\n\"improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Settings\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"Make a full backup of your options (including profiles and all other options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices (\"\n\"including this one) for the syncing to actually work. <br> You may check this \"\n\"section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"Servers for which you do not want to use any proxy: (One server on each line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to browser \"\n\"limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of $\"\n\"PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Skip guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Apply Options\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Your modifications to the options have not been saved and will be lost if you \"\n\"proceed!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup menu. \"\n\"However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use $\"\n\"ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try to \"\n\"create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.<\"\n\"br>Profiles are the the basic configuration units in SwitchyOmega.<br>We have \"\n\"already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega <\"\n\"b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through the \"\n\"mighty <b>Switch Profile</b>.<br>However, its features cannot be covered in \"\n\"this quick guide.<br>You can open this profile to unlock its power some time \"\n\"later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on <b>conditions</\"\n\"b>.<br> For example, the <b>Host wildcard</b> condition allows you to set the \"\n\"profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> Click \"\n\"on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching the \"\n\"condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause the \"\n\"request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be used. <\"\n\"br>Conditions are always considered <b>from top to bottom</b> in order.<br>\"\n\"You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to it \"\n\"in the popup menu.</b><br/> The icon will show you the <b>final result</b> \"\n\"profile applied for the current tab. <br/> <b>Hovering</b> on the icon will \"\n\"reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and browser \"\n\"settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"You cannot switch profiles with SwitchyOmega unless you fix the problem above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"A few resources failed to load due to issues with your network, proxy server or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspect proxy used for this Element\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/es/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2020-08-30 19:36+0000\\n\"\n\"Last-Translator: Scoopity Whoop <Scoo0p@yandex.com>\\n\"\n\"Language-Team: Spanish <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/es/>\\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 4.2.1-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"SwitchyOmega Proxy\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\"Gestiona y utiliza diferentes servidores proxy de forma rápida y sencilla.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Cargando…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Cambio automático\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Directo]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy del sistema]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Patrón de servidor\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Detecta servidores (nombres de dominio) según patrones.<br><b>El asterisco \"\n\"<code>*</code></b> equivale a cero o más caracteres.<br><b>La interrogación \"\n\"<code>?</code></b> equivale exactamente a un carácter.<br><br>Tenga en \"\n\"cuenta que reglas que comienzan con <code>*.</code> se tratan de forma \"\n\"especial únicamente al usar patrones de sevidor.<br>Ejemplo: <code>*.example.\"\n\"com</code> detecta www.example.com <b> Y example.com también.</b><br>Para \"\n\"detectar <b>únicamente</b> subdominios, utilice <b>dos</b> asteriscos \"\n\"<code>**.example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Expresión regular de servidor\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Igual que los patrones de servidor, pero detecta servidores (nombres de \"\n\"dominio) mediante <a \"\n\"href='https://www.google.com/search?q=regular%20expression'>expresiones \"\n\"regulares</a>.<br>Las expresiones regulares pueden ser díficiles de crear (e \"\n\"interpretar).<br>Generalmente se recomienda usar patrones y utilizar \"\n\"expresiones regulares para condiciones que no se puedan detectar de ninguna \"\n\"otra forma.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Niveles de servidor\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Detecta la petición únicamente si tiene un determinado nivel de servidor.<br>\"\n\"El nivel de servidor se define como el <b>número de componentes separados \"\n\"por punto</b> en el nombre de dominio.<br>Ejemplo: \"\n\"<code>www.example.com</code> tiene 3 niveles, ,mientras que \"\n\"<code>internal</code> tiene sólo 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"Literales IP\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Detecta peticiones únicamente por direcciones IP <b>literales</b> y en una \"\n\"determinada red especificada en <a href='https://en.wikipedia.org/wiki\"\n\"/Classless_Inter-Domain_Routing#CIDR_notation'>notación CIDR</a>.<br>Por \"\n\"ejemplo, la regla <code>127.0.0.1/16</code>, detecta todas las direcciones \"\n\"IP de tipo <code>127.0.*.*</code>.<br>La IP <code>127.0.0.1</code> cumple la \"\n\"regla, mientras que <code>127.1.0.0</code> no la cumple. Nombres como \"\n\"<code>localhost</code> nunca cumplirán la regla porque <b>no</b> son \"\n\"literales IP.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"Patrones de URL\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Detecta patrones en la URL de la petición.<br>Consulte la sección de \"\n\"patrones de servidor para tener una referencia rápida sobre patrones.<br>\"\n\"Tenga presente que para los patrones URL no hay casos especiales (como el de \"\n\"subdominios en los patrones de servidor).<br>Así que \"\n\"<code>*://*.example.com/*</code> detecta http://www.example.com/ \"\n\"pero<b>no</b> detecta http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"Expresión regular URL\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Detecta URL con la potencia de las <a \"\n\"href='https://www.google.com/search?q=regular%20expression'>expresiones \"\n\"regulares</a>.<br>De todas formas,las expresiones regulares son difíciles de \"\n\"crear (e interpretar).<br>Se recomienda utilizar patrones en la mayoría de \"\n\"las situaciones y usar sólo las expresiones regulares cuando no funcionen \"\n\"otros tipos de condiciones.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Palabra clave\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"Detecta palabras clave que aparezcan como subcadenas en la URL de peticiones \"\n\"que usen el protocolo HTTP.<br>Funcionan igual que el patrón \"\n\"<code>http://*<b>texto</b>*</code>, donde <b>texto</b> es la palabra clave \"\n\".<br>Es útil para burlar cortafuegos que bloquean algunas palabras clave en \"\n\"la URL, realizando esas peticiones a través de proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Deshabilitado)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condición ignorada al procesar)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"Puede anular una condición cambiando su tipo a <code>(Deshabilitada)</code>. \"\n\"Será como si esa condición no existiera.<br>Esto permite anular condiciones \"\n\"temporalmente.<br>Las condiciones deshabilitadas conservan toda la \"\n\"información (patrones) y se pueden habilitar de nuevo cambiando su tipo al \"\n\"que tuvieran antes.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Hora actual\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Detecta si la hora actual está en el intervalo definido por <b>hora \"\n\"inicio</b> y <b>hora fin</b>, incluyendo ambas.<br>La hora local, la de \"\n\"inicio y la de fin se calculan en formato de <b>24-horas</b> (entre <b>0 y \"\n\"23</b>). <br>El cálculo se realiza en el momento en que se envía la petición.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Día de la semana\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Detecta si el <b>día de la semana actual</b> es uno de los seleccionados en \"\n\"el detalle de la condición. El día se calcula según la zona horaria \"\n\"local.<br>La petición y su URL se ignoran. El resultado se basa únicamente \"\n\"en el día de la semana en que se envía la petición.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"La detección sobre URL completas no es posible al usar direcciones \"\n\"<code>https://</code> desde la versión 52 de Chrome. <a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-\"\n\"Limitation'>Más información...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" . \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Servidor\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Especial\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"Proxy Automático\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"¡ Falta directiva '@with result' !\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Perfil desconocido: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Falta nombre del perfil en la línea $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Regla no válida en la línea $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"¡ Falta regla por defecto con condición universal '*' !\"\n\nmsgid \"dialog_close\"\nmsgstr \"Cerrar\"\n\nmsgid \"dialog_save\"\nmsgstr \"Guardar cambios\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancelar\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Borrar\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Deshacer\"\n\nmsgid \"options_title\"\nmsgstr \"Opciones SwitchyOmega\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Ajustes\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Perfiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Acciones\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interfaz\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Importar/Exportar\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Nuevo perfil…\"\n\nmsgid \"options_apply\"\nmsgstr \"Aplicar cambios\"\n\nmsgid \"options_discard\"\nmsgstr \"Descartar cambios\"\n\nmsgid \"options_reset\"\nmsgstr \"Opciones por defecto\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Opciones adicionales\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirmar al borrar condición.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Recargar pestaña actual al cambiar perfil.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\"Permitir inspeccionar el proxy utilizado por cada elemento de la página a \"\n\"través del menú contextual.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\"Agregue nuevas condiciones usando la ventana emergente al final de la lista.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Atajo de teclado\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Al utilizar el atajo se abrirá el menú emergente. (Predeterminado Alt+May+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"Los elementos del menú emergente también son accesibles usando el teclado. \"\n\"Pulse ? (o /) en el menú para más información.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configurar atajo\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Opciones del Conmutador\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Perfil inicial\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Perfil actual)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Mostrar tipos de condición avanzados\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Habilita nuevos tipos de condiciones avanzadas pero más complicadas. En la \"\n\"mayoría de las situaciones los tipos básicos son más que suficientes, por lo \"\n\"que no se recomienda habilitar los avanzados.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Conmutador Rápido\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Perfiles cíclicos\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"Cuando pulses el icono(o el atajo superior), los siguientes perfiles se \"\n\"aplicarán en el orden indicado.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"¡Necesitas seleccionar al menos 2 perfiles para habilitar esta función! \"\n\"Puedes arrastrarlos desde el cuadro inferior.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Perfiles no cíclicos\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Cambios Proxy\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Deshacer cambios de proxy realizados por otras aplicaciones.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflictos\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Algunas veces, otras aplicaciones también intentarán controlar la \"\n\"configuración del proxy, lo que generará conflictos. Tenga en cuenta que los \"\n\"bloqueadores de anuncios y otras extensiones también pueden usar \"\n\"configuraciones de proxy. Dichos conflictos no se pueden evitar debido a la \"\n\"forma en que funciona el navegador.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"Una insignia roja como esta en el icono de SwitchyOmega indica que otra \"\n\"aplicación tiene mayor prioridad, por lo que SwitchyOmega no puede controlar \"\n\"la configuración. Intente desinstalar SwitchyOmega y reinstalar, lo que \"\n\"debería aumentar la prioridad de SwitchyOmega. Si sigue viendo conflictos \"\n\"después de la reinstalación, considere eliminar la otra aplicación que causa \"\n\"el conflicto.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"Si SwitchyOmega tiene una prioridad más alta, puede devolver el control a \"\n\"otras aplicaciones o configuraciones del sistema seleccionando \"\n\"$SYSTEMPROFILE$ en el menú emergente.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\"Mostrar el elemento del menú emergente para importar configuraciones proxy \"\n\"de otras aplicaciones.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"Cuando se selecciona $SYSTEMPROFILE$, puede importar la configuración \"\n\"efectiva del proxy de otras aplicaciones seleccionando $EXTERNALPROFILE$ en \"\n\"el menú emergente. La configuración se importará como un perfil con el \"\n\"nombre que proporcione. Tenga en cuenta que el perfil importado es una \"\n\"instantánea y no reflejará ningún cambio desde la aplicación de origen a \"\n\"partir de entonces.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Peticiones de red\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Muestra el número de peticiones web con error en la pestaña actual.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"Aparecerá un marcador amarillo sobre el icono si no pudieron cargarse \"\n\"algunos recursos,<br> y podrá actualizar el perfil a utilizar para ellos \"\n\"desde el menú emergente.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Opciones de descarga\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\"Configurar la frecuencia de actualización en línea de reglas y scripts PAC.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Intervalo de descarga\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 minutos\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hora\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Horas\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Horas\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Horas\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"a diario\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Nunca\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Perfil\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Exportar como archivo PAC\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Exporta el perfil actual como un archivo PAC, para poder utilizarlo en otros \"\n\"navegadores.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\"Para exportar un perfil, utilice la barra de acción de arriba a la derecha \"\n\"en la página del perfil.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Exporta la lista de reglas utilizando, si es posible, un formato compatible \"\n\"con Proxy Switchy!/SwitchyPlus/SwitchySharp.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Habilite esta opción si publica listas de reglas para usuarios de esos \"\n\"proyectos.<br> Le agradeceríamos que recomendara a sus contactos actualizar \"\n\"a SwitchyOmega para disfrutar de las mejoras.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Ajustes\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Crear copia de seguridad\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Haga una copia de seguridad de sus opciones (incluye perfiles y el resto de \"\n\"opciones).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restaurar desde archivo\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restaura las opciones de SwitchyOmega desde un archivo local.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restaurar en línea\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"URL del archivo de opciones (p.e. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restaurar\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Sincronizando (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Habilitar sincronización\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Descargar desde la sincronización\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Deshabilitar sincronización\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Borrar copia remota\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"Puede sincronizar automáticamente sus ajustes y perfiles en todos los \"\n\"dispositivos donde utilice el navegador Chrome.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Sus opciones se sincronizan automáticamente en todos sus equipos.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Tenga en cuenta que debe iniciar sesión en Chrome en cada uno de sus \"\n\"dispositivos (incluido este) para que la sincronización funcione realmente. \"\n\"<br> Puede verificar esta sección en otros dispositivos para asegurarse de \"\n\"que esté funcionando.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"Usted ha cargado una copia de sus opciones en otro dispositivo mediante la \"\n\"sincronización.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"Puede descargar la copia remota a su dispositivo si lo desea. <br> Sin \"\n\"embargo, al hacerlo, <b> sobrescribirá sus configuraciones y perfiles \"\n\"existentes </ b> en este dispositivo.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Las opciones de sincronización no son soportadas por su plataforma o \"\n\"navegador. Por ahora, solo el navegador Chrome en el escritorio las soporta.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"La sincronización esta inhabilitada para este perfil.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\"La sincronización esta inhabilitada para este perfil por usar mucho espacio \"\n\"de almacenamiento.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Perfil :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Renombrar\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Borrar\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publicar lista de reglas\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Exportar Reglas del Conmutador para publicar en formato texto.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Exportar PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"¡Tipo de perfil no soportado $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\"Las opciones pueden haber fallado, o de una versión mas reciente de este \"\n\"programa.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Editar código fuente\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Mostrar ayuda sobre el formato del código fuente\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Servidores proxy\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Esquema\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocolo\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Servidor\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Puerto\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Autenticación\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\"¡Tu navegador NO soporta la autenticación proxy $PROTOCOLDISP$! Por favor no \"\n\"reportes esta incidencia a SwitchyOmega. Ponte en contacto con el soporte \"\n\"para tu navegador.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Advertencia: El nombre usuario/contraseña pueden enviarse a servidores \"\n\"inesperados devueltos por el script PAC.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Asegúrese de confiar en el script proporcionado a través de la URL anterior \"\n\"antes de ingresar credenciales confidenciales.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Asegúrese de confiar en el script de a continuación antes de proporcionar \"\n\"credenciales confidenciales.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Adicionalmente, el uso de este perfil en otros perfiles (p. ej. Perfil \"\n\"Conmutador) puede hacer que el nombre de usuario/contraseña se envíe a los \"\n\"servidores proxy configurados en otros perfiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(por defecto)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECTO\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(usa por defecto)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use el proxy anterior para todos los protocolos.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Mostrar avanzado\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Lista de omisión\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servidores para los cuales no desea usar ningún proxy: (Un servidor en cada \"\n\"línea)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Comodines y más disponible ...)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"URL PAC\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"El script PAC será actualizado desde esta URL. Si se deja en blanco, el \"\n\"siguiente script se usará directamente en su lugar.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"Archivos con perfiles PAC: las URL solamente se pueden aplicar directamente. \"\n\"No se pueden usar como perfiles de resultados porque no se puede acceder a \"\n\"los archivos locales debido a una limitación del navegador.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Por lo tanto, no puedes usar un archivo PAC local para este perfil. Puedes \"\n\"crear un nuevo perfil PAC para eso si realmente quieres eso.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"Script PAC\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"Script PAC descargado el $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"Script PAC obsoleto debido a cambio de URL. Presiona el botón de descarga de \"\n\"arriba para actualizar.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Perfil Virtual\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Objetivo\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"Cuando este perfil se aplique, actuará exactamente igual que el perfil \"\n\"seleccionado abajo.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrar a Perfil Virtual\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Reemplazar perfil objetivo\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"Puedes migrar las opciones existentes para usar este perfil virtual en vez \"\n\"de $PROFILE$. Haciendo esto actualizarás todas las reglas existentes \"\n\"concernientes a $PROFILE$ y apuntarán a este perfil virtual, para que su \"\n\"perfil de resultados pueda ser controlado aquí.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Configuración de la Lista de Reglas\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Formato de la Lista de Reglas\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Perfiles de resultados de la lista de reglas\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Emparejar perfil\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Perfil por defecto\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"URL de la lista de reglas\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"Esta lista de reglas será actualizada desde esta URL. Si se deja en blanco, \"\n\"el siguiente texto será interpretado en su lugar.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Texto de la Lista de Reglas\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Lista de reglas descargada el $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"La lista de reglas está obsoleta debido a un cambio de URL. Presiona el \"\n\"botón descargar de arriba para actualizar.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Reglas de conmutación\"\n\nmsgid \"options_sort\"\nmsgstr \"Ordenar\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Tipo de Condición\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Mostrar ayuda\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Detalles de la Condición\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Perfil\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Acciones\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Añadir condición\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clonar\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Nota\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Reglas de la lista de reglas\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\"(Cualquier solicitud que coincida con la lista de reglas a continuación)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Las reglas de la lista de reglas están DESHABILITADAS)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Por defecto\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ niveles de host ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ hora actual ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Lu\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Ma\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Mi\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"Ju\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Vi\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Sa\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Do\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"Acerca de Tipos de Condición\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Importar lista de reglas en línea\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Añadir una lista de reglas\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"Puedes reusar una colección de condiciones en línea publicada por otros al \"\n\"añadirla a tu lista de reglas.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Bienvenido/a a SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"Has instalado exitosamente SwitchyOmega, el proxy switcher definitivo.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Indica a SwitchyOmega acerca de tus proxies a través de la pagina de \"\n\"opciones. Vamos a ver cómo.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"Has actualizado exitosamente a SwitchyOmega. No te asustes, tus opciones \"\n\"existentes han sido completamente preservadas.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Ahora veamos una guía rápida de la nueva página de opciones.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Siguiente\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Hecho\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Omitir guía\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Aplicar Opciones\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"¡Tus modificaciones de las opciones no han sido guardadas y se perderán si \"\n\"continúas!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Tus cambios de las opciones deben aplicarse antes de proceder.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"¿Quieres guardar y aplicar las opciones?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Renombrar Perfil\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"Nuevo nombre de perfil\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"Ya existe un perfil con este nombre.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\"Los nombres de perfil que empiezan con doble guión bajo están reservados.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Los perfiles con nombres que empiecen por guión bajo se ocultarán en el menú \"\n\"emergente. Sin embargo, pueden seguirse utilizando en sitios como los \"\n\"resultados del perfil conmutador.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Reemplazar Perfil\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Reemplazar perfil\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"¿De verdad deseas reemplazar $FromProfile$ con $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"Si continúas, todas las reglas apuntando a $FromProfile$ se actualizarán \"\n\"para usar $ToProfile$ en su lugar. Otras opciones, como el perfil de inicio \"\n\"y el Conmutador Rápido también se modificarán según corresponda. Sin \"\n\"embargo, los dos perfiles en sí NO serán modificados o eliminados.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Opciones actualizadas.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Eliminar Perfil\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"¿De verdad quieres borrar el siguiente perfil?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Incapaz de Borrar el Perfil\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"Este perfil no puede ser borrado porque está referenciado por los siguientes \"\n\"perfiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"Debes modificar estos perfiles y hacer que dejen de referenciar este perfil \"\n\"antes de que puedas borrarlo.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"El nombre del perfil no debe estar vacío.\"\n\nmsgid \"popup_title\"\nmsgstr \"Ventana emergente de SwitchyOmega\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Autenticación Proxy\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Nombre de usuario\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Contraseña\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Mostrar contraseña\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Ocultar contraseña\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"Sin Autenticación\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Eliminar Regla\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"¿De verdad quieres borrar la siguiente regla?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Borrar\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reestablecer reglas\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"¿Estás seguro/a de establecer el perfil resultante de TODAS las reglas en el \"\n\"siguiente perfil?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reestablecer reglas\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Establecer perfil para todas las reglas\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Eliminar Lista de Reglas\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\"¿Estás seguro/a de querer eliminar la lista de reglas del perfil actual?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ linea(s) de reglas\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Eliminar lista de reglas\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Nuevo Perfil\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Nombre del perfil\"\n\nmsgid \"options_profileType\"\nmsgstr \"Por favor selecciona el tipo de perfil:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Perfil de Proxy\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunelización del tráfico a través de servidores proxy.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"Perfil PAC\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Elegir proxies usando un script PAC en línea/local.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"Solo necesitarás esto si tienes un script PAC o una URL hacia uno. No \"\n\"intentes crear uno a menos que tengas conocimiento sobre PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Perfil Conmutador\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Aplicando distintos perfiles automáticamente en diversas condiciones tales \"\n\"como dominios o patrones.\\n\"\n\" También puedes importar reglas publicadas en línea para un cambio más \"\n\"fácil. (Reemplaza el modo AutoSwitch + Lista de Reglas.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Perfil de Lista de Reglas\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusando una colección en línea de condiciones publicadas por otros.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Perfil Virtual\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"Un perfil virtual puede actuar como cualquier otro perfil bajo demanda. \"\n\"Funciona bien con SwitchProfile, permitiondo cambiar el resultado de \"\n\"múltiples condiciones con un solo click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Crear\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reestablecer Opciones\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"¿Realmente quieres reestablecer las opciones? ¡Todos los perfiles y \"\n\"configuración se PERDERÁN!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Por favor corrige los errores de esta página.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"¡El perfil $PROFILE$ no existe! Las opciones pueden estar corruptas.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Opciones reestablecidas.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Opciones guardadas.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Opciones importadas.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"¡Archivo de copia de seguridad no válido!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"¡Error descargando el archivo de copia de seguridad!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Perfil actualizado existosamente.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"¡Error descargando los datos del perfil!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"Un error de red ha ocurrido al actualizar.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"Un error HTTP ($STATUS$) ha ocurrido al actualizar.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\"La URL del Perfil no ha sido encontrada en el servidor. Por favor vuelve a \"\n\"comprobarla.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"El servidor remoto ha respondido con error ($STATUS$) al actualizar.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\"¡Los datos descargados son inválidos! Puedes abrir la URL del Perfil en tu \"\n\"navegador para inspeccionarla.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Descargar el Perfil Ahora\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"Un <b>Perfil Proxy</b> contiene ajustes como la ip y puerto del servidor \"\n\"para proxy.<br>Los perfiles son las unidades basicas de configuración en \"\n\"SwitchyOmega.<br>Hemos creado un perfil de ejemplo para ti. Intenta abrirlo.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"Puedes completar tu servidor proxy y puerto como desees.<br>SwitchyOmega <b>\"\n\"no viene con ningún servidor proxy</b>.<br>Por favor consulta con tu \"\n\"proveedor de red o con el manual de software de tu proxy si no sabes lo que \"\n\"se debe llenar aquí.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"Puedes decirle a SwitchyOmega que cambie entre proxies automáticamente a \"\n\"través del poderoso <b>Perfil Conmutador</b>.<br>Sin embargo, sus \"\n\"características no pueden ser cubiertas con esta breve guía.<br>Puedes abrir \"\n\"este perfil para desbloquear su poder más tarde.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"¿Necesitas más perfiles? Siempre puedes añadir más <b>perfiles de tipo \"\n\"Proxy, Conmutador y otros</b><br>para todas tus necesidades de configuración \"\n\"con proxies.<br>¡Disfruta configurando tus proxies!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega puede aplicar distintos perfiles para peticiones basadas en \"\n\"<b>condiciones</b>.<br> Por ejemplo, la condición <b>Comodín host</b> \"\n\"permite establecer el perfil para todas las URL en un domino.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"Puedes usar varios tipos de condición para coincidir con el host o la URL \"\n\"completa. <br> Haz clic en el símbolo de interrogación para abrir la \"\n\"referencia de tipo.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega aplica el perfil aquí seleccionado a <b>cualquier petición que \"\n\"coincida con la condición.</b> <br> El <b>perfil especial \\\"[Por defecto]\\\"\"\n\"</b> hará que la petición se envíe sin ningún proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"Si ninguna condición se aplica a alguna solicitud, el perfil \\\"Por defecto\\\" \"\n\"será usado. <br>Las condiciones siempre serán consideradas <b>desde arriba \"\n\"hacia abajo</b> en orden.<br>Puedes cambiar el order arrastrando el icono \"\n\"ordenar.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"Cuando termines de configurar el perfil conmutador, no te olvides de <b>\"\n\"cambiar a el en el menú emergente.</b><br/> El icono mostrará el perfil <b>\"\n\"resultante final</b> aplicado a la pestaña actual. <br/> <b>Pasando el \"\n\"cursor</b> sobre el icono revelará información detallada.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(Perfil Externo)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"nombre del perfil\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"La configuración del proxy está controlada por otra(s) aplicación(es) o \"\n\"extensión(es). Por favor deshabilita o desinstala las aplicaciones o \"\n\"extensiones en conflicto.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"La configuración del proxy está anulada por las políticas. Por favor, \"\n\"póngase en contacto con su administrador.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"La configuración del proxy no puede ser controlada. Por favor, compruebe su \"\n\"sistema y la configuración del navegador.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"La configuración del proxy está deshabilitada por solicitud explícita de \"\n\"otra(s) aplicación(es) o extensión(es).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\"Las configuraciones de proxy ahora están controladas por una versión más \"\n\"reciente de SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"No puedes cambiar los perfiles con SwitchyOmega a menos que soluciones el \"\n\"problema anterior.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"No puede habilitar dos (o más) versiones de SwitchyOmega al mismo tiempo. \"\n\"Por favor deshabilita una de ellas.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Administrar extensiones\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Añadir condición a\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Añadir condición\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Opciones\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Reportar problemas\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Guardar registro de errores\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ recursos fallidos\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Recursos que no se pudieron cargar\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"Algunos recursos no se pudieron cargar debido a problemas con tu red, \"\n\"servidor proxy o la página web.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega es solo el informador de estos problemas, no la causa de ellos.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"Puede revisar los siguientes dominios y usar un proxy cuando sea apropiado.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"Puedes agregar condiciones de conmutación solo cuando se usa un Perfil \"\n\"Conmutador.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configurar el Monitor de Red\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Usar este perfil para todos los dominios seleccionados\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\"¡Los Perfiles PAC NO funcionan en Mozilla Firefox debido a limitaciones \"\n\"técnicas!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Por favor escribe tu comentario SOBRE esta línea. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(Script PAC)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controllado por otras extensiones o entorno)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(sin usar ningún proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(cambio basado en condiciones)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(cambio basado en la lista de reglas)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: Una nueva versión de SwitchOmega es necesaria para cargar las \"\n\"opciones guardadas.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\"ERROR: Las opciones guardadas están corrompidas. Haz clic aquí para \"\n\"REINICIAR LAS OPCIONES.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\"Advertencia: Error al descargar los scripts PAC y/o las listas de reglas.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\"Nota: La configuración del proxy está actualmente controlada por otra(s) \"\n\"aplicación(es).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspeccionar] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(por defecto)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECTO\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspeccionar proxy usado en esta página\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspeccionar proxy utilizado para este Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspeccionar proxy utilizado si este Enlace es abierto\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspeccionar proxy utilizado para este Elemento\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Habilitar Conmutador Rápido\"\n\nmsgid \"about_title\"\nmsgstr \"Acerca de\"\n\nmsgid \"about_app_description\"\nmsgstr \"Una herramienta de configuración de proxy\"\n\nmsgid \"about_version\"\nmsgstr \"Versión $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\"¡El soporte de Mozilla Firefox es altamente experimental! Si tienes \"\n\"problemas, informa utilizando los botones a continuación.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega no proporciona proxies, VPN u otros servicios de red.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\"SwitchyOmega no te rastrea ni inserta anuncios en páginas web. Por favor ve \"\n\"nuestra <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy'>\"\n\"política de privacidad</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\"¿Otras preguntas? ¿Necesitas ayuda con el uso de SwitchyOmega? Por favor ve \"\n\"nuestro <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/\"\n\"FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/\"\n\"master/AUTHORS'>Los autores de SwitchyOmega</a>. Todos los derechos \"\n\"reservados.\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\"SwitchyOmega es posible gracias al proyecto de código abierto <a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> y otro <a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>\"\n\"software de código abierto</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega es <a href='https://www.gnu.org/philosophy/free-sw.en.html'>\"\n\"software libre</a> licenciado bajo <a href='https://www.gnu.org/licenses/\"\n\"gpl.html'>GNU General Public License</a> Versión 3 o posterior.\"\n"
  },
  {
    "path": "omega-locales/es_AR/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2018-11-14 05:08+0000\\n\"\n\"Last-Translator: Rodrigo Bernardi <rodrigobernardi@outlook.com.ar>\\n\"\n\"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/es_AR/>\\n\"\n\"Language: es_AR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.3-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Administra e intercambia entre múltiples proxys rápida y fácilmente.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Cargando…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Intercambio automático\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Directo]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy del sistema]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host comodín\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Coincide con hosts (nombres de dominio) por comodines.<br><b>El asterisco \"\n\"<code>*</code></b> es comodín para cero o más caracteres.<br><b>El signo de \"\n\"interrogación <code>?</code></b> lo es para exactamente un carácter.<br><br>\"\n\"Ten en cuenta que las reglas que comienzan con <code>*.</code> son \"\n\"especialmente tratadas solo en las condiciones de comodines de \"\n\"Host.<br>Ejemplo: <code>*.example.com</code> coincidirá www.ejemplo.com <b>Y \"\n\"ejemplo.com por igual.</b><br>Para coincidir subdominios <b>solamente</b>, \"\n\"usa <b>dos</b> asteriscos como <code>**.ejemplo.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Como la condición de comodín de Host, pero coincide hosts (nombres de \"\n\"dominio) por <a href='https://www.google.com/search?q=expresión%20regular'>\"\n\"expresión regular</a>.<br>Las expresiones regulares pueden ser difíciles de \"\n\"construir (y leer).<br>Es recomendado usar comodines para la mayoría de los \"\n\"casos y solo usar expresiones regulares para las condiciones que no se \"\n\"pueden expresar por ningún otro tipo de condición.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Niveles de Host\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Encuentra una coincidencia si y sólo si el nivel del host está dentro del \"\n\"rango.<br>El nivel de host se define como el <b>número de porciones \"\n\"separadas por puntos</b> en el nombre de dominio del host. <br>Ejemplo: \"\n\"<code>www.ejemplo.com</code> tiene un nivel 3 de host, mientras que \"\n\"<code>interno</code> es un host de nivel 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"Comodín de URL\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://\"\n\"*.example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"Expresión regular de URL\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?\"\n\"q=regular%20expression'>regular expression</a>.<br>However, regular \"\n\"expressions can be hard to construct (and read).<br>It is recommended to use \"\n\"wildcards for most cases and only use regex for conditions that cannot be \"\n\"achieved by any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Palabra clave\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern \"\n\"<code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Deshabilitado)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condición ignorada cuando se haya coincidencia)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. \"\n\"A Disabled condition act as if it does not exist.<br>This feature can be \"\n\"used to disable conditions temporarily.<br>Disabled conditions still hold \"\n\"the previous information (like patterns) and can be re-enabled by setting \"\n\"the condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Tiempo Actual\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Day of the Week\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Especial\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"Proxy Automático\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"¡Falta la directiva '@with result'!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Perfil desconocido: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Missing result profile name at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Invalid rule at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Cerrar\"\n\nmsgid \"dialog_save\"\nmsgstr \"Guardar cambios\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancelar\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Borrar\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Restaurar\"\n\nmsgid \"options_title\"\nmsgstr \"Opciones SwitchyOmega\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Configuraciones\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Perfiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Acciones\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Importar/Exportar\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Nuevo perfil…\"\n\nmsgid \"options_apply\"\nmsgstr \"Aplicar cambios\"\n\nmsgid \"options_discard\"\nmsgstr \"Descartar cambios\"\n\nmsgid \"options_reset\"\nmsgstr \"Reiniciar las opciones\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Opciones misceláneas\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirm on condition deletion.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Refresh current tab on profile change.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Keyboard Shortcut\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Pressing the shortcut will open the switch popup menu. (Defaults to Alt+Shift\"\n\"+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"The items in the popup menu can also be accessed using the keyboard. Press ? \"\n\"(or /) in the menu to learn more.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configure shortcut\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Switch Options\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Startup Profile\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Current profile)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Show advanced condition types\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Desbloquea nuevos tipos complicados pero avanzados de condiciones 'switch'. \"\n\"Para la mayoría de los casos, los tipos básicos de condición deberían ser \"\n\"suficientes; así que no se recomienda usar esta opción.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Quick Switch\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"You need to select at least 2 profiles to enable this function! You can drag \"\n\"them from the box below.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"A yellow badge will be displayed on the icon if some resources fail to load,\"\n\"<br>and you can set the profile for such resources conveniently via the \"\n\"popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Download Interval\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hour\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hours\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hours\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hours\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Every day\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Export the current profile as a PAC file, so you can use it in other \"\n\"browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those \"\n\"projects.<br>Please consider advising your audience to upgrade to \"\n\"SwitchyOmega for the improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Settings\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Make a full backup of your options (including profiles and all other \"\n\"options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices \"\n\"(including this one) for the syncing to actually work. <br> You may check \"\n\"this section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servers for which you do not want to use any proxy: (One server on each \"\n\"line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to \"\n\"browser limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of \"\n\"$PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Skip guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Apply Options\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Your modifications to the options have not been saved and will be lost if \"\n\"you proceed!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup \"\n\"menu. However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use \"\n\"$ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try \"\n\"to create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.\"\n\"<br>Profiles are the the basic configuration units in SwitchyOmega.<br>We \"\n\"have already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega \"\n\"<b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through \"\n\"the mighty <b>Switch Profile</b>.<br>However, its features cannot be covered \"\n\"in this quick guide.<br>You can open this profile to unlock its power some \"\n\"time later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on \"\n\"<b>conditions</b>.<br> For example, the <b>Host wildcard</b> condition \"\n\"allows you to set the profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> \"\n\"Click on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching \"\n\"the condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause \"\n\"the request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be \"\n\"used. <br>Conditions are always considered <b>from top to bottom</b> in \"\n\"order.<br>You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to \"\n\"it in the popup menu.</b><br/> The icon will show you the <b>final result</\"\n\"b> profile applied for the current tab. <br/> <b>Hovering</b> on the icon \"\n\"will reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and \"\n\"browser settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"You cannot switch profiles with SwitchyOmega unless you fix the problem \"\n\"above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"A few resources failed to load due to issues with your network, proxy server \"\n\"or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspeccionar proxy utilizado para este Elemento.\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/fa/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2024-07-28 18:09+0000\\n\"\n\"Last-Translator: Parsa Nobahari <parsa.nobahari@gmail.com>\\n\"\n\"Language-Team: Persian <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/fa/>\\n\"\n\"Language: fa\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"سوییچی‌اومگا\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"سوییچی‌اومگای پیشکار\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"مدیریت و تعویض سریع و آسان بین چندین پیشکار.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"بار کردن…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"تعویض خودکار\"\n\nmsgid \"profile_direct\"\nmsgstr \"[مستقیم]\"\n\nmsgid \"profile_system\"\nmsgstr \"[پیشکار سامانه]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"وایلدکارد میزبان\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"انتخاب و تطبیق میزبان ها ( نام دامین ) به کمک فرا نویسه . <br><b> ستاره \"\n\"<code>*</code></b> صفر کارکتر یا بیشتر را تطابق می‌دهد .<br><b> علامت سوال \"\n\"<code>?</code></b> فقط یک کارکتر را انتخاب و تطابق می‌دهد ..<br><br>توجه \"\n\"داشته باشید که قوانینی که با <code>*</code>شروع می‌شوند به صورت ویژه تنها در \"\n\"شروط فرانویسه ایه میزبان کاربرد دارند .<br> به طور مثال: <code>*.example.\"\n\"com</code> این ادرس ها را تشخیص می‌دهد. <b> www.example.com و example.com .</\"\n\"b><br برای انتخاب زیر دامنه ها <b>کافیست</b> ، از <b>دو</b> ستاره استفاده \"\n\"نمایید . <code>**.example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"عبارت باقاعدهٔ میزبان\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"همانند شرط فرانویسه ی میزبان،اما با کمک <a \"\n\"href='https://www.google.com/search?q=عبارت+منظم'>عبارت منظم</a>.<br> میزبان \"\n\"ها ( اسامی دامنه ها ) را انتخاب و تطابق میدهد . نوشتن یا حتی خواندن عبارات \"\n\"منظم میتواند سخت باشد.<br> پیشنهاد میشود که از فرانویسه استفاده کنید و فقط \"\n\"در مواقعی که به هیچ روشی نمیشود عبارتی رو یافت از عبارات منظم استفاده کنید .\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"سطح‌های میزبان\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"تنها درصورتی درخواست را انطباق می‌دهد که سطح میزبان در محدوده‌ی داده شده \"\n\"باشد .<br> به <b> تعداد بخش های جدا شده توسط نقطه ( دات )</b> سطح میزبان ، \"\n\"هاست ( دامنه ) داده شده می‌گویند . <br> به طور مثال <code>www.example.com</\"\n\"code> دارای سطح میزابن سه می‌باشد ، در حالی که <code>داخل</code> سطح میزبان \"\n\"یک را دارد.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"مجموعه IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"تنها و تنها در صورتی درخواست را قبول می‌کند اگر <b>دقیقا</b> ای پی آدرس ذکر \"\n\"شده باشد و در زیر مجموعه مشخص شده در <a href='https://en.wikipedia.org/wiki/\"\n\"Classless_Inter-Domain_Routing#CIDR_notation'>CIDR notation</a> باشد.<br>\\n\"\n\"برای مثال، در صورت وجود قانون <code>127.0.0.1/16</code>، تمامی آدرس های آی \"\n\"پی مثل<code>127.0.*.*</code>را می‌پذیرد.<br>بنابراین <code>127.0.0.1</code> \"\n\"پذیرفته می‌شود در حالی که<code>127.1.0.0</code> پذیرفته نمی‌شود.\\n\"\n\"میزبان هایی مانند <code>localhost</code> هیچوقت پذیرفته نمی‌شوند بخاطر اینکه \"\n\"آی پی<b>دقیق</b> نمی‌باشند.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"وایلدکارد نشانی\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"ادرس های درخواست داده شده را به کمک فرانویسه بررسی و مطابقت می‌دهد .<br> \"\n\"برای اشنایی با فرانویسه به بخش فرانویسه ی میزبان مراجعه کنید .<br> توجه \"\n\"داشته باشید که فرانویسه‌ی آدرس به صورت ویژه‌ای برخورد نمی‌شوند ( تشخیص \"\n\"جادویی زیردامنه همانند هاست وجود ندارد ) <br> بنابراین دستور <code>*://*.\"\n\"example.com/*</code> ادرس http://www.example.com/ را تشخیص می‌دهد اما این \"\n\"ادرس http://example.com را<b>تشخیص نمی‌دهد .</b>.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"عبارت باقاعدهٔ نشانی\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"ادرس ها را ابزار قدرتمند <a href='https://www.google.com/search?q=عبارت+\"\n\"منظم'>عبارت منظم</a> تشخیص و انتطباق می‌دهد .<br> پیشنهاد می‌شود که از \"\n\"فرانویسه استفاده کنید و فقط در مواقعی که به هیچ روشی نمی‌شود عبارتی رو یافت \"\n\"از عبارات منظم استفاده کنید .\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"کلیدواژه\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"شرط کلمات کلیدی درصورتی انتخاب انجام می‌دهد که پروتکل مورد استفاده HTTP باشد \"\n\"، و الگو (pattern) یک خرده-رشته ی ادرس باشد .<br> همانند الگوی فرانویسه ی \"\n\"ادرس کار می‌کند که در اینجا <code>http://*<b>pattern</b>*</code> قسمت \"\n\"<b>pattern</b> الگوی کلمه ی کلیدی می‌باشد . <br> شرط کلمات کلیدی زمانی مفید \"\n\"هستند که قصد دارید از یک فایروالی که کلمات خاصی را که در ادرس بلاک می‌کند \"\n\"بگذرید . اینگونه می‌توانید اینگونه آدرس های خاص را پیدا کرده و با پروکسی از \"\n\"آن ها عبور کرده.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(از کار افتاده)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(شرط هنگام تطبیق نادیده گرفته شد)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"شما می‌توانید یک شرط را با قرار دادن نوع آن به <code>(غیرفعال)</code> \"\n\"غیرفعال کنید . یک شرط غیرفعال طوری عمل میکند که انگار وجود ندارد .<br> از \"\n\"این قابلیت برای غیرفعال کردن موقت شرط استفاده نمایید .<br> شروط غیرفعال \"\n\"تمامی تنظیمات خود را حفظ می‌کنند و در صورت نیاز می‌توانید با برگردان نوع آن \"\n\"به حالت قبلی آن را فعال کنید .\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"زمان کنونی\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"اگر زمان محلی فعلی در محدوده تعریف شده توسط <b> ساعت شروع </b> و <b> ساعت \"\n\"پایان </b> باشد ، هر دو با هم مطابقت دارند. <br> زمان محلی ، ساعت شروع و \"\n\"ساعت پایان همه در محاسبه می شوند قالب <b> 24 ساعته </ b> (از <b> 0 تا 23 \"\n\"</b>). <br> محاسبه تقریباً در لحظه ارسال درخواست انجام می شود.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"روز هفته\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"در صورت انتخاب <b> روز جاری هفته </ b> با جزئیات شرایط مطابقت دارد. روز \"\n\"براساس منطقه زمانی محلی محاسبه می شود. <br> درخواست و آدرس اینترنتی آن برای \"\n\"این شرایط مهم نیست. نتیجه صرفاً براساس روز هفته ارسال درخواست است.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"مچ کامل دیگر برای این آدرس از کروم 52 به ممکن نیست. <code>https://</code> . <\"\n\"a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-\"\n\"Limitation'>اصلاعات بیشتر...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"میزبان\"\n\nmsgid \"condition_group_url\"\nmsgstr \"نشانی\"\n\nmsgid \"condition_group_special\"\nmsgstr \"ویژه\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"سوییچی\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"پیشکار خودکار\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"دستور '@with result' غایب است!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"پروفایل ناشناس : $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"نام نتیجه ی پروفایل در خط $LNO$: $SOURCE$ غایب است\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"قانون نامعتبر در خط $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"قانون پیش فرض با شرط انتخاب همه '*' غایب است !\"\n\nmsgid \"dialog_close\"\nmsgstr \"بستن\"\n\nmsgid \"dialog_save\"\nmsgstr \"ذخیرهٔ تغییرات\"\n\nmsgid \"dialog_ok\"\nmsgstr \"قبول\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"لغو\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"پاک‌سازی\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"بازگردانی\"\n\nmsgid \"options_title\"\nmsgstr \"گزینه‌های سوییچی‌اومگا\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"تنظیمات\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"نمایه‌ها\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"کنش‌ها\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"رابط\"\n\nmsgid \"options_tab_general\"\nmsgstr \"عمومی\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"درون یا برون‌ریزی\"\n\nmsgid \"options_newProfile\"\nmsgstr \"نمایهٔ جدید…\"\n\nmsgid \"options_apply\"\nmsgstr \"اعمال تغییرات\"\n\nmsgid \"options_discard\"\nmsgstr \"دور ریختن تغییرات\"\n\nmsgid \"options_reset\"\nmsgstr \"بازنشانی گزینه‌ها\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"گزینه‌های متفرّقه\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"تصدیق در زمان حذف شروط.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"رفرش کردن تب کنونی در هنگام تغییر پروفایل.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\"مجوز برای بررسی پروکسی مورد استفاده برای یک المان صفحه در منوی زمنیه (\"\n\"context menu).\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"شرایط جدید اضافه شد از طریق پنجره ی pop-up را در انتهای لیست قرار بده.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"میان‌برهای صفحه‌کلید\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"کلید میانبر برای باز کردن منوی popup .( پیش فرض Alt+Shift+O ).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"با استفاده از دکمه های کیبرد میتوانید به موارد داخل منوی بالاپر (popup) \"\n\"دسترسی داشته باشید . با فشاردادن ؟ ( یا /) میتوانید بیشتر یاد بگیرید .\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"پیکربندی میان‌بر\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"گزینه‌های تعویض\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"نمایهٔ آغازین\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(نمایهٔ کنونی)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"نمایش حالت های پیشرفته ی شروط\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"نوع‌های جدید پیشرفته اما پیچیده‌تر از شرط‌ها را فعال کنید .برای بیشتر حالات \"\n\"نوع‌های عادی کافی میباشد ، این گزینه پیشنهاد نمی‌شود.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"تعویض سریع\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"نمایه‌های چرخشی\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"وقتی بر روی آیکون کلید می‌کنید ( یا از میانبرهای بالا ) استفاده می‌کنید، \"\n\"پروفایل های زیر به ترتیب اجرا می‌شوند .\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"شما باید حداقل دو پروفایل را انتخاب کنید برای فعال کردن این وظیفه ! میتوانید \"\n\"از جعبه ی زیر آن را به اینجا بکشید .\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"پروفایل های غیرچرخشی\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"تغییرات پیشکار\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"بازگرداندن تغییرات پروکسی انجام شده توسط دیگر برنامه ها.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"تداخل‌ها\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"بعضی اوقات، بقیه برنامه‌ها هم سعی میکنند که تنظیمات پراکسی را کنترل کنند، که \"\n\"نتیجه آن تضادها در تنظیمات پراکسی است. به این نکته توجه فرمایید که Ad-\"\n\"blocker ها و دیگر افزونه ها ممکن است از تنظیمات پراکسی در سطح زیرین‌شان \"\n\"استفاده کنند. این تضادها غیرقابل اجتناب‌اند چرا که این نحوه کارکرد مرورگر \"\n\"است.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"وقتی یک نمایانگر قرمز مثل این روی نماد SwitchyOmega نمایان می‌شود این را \"\n\"نشان میدهد که برنامه دیگری کنترل بیشتری دارد پس SwitchyOmega نمیتواند \"\n\"تنظیمات را کنترل کند. لطفا SwitchyOmega را دوباره نصب کنید. کاری که بایستی \"\n\"باعث شود کنترل SwitchyOmega بر تنظیمات بیشتر شود. اگر باز هم تضادهایی در \"\n\"تنظیمات دیدید، لطفا اقدام به حذف برنامه‌ای که این تضاد را باعث میشود کنید.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"اگر SwitchyOmega دارای اولویت بیشتری است ، می توانید با انتخاب \"\n\"$SYSTEMPROFILE$ در منوی باز شده ، کنترل را به سایر برنامه ها یا تنظیمات \"\n\"سیستم بازگردانید.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\"آیتم های منوی pop-up را برای ایمپورت تنظیمات پروکسی از دیگر برنامه ها نمایش \"\n\"بده.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"وقتی $ SYSTEMPROFILE $ انتخاب شد ، می توانید با انتخاب $ EXTERNALPROFILE $ \"\n\"در منوی باز شده ، تنظیمات پروکسی موثر را از سایر برنامه ها وارد کنید. با \"\n\"استفاده از نامی که ارائه می کنید ، تنظیمات به عنوان نمایه وارد می شوند. لطفاً\"\n\" توجه داشته باشید که نمایه وارد شده یک عکس فوری است و پس از آن هیچ تغییری از \"\n\"برنامه منبع را نشان نمی دهد.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"درخواست‌های شبکه\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"نمایش میزان درخواست های ناموفق منابع وب در تب کنونی.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"یک نشان زرد بر روی آیکون قرارخواهد گرفت اگر در لود شدن منبعی مشکل پیش بیاید \"\n\",<br> و شما میتوانید به راحتی پروفایل این گونه منابع را در منوی بالاپر(popup)\"\n\" تنظیم کنید .\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"گزینه‌های بارگیری\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"تناوب بروزرسانی لیست قوانین آنلاین و اسکریپت های PAC را تنظیم کنید .\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"دورهٔ بارگیری\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"۱۵ دقیقه\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"۱ ساعت\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"۳ ساعت\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"۶ ساعت\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"۱۲ ساعت\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"هر روز\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"هرگز\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"نمایه\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"خروجی به صورت فایل PAC\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"خروجی گرفتن پروفایل کنونی به صورت فایل PAC ، برای استفاده در دیگر مرورگرها .\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\"برای خروجی گرفتن از یک پروفایل ، از عملگر سمت راست بالای صفحه ی پروفایل ها \"\n\"استفاده نمایید .\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"در صورت امکان با استفاده از قالب سازگار Proxy Switchy!/SwitchyPlus/\"\n\"SwitchySharp فهرست قوانین را صادر کنید.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"این گزینه را تنها درصورتی که میخواهید لیست قوانین را برای کاربران اون پروژه \"\n\"ها انتشار دهید فعال کنید . <br>لطفا به کاربران خود پیشنهاد بروزرسانی به \"\n\"SwitchyOmega را برای بهره بری بهتر پیشنهاد دهید .\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"تنظیمات\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"پشتیبان‌گیری\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"گرفتن پشتیبان کامل از تنظیمات ( شامل پروفایل ها و تمامی تنظیمات ).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"برگرداندن از فایل\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"گزینه های SwitchyOmega خود را از یک فایل محلی بازیابی کنید.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"بازگرداندن از فایل آنلاین\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"تنظیمات آدرس فایل ( به طور مثال 'http://example.com/switchy.bak' )\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"بازگردانی\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"همگام‌سازی (آزمایشی)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"به کار انداختن همگام‌سازی\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"دانلود از همگام سازی\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"از کار انداختن همگام‌سازی\"\n\nmsgid \"options_syncReset\"\nmsgstr \"پاک کردن کپی ریموت\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"شما اکنون میتوانید به صورت خودکار تمامی تنظیمات و پروفایل های خود را بین \"\n\"تمامی دستگاه های خانگی که از مرورگر کروم استفاده میکنند همگام سازی کنید .\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"تنظیمات شما به صورت خودکار بین دیگر دستگاه های خود همگام سازی میشوند .\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"لطفا توجه داشته باشید که برای کارکردن همگام سازی باید در مرورگرهای کروم خود \"\n\"وارد شده باشید (همین دستگاه راهم شامل میشود ).<br>میتوانید این قسمت را در \"\n\"دیگر دستگاه ها بررسی کنید تا مطمئن شوید که کار میکند .\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"شما یک کپی از تنظیمات خود را در یک دستگاه دیگر با استفاده از همگام سازی \"\n\"فراهم ساختید .\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"شما میتوانید کپی موجود در دیگر دستگاه خود را در اینجا دانلود کنید .<br>هرچند \"\n\"این عمل باعث میشود <b> تنظیمات این دستگاه پاک و تنظیمات آن یکی پروفایل مورد \"\n\"استفاده قرار گیرد </b>.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"همگام سازی گزینه ها در پلت فرم یا مرورگر شما پشتیبانی نمی شود. در حال حاضر ، \"\n\"فقط مرورگر Chrome روی دسکتاپ پشتیبانی می شود.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"همگام سازی برای این پروفایل غیرفعال میباشد .\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\"همگام سازی برای این پروفایل به دلیل استفاده ی زیاد از فضای حافظه غیرفعال شده \"\n\"است .\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"نمایه :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"تغییر نام\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"حذف\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"انتشار لیست قوانین\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"قوانین تغییر را به صورت تکست برای انتشار خروجی بگیر .\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"برون‌ریزی PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"نوع $TYPE$! برای پروفایل پشتیبانی نمیشود!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"این گزینه ممکن است خراب شده باشد ، یا از یک ورژن جدیدی از برنامه باشد .\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"ویرایش سورس کد\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"نمایش کمک درباره ی فرمت سورس کد\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"کارسازهای پیشکار\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"طرحواره\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"شیوه‌نامه\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"کارساز\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"درگاه\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"هویت‌سنجی\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\"مرورگر شما از احراز هویت پروکسی $ PROTOCOLDISP $ پشتیبانی نمی کند! لطفاً این \"\n\"موضوع را به SwitchyOmega گزارش نکنید. در عوض با پشتیبانی مرورگر خود تماس \"\n\"بگیرید.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"اخطار : نام کاربری / رمز عبور ممکن است برای سرور های غیرمنتظره توسط اسکریپت \"\n\"PAC بازگشتی فرستاده شود .\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"قبل از ارسال هرگونه اطلاعات حساس ، لطفا از اعتبار اسکریپ فراهم شده در ادرس \"\n\"بالا اطمینان حاصل فرمایید .\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"قبل از ارسال هرگونه اطلاعات حساس ،لطفا از اعتبار اسکریپ فراهم شده در پایین \"\n\"اطمینان حاصل فرمایید .\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"در ضمن ، استفاده از این پروفایل در دیگر پروفایل ها ( به طور مثال : پروفایل \"\n\"متغیر ) ممکن است باعث ارسال نام کاربری / رمز به سرور های تعیین شده در دیگر \"\n\"پروفایل ها شود.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(پیش‌گزیده)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"مستقیم\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(استفاده از پیش‌گزیده)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"استفاده از پروکسی بالا برای همه ی پروتکل ها.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"نمایش پیش‌رفته\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"لیست سیاه\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"سرورهایی که نمیخواهید برای آن ها از پروکسی استفاده کنید : ( هرکدام در یک خط \"\n\". )\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"( فرانویسه و بیشتر فراهم است .... )\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"نشانی PAC\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"اسکریپ PAC از این آدرس بروزرسانی میشود . درصورت خالی بودن ، اسکریپت زیر به \"\n\"صورت مستقیم استفاده میشود .\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"پروفایل های PAC به همراه فایل : آدرس ها تنها میتوانند مستقیما اعمال شوند . \"\n\"به دلیل محدودیت مرورگر فایل های محلی دسترسی قابل دسترسی نمیباشند که سبب \"\n\"میشود که نتوان از آن ها به عنوان نتایج پروفایل استفاده کرد.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"از اینرو ، شما نمیتوانید از فایل های PAC محلی استفاده نمایید . شما میتوانید \"\n\"یک پروفایل PAC جدید بسازید اگر واقعا نیاز هست .\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"کدنوشتهٔ PAC\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"دانلود اسکریپت PAC در تاریخ $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"اسکریپ PAC به دلیل تغییر آدرس منسوخ میباشد . دکمه ی دانلود بالا را برای بروز \"\n\"رسانی فشاردهید .\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"نمایهٔ مجازی\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"هدف\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"در هنگام اعمال این پروفایل ، دقیقا همانند پروفایل انتخاب شده ی پایینی عمل \"\n\"میکند .\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"مهاجرت به پروفایل مجازی\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"پروفایل هدف را جایگزین کنید\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"می توانید گزینه های موجود را برای استفاده از این نمایهٔ مجازی به جای \"\n\"$PROFILE$ مهاجرت دهید. انجام این کار همهٔ قوانین موجود در مورد $PROFILE$ را \"\n\"نیز به‌روز خواهد کرد و آن‌ها را به این نمایهٔ مجازی منتقل می‌کند تا نمایهٔ \"\n\"نتیجه‌شان بتواند این‌جا واپایش شود.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"تنظیمات لیست قوانین\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"فرمت لیست قوانین\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"نتایج پروفایل های لیست قوانین\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"انطباق پروفایل\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"پروفایل پیش فرض\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"آدرس لیست قوانین\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"لیست قوانین از این آدرس به روز رسانی میشود ، در صورت خالی بودن ، متن بعدی \"\n\"پردازش میشود.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"متن لیست قوانین\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"سیاههٔ قوانین بارگیری شده در $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"لیست قوانین به دلیل تغییر آدرس منسوخ میباشد . دکمه ی دانلود بالا را برای \"\n\"بروز رسانی فشاردهید .\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"قوانین سوییچ\"\n\nmsgid \"options_sort\"\nmsgstr \"چینش\"\n\nmsgid \"options_conditionType\"\nmsgstr \"نوع شرط\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"نمایش کمک\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"جزییات شرط\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"نمایه\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"کنش‌ها\"\n\nmsgid \"options_addCondition\"\nmsgstr \"افزودن شرط\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"شبیه‌سازی\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"یادداشت\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"قوانین لیست قوانین\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"( هرگونه درخواست منطبق بر لیست پایین )\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"( قوانین لیست قوانین غیرفعالند )\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"پیش‌گزیده\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ سطوح میزبان ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ ساعت کنونی ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"ی\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"د\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"س\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"چ\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"پ\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"آ\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"ش\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"درباره ی انوع شروط\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"واردکردن لیست های قوانین آنلاین\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"افزوردن لیست قوانین\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"شما میتوانید با افزودن لیست قوانین از مجموعه های آنلاین شروطی که توسط دیگران \"\n\"منتشر شده استفاده نمایید .\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"به SwitchyOmega خوش آمدید\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"شما با موفقیت SwitchyOmega را نصب نموده اید ، برترین تغییر دهنده ی پروکسی.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"لطفا به SwitchyOmega از طریق صفجه ی تنظیمات ، پروکسی های خود را معرفی کنید .\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"شما با موفقیت به SwitchyOmega ارتقا پیدا کرده اید ، نگران نباشید ، تمامی \"\n\"تنظیمات شما به طور کامل حفظ شده اند .\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"خب بریم سراغ آموزش کوچیکی از صفحه ی تنظیمات جدید.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"بعدی\"\n\nmsgid \"options_guideDone\"\nmsgstr \"انجام شد\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"بیخیال آموزش\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"ثبت تنظیمات\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"تغییرات شما بر روی تنظیمات ذخیره نشده است و درصورت ادامه از بین خواهند رفت !\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"قبل از ادامه دادن تنظمات خود را ثبت کنید.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"آیا میخواهید تنظیمات خود را ذخیره و اعمال کنید ؟\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"تغییرنام پروفایل\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"اسم جدید پروفایل\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"یک پروفایل با این نام وجود دارد.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"نام های پروفایل که با دو\\\"_\\\"(خط زیر) شروع میشوند رزرو میباشند.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"پروفایل هایی که نامشان با دو زیر خط \\\"_\\\" شروع میشوند در منوی بالاپر مخفی \"\n\"میباشند . هرجند ، در مکان هایی مانند نتایج پروفایل متغیر ، قابل استفاده اند.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"جایگزینی پروفایل\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"جایگزینی پروفایل\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"آیا قصد جایگزینی $FromProfile$ را با $ToProfile$ دارید ؟\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"در صورت ادامه ، تمامی قوانین مربوط به $FromProfile$ بروز رسانی میشوند تا عضو \"\n\"$ToProfile$ شوند . دیگر تنظیمات ، همانند پروفایل آغازین و تغییر سریع به صورت \"\n\"مناسب تغییر میکنند . هرچند ، این دو پروفایل تغییر یا حذف نمیشوند .\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"تنظیمات بروزرسانی شد.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"حذف پروفایل\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"آیا از حذف نمودن پروفایل های زیرمطمئن هستید ؟\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"عدم موفقیت در حذف پروفایل\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"این پروفایل قابل حذف نمیباشد چونکه توسط این پروفایل ها صدا میشود :\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"قبل از حذف شما باید این پروفایل ها را تغییر دهید و از صدا زدن این پروفایل \"\n\"جلوگیری کنید .\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"اسم پروفایل نمیتواند خالی باشد.\"\n\nmsgid \"popup_title\"\nmsgstr \"بالاپر SwitchyOmega\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"تصدیق پروکسی\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"نام کاربری\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"گذرواژه\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"نمایش رمز عبور\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"مخفی کردن رمز عبور\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"بدون تصدیق\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"حذف قانون\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"واقعا قصد حذف نمودن قانون را دارید ؟\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"حذف\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"بازنشانی قوانین\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"آیا از تغییر دادن نتایج پروفایل تمامی قوانین به پروفایل زیر مطمئن هستید ؟\"\n\nmsgid \"options_resetRules\"\nmsgstr \"بازنشانی قوانین\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"تنظیم پورفایل برای تمام کاربران\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"حذف لیست قوانین\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"آیا از حذف نمودن لیست قوانین از پروفایل فعلی مطمئن هستید ؟\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"قوانین : $COUNT$ خط\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"حذف لیست قوانین\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"پروفایل جدید\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"اسم پروفایل\"\n\nmsgid \"options_profileType\"\nmsgstr \"لطفا نوع پروفایل را انتخاب نمایید :\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"پروفایل پروکسی\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"تونل ترافیک از طریق پروکسی سرور ها.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"پرفایل PAC\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"انتخاب پروکسی ها از طریق اسکریپ PAC آنلاین/محلی .\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"شما در صورتی که یک اسکریپت PAC یا آدرس مرجوعه به آن را دارید نیازمند این \"\n\"میشوید .درصورت عدم آشنایی با PAC تلاش برای ساخت یک نمونه نکنید .\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"پروفایل متغیر\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"اعمال پروفایل های مختلف به صورت خودکار بر روی شروط گوناگون از جمله دامنه یا \"\n\"الگو ها .\\n\"\n\" شما میتوانید از قوانین منتظر شده ی آنلاین برای جا به جایی راحتر بین پروفایل \"\n\"نیز استفاده کنید ( جایگزین مود AutoSwitch + لیست قوانین .)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"پروفایل لیست پروفایل\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"استفاده ی مجدد از مجموعه ی قوانین آنلاین منتشر شده توسط دیگران .\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"پروفایل مجازی\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"یک پروفایل مجازی همانند هرگونه پروفایل دیگر در حین تقاضا عمل میکند . با \"\n\"SwitchProfile خوب عمل میکند ، که این امکان را به شما میدهد که نتایج چندین \"\n\"شرط را با یک کلیک تغییر دهید.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"ایجاد\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"ریست کردن تنظیمات\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"آیا از ریست کردن تنظیمات اطمینان دارید ؟ تمامی پروفایل ها و تنظیمات از بین \"\n\"خواهند رفت !\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"لطفا خطاهای موجود در صفحه را تصحیح کنید.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"پروفایل $PROFILE$ وجود ندارد ! تنظیمات ممکن است خراب شده باشند .\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"تنظیمات ریست شد .\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"تنظیمات ذخیره شد .\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"تنظیمات با موفقیت فراگیری شدند .\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"فایل پشتیبان غیرمعتبر !\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"خطا در حین دانلود فایل پشتیبان !\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"پروفایل با موفقیت بروزسانی شد .\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"خطا در حین دانلود داده ی پروفایل !\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"هنگام به‌روز رسانی خطای در شبکه اینترنت رخ داد.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"هنگام به روز رسانی خطای HTTP ($ STATUS $) رخ داد.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"آدرس پروفایل بر روی سرور یافت نشد. لطفا دوباره بررسی کنید.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"سرور ریموت با خطای ($STATUS$) در هنگام بروز رسانی پاسخ داد.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\"دیتای دانلود شده نامعتبر است! میتوانید آدرس پروفایل را برای بررسی در مرورگر \"\n\"باز کنید.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"هم اکنون پروفایل را دانلود کنید\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"<b>نمایهٔ پیشکار</b> شامل تنظیماتی چون درگاه و آی‌پی کارساز پیشکار \"\n\"است.<br>نمایه‌ها واحدهای پیکربندی پایهٔ سوییچی اومگا هستند.<br>از پیش نمایهٔ \"\n\"نمونه‌ای برایتان ایجاد کرده‌ایم. گشودنش را بیازمایید.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"می توانید سرور و پورت پروکسی خود را در اینجا به دلخواه پر کنید. <br> \"\n\"SwitchyOmega <b> با هیچ سرور پروکسی ارائه نمی شود </b>. <br> بدانید چه چیزی \"\n\"باید در اینجا پر شود.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"می توانید به SwitchyOmega بگویید که از طریق <b> تغییر پروفایل </b> به طور \"\n\"خودکار بین پراکسی جابجا شود. <br> با این حال ، در این راهنمای سریع نمی توان \"\n\"ویژگی های آن را پوشش داد. <br> می توانید این نمایه را باز کنید تا قفل قدرت \"\n\"آن کمی باز شود. زمان بعد\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"به پروفایل بیشتری نیازمندید ؟ شما همیشه میتوانید <b> پروکسی ، سوییچ و یا \"\n\"پروفایل های دیگری </b> <br> را برای نیاز های پروکسی خود اضافه نمایید . <br> \"\n\"از پروکسی زدن لذت ببرید !\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega میتوانید پروفایل های متفاوتی را بر اساس <b>شروط </b>تقاضا کند \"\n\".<br>برای مثال ، شرط <b>فرانویسه ی میزبان </b> به شما این قابلیت را میدهد که \"\n\"پروفایلی برای تمامی آدرس های یک دامنه تعیین کنید .\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"برای مطابقت با نشانی وب میزبان یا کامل می توانید از انواع شرایط مختلف \"\n\"استفاده کنید. <br> روی علامت سوال کلیک کنید تا مرجع نوع باز شود.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega نمایه انتخاب شده را در اینجا برای <b>هر درخواستی که با شرایط \"\n\"مطابقت دارد اعمال می کند.</b> <br> نمایه <b>\\\"[مستقیم]\\\"</b> باعث می شود \"\n\"درخواست بدون هیچ پراکسی ارسال شود.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"اگر هیچ گونه شرطی منطبق بر درخواست نباشد ، پروفایل \\\"پیش فرض\\\" استفاده خواهد \"\n\"شد .<br> شروط همیشه از<b> بالا به پایین</b> در نظر گرفته میشوند .<br> شما \"\n\"میتوان نظم آن را با گرفتن آیکون نظم (sort) عوض کنید .\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"وقتی انجام تنظیمات پروفایل متغییر(سوییچ) به پایان رسید ، فراموش نکنید که <b> \"\n\"در منونی بالاپر(popup) آن را فعال کنید.</b><br/> آیکون به شما <b>نتیجه ی \"\n\"نهایی </b> پروفایل اعمال شده در تب جاری را نشان میدهد <br/> <b>شناور \"\n\"ماندن</b> بر روی آیکون توضیحات اجمالی به شما نشان خواهد داد .\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(پروفایل خارجی)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"نام پروفایل\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"تنظیمات پروکسی توسط دیگر برنامه (ها) یا افزونه (ها) میدیریت میشوند . لطفا یا \"\n\"آن ها را غیرفعال کرده یا برنامه یا افزونه ی مشکل ساز را حذف نمایید .\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"تنظیمات پروکسی توسط policy ها سیستم کنترل میشوند . لطفا با آدمین تماس بگیرید \"\n\".\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"تنظیمات پروکسی قابل کنترل نیست . لطفا تنظیمات سیستم یا مرورگر را بررسی کنید.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"تنظیمات پروکسی بخاطر درخواست مستقیم دیگر برنامه (ها) یا افزونه (ها) غیرفعال \"\n\"شده است .\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"تنظیمات پروکسی توسط ورژن جدیدی از SwitchyOmega کنترل میشود .\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"شما نمیتوانید پروفایل ها را توسط SwitchyOmega عوض نمایید ، مگر اینکه مشکلات \"\n\"بالا را حل نمایید .\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"شما نمیتوانید از دو (یا چند) ورژن SwitchyOmega به طور همزمان استفاده کنید . \"\n\"لطفا یکی از آن ها را غیرفعال کنید .\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"میدیریت افزونه\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"افزودن شرط به\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"افزودن شرط\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"گزینه‌ها\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"گزارش مشکلات\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"ذخیره لاگ خطا\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ خطای منبع\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"عدم موفقیت در بارگزاری منابع\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"بارگزاری تعدا کمی از منابع بخاطر مشکلات شبکه ، سرور پروکسی یا صفحه ی وب به \"\n\"مشکل برخورد .\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega تنها گزارش دهنده این خطاها میباشد ، نه ایجاد کننده ی آن ها .\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"شما میتوانید دامین های زیر را بررسی کنید و در صورت نیاز از پروکسی برای آن ها \"\n\"استفاده نمایید .\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"شما در صورتی میتوانید شرط متغییر ( سوییچ) برای آن ها تعیین کنید که از \"\n\"پروفایل متغییر استفاده کرده باشید .\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"تنظیم مانیتور شبکه\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"از این پروفایل برای تمامی دامنه های منتخب استفاده کن\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\"نمایه(پروفایل) های PAC در به دلیل محدودیت های تکنیکی در موزیلا فایرفاکس کار \"\n\"نخواهند کرد!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- لطفا توضیحات خود را در بالای این خط بنویسید. -->\\n\"\n\"SwitchyOmega $projectVersion$↵\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"( اسکریپت PAC )\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"( کنترل شده توسط دیگر افزونه ها یا محیط )\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(عدم استفاده از هرگونه پروکسی)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(جابه جایی بر اساس شروط)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(جابه جایی بر اساس لیست قوانین)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega :: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega ::  $1:PROFILE$\\n\"\n\" $3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"خطا: برای بارگیری گزینه های ذخیره شده ، نسخه جدیدتر SwitchyOmega مورد نیاز \"\n\"است.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\"خطا : تنظیمات دخیره شده خراب شده اند .برای ریست کردن تنظیمات کلیک کنید .\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"اخطار: شکست در دانلود اسکریپت PAC و/یا لیست های قوانین .\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"نکته : تنظیمات پروکسی هم اکنون توسط دیگر برنامه (ها) مدیریت میشود .\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[بررسی] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(پیش‌گزیده)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"مستقیم\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(موقت) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"بررسی پروکسی مورد استفاده برای این صفحه\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"بررسی پروکسی مورد استفاده برای این فریم\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"بررسی پروکسی مورد استفاده اگر لینک باز شود\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"بررسی پروکسی مورد استفاده برای این المان\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"فعال سازی تغییر سرعتی\"\n\nmsgid \"about_title\"\nmsgstr \"درباره\"\n\nmsgid \"about_app_description\"\nmsgstr \"ابزار پیکربندی پراکسی\"\n\nmsgid \"about_version\"\nmsgstr \"نسخه $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\"پشتیبانی از فایرفاکس کاملا آزمایشی میباشد! در صورت مواجه با خطا، لطفا از \"\n\"طریق دکمه ی زیر ما را در جریان بگذارید.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega پروکسی، وی پی ان یا دیگر خدمات شبکه ای فراهم نمیکند.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\"SwitchyOmega شما را ردیابی نمی کند یا تبلیغاتی را در صفحات وب درج نمی کند. \"\n\"لطفاً <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#\"\n\"english'>خط مشی رازداری</a> ما را ببینید.\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\"بازم سوال دارید؟ نیاز به کمک دارید؟ لطفا به صفحه <a href='https://github.com/\"\n\"FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a> مراجعه بفرمایید.\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\"کپی رایت 2012-2017 <a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>\"\n\"نویسندگان The SwitchyOmega </a>. کلیه حقوق محفوظ است، ترجمه شده به فارسی \"\n\"توسط گودرز جعفری.\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\"SwitchyOmega به کمک پروژه ی متن باز <a href='https://github.com/FelisCatus/\"\n\"SwitchyOmega'>SwitchyOmega</a> و دیگر پروژه های متن باز<a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>میسر \"\n\"شده است</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega <a href='https://www.gnu.org/philosophy/free-sw.en.html'>یک نرم \"\n\"افزار آزاد </a>، تحت لیسانس<a href='https://www.gnu.org/licenses/gpl.html'>\"\n\"GNU </a> نسخه ی 3 به بعد میباشد.\"\n"
  },
  {
    "path": "omega-locales/fr/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2022-02-02 14:52+0000\\n\"\n\"Last-Translator: My <quentin.lalle@gmail.com>\\n\"\n\"Language-Team: French <https://hosted.weblate.org/projects/switchyomega/main/\"\n\"fr/>\\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.11-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\"Gérez et alternez entre plusieurs serveurs proxy rapidement et facilement.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Chargement…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Automatique\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direct]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy du système]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Hôtes (wildcard)\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Correspondance des hôtes (noms de domaines) par joker.<br><b>L’astérisque \"\n\"<code>*</code></b> correspond à zéro ou plusieurs caractères.<br><b>Le point \"\n\"d'interrogation <code>?</code></b> correspond à exactement un \"\n\"caractère.<br><br>Les règles de correspondance qui commencent par \"\n\"<code>*.</code> ont un fonctionnement différent, uniquement avec les règles \"\n\"d'hôtes génériques.<br>Exemple : <code>*.example.com</code> correspond à \"\n\"www.example.com <b>ET aussi à example.com.</b><br>Pour ne faire correspondre \"\n\"<b>que</b> les sous-domaines, utilisez <b>deux</b> astérisques : \"\n\"<code>**.example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Hôte (RegExp)\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"À la différence des règles d'hôtes génériques, une <a \"\n\"href='https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re'>\"\n\"expression rationnelle</a> est utilisée pour faire correspondre les hôtes (\"\n\"noms de domaines).<br>Les expressions rationnelles peuvent être compliquées \"\n\"à écrire (et à relire).<br>Il est conseillé d'utilisé les jokers dans le cas \"\n\"général, et de n'utiliser les expressions rationnelles que dans le cas où \"\n\"les autres types de correspondance ne peuvent être utilisés.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Niveaux d'hôte\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Correspond à la demande si et seulement si le niveau de l'hôte est dans la \"\n\"plage donnée.<br>Le niveau d'hôte est défini comme le <b>nombre de segments \"\n\"séparés par un point</b> de l'hôte (nom de domaine).<br>Par exemple : \"\n\"<code>www.example.com</code> correspond à un niveau d'hôte de 3, alors que \"\n\"<code>internal</code> correspond à un niveau 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Correspond à la demande si et seulement si l'hôte est une adresse IP \"\n\"<b>littérale</b> et est dans le sous-réseau, comme spécifié par la<a \"\n\"href='https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#\"\n\"CIDR_notation'>notation CIDR</a>.<br>Par exemple, étant donné la règles \"\n\"<code>127.0.0.1/16</code>, cela correspond à toute adresse IP comme <code>127\"\n\".0.*.*</code>.<br>Donc <code>127.0.0.1</code> correspond alors que ce n'est \"\n\"pa sle cas pour <code>127.1.0.0</code>. Les noms d'hôte comme \"\n\"<code>localhost</code> ne correspondront jamais parce qu'ils ne sont <b>pas</\"\n\"b> des IP littérales.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://\"\n\"*.example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?\"\n\"q=regular%20expression'>regular expression</a>.<br>However, regular \"\n\"expressions can be hard to construct (and read).<br>It is recommended to use \"\n\"wildcards for most cases and only use regex for conditions that cannot be \"\n\"achieved by any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Mot-clé\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern \"\n\"<code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Désactivé)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condition ignored when matching)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. \"\n\"A Disabled condition act as if it does not exist.<br>This feature can be \"\n\"used to disable conditions temporarily.<br>Disabled conditions still hold \"\n\"the previous information (like patterns) and can be re-enabled by setting \"\n\"the condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Heure actuelle\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Jour de la semaine\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Spécial\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Missing '@with result' directive!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Unknown profile: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Missing result profile name at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Invalid rule at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Close\"\n\nmsgid \"dialog_save\"\nmsgstr \"Save changes\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancel\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Clear\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Restore\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Options\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Settings\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"New profile…\"\n\nmsgid \"options_apply\"\nmsgstr \"Apply changes\"\n\nmsgid \"options_discard\"\nmsgstr \"Discard changes\"\n\nmsgid \"options_reset\"\nmsgstr \"Reset options\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Misc Options\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirm on condition deletion.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Refresh current tab on profile change.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Keyboard Shortcut\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Pressing the shortcut will open the switch popup menu. (Defaults to Alt+Shift\"\n\"+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"The items in the popup menu can also be accessed using the keyboard. Press ? \"\n\"(or /) in the menu to learn more.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configure shortcut\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Switch Options\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Startup Profile\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Current profile)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Show advanced condition types\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Permet l'usage de nouvaux types de conditions complexes. Pour la plupart des \"\n\"scénarios, les conditions de base devraient être suffisantes. Cette option \"\n\"n'est donc pas recommandée.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Quick Switch\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"You need to select at least 2 profiles to enable this function! You can drag \"\n\"them from the box below.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"A yellow badge will be displayed on the icon if some resources fail to load,\"\n\"<br>and you can set the profile for such resources conveniently via the \"\n\"popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Download Interval\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hour\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hours\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hours\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hours\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Every day\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Export the current profile as a PAC file, so you can use it in other \"\n\"browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those \"\n\"projects.<br>Please consider advising your audience to upgrade to \"\n\"SwitchyOmega for the improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Settings\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Make a full backup of your options (including profiles and all other \"\n\"options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices \"\n\"(including this one) for the syncing to actually work. <br> You may check \"\n\"this section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servers for which you do not want to use any proxy: (One server on each \"\n\"line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to \"\n\"browser limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of \"\n\"$PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Skip guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Apply Options\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Your modifications to the options have not been saved and will be lost if \"\n\"you proceed!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup \"\n\"menu. However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use \"\n\"$ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try \"\n\"to create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.\"\n\"<br>Profiles are the the basic configuration units in SwitchyOmega.<br>We \"\n\"have already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega \"\n\"<b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through \"\n\"the mighty <b>Switch Profile</b>.<br>However, its features cannot be covered \"\n\"in this quick guide.<br>You can open this profile to unlock its power some \"\n\"time later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on \"\n\"<b>conditions</b>.<br> For example, the <b>Host wildcard</b> condition \"\n\"allows you to set the profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> \"\n\"Click on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching \"\n\"the condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause \"\n\"the request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be \"\n\"used. <br>Conditions are always considered <b>from top to bottom</b> in \"\n\"order.<br>You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to \"\n\"it in the popup menu.</b><br/> The icon will show you the <b>final result</\"\n\"b> profile applied for the current tab. <br/> <b>Hovering</b> on the icon \"\n\"will reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and \"\n\"browser settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"You cannot switch profiles with SwitchyOmega unless you fix the problem \"\n\"above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"A few resources failed to load due to issues with your network, proxy server \"\n\"or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspect proxy used for this Element\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"À propos\"\n\nmsgid \"about_app_description\"\nmsgstr \"Un outil de configuration de mandataire\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/he_IL/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2018-06-13 01:52+0000\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: he_IL\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && \"\n\"n % 10 == 0) ? 2 : 3));\\n\"\n\"X-Generator: Weblate 3.0.1\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"\"\n\nmsgid \"profile_direct\"\nmsgstr \"\"\n\nmsgid \"profile_system\"\nmsgstr \"\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/id/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2024-12-27 12:00+0000\\n\"\n\"Last-Translator: Doctorredits_here <alkaf.alkaf2018@tutamail.com>\\n\"\n\"Language-Team: Indonesian <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/id/>\\n\"\n\"Language: id\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.10-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxsi SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Kelola dan beralih di antara beberapa proxy dengan cepat & mudah.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Memuat…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Saklar Otomatis\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Langsung]\"\n\nmsgid \"profile_system\"\nmsgstr \"[System Proxsi]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Tuan rumah wildcard\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Mencocokkan host (nama domain) dengan karakter pengganti.<br><b>Tanda \"\n\"bintang <code>*<code><b> cocok dengan nol karakter atau lebih.<br><b>Tanda \"\n\"tanya <code>?<code><b> cocok dengan tepat satu karakter.<br><br>Perlu \"\n\"diketahui bahwa aturan yang dimulai dengan <code>*.<code> diperlakukan \"\n\"secara khusus hanya dalam kondisi karakter pengganti Host.<br>Contoh: <code>*\"\n\".example.com<code> akan cocok dengan www.example.com <b>DAN example.com \"\n\"juga.<b><br>Untuk mencocokkan subdomain <b>saja<b>, gunakan <b>dua<b> tanda \"\n\"bintang seperti <code>**.example.com<code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Tuan rumah regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Seperti kondisi wildcard Host, tetapi cocok dengan host (nama domain) dengan \"\n\"<a href='https:www.google.comsearch?q=regular%20expression'>ekspresi \"\n\"reguler<a>.<br>Ekspresi reguler sulit dibuat (dan dibaca).<br>Disarankan \"\n\"untuk menggunakan wildcard untuk sebagian besar kasus dan hanya menggunakan \"\n\"regex untuk kondisi yang tidak dapat dicapai oleh jenis kondisi lainnya.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Tingkat tuan rumah\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Mencocokkan permintaan jika dan hanya jika level host berada dalam rentang \"\n\"yang diberikan.<br>Level host didefinisikan sebagai <b>jumlah segmen yang \"\n\"dipisahkan titik<b> dari host (nama domain).<br>Contoh: \"\n\"<code>www.example.com<code> memiliki level host 3, sedangkan \"\n\"<code>internal<code> memiliki level host 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"Literal IP\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Mencocokkan permintaan jika dan hanya jika host adalah alamat IP \"\n\"<b>literal<b> dan dalam subnet sebagaimana ditetapkan oleh <a \"\n\"href='https:en.wikipedia.orgwikiClassless_Inter-Domain_Routing#\"\n\"CIDR_notation'>notasi CIDR<a>.<br>Misalnya, dengan aturan \"\n\"<code>127.0.0.116<code>, maka ia akan mencocokkan semua alamat IP seperti \"\n\"<code>127.0.*.*<code>.<br>Jadi <code>127.0.0.1<code> cocok sedangkan \"\n\"<code>127.1.0.0<code> tidak. Nama host seperti <code>localhost<code> tidak \"\n\"akan pernah cocok karena keduanya <b>bukan<b> IP literal.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Mencocokkan URL permintaan dengan karakter pengganti.<br>Lihat bagian \"\n\"karakter pengganti Host di atas untuk referensi karakter pengganti \"\n\"cepat.<br>Perhatikan bahwa karakter pengganti URL tidak diperlakukan secara \"\n\"khusus (tidak ada keajaiban subdomain seperti pada karakter pengganti Host)\"\n\".<br>Jadi <code>*:*.example.com*<code> cocok dengan http:www.example.com \"\n\"tetapi <b>tidak<b> cocok dengan http:example.com.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/is/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2016-04-03 03:49+0000\\n\"\n\"Last-Translator: Simon Leonhardt <simonl@fastmail.com>\\n\"\n\"Language-Team: Icelandic \"\n\"<https://hosted.weblate.org/projects/switchyomega/main/is/>\\n\"\n\"Language: is\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 2.6-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Stjórnaðu eða skiptu á milli margra proxy hratt og auðveldlega.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Hleður…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Sjálfskipting\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Beint]\"\n\nmsgid \"profile_system\"\nmsgstr \"[System Proxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Slökkt)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Vikudagur\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/it/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2019-05-10 11:34+0000\\n\"\n\"Last-Translator: Riccardo Feletto <riccardo.feletto@gmail.com>\\n\"\n\"Language-Team: Italian <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/it/>\\n\"\n\"Language: it\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Organizza e scegli fra proxy multipli in maniera facile e veloce.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Caricamento…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Auto Switch\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Diretto]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy di Sistema]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host wildcard\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Parole chiave\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Disabilitato)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condizioni ignorate quando riscontrate)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Tempo attuale\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Giorno della settimana\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Speciale\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Profilo sconosciuto: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Regola non valida alla linea $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"Chiusa\"\n\nmsgid \"dialog_save\"\nmsgstr \"Salva le modifiche\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancella\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Pulisci\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Ripristina\"\n\nmsgid \"options_title\"\nmsgstr \"Opzioni di SwitchyOmega\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Impostazioni\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profili\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Azioni\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interfaccia\"\n\nmsgid \"options_tab_general\"\nmsgstr \"Generale\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Importa/Esporta\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Nuovo profilo…\"\n\nmsgid \"options_apply\"\nmsgstr \"Applica i cambiamenti\"\n\nmsgid \"options_discard\"\nmsgstr \"Scarta i cambiamenti\"\n\nmsgid \"options_reset\"\nmsgstr \"Ripristina le opzioni\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/ja/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2022-02-18 08:54+0000\\n\"\n\"Last-Translator: Plat <shu_teiei@outlook.jp>\\n\"\n\"Language-Team: Japanese <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/ja/>\\n\"\n\"Language: ja\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 4.11-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"素早く簡単に複数のプロキシを管理・切替できます。\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"読み込んでいます…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"自動切替\"\n\nmsgid \"profile_direct\"\nmsgstr \"[直接接続]\"\n\nmsgid \"profile_system\"\nmsgstr \"[システムのプロキシ]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"ホスト名とワイルドカード\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"ワイルドカードを使ってホスト名（ドメイン名）にマッチします。<br><b>アスタリスク<code>*</code></b>は0個以上の文字にマッチします。\"\n\"<br><b>疑問符<code>?</code></b>は1文字のみにマッチします。特にホストをワイルドカードの条件を使って指定するときに限っては、<br\"\n\"><br><code>*.</code>から始まるルールは特別に扱います。<br><br>例えば、<code>*.example.com</code>はw\"\n\"ww.example.comに限らず<b>example.comにも同様にマッチします。</b><br>サブドメイン<b>のみ</b>にマッチさせたいとき\"\n\"は、<code>**.example.com</code>といった具合に、アスタリスクを<b>2つ</b>使用してください。\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"ホスト名の正規表現\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"ホスト名のワイルドカード条件と似ていますが、ホスト名（ドメイン名）に<a href='https://www.google.com/search?q=%9\"\n\"0%B3%8BK%95%5C%8C%BB'>正規表現＜/a>を利用してマッチします。<br>正規表現は作成や解読が難しくなりことがあります。<br>大抵の\"\n\"場合ではワイルドカードを使い、どうしても他の方法では記述できない場合にのみ正規表現を使った方がよいでしょう。\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"ホストレベル\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"ホストレベルが指定された範囲内にある場合にのみ、リクエストに一致します。<br>ホストレベルは、ホスト（ドメイン名）の<b>ドットで区切られたセグメントの\"\n\"数</b>として定義されます。<br>例：<code>www.example.\"\n\"com</code>のホストレベルは3ですが、<code>internal</code>のホストレベルは1です。\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IPリテラル\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URLワイルドカード\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://\"\n\"*.example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL正規表現\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?\"\n\"q=regular%20expression'>regular expression</a>.<br>However, regular \"\n\"expressions can be hard to construct (and read).<br>It is recommended to use \"\n\"wildcards for most cases and only use regex for conditions that cannot be \"\n\"achieved by any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"キーワード\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern \"\n\"<code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"（無効）\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"（マッチ時に無視される条件）\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. \"\n\"A Disabled condition act as if it does not exist.<br>This feature can be \"\n\"used to disable conditions temporarily.<br>Disabled conditions still hold \"\n\"the previous information (like patterns) and can be re-enabled by setting \"\n\"the condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"現在の時刻\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"曜日\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"URL全体のマッチは <code>https://</code> を使用したURLにおいてはChrome 52からできなくなりました。 <a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-\"\n\"Limitation'>詳細はこちら</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"ホスト\"\n\nmsgid \"condition_group_url\"\nmsgstr \"URL\"\n\nmsgid \"condition_group_special\"\nmsgstr \"特別\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"自動プロキシ\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"'@with result'の部分がありません！\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"不明なプロファイル: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Missing result profile name at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"$SOURCE$の$LNO$:のルールは無効です\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"閉じる\"\n\nmsgid \"dialog_save\"\nmsgstr \"変更を保存する\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"キャンセル\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"クリア\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"復元\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega オプション\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"設定\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"プロファイル\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"インターフェイス\"\n\nmsgid \"options_tab_general\"\nmsgstr \"総合\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"インポート/エクスポート\"\n\nmsgid \"options_newProfile\"\nmsgstr \"新しくプロファイルを作る…\"\n\nmsgid \"options_apply\"\nmsgstr \"変更を適用\"\n\nmsgid \"options_discard\"\nmsgstr \"変更を破棄\"\n\nmsgid \"options_reset\"\nmsgstr \"設定をリセットする\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"その他の設定\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"条件を削除する際に確認する。\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"プロファイルの変更にともなって現在のタブを更新する。\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"キーボードショートカット\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"ショートカットを押すと切替ポップアップメニューが開きます。(デフォルトではAlt+Shift+O)\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"ポップアップメニューの項目は、キーボードを使ってもアクセスすることができます。キーボードの「？」(または「/」) を押して詳細を表示します。\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"ショートカットの設定\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"切替オプション\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"起動時プロファイル\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"（現在のプロファイル）\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"高度な条件の種類を表示する\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"新しいタイプの高度で複雑なスイッチ条件のロックを解除します。ほとんどのシナリオでは、基本的な条件タイプで十分であるため、このオプションはお勧めしません。\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"クイック切替\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"この機能を有効にするには最低でも二つのプロファイルを選択する必要があります。下のボックスからアイテムをドラッグすることができます。\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"競合\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"他のアプリもプロキシ設定を制御しようとするため、競合が発生することがあります。広告ブロッカーやその他の拡張機能も、プロキシ設定を水面下で使用している可能性\"\n\"があることに気をつけてください。このような競合は、ブラウザの仕組み上、避けることができません。\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"SwitchyOmegaのアイコンにこのような赤いバッジが表示されるのは、他のアプリの方が優先度が高く、SwitchyOmegaが設定をコントロールできな\"\n\"いことを示しています。SwitchyOmegaを一度アンインストールして再インストールすると、SwitchyOmegaの優先順位が上がるはずなので、試して\"\n\"みてください。再インストール後も競合が発生する場合は、競合の原因となっている他のアプリを削除することを検討してください。\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"A yellow badge will be displayed on the icon if some resources fail to load,\"\n\"<br>and you can set the profile for such resources conveniently via the \"\n\"popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"更新間隔\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1時間\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3時間\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6時間\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12時間\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"每日\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Export the current profile as a PAC file, so you can use it in other \"\n\"browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those \"\n\"projects.<br>Please consider advising your audience to upgrade to \"\n\"SwitchyOmega for the improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"設定\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Make a full backup of your options (including profiles and all other \"\n\"options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices \"\n\"(including this one) for the syncing to actually work. <br> You may check \"\n\"this section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servers for which you do not want to use any proxy: (One server on each \"\n\"line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to \"\n\"browser limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of \"\n\"$PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"チュートリアルをスキップ\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"変更を適応\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"変更点は保存されていないため、このまま続行すると変更は失われます。\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup \"\n\"menu. However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use \"\n\"$ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try \"\n\"to create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.\"\n\"<br>Profiles are the the basic configuration units in SwitchyOmega.<br>We \"\n\"have already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega \"\n\"<b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through \"\n\"the mighty <b>Switch Profile</b>.<br>However, its features cannot be covered \"\n\"in this quick guide.<br>You can open this profile to unlock its power some \"\n\"time later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on \"\n\"<b>conditions</b>.<br> For example, the <b>Host wildcard</b> condition \"\n\"allows you to set the profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> \"\n\"Click on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching \"\n\"the condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause \"\n\"the request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be \"\n\"used. <br>Conditions are always considered <b>from top to bottom</b> in \"\n\"order.<br>You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to \"\n\"it in the popup menu.</b><br/> The icon will show you the <b>final result</\"\n\"b> profile applied for the current tab. <br/> <b>Hovering</b> on the icon \"\n\"will reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and \"\n\"browser settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"You cannot switch profiles with SwitchyOmega unless you fix the problem \"\n\"above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"A few resources failed to load due to issues with your network, proxy server or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspect proxy used for this Element\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/lzh/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2024-07-15 07:09+0000\\n\"\n\"Last-Translator: Makerlife <yuyanggu@hotmail.com>\\n\"\n\"Language-Team: Chinese (Literary) <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/lzh/>\\n\"\n\"Language: lzh\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"迅速易事地管理並切換多個代理。\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"載入中…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"自動更迭\"\n\nmsgid \"profile_direct\"\nmsgstr \"[直指]\"\n\nmsgid \"profile_system\"\nmsgstr \"[系統代理]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"主機萬象\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"依域名（主機名）匹配請求。<br><b>星號 <code>*</code></b> \"\n\"匹配零個或者多個字符。<br><b>問號 <code>?</code></b> 匹配任意一字符。\"\n\"<br><br>請注意以 <code>*.</code> \"\n\"起首之規則有特別處理，能同時匹配子域名與自身。<br>例如: <code>*.example.com</\"\n\"code> 能匹配 www.example.com ，<b>且亦能匹配 example.\"\n\"com。</b><br>若<b>僅需匹配子域名</b>，請以<b>兩個</b>星號起首，如 <code>**.\"\n\"example.com</code>。\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"域名綴形法\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"如主機萬象之規，但以<a href='https://www.google.com/search?q=regular%20expres\"\n\"sion'>綴形法</a>匹配主機（域名）。<br>綴形法可能難於構建（及閱讀）。<br>建議\"\n\"於大多數情況下使用萬象，僅於其他條件無法實現時使用綴形法。\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"域名層數\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"若且惟若主機層次在所給範圍內，則匹配該請求.<br>主機層次被定義為主機（域名）之\"\n\"<b>以點分隔的片段數</b>.<br>例如：<code>www.example.com</code> \"\n\"的主機層次為3，而 <code>internal</code> 的層次為1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"依通配符規則以匹配網址。<br>關於通配符之表達式，詳見上文域名通配符一節之述。<\"\n\"br>須知網址通配符無特殊處理，不會特殊處理子域名等。<br>故<code>://.example.\"\n\"com/*</code> 可匹配 http://www.example.com/ 然 <b>不匹配</b> http://example.\"\n\"com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"網址之正則式\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"以功能強大之<a href='https://www.google.com/\"\n\"search?q=regular%20expression'>regular expression</a>正則式匹配網址。<br>然正\"\n\"則表達式難書而可讀性差。<br>因此，故建議大多數情況下用通配符，僅於他法不可行\"\n\"時用正則式。\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"關鍵字\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"（禁用）\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"設規則類型為<code>(禁用)</code>可暫禁某條件。禁用之條件匹配時視為無。<br>條件\"\n\"禁用後，先前數據（如通配符或正則）仍存，故需時可將條件類型改回先前，以重新啟\"\n\"用。\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"當前時辰\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"若當前本地時辰在某範圍內，則匹配。此範圍由<b>始時</b>與<b>終時</b>確定，包含\"\n\"始時與終時。<br>本地時辰、始時與終時皆依<b>24小時制</b>計（自<b>0至23</b>）。\"\n\"<br>此條件約在請求發出瞬時，乃算是否匹配。\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/nb_NO/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2019-05-14 08:49+0000\\n\"\n\"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\\n\"\n\"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/nb_NO/>\\n\"\n\"Language: nb_NO\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 3.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\n#, fuzzy\nmsgid \"manifest_app_name\"\nmsgstr \"Mellomtjeneren SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Behandle og bytt mellom flerfoldige mellomtjenere raskt og enkelt.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Laster inn…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Automatisk bytte\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direkte]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Systemmellomtjener]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Vertsjokertegn\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Regulært uttrykk for vert\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Vertsnivåer\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"Nettadressejokertegn\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"Regulært uttrykk for URL\"\n\n#, fuzzy\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Samsvarer med URL-er i kraft av ekstremt mektige <a \"\n\"href='https://www.google.com/search?q=regular%20expression'>regulære \"\n\"uttrykk</a>.<br>Dog kan regulære uttrykk være vanskelige å lage (og \"\n\"lese).<br>Det er anbefalt å bruke wildcards i de fleste fall og bare bruke \"\n\"regulære uttrykk for tilstander som ikke kan oppnås av noen annen \"\n\"tilstandstype.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Nøkkelord\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Avskrudd)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Tilstand sett bort fra ved jamførelse)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Gjeldende tid\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Ukedag\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Vert\"\n\nmsgid \"condition_group_url\"\nmsgstr \"URL\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Spesiell\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Byttende\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Ukjent profil: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"Lukk\"\n\nmsgid \"dialog_save\"\nmsgstr \"Lagre endringer\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Avbryt\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Tøm\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Gjenopprett\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega-valg\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Innstillinger\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiler\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Handlinger\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Grensesnitt\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Importer/Exporter\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Ny profil…\"\n\nmsgid \"options_apply\"\nmsgstr \"Legg til endringer\"\n\nmsgid \"options_discard\"\nmsgstr \"Forkast endringer\"\n\nmsgid \"options_reset\"\nmsgstr \"Tilbakestill valg\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Ymse valg\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Gjenoppfrisk gjeldende fane ved profilendring.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Tastatursnarvei\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Sett opp snarvei\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Bytt valg\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Oppstartsprofil\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Gjeldende profil)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Mellomtjenerendringer\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Tilbakestill mellomtjenerinnstillinger gjort av andre programmer.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Nettverksforespørsler\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Vis antall feilede nettforespørsler for ressurser i gjeldende fane.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Nedlastingsvalg\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Sett oppdateringsfrekvensen for nettbaserte regellister og PAC-skript.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Nedlastingsintervall\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 minutter\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"en time\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"tre timer\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"seks timer\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 timer\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Hver dag\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Aldri\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profil\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Eksporter som PAC-fil\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Eksporter gjeldende profil som PAC-fil, slik at du kan bruke den i andre \"\n\"nettlesere.\"\n\n#, fuzzy\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\"For å eksportere en profil, bruk handlingsfeltet øverst til høyre på \"\n\"profilsiden.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Innstillinger\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Ta sikkerhetskopi\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Ta full sikkerhetskopi av dine valg (inkludert profiler og alle andre valg).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Gjenopprett fra fil\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Gjennopprett dine SwitchyOmega-valg fra ei lokal fil.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Gjenopprett fra nett\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"URL til valg-fil (f.eks. 'http://eksempel.no/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Gjenopprett\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Synkroniserer (eksperimentelt)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Skru på synkronisering\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Skru av synkronisering\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Gi nytt navn\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Slett\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Offentliggjør regelliste\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Eksporter PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Ustøttet profiltype $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"Valg kan være skadelidende, eller fra en nyere versjon av programmet.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Rediger kildekode\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Vis hjelp om kildekodeformatet\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Tjenere for mellomtjening\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protokoll\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Tjener\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Identitetsbekreftelse\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\n#, fuzzy\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Advarsel: Brukernavn/passord kan bli sendt til uventede tjenere fra PAC-\"\n\"skriptet.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(forvalg)\"\n\n#, fuzzy\nmsgid \"options_protocol_direct\"\nmsgstr \"DIREKTE\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(bruk forvalg)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Bruk mellomtjeneren ovenfor for alle protokoller.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Vis avanserte valg\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Mål\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Handlinger\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Søn\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Man\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tirs\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"Ons\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Tors\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fre\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Lør\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Legg til en regelliste\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Velkommen til SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Neste\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Ferdig\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Hopp over guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Legg til valg\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Gi profil nytt navn\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"Nytt profilnavn\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"En profil ved dette navnet finnes allerede.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profilnavn som begynner med dobbel understrek er reservert.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Erstatt profil\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Erstatt profil\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Ønsker du virkelig å erstatte $FromProfile$ med $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Slett profil\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Ønsker du virkelig å slette følgende profil?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Kunne ikke slette profil\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"Denne profilen kunne ikke slettes fordi den vises til av følgende profiler:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"Oppsprettsvindu for SwitchyOmega\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Identitetsbekreftelse for mellomtjener\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Brukernavn\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Passord\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"Ingen identitetsbekreftelse\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Slett regel\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Ønsker du virkelig å slette følgende regel?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Slett\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Tilbakestill regler\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Tilbakestill regler\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Sett profil for alle regler\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Fjern regelliste\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Ønsker du virkelig å slette regellisten fra gjeldende profil?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ linje(r) med regler\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Slett regelliste\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Ny profil\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profilnavn\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Mellomtjenerprofil\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC-profil\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Bytt profil\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtuell profil\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Opprett\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Tilbakestill valg\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Lnsker du virkelig å tilbakestille valgene? Alle profiler og innstillinger \"\n\"vil gå TAPT!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Korriger feilene på denne siden.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profilen $PROFILE$ finnes ikke! Valgene kan være skadet.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Valg tilbakestilt.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Valg lagret.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Valg importert.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Ugyldig sikkerhetskopifil!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Vellykket oppdatering av profil.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Feil ved nedlasting av profildata!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Last ned profil nå\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(Ekstern profil)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profilnavn\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Behandle tillegg\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Valg\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Rapporter feil\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Lagre feilrettingslogg\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failede ressurser\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Ressurser som ikke kunne lastes inn\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"En del ressurser kunne ikke lastes inn på grunn av feil med ditt nettverk, \"\n\"mellomtjeneren eller nettsiden.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"SwitchyOmega rapporterer bare disse feilene, det er ikke opphavet.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"Du kan se over følgende domener og bruke mellomtjener for dem når det høver \"\n\"seg.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Sett opp nettverksoversikt\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Bruk denne profilen for alle valgte domener\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Skriv kommentaren din OVER denne linjen. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC-skript)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(styrt av andre tillegg eller miljø)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(bruker ikke noen mellomtjener)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"FEIL: En nyere versjon av SwitchOmega kreves for å laste de lagrede valgene.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"FEIL: Lagrede valg skadet. Klikk her for å TILBAKESTILLE VALG.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Advarsel: Kunne ikke laste ned PAC-skript og/eller regellister.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Se over] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(forvalg)\"\n\n#, fuzzy\nmsgid \"browserAction_directResult\"\nmsgstr \"DIREKTE\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(MIDLERTIDIG) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Se over mellomtjenerbruk for denne siden\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Skru på raskt bytte\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/nl/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2017-02-07 11:48+0000\\n\"\n\"Last-Translator: Heimen Stoffels <vistausss@outlook.com>\\n\"\n\"Language-Team: Dutch \"\n\"<https://hosted.weblate.org/projects/switchyomega/main/nl/>\\n\"\n\"Language: nl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 2.11\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\"Beheer en schakel tussen meerdere proxies tegelijkertijd, gemakkelijk en \"\n\"snel.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Bezig met laden…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Automatisch schakelen\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direct]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Systeemproxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host-jokerteken\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host-regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Host-niveaus\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP-letters\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/pl/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2021-05-11 13:37+0000\\n\"\n\"Last-Translator: Dariusz Dębowski <ddebowski@outlook.com>\\n\"\n\"Language-Team: Polish <https://hosted.weblate.org/projects/switchyomega/main/\"\n\"pl/>\\n\"\n\"Language: pl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 \"\n\"|| n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"SwitchyOmega Proxy\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Zarządzanie i przełączanie się pomiędzy serwerami proxy.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Wczytywanie…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Automatyczne przełączanie\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Bez proxy]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy systemowe]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/pt/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2024-10-08 09:16+0000\\n\"\n\"Last-Translator: ssantos <ssantos@web.de>\\n\"\n\"Language-Team: Portuguese <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/pt/>\\n\"\n\"Language: pt\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.8-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Gira e troque entre vários proxies rápida e facilmente.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"A carregar…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Auto Troca\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direto]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy do Sistema]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host curinga\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Matches de hosts (domínios) por curinga.<br><b>O asterisco <code>*</code></\"\n\"b> match de zero ou mais caracteres.<br><b>O ponto de interrogação \"\n\"<code>?</code></b> match de exatamente um carácter.<br><br>Note que regras a \"\n\"começar com <code>*.</code> são especialmente tratadas apenas num host com \"\n\"condições curinga.<br>Exemplo: <code>*.exemplo.com</code> vai dar match em \"\n\"www.exemplo.com <b>E também exemplo.com.</b><br>Para <b>apenas</b> \"\n\"subdomínios , use <b>dois</b> asteriscos como: <code>**.exemplo.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Parecido com a condição curinga, mas dá matchs em hosts (nomes de domínios) \"\n\"por <a href='https://www.google.com.br/\"\n\"search?q=regular%20expression'>regular expression</a>.<br>As expressões \"\n\"regulares podem ser difíceis de construir (e ler).<br> É recomendado usar \"\n\"curingas para a maioria dos casos e usar regex apenas em condições que não \"\n\"pode ser conseguido em nenhum outro tipo de condição.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Palavra chave\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Desativado)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Special\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Options\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"Reset options\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configurar atalho\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Opções de alteração\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Perfil de inicialização\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Perfil atual)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Desbloqueia novos tipos de avançadas, porém complicadas, condições de \"\n\"mudança. Para a maioria dos cenários, as condições básicas devem ser \"\n\"suficientes, logo esta opção não é recomendada.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Opções des descarrega\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega é um <a href='https://www.gnu.org/philosophy/free-\"\n\"sw.en.html'>software gratuito</a> licenciado sob <a href='https://www.gnu.\"\n\"org/licenses/gpl.html'>Licença Pública Geral GNU</a> Versão 3 ou posterior.\"\n"
  },
  {
    "path": "omega-locales/pt_BR/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2021-07-05 03:34+0000\\n\"\n\"Last-Translator: Vinicius <rodriguessv30@gmail.com>\\n\"\n\"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/pt_BR/>\\n\"\n\"Language: pt_BR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.8-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Gerencie e alterne entre vários proxies com rapidez e facilidade.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Carregando…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Troca Automática\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Direct]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Proxy do Sistema]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Host curinga\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Matches de hosts (domínios) por curinga.<br><b>O asterisco <code>*</code></b>\"\n\" match de zero ou mais caracteres.<br><b>O ponto de interrogação \"\n\"<code>?</code></b> match de exatamente um carácter.<br><br>Note que regras \"\n\"começando com <code>*.</code> são especialmente tratadas apenas em um host \"\n\"com condições curinga.<br>Exemplo: <code>*.exemplo.com</code> vai dar match \"\n\"em www.exemplo.com <b>E também exemplo.com.</b><br>Para <b>apenas</b> \"\n\"subdomínios , use <b>dois</b> asteriscos como: <code>**.exemplo.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Host regex\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Parecido com a condição curinga, mas dá matchs em hosts (nomes de domínios) \"\n\"por <a href='https://www.google.com.br/search?q=regular%20expression'>\"\n\"regular expression</a>.<br>As expressões regulares podem ser difíceis de \"\n\"construir (e ler).<br> É recomendado usar curingas para a maioria dos casos \"\n\"e usar regex apenas em condições que não pode ser conseguido em nenhum outro \"\n\"tipo de condição.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Host levels\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host level in within the given range.\"\n\"<br>Host level is defined as the <b>number of dot-separated segments</b> of \"\n\"the host (domain name).<br>Example: <code>www.example.com</code> is with a \"\n\"host level of 3, while <code>internal</code> is of host level 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Matches URLs of the request by wildcard.<br>See the Host wildcard section \"\n\"above for a quick wildcard reference.<br>Note that URL wildcards are not \"\n\"specially treated (no subdomain magic as in Host wildcard).<br>So <code>*://\"\n\"*.example.com/*</code> matches http://www.example.com/ but <b>does not</b> \"\n\"match http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL regex\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Matches URL by extremely powerful <a href='https://www.google.com/search?\"\n\"q=regular%20expression'>regular expression</a>.<br>However, regular \"\n\"expressions can be hard to construct (and read).<br>It is recommended to use \"\n\"wildcards for most cases and only use regex for conditions that cannot be \"\n\"achieved by any other condition type.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Palavra chave\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"A keyword condition matches if the URL protocol is HTTP, and the pattern is \"\n\"an exact sub-string of the URL.<br>It behaves like the URL wildcard pattern \"\n\"<code>http://*<b>pattern</b>*</code>, where <b>pattern</b> is the keyword \"\n\"pattern.<br>Keyword conditions are useful if you want to bypass a firewall \"\n\"blocking some keywords in the URL, by requesting such URLs through a proxy.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Desativado)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Condition ignored when matching)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"You can disable a condition by setting its type to <code>(Disabled)</code>. \"\n\"A Disabled condition act as if it does not exist.<br>This feature can be \"\n\"used to disable conditions temporarily.<br>Disabled conditions still hold \"\n\"the previous information (like patterns) and can be re-enabled by setting \"\n\"the condition type back to the previous type.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Current Time\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Matches if the current local time is in the range defined by \"\n\"<b>starting hour</b> and <b>ending hour</b>, both inclusive.<br>\"\n\"Local time, starting hour and ending hour are all calculated in \"\n\"<b>24-hour</b> format (from <b>0 to 23</b>). <br>\"\n\"The calculation happens roughly at the moment when the request is sent.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Day of the Week\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Matches if the <b>current day of week</b> is selected in condition details. \"\n\"Day is calculated according to local timezone.<br>\"\n\"The request and its URL don't matter to this condition. \"\n\"The result is solely based on the day of the week when the request is sent.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Host\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Special\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Missing '@with result' directive!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Unknown profile: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Missing result profile name at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Invalid rule at Line $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Missing default rule with catch-all '*' condition!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Close\"\n\nmsgid \"dialog_save\"\nmsgstr \"Save changes\"\n\nmsgid \"dialog_ok\"\nmsgstr \"OK\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Cancel\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Clear\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Restore\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Options\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Settings\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiles\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Actions\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Interface\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Import/Export\"\n\nmsgid \"options_newProfile\"\nmsgstr \"New profile…\"\n\nmsgid \"options_apply\"\nmsgstr \"Apply changes\"\n\nmsgid \"options_discard\"\nmsgstr \"Discard changes\"\n\nmsgid \"options_reset\"\nmsgstr \"Reset options\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Misc Options\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Confirm on condition deletion.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Refresh current tab on profile change.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"Allow inspecting proxy used for page elements via context menu.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Keyboard Shortcut\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Pressing the shortcut will open the switch popup menu. (Defaults to Alt+Shift\"\n\"+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"The items in the popup menu can also be accessed using the keyboard. Press ? \"\n\"(or /) in the menu to learn more.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Configurar atalho\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Opções de alteração\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Perfil de inicialização\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Perfil atual)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Show advanced condition types\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Desbloqueia novos tipos de avançadas, porém complicadas, condições de \"\n\"mudança. Para a maioria dos cenários, as condições básicas devem ser \"\n\"suficientes, logo esta opção não é recomendada.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Quick Switch\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Cycled Profiles\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"When you click on the icon (or use the shortcut above), the following \"\n\"profiles will be applied in their order.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"You need to select at least 2 profiles to enable this function! You can drag \"\n\"them from the box below.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Not Cycled Profiles\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy Changes\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Revert proxy changes done by other apps.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Network Requests\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Show count of failed web requests for resources in the current tab.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"A yellow badge will be displayed on the icon if some resources fail to load,\"\n\"<br>and you can set the profile for such resources conveniently via the \"\n\"popup menu.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Download Options\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Configure the update frequency of online rule lists and PAC scripts.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Download Interval\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Minutes\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Hour\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Hours\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Hours\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Hours\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Every day\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Never\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Export as PAC File\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Export the current profile as a PAC file, so you can use it in other \"\n\"browsers.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"To export a profile, use the top-right action bar on the profile page.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Export rule lists using Proxy Switchy!/SwitchyPlus/SwitchySharp compatible \"\n\"format when possible.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Enable this option only if you publish rule lists for users of those \"\n\"projects.<br>Please consider advising your audience to upgrade to \"\n\"SwitchyOmega for the improvements.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Settings\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Make backup\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Make a full backup of your options (including profiles and all other \"\n\"options).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Restore from file\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Restore your SwitchyOmega options from a local file.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Restore from online\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Options file URL (e.g. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Restore\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Syncing (Experimental)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Enable Syncing\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Download from Syncing\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Disable syncing\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Clear remote copy\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"You can now automatically synchronize your settings and profiles across all \"\n\"your desktop devices running Chrome browser.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"Your options are automatically synchronized with your other devices.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Please note that you must sign in to Chrome on each of your devices \"\n\"(including this one) for the syncing to actually work. <br> You may check \"\n\"this section on other devices to ensure that it is working.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"You have uploaded a copy of your options on another device via syncing.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"You may download the remote copy to your device if you like. <br>However, \"\n\"doing so would <b>overwrite your existing settings and profiles</b> on this \"\n\"device.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Options syncing is not supported on your platform or browser. For now, only \"\n\"Chrome browser on desktop is supported.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Syncing is disabled for this profile.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"Syncing is disabled for this profile for using too much storage space.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profile :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Rename\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Delete\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Publish rule list\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Export Switch Rules as text format for publishing.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Export PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Unsupported profile type $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"The options could be broken, or from a newer version of this program.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Edit source code\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Show help about the source code format\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Scheme\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protocol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Server\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Authentication\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Warning: The username/password may be sent to unexpected servers returned by \"\n\"the PAC script.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Please make sure that you trust the script provided via the URL above before \"\n\"entering sensitive credentials.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Please make sure that you trust the script below before providing sensitive \"\n\"credentials.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Additionally, using this profile in other profiles (e.g. Switch Profile) may \"\n\"cause the username/password to be sent to proxy servers configured in other \"\n\"profiles.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(default)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"DIRECT\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(use default)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Use the proxy above for all protocols.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Show Advanced\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Bypass List\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Servers for which you do not want to use any proxy: (One server on each \"\n\"line.)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Wildcards and more available…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC URL\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"The PAC script will be updated from this URL. If it is left blank, the \"\n\"following script will be used directly instead.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"PAC profiles with file: URLs can only be applied directly. They cannot be \"\n\"used as result profiles because local files cannot be accessed due to \"\n\"browser limitation.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Therefore, you cannot use local PAC file for this profile. You can create a \"\n\"new PAC profile for that if you really want that.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Script\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC script downloaded at $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC script is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Target\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"When this profile is applied, it acts exactly the same as the profile \"\n\"selected below.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Migrate to Virtual Profile\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Replace target profile\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"You can migrate existing options to use this virtual profile instead of \"\n\"$PROFILE$. Doing so will update all existing rules concerning $PROFILE$ and \"\n\"point them to this virtual profile, so that their result profile can be \"\n\"controlled here.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Rule List Config\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Rule List Format\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Rule list result profiles\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Match profile\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Default profile\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Rule List URL\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"The rule list will be updated from this URL. If it is left blank, the \"\n\"following text will be parsed instead.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Rule List Text\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Rule list downloaded at $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Rule list is obsolete due to URL change. Press the download button above to \"\n\"update.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Switch rules\"\n\nmsgid \"options_sort\"\nmsgstr \"Sort\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Condition Type\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Show help\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Condition Details\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profile\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Clone\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Rule list rules\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Any request matching the rule list below)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Rule list rules are DISABLED)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ host levels ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ current hour ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"About Condition Types\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Import online rule lists\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Add a rule list\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"You can reuse an online collection of conditions published by others by \"\n\"adding a rule list.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Welcome to SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"You have successfully installed SwitchyOmega, the ultimate proxy switcher.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Please tell SwitchyOmega about your proxies through the options page. Let's \"\n\"see how.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"You have successfully upgraded to SwitchyOmega. Don't panic, your existing \"\n\"options are fully preserved.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"Now let's go through a quick guide of the new options page.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Next\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Done\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Skip guide\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Apply Options\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Your modifications to the options have not been saved and will be lost if \"\n\"you proceed!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Your changes to the options must be applied before you proceed.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Do you want to save and apply the options?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Rename Profile\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"New profile name\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"A profile with this name already exists.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Profile names beginning with double-underscore are reserved.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Profiles with names starting with underscore will be hidden on the popup \"\n\"menu. However, they can still be used in places like switch profile results.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Replace Profile\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Do you really want to replace $FromProfile$ with $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"If you proceed, all rules pointing to $FromProfile$ will be updated to use \"\n\"$ToProfile$ instead. Other options, such as startup profile and Quick Switch \"\n\"will also be modified as appropriate. However, the two profile themselves \"\n\"will NOT be changed or deleted.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Options updated.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Delete Profile\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Do you really want to delete the following profile?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Unable to Delete Profile\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"This profile cannot be deleted because it is referred by the following \"\n\"profiles:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"You must modify these profiles and make them stop referring to this profile \"\n\"before you can delete it.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"The name of the profile must not be empty.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Popup\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Username\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Delete Rule\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Do you really want to delete the following rule?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Are you sure to set the result profile of ALL rules to the following profile?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Reset rules\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Set profile for all rules\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Remove Rule List\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Do you really want to remove the rule list from the current profile?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ line(s) of rules\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Remove rule list\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"New Profile\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profile name\"\n\nmsgid \"options_profileType\"\nmsgstr \"Please select the type of the profile:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profile\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Tunneling traffic through proxy servers.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profile\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Choosing proxies using an online/local PAC script.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"You will only need this if you have a PAC script or a URL to it. Don't try \"\n\"to create one unless you have knowledge about PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Switch Profile\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Applying different profiles automatically on various conditions such as \"\n\"domains or patterns.\\n\"\n\" You can also import rules published online for easier switching. (Replaces \"\n\"AutoSwitch mode + Rule List.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Rule List Profile\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Reusing an online collection of conditions published by others.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Virtual Profile\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"A virtual profile can act as any of the other profiles on demand. It works \"\n\"well with SwitchProfile, allowing you to change the result of multiple \"\n\"conditions by one click.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Create\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Do you really want to reset the options? All profiles and settings will be \"\n\"LOST!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Please correct the errors in this page.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Profile $PROFILE$ does not exist! The options may be corrupted.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Options saved.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Options imported.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Invalid backup file!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Error downloading backup file!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Successfully updated profile.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Error downloading profile data!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Download Profile Now\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"A <b>Proxy Profile</b> contains settings like server ip &amp; port for proxy.\"\n\"<br>Profiles are the the basic configuration units in SwitchyOmega.<br>We \"\n\"have already created an example profile for you. Try opening it.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"You can fill in your proxy server and port here as you like.<br>SwitchyOmega \"\n\"<b>does not come with any proxy servers</b>.<br>Please consult your network \"\n\"provider or proxy software manual if you don't know what should be filled in \"\n\"here.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"You can tell SwitchyOmega to switch between proxies automatically through \"\n\"the mighty <b>Switch Profile</b>.<br>However, its features cannot be covered \"\n\"in this quick guide.<br>You can open this profile to unlock its power some \"\n\"time later.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Need more profiles? You can always add more <b>Proxy, Switch and other \"\n\"profiles</b><br>for all your proxying needs.<br>Enjoy proxying!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega can apply different profiles to requests based on \"\n\"<b>conditions</b>.<br> For example, the <b>Host wildcard</b> condition \"\n\"allows you to set the profile for all URLs in a domain.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"You can use various condition types to match the host or full URL. <br> \"\n\"Click on the question mark to open the type reference.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega applies the selected profile here to <b>any request matching \"\n\"the condition.</b> <br> The special <b>\\\"[Direct]\\\" profile</b> will cause \"\n\"the request to be sent without any proxy.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"If no condition applies to some request, the \\\"Default\\\" profile will be \"\n\"used. <br>Conditions are always considered <b>from top to bottom</b> in \"\n\"order.<br>You can change their order by dragging the sort icon.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"When you are done setting the switch profile, don't forget to <b>switch to \"\n\"it in the popup menu.</b><br/> The icon will show you the <b>final result</\"\n\"b> profile applied for the current tab. <br/> <b>Hovering</b> on the icon \"\n\"will reveal a tooltip with details.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(External Profile)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile name\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"The proxy settings are controlled by other app(s) or extension(s). Please \"\n\"disable or uninstall the apps or extensions in conflict.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"The proxy settings are overruled by policies. Please contact your \"\n\"administrator.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"The proxy settings cannot be controlled. Please check your system and \"\n\"browser settings.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"The proxy settings are disabled by explicit request from other app(s) or \"\n\"extension(s).\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Proxy settings are now controlled by a newer version of SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"You cannot switch profiles with SwitchyOmega unless you fix the problem \"\n\"above.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"You can't enable two (or more) versions of SwitchyOmega at the same time. \"\n\"Please disable one of them.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Manage extensions\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Add condition to\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Add condition\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Report issues\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Save error log\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ failed resources\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Resources that failed to load\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"A few resources failed to load due to issues with your network, proxy server \"\n\"or the webpage.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\"SwitchyOmega is just the reporter of these issues, not the cause of them.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"You can review the following domains and use proxy for them when appropriate.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"You can add switch conditions for them only when using a Switch Profile.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Configure Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Use this profile for all selected domains\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Please write your comment ABOVE this line. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC script)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(controlled by other extensions or environment)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(not using any proxy)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(switching based on conditions)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(switching based on rule list)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ERROR: A newer version of SwitchOmega is required to load the stored options.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"ERROR: The stored options are corrupted. Click here to RESET OPTIONS.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Warning: Failed to download PAC scripts and/or rule lists.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"Note: The proxy settings are currently controlled by other app(s).\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Inspect] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Inspect proxy used for this page\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Inspect proxy used for this Frame\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Inspect proxy to be used if this Link is opened\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Inspect proxy used for this Element\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Enable Quick Switch\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega é um <a href='https://www.gnu.org/philosophy/free-\"\n\"sw.en.html'>software gratuito</a> licenciado sob <a href='https://www.gnu.\"\n\"org/licenses/gpl.html'>Licença Pública Geral GNU</a> Versão 3 ou posterior.\"\n"
  },
  {
    "path": "omega-locales/ru/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Russian (SwitchyOmega)\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2017-11-21 02:34+0200\\n\"\n\"PO-Revision-Date: 2022-07-13 08:19+0000\\n\"\n\"Last-Translator: MΛX <maxkorsov@protonmail.com>\\n\"\n\"Language-Team: Russian <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/ru/>\\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n\"\n\"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.14-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Прокси SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Управляйте и переключайтесь между прокси-серверами быстро и легко.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Загрузка…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Автопереключение\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Напрямую]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Системный прокси]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Шаблон хоста\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Проверяет хосты (доменные имена) на соответствие шаблону.<br><b>Звёздочка \"\n\"<code>*</code></b> заменяет нуль или более символов.<br><b>Знак вопроса \"\n\"<code>?</code></b> заменяет ровно один символ.<br><br>Обратите внимание, что \"\n\"правила, начинающиеся с <code>*.</code>, обрабатываются особо только в \"\n\"шаблонах хоста.<br>Пример: <code>*.example.com</code> сопоставит как \"\n\"www.example.com, <b>ТАК И example.com.</b><br>Для того, чтобы сопоставить \"\n\"<b>только</b> поддомены, используйте <b>две</b> звёздочки: <code>**.example.\"\n\"com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Регулярное выражение хоста\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Подобно шаблону хоста, но проверяет на совпадение хосты (доменные имена) с \"\n\"<a href='https://www.google.ru/search?q=регулярные%20выражения'>регулярным \"\n\"выражением</a>.<br>Регулярные выражения бывает трудно составить (и прочитать)\"\n\".<br>Поэтому регулярные выражения рекомендуется использовать только для тех \"\n\"условий, которые не могут быть выражены другими методами.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Уровни хоста\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Соответствует запросу только тогда, когда уровень хоста находится в заданном \"\n\"диапазоне.<br>Уровень хоста определяется как <b>число разделённых точками \"\n\"сегментов</b> хоста (доменного имени).<br> Пример: <code>www.example.com</\"\n\"code> имеет уровень хоста 3, а <code>internal</code> имеет уровень хоста 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"Маска IP\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Соответствует запросу только тогда, если хост является <b>числовым \"\n\"представлением</b> IP-адресом и находится в подсети, как указано в <a \"\n\"href='https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#\"\n\"CIDR_notation'>записи CIDR</a>.<br>Например, правило <code>127.0.0.1/16</\"\n\"code> соответствует всем IP-адресам как <code>127.0.*.*</code>.<br>Таким \"\n\"образом <code>127.0.0.1</code> соответствует запросу, а <code>127.1.0.0</\"\n\"code> – нет. Имена хостов, такие как <code>localhost</code>, никогда не \"\n\"будут соответствовать запросу, потому что они <b>не заданы числом</b> IP.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"Шаблон URL\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Проверяет URL-адреса запроса на соответствие шаблону.<br>Смотрите пример \"\n\"шаблона хоста в разделе выше для быстрого создания шаблона для \"\n\"ссылки.<br>Обратите внимание, что шаблон URL-адреса не обрабатываются \"\n\"специальным образом (нет «магии» с поддоменами, как в шаблоне хоста)\"\n\".<br>Таким образом шаблон <code>*://*.example.com/*</code> соответствует \"\n\"http://www.example.com/ но <b>не соответствует</b> http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"Регулярное выражение URL\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Сопоставляет URL-адрес с помощью чрезвычайно мощных <a href='https://www.\"\n\"google.ru/search?q=регулярные%20выражения'>регулярных выражений</\"\n\"a>.<br>Однако, регулярные выражения сложно составлять (и читать).<br>В \"\n\"большинстве случаев рекомендуется использовать шаблоны, а регулярные \"\n\"выражения использовать только для тех случаев, где без них невозможно \"\n\"обойтись.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Ключевое слово\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"Соответствует значению ключевого слова для URL с протоколом HTTP, а слово \"\n\"является частью URL-адреса.<br>Он ведёт себя подобно шаблону URL. Пример: \"\n\"<code>http://*<b>ключевое слово</b>*</code>.<br>Ключевые слова полезны, если \"\n\"вы хотите обойти брандмауэр, блокирующий некоторые ключевые слова в URL-\"\n\"адресе, запрашивая такие URL-адреса через прокси.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Отключено)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Условие игнорируется при сопоставлении)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"Вы можете отключить условие, установив его тип в состояние \"\n\"<code>(Отключено)</code>. Отключённое условие действует так, как если бы его \"\n\"не существовало.<br>Эту функцию можно использовать для временного отключения \"\n\"условий.<br>Отключённые условия по-прежнему содержат информацию (например, \"\n\"шаблоны) и могут быть повторно включены путём возврата к предыдущему типу.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Текущее время\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Соответствует, если текущее местное время находится в диапазоне, \"\n\"определяемом <b>начальным часом</b> и <b>конечным часом</b>, \"\n\"включительно.<br>Местное время, начальный час и конечный час рассчитываются \"\n\"в <b>24-часовом</b> формате (<b>от 0 до 23</b>).<br>Расчёт происходит \"\n\"примерно в момент отправки запроса.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"День недели\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Соответствует, если <b>текущий день недели</b> выбран в деталях условия. \"\n\"День рассчитывается в соответствии с местным часовым поясом.<br>Запрос и его \"\n\"URL-адрес не имеют значения для этого условия. Результат основывается \"\n\"исключительно на дне недели, когда отправляется запрос.\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Полное соответствие URL-адреса больше не возможно для <code>https://</code>, \"\n\"начиная с Chrome 52. <a href='https://github.com/FelisCatus/SwitchyOmega/\"\n\"wiki/Chromium-Full-URL-Limitation'>Узнать больше…</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Хост\"\n\nmsgid \"condition_group_url\"\nmsgstr \"URL-адрес\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Особые\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Переключающийся\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"Автопрокси\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Отсутствует директива «@with result»!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Неизвестный профиль: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Отсутствует имя профиля в строке $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Некорректное правило в строке $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Отсутствует правило для условия «*»!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Закрыть\"\n\nmsgid \"dialog_save\"\nmsgstr \"Сохранить изменения\"\n\nmsgid \"dialog_ok\"\nmsgstr \"ОК\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Отмена\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Очистить\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Восстановить\"\n\nmsgid \"options_title\"\nmsgstr \"Параметры SwitchyOmega\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Настройки\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Профили\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Действия\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Интерфейс\"\n\nmsgid \"options_tab_general\"\nmsgstr \"Основные\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Импорт и экспорт\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Новый профиль…\"\n\nmsgid \"options_apply\"\nmsgstr \"Применить изменения\"\n\nmsgid \"options_discard\"\nmsgstr \"Отклонить изменения\"\n\nmsgid \"options_reset\"\nmsgstr \"Сбросить параметры\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Прочие настройки\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Требовать подтверждения при удалении условия.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Обновить текущую вкладку при изменении профиля.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\"Узнавать прокси, использованный для элемента страницы, через контекстное \"\n\"меню.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\"Помещать новые условия, добавленные через всплывающее окно, в низ списка.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Горячая клавиша\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Нажатие горячей клавиши откроет всплывающее меню SwitchyOmega. (По умолчанию \"\n\"Alt+Shift+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"Элементы всплывающего меню также доступны с клавиатуры. Находясь в меню, \"\n\"нажмите ? (или /) , чтобы узнать больше.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Настройка горячей клавиши\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Настройки переключения\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Профиль при запуске\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Текущий профиль)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Показывать расширенные типы условий\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Разблокирует новые типы передовых, но сложных условий переключения. Для \"\n\"большинства сценариев основных типов условий должно быть достаточно, поэтому \"\n\"включать этот параметр не рекомендуется.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Быстрое переключение\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"Задействованные профили\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"Когда вы нажмёте на значок (или используете горячую клавишу), следующие \"\n\"профили будут применяться в заданном порядке.\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"Вам нужно выбрать минимум 2 профиля, чтобы включить эту функцию! Вы можете \"\n\"перетащить их из поля ниже.\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Незадействованные профили\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Изменения прокси\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Отменить изменения прокси, сделанные другими приложениями.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Конфликты\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Иногда другие приложения также пытаются управлять настройками прокси, что \"\n\"приводит к конфликтам. Обратите внимание, что блокировщики рекламы и другие \"\n\"расширения тоже могут задавать свои настройки прокси. Таких конфликтов \"\n\"избежать невозможно в силу глубинной природы браузера.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"Такая красная метка на значке SwitchyOmega указывает, что другое приложение \"\n\"имеет более высокий приоритет, поэтому SwitchyOmega не может управлять \"\n\"настройками. Попробуйте удалить и переустановить SwitchyOmega. Это должно \"\n\"повысить его приоритет. Если после переустановки вы все ещё видите \"\n\"предупреждение, рассмотрите возможность удаления другого приложения, \"\n\"вызывающего конфликт.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"Если SwitchyOmega имеет более высокий приоритет, вы можете вернуть \"\n\"управление другим приложениям или системным настройкам, выбрав \"\n\"$SYSTEMPROFILE$ в всплывающем меню.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\"Показывать пункт всплывающего меню для импорта настроек прокси из других \"\n\"приложений.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"Когда выбран $SYSTEMPROFILE$, вы можете импортировать действующие настройки \"\n\"прокси из других приложений, выбрав $EXTERNALPROFILE$ в всплывающем меню. \"\n\"Настройки будут импортированы, как профиль, с указанным вами именем. \"\n\"Обратите внимание, что импортированный профиль является слепком, и не будет \"\n\"отражать какие-либо изменения, сделанные после импорта в исходном приложении.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Сетевые запросы\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Показывать счётчик неудавшихся веб-запросов на текущей вкладке.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"Если какие-то ресурсы не удалось загрузить, на значке появится жёлтый \"\n\"счётчик.<br>Вы можете настроить профиль для таких ресурсов через всплывающее \"\n\"меню.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Параметры загрузки\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"Настройка частоты обновления онлайн-списков правил и сценариев PAC.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Интервал загрузки\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 минут\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 час\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 часа\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 часов\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 часов\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Ежедневно\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Никогда\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Профиль\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Экспортировать как PAC-файл\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Экспортируйте текущий профиль как PAC-файл, чтобы использовать его в других \"\n\"браузерах.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\"Чтобы экспортировать профиль, используйте панель действий в верхнем правом \"\n\"углу страницы профиля.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Экспортировать списки правил, используя совместимый с Proxy Switchy!/\"\n\"SwitchyPlus/SwitchySharp формат, когда это возможно.\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Включайте эту функцию, только если вы публикуете списки правил для \"\n\"пользователей этих проектов.<br>Не стесняйтесь советовать вашим знакомым \"\n\"перейти на SwitchyOmega.\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Настройки\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Создать резервную копию\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Создание полной резервной копии ваших параметров (включая профили и все \"\n\"другие настройки).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Восстановить из файла\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\"Восстановление настроек SwitchyOmega из локального файла резервной копии.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Восстановить по сети\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"URL-адрес файла параметров (например, http://example.com/switchy.bak)\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Восстановить\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Синхронизация (экспериментально)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Включить синхронизацию\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Скачать синхронизированное\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Отключить синхронизацию\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Очистить сетевую копию\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"Теперь вы можете автоматически синхронизировать ваши настройки и профили на \"\n\"всех своих компьютерах с браузером Chrome.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\"Ваши параметры автоматически синхронизируются с другими вашими устройствами.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Обратите внимание, что вы должны войти в Chrome на каждом из ваших устройств \"\n\"(включая это), чтобы синхронизация действительно работала.<br>Вы можете \"\n\"проверить этот раздел на других устройствах, чтобы убедиться, что он \"\n\"работает.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"Вы загрузили копию ваших параметров на другое устройство с помощью \"\n\"синхронизации.\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"Вы можете загрузить сетевую копию на своё устройство, если \"\n\"хотите.<br>Учтите, что это приведёт к <b>перезаписи существующих настроек и \"\n\"профилей</b> на данном устройстве.\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Параметры синхронизации не поддерживаются на вашей платформе или в браузере. \"\n\"На данный момент поддерживается только браузер Chrome для настольных \"\n\"устройств.\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Синхронизация отключена для этого профиля.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\"Синхронизация отключена для этого профиля из-за использования слишком \"\n\"большого объёма памяти.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Профиль: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Переименовать\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Удалить\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Опубликовать список правил\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Экспортировать правила переключения в текстовом формате для публикации.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Экспортировать PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Тип профиля $TYPE$ не поддерживается!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"Возможно, параметр испорчен, или он из новой версии программы.\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Изменить исходный код\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Показать справку о формате исходного кода\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Прокси-сервера\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Схема\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Протокол\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Сервер\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Порт\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Аутентификация\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\"Ваш браузер НЕ поддерживает аутентификацию прокси $PROTOCOLDISP$! \"\n\"Пожалуйста, не сообщайте об этой проблеме в SwitchyOmega. Вместо этого \"\n\"обратитесь в службу поддержки вашего браузера.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Внимание: имя пользователя/пароль могут быть отправлены на непредсказуемые \"\n\"серверы, возвращённые PAC-скриптом.\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Убедитесь, что вы доверяете скрипту по указанному выше URL-адресу, перед \"\n\"вводом конфиденциальных учётных данных.\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Убедитесь, что вы доверяете приведённому ниже скрипту, прежде чем \"\n\"предоставлять конфиденциальные учётные данные.\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"К тому же, использование этого профиля в других профилях (например, «\"\n\"Переключаемого профиля») может привести к отправке имени пользователя/пароля \"\n\"на прокси-сервера, настроенные в других профилях.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(по умолчанию)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"НАПРЯМУЮ\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(настройки по умолчанию)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Использовать прокси выше для всех протоколов.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Показать расширенный вид\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Список исключений\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Сервера, для которых не надо использовать прокси (один сервер на строку):\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Доступны шаблоны и прочее…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"URL-адрес PAC\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"PAC-скрипт будет обновляться с этого URL-адреса. Если его оставить пустым, \"\n\"будет использоваться следующий скрипт.\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"Профили PAC с файлом: URL-адреса могут применяться только напрямую. Они не \"\n\"могут использоваться в качестве профилей результатов, так как доступ к \"\n\"локальным файлам невозможен из-за ограничений браузера.\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Поэтому вы не можете использовать локальный файл PAC для данного профиля. Вы \"\n\"можете создать новый профиль PAC, если это действительно нужно.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC-скрипт\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC-скрипт загружен $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"PAC-скрипт устарел так как URL был изменён. Нажмите кнопку загрузки выше для \"\n\"обновления.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Виртуальный профиль\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Цель\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"Когда этот профиль применяется, он действует точно так же, как профиль, \"\n\"выбранный ниже.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Перенести в виртуальный профиль\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Заменить целевой профиль\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"Вы можете перенести существующие параметры, чтобы использовать этот \"\n\"виртуальный профиль вместо $PROFILE$. Это обновит все существующие правила, \"\n\"относящиеся к $PROFILE$, и укажет их на этот виртуальный профиль, чтобы их \"\n\"профиль результатов можно было контролировать здесь.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Настройка списка правил\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Формат списка правил\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Итоговые профили списка правил\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Сопоставить профиль\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Профиль по умолчанию\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"URL-адрес списка правил\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"Список правил будет обновлён с этого URL-адреса. Если оставить его пустым, \"\n\"будет анализироваться следующий текст.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Текст списка правил\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Список правил загружен $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Список правил устарел из-за изменения URL-адреса. Нажмите кнопку загрузки \"\n\"выше, чтобы обновить.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Правила переключения\"\n\nmsgid \"options_sort\"\nmsgstr \"Сортировка\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Тип условия\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Показать справку\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Подробности условия\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Профиль\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Действия\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Добавить условие\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Копировать\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Заметка\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Правила списка правил\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Любой запрос, соответствующий списку правил ниже)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Правила списка правил ОТКЛЮЧЕНЫ)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"По умолчанию\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ уровни хоста ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ текущий час ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Вс\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Пн\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Вт\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"Ср\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Чт\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Пт\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Сб\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"О типах условий\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Импортировать онлайн-список правил\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Добавить список правил\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"Вы можете повторно использовать онлайн-набор условий, опубликованных \"\n\"другими, добавив список правил.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Добро пожаловать в SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"Вы успешно установили SwitchyOmega, лучший инструмент для настройки прокси.\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Пожалуйста, сообщите SwitchyOmega ваши прокси на странице параметров. Это \"\n\"делается так.\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"Вы успешно обновились до SwitchyOmega. Не волнуйтесь, ваши настройки в \"\n\"целости и сохранности.\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\"Теперь давайте пройдёмся по краткому руководству на странице новых \"\n\"параметров.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Далее\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Готово\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Пропустить руководство\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Применить параметры\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Ваши изменения параметров не были сохранены и будут потеряны, если вы \"\n\"продолжите!\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Вы должны применить изменения настроек, прежде чем продолжить.\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Сохранить и применить параметры?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Переименовать профиль\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"Новое имя профиля\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"Профиль с данным именем уже существует.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Имена профилей, начинающиеся с двойного подчёркивания, зарезервированы.\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Профили с именами, начинающимися с подчёркивания, будут скрыты во \"\n\"всплывающем меню. Тем не менее, они могут использоваться, например, в \"\n\"переключаемом профиле.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Заменить профиль\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Заменить профиль\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Заменить $FromProfile$ на $ToProfile$?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"Если вы продолжите, все правила, указывающие на $FromProfile$, будут \"\n\"обновлены для использования $ToProfile$. Другие параметры, такие как профиль \"\n\"при запуске и быстрое переключение, также будут изменены соответствующим \"\n\"образом. Однако сами два профиля НЕ будут изменены или удалены.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Параметры обновлены.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Удалить профиль\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Удалить следующий профиль?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Невозможно удалить профиль\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"Этот профиль нельзя удалить, так как на него ссылаются следующие профили:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"Вы должны изменить эти профили и заставить их перестать ссылаться на этот \"\n\"профиль, прежде чем сможете его удалить.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"Имя профиля не может быть пустым.\"\n\nmsgid \"popup_title\"\nmsgstr \"Всплывающее окно SwitchyOmega\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Аутентификация прокси\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Имя пользователя\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Пароль\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Показать пароль\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Скрыть пароль\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"Без аутентификации\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Удалить правило\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Вы действительно хотите удалить следующее правило?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Удалить\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Сбросить правила\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"Установить итоговый профиль ВСЕХ правил для следующего профиля?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Сбросить правила\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Установить профиль для всех правил\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Удалить список правил\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Удалить список правил из текущего профиля?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ строк(и) правил\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Удалить список правил\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Новый профиль\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Имя профиля\"\n\nmsgid \"options_profileType\"\nmsgstr \"Выберете тип профиля:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Профиль прокси\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Туннелирование трафика через прокси-сервера.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"Профиль PAC\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Выбор прокси на основе онлайн/локального PAC-скрипта.\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"Это может понадобится только если у вас есть PAC-скрипт или его URL-адрес. \"\n\"Не пытайтесь создать скрипт, если у вас нет знаний о PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Переключаемый профиль\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Автоматическое применение различных профилей в различных условиях, таких как \"\n\"домены или шаблоны.\\n\"\n\" Вы также можете импортировать опубликованные в онлайн правила для более \"\n\"удобного переключения. (Заменяет режим автопереключение + список правил.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Профиль списка правил\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\"Используется онлайн-набор условий, опубликованных другими пользователями.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Виртуальный профиль\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"Виртуальный профиль может действовать, при необходимости, как любой другой \"\n\"профиль. Он хорошо работает с «Переключаемым профилем», позволяя вам \"\n\"изменить результат нескольких условий одним щелчком мыши.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Создать\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Сбросить параметры\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"Сбросить параметры? Все профили и настройки будут потеряны!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Пожалуйста, исправьте ошибки на этой странице.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"Профиль $PROFILE$ не существует! Параметры могут быть повреждены.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Параметры сброшены.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Параметры сохранены.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Параметры импортированы.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Некорректная резервная копия!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Ошибка при загрузке резервной копии!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Профиль успешно обновлён.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Ошибка при загрузке данных профиля!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"При обновлении произошла сетевая ошибка.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"При обновлении произошла ошибка HTTP ($STATUS$).\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"URL-адрес профиля не найден на сервере. Пожалуйста, перепроверьте его.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"При обновлении удалённый сервер сообщил ошибку ($STATUS$).\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\"Загруженные данные неверны! Вы можете открыть URL-адрес профиля в своём \"\n\"браузере, чтобы проверить его.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Загрузить профиль сейчас\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"<b>Профиль прокси</b> содержит настройки, такие как IP-адрес и порт сервера \"\n\"для прокси.<br>Профили – это основные элементы конфигурации в \"\n\"SwitchyOmega.<br>Мы уже создали пример профиля для вас. Попробуйте открыть \"\n\"его.\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"Вы можете здесь указать свой прокси-сервер и порт.<br>SwitchyOmega<b> не \"\n\"поставляется с какими-либо прокси серверами</b>.<br>Обратитесь к своему \"\n\"сетевому провайдеру или к руководству по настройки прокси, если не знаете, \"\n\"что делать дальше.\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"Вы можете попросить SwitchyOmega автоматически переключаться между прокси-\"\n\"серверами с помощью мощного <b>Переключаемого профиля</b>.<br>Однако, его \"\n\"функции не могут быть рассмотрены в этом кратком руководстве.<br>Вы можете \"\n\"открыть этот профиль, чтобы познать его мощь чуть позже.\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Нужно больше профилей? Вы всегда можете добавить больше <b>прокси, \"\n\"переключений и других профилей</b><br>для удовлетворения всех своих \"\n\"потребностей проксирования.<br>Наслаждайтесь прокси!\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega может применять различные профили к запросам на основе \"\n\"<b>условий</b>.<br>Например, условие <b>Шаблон хоста</b> позволяет вам \"\n\"установить профиль для всех URL-адресов в домене.\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"Вы можете использовать различные типы условий, чтобы соответствовать хосту \"\n\"или полному URL-адресу.<br>Нажмите на знак вопроса, чтобы открыть ссылку на \"\n\"тип.\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega применяет выбранный профиль здесь к <b>любому запросу, \"\n\"соответствующему условию</b>.<br>Специальный профиль <b>[Напрямую]</b> \"\n\"приведёт к отправке запроса без какого-либо прокси.\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"Если к какому-либо запросу не применяются никакие условия, будет \"\n\"использоваться профиль «По умолчанию».<br>Условия всегда рассматриваются по \"\n\"порядку <b>сверху вниз</b>.<br>Вы можете изменить их порядок, перетаскивая \"\n\"значок сортировки.\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"Завершив настройку профиля переключения, не забудьте <b>переключиться на \"\n\"него во всплывающем меню</b>.<br/> Значок покажет вам <b>применённый</b> \"\n\"профиль для текущей вкладки.<br/><b>Наведение курсора</b> на значок откроет \"\n\"всплывающую подсказку с подробностями.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(Внешний профиль)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"имя профиля\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"Настройки прокси контролируются другими приложениями или расширениями. \"\n\"Отключите или удалите эти приложения или расширения.\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"Настройки прокси отменяются системой. Свяжитесь с вашим администратором.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"Не удалось выставить настройки прокси. Проверьте вашу систему и настройки \"\n\"браузера.\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"Настройки прокси отключены явным запросом других приложений или расширений.\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\"Настройки прокси теперь контролируются более новой версией SwitchyOmega.\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"Вы не можете переключать профили с помощью SwitchyOmega, пока не решите \"\n\"описанную проблему.\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"Вы не можете включить две (или более) версии SwitchyOmega одновременно. \"\n\"Отключите одну из них.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Управление расширениям\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Добавить условие к\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Добавить условие\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Параметры\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Сообщить о неполадках\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Сохранить журнал ошибок\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ неудачных ресурсов\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Ресурсы, которые не удалось загрузить\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"Невозможно загрузить несколько ресурсов из-за проблем с сетью, прокси-\"\n\"сервером или веб-страницей.\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"SwitchyOmega просто сообщает о них, а не является причиной.\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"Вы можете просмотреть следующие домены и использовать прокси для них при \"\n\"необходимости.\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"Вы можете добавить условия переключения для них только при использовании «\"\n\"Переключаемого профиля».\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Настроить монитор сети\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Использовать этот профиль для всех выбранных доменов\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\"Профили PAC НЕ будут работать в Mozilla Firefox из-за технических \"\n\"ограничений!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Напишите свой комментарий над этой строкой.-->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC-скрипт)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(управляется другими расширениями или окружением)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(не использовать никаких прокси)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(переключение на основе условий)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(переключение на основе правил)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ОШИБКА: для загрузки сохранённых параметров требуется более новая версия \"\n\"SwitchOmega.\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\"ОШИБКА: сохранённые параметры повреждены. Нажмите здесь, чтобы СБРОСИТЬ \"\n\"ПАРАМЕТРЫ.\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Предупреждение: невозможно загрузить PAC-скрипт и/или список правил.\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\"Замечание: в данный момент, настройки прокси контролируются другим \"\n\"приложением.\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Проверить] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(по умолчанию)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"НАПРЯМУЮ\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Проверить прокси, использованный для этой страницы\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Проверить прокси, использованный для этого фрейма\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Проверить прокси для открытия этой ссылки\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Проверить прокси, использованный для этого элемента\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Включить быстрое переключение\"\n\nmsgid \"about_title\"\nmsgstr \"О расширении\"\n\nmsgid \"about_app_description\"\nmsgstr \"Инструмент настройки прокси\"\n\nmsgid \"about_version\"\nmsgstr \"Версия $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\"Поддержка Mozilla Firefox экспериментальная! Если у вас возникли проблемы, \"\n\"сообщите о них с помощью кнопок ниже.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega не предоставляет прокси, VPN или другие сетевые сервисы.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\"SwitchyOmega не отслеживает вас и не вставляет рекламу в веб-страницы. \"\n\"Пожалуйста, ознакомьтесь с нашей <a href='https://github.com/FelisCatus/\"\n\"SwitchyOmega/wiki/Privacy#english'>политикой конфиденциальности</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\"Остались вопросы? Нужна помощь с использованием SwitchyOmega? Смотрите наш \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>ЧаВО</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\"Авторское право 2012-2017 <a href='https://github.com/FelisCatus/\"\n\"SwitchyOmega/blob/master/AUTHORS'>Авторы SwitchyOmega</a>. Все права \"\n\"защищены.\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\"SwitchyOmega стала возможной благодаря проекту <a href='https://github.com/\"\n\"FelisCatus/SwitchyOmega'>SwitchyOmega</a> с открытым исходным кодом и \"\n\"другому <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/\"\n\"AUTHORS'>программному обеспечению с открытым исходным кодом</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega – это <a href='https://www.gnu.org/philosophy/free-\"\n\"sw.en.html'>бесплатное программное обеспечение</a>, лицензируемое на \"\n\"условиях <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public \"\n\"License</a> Версии 3 или более поздней.\"\n"
  },
  {
    "path": "omega-locales/si/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2021-02-27 11:50+0000\\n\"\n\"Last-Translator: HelaBasa <R45XvezA@protonmail.ch>\\n\"\n\"Language-Team: Sinhala <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/si/>\\n\"\n\"Language: si\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.5\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"පූරණය වෙමින්…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"\"\n\nmsgid \"profile_direct\"\nmsgstr \"\"\n\nmsgid \"profile_system\"\nmsgstr \"\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"දැන් වේලාව\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/sk/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2021-03-05 14:50+0000\\n\"\n\"Last-Translator: Patrik Kollár <nefray.pk@gmail.com>\\n\"\n\"Language-Team: Slovak <https://hosted.weblate.org/projects/switchyomega/main/\"\n\"sk/>\\n\"\n\"Language: sk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 4.5.1-dev\\n\"\n\n#, fuzzy\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\n#, fuzzy\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Spravuj a prepínaj medzi viacerými proxy rýchlo a jednoducho.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Načítavanie…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"\"\n\nmsgid \"profile_direct\"\nmsgstr \"\"\n\nmsgid \"profile_system\"\nmsgstr \"\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/sl/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2016-05-12 10:47+0000\\n\"\n\"Last-Translator: Štefan Baebler <stefan.baebler@gmail.com>\\n\"\n\"Language-Team: Slovenian \"\n\"<https://hosted.weblate.org/projects/switchyomega/main/sl/>\\n\"\n\"Language: sl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || \"\n\"n%100==4 ? 2 : 3;\\n\"\n\"X-Generator: Weblate 2.7-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Nalaganje…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Samodejna izbira\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Neposredno]\"\n\nmsgid \"profile_system\"\nmsgstr \"\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Literals\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Matches the request if and only if the host is a <b>literal</b> IP address and\"\n\" in the subnet as specified by <a href='\"\n\"https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation'>\"\n\"CIDR notation</a>.<br>For example, given the rule <code>127.0.0.1/16</code>, \"\n\"it matches all IP addresses like <code>127.0.*.*</code>.<br>\"\n\"So <code>127.0.0.1</code> matches while <code>127.1.0.0</code> does not. \"\n\"Host names like <code>localhost</code> will never match because they are \"\n\"<b>not</b> IP literals.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Full URL matching is no longer possible for <code>https://</code> \"\n\"URLs as of Chrome 52. \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation'>\"\n\"Learn more...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \"\"\n\nmsgid \"condition_group_host\"\nmsgstr \"\"\n\nmsgid \"condition_group_url\"\nmsgstr \"\"\n\nmsgid \"condition_group_special\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"\"\n\nmsgid \"dialog_save\"\nmsgstr \"\"\n\nmsgid \"dialog_ok\"\nmsgstr \"\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"\"\n\nmsgid \"options_title\"\nmsgstr \"\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"\"\n\nmsgid \"options_tab_general\"\nmsgstr \"\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"\"\n\nmsgid \"options_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_apply\"\nmsgstr \"\"\n\nmsgid \"options_discard\"\nmsgstr \"\"\n\nmsgid \"options_reset\"\nmsgstr \"\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Conflicts\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\nmsgid \"options_sort\"\nmsgstr \"\"\n\nmsgid \"options_conditionType\"\nmsgstr \"\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"\"\n\nmsgid \"options_addCondition\"\nmsgstr \"\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Uporabniško ime\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Geslo\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"Brez preverjanja pristnosti\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Izbriši pravilo\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Ali res želite izbrisati to pravilo?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Izbriši\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Ponastavitev pravil\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Ponastavitev pravil\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Nov profil\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Ime profila\"\n\nmsgid \"options_profileType\"\nmsgstr \"Izberite vrsto profila:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"A network error occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"An HTTP error ($STATUS$) occurred when updating.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"The Profile URL was not found on the server. Please double-check.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"The remote server responded with error ($STATUS$) when updating.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"The downloaded data is invalid! \"\n\"You may open the Profile URL in your browser to inspect it.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"PAC Profiles WILL NOT work in Mozilla Firefox due to technical limitations!\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"About\"\n\nmsgid \"about_app_description\"\nmsgstr \"A proxy configuration tool\"\n\nmsgid \"about_version\"\nmsgstr \"Version $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox support is highly experimental! If you encounter issues, please report using the buttons below.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega does not provide proxies, VPNs, or other network services.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega does not track you or insert ads into webpages. Please see\"\n\" our <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#english'>privacy policy</a>.\"\n\nmsgid \"about_help\"\nmsgstr \"Other questions? Need help with using SwitchyOmega? Please see our \"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ'>FAQ</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"Copyright 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. All rights reserved.\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega is made possible by the <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> open source project and other <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>open source software</a>.\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega is <a href='https://www.gnu.org/philosophy/free-sw.en.html'>free software</a> licensed under <a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> Version 3 or later.\"\n"
  },
  {
    "path": "omega-locales/tr/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2020-08-03 04:41+0000\\n\"\n\"Last-Translator: ozgurulukir <ozgur.ulukir@gmail.com>\\n\"\n\"Language-Team: Turkish <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/tr/>\\n\"\n\"Language: tr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 4.2-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"\"\n\"Birden çok vekil sunucuyu yönet ve aralarında kolayca ve hızlıca geçiş yap.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Yükleniyor…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Otomatik Geçiş\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Doğrudan]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Sistem Vekil Sunucusu]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"Sunucu joker karakteri\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Sunucuları (alan adlarını) joker karakteriyle eşler.<br><b>Yıldız karakteri \"\n\"<code>*</code></b> sıfır ya da daha fazla karaktere denk gelir.<br><b>Soru \"\n\"işareti <code>?</code></b> tam olarak tek karaktere denk gelir.<br><br>Şu \"\n\"şekilde <code>*.</code> başlayan kurallar sadece Sunucu joker eşleme \"\n\"koşulları için geçerlidir.<br>Örnek: <code>*.ornek.com</code> www.ornek.com \"\n\"<b>VE ornek.com için eşlenecektir.</b><br>Sadece altalan adlarını eşlemek \"\n\"için <b>only</b>, <b>iki</b> yıldız karakteri kullanın: \"\n\"<code>**.ornek.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Sunucu düzenli ifadesi\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Sunucu seviyeleri\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"İstek sadece sunucu seviyesi(host level) belirtilen aralıkta ise eşleşir .\\n\"\n\"<br>Tanımlanan sunucu seviyesi <b>nokta ile ayrılmış bölümlerin sayısı</b> \"\n\"sunucu (domain adı).<br>Örnek: <code>www.example.com</code> kodunun sunucu \"\n\"seviyesi 3 iken,  <code>internal</code> kodunun sunucu seviyesi 1'dir .\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP Değişmezleri\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Gönderilen istek, sunucu istenilen şartlarda bir IP adresine sahipse ve alt \"\n\"ağda ise yani<a href='https://en.wikipedia.org/wiki/Classless_Inter-\"\n\"Domain_Routing#CIDR_notation'>CIDR notation</a>adresinde belirtilen \"\n\"özelliklere sahipse eşleşme gerçekleşir.<br>Örneğin,  <code>127.0.0.1/\"\n\"16</code>şartı mevcut olsun. Bu şarta <code>127.0.*.*</code> ile başlayan \"\n\"tüm IP'ler uyar yani eşleşme başarılı olur.<br>Bu \"\n\"yüzden<code>127.0.0.1</code> IP'si belirtilen kurala uyarken \"\n\"<code>127.1.0.0</code> IP'si kurala uymaz. <code>localhost</code> Şeklinde \"\n\"bir ada sahip olan sunucularda ise asla eşleşme gerçekleşmez çünkü istenilen \"\n\"şartlarda bir IP adresine sahip değillerdir.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"URL wildcard\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"URL eşlemesi <a href='https://www.google.com/search?q=regular%20expression'>\"\n\"düzenli ifadeler</a> ile güçlüdür.<br>Ancak, düzenli ifadelerin \"\n\"oluşturulması (ve okunması) zor olabilir.<br>Çoğu durumda joker karakter \"\n\"kullanmanız ve yalnızca başka bir koşul türüyle elde edilemeyen koşullar \"\n\"için kurallı ifade kullanmanız önerilir.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Anahtar Kelime\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(Devre dışı)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Eşleme sırasında koşul görmezden gelindi)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Mevcut Zaman\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"Haftanın Günü\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"Sunucu\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Url\"\n\nmsgid \"condition_group_special\"\nmsgstr \"Özel\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Değiştirilebilir\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Bilinmeyen profil: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"$LNO$ nolu satırda geçersiz kural: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"Kapat\"\n\nmsgid \"dialog_save\"\nmsgstr \"Değişikleri Kaydet\"\n\nmsgid \"dialog_ok\"\nmsgstr \"Tamam\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"İptal\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Temizle\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Eski Haline Getir\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega Seçenekler\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Ayarlar\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Profiller\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Hareketler\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"Arayüz\"\n\nmsgid \"options_tab_general\"\nmsgstr \"General\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"İçe veya Dışa Aktar\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Yeni profil…\"\n\nmsgid \"options_apply\"\nmsgstr \"Değişiklikleri uygula\"\n\nmsgid \"options_discard\"\nmsgstr \"Değişiklikleri yoksay\"\n\nmsgid \"options_reset\"\nmsgstr \"Seçenekleri sıfırla\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Diğer Seçenekler\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Koşula bağlı silinmeyi onayla.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Profil güncellendiğinde mevcut sekmeyi yenile.\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Klavye Kısayolu\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Kısayolu ayarla\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"Geçiş Seçenekleri\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Başlangıç Hesabı\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Geçerli profil)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Gelişmiş koşul tiplerini göster\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Yeni tip gelişmiş ancak karmaşık geçiş koşullarının kilidini açar. Çoğu \"\n\"senaryoda, temel koşul türleri yeterli olmalıdır, bu yüzden bu seçenek \"\n\"önerilmez.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Hızlı Geçiş\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Çakışmalar\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Ağ İstekleri\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"İndirme Seçenekleri\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"İndirme zaman aralığı\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 Dakika\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 Saat\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 Saat\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 Saat\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 Saat\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Her gün\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Asla\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Profil\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"PAC Dosyası Olarak Dışa Aktar\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Geçerli profili PAC dosyası olarak dışa aktar, böylece diğer tarayıcılarda \"\n\"kullanabilirsin.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"Ayarlar\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Yedek oluştur\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Tüm ayarlarının tam bir yedeğini oluştur (profiller ve diğer seçenekler \"\n\"dahil).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Dosyadan eski haline getir\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"SwitchyOmega seçeneklerini bir dosyadan eski haline getir.\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"Çevirimiçi eski haline getir\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Seçenekler dosyası bağlantısı (ör. 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Eski haline getir\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"Eşitleniyor (Deneysel)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Eşitlemeyi Etkinleş\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Eşitlemeden İndir\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Eşitlemeyi pasifleştir\"\n\nmsgid \"options_syncReset\"\nmsgstr \"Uzak kopyayı temizle\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Bu profil için eşitleme pasifleştirildi.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\"Çok fazla depolama alanı kullanması sebebiyle bu profil için eşleme \"\n\"pasifleştirildi.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Profil :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Yeniden adlandır\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Sil\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Kural listesini yayınla\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Geçiş kurallarını metin biçiminde yayınlama için dışa aktar.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"PAC Dışa Aktar\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Desteklenmeyen profil türü $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"Kaynak kodunu düzenle\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Kaynak kodu biçimi hakkında yardım göster\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Proxy servers\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Şema\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Protokol\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Sunucu\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Port\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"Kimlik doğrulama\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(varsayılan)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(varsayılanı kullan)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Gelişmişi Göster\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Baypas Listesi\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Joker karakterleri ve daha fazlası…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC Bağlantısı\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC Betiği\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC betiği indirilme zamanı $TIME$:\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Sanal Profil\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Hedef\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"Bu profil uygulandığında, aşağıda seçilen profille tamamen aynı şekilde \"\n\"hareket eder.\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Sanal Profile Taşı\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Hedef profille yer değiştir\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Kural Listesi Ayarı\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Kural Listesi Biçimi\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Kural listesi sonuç profilleri\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Profili eşle\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Varsayılan profil\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Kural Listesi Bağlantısı\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Kural Listesi Metni\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Kural listesi indirilme zamanı $TIME$:\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Geçiş kuralları\"\n\nmsgid \"options_sort\"\nmsgstr \"Sırala\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Koşul Türü\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Yardım göster\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Koşul Detayları\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Profil\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Actions\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Koşul ekle\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Kopya\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Kural listesi kuralları\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Kural listesi kuralları PASİFLEŞTİRİLDİ)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"Default\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ geçerli saat ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Su\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Mo\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Tu\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"We\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Th\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Fr\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Sa\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"Koşul Türleri Hakkında\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Çevirimiçi kural listelerini içe aktar\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Kural listesi ekle\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"SwitchyOmega'ya Hoşgeldiniz\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Sonraki\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Tamamlandı\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Kılavuzu geç\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Seçenekleri Uygula\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Seçenekleri kaydetmek ve uygulamak istiyor musun?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Profili Yeniden Adlandır\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"Yeni profil adı\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"Bu adda bir profil zaten var.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Profili Yer Değiştir\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Profili Yer Değiştir\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\"Gerçekten $FromProfile$ profilini $ToProfile$ ile yer değiştirmek istiyor \"\n\"musun?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Seçenekler güncellendi.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Profil Sil\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Aşağıdaki profili gerçekten silmek istiyor musun?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Profil Silinemedi\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"Bu profil silinemez, çünkü aşağıdaki profillerle bağlantılı:\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"Bu profilleri değiştirmeli ve silmeden önce bu profille bağlantılarını \"\n\"durdurmalısınız.\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"Profil adı boş olamaz.\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega Açılır Pencere\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"Proxy Authentication\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Kullanıcı adı\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Password\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Parolayı göster\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Parolayı gizle\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"No Authentication\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Kuralı Sil\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Aşağıdaki kuralı silmek istediğine emin misin?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Delete\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Kuralları sıfırla\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Kuralları sıfırla\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Tüm kurallar için profil ayarla\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Kural Listesini Kaldır\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Geçerli profilden kural listesini gerçekten kaldırmak istiyor musun?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ satır kural\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Kural listesini kaldır\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Yeni Profil\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Profil adı\"\n\nmsgid \"options_profileType\"\nmsgstr \"Lütfen profil türü seç:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Proxy Profili\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC Profili\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Profile Geç\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Kural Listesi Profili\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Sanal Profil\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Oluştur\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Reset Options\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Seçenekleri gerçekten sıfırlamak istiyor musun? Tüm profiller ve ayarlar \"\n\"kaybedilecek!\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"Lütfen sayfadaki hataları düzeltin.\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"$PROFILE$ profili yok! Seçenekler bozulmuş olabilir.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Options reset.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Seçenekler kaydedildi.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Seçenekler içe aktarıldı.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Geçersiz yedek dosyası!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Yedek dosyası indirirken hata!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Profil güncellendi.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Profil verisi indirilirken hata!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"Güncelleme sırasında ağ hatası oluştu.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"Güncelleme sırasında HTTP ($STATUS$) hatası oluştu.\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"Profil bağlantısı sunucuda bulunamadı. Lütfen tekrar kontrol edin.\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"Güncelleme sırasında uzak sunucu ($STATUS$) hatası verdi.\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Profili Şimdi İndir\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(Harici Profil)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"profile adı\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Uzantıları yönet\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Şuraya koşul ekle\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Koşul ekle\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Options\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Hataları raporla\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Hata kayıtlarını kaydet\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Yüklemesi başarısız olan kaynaklar\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Ağ İzleyicisini Yapılandır\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Bu profili seçilen alan adları için kullan\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- Yorumunuzunu bu satırın ÜSTÜNE yazın. -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC betiği)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(diğer uzantılar veya çevre değişkenleri tarafından kontrol ediliyor)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(hiçbir proxy kullanmıyor)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(şart temelli geçiş yapma)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(kural listesi temelli geçiş yapma)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(default)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"DIRECT\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Hızlı Geçişi Etkinleştir\"\n\nmsgid \"about_title\"\nmsgstr \"Hakkında\"\n\nmsgid \"about_app_description\"\nmsgstr \"Proxy yapılandırma aracı\"\n\nmsgid \"about_version\"\nmsgstr \"Sürüm $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\"Mozilla Firefox seteği yüksek oranda deneyseldir! Hatalar ile \"\n\"karşılaşırsanız, aşağıdaki düğmeleri kullanarak lütfen raporlayın.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega proxy, VPN veya diğer ağ servislerini sağlamaz.\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\"SwitchyOmega sizi takip etmez veya internet sitelerine reklam yerleştirmez. \"\n\"Lütfen <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/\"\n\"Privacy#english'>gizlilik politikası</a> sayfasına bakın.\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\"SwitchyOmega kullanımı hakkında yardım ve diğer sorularınız için lütfen \"\n\"bakınız: <a href='https://github.com/FelisCatus/SwitchyOmega/wiki/\"\n\"FAQ'>SSS</a>.\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\"Telif Hakkı 2012-2019 <a href='https://github.com/FelisCatus/SwitchyOmega/\"\n\"blob/master/AUTHORS'>SwitchyOmega Yazarları</a>. Tüm hakları saklıdır.\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\"SwitchyOmega <a href='https://github.com/FelisCatus/\"\n\"SwitchyOmega'>SwitchyOmega</a> açık kaynak kodlu bir projedir ve diğer <a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>açık \"\n\"kaynak kodlu yazılımlar</a> kulanılarak üretilmiştir.\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega <a href='https://www.gnu.org/philosophy/free-sw.en.html'>özgür \"\n\"yazılımdır</a> ve <a href='https://www.gnu.org/licenses/gpl.html'>GNU \"\n\"General Public License</a> Sürüm 3 ve sonrası ile lisanslanmıştır.\"\n"
  },
  {
    "path": "omega-locales/uk/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2024-10-29 13:02+0000\\n\"\n\"Last-Translator: Сергій Дубик <serhijdubyk@gmail.com>\\n\"\n\"Language-Team: Ukrainian <https://hosted.weblate.org/projects/switchyomega/\"\n\"main/uk/>\\n\"\n\"Language: uk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && \"\n\"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 5.8.2-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Проксі SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"Керуйте і перемикайтеся між проксі серверами швидко і легко.\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"Завантаження…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"Автоперемикання\"\n\nmsgid \"profile_direct\"\nmsgstr \"[Напряму]\"\n\nmsgid \"profile_system\"\nmsgstr \"[Системний проксі]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"За підстановкою у назві\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"Зіставляє хости (доменні імена) з шаблоном.<br><b>Зірочка<code>*</code></\"\n\"b>зіставляє нуль або більше символів.<br><b>Знак питання<code>?</Code></\"\n\"b>зіставляє рівно один символ.<br><br>Запримітьте, що правила, що \"\n\"починаються з<code>*.</code>обробляються особливо тільки в шаблонах \"\n\"хоста.<br>Приклад:<code>*. example.com</code>зіставити як \"\n\"www.example.com,<b>ТАК І example.com.</b><br>Для того, щоб \"\n\"зіставити<b>тільки</b>піддомени, використовуйте<b>дві</b>зірочки:<code>**. \"\n\"example.com</code>.\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"Регулярний вираз хоста\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"Подібно до шаблонів хоста, але зіставляє хости (доменні імена) з \"\n\"<ahref='https://www.google.ru/search?q=регулярні%20вирази'>регулярним \"\n\"виразом</a>.<br>Регулярні вирази буває важко побудувати (і читати).<br>Тому \"\n\"регулярні вирази рекомендується використовувати тільки для тих умов, що не \"\n\"можуть бути виражені іншими методами.\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"Рівні хоста\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"Відповідає запиту тільки тоді, коли рівень хоста знаходиться в заданому \"\n\"діапазоні.<br>Рівень хоста визначається як<b>число розділених точками \"\n\"сегментів</b>хоста (доменного імені).<br>Приклад:<code>www.example.com</\"\n\"code>має рівень хоста 3, а<code>internal</code>має рівень хоста 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"Літерали IP\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"Відповідає запиту тільки тоді, якщо хост є<b>літерально</b>IP-адресою і \"\n\"знаходиться в підмережі, як зазначено в <ahref='https://en.wikipedia.org/\"\n\"wiki/Classless_Inter-Domain_Routing#CIDR_notation' >записи CIDR</\"\n\"a>.<br>Наприклад, правило<code>127.0.0.1/16</code>відповідає всім IP-\"\n\"адресами як<code>127.0. *. *</code>.<br>Таким чином<code>127.0.0.1</\"\n\"code>відповідає запиту, а<code>127.1.0.0</code>- немає. Імена хостів, такі \"\n\"як<code>localhost</code>, ніколи не будуть відповідати запиту, тому що \"\n\"вони<b »не літерали</b>IP.\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"Шаблон URL\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"Зіставляє URL-адреси запиту з шаблоном.<br>Дивіться приклад шаблону хоста в \"\n\"розділі вище для швидкого створення шаблону для посилання.<br>Запримітьте, \"\n\"що шаблон URL-адреси не обробляються спеціальним чином (немає «магії» \"\n\"піддомена, як в шаблоні хоста).<br>Таким чином шаблон<code>*://*.example.com/\"\n\"*</code>відповідає http://www.example.com/але<b>не \"\n\"відповідає</b>http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"Регулярний вираз URL\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"Зіставляє URL-адресу за допомогою «надзвичайно потужного» <ahref='https://www\"\n\".google.com/search?q=regular%20expression'>регулярного виразу</a>.<br>Однак \"\n\"регулярні вирази складно створювати (і читати).<br>У більшості випадків \"\n\"рекомендується використовувати шаблони, а регулярні вирази використовувати \"\n\"тільки для умов де без них неможливо обійтися.\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"Ключове слово\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"Відповідає значенню ключового слова, якщо URL-адреса належить HTTP-\"\n\"протоколу, і зразок слова є частиною URL-адреси.<br>Він поводиться подібно \"\n\"шаблону URL. Приклад:<code>http://*<b>ключове слово</b>*</code>.<br>Ключові \"\n\"слова корисні, якщо Ви хочете обійти брендмауер, який блокує деякі ключові \"\n\"слова в URL-адресі, запитуючи такі URL-адреси через проксі.\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(вимкнено)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(Умова нехтується при зіставленні)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"Ви можете вимкнути умову, встановивши її тип у стан<code>(вимкнено)</code>. \"\n\"Вимкнена умова діє так, ніби її не існує.<br>Цю можливість можна \"\n\"використовувати для тимчасового вимкнення умов.<br>Вимкнені умови як і \"\n\"раніше містять попередню інформацію (наприклад, шаблони) і можуть бути \"\n\"повторно увімкнені шляхом повернення до попереднього типу.\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"Поточний час\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"Спрацьовує, якщо поточний місцевий час є у діапазоні, визначеному між <b>\"\n\"початковою годиною</b> та <b>кінцевою годиною</b> включно<br>Місцевий час, \"\n\"починаючи з початкової та кінцевої години розраховано згідно <b>24 год.</b> \"\n\"формату (<b>p 0 до 23</b>). <br>Розрахунок відбувається приблизно в той \"\n\"момент, коли надісланий запит.\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"День тижня\"\n\n#, fuzzy\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"Відповідає, якщо<b>поточний день тижня</b>обраний в деталях умови. День \"\n\"розраховується відповідно до місцевого часового поясу.<br>Запит і його URL-\"\n\"адресу не мають значення для цього умови. Результат грунтується виключно на \"\n\"дні тижня, коли відправляється запит.\"\n\n#, fuzzy\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Повна відповідність URL-адреси більше не можливо для<code>https://</\"\n\"code>починаючи з Chrome 52. <ahref='https://github.com/FelisCatus/\"\n\"SwitchyOmega/wiki/Chromium-Full-URL- Limitation'>Дізнатися більше...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\n#, fuzzy\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\n#, fuzzy\nmsgid \"condition_group_host\"\nmsgstr \"Хост\"\n\nmsgid \"condition_group_url\"\nmsgstr \"Адреса\"\n\n#, fuzzy\nmsgid \"condition_group_special\"\nmsgstr \"Особливі\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Перемикач\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"Авто проксі\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"Не вистачає директиви '@with result'!\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"Невідомий профіль: $PROFILE$\"\n\n#, fuzzy\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"Відсутня назва профілю в рядку $LNO$: $SOURCE$\"\n\n#, fuzzy\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"Некоректне правило в рядку $LNO$: $SOURCE$\"\n\n#, fuzzy\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"Відсутня правило для умови «*»!\"\n\nmsgid \"dialog_close\"\nmsgstr \"Зачинити\"\n\nmsgid \"dialog_save\"\nmsgstr \"Зберегти зміни\"\n\nmsgid \"dialog_ok\"\nmsgstr \"Згоден\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"Скасувати\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"Очистити\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"Відновити\"\n\nmsgid \"options_title\"\nmsgstr \"Налаштування SwitchyOmega\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"Налаштування\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"Профілі\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"Дії\"\n\n#, fuzzy\nmsgid \"options_tab_ui\"\nmsgstr \"Інтерфейс\"\n\nmsgid \"options_tab_general\"\nmsgstr \"Загальні\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"Імпорт/Експорт\"\n\nmsgid \"options_newProfile\"\nmsgstr \"Новий профіль…\"\n\nmsgid \"options_apply\"\nmsgstr \"Задіяти зміни\"\n\nmsgid \"options_discard\"\nmsgstr \"Відхилити зміни\"\n\nmsgid \"options_reset\"\nmsgstr \"Скинути налаштування\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"Інші налаштування\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"Підтвердити при видаленні умови.\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"Перезавантажити активну вкладинку при зміні профілю.\"\n\n#, fuzzy\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\"Дозволити перевірку проксі, який використовується для елементів сторінки, \"\n\"через контекстне меню.\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"Put new conditions added using the popup to the bottom of the list.\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"Клавіатурні скорочення\"\n\n#, fuzzy\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\"Натискання гарячої клавіші відкриє контекстне меню SwitchyOmega. (Типово Alt \"\n\"+ Shift + O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\"Елементи спливаючого меню також можуть бути доступні за допомогою \"\n\"клавіатури. Натисніть ? (або /) знаходячись у меню, щоб дізнатися більше.\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"Налаштувати скорочення\"\n\n#, fuzzy\nmsgid \"options_group_switchOptions\"\nmsgstr \"Налаштування перемикання\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"Стартовий профіль\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(Поточний профіль)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"Показувати складніші типи умов\"\n\n#, fuzzy\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\"Розблокує нові типи передових, але складних умов перемикання. Для більшості \"\n\"сценаріїв основних типів умов має бути достатньо, тому цей параметр не \"\n\"рекомендується.\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"Швидке перемикання\"\n\n#, fuzzy\nmsgid \"options_cycledProfiles\"\nmsgstr \"Задіяні профілі\"\n\n#, fuzzy\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\"Коли ви натискаєте на значок (або використовуєте гарячу клавішу), такі \"\n\"профілі будуть застосовуватися в заданому порядку.\"\n\n#, fuzzy\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\"Вам потрібно вибрати як мінімум 2 профілю, щоб увімкнути цю функцію! Ви \"\n\"можете перетягнути їх з поля нижче.\"\n\n#, fuzzy\nmsgid \"options_notCycledProfiles\"\nmsgstr \"Чи не задіяні профілі\"\n\n#, fuzzy\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Зміни проксі\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"Скасувати зміни проксі-серверів, що зроблені іншими застосунками.\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"Конфлікти\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"Sometimes, other apps will also try to control the proxy settings, resulting \"\n\"in conflicts. Note that ad blockers and other extensions may also use proxy \"\n\"settings under the hood. Such conflicts cannot be avoided due to how the \"\n\"browser works.\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"A red badge like this on the SwitchyOmega icon indicates that another app has \"\n\"higher priority so SwitchyOmega cannot control the settings. Please try to \"\n\"uninstall SwitchyOmega and reinstall, which should raise SwitchyOmega's \"\n\"priority. If you still see conflicts after reinstallation, please consider \"\n\"removing the other app causing the conflict.\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"If SwitchyOmega has higher priority, you can give the control back to other \"\n\"apps or system settings by selecting $SYSTEMPROFILE$ in the popup menu.\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"Show popup menu item to import proxy settings from other apps.\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"When $SYSTEMPROFILE$ is selected, you can import the effective proxy settings \"\n\"from other apps by selecting $EXTERNALPROFILE$ on the popup menu. \"\n\"The settings will be imported as a profile using the name you provide. \"\n\"Please note that the imported profile is a snapshot and will not reflect \"\n\"any changes from the source app thereafter.\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"Мережеві запити\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"Показувати число невдалих мережевих запитів на поточній вкладинці.\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\"Жовта позначка відобразиться на піктограмі, якщо деякі з ресурсів не \"\n\"вдасться завантажити, <br>для зручності ви можете призначити профіль таким \"\n\"ресурсам через спливаюче меню.\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"Налаштування завантаження\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\"Налаштування частоти, з якою збережені у мережі списки правил та PAC-скрипти \"\n\"будуть оновлюватися.\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"Періодичність завантаження\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 хвилин\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 година\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 години\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 годин\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 годин\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"Кожен день\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"Ніколи\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"Профіль\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"Вивантажити як PAC-файл\"\n\n#, fuzzy\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\"Експортуйте поточний профіль як файл PAC, щоб ви могли використовувати його \"\n\"в інших браузерах.\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\"Щоб вивантажити профіль, використайте панель дій у верхньому правому кутку \"\n\"сторінки профіля.\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\"Вивантажити список правил у сумісному з Proxy Switchy!/SwitchyPlus/\"\n\"SwitchySharp форматі, якщо це можливо.\"\n\n#, fuzzy\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\"Увімкніть цю функцію, тільки якщо ви публікуєте списки правил для \"\n\"користувачів цих проектів.<br>Подумайте про те, щоб порадити вашим знайомим \"\n\"перейти на SwitchyOmega.\"\n\n#, fuzzy\nmsgid \"options_group_importExportSettings\"\nmsgstr \"налаштування\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"Зробити резервну копію\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\"Зробити повну резервну копію ваших налаштувань (включно з профілями та усіма \"\n\"іншими налаштуваннями).\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"Відновити з файлу\"\n\n#, fuzzy\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"Відновити параметри SwitchyOmega з локального файлу.\"\n\n#, fuzzy\nmsgid \"options_restoreOnline\"\nmsgstr \"Відновити з онлайну\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"Адреса файла налаштувань (наприклад, 'http://example.com/switchy.bak')\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"Відновити\"\n\n#, fuzzy\nmsgid \"options_group_syncing\"\nmsgstr \"Синхронізація (експериментально)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"Вмикнути синхронізацію\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"Завантаження синхронізованих налаштувань\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"Вимкнути синхронізацію\"\n\n#, fuzzy\nmsgid \"options_syncReset\"\nmsgstr \"Очистити віддалену копію\"\n\n#, fuzzy\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\"Тепер ви можете автоматично синхронізувати ваші настройки і профілі на всіх \"\n\"ваших настільних пристроях з браузером Chrome.\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\"Ваші налаштування автоматично синхронізовані поміж усіма вашими пристроями.\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\"Слід завбачити, що ви повинні увійти в Chrome на кожному з ваших пристроїв (\"\n\"включаючи це), щоб синхронізація дійсно працювала.<br>Ви можете перевірити \"\n\"цей розділ на інших пристроях, щоб переконатися, що він працює.\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\"Ви вивантажили копію ваших налаштувань до іншого пристрою за допомогою \"\n\"синхронізації.\"\n\n#, fuzzy\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\"Ви можете завантажити віддалену копію на свій пристрій, якщо \"\n\"хочете.<br>Однак це призведе до<b>перезапису існуючих налаштувань і \"\n\"профілів</b>на цьому пристрої.\"\n\n#, fuzzy\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\"Параметри синхронізації не підтримуються на вашій платформі або в браузері. \"\n\"На даний момент підтримується тільки браузер Chrome для настільних пристроїв.\"\n\n#, fuzzy\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"Синхронізація відключена для цього профілю.\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\"Синхронізація вимкнена для цього профіля, тому що він використовує забагато \"\n\"місця.\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"Профіль :: \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"Змінити назву\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"Видалити\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"Опублікувати список правил\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"Вивантажити Правила перемикань у текстовому форматі для публікації.\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"Вивантажити PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"Непідтримуваний тип профілю $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\"Налаштування можуть бути пошкоджені або належати до новішої версії цієї \"\n\"програми.\"\n\n#, fuzzy\nmsgid \"options_profileEditSource\"\nmsgstr \"Змінити вихідний код\"\n\n#, fuzzy\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"Показати довідку про формат вихідного коду\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"Проксі-сервери\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"Схема\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"Протокол\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"Сервер\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"Порт\"\n\n#, fuzzy\nmsgid \"options_proxy_auth\"\nmsgstr \"автентифікація\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"Your browser DOES NOT support $PROTOCOLDISP$ proxy authentication! \"\n\"Please do not report this issue to SwitchyOmega. Contact the support for \"\n\"your browser instead.\"\n\n#, fuzzy\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\"Увага: ім'я користувача /пароль можуть бути відправлені на невідомі сервери, \"\n\"спрямовані PAC скриптом.\"\n\n#, fuzzy\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\"Будь ласка, переконайтеся, що ви довіряєте скрипту за вказаною вище URL-\"\n\"адресою, перед введенням конфіденційних облікових даних.\"\n\n#, fuzzy\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\"Будь ласка, переконайтеся, що ви довіряєте наведеним нижче скрипту, перш ніж \"\n\"надавати конфіденційні облікові дані.\"\n\n#, fuzzy\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\"Крім того, використання цього профілю в інших профілях (наприклад, \"\n\"перемикати профілю) може привести до відправки імені користувача /пароля на \"\n\"проксі сервера налаштовані в інших профілях.\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(за замовчуванням)\"\n\n#, fuzzy\nmsgid \"options_protocol_direct\"\nmsgstr \"БЕЗПОСЕРЕДНЬО\"\n\n#, fuzzy\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(Типові налаштування)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"Використовуати цей проксі для усіх протоколів.\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"Показати розширені налаштування\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"Список ігнорованих вузлів\"\n\n#, fuzzy\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\"Сервера, для яких ви не хочете використовувати будь-якої проксі: (Один \"\n\"сервер в кожному рядку.)\"\n\n#, fuzzy\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(Доступні варіанти та інше...)\"\n\n#, fuzzy\nmsgid \"options_group_pacUrl\"\nmsgstr \"URL-адресу PAC\"\n\n#, fuzzy\nmsgid \"options_pacUrlHelp\"\nmsgstr \"\"\n\"Скрипт PAC буде оновлено з цього URL-адреси. Якщо він залишиться порожнім, \"\n\"то замість нього буде використовуватися наступний скрипт.\"\n\n#, fuzzy\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\"Профілі PAC з файлом: URL-адреси можуть застосовуватися тільки \"\n\"безпосередньо. Вони не можуть використовуватися в якості профілів \"\n\"результатів, так як доступ до локальних файлів неможливий через обмеження \"\n\"браузера.\"\n\n#, fuzzy\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\"Тому ви не можете використовувати локальний файл PAC для цього профілю. Ви \"\n\"можете створити новий профіль PAC для цього, якщо ви дійсно цього хочете.\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC-скрипт\"\n\n#, fuzzy\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"Скрипт PAC завантажений $TIME$:\"\n\n#, fuzzy\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"\"\n\"Скрипт PAC застарів через зміни URL-адреси. Натисніть кнопку завантаження \"\n\"вище, щоб оновити.\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"Віртуальний профіль\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"Мета\"\n\n#, fuzzy\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\"Коли цей профіль застосовується, він діє точно так же, як профіль, обраний \"\n\"нижче.\"\n\n#, fuzzy\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"Перенести в віртуальний профіль\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"Замінити цільовий профіль\"\n\n#, fuzzy\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"Ви можете перенести існуючі параметри, щоб використовувати цей віртуальний \"\n\"профіль замість $PROFILE$. Це оновить всі існуючі правила, які стосуються \"\n\"$PROFILE$, і вкаже їх на цей віртуальний профіль, щоб їх профіль результатів \"\n\"можна було контролювати тут.\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"Налаштування списку правил\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"Формат списку правил\"\n\n#, fuzzy\nmsgid \"options_group_ruleListResult\"\nmsgstr \"Підсумкові профілі списку правил\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"Зіставлений профіль\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"Профіль за-замовчуванням\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"Адреса списку правил\"\n\n#, fuzzy\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\"Список правил буде оновлено з цього URL-адреси. Якщо він залишається \"\n\"порожнім, замість нього буде проаналізовано наступний текст.\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"Текст списку правил\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"Список правил завантажено о $TIME$:\"\n\n#, fuzzy\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\"Список правил застарів через зміни URL-адреси. Натисніть кнопку завантаження \"\n\"вище, щоб оновити.\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"Правила перемикання\"\n\nmsgid \"options_sort\"\nmsgstr \"Впорядкувати\"\n\nmsgid \"options_conditionType\"\nmsgstr \"Тип умови\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"Показати допомогу\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"Деталі умови\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"Профіль\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"Дії\"\n\nmsgid \"options_addCondition\"\nmsgstr \"Додати умову\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"Дублювати\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"Note\"\n\n#, fuzzy\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"Правила списку правил\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(Будь-який запит, що співпадає зі списком правил нижче)\"\n\n#, fuzzy\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(Правила списку правил вимкнути)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"За замовчуванням\"\n\n#, fuzzy\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ рівні хоста ≤\"\n\n#, fuzzy\nmsgid \"options_hourBetween\"\nmsgstr \"≤ поточна година ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"Нд\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"Пн\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"Вв\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"Ср\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"Чт\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"Пт\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"Сб\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"Про типи умов\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"Завантажити список правил з мережі\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"Додати список правил\"\n\n#, fuzzy\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\"Ви можете повторно використовувати онлайн-збірник умов, опублікованих \"\n\"іншими, додавши список правил.\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"Вітаємо у SwitchyOmega\"\n\n#, fuzzy\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\"Ви успішно встановили SwitchyOmega, кращий інструмент для налаштування \"\n\"проксі.\"\n\n#, fuzzy\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\"Будь ласка, повідомте SwitchyOmega ваші проксі в параметрах. Подивимося як.\"\n\n#, fuzzy\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\"Ви успішно оновилися до SwitchyOmega. Не хвилюйтеся, ваші існуючі параметри \"\n\"повністю збережені.\"\n\n#, fuzzy\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\"Тепер давайте пройдемося по короткому керівництву на сторінці нових \"\n\"параметрів.\"\n\nmsgid \"options_guideNext\"\nmsgstr \"Далі\"\n\nmsgid \"options_guideDone\"\nmsgstr \"Готово\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"Пропустити навчання\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"Застосувати налаштування\"\n\n#, fuzzy\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\"Ваші зміни параметрів були збережені і будуть втрачені, якщо ви продовжите!\"\n\n#, fuzzy\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"Ваші зміни в параметри повинні бути застосовані, перш ніж продовжити.\"\n\n#, fuzzy\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"Хочете зберегти і застосувати параметри?\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"Перейменувати профіль\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"Нова назва профілю\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"Профіль з такою назвою вже існує.\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"Назви профілів з подвійним підкреслюванням зарезервовані.\"\n\n#, fuzzy\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\"Профілі з іменами, які починаються часткою з підкреслення, будуть приховані \"\n\"у спливному меню. Проте, вони можуть використовуватися, наприклад, в \"\n\"перемикати профілі.\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"Замінити профіль\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"Замінити профіль\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"Ви дійсно бажаєте замінити $FromProfile$ на $ToProfile$?\"\n\n#, fuzzy\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"Якщо ви продовжите, всі правила, що вказують на $FromProfile$, будуть \"\n\"оновлені для використання $ToProfile$. Інші параметри, такі як профіль при \"\n\"запуску і швидке перемикання, також будуть змінені відповідним чином. Однак \"\n\"самі два профілі НЕ будуть змінені або видалені.\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"Налаштування оновлено.\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"Видалити профіль\"\n\n#, fuzzy\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"Ви дійсно хочете видалити наступний профіль?\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"Не вдалося видалити профіль\"\n\n#, fuzzy\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\"Профіль цього не можна видалити, так як на нього посилаються наступні \"\n\"профілі:\"\n\n#, fuzzy\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\"Ви повинні змінити ці профілі і змусити їх перестати посилатися на цей \"\n\"профіль, перш ніж ви зможете видалити його.\"\n\n#, fuzzy\nmsgid \"options_profileNameEmpty\"\nmsgstr \"Ім'я профілю не може бути порожньо.\"\n\nmsgid \"popup_title\"\nmsgstr \"Спиваюче вікно SwitchyOmega\"\n\n#, fuzzy\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"автентифікація проксі\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"Ім'я користувача\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"Пароль\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"Show password\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"Hide password\"\n\n#, fuzzy\nmsgid \"options_proxyAuthNone\"\nmsgstr \"без автентифікації\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"Видалити правило\"\n\n#, fuzzy\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"Ви дійсно хочете видалити наступне правило?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"Видалити\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"Скинути правила\"\n\n#, fuzzy\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\"Ви впевнені, що хочете встановити підсумковий профіль ВСІХ правил для \"\n\"наступного профілю?\"\n\nmsgid \"options_resetRules\"\nmsgstr \"Скинути правила\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"Призначити профіль для усіх правил\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"Видалити список правил\"\n\n#, fuzzy\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"Ви дійсно хочете видалити список правил з поточного профілю?\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"$COUNT$ строчок правил\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"Видалити список правил\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"Новий профіль\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"Назва профілю\"\n\nmsgid \"options_profileType\"\nmsgstr \"Будь ласка, оберіть тип профілю:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"Профіль проксі-серверів\"\n\n#, fuzzy\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"Тунелює трафік через проксі сервера.\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC профіль\"\n\n#, fuzzy\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"Вибирає профіль, використовуючи онлайн або локальний скрипт PAC.\"\n\n#, fuzzy\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\"Вам це знадобиться тільки в тому випадку, якщо у вас є скрипт PAC або URL-\"\n\"адресу до нього. Не намагайтеся створити його, якщо у вас немає знань про \"\n\"PAC.\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"Профіль перемикання\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"Автоматичне застосування різних профілів в різних умовах, таких як домени \"\n\"або шаблони.\\n\"\n\"Ви також можете імпортувати опубліковані в онлайн правила для зручнішого \"\n\"перемикання. (Замінює саморушнє перемикання + список правил.)\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"Профіль списку правил\"\n\n#, fuzzy\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"Використовує онлайн набір умов, опублікованих іншими користувачами.\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"Віртуальний профіль\"\n\n#, fuzzy\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\"Віртуальний профіль може діяти, при необхідності, як будь-який інший \"\n\"профіль. Він добре працює з перемикається профілем, дозволяючи вам змінити \"\n\"результат кількох умов одним клацанням миші.\"\n\nmsgid \"options_createProfile\"\nmsgstr \"Створити\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"Скинути налаштування\"\n\n#, fuzzy\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\"Ви дійсно хочете скинути параметри? Всі профілі і налаштування будуть \"\n\"втрачені!\"\n\n#, fuzzy\nmsgid \"options_formInvalid\"\nmsgstr \"Будь ласка, виправте помилки на цій сторінці.\"\n\n#, fuzzy\nmsgid \"options_profileNotFound\"\nmsgstr \"Профіль $PROFILE $не існує! Параметри можуть бути пошкоджені.\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"Налаштування скинуто.\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"Налаштування збережено.\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"Налаштування завантажено.\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"Некорректний файл резервної копії!\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"Помилка при заватнаженні файлу резервної копії!\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"Профіль успешно оновлено.\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"Помилка при завантаженні даних профіля!\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"При оновленні сталася мережева помилка.\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"Помилка HTTP ($STATUS$) сталася при оновленні.\"\n\n#, fuzzy\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"URL-адресу профілю не знайдений на сервері. Будь ласка, перевірте.\"\n\n#, fuzzy\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"При оновленні, віддалений сервер повідомив помилку ( $STATUS$).\"\n\n#, fuzzy\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\"Завантажені дані невірні! Ви можете відкрити URL-адресу профілю в своєму \"\n\"браузері, щоб перевірити його.\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"Завантажити профіль зараз\"\n\n#, fuzzy\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"<B>Профіль проксі</b>містить настройки, такі як IP-адреса і порт сервера для \"\n\"проксі.<br>Профілі - це основні одиниці конфігурації в SwitchyOmega.<br>Ми \"\n\"вже створили приклад профілю для вас. Спробуйте відкрити його.\"\n\n#, fuzzy\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"Ви можете тут вказати свій проксі сервер і порт.<br>SwitchyOmega<b>не \"\n\"поставляється з будь-якими проксі серверами</b>.<br>ласка, зверніться до \"\n\"свого провайдера мережі або до керівництва по настройки проксі, якщо ви не \"\n\"знаєте що робити далі.\"\n\n#, fuzzy\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"Ви можете попросити SwitchyOmega автоматично перемикатися між проксі \"\n\"серверами за допомогою потужного<b>перемикати профілю</b>.<br>Однак його \"\n\"функції не можуть бути розглянуті в цьому короткому посібнику.<br>Ви можете \"\n\"відкрити цей профіль, щоб пізніше розкрити деякі його можливості.\"\n\n#, fuzzy\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\"Потрібно більше профілів? Ви завжди можете додати більше<b>проксі, \"\n\"перемикань і інших профілів</b><br>для задоволення всіх своїх потреб в \"\n\"проксі.<br>Насолоджуйтесь проксі!\"\n\n#, fuzzy\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega може застосовувати різні профілі до запитів на основі<b>умов</\"\n\"b>.<br>Наприклад, умова<b>Шаблон хоста</b>дозволяє вам встановити профіль \"\n\"для всіх URL-адрес в домені.\"\n\n#, fuzzy\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\"Ви можете використовувати різні типи умов, щоб відповідати хосту або повного \"\n\"URL-адресою.<br>Натисніть на знак питання, щоб відкрити посилання на тип.\"\n\n#, fuzzy\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"SwitchyOmega застосовує обраний профіль тут до<b>будь-якого запиту, \"\n\"відповідного умові</b>.<br>Спеціальний профіль<b>«[Безпосередньо]»</\"\n\"b>призведе до відправки запиту без будь-якого проксі.\"\n\n#, fuzzy\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"Якщо до якогось запитом не застосовуються ніякі умови, буде \"\n\"використовуватися профіль «Типово».<br>Умови завжди розглядаються по \"\n\"порядку<b>зверху вниз</b>.<br>Ви можете змінити їх порядок, перетягуючи \"\n\"значок сортування.\"\n\n#, fuzzy\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"Завершивши налаштування профілю перемикання, не забудьте<b>переключитися на \"\n\"нього у спливному меню</b>.<br/>Значок покаже вам<b>застосований</b>профіль \"\n\"для поточної вкладки.<br/><b>Наведення< /b>на значку відкриє підказку з \"\n\"подробицями.\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(Зовнішній профіль)\"\n\n#, fuzzy\nmsgid \"popup_externalProfileName\"\nmsgstr \"назва профілю\"\n\n#, fuzzy\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\"Налаштування проксі контролюються іншими застосунками або розширеннями. Будь \"\n\"ласка, вимкніть або видаліть ці програми або розширення.\"\n\n#, fuzzy\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\"Налаштування проксі скасовуються системою. Будь ласка, зв'яжіться з вашим \"\n\"адміністратором.\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\"Налаштуваннями проксі-серверу наразі керувати неможливо. Будь ласка, \"\n\"перевірте налаштування системи та браузеру.\"\n\n#, fuzzy\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\"Налаштування проксі відключені явним запитом інших додатків або розширень.\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"Налаштування проксі тепер контролюються новішою версією SwitchyOmega.\"\n\n#, fuzzy\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\"Ви не можете перемикати профілі за допомогою SwitchyOmega, якщо не вирішите \"\n\"проблему вище.\"\n\n#, fuzzy\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\"Ви не можете включити дві (або більше) версії SwitchyOmega одночасно. Будь \"\n\"ласка, вимкніть одну з них.\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"Керувати розширеннями\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"Додати умову до\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"Додати умову\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"Налаштування\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"Повідомити про проблеми\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"Зберегти журнал помилок\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$ невдало завантажених ресурсів\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"Ресурси, шо не вдалося завантажити\"\n\n#, fuzzy\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\"Не вдалося завантажити кілька ресурсів через проблеми з мережею, проксі \"\n\"сервером або веб-сторінкою.\"\n\n#, fuzzy\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"SwitchyOmega є просто оглядачем цих проблем, а не їх причиною.\"\n\n#, fuzzy\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\"Ви можете переглянути наступні домени і використовувати проксі для них при \"\n\"необхідності.\"\n\n#, fuzzy\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\"Ви можете додати умови перемикання для них тільки при використанні \"\n\"перемикати профілю.\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"Налаштувати Network Monitor\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"Використати цей профіль для усіх обраних деменів\"\n\n#, fuzzy\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\"Профілі PAC НЕ будуть працювати в Mozilla Firefox через технічні обмежень!\"\n\n#, fuzzy\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<! - Будь ласка, напишіть свій коментар над цим рядком.-->SwitchyOmega \"\n\"$projectVersion$ $userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC-скрипт)\"\n\n#, fuzzy\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(Керований іншими розширеннями або оточенням)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(не використовується жоден проксі)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(перемикання за умовами)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(перемикання за списком правил)\"\n\n#, fuzzy\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega :: $PROFILE$\"\n\n#, fuzzy\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"SwitchyOmega :: $1: PROFILE$ $3: DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\"ПОМИЛКА: для завантаження збережених параметрів потрібна новіша версія \"\n\"SwitchOmega.\"\n\n#, fuzzy\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\"ПОМИЛКА: збережені параметри пошкоджені. Натисніть тут, щоб скинути \"\n\"ПАРАМЕТРИ.\"\n\n#, fuzzy\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"Попередження: не вдалося завантажити скрипт PAC і /або список правил.\"\n\n#, fuzzy\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\"Зауваження: в даний момент, настройки проксі контролюються іншим додатком.\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[Перевірити] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(за замовчуванням)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"НАПРЯМУ\"\n\n#, fuzzy\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(RL) \"\n\n#, fuzzy\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(TEMP) \"\n\n#, fuzzy\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"Перевірте проксі, який використовується для цієї сторінки\"\n\n#, fuzzy\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"Перевірте проксі, який використовується для цього фрейму\"\n\n#, fuzzy\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"Перевірити проксі, якщо ця посилання відкрита\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"Перевірити проксі для цього елементу сторінки\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"Включити Швидке перемикання\"\n\nmsgid \"about_title\"\nmsgstr \"Інформація\"\n\nmsgid \"about_app_description\"\nmsgstr \"Інструмент для налаштування проксі-серверів\"\n\nmsgid \"about_version\"\nmsgstr \"Версія $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\"Підтримка браузеру Mozilla Firefox вкрай експериментальна! Якщо ви \"\n\"стикнетися із проблемами, повідомте про це, використовуючи кнопки нижче.\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\"SwitchyOmega не надає адреси проксі-серверів, VPN-серверів або інших \"\n\"мережевих сервісів.\"\n\n#, fuzzy\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\"SwitchyOmega не відслідковує вас і не вставляє рекламу в веб-сторінки. Будь \"\n\"ласка, ознайомтеся з нашою <ahref='https://github.com/FelisCatus/\"\n\"SwitchyOmega/wiki/Privacy#english'>політикою конфіденційності</a>.\"\n\n#, fuzzy\nmsgid \"about_help\"\nmsgstr \"\"\n\"Інші питання? Потрібна допомога з використанням SwitchyOmega? Будь ласка, \"\n\"дивіться наш <ahref='https://github.com/FelisCatus/SwitchyOmega/wiki/\"\n\"FAQ'>FAQ</a>.\"\n\n#, fuzzy\nmsgid \"about_copyright\"\nmsgstr \"\"\n\"Авторське право 2012-2017 <ahref='https://github.com/FelisCatus/SwitchyOmega/\"\n\"blob/master/AUTHORS'>Автори SwitchyOmega</a>. Всі права захищені.\"\n\n#, fuzzy\nmsgid \"about_credits\"\nmsgstr \"\"\n\"SwitchyOmega стала можливою завдяки проекту <ahref='https://github.com/\"\n\"FelisCatus/SwitchyOmega'>SwitchyOmega</a>з відкритим вихідним кодом і іншому \"\n\"<ahref='https://github.com/FelisCatus/SwitchyOmega /blob /master /\"\n\"AUTHORS'>програмного забезпечення з відкритим вихідним кодом</a>.\"\n\n#, fuzzy\nmsgid \"about_license\"\nmsgstr \"\"\n\"SwitchyOmega - це <ahref='https://www.gnu.org/philosophy/free-\"\n\"sw.en.html'>безкоштовне програмне забезпечення</a>ліцензоване по \"\n\"<ahref='https://www.gnu.org /licenses /gpl.html'>GNU General Public License</\"\n\"a>Версії 3 або пізнішої.\"\n"
  },
  {
    "path": "omega-locales/zh_CN/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 11:05+0000\\n\"\n\"PO-Revision-Date: 2024-12-26 11:48+0000\\n\"\n\"Last-Translator: Yuzhou Li <joejoequte@gmail.com>\\n\"\n\"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/\"\n\"projects/switchyomega/main/zh_Hans/>\\n\"\n\"Language: zh_CN\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.10-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"轻松快捷地管理和切换多个代理设置。\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"正在加载……\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"自动切换\"\n\nmsgid \"profile_direct\"\nmsgstr \"[直接连接]\"\n\nmsgid \"profile_system\"\nmsgstr \"[系统代理]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"域名通配符\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"根据域名（主机名）匹配请求。<br><b>星号 <code>*</code></b> 匹配零个或者多个字符。<br><b>问号 <code>?</code></\"\n\"b> 匹配任意一个字符。<br><br>请注意以 <code>*.</code> 开头的规则有特别处理，会同时匹配子域名和自身。<br>例如: <code>*.\"\n\"example.com</code> 能匹配 www.example.com ，<b>而且也能匹配 example.com 。</b><br>如果<b>\"\n\"只需要匹配子域名</b>，请使用<b>两个</b>星号开头，如 <code>**.example.com</code>。\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"域名正则\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"类似主机通配符条件，但通过<a href='https://www.google.com/search?q=regular%20expression'>正\"\n\"则表达式</a>匹配主机。<br>正则表达式很难编写，且可读性差。<br>因此，多数情况下建议使用通配符，只在其他任何条件类型都不能达到的情况下使用正则表\"\n\"达式。\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"域名层数\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"如果域名层数在设定的范围内则匹配，否则不匹配。<br>域名层数是指 <b>域名共有几段（以点分隔）</b>.<br>例如: <code>www.\"\n\"example.com</code> 的域名层数为 3，而 <code>internal</code> 的域名层数为 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP 地址字面量\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"当且仅当主机是<b>字面的</b> IP 地址，且地址处于某个子网内时匹配。\"\n\"子网使用 <a href='\"\n\"http://www.ibm.com/support/knowledgecenter/zh/SS2MBL_9.0.2/PCAAdmin/PCA/Cfg/CIDRFormat_47.html'\"\n\">CIDR 格式</a>表示。<br>例如，规则 <code>127.0.0.1/16</code> 会匹配所有类似 \"\n\"<code>127.0.*.*</code> 的地址。<br>\"\n\"因此地址 <code>127.0.0.1</code> 匹配而地址 <code>127.1.0.0</code> 不匹配。\"\n\"主机名称，例如 <code>localhost</code> 不会被此类规则匹配，因为它们<b>不是</b> \"\n\"IP 地址字面量。\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"网址通配符\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"根据通配符规则匹配网址。<br>关于通配符表达式，请参考上方的域名通配符一节的说明。<br>请注意网址通配符没有任何特殊处理，不会特殊处理子域名等。<br>\"\n\"所以 <code>*://*.example.com/*</code> 能匹配 http://www.example.com/ 但是 <b>不匹配</b> \"\n\"http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"网址正则\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"使用功能强大的<a href='https://www.google.com/\"\n\"search?q=regular%20expression'>regular expression</a>正则表达式</a>来匹配URL。<br>但正则表\"\n\"达式很难编写，且可读性差。<br>因此，建议在大多数情况下使用通配符，只在任何其他条件类型都无法实现的情况下使用正则表达式。\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"关键字\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"关键字条件的具体匹配规则是：网址协议为HTTP且网址中包含该关键字。<br>类似于 <code>http://*<b>关键字</b>*</code>, \"\n\"其中 <b>关键字</b> 是设定好的关键字。<br>如果某防火墙根据网址中是否包含关键字来屏蔽网址，那么可以使用关键字条件来通过代理访问这样的请求，\"\n\"以达到绕过防火墙的目的。\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(禁用)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(匹配请求时无视此条规则)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"设置规则类型为<code>(禁用)</code>可以临时禁用某个条件。禁用的条件在匹配时视为不存在。<br>条件被禁用后，仍然保存有之前的数据（\"\n\"例如通配符或正则），因此当需要时，可以把条件类型改回之前的类型，以方便地重新启用条件。\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"当前时间\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"如果当前本地时间在某个范围内则匹配。此范围由<b>开始小时</b>和<b>结束小时</b>\"\n\"确定，包含开始的那个小时以及结束的那个小时。<br>\"\n\"本地时间、开始小时和结束小时均按照<b>24小时制</b>计算（从<b>0到23</b>）。<br>\"\n\"此条件大约在请求发出的瞬间，才计算是否匹配。\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"每周几\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"只在每周的某几天才匹配。可以在条件详情中勾选<b>星期几有效</b>。\"\n\"根据当地时区来计算现在是星期几，然后再查看当天是否选中。<br>\"\n\"假设在请求发送时是星期X：如果星期X被勾选，则匹配所有请求。否则不匹配任何请求。<br>\"\n\"除了日期以外，在匹配过程中不会参考请求的网址或任何其他信息。\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Chrome 52 起，<code>https://</code>协议下的完整网址无法正常匹配。\"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-%E5%AE%8C%E6%95%B4%E7%BD%91%E5%9D%80%E9%99%90%E5%88%B6'>\"\n\"更多信息...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-%E5%AE%8C%E6%95%B4%E7%BD%91%E5%9D%80%E9%99%90%E5%88%B6\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"域名\"\n\nmsgid \"condition_group_url\"\nmsgstr \"网址\"\n\nmsgid \"condition_group_special\"\nmsgstr \"特殊\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"语法错误：缺少 '@with result' 指令！\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"未找到此情景模式: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"语法错误：缺少结果情景模式名称。 行号 $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"语法错误：非法规则。行号 $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"缺少匹配全部请求的'*'默认规则！\"\n\nmsgid \"dialog_close\"\nmsgstr \"关闭\"\n\nmsgid \"dialog_save\"\nmsgstr \"保存更改\"\n\nmsgid \"dialog_ok\"\nmsgstr \"确定\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"取消\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"清空\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"还原\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega 选项\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"测试版\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"设置\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"情景模式\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"操作\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"界面\"\n\nmsgid \"options_tab_general\"\nmsgstr \"通用\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"导入/导出\"\n\nmsgid \"options_newProfile\"\nmsgstr \"新建情景模式…\"\n\nmsgid \"options_apply\"\nmsgstr \"应用选项\"\n\nmsgid \"options_discard\"\nmsgstr \"撤销更改\"\n\nmsgid \"options_reset\"\nmsgstr \"重置选项\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"其他设置\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"删除切换条件时需要确认。\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"当更改情景模式时刷新当前标签。\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"右键菜单中，可检查网页元素所使用的代理。\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"把以弹出菜单方式创建的规则添加到列表末尾。\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"键盘快捷键\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"按下快捷键即可打开弹出菜单来切换情景模式。(默认快捷键: Alt+Shift+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"弹出菜单中的菜单项也可以用键盘进行选择。在弹出菜单中按下? (问号键，或/斜杠键) 查看帮助。\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"修改快捷键\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"切换选项\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"初始情景模式\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(当前情景模式)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"显示高级切换条件\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"解锁一些新种类的、功能强大的但难以掌握的切换条件。对于大多数情况来说，基本条件类型应该就足够，因此不推荐该选项。\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"快速切换\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"循环情景模式\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"点击图标或按下快捷键时，依次循环切换到以下情景模式。\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"必须至少选择2个情景模式才能进行切换。请从下方框中拖动情景模式到此框。\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"不循环切换的情景模式 (拖动到上面的框中启用切换)\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"代理设置变化\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"撤消其他扩展对代理的更改。\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"冲突\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"有时其他应用也会试图控制代理设置，从而导致冲突。请注意，去广告等其他扩展也可能\"\n\"利用了代理设置来实现功能。此类冲突是由浏览器的工作原理引起的，所以无法避免。\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"如果 SwitchyOmega 图标上显示这样的红色徽章，表示另一个应用优先级较高，因此\"\n\"SwitchyOmega 无法控制代理设置。请尝试卸载 SwitchyOmega 再重新安装，这样可能可\"\n\"以提高 SwitchyOmega 的优先级。如果重装后您仍然看到冲突，那么请考虑移除那个\"\n\"导致冲突的应用。\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\"如果 SwitchyOmega 的优先级较高，那么您可以在弹出菜单中选择 $SYSTEMPROFILE$ 来\"\n\"把控制权还给其他应用或系统设置。\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"在弹出菜单中显示菜单项，以导入其他应用提供的代理设置。\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"选择了 $SYSTEMPROFILE$ 的情况下，您可以在弹出菜单中选择 $EXTERNALPROFILE$ 来\"\n\"导入其他应用提供的代理设置。导入的设置将会成为一个新的情景模式，其名称由您决\"\n\"定。请注意导入的情景模式只是当时的一个快照，导入后不会随着原来的应用更新。\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"网络请求\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"在图标上显示当前页面中由于网络原因而未加载的资源数量。\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"启用此选项后，如有资源加载失败，则图标上会显示数字提示。<br>\"\n\"此时，您可以通过弹出菜单一次设置这些资源使用的情景模式，操作十分便捷。\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"下载选项\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"设置规则列表和PAC脚本的更新间隔。\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"更新间隔\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15分钟\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1小时\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3小时\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6小时\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12小时\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"每天一次\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"从不更新\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"情景模式\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"导出PAC文件\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"导出PAC（代理自动设置）文件,以便在其它浏览器使用。\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"如需导出情景模式，请使用情景模式设置页面右上角的工具栏。\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"导出规则列表时使用 Proxy Switchy!/SwitchyPlus/SwitchySharp 兼容格式。\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"如果您需要发布规则列表给那些软件的用户，请启用此选项。<br>建议您提醒订阅者升级到 SwitchyOmega 以享受新版功能。\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"选项\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"生成备份文件\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"导出一份包括情景模式和其他所有选项的备份文件。\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"从备份文件恢复\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"导入本地的备份文件以恢复所有选项。\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"在线恢复\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"备份文件地址 (如：http://example.com/switchy.bak)\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"恢复\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"选项同步 (测试中)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"启用同步\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"下载云端版本\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"禁用同步\"\n\nmsgid \"options_syncReset\"\nmsgstr \"删除云端版本\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"您可以将设置和情景模式同步到所有使用Chrome浏览器的桌面设备。\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"您的设置将会自动与其他设备进行同步。\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"请注意：您需要在所有设备上（包括此设备）的Chrome浏览器中登录，这样同步的选项才能正常使用。<br>可以在其他设备上查看此页面，来检查同步是否生效。\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"您已经通过其他设备上传了一份选项用于同步。\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"您可以将云端的选项下载到此设备使用。<br>一旦选择下载，<b>此设备上的设置和情景模式将会被覆盖</b>。\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"选项同步暂不支持您的平台或浏览器。目前只支持桌面版Chrome的浏览器的同步，请谅解。\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"此情景模式已经禁用同步。\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"此情景模式使用存储空间过多，因此无法进行同步。\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"情景模式： \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"更改名称\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"删除\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"发布规则列表\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"将切换规则导出为文本格式以便发布。\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"导出PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"不支持的情景模式类型： $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"选项文件已经损坏，或者当前版本过低无法处理选项。\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"编辑源代码\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"显示源代码格式相关的帮助\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"代理服务器\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"网址协议\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"代理协议\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"代理服务器\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"代理端口\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"代理登录\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"您的浏览器不支持 $PROTOCOLDISP$ 代理认证！如有问题请联系您的浏览器支持，\"\n\"请勿反馈此问题给 SwitchyOmega.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"警告: 用户名密码将会提供给PAC脚本返回的任何服务器，有时目标服务器会出乎您的预料。\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"在提供用户名和密码时，请先确保您可以信任以上网址提供的PAC脚本。\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"在提供用户名和密码时，请先确保您可以信任以下输入的PAC脚本。\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"此外，在其他情景模式（如自动切换）中使用此情景时，可能会导致用户名和密码被发送至其他情景模式中设置的服务器。\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(默认)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"直接连接\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(同默认)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"对于所有代理使用相同服务器。\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"显示高级设置\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"不代理的地址列表\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"不经过代理连接的主机列表: (每行一个主机)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(可使用通配符等匹配规则…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC 网址\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"应用将从此网址下载PAC脚本。如果网址留空，则直接使用下方的脚本内容。\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"如果您使用本地PAC文件，则该情景模式只能单独使用，无法作为自动切换的结果。这是因为浏览器不允许读取本地文件。\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"此情景模式已被引用，所以不能使用本地PAC文件。如果您真的需要使用本地文件，请另外新建一个PAC情景模式。\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC 脚本\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC 脚本下载时间 $TIME$：\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"修改网址后尚未下载更新，因此脚本已经过时。请使用上方的更新按钮进行下载。\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"虚情景模式\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"目标\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"应用此配置文件时，它的作用与下面选择的配置文件完全相同。\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"迁移到虚情景模式\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"取代目标情景模式\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"通过此功能可以更改现有的选项，使用此虚情景模式来取代 $PROFILE$ 。此功能会把所有和 $PROFILE$ 相关的切换规则改为使用此虚情景模式。\"\n\"这样一来，就可以通过此虚情景模式来控制那些切换条件对应的结果。\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"规则列表设置\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"规则列表格式\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"规则列表结果情景模式\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"匹配则使用情景模式\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"不匹配则使用情景模式\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"规则列表网址\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"应用将从此网址下载规则列表。如果网址留空，则以下文本会被直接处理后作为规则列表使用。\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"规则列表正文\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"规则列表下载时间 $TIME$：\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"修改网址后尚未下载更新，因此规则列表已经过时。请使用上方的更新按钮进行下载。\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"切换规则\"\n\nmsgid \"options_sort\"\nmsgstr \"排序\"\n\nmsgid \"options_conditionType\"\nmsgstr \"条件类型\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"显示帮助\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"条件设置\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"情景模式\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"操作\"\n\nmsgid \"options_addCondition\"\nmsgstr \"添加条件\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"克隆\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"备注\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"规则列表规则\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(按照规则列表匹配请求)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(规则列表已禁用！)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"默认情景模式\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ 主机层数 ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ 当前小时 ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"日\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"一\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"二\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"三\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"四\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"五\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"六\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"条件类型说明\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"导入在线规则列表\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"添加规则列表\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"可以添加规则列表，以便引用他人在线发布的一组规则。\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"欢迎使用 SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"您已经成功安装了 SwitchyOmega ，一个强大的代理切换工具。\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"您可以通过选项页面设置需要使用的代理服务器，下面我们就来试试看吧。\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"您已经成功升级到 SwitchyOmega. 别担心，所有设置都已经升级成功，可以继续使用。\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"现在我们来熟悉一下新的选项页面。\"\n\nmsgid \"options_guideNext\"\nmsgstr \"下一步\"\n\nmsgid \"options_guideDone\"\nmsgstr \"完成\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"跳过教程\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"应用选项\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"当前设置还未保存。如果您继续此操作，则刚才的所有修改都会丢失！\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"必须保存当前选项才能继续操作。\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"是否保存并应用现在的选项？\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"重命名\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"新的名称\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"已经存在相同名称的情景模式。\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"以双下划线开头的名称为系统保留，禁止使用。\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"以下划线开头的情景模式不会在弹出菜单中显示，但仍可被用作切换的结果等。\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"替换情景模式\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"替换\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"您确定要使用 $ToProfile 来代替 $FromProfile$ 吗?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"如果继续操作，则和 $FromProfile$ 有关的切换规则将改为使用 $ToProfile$ 来代替。此外，启动情景模式、快速切换等设置也会做相应调整。\"\n\"但请注意，此操作不影响这两个情景模式本身。\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"更改选项成功。\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"删除情景模式\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"真的要删除这个情景模式吗？\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"情景模式无法删除\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"无法删除此配置文件，因为它被以下配置文件引用：\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"修改以上所有情景模式并移除对此情景模式的引用后，方可删除此情景模式。\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"情景模式名称不能为空。\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega 弹出菜单\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"删除规则\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"代理登录\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"用户名\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"密码\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"显示密码\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"隐藏密码\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"(无密码)\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"真的要删除这个规则吗?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"删除\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"重置全部规则\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"真的要设置所有规则对应的情景模式为以下情景模式吗？\"\n\nmsgid \"options_resetRules\"\nmsgstr \"重置规则\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"批量设置所有规则的情景模式\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"移除规则列表\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"真的要移除当前情景模式的在线规则列表吗？\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"共计$COUNT$行规则\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"移除规则列表\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"新建情景模式\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"情景模式名称\"\n\nmsgid \"options_profileType\"\nmsgstr \"请选择情景模式的类型:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"代理服务器\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"经过代理服务器访问网站。\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC情景模式\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"根据在线或本地的PAC脚本选择代理。\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"如果您没有任何PAC脚本，也没有脚本的网址，则不必使用此情景模式。不了解PAC的用户不建议自行尝试编写脚本。\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"自动切换模式\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\"根据多种条件，如域名或网址等自动选择情景模式。\\n\"\n\"您也可以导入在线发布的切换规则（如 AutoProxy 列表）以简化设置。\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"规则列表\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"使用他人发布的在线规则列表来切换情景模式。\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"虚情景模式\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"虚情景模式可以作为某个其他情景模式使用，并可以根据需要更改对象。一般用在自动切换中，这样就可以一次性更改多个条件对应的代理。\"\n\nmsgid \"options_createProfile\"\nmsgstr \"创建\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"重置选项\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"真的确定要重置选项吗？如果继续，现有的所有情景模式和选项将会丢失！\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"请更正这个页面中的错误。\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"情景模式 $PROFILE$ 不存在！选项可能已经损坏。\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"选项已经重置。\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"保存选项成功。\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"导入选项成功。\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"备份文件格式错误！\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"下载备份文件时出错！\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"情景模式已经更新成功。\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"下载情景模式数据时出错！\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"更新时发生网络错误。\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"更新时发生网络错误 (HTTP $STATUS$).\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"在远程服务器上找不到情景模式网址对应的文件。请检查网址。\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"更新时远程服务器发生错误 ($STATUS$)。\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"下载的数据不符合格式！建议您在浏览器中打开情景模式网址并检查其内容。\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"立即更新情景模式\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"<b>代理情景</b>包含了服务器地址、端口等代理的信息。<br>在 SwitchyOmega 中，情景模式是代理设置的基本单元。<br>\"\n\"默认设置中已经建立了一个代理情景模式作为样例。试着打开它吧。\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"在这里，您可以填写所需的代理服务器地址和端口。<br>SwitchyOmega<b>软件本身不提供任何内置代理服务器</b>。<br>\"\n\"如果您不清楚应该填写什么，最好咨询下您的网络提供者，或者参考代理软件的设置说明。\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"您可以通过强大的<b>自动切换模式</b>在多个代理间切换自如。<br>不过，在这个简单的教程中无法详尽介绍所有功能。<br>想要使用此功能时，\"\n\"可以打开这里的设置界面，来了解如何使用自动切换功能。\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"需要更多情景模式？你始终可以添加更多<b>代理、切换和其他情景模式</b>满足你所有\"\n\"的代理需要。<br>教程到此结束，享受代理吧！\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega 可以根据<b>切换条件</b>对不同的网络请求使用不同的情景模式。<br>例如<b>域名通配符</b>\"\n\"条件可以对某个域名下的所有网址使用特定的情景模式。\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"您可以使用各种条件类型来匹配域名或者整个网址。<br> 点击问号按钮来查看条件类型的说明。\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"对于<b>任何匹配该条件的请求</b>，SwitchyOmega 会使用这个情景模式。<br>如果选择了<b>\\\"[直接连接]\\\"情景模式</b>，\"\n\"则匹配的请求不使用任何代理。\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"如果请求不匹配任何条件，则使用默认情景模式。<br>条件的匹配顺序总是按此页面<b>从上到下</b>。<br>您可以拖动排序图标来更改条件的顺序。\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"当您设置完毕后，别忘记<b>在弹出菜单中启用自动切换情景模式</b>。<br/>图标将会显示标签页切换的<b>最终结果</b>情景。<br/> <b>\"\n\"悬停在图标上</b>则会显示切换相关的详细说明。\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(外部情景模式)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"保存名称\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"其他应用正在控制代理设置。请禁用或者卸载发生冲突的应用。\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"代理设置被本地策略强制指定，无法修改。请联系系统管理员。\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"无法设置代理设置。请检查系统和浏览器设置。\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"在其他应用或扩展的要求下，SwitchyOmega 已经禁用代理设置。\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"代理设置现在由新版本的 SwitchyOmega 控制。\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"如果不解决以上问题，则无法使用SwitchyOmega切换代理。\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"两个不同版本的 SwitchyOmega （如稳定版和测试版）不能共存。请禁用其中之一。\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"管理扩展\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"添加条件到情景模式\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"添加条件\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"选项\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"反馈问题\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"保存错误日志\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$个资源未加载\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"加载失败的资源列表\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"由于网络原因，此页面部分资源加载失败。这些问题可能是由您的网络、代理服务器或网站本身引起的。\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"这些问题并非由 SwitchyOmega 自身导致，它只不过检测并报告了错误而已。\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"您可以查看以下域名，并根据实际情况确定是否对其使用代理。\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"在使用自动切换情景时，才可以将这些资源添加为切换条件。\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"设置网络检测选项\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"对所有选中域名使用此情景模式\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"由于技术限制，PAC 情景模式无法在 Mozilla Firefox 上工作！\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- ↑请在此行上方填写问题/建议详情，可用中文↑ -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC 脚本)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(由其他扩展或系统环境控制)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(不使用任何代理)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(根据条件切换)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(根据规则列表切换)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"错误：需要新版本的SwitchyOmega才能加载当前选项。\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"错误：选项文件已经损坏，点击此处重置选项。\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"警告：更新PAC文件或规则列表失败。\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"注意：其他应用正在控制当前代理设置。\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[检查] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(默认)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"直接连接\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(列表) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(临时) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"检查此页面使用的代理\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"检查此[框架页面]使用的代理\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"检查此[链接目标]将会使用的代理\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"检查此[元素]使用的代理\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"启用快速切换\"\n\nmsgid \"about_title\"\nmsgstr \"关于\"\n\nmsgid \"about_app_description\"\nmsgstr \"一个代理设置工具\"\n\nmsgid \"about_version\"\nmsgstr \"版本 $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox 浏览器支持目前仍处于早期实验阶段！如果您遇到任何问题，请使用下方的按钮进行反馈。\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega 不提供代理服务器、VPN等网络服务。\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega 不会跟踪您的上网记录，不在页面中插入广告。请参见我们的\"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#%E4%B8%AD%E6%96%87'>隐私政策</a>。\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\"有其它问题？在使用 SwitchyOmega 方面需要帮助？请参阅我们的<a href='https://github.com/FelisCatus/\"\n\"SwitchyOmega/wiki/FAQ'>常见问题</a>。\"\n\nmsgid \"about_copyright\"\nmsgstr \"版权所有 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. 保留所有权利。\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega 的诞生离不开 <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> 开源项目和其他<a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>开源软件</a>。\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega 是<a href='https://www.gnu.org/philosophy/free-sw.zh-cn.html'>自由软件</a>，使用<a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> 版本 3 及以上授权。\"\n"
  },
  {
    "path": "omega-locales/zh_Hant/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 10:29+0000\\n\"\n\"PO-Revision-Date: 2022-04-22 05:07+0000\\n\"\n\"Last-Translator: Still Hsu <dev@stillu.cc>\\n\"\n\"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/zh_Hant/>\\n\"\n\"Language: zh_Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 4.12-dev\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"輕鬆快速地管理及切換多個 Proxy 設定。\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"載入中…\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"自動切換\"\n\nmsgid \"profile_direct\"\nmsgstr \"[直接連接]\"\n\nmsgid \"profile_system\"\nmsgstr \"[系統 Proxy]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"域名萬用字元\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"根據域名 (主機名稱) 的萬用字元進行匹配。<br><b>星號 <code>*</code></b> \"\n\"將會符合零個或多個字元。<br><b>問號 <code>?</code></b> \"\n\"將會符合任一字元。<br><br>請注意，以 <code>*.</code> \"\n\"開頭的規則會同時匹配其子域名及自身。<br>舉例來說：<code>*.example.com</code> \"\n\"將會符合 www.example.com <b>以及 example.\"\n\"com。</b><br>若<b>只要符合子域名</b>，請使用<b>兩個</b>星號開頭，如 <code>**.\"\n\"example.com</code>。\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"域名正則式\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"域名層數\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP 地址字面量\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"網址萬用字元\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"URL 正則式\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"關鍵字\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(禁用)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(匹配時無視此規則)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"目前時間\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"每周幾\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"自 Chrome 52 起，<code>https://</code>下的完整網址將無法正常匹配。<a \"\n\"href='https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-%E5%AE%8C%E6%9\"\n\"5%B4%E7%BD%91%E5%9D%80%E9%99%90%E5%88%B6'>更多訊息...</a>\"\n\n#, fuzzy\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-Full-URL-Limitation\"\n\n#, fuzzy\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"域名\"\n\nmsgid \"condition_group_url\"\nmsgstr \"網址\"\n\nmsgid \"condition_group_special\"\nmsgstr \"特殊\"\n\n#, fuzzy\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\n#, fuzzy\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\n#, fuzzy\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"缺少 '@with result' 指令！\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"未知設定檔：$PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"\"\n\nmsgid \"dialog_close\"\nmsgstr \"關閉\"\n\nmsgid \"dialog_save\"\nmsgstr \"儲存變更\"\n\nmsgid \"dialog_ok\"\nmsgstr \"確定\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"取消\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"清除\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"還原\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega 選項\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"α\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"設定\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"設定檔\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"操作\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"介面\"\n\nmsgid \"options_tab_general\"\nmsgstr \"一般設定\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"匯入/匯出\"\n\nmsgid \"options_newProfile\"\nmsgstr \"新增設定檔…\"\n\nmsgid \"options_apply\"\nmsgstr \"套用變更\"\n\nmsgid \"options_discard\"\nmsgstr \"放棄變更\"\n\nmsgid \"options_reset\"\nmsgstr \"重置設定\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"其他設定\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"需確認刪除切換條件。\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"鍵盤快捷鍵\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"設定快捷鍵\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"切換選項\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"初始設定檔\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(當前設定檔)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"顯示進階切換條件\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"快速切换\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"循環切換設定檔\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"Proxy 設定變更\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"衝突\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15 分鐘\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1 小時\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3 小時\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6 小時\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12 小時\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"每天\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"永不\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"設定檔\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"匯出 PAC 檔案\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"\"\n\nmsgid \"options_syncReset\"\nmsgstr \"\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"\"\n\nmsgid \"options_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"直接連接\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(同預設)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"不使用 Proxy 的位址清單\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC 網址\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"PAC 腳本將從此網址更新。如果將其留空，則將直接使用以下腳本。\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC 腳本\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"由於已變更網址，PAC 腳本已過時。按上面的下載按鈕進行更新。\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"虛擬設定檔\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"目標\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"遷移到虛擬設定檔\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"\"\n\n#, fuzzy\nmsgid \"options_sort\"\nmsgstr \"排序\"\n\n#, fuzzy\nmsgid \"options_conditionType\"\nmsgstr \"條件類型\"\n\n#, fuzzy\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"顯示説明\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"條件詳情\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"設定檔\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"操作\"\n\nmsgid \"options_addCondition\"\nmsgstr \"新增條件\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"複製\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"備註\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"規則清單規則\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"日\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"一\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"二\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"三\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"四\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"五\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"六\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"關於條件種類\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"新增條件清單\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"\"\n\nmsgid \"options_guideNext\"\nmsgstr \"\"\n\nmsgid \"options_guideDone\"\nmsgstr \"\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"\"\n\nmsgid \"popup_title\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"\"\n\nmsgid \"options_resetRules\"\nmsgstr \"\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"\"\n\nmsgid \"options_profileType\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"\"\n\nmsgid \"options_createProfile\"\nmsgstr \"\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"\"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"\"\n\nmsgid \"about_title\"\nmsgstr \"\"\n\nmsgid \"about_app_description\"\nmsgstr \"\"\n\nmsgid \"about_version\"\nmsgstr \"\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\nmsgid \"about_copyright\"\nmsgstr \"\"\n\nmsgid \"about_credits\"\nmsgstr \"\"\n\nmsgid \"about_license\"\nmsgstr \"\"\n"
  },
  {
    "path": "omega-locales/zh_TW/LC_MESSAGES/omega-web.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: SwitchyOmega 2.3.3\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-02-13 11:15+0000\\n\"\n\"PO-Revision-Date: 2019-06-18 19:01+0000\\n\"\n\"Last-Translator: byStarTW <pan93412@gmail.com>\\n\"\n\"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/\"\n\"switchyomega/main/zh_Hant/>\\n\"\n\"Language: zh_TW\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 3.7\\n\"\n\nmsgid \"appNameShort\"\nmsgstr \"SwitchyOmega\"\n\nmsgid \"manifest_app_name\"\nmsgstr \"Proxy SwitchyOmega\"\n\nmsgid \"manifest_app_description\"\nmsgstr \"輕鬆簡單地管理並切換多個代理伺服器設定。\"\n\nmsgid \"manifest_icon_default_title\"\nmsgstr \"正在載入……\"\n\nmsgid \"upgrade_profile_auto\"\nmsgstr \"自動切換\"\n\nmsgid \"profile_direct\"\nmsgstr \"[直接連線]\"\n\nmsgid \"profile_system\"\nmsgstr \"[系統代理]\"\n\nmsgid \"condition_HostWildcardCondition\"\nmsgstr \"網域萬用字元\"\n\nmsgid \"condition_help_HostWildcardCondition\"\nmsgstr \"\"\n\"依據網域（主機名稱）比對請求。<br><b>星號 <code>*</code></b> 比對零個或者多個字元。<br><b>問號 \"\n\"<code>?</code></b> 比對任意一個字元。<br><br>請注意以 <code>*.</code> \"\n\"開頭的規則有特別處理，會同時比對子網域和自身。<br>例如: <code>*.example.com</code> 能比對 \"\n\"www.example.com ，<b>而且也能比對 example.com \"\n\"。</b><br>如果<b>只需要比對子網域</b>，請使用<b>兩個</b>星號開頭，如 <code>**.example.com</code>。\"\n\nmsgid \"condition_HostRegexCondition\"\nmsgstr \"網域正規表示式\"\n\nmsgid \"condition_help_HostRegexCondition\"\nmsgstr \"\"\n\"類似網域萬用字元，但使用<a href='https://www.google.com/search?q=%E6%AD%A3%E5%88%99%E8%A1\"\n\"%A8%E8%BE%BE%E5%BC%8F'>正規表示式</a>.<br>正規表示式很難編寫，且可讀性差。<br>因此，一般情況建議使用萬用字元。當其他任\"\n\"何條件都不能滿足要求時，才使用正規表示式。\"\n\nmsgid \"condition_HostLevelsCondition\"\nmsgstr \"網域層數\"\n\nmsgid \"condition_help_HostLevelsCondition\"\nmsgstr \"\"\n\"如果網域層數在設定的範圍內則比對，否則不比對。<br>網域層數是指 <b>網域共有幾段（以點分隔）</b>.<br>例如: \"\n\"<code>www.example.com</code> 的網域層數為 3，而 <code>internal</code> 的網域層數為 1.\"\n\nmsgid \"condition_IpCondition\"\nmsgstr \"IP 位址常值\"\n\nmsgid \"condition_help_IpCondition\"\nmsgstr \"\"\n\"當且僅當主機是<b>字面的</b> IP 位址，且位址處於某個子網內時比對。子網使用 <a href='http://www.ibm.com/\"\n\"support/knowledgecenter/zh/SS2MBL_9.0.2/PCAAdmin/PCA/Cfg/CIDRFormat_47.html'>\"\n\"CIDR 格式</a>表示。<br>例如，規則 <code>127.0.0.1/16</code> \"\n\"會比對所有類似<code>127.0.*.*</code> 的位址。<br>因此位址 <code>127.0.0.1</code> 比對而位址 \"\n\"<code>127.1.0.0</code> 不比對。主機名稱，例如 <code>localhost</code> \"\n\"不會被此類規則比對，因為它們<b>不是</b> IP 位址常值。\"\n\nmsgid \"condition_UrlWildcardCondition\"\nmsgstr \"網址萬用字元\"\n\nmsgid \"condition_help_UrlWildcardCondition\"\nmsgstr \"\"\n\"依據萬用字元規則比對網址。<br>關於萬用字元表示式，請參考上方的網域萬用字元一節的說明。<br>請注意網址萬用字元沒有任何特殊處理，不會特殊處理子網域等\"\n\"。<br>所以 <code>*://*.example.com/*</code> 能比對 http://www.example.com/ 但是 \"\n\"<b>不比對</b> http://example.com/.\"\n\nmsgid \"condition_UrlRegexCondition\"\nmsgstr \"網址正規表示式\"\n\nmsgid \"condition_help_UrlRegexCondition\"\nmsgstr \"\"\n\"使用功能強大的<a href='https://www.google.com/search?q=%E6%AD%A3%E5%88%99%E8%A1%A8%E\"\n\"8%BE%BE%E5%BC%8F'>正規表示式</a>來比對網址。<br>但正規表示式很難編寫，且可讀性差。<br>因此，一般情況建議使用萬用字元。當其他\"\n\"任何條件都不能滿足要求時，才使用正規表示式。\"\n\nmsgid \"condition_KeywordCondition\"\nmsgstr \"關鍵字\"\n\nmsgid \"condition_help_KeywordCondition\"\nmsgstr \"\"\n\"關鍵字條件的具體比對規則是：網址協定為HTTP且網址中包含該關鍵字。<br>類似於 <code>http://*<b>關鍵字</b>*</code>, \"\n\"其中 <b>關鍵字</b> \"\n\"是設定好的關鍵字。<br>如果某防火牆依據網址中是否包含關鍵字來遮蔽網址，那麼可以使用關鍵字條件來通過代理訪問這樣的請求，以達到繞過防火牆的目的。\"\n\nmsgid \"condition_FalseCondition\"\nmsgstr \"(停用)\"\n\nmsgid \"condition_details_FalseCondition\"\nmsgstr \"(比對請求時無視此條規則)\"\n\nmsgid \"condition_help_FalseCondition\"\nmsgstr \"\"\n\"設定規則類型為<code>(停用)</code>可以臨時停用某個條件。停用的條件在比對時視為不存在。<br>條件被停用後，仍然儲存有之前的資料（例如萬用字\"\n\"元或正規表示式），因此當需要時，可以把條件類型改回之前的類型，以方便地重新啟用條件。\"\n\nmsgid \"condition_TimeCondition\"\nmsgstr \"目前時間\"\n\nmsgid \"condition_help_TimeCondition\"\nmsgstr \"\"\n\"如果目前本機時間在某個範圍內則比對。此範圍由<b>開始小時</b>和<b>結束小時</b>確定，包含開始的那個小時以及結束的那個小時。<br>本機時間、開\"\n\"始小時和結束小時均按照<b>24小時制</b>計算（從<b>0到23</b>）。<br>此條件大約在請求發出的瞬間，才計算是否比對。\"\n\nmsgid \"condition_WeekdayCondition\"\nmsgstr \"每週幾\"\n\nmsgid \"condition_help_WeekdayCondition\"\nmsgstr \"\"\n\"只在每週的某幾天才比對。可以在條件詳情中勾選<b>星期幾有效</b>。依據當地時區來計算現在是星期幾，然後再檢視當天是否選取。<br>假設在請求傳送時是星\"\n\"期X：如果星期X被勾選，則比對所有請求。否則不比對任何請求。<br>除了日期以外，在比對過程中不會參考請求的網址或任何其他資訊。\"\n\nmsgid \"condition_alert_fullUrlLimitation\"\nmsgstr \"\"\n\"Chrome 52 起，<code>https://</code>協定下的完整網址無法正常比對。<a href='https://github.com/\"\n\"FelisCatus/SwitchyOmega/wiki/\"\n\"Chromium-%E5%AE%8C%E6%95%B4%E7%BD%91%E5%9D%80%E9%99%90%E5%88%B6'>更多訊息...</a>\"\n\nmsgid \"condition_alert_fullUrlLimitationLink\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/Chromium-%E5%AE%8C%E6%95%B4%E7%BD%91%E5%9D%80%E9%99%90%E5%88%B6\"\n\nmsgid \"condition_group_default\"\nmsgstr \" \"\n\nmsgid \"condition_group_host\"\nmsgstr \"網域\"\n\nmsgid \"condition_group_url\"\nmsgstr \"網址\"\n\nmsgid \"condition_group_special\"\nmsgstr \"特殊\"\n\nmsgid \"ruleListFormat_Switchy\"\nmsgstr \"Switchy\"\n\nmsgid \"ruleListFormat_AutoProxy\"\nmsgstr \"AutoProxy\"\n\nmsgid \"ruleList_usageUrl\"\nmsgstr \"https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage\"\n\nmsgid \"ruleList_error_resultNotEnabled\"\nmsgstr \"語法錯誤：缺少 '@with result' 指令！\"\n\nmsgid \"ruleList_error_unknownProfile\"\nmsgstr \"未找到此情境模式: $PROFILE$\"\n\nmsgid \"ruleList_error_missingResultProfile\"\nmsgstr \"語法錯誤：缺少結果情境模式名稱。 行號 $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_invalidRule\"\nmsgstr \"語法錯誤：非法規則。行號 $LNO$: $SOURCE$\"\n\nmsgid \"ruleList_error_noDefaultRule\"\nmsgstr \"語法錯誤：缺少比對全部請求的預設規則。應在最後新增'*'規則和預設情境模式。\"\n\nmsgid \"dialog_close\"\nmsgstr \"關閉\"\n\nmsgid \"dialog_save\"\nmsgstr \"儲存變更\"\n\nmsgid \"dialog_ok\"\nmsgstr \"確定\"\n\nmsgid \"dialog_cancel\"\nmsgstr \"取消\"\n\nmsgid \"inputClear_clear\"\nmsgstr \"清除\"\n\nmsgid \"inputClear_restore\"\nmsgstr \"還原\"\n\nmsgid \"options_title\"\nmsgstr \"SwitchyOmega 選項\"\n\nmsgid \"options_experimental_badge\"\nmsgstr \"測試版\"\n\nmsgid \"options_navHeader_setting\"\nmsgstr \"設定\"\n\nmsgid \"options_navHeader_profiles\"\nmsgstr \"情境模式\"\n\nmsgid \"options_navHeader_actions\"\nmsgstr \"操作\"\n\nmsgid \"options_tab_ui\"\nmsgstr \"介面\"\n\nmsgid \"options_tab_general\"\nmsgstr \"通用\"\n\nmsgid \"options_tab_importExport\"\nmsgstr \"匯入/匯出\"\n\nmsgid \"options_newProfile\"\nmsgstr \"新增情境模式…\"\n\nmsgid \"options_apply\"\nmsgstr \"套用選項\"\n\nmsgid \"options_discard\"\nmsgstr \"還原變更\"\n\nmsgid \"options_reset\"\nmsgstr \"重設選項\"\n\nmsgid \"options_group_miscOptions\"\nmsgstr \"其他設定\"\n\nmsgid \"options_confirmDeletion\"\nmsgstr \"刪除切換條件時需要確認。\"\n\nmsgid \"options_refreshOnProfileChange\"\nmsgstr \"當變更情境模式時重新整理目前分頁。\"\n\nmsgid \"options_showInspectMenu\"\nmsgstr \"右鍵選單中，可檢查網頁元素所使用的代理。\"\n\nmsgid \"options_addConditionsToBottom\"\nmsgstr \"把以彈出式選單建立的規則加入到清單末尾。\"\n\nmsgid \"options_group_keyboardShortcut\"\nmsgstr \"鍵盤快速鍵\"\n\nmsgid \"options_menuShortcutHelp\"\nmsgstr \"按下快速鍵即可開啟彈出選單來切換情境模式。(預設快速鍵: Alt+Shift+O).\"\n\nmsgid \"options_menuShortcutMore\"\nmsgstr \"彈出選單中的選單項也可以用鍵盤進行選擇。在彈出選單中按下? (問號鍵，或/斜槓鍵) 檢視說明。\"\n\nmsgid \"options_menuShortcutConfigure\"\nmsgstr \"變更快速鍵\"\n\nmsgid \"options_group_switchOptions\"\nmsgstr \"切換選項\"\n\nmsgid \"options_startupProfile\"\nmsgstr \"初始情境模式\"\n\nmsgid \"options_startupProfile_none\"\nmsgstr \"(目前情境模式)\"\n\nmsgid \"options_showConditionTypesAdvanced\"\nmsgstr \"顯示進階切換條件\"\n\nmsgid \"options_showConditionTypesAdvancedHelp\"\nmsgstr \"解鎖一些新種類的、功能強大的但難以掌握的切換條件。對於大多數情況來說，基本條件類型應該就足夠，因此不推薦該選項。\"\n\nmsgid \"options_quickSwitch\"\nmsgstr \"快速切換\"\n\nmsgid \"options_cycledProfiles\"\nmsgstr \"循環切換以下情境模式:\"\n\nmsgid \"options_cycledProfilesHelp\"\nmsgstr \"點選圖示或按下快速鍵時，依次迴圈切換到以下情境模式。\"\n\nmsgid \"options_cycledProfilesTooFew\"\nmsgstr \"必須至少選擇2個情境模式才能進行切換。請從下方框中拖動情境模式到此框。\"\n\nmsgid \"options_notCycledProfiles\"\nmsgstr \"不迴圈切換的情境模式 (拖動到上面的框中啟用切換)\"\n\nmsgid \"options_group_proxyChanges\"\nmsgstr \"代理設定變化\"\n\nmsgid \"options_revertProxyChanges\"\nmsgstr \"還原其他擴充功能對代理的變更。\"\n\nmsgid \"options_group_conflicts\"\nmsgstr \"衝突\"\n\nmsgid \"options_conflicts_introduction\"\nmsgstr \"\"\n\"有時其他應用也會試圖控制代理設定，從而導致衝突。請注意，去廣告等其他擴充功能也可能利用了代理設定來實現功能。此類衝突是由瀏覽器的工作原理引起的，所以無法避\"\n\"免。\"\n\nmsgid \"options_conflicts_lowerPriority\"\nmsgstr \"\"\n\"如果 SwitchyOmega 圖示上顯示這樣的紅色徽章，表示另一個應用優先級較高，因此SwitchyOmega 無法控制代理設定。請嘗試卸載 \"\n\"SwitchyOmega 再重新安裝，這樣可能可以提高 SwitchyOmega 的優先級。如果重裝後您仍然看到衝突，那麼請考慮移除那個導致衝突的應用。\"\n\nmsgid \"options_conflicts_higherPriority\"\nmsgstr \"如果 SwitchyOmega 的優先級較高，那麼您可以在彈出式選單中選擇 $SYSTEMPROFILE$ 來把控制權還給其他應用或系統設定。\"\n\nmsgid \"options_showExternalProfile\"\nmsgstr \"在彈出式選單中顯示選單項目，以匯入其他應用提供的代理設定。\"\n\nmsgid \"options_showExternalProfileHelp\"\nmsgstr \"\"\n\"選擇了 $SYSTEMPROFILE$ 的情況下，您可以在彈出式選單中選擇 $EXTERNALPROFILE$ \"\n\"來匯入其他應用提供的代理設定。匯入的設定將會成為一個新的情境模式，其名稱由您決定。請注意匯入的情境模式只是當時的一個快照，匯入後不會隨著原來的應用更新。\"\n\nmsgid \"options_group_networkRequests\"\nmsgstr \"網路請求\"\n\nmsgid \"options_monitorWebRequests\"\nmsgstr \"在圖示上顯示目前頁面中由於網路原因而未載入的資源數量。\"\n\nmsgid \"options_monitorWebRequestsHelp\"\nmsgstr \"啟用此選項後，如有資源載入失敗，則圖示上會顯示數字提示。<br>此時，您可以通過彈出選單一次設定這些資源使用的情境模式，操作十分便捷。\"\n\nmsgid \"options_downloadOptions\"\nmsgstr \"下載選項\"\n\nmsgid \"options_downloadOptionsHelp\"\nmsgstr \"設定規則清單和 PAC 指令碼的更新間隔。\"\n\nmsgid \"options_downloadInterval\"\nmsgstr \"更新間隔\"\n\nmsgid \"options_downloadInterval_15\"\nmsgstr \"15分鐘\"\n\nmsgid \"options_downloadInterval_60\"\nmsgstr \"1小時\"\n\nmsgid \"options_downloadInterval_180\"\nmsgstr \"3小時\"\n\nmsgid \"options_downloadInterval_360\"\nmsgstr \"6小時\"\n\nmsgid \"options_downloadInterval_720\"\nmsgstr \"12小時\"\n\nmsgid \"options_downloadInterval_1440\"\nmsgstr \"每天一次\"\n\nmsgid \"options_downloadInterval_never\"\nmsgstr \"從不更新\"\n\nmsgid \"options_group_importExportProfile\"\nmsgstr \"情境模式\"\n\nmsgid \"options_exportPacFile\"\nmsgstr \"匯出 PAC 檔案\"\n\nmsgid \"options_exportPacFileHelp\"\nmsgstr \"匯出 PAC（代理自動設定）檔案，以便在其它瀏覽器使用。\"\n\nmsgid \"options_exportProfileHelp\"\nmsgstr \"如需匯出情境模式，請使用情境模式設定頁面右上角的工具欄。\"\n\nmsgid \"options_exportLegacyRuleList\"\nmsgstr \"匯出規則清單時使用 Proxy Switchy!/SwitchyPlus/SwitchySharp 相容格式。\"\n\nmsgid \"options_exportLegacyRuleListHelp\"\nmsgstr \"如果您需要釋出規則清單給那些軟體的使用者，請啟用此選項。<br>建議您提醒訂閱者升級到 SwitchyOmega 以享受新版功能。\"\n\nmsgid \"options_group_importExportSettings\"\nmsgstr \"選項\"\n\nmsgid \"options_makeBackup\"\nmsgstr \"輸出備份檔案\"\n\nmsgid \"options_makeBackupHelp\"\nmsgstr \"匯出一份包括情境模式和其他所有選項的備份檔案。\"\n\nmsgid \"options_restoreLocal\"\nmsgstr \"從備份檔案還原\"\n\nmsgid \"options_restoreLocalHelp\"\nmsgstr \"匯入本機的備份檔案以還原所有選項。\"\n\nmsgid \"options_restoreOnline\"\nmsgstr \"線上還原\"\n\nmsgid \"options_restoreOnlinePlaceholder\"\nmsgstr \"備份檔案位址 (如：http://example.com/switchy.bak)\"\n\nmsgid \"options_restoreOnlineSubmit\"\nmsgstr \"還原\"\n\nmsgid \"options_group_syncing\"\nmsgstr \"選項同步 (測試中)\"\n\nmsgid \"options_syncEnable\"\nmsgstr \"啟用同步\"\n\nmsgid \"options_syncEnableForce\"\nmsgstr \"下載雲端版本\"\n\nmsgid \"options_syncDisable\"\nmsgstr \"停用同步\"\n\nmsgid \"options_syncReset\"\nmsgstr \"刪除雲端版本\"\n\nmsgid \"options_syncPristineHelp\"\nmsgstr \"您可以將設定和情境模式同步到所有使用Chrome瀏覽器的桌面裝置。\"\n\nmsgid \"options_syncSyncAlert\"\nmsgstr \"您的設定將會自動與其他裝置進行同步。\"\n\nmsgid \"options_syncSyncHelp\"\nmsgstr \"請注意：您需要在所有裝置上（包括此裝置）的Chrome瀏覽器中登入，這樣同步的選項才能正常使用。<br>可以在其他裝置上檢視此頁面，來檢查同步是否生效。\"\n\nmsgid \"options_syncConflictAlert\"\nmsgstr \"您已經通過其他裝置上傳了一份選項用於同步。\"\n\nmsgid \"options_syncConflictHelp\"\nmsgstr \"您可以將雲端的選項下載到此裝置使用。<br>一旦選擇下載，<b>此裝置上的設定和情境模式將會被覆蓋</b>。\"\n\nmsgid \"options_syncUnsupportedHelp\"\nmsgstr \"選項同步暫不支援您的平臺或瀏覽器。目前只支援桌面版Chrome的瀏覽器的同步，請諒解。\"\n\nmsgid \"options_profileSyncDisabled\"\nmsgstr \"此情境模式已經停用同步。\"\n\nmsgid \"options_profileSyncDisabled_quotaPerItem\"\nmsgstr \"此情境模式使用儲存空間過多，因此無法進行同步。\"\n\nmsgid \"options_profileTabPrefix\"\nmsgstr \"情境模式： \"\n\nmsgid \"options_renameProfile\"\nmsgstr \"變更名稱\"\n\nmsgid \"options_deleteProfile\"\nmsgstr \"刪除\"\n\nmsgid \"options_profileExportRuleList\"\nmsgstr \"釋出規則清單\"\n\nmsgid \"options_profileExportRuleListHelp\"\nmsgstr \"將切換規則匯出為文字格式以便釋出。\"\n\nmsgid \"options_profileExportPac\"\nmsgstr \"匯出 PAC\"\n\nmsgid \"options_profileUnsupported\"\nmsgstr \"不支援的情境模式類型： $TYPE$!\"\n\nmsgid \"options_profileUnsupportedHelp\"\nmsgstr \"選項檔案已經損壞，或者目前版本過低無法處理選項。\"\n\nmsgid \"options_profileEditSource\"\nmsgstr \"編輯原始碼\"\n\nmsgid \"options_profileEditSourceHelp\"\nmsgstr \"顯示原始碼格式相關的說明\"\n\nmsgid \"options_profileEditSourceHelpUrl\"\nmsgstr \"\"\n\"https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-\"\n\"format#result-profile\"\n\nmsgid \"options_group_proxyServers\"\nmsgstr \"代理伺服器\"\n\nmsgid \"options_proxy_scheme\"\nmsgstr \"網址協定\"\n\nmsgid \"options_proxy_protocol\"\nmsgstr \"代理協定\"\n\nmsgid \"options_proxy_server\"\nmsgstr \"代理伺服器\"\n\nmsgid \"options_proxy_port\"\nmsgstr \"連接埠\"\n\nmsgid \"options_proxy_auth\"\nmsgstr \"代理認證\"\n\nmsgid \"options_proxy_authNotSupported\"\nmsgstr \"您的瀏覽器不支持 $PROTOCOLDISP$ 代理認證！如有問題請聯繫您的瀏覽器支持，\"\n\"請勿反饋此問題給 SwitchyOmega.\"\n\nmsgid \"options_proxy_authAllWarningPac\"\nmsgstr \"警告：使用者名稱和密碼將會提供給 PAC 指令碼返回的任何伺服器，有時目標伺服器會出乎您的預料。\"\n\nmsgid \"options_proxy_authAllWarningPacUrl\"\nmsgstr \"在提供使用者名稱和密碼時，請先確保您可以信任以上網址提供的 PAC 指令碼。\"\n\nmsgid \"options_proxy_authAllWarningPacScript\"\nmsgstr \"在提供使用者名稱和密碼時，請先確保您可以信任以下輸入的 PAC 指令碼。\"\n\nmsgid \"options_proxy_authReferencedWarning\"\nmsgstr \"此外，在其他情境模式（如自動切換）中使用此情境時，可能會導致使用者名稱和密碼被傳送至其他情境模式中設定的伺服器。\"\n\nmsgid \"options_scheme_default\"\nmsgstr \"(預設)\"\n\nmsgid \"options_protocol_direct\"\nmsgstr \"直接連線\"\n\nmsgid \"options_protocol_useDefault\"\nmsgstr \"(同預設)\"\n\nmsgid \"options_proxy_single\"\nmsgstr \"對於所有代理使用相同伺服器。\"\n\nmsgid \"options_proxy_expand\"\nmsgstr \"顯示進階設定\"\n\nmsgid \"options_group_bypassList\"\nmsgstr \"不代理的位址清單\"\n\nmsgid \"options_bypassListHelp\"\nmsgstr \"不經過代理連線的主機清單: (每行一個主機)\"\n\nmsgid \"options_bypassListHelpLinkText\"\nmsgstr \"(可使用萬用字元等比對規則…)\"\n\nmsgid \"options_group_pacUrl\"\nmsgstr \"PAC 網址\"\n\nmsgid \"options_pacUrlHelp\"\nmsgstr \"將會從此網址下載 PAC 指令碼。如果網址留空，則直接使用下方的指令碼內容。\"\n\nmsgid \"options_pacUrlFile\"\nmsgstr \"如果您使用本機 PAC 檔案，則該情境模式只能單獨使用，無法作為自動切換的結果。這是因為瀏覽器不允許讀取本機檔案。\"\n\nmsgid \"options_pacUrlFileDisabled\"\nmsgstr \"此情境模式已被引用，所以不能使用本機 PAC 檔案。如果您真的需要使用本機檔案，請另外建立一個 PAC 情境模式。\"\n\nmsgid \"options_group_pacScript\"\nmsgstr \"PAC 指令碼\"\n\nmsgid \"options_pacScriptLastUpdate\"\nmsgstr \"PAC 指令碼最後更新時間：$TIME$\"\n\nmsgid \"options_pacScriptObsolete\"\nmsgstr \"修改網址後尚未下載更新，因此指令碼已經過時。請使用上方的更新按鈕進行下載。\"\n\nmsgid \"options_group_virtualProfile\"\nmsgstr \"虛情境模式\"\n\nmsgid \"options_virtualProfileTarget\"\nmsgstr \"目標\"\n\nmsgid \"options_virtualProfileTargetHelp\"\nmsgstr \"當使用此情境模式時，相當於使用了以下情境模式：\"\n\nmsgid \"options_group_virtualProfileReplace\"\nmsgstr \"遷移到虛情境模式\"\n\nmsgid \"options_virtualProfileReplace\"\nmsgstr \"取代目標情境模式\"\n\nmsgid \"options_virtualProfileReplaceHelp\"\nmsgstr \"\"\n\"通過此功能可以變更現有的選項，使用此虛情境模式來取代 $PROFILE$ 。此功能會把所有和 $PROFILE$ \"\n\"相關的切換規則改為使用此虛情境模式。這樣一來，就可以通過此虛情境模式來控制那些切換條件對應的結果。\"\n\nmsgid \"options_group_ruleListConfig\"\nmsgstr \"規則清單設定\"\n\nmsgid \"options_ruleListFormat\"\nmsgstr \"規則清單格式\"\n\nmsgid \"options_group_ruleListResult\"\nmsgstr \"規則清單結果情境模式\"\n\nmsgid \"options_ruleListMatchProfile\"\nmsgstr \"比對則使用情境模式\"\n\nmsgid \"options_ruleListDefaultProfile\"\nmsgstr \"不比對則使用情境模式\"\n\nmsgid \"options_group_ruleListUrl\"\nmsgstr \"規則清單網址\"\n\nmsgid \"options_ruleListUrlHelp\"\nmsgstr \"應用將從此網址下載規則清單。如果網址留空，則以下文字會被直接處理後作為規則清單使用。\"\n\nmsgid \"options_group_ruleListText\"\nmsgstr \"規則清單正文\"\n\nmsgid \"options_ruleListLastUpdate\"\nmsgstr \"規則清單最後更新時間：$TIME$\"\n\nmsgid \"options_ruleListObsolete\"\nmsgstr \"修改網址後尚未下載更新，因此規則清單已經過時。請使用上方的更新按鈕進行下載。\"\n\nmsgid \"options_group_switchRules\"\nmsgstr \"切換規則\"\n\nmsgid \"options_sort\"\nmsgstr \"排序\"\n\nmsgid \"options_conditionType\"\nmsgstr \"條件類型\"\n\nmsgid \"options_showConditionTypeHelp\"\nmsgstr \"顯示說明\"\n\nmsgid \"options_conditionDetails\"\nmsgstr \"條件設定\"\n\nmsgid \"options_resultProfile\"\nmsgstr \"情境模式\"\n\nmsgid \"options_conditionActions\"\nmsgstr \"操作\"\n\nmsgid \"options_addCondition\"\nmsgstr \"加入條件\"\n\nmsgid \"options_cloneRule\"\nmsgstr \"複製\"\n\nmsgid \"options_ruleNote\"\nmsgstr \"備註\"\n\nmsgid \"options_switchAttachedProfileInCondition\"\nmsgstr \"規則清單規則\"\n\nmsgid \"options_switchAttachedProfileInConditionDetails\"\nmsgstr \"(按照規則清單比對請求)\"\n\nmsgid \"options_switchAttachedProfileInConditionDisabled\"\nmsgstr \"(規則清單已停用！)\"\n\nmsgid \"options_switchDefaultProfile\"\nmsgstr \"預設情境模式\"\n\nmsgid \"options_hostLevelsBetween\"\nmsgstr \"≤ 主機層數 ≤\"\n\nmsgid \"options_hourBetween\"\nmsgstr \"≤ 目前小時 ≤\"\n\nmsgid \"options_weekDayShort_0\"\nmsgstr \"日\"\n\nmsgid \"options_weekDayShort_1\"\nmsgstr \"一\"\n\nmsgid \"options_weekDayShort_2\"\nmsgstr \"二\"\n\nmsgid \"options_weekDayShort_3\"\nmsgstr \"三\"\n\nmsgid \"options_weekDayShort_4\"\nmsgstr \"四\"\n\nmsgid \"options_weekDayShort_5\"\nmsgstr \"五\"\n\nmsgid \"options_weekDayShort_6\"\nmsgstr \"六\"\n\nmsgid \"options_group_conditionHelp\"\nmsgstr \"條件類型說明\"\n\nmsgid \"options_group_attachProfile\"\nmsgstr \"匯入線上規則清單\"\n\nmsgid \"options_attachProfile\"\nmsgstr \"加入規則清單\"\n\nmsgid \"options_attachProfileHelp\"\nmsgstr \"可以加入規則清單，以便引用他人線上釋出的一組規則。\"\n\nmsgid \"options_modalHeader_welcome\"\nmsgstr \"歡迎使用 SwitchyOmega\"\n\nmsgid \"options_welcomeNormal\"\nmsgstr \"您已經成功安裝了 SwitchyOmega ，一個強大的代理切換工具。\"\n\nmsgid \"options_welcomeNormalGuide\"\nmsgstr \"您可以通過選項頁面設定需要使用的代理伺服器，下面我們就來試試看吧。\"\n\nmsgid \"options_welcomeUpgrade\"\nmsgstr \"您已經成功升級到 SwitchyOmega. 別擔心，所有設定都已經升級成功，可以繼續使用。\"\n\nmsgid \"options_welcomeUpgradeGuide\"\nmsgstr \"現在我們來熟悉一下新的選項頁面。\"\n\nmsgid \"options_guideNext\"\nmsgstr \"下一步\"\n\nmsgid \"options_guideDone\"\nmsgstr \"完成\"\n\nmsgid \"options_guideSkip\"\nmsgstr \"跳過教學\"\n\nmsgid \"options_modalHeader_applyOptions\"\nmsgstr \"套用選項\"\n\nmsgid \"options_optionsNotSaved\"\nmsgstr \"目前設定還未儲存。如果您繼續此操作，則剛才的所有修改都會遺失！\"\n\nmsgid \"options_applyOptionsRequired\"\nmsgstr \"必須儲存目前選項才能繼續操作。\"\n\nmsgid \"options_applyOptionsConfirm\"\nmsgstr \"是否儲存並套用現在的選項？\"\n\nmsgid \"options_modalHeader_renameProfile\"\nmsgstr \"重新命名\"\n\nmsgid \"options_renameProfileName\"\nmsgstr \"新的名稱\"\n\nmsgid \"options_profileNameConflict\"\nmsgstr \"已經存在相同名稱的情境模式。\"\n\nmsgid \"options_profileNameReserved\"\nmsgstr \"以雙下劃線開頭的名稱為系統保留，禁止使用。\"\n\nmsgid \"options_profileNameHidden\"\nmsgstr \"以下劃線開頭的情境模式不會在彈出選單中顯示，但仍可被用作切換的結果等。\"\n\nmsgid \"options_modalHeader_replaceProfile\"\nmsgstr \"取代情境模式\"\n\nmsgid \"options_replaceProfile\"\nmsgstr \"取代\"\n\nmsgid \"options_replaceProfileConfirm\"\nmsgstr \"您確定要使用 $ToProfile 來代替 $FromProfile$ 嗎?\"\n\nmsgid \"options_replaceProfileHelp\"\nmsgstr \"\"\n\"如果繼續操作，則和 $FromProfile$ 有關的切換規則將改為使用 $ToProfile$ \"\n\"來代替。此外，啟動情境模式、快速切換等設定也會做相應調整。但請注意，此操作不影響這兩個情境模式本身。\"\n\nmsgid \"options_replaceProfileSuccess\"\nmsgstr \"變更選項成功。\"\n\nmsgid \"options_modalHeader_deleteProfile\"\nmsgstr \"刪除情境模式\"\n\nmsgid \"options_deleteProfileConfirm\"\nmsgstr \"真的要刪除這個情境模式嗎？\"\n\nmsgid \"options_modalHeader_cannotDeleteProfile\"\nmsgstr \"情境模式無法刪除\"\n\nmsgid \"options_profileReferredBy\"\nmsgstr \"這個情境模式仍然被以下情境模式使用，所以無法刪除。\"\n\nmsgid \"options_modifyReferringProfiles\"\nmsgstr \"修改以上所有情境模式並移除對此情境模式的引用後，方可刪除此情境模式。\"\n\nmsgid \"options_profileNameEmpty\"\nmsgstr \"情境模式名稱不能為空。\"\n\nmsgid \"popup_title\"\nmsgstr \"SwitchyOmega 彈出選單\"\n\nmsgid \"options_modalHeader_deleteRule\"\nmsgstr \"刪除規則\"\n\nmsgid \"options_modalHeader_proxyAuth\"\nmsgstr \"代理認證\"\n\nmsgid \"options_proxyAuthUsername\"\nmsgstr \"使用者名稱\"\n\nmsgid \"options_proxyAuthPassword\"\nmsgstr \"密碼\"\n\nmsgid \"options_proxyAuthShowPassword\"\nmsgstr \"顯示密碼\"\n\nmsgid \"options_proxyAuthHidePassword\"\nmsgstr \"隱藏密碼\"\n\nmsgid \"options_proxyAuthNone\"\nmsgstr \"(無密碼)\"\n\nmsgid \"options_deleteRuleConfirm\"\nmsgstr \"真的要刪除這個規則嗎?\"\n\nmsgid \"options_deleteRule\"\nmsgstr \"刪除\"\n\nmsgid \"options_modalHeader_resetRules\"\nmsgstr \"重設全部規則\"\n\nmsgid \"options_resetRulesConfirm\"\nmsgstr \"真的要設定所有規則對應的情境模式為以下情境模式嗎？\"\n\nmsgid \"options_resetRules\"\nmsgstr \"重設規則\"\n\nmsgid \"options_resetRules_help\"\nmsgstr \"批量設定所有規則的情境模式\"\n\nmsgid \"options_modalHeader_deleteAttached\"\nmsgstr \"移除規則清單\"\n\nmsgid \"options_deleteAttachedConfirm\"\nmsgstr \"真的要移除目前情境模式的線上規則清單嗎？\"\n\nmsgid \"options_ruleListLineCount\"\nmsgstr \"共計$COUNT$行規則\"\n\nmsgid \"options_deleteAttached\"\nmsgstr \"移除規則清單\"\n\nmsgid \"options_modalHeader_newProfile\"\nmsgstr \"建立情境模式\"\n\nmsgid \"options_newProfileName\"\nmsgstr \"情境模式名稱\"\n\nmsgid \"options_profileType\"\nmsgstr \"請選擇情境模式的類型:\"\n\nmsgid \"options_profileTypeFixedProfile\"\nmsgstr \"代理伺服器\"\n\nmsgid \"options_profileDescFixedProfile\"\nmsgstr \"經過代理伺服器訪問網站。\"\n\nmsgid \"options_profileTypePacProfile\"\nmsgstr \"PAC 情境模式\"\n\nmsgid \"options_profileDescPacProfile\"\nmsgstr \"依據線上或本機的 PAC 指令碼選擇代理。\"\n\nmsgid \"options_profileDescMorePacProfile\"\nmsgstr \"如果您沒有任何 PAC 指令碼，也沒有指令碼的網址，則不必使用此情境模式。不瞭解 PAC 的使用者不建議自行嘗試編寫指令碼。\"\n\nmsgid \"options_profileTypeSwitchProfile\"\nmsgstr \"自動切換模式\"\n\nmsgid \"options_profileDescSwitchProfile\"\nmsgstr \"依據多種條件，如網域或網址等自動選擇情境模式。您也可以匯入線上釋出的切換規則（如 AutoProxy 清單）以簡化設定。\"\n\nmsgid \"options_profileTypeRuleListProfile\"\nmsgstr \"規則清單\"\n\nmsgid \"options_profileDescRuleListProfile\"\nmsgstr \"使用他人釋出的線上規則清單來切換情境模式。\"\n\nmsgid \"options_profileTypeVirtualProfile\"\nmsgstr \"虛擬情境模式\"\n\nmsgid \"options_profileDescVirtualProfile\"\nmsgstr \"虛擬情境模式可以作為某個其他情境模式使用，並可以依據需要變更目標。一般用在自動切換中，這樣就可以一次性變更多個條件對應的代理。\"\n\nmsgid \"options_createProfile\"\nmsgstr \"建立\"\n\nmsgid \"options_modalHeader_resetOptions\"\nmsgstr \"重設選項\"\n\nmsgid \"options_resetOptionsConfirm\"\nmsgstr \"真的確定要重設選項嗎？如果繼續，現有的所有情境模式和選項將會遺失！\"\n\nmsgid \"options_formInvalid\"\nmsgstr \"請更正這個頁面中的錯誤。\"\n\nmsgid \"options_profileNotFound\"\nmsgstr \"情境模式 $PROFILE$ 不存在！選項可能已經損壞。\"\n\nmsgid \"options_resetSuccess\"\nmsgstr \"選項已經重設。\"\n\nmsgid \"options_saveSuccess\"\nmsgstr \"儲存選項成功。\"\n\nmsgid \"options_importSuccess\"\nmsgstr \"匯入選項成功。\"\n\nmsgid \"options_importFormatError\"\nmsgstr \"備份檔案格式錯誤！\"\n\nmsgid \"options_importDownloadError\"\nmsgstr \"下載備份檔案時出錯！\"\n\nmsgid \"options_profileDownloadSuccess\"\nmsgstr \"情境模式已經更新成功。\"\n\nmsgid \"options_profileDownloadError\"\nmsgstr \"下載情境模式資料時出錯！\"\n\nmsgid \"options_profileDownloadError_NetworkError\"\nmsgstr \"更新時發生網路錯誤。\"\n\nmsgid \"options_profileDownloadError_HttpError\"\nmsgstr \"更新時發生網路錯誤 (HTTP $STATUS$).\"\n\nmsgid \"options_profileDownloadError_HttpNotFoundError\"\nmsgstr \"在遠端伺服器上找不到情境模式網址對應的檔案。請檢查網址。\"\n\nmsgid \"options_profileDownloadError_HttpServerError\"\nmsgstr \"更新時遠端伺服器發生錯誤 ($STATUS$)。\"\n\nmsgid \"options_profileDownloadError_ContentTypeRejectedError\"\nmsgstr \"下載的資料不符合格式！建議您在瀏覽器中打開情境模式網址並檢查其內容。\"\n\nmsgid \"options_downloadProfileNow\"\nmsgstr \"立即更新情境模式\"\n\nmsgid \"options_guide_fixedProfileStep\"\nmsgstr \"\"\n\"<b>代理情境</b>包含了伺服器位址、埠等代理的資訊。<br>在 SwitchyOmega \"\n\"中，情境模式是代理設定的基本單元。<br>預設設定中已經建立了一個代理情境模式作為樣例。試著開啟它吧。\"\n\nmsgid \"options_guide_fixedServersStep\"\nmsgstr \"\"\n\"在這裡，您可以填寫所需的代理伺服器位址和埠。<br>SwitchyOmega<b>軟體本身不提供任何內建代理伺服器</b>。<br>如果您不清楚應該填寫什\"\n\"麼，最好諮詢下您的網路提供者，或者參考代理軟體的設定說明。\"\n\nmsgid \"options_guide_autoSwitchProfileStep\"\nmsgstr \"\"\n\"您可以通過強大的<b>自動切換模式</b>在多個代理間切換自如。<br>不過，在這個簡單的教學中無法詳盡介紹所有功能。<br>想要使用此功能時，可以開啟這\"\n\"裡的設定介面，來瞭解如何使用自動切換功能。\"\n\nmsgid \"options_guide_addMoreProfilesStep\"\nmsgstr \"如果您需要更多的情境模式，可以隨時在這裡建立<b>代理、切換和其他情境模式</b>。<br>教學到此結束，您可以繼續自訂設定。\"\n\nmsgid \"options_guide_conditionStep\"\nmsgstr \"\"\n\"SwitchyOmega \"\n\"可以依據<b>切換條件</b>對不同的網路請求使用不同的情境模式。<br>例如<b>網域萬用字元</b>條件可以對某個網域下的所有網址使用特定的情境模式。\"\n\nmsgid \"options_guide_conditionTypeStep\"\nmsgstr \"您可以使用各種條件類型來比對網域或者整個網址。<br> 點選問號按鈕來檢視條件類型的說明。\"\n\nmsgid \"options_guide_conditionProfileStep\"\nmsgstr \"\"\n\"對於<b>任何比對該條件的請求</b>，SwitchyOmega 會使用這個情境模式。<br>如果選擇了<b>\\\"[直接連線]\\\"\"\n\"情境模式</b>，則比對的請求不使用任何代理。\"\n\nmsgid \"options_guide_switchDefaultStep\"\nmsgstr \"\"\n\"如果請求不比對任何條件，則使用預設情境模式。<br>條件的比對順序總是按此頁面<b>從上到下</b>。<br>您可以拖動排序圖示來變更條件的順序。\"\n\nmsgid \"options_guide_applySwitchProfileStep\"\nmsgstr \"\"\n\"當您設定完畢後，別忘記<b>在彈出選單中啟用自動切換情境模式</b>。<br/>圖示將會顯示標籤頁切換的<b>最終結果</b>情境。<br/> \"\n\"<b>懸停在圖示上</b>則會顯示切換相關的詳細說明。\"\n\nmsgid \"popup_externalProfile\"\nmsgstr \"(外部情境模式)\"\n\nmsgid \"popup_externalProfileName\"\nmsgstr \"儲存名稱\"\n\nmsgid \"popup_proxyNotControllable_app\"\nmsgstr \"其他應用正在控制代理設定。請停用或者解除安裝發生衝突的應用。\"\n\nmsgid \"popup_proxyNotControllable_policy\"\nmsgstr \"代理設定被本機策略強制指定，無法修改。請聯繫系統管理員。\"\n\nmsgid \"popup_proxyNotControllable_unknown\"\nmsgstr \"無法設定代理設定。請檢查系統和瀏覽器設定。\"\n\nmsgid \"popup_proxyNotControllable_disabled\"\nmsgstr \"在其他程式或擴充功能的要求下，SwitchyOmega 已經停用代理設定。\"\n\nmsgid \"popup_proxyNotControllable_upgrade\"\nmsgstr \"代理設定現在由新版本的 SwitchyOmega 控制。\"\n\nmsgid \"popup_proxyNotControllableDetails\"\nmsgstr \"如果不解決以上問題，則無法使用SwitchyOmega切換代理。\"\n\nmsgid \"popup_proxyNotControllableDetails_upgrade\"\nmsgstr \"兩個不同版本的 SwitchyOmega （如穩定版和測試版）不能共存。請停用其中之一。\"\n\nmsgid \"popup_proxyNotControllableManage\"\nmsgstr \"管理擴充功能\"\n\nmsgid \"popup_addConditionTo\"\nmsgstr \"加入條件到情境模式\"\n\nmsgid \"popup_addCondition\"\nmsgstr \"加入條件\"\n\nmsgid \"popup_showOptions\"\nmsgstr \"選項\"\n\nmsgid \"popup_reportIssues\"\nmsgstr \"回報問題\"\n\nmsgid \"popup_errorLog\"\nmsgstr \"儲存錯誤記錄\"\n\nmsgid \"popup_requestErrorCount\"\nmsgstr \"$COUNT$個資源未載入\"\n\nmsgid \"popup_requestErrorHeading\"\nmsgstr \"載入失敗的資源清單\"\n\nmsgid \"popup_requestErrorWarning\"\nmsgstr \"由於網路原因，此頁面部分資源載入失敗。這些問題可能是由您的網路、代理伺服器或網站本身引起的。\"\n\nmsgid \"popup_requestErrorWarningHelp\"\nmsgstr \"這些問題並非由 SwitchyOmega 自身導致，它只不過偵測並報告了錯誤而已。\"\n\nmsgid \"popup_requestErrorAddCondition\"\nmsgstr \"您可以檢視以下網域，並依據實際情況確定是否對其使用代理。\"\n\nmsgid \"popup_requestErrorCannotAddCondition\"\nmsgstr \"在使用自動切換情境時，才可以將這些資源新增為切換條件。\"\n\nmsgid \"popup_configureMonitorWebRequests\"\nmsgstr \"設定網路偵測選項\"\n\nmsgid \"options_resultProfileForSelectedDomains\"\nmsgstr \"對所有選取網域使用此情境模式：\"\n\nmsgid \"options_pac_profile_unsupported_moz\"\nmsgstr \"由於技術限制，PAC 情境模式無法在 Mozilla Firefox 上工作！\"\n\nmsgid \"popup_issueTemplate\"\nmsgstr \"\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"<!-- ↑請在此行上方填寫問題/建議詳情，可用中文↑ -->\\n\"\n\"SwitchyOmega $projectVersion$\\n\"\n\"$userAgent$\"\n\nmsgid \"browserAction_profileDetails_PacProfile\"\nmsgstr \"(PAC 指令碼)\"\n\nmsgid \"browserAction_profileDetails_SystemProfile\"\nmsgstr \"(由其他擴充功能或系統環境控制)\"\n\nmsgid \"browserAction_profileDetails_DirectProfile\"\nmsgstr \"(不使用任何代理)\"\n\nmsgid \"browserAction_profileDetails_SwitchProfile\"\nmsgstr \"(依據條件切換)\"\n\nmsgid \"browserAction_profileDetails_RuleListProfile\"\nmsgstr \"(依據規則清單切換)\"\n\nmsgid \"browserAction_titleNormal\"\nmsgstr \"SwitchyOmega:: $PROFILE$\"\n\nmsgid \"browserAction_titleWithResult\"\nmsgstr \"\"\n\"SwitchyOmega:: $1:PROFILE$\\n\"\n\"$3:DETAILS$\"\n\nmsgid \"browserAction_titleNewerOptions\"\nmsgstr \"錯誤：需要新版本的SwitchyOmega才能載入目前選項。\"\n\nmsgid \"browserAction_titleOptionError\"\nmsgstr \"錯誤：選項檔案已經損壞，點選此處重設選項。\"\n\nmsgid \"browserAction_titleDownloadFail\"\nmsgstr \"警告：更新 PAC 檔案或規則清單失敗。\"\n\nmsgid \"browserAction_titleExternalProxy\"\nmsgstr \"注意：其他應用正在控制目前代理設定。\"\n\nmsgid \"browserAction_titleInspect\"\nmsgstr \"[檢查] $URL$\"\n\nmsgid \"browserAction_defaultRuleDetails\"\nmsgstr \"(預設)\"\n\nmsgid \"browserAction_directResult\"\nmsgstr \"直接連線\"\n\nmsgid \"browserAction_attachedPrefix\"\nmsgstr \"(清單) \"\n\nmsgid \"browserAction_tempRulePrefix\"\nmsgstr \"(臨時) \"\n\nmsgid \"contextMenu_inspectPage\"\nmsgstr \"檢查此頁面使用的代理\"\n\nmsgid \"contextMenu_inspectFrame\"\nmsgstr \"檢查此[框架頁面]使用的代理\"\n\nmsgid \"contextMenu_inspectLink\"\nmsgstr \"檢查此[連結目標]將會使用的代理\"\n\nmsgid \"contextMenu_inspectElement\"\nmsgstr \"檢查此[元素]使用的代理\"\n\nmsgid \"contextMenu_enableQuickSwitch\"\nmsgstr \"啟用快速切換\"\n\nmsgid \"about_title\"\nmsgstr \"關於\"\n\nmsgid \"about_app_description\"\nmsgstr \"一個代理設定工具\"\n\nmsgid \"about_version\"\nmsgstr \"版本 $VERSION$\"\n\nmsgid \"about_experimental_warning_moz\"\nmsgstr \"Mozilla Firefox 瀏覽器支持目前仍處於早期實驗階段！如果您遇到任何問題，請使用下方的按鈕進行回報。\"\n\nmsgid \"about_disclaimer_networkService\"\nmsgstr \"SwitchyOmega 不提供代理伺服器、VPN等網路服務。\"\n\nmsgid \"about_disclaimer_privacy\"\nmsgstr \"SwitchyOmega 不會跟蹤您的上網記錄，不在頁面中插入廣告。請參見我們的\"\n\"<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/Privacy#%E4%B8%AD%E6%96%87'>隱私政策</a>。\"\n\nmsgid \"about_help\"\nmsgstr \"\"\n\"如有其他問題或者需要說明，請參考<a href='https://github.com/FelisCatus/SwitchyOmega/wiki/\"\n\"%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98'>常見問題</a>。\"\n\nmsgid \"about_copyright\"\nmsgstr \"版權所有 2012-2017 <a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>The SwitchyOmega Authors</a>. 保留所有權利。\"\n\nmsgid \"about_credits\"\nmsgstr \"SwitchyOmega 的誕生離不開 <a href='https://github.com/FelisCatus/SwitchyOmega'>SwitchyOmega</a> 開源項目和其他<a href='https://github.com/FelisCatus/SwitchyOmega/blob/master/AUTHORS'>開源軟體</a>。\"\n\nmsgid \"about_license\"\nmsgstr \"SwitchyOmega 是<a href='https://www.gnu.org/philosophy/free-sw.zh-tw.html'>自由軟體</a>，使用<a href='https://www.gnu.org/licenses/gpl.html'>GNU General Public License</a> 版本 3 及以上授權。\"\n"
  },
  {
    "path": "omega-pac/.gitattributes",
    "content": "uglifyjs.js linguist-vendored\n"
  },
  {
    "path": "omega-pac/.gitignore",
    "content": "/index.js\n/omega_pac.min.js\n"
  },
  {
    "path": "omega-pac/Gruntfile.coffee",
    "content": "module.exports = require('load-grunt-config')\n"
  },
  {
    "path": "omega-pac/grunt/aliases.coffee",
    "content": "module.exports =\n  default: [\n    'coffeelint'\n    'browserify'\n  ]\n  test: ['mochaTest']\n"
  },
  {
    "path": "omega-pac/grunt/browserify.coffee",
    "content": "module.exports =\n  index:\n    files:\n      'index.js': 'index.coffee'\n    options:\n      transform: ['coffeeify']\n      exclude: ['uglify-js', 'ip-address']\n      browserifyOptions:\n        extensions: '.coffee'\n        builtins: []\n        standalone: 'index.coffee'\n        debug: true\n  browser:\n    files:\n      'omega_pac.min.js': './index.coffee'\n    options:\n      alias: [\n        './index.coffee:OmegaPac'\n      ]\n      transform: ['coffeeify']\n      plugin:\n        if process.env.BUILD == 'release'\n          [['minifyify', {map: false}]]\n        else\n          []\n      browserifyOptions:\n        extensions: '.coffee'\n        standalone: 'OmegaPac'\n"
  },
  {
    "path": "omega-pac/grunt/coffeelint.coffee",
    "content": "module.exports =\n  options:\n    arrow_spacing: level: 'error'\n    colon_assignment_spacing:\n      level: 'error'\n      spacing:\n        left: 0\n        right: 1\n    missing_fat_arrows: level: 'warn'\n    no_empty_functions: level: 'error'\n    no_empty_param_list: level: 'error'\n    no_interpolation_in_single_quotes: level: 'error'\n    no_stand_alone_at: level: 'error'\n    space_operators: level: 'error'\n    # https://github.com/clutchski/coffeelint/issues/525\n    indentation: level: 'ignore'\n\n  gruntfile: ['Gruntfile.coffee']\n  tasks: ['grunt/**/*.coffee']\n  src: ['src/**/*.coffee', 'test/**/*.coffee']\n"
  },
  {
    "path": "omega-pac/grunt/mochaTest.coffee",
    "content": "module.exports =\n  test:\n    options:\n      reporter: 'spec'\n      require: 'coffee-script/register'\n    src: ['test/**/*.coffee']\n"
  },
  {
    "path": "omega-pac/grunt/watch.coffee",
    "content": "module.exports =\n  grunt:\n    options:\n      reload: true\n    files:\n      'grunt/*'\n    tasks: ['coffeelint:tasks', 'default']\n  src:\n    files: ['src/**/*.coffee', 'test/**/*.coffee']\n    tasks: ['default']\n"
  },
  {
    "path": "omega-pac/index.coffee",
    "content": "module.exports =\n  Conditions: require('./src/conditions')\n  PacGenerator: require('./src/pac_generator')\n  Profiles: require('./src/profiles')\n  RuleList: require('./src/rule_list')\n  ShexpUtils: require('./src/shexp_utils')\n\nfor name, value of require('./src/utils.coffee')\n  module.exports[name] = value\n"
  },
  {
    "path": "omega-pac/package.json",
    "content": "{\n  \"name\": \"omega-pac\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"main\": \"./index.js\",\n  \"devDependencies\": {\n    \"chai\": \"~1.9.1\",\n    \"coffee-script\": \"^1.7.1\",\n    \"coffeeify\": \"^0.7.0\",\n    \"coffeelint\": \"^1.16.0\",\n    \"grunt\": \"^0.4.5\",\n    \"grunt-browserify\": \"^3.0.0\",\n    \"grunt-coffeelint\": \"^0.0.13\",\n    \"grunt-contrib-coffee\": \"^0.11.1\",\n    \"grunt-contrib-watch\": \"^0.6.1\",\n    \"grunt-mocha-test\": \"~0.11.0\",\n    \"load-grunt-config\": \"^0.13.1\",\n    \"lolex\": \"^1.4.0\",\n    \"minifyify\": \"^4.1.1\"\n  },\n  \"dependencies\": {\n    \"ip-address\": \"^4.0.0\",\n    \"tldjs\": \"^1.5.2\",\n    \"uglify-js\": \"^2.4.15\"\n  },\n  \"browser\": {\n    \"uglify-js\": \"./uglifyjs-shim.js\",\n    \"uglify-js-real\": \"./uglifyjs.js\"\n  },\n  \"scripts\": {\n    \"dev\": \"npm link\",\n    \"test\": \"TZ=Europe/London grunt test\"\n  }\n}\n"
  },
  {
    "path": "omega-pac/src/conditions.coffee",
    "content": "U2 = require 'uglify-js'\nIP = require 'ip-address'\nUrl = require 'url'\n{shExp2RegExp, escapeSlash} = require './shexp_utils'\n{AttachedCache} = require './utils'\n\nmodule.exports = exports =\n  requestFromUrl: (url) ->\n    if typeof url == 'string'\n      url = Url.parse url\n    req =\n      url: Url.format(url)\n      host: url.hostname\n      scheme: url.protocol.replace(':', '')\n\n  urlWildcard2HostWildcard: (pattern) ->\n    result = pattern.match ///\n      ^\\*:\\/\\/ # Begins with *://\n      ((?:\\w|[?*._\\-])+) # The host part follows.\n      \\/\\*$ # And ends with /*\n    ///\n    result?[1]\n  tag: (condition) -> exports._condCache.tag(condition)\n  analyze: (condition) -> exports._condCache.get condition, -> {\n    analyzed: exports._handler(condition.conditionType).analyze.call(\n      exports, condition)\n  }\n  match: (condition, request) ->\n    cache = exports.analyze(condition)\n    exports._handler(condition.conditionType).match.call(exports, condition,\n      request, cache)\n  compile: (condition) ->\n    cache = exports.analyze(condition)\n    return cache.compiled if cache.compiled\n    handler = exports._handler(condition.conditionType)\n    cache.compiled = handler.compile.call(exports, condition, cache)\n  str: (condition, {abbr} = {abbr: -1}) ->\n    handler = exports._handler(condition.conditionType)\n    if handler.abbrs[0].length == 0\n      endCode = condition.pattern.charCodeAt(condition.pattern.length - 1)\n      if endCode != exports.colonCharCode and condition.pattern.indexOf(' ') < 0\n        return condition.pattern\n    str = handler.str\n    typeStr =\n      if typeof abbr == 'number'\n        handler.abbrs[(handler.abbrs.length + abbr) % handler.abbrs.length]\n      else\n        condition.conditionType\n    result = typeStr + ':'\n    part = if str then str.call(exports, condition) else condition.pattern\n    result += ' ' + part if part\n    return result\n\n  colonCharCode: ':'.charCodeAt(0)\n  fromStr: (str) ->\n    str = str.trim()\n    i = str.indexOf(' ')\n    i = str.length if i < 0\n    if str.charCodeAt(i - 1) == exports.colonCharCode\n      conditionType = str.substr(0, i - 1)\n      str = str.substr(i + 1).trim()\n    else\n      conditionType = ''\n\n    conditionType = exports.typeFromAbbr(conditionType)\n    return null unless conditionType\n    condition = {conditionType: conditionType}\n    fromStr = exports._handler(condition.conditionType).fromStr\n    if fromStr\n      return fromStr.call(exports, str, condition)\n    else\n      condition.pattern = str\n      return condition\n\n  _abbrs: null\n  typeFromAbbr: (abbr) ->\n    if not exports._abbrs\n      exports._abbrs = {}\n      for own type, {abbrs} of exports._conditionTypes\n        exports._abbrs[type.toUpperCase()] = type\n        for ab in abbrs\n          exports._abbrs[ab.toUpperCase()] = type\n\n    return exports._abbrs[abbr.toUpperCase()]\n\n  comment: (comment, node) ->\n    return node unless comment\n    node.start ?= {}\n    # This hack is needed to allow dumping comments in repeated print call.\n    Object.defineProperty node.start, '_comments_dumped',\n      get: -> false\n      set: -> false\n    node.start.comments_before ?= []\n    node.start.comments_before.push {type: 'comment2', value: comment}\n    node\n\n  safeRegex: (expr) ->\n    try\n      new RegExp(expr)\n    catch _\n      # Invalid regexp! Fall back to a regexp that does not match anything.\n      /(?!)/\n\n  regTest: (expr, regexp) ->\n    if typeof regexp == 'string'\n      # Escape (unescaped) forward slash for use in regex literals.\n      regexp = regexSafe escapeSlash regexp\n    if typeof expr == 'string'\n      expr = new U2.AST_SymbolRef name: expr\n    new U2.AST_Call\n      args: [expr]\n      expression: new U2.AST_Dot(\n        property: 'test'\n        expression: new U2.AST_RegExp value: regexp\n      )\n  isInt: (num) ->\n    (typeof num == 'number' and !isNaN(num) and\n      parseFloat(num) == parseInt(num, 10))\n  between: (val, min, max, comment) ->\n    if min == max\n      if typeof min == 'number'\n        min = new U2.AST_Number value: min\n      return exports.comment comment, new U2.AST_Binary(\n        left: val\n        operator: '==='\n        right: min\n      )\n    if min > max\n      return exports.comment comment, new U2.AST_False\n    if exports.isInt(min) and exports.isInt(max) and max - min < 32\n      comment ||= \"#{min} <= value && value <= #{max}\"\n      tmpl = \"0123456789abcdefghijklmnopqrstuvwxyz\"\n      str =\n        if max < tmpl.length\n          tmpl.substr(min, max - min + 1)\n        else\n          tmpl.substr(0, max - min + 1)\n      pos = if min == 0 then val else\n        new U2.AST_Binary(\n          left: val\n          operator: '-'\n          right: new U2.AST_Number value: min\n        )\n      return exports.comment comment, new U2.AST_Binary(\n        left: new U2.AST_Call(\n          expression: new U2.AST_Dot(\n            expression: new U2.AST_String value: str\n            property: 'charCodeAt'\n          )\n          args: [pos]\n        )\n        operator: '>'\n        right: new U2.AST_Number value: 0\n      )\n    if typeof min == 'number'\n      min = new U2.AST_Number value: min\n    if typeof max == 'number'\n      max = new U2.AST_Number value: max\n    exports.comment comment, new U2.AST_Call(\n      args: [val, min, max]\n      expression: new U2.AST_Function (\n        argnames: [\n          new U2.AST_SymbolFunarg name: 'value'\n          new U2.AST_SymbolFunarg name: 'min'\n          new U2.AST_SymbolFunarg name: 'max'\n        ]\n        body: [\n          new U2.AST_Return value: new U2.AST_Binary(\n            left: new U2.AST_Binary(\n              left: new U2.AST_SymbolRef name: 'min'\n              operator: '<='\n              right: new U2.AST_SymbolRef name: 'value'\n            )\n            operator: '&&'\n            right: new U2.AST_Binary(\n              left: new U2.AST_SymbolRef name: 'value'\n              operator: '<='\n              right: new U2.AST_SymbolRef name: 'max'\n            )\n          )\n        ]\n      )\n    )\n\n  parseIp: (ip) ->\n    if ip.charCodeAt(0) == '['.charCodeAt(0)\n      ip = ip.substr 1, ip.length - 2\n    addr = new IP.v4.Address(ip)\n    if not addr.isValid()\n      addr = new IP.v6.Address(ip)\n      if not addr.isValid()\n        return null\n    return addr\n  normalizeIp: (addr) ->\n    return (addr.correctForm ? addr.canonicalForm).call(addr)\n  ipv6Max: new IP.v6.Address('::/0').endAddress().canonicalForm()\n\n  localHosts: [\"127.0.0.1\", \"[::1]\", \"localhost\"]\n\n  getWeekdayList: (condition) ->\n    if condition.days\n      condition.days.charCodeAt(i) > 64 for i in [0...7]\n    else\n      condition.startDay <= i <= condition.endDay for i in [0...7]\n\n  _condCache: new AttachedCache (condition) ->\n    tag = exports._handler(condition.conditionType).tag\n    result =\n      if tag then tag.apply(exports, arguments) else exports.str(condition)\n\n    condition.conditionType + '$' + result\n\n  _setProp: (obj, prop, value) ->\n    if not Object::hasOwnProperty.call obj, prop\n      Object.defineProperty obj, prop, writable: true\n    obj[prop] = value\n\n  _handler: (conditionType) ->\n    if typeof conditionType != 'string'\n      conditionType = conditionType.conditionType\n    handler = exports._conditionTypes[conditionType]\n\n    if not handler?\n      throw new Error \"Unknown condition type: #{conditionType}\"\n    return handler\n\n  _conditionTypes:\n    # These functions are .call()-ed with `this` set to module.exports.\n    # coffeelint: disable=missing_fat_arrows\n    'TrueCondition':\n      abbrs: ['True']\n      analyze: (condition) -> null\n      match: -> true\n      compile: (condition) -> new U2.AST_True\n      str: (condition) -> ''\n      fromStr: (str, condition) -> condition\n\n    'FalseCondition':\n      abbrs: ['False', 'Disabled']\n      analyze: (condition) -> null\n      match: -> false\n      compile: (condition) -> new U2.AST_False\n      fromStr: (str, condition) ->\n        if str.length > 0\n          condition.pattern = str\n        condition\n\n    'UrlRegexCondition':\n      abbrs: ['UR', 'URegex', 'UrlR', 'UrlRegex']\n      analyze: (condition) -> @safeRegex escapeSlash condition.pattern\n      match: (condition, request, cache) ->\n        return cache.analyzed.test(request.url)\n      compile: (condition, cache) ->\n        @regTest 'url', cache.analyzed\n\n    'UrlWildcardCondition':\n      abbrs: ['U', 'UW', 'Url', 'UrlW', 'UWild', 'UWildcard', 'UrlWild',\n              'UrlWildcard']\n      analyze: (condition) ->\n        parts = for pattern in condition.pattern.split('|') when pattern\n          shExp2RegExp pattern, trimAsterisk: true\n        @safeRegex parts.join('|')\n      match: (condition, request, cache) ->\n        return cache.analyzed.test(request.url)\n      compile: (condition, cache) ->\n        @regTest 'url', cache.analyzed\n\n    'HostRegexCondition':\n      abbrs: ['R', 'HR', 'Regex', 'HostR', 'HRegex', 'HostRegex']\n      analyze: (condition) -> @safeRegex escapeSlash condition.pattern\n      match: (condition, request, cache) ->\n        return cache.analyzed.test(request.host)\n      compile: (condition, cache) ->\n        @regTest 'host', cache.analyzed\n\n    'HostWildcardCondition':\n      abbrs: ['', 'H', 'W', 'HW', 'Wild', 'Wildcard', 'Host', 'HostW', 'HWild',\n              'HWildcard', 'HostWild', 'HostWildcard']\n      analyze: (condition) ->\n        parts = for pattern in condition.pattern.split('|') when pattern\n          # Get the magical regex of this pattern. See\n          # https://github.com/FelisCatus/SwitchyOmega/wiki/Host-wildcard-condition\n          # for the magic.\n          if pattern.charCodeAt(0) == '.'.charCodeAt(0)\n            pattern = '*' + pattern\n\n          if pattern.indexOf('**.') == 0\n            shExp2RegExp pattern.substring(1), trimAsterisk: true\n          else if pattern.indexOf('*.') == 0\n            shExp2RegExp(pattern.substring(2), trimAsterisk: false)\n              .replace(/./, '(?:^|\\\\.)').replace(/\\.\\*\\$$/, '')\n          else\n            shExp2RegExp pattern, trimAsterisk: true\n        @safeRegex parts.join('|')\n      match: (condition, request, cache) ->\n        return cache.analyzed.test(request.host)\n      compile: (condition, cache) ->\n        @regTest 'host', cache.analyzed\n\n    'BypassCondition':\n      abbrs: ['B', 'Bypass']\n      analyze: (condition) ->\n        # See https://developer.chrome.com/extensions/proxy#bypass_list\n        cache =\n          host: null\n          ip: null\n          scheme: null\n          url: null\n          normalizedPattern: ''\n        server = condition.pattern\n        if server == '<local>'\n          cache.host = server\n          return cache\n        parts = server.split '://'\n        if parts.length > 1\n          cache.scheme = parts[0]\n          cache.normalizedPattern = cache.scheme + '://'\n          server = parts[1]\n\n        parts = server.split '/'\n        if parts.length > 1\n          addr = @parseIp parts[0]\n          prefixLen = parseInt(parts[1])\n          if addr and not isNaN(prefixLen)\n            cache.ip =\n              conditionType: 'IpCondition'\n              ip: @normalizeIp addr\n              prefixLength: prefixLen\n            cache.normalizedPattern += cache.ip.ip + '/' + cache.ip.prefixLength\n            return cache\n        # The server can be an IP address with or without brackets.\n        serverIp = @parseIp(server)\n        if not serverIp?\n          pos = server.lastIndexOf(':')\n          if pos >= 0\n            matchPort = server.substring(pos + 1)\n            server = server.substring(0, pos)\n          serverIp = @parseIp server\n        if serverIp?\n          server = @normalizeIp serverIp\n          if serverIp.v4\n            cache.normalizedPattern += server\n          else\n            cache.normalizedPattern += '[' + server + ']'\n        else\n          if server.charCodeAt(0) == '.'.charCodeAt(0)\n            server = '*' + server\n          cache.normalizedPattern = server\n\n        if matchPort\n          cache.port = matchPort\n          cache.normalizedPattern += ':' + cache.port\n          # In URL, IPv6 server addresses need to be bracketed.\n          if serverIp? and not serverIp.v4\n            server = '[' + server + ']'\n          serverRegex = shExp2RegExp(server)\n          serverRegex = serverRegex.substring(1, serverRegex.length - 1)\n          scheme = cache.scheme ? '[^:]+'\n          cache.url = @safeRegex('^' + scheme + ':\\\\/\\\\/' + serverRegex +\n            ':' + matchPort + '\\\\/')\n        else if server != '*'\n          # In host, IPv6 server addresses are never bracketed.\n          serverRegex = shExp2RegExp server, trimAsterisk: true\n          cache.host = @safeRegex(serverRegex)\n        return cache\n      match: (condition, request, cache) ->\n        cache = cache.analyzed\n        return false if cache.scheme? and cache.scheme != request.scheme\n        return false if cache.ip? and not @match cache.ip, request\n        if cache.host?\n          if cache.host == '<local>'\n            # https://code.google.com/p/chromium/codesearch#chromium/src/net/proxy/proxy_bypass_rules.cc&sq=package:chromium&l=67\n            # We align with Chromium's behavior of bypassing 127.0.0.1, ::1 as\n            # well as any host without dots.\n            #\n            # This, however, will match IPv6 literals who also don't have dots.\n            return (\n              request.host == '127.0.0.1' or\n              request.host == '::1' or\n              request.host.indexOf('.') < 0\n            )\n          else\n            return false if not cache.host.test(request.host)\n        return false if cache.url? and !cache.url.test(request.url)\n        return true\n      str: (condition) ->\n        analyze = @_handler(condition).analyze\n        cache = analyze.call(exports, condition)\n        if cache.normalizedPattern\n          return cache.normalizedPattern\n        else\n          return condition.pattern\n      compile: (condition, cache) ->\n        cache = cache.analyzed\n        if cache.url?\n          return @regTest 'url', cache.url\n        conditions = []\n        if cache.host == '<local>'\n          hostEquals = (host) -> new U2.AST_Binary(\n            left: new U2.AST_SymbolRef name: 'host'\n            operator: '==='\n            right: new U2.AST_String value: host\n          )\n          return new U2.AST_Binary(\n            left: new U2.AST_Binary(\n              left: hostEquals '127.0.0.1'\n              operator: '||'\n              right: hostEquals '::1'\n            )\n            operator: '||'\n            right: new U2.AST_Binary(\n              left: new U2.AST_Call(\n                expression: new U2.AST_Dot(\n                  expression: new U2.AST_SymbolRef name: 'host'\n                  property: 'indexOf'\n                )\n                args: [new U2.AST_String value: '.']\n              )\n              operator: '<'\n              right: new U2.AST_Number value: 0\n            )\n          )\n        if cache.scheme?\n          conditions.push new U2.AST_Binary(\n            left: new U2.AST_SymbolRef name: 'scheme'\n            operator: '==='\n            right: new U2.AST_String value: cache.scheme\n          )\n        if cache.host?\n          conditions.push @regTest 'host', cache.host\n        else if cache.ip?\n          conditions.push @compile cache.ip\n        switch conditions.length\n          when 0 then new U2.AST_True\n          when 1 then conditions[0]\n          when 2 then new U2.AST_Binary(\n            left: conditions[0]\n            operator: '&&'\n            right: conditions[1]\n          )\n    'KeywordCondition':\n      abbrs: ['K', 'KW', 'Keyword']\n      analyze: (condition) -> null\n      match: (condition, request) ->\n        request.scheme == 'http' and request.url.indexOf(condition.pattern) >= 0\n      compile: (condition) ->\n        new U2.AST_Binary(\n          left: new U2.AST_Binary(\n            left: new U2.AST_SymbolRef name: 'scheme'\n            operator: '==='\n            right: new U2.AST_String value: 'http'\n          )\n          operator: '&&'\n          right: new U2.AST_Binary(\n            left: new U2.AST_Call(\n              expression: new U2.AST_Dot(\n                expression: new U2.AST_SymbolRef name: 'url'\n                property: 'indexOf'\n              )\n              args: [new U2.AST_String value: condition.pattern]\n            )\n            operator: '>='\n            right: new U2.AST_Number value: 0\n          )\n        )\n\n    'IpCondition':\n      abbrs: ['Ip']\n      analyze: (condition) ->\n        cache =\n          addr: null\n          normalized: null\n        ip = condition.ip\n        if ip.charCodeAt(0) == '['.charCodeAt(0)\n          ip = ip.substr 1, ip.length - 2\n        addr = ip + '/' + condition.prefixLength\n        cache.addr = @parseIp addr\n        if not cache.addr?\n          throw new Error \"Invalid IP address #{addr}\"\n        cache.normalized = @normalizeIp cache.addr\n        mask = if cache.addr.v4\n          new IP.v4.Address('255.255.255.255/' + cache.addr.subnetMask)\n        else\n          new IP.v6.Address(@ipv6Max + '/' + cache.addr.subnetMask)\n        cache.mask = @normalizeIp mask.startAddress()\n        cache\n      match: (condition, request, cache) ->\n        addr = @parseIp request.host\n        return false if not addr?\n        cache = cache.analyzed\n        return false if addr.v4 != cache.addr.v4\n        return addr.isInSubnet cache.addr\n      compile: (condition, cache) ->\n        cache = cache.analyzed\n        # We want to make sure that host is not a domain name before we pass it\n        # to isInNet. Otherwise an expensive dns lookup might be triggered.\n        hostLooksLikeIp =\n          if cache.addr.v4\n            # For performance reasons, we just check the last character of host.\n            # If it's a digit, we assume that host is valid IPv4 address.\n            new U2.AST_Binary\n              left: new U2.AST_Sub\n                expression: new U2.AST_SymbolRef name: 'host'\n                property: new U2.AST_Binary\n                  left: new U2.AST_Dot(\n                    expression: new U2.AST_SymbolRef name: 'host'\n                    property: 'length'\n                  )\n                  operator: '-'\n                  right: new U2.AST_Number value: 1\n              operator: '>='\n              right: new U2.AST_Number value: 0\n          else\n            # Likewise, we assume that host is valid IPv6 if it contains colons.\n            new U2.AST_Binary(\n              left: new U2.AST_Call(\n                expression: new U2.AST_Dot(\n                  expression: new U2.AST_SymbolRef name: 'host'\n                  property: 'indexOf'\n                )\n                args: [new U2.AST_String value: ':']\n              )\n              operator: '>='\n              right: new U2.AST_Number value: 0\n            )\n        if cache.addr.subnetMask == 0\n          # 0.0.0.0/0 (matches all IPv4 literals), or ::/0 (all IPv6 literals).\n          # Use hostLooksLikeIp instead of isInNet for better efficiency and\n          # browser support.\n          return hostLooksLikeIp\n        hostIsInNet = new U2.AST_Call(\n          expression: new U2.AST_SymbolRef name: 'isInNet'\n          args: [\n            new U2.AST_SymbolRef name: 'host'\n            new U2.AST_String value: cache.normalized\n            new U2.AST_String value: cache.mask\n          ]\n        )\n        if not cache.addr.v4\n          # Example: isInNetEx(host,\"fefe:13::abc/33\")\n          # For documentation on the isInNetEx function, see:\n          # https://msdn.microsoft.com/en-us/library/windows/desktop/gg308479(v=vs.85).aspx\n          hostIsInNetEx = new U2.AST_Call(\n            expression: new U2.AST_SymbolRef name: 'isInNetEx'\n            args: [\n              new U2.AST_SymbolRef name: 'host'\n              new U2.AST_String value: cache.normalized + cache.addr.subnet\n            ]\n          )\n          # Use isInNetEx if possible.\n          hostIsInNet = new U2.AST_Conditional(\n            condition: new U2.AST_Binary(\n              left: new U2.AST_UnaryPrefix(\n                operator: 'typeof'\n                expression: new U2.AST_SymbolRef name: 'isInNetEx'\n              )\n              operator: '==='\n              right: new U2.AST_String value: 'function'\n            )\n            consequent: hostIsInNetEx\n            alternative: hostIsInNet\n          )\n        return new U2.AST_Binary(\n          left: hostLooksLikeIp\n          operator: '&&'\n          right: hostIsInNet\n        )\n      str: (condition) -> condition.ip + '/' + condition.prefixLength\n      fromStr: (str, condition) ->\n        addr = @parseIp str\n        if addr?\n          condition.ip = addr.addressMinusSuffix\n          condition.prefixLength = addr.subnetMask\n        else\n          condition.ip = '0.0.0.0'\n          condition.prefixLength = 0\n        condition\n\n    'HostLevelsCondition':\n      abbrs: ['Lv', 'Level', 'Levels', 'HL', 'HLv', 'HLevel', 'HLevels',\n              'HostL', 'HostLv', 'HostLevel', 'HostLevels']\n      analyze: (condition) -> '.'.charCodeAt 0\n      match: (condition, request, cache) ->\n        dotCharCode = cache.analyzed\n        dotCount = 0\n        for i in [0...request.host.length]\n          if request.host.charCodeAt(i) == dotCharCode\n            dotCount++\n            return false if dotCount > condition.maxValue\n        return dotCount >= condition.minValue\n      compile: (condition) ->\n        val = new U2.AST_Dot(\n          property: 'length'\n          expression: new U2.AST_Call(\n            args: [new U2.AST_String value: '.']\n            expression: new U2.AST_Dot(\n              expression: new U2.AST_SymbolRef name: 'host'\n              property: 'split'\n            )\n          )\n        )\n        @between(val, condition.minValue + 1, condition.maxValue + 1,\n          \"#{condition.minValue} <= hostLevels <= #{condition.maxValue}\")\n      str: (condition) -> condition.minValue + '~' + condition.maxValue\n      fromStr: (str, condition) ->\n        [minValue, maxValue] = str.split('~')\n        condition.minValue = parseInt(minValue, 10)\n        condition.maxValue = parseInt(maxValue, 10)\n        condition.minValue = 1 unless condition.minValue > 0\n        condition.maxValue = 1 unless condition.maxValue > 0\n        condition\n\n    'WeekdayCondition':\n      abbrs: ['WD', 'Week', 'Day', 'Weekday']\n      analyze: (condition) -> null\n      match: (condition, request) ->\n        day = new Date().getDay()\n        return condition.days.charCodeAt(day) > 64 if condition.days\n        return condition.startDay <= day and day <= condition.endDay\n      compile: (condition) ->\n        getDay = new U2.AST_Call(\n          args: []\n          expression: new U2.AST_Dot(\n            property: 'getDay'\n            expression: new U2.AST_New(\n              args: []\n              expression: new U2.AST_SymbolRef name: 'Date'\n            )\n          )\n        )\n        if condition.days\n          new U2.AST_Binary(\n            left: new U2.AST_Call(\n              expression: new U2.AST_Dot(\n                expression: new U2.AST_String value: condition.days\n                property: 'charCodeAt'\n              )\n              args: [getDay]\n            )\n            operator: '>'\n            right: new U2.AST_Number value: 64\n          )\n        else\n          @between getDay, condition.startDay, condition.endDay\n      str: (condition) ->\n        if condition.days\n          condition.days\n        else\n          condition.startDay + '~' + condition.endDay\n      fromStr: (str, condition) ->\n        if str.indexOf('~') < 0 and str.length == 7\n          condition.days = str\n        else\n          [startDay, endDay] = str.split('~')\n          condition.startDay = parseInt(startDay, 10)\n          condition.endDay = parseInt(endDay, 10)\n          condition.startDay = 0 unless 0 <= condition.startDay <= 6\n          condition.endDay = 0 unless 0 <= condition.endDay <= 6\n        condition\n\n    'TimeCondition':\n      abbrs: ['T', 'Time', 'Hour']\n      analyze: (condition) -> null\n      match: (condition, request) ->\n        hour = new Date().getHours()\n        return condition.startHour <= hour and hour <= condition.endHour\n      compile: (condition) ->\n        val = new U2.AST_Call(\n          args: []\n          expression: new U2.AST_Dot(\n            property: 'getHours'\n            expression: new U2.AST_New(\n              args: []\n              expression: new U2.AST_SymbolRef name: 'Date'\n            )\n          )\n        )\n        @between val, condition.startHour, condition.endHour\n      str: (condition) -> condition.startHour + '~' + condition.endHour\n      fromStr: (str, condition) ->\n        [startHour, endHour] = str.split('~')\n        condition.startHour = parseInt(startHour, 10)\n        condition.endHour = parseInt(endHour, 10)\n        condition.startHour = 0 unless 0 <= condition.startHour < 24\n        condition.endHour = 0 unless 0 <= condition.endHour < 24\n        condition\n    # coffeelint: enable=missing_fat_arrows\n"
  },
  {
    "path": "omega-pac/src/pac_generator.coffee",
    "content": "U2 = require 'uglify-js'\nProfiles = require './profiles'\n\n# PacGenerator is used like a singleton class instance.\n# coffeelint: disable=missing_fat_arrows\nmodule.exports =\n  ascii: (str) ->\n    str.replace /[\\u0080-\\uffff]/g, (char) ->\n      hex = char.charCodeAt(0).toString(16)\n      result = '\\\\u'\n      result += '0' for _ in [hex.length...4]\n      result += hex\n      return result\n\n  compress: (ast) ->\n    ast.figure_out_scope()\n    compressor = U2.Compressor(warnings: false, keep_fargs: true,\n      if_return: false)\n    compressed_ast = ast.transform(compressor)\n    compressed_ast.figure_out_scope()\n    compressed_ast.compute_char_frequency()\n    compressed_ast.mangle_names()\n    compressed_ast\n\n  script: (options, profile, args) ->\n    if typeof profile == 'string'\n      profile = Profiles.byName(profile, options)\n    refs = Profiles.allReferenceSet(profile, options,\n      profileNotFound: args?.profileNotFound)\n\n    profiles = new U2.AST_Object properties:\n      for key, name of refs when key != '+direct'\n        p = if typeof profile == 'object' and profile.name == name\n          profile\n        else\n          Profiles.byName(name, options)\n        if not p?\n          p = Profiles.profileNotFound(name, args?.profileNotFound)\n        new U2.AST_ObjectKeyVal(key: key, value: Profiles.compile(p))\n\n    factory = new U2.AST_Function(\n      argnames: [\n        new U2.AST_SymbolFunarg name: 'init'\n        new U2.AST_SymbolFunarg name: 'profiles'\n      ]\n      body: [new U2.AST_Return value: new U2.AST_Function(\n        argnames: [\n          new U2.AST_SymbolFunarg name: 'url'\n          new U2.AST_SymbolFunarg name: 'host'\n        ]\n        body: [\n          new U2.AST_Directive value: 'use strict'\n          new U2.AST_Var definitions: [\n            new U2.AST_VarDef name: new U2.AST_SymbolVar(name: 'result'), value:\n              new U2.AST_SymbolRef name: 'init'\n            new U2.AST_VarDef name: new U2.AST_SymbolVar(name: 'scheme'), value:\n              new U2.AST_Call(\n                expression: new U2.AST_Dot(\n                  expression: new U2.AST_SymbolRef name: 'url'\n                  property: 'substr'\n                )\n                args: [\n                  new U2.AST_Number value: 0\n                  new U2.AST_Call(\n                    expression: new U2.AST_Dot(\n                      expression: new U2.AST_SymbolRef name: 'url'\n                      property: 'indexOf'\n                    )\n                    args: [new U2.AST_String value: ':']\n                  )\n                ]\n              )\n          ]\n          new U2.AST_Do(\n            body: new U2.AST_BlockStatement body: [\n              new U2.AST_SimpleStatement body: new U2.AST_Assign(\n                left: new U2.AST_SymbolRef name: 'result'\n                operator: '='\n                right: new U2.AST_Sub(\n                  expression: new U2.AST_SymbolRef name: 'profiles'\n                  property: new U2.AST_SymbolRef name: 'result'\n                )\n              )\n              new U2.AST_If(\n                condition: new U2.AST_Binary(\n                  left: new U2.AST_UnaryPrefix(\n                    operator: 'typeof'\n                    expression: new U2.AST_SymbolRef name: 'result'\n                  )\n                  operator: '==='\n                  right: new U2.AST_String value: 'function'\n                )\n                body: new U2.AST_SimpleStatement body: new U2.AST_Assign(\n                  left: new U2.AST_SymbolRef name: 'result'\n                  operator: '='\n                  right: new U2.AST_Call(\n                    expression: new U2.AST_SymbolRef name: 'result'\n                    args: [\n                      new U2.AST_SymbolRef name: 'url'\n                      new U2.AST_SymbolRef name: 'host'\n                      new U2.AST_SymbolRef name: 'scheme'\n                    ]\n                  )\n                )\n              )\n            ]\n            condition: new U2.AST_Binary(\n              left: new U2.AST_Binary(\n                left: new U2.AST_UnaryPrefix(\n                  operator: 'typeof'\n                  expression: new U2.AST_SymbolRef name: 'result'\n                )\n                operator: '!=='\n                right: new U2.AST_String value: 'string'\n              )\n              operator: '||'\n              right: new U2.AST_Binary(\n                left: new U2.AST_Call(\n                  expression: new U2.AST_Dot(\n                    expression: new U2.AST_SymbolRef name: 'result'\n                    property: 'charCodeAt'\n                  )\n                  args: [new U2.AST_Number(value: 0)]\n                )\n                operator: '==='\n                right: new U2.AST_Number value: '+'.charCodeAt(0)\n              )\n            )\n          )\n          new U2.AST_Return value: new U2.AST_SymbolRef name: 'result'\n        ]\n      )]\n    )\n    new U2.AST_Toplevel body: [new U2.AST_Var definitions: [\n      new U2.AST_VarDef(\n        name: new U2.AST_SymbolVar name: 'FindProxyForURL'\n        value: new U2.AST_Call(\n          expression: factory\n          args: [\n            Profiles.profileResult profile.name\n            profiles\n          ]\n        )\n      )\n    ]]\n  # coffeelint: enable=missing_fat_arrows\n"
  },
  {
    "path": "omega-pac/src/profiles.coffee",
    "content": "U2 = require 'uglify-js'\nShexpUtils = require './shexp_utils'\nConditions = require './conditions'\nRuleList = require './rule_list'\n{AttachedCache, Revision} = require './utils'\n\n# coffeelint: disable=camel_case_classes\nclass AST_Raw extends U2.AST_SymbolRef\n  # coffeelint: enable=camel_case_classes\n  constructor: (raw) ->\n    U2.AST_SymbolRef.call(this, name: raw)\n    @aborts = -> false\n\nmodule.exports = exports =\n  builtinProfiles:\n    '+direct':\n      name: 'direct'\n      profileType: 'DirectProfile'\n      color: '#aaaaaa'\n      builtin: true\n    '+system':\n      name: 'system'\n      profileType: 'SystemProfile'\n      color: '#000000'\n      builtin: true\n\n  schemes: [\n    {scheme: 'http', prop: 'proxyForHttp'}\n    {scheme: 'https', prop: 'proxyForHttps'}\n    {scheme: 'ftp', prop: 'proxyForFtp'}\n    {scheme: '', prop: 'fallbackProxy'}\n  ]\n\n  pacProtocols: {\n    'http': 'PROXY'\n    'https': 'HTTPS'\n    'socks4': 'SOCKS'\n    'socks5': 'SOCKS5'\n  }\n\n  formatByType: {\n    'SwitchyRuleListProfile': 'Switchy'\n    'AutoProxyRuleListProfile': 'AutoProxy'\n  }\n\n  ruleListFormats: [\n    'Switchy'\n    'AutoProxy'\n  ]\n\n  parseHostPort: (str, scheme) ->\n    sep = str.lastIndexOf(':')\n    return if sep < 0\n    port = parseInt(str.substr(sep + 1)) || 80\n    host = str.substr(0, sep)\n    return unless host\n    return {\n      scheme: scheme\n      host: host\n      port: port\n    }\n\n  pacResult: (proxy) ->\n    if proxy\n      if proxy.scheme == 'socks5'\n        \"SOCKS5 #{proxy.host}:#{proxy.port}; SOCKS #{proxy.host}:#{proxy.port}\"\n      else\n        \"#{exports.pacProtocols[proxy.scheme]} #{proxy.host}:#{proxy.port}\"\n    else\n      'DIRECT'\n\n  isFileUrl: (url) -> !!(url?.substr(0, 5).toUpperCase() == 'FILE:')\n\n  nameAsKey: (profileName) ->\n    if typeof profileName != 'string'\n      profileName = profileName.name\n    '+' + profileName\n  byName: (profileName, options) ->\n    if typeof profileName == 'string'\n      key = exports.nameAsKey(profileName)\n      profileName = exports.builtinProfiles[key] ? options[key]\n    profileName\n  byKey: (key, options) ->\n    if typeof key == 'string'\n      key = exports.builtinProfiles[key] ? options[key]\n    key\n\n  each: (options, callback) ->\n    charCodePlus = '+'.charCodeAt(0)\n    for key, profile of options when key.charCodeAt(0) == charCodePlus\n      callback(key, profile)\n    for key, profile of exports.builtinProfiles\n      if key.charCodeAt(0) == charCodePlus\n        callback(key, profile)\n\n  profileResult: (profileName) ->\n    key = exports.nameAsKey(profileName)\n    if key == '+direct'\n      key = exports.pacResult()\n    new U2.AST_String value: key\n\n  isIncludable: (profile) ->\n    includable = exports._handler(profile).includable\n    if typeof includable == 'function'\n      includable = includable.call(exports, profile)\n    !!includable\n  isInclusive: (profile) -> !!exports._handler(profile).inclusive\n\n  updateUrl: (profile) ->\n    exports._handler(profile).updateUrl?.call(exports, profile)\n  updateContentTypeHints: (profile) ->\n    exports._handler(profile).updateContentTypeHints?.call(exports, profile)\n  update: (profile, data) ->\n    exports._handler(profile).update.call(exports, profile, data)\n\n  tag: (profile) -> exports._profileCache.tag(profile)\n  create: (profile, opt_profileType) ->\n    if typeof profile == 'string'\n      profile =\n        name: profile\n        profileType: opt_profileType\n    else if opt_profileType\n      profile.profileType = opt_profileType\n    create = exports._handler(profile).create\n    return profile unless create\n    create.call(exports, profile)\n    profile\n  updateRevision: (profile, revision) ->\n    revision ?= Revision.fromTime()\n    profile.revision = revision\n  replaceRef: (profile, fromName, toName) ->\n    return false if not exports.isInclusive(profile)\n    handler = exports._handler(profile)\n    handler.replaceRef.call(exports, profile, fromName, toName)\n  analyze: (profile) ->\n    cache = exports._profileCache.get profile, {}\n    if not Object::hasOwnProperty.call(cache, 'analyzed')\n      analyze = exports._handler(profile).analyze\n      result = analyze?.call(exports, profile)\n      cache.analyzed = result\n    return cache\n  dropCache: (profile) ->\n    exports._profileCache.drop profile\n  directReferenceSet: (profile) ->\n    return {} if not exports.isInclusive(profile)\n    cache = exports._profileCache.get profile, {}\n    return cache.directReferenceSet if cache.directReferenceSet\n    handler = exports._handler(profile)\n    cache.directReferenceSet = handler.directReferenceSet.call(exports, profile)\n  \n  profileNotFound: (name, action) ->\n    if not action?\n      throw new Error(\"Profile #{name} does not exist!\")\n    if typeof action == 'function'\n      action = action(name)\n    if typeof action == 'object' and action.profileType\n      return action\n    switch action\n      when 'ignore'\n        return null\n      when 'dumb'\n        return exports.create({\n          name: name\n          profileType: 'VirtualProfile'\n          defaultProfileName: 'direct'\n        })\n    throw action\n\n  allReferenceSet: (profile, options, opt_args) ->\n    o_profile = profile\n    profile = exports.byName(profile, options)\n    profile ?= exports.profileNotFound?(o_profile, opt_args.profileNotFound)\n    opt_args ?= {}\n    has_out = opt_args.out?\n    result = opt_args.out ?= {}\n    if profile\n      result[exports.nameAsKey(profile.name)] = profile.name\n      for key, name of exports.directReferenceSet(profile)\n        exports.allReferenceSet(name, options, opt_args)\n    delete opt_args.out if not has_out\n    result\n  referencedBySet: (profile, options, opt_args) ->\n    profileKey = exports.nameAsKey(profile)\n    opt_args ?= {}\n    has_out = opt_args.out?\n    result = opt_args.out ?= {}\n    exports.each options, (key, prof) ->\n      if exports.directReferenceSet(prof)[profileKey]\n        result[key] = prof.name\n        exports.referencedBySet(prof, options, opt_args)\n    delete opt_args.out if not has_out\n    result\n  validResultProfilesFor: (profile, options) ->\n    profile = exports.byName(profile, options)\n    return [] if not exports.isInclusive(profile)\n    profileKey = exports.nameAsKey(profile)\n    ref = exports.referencedBySet(profile, options)\n    ref[profileKey] = profileKey\n    result = []\n    exports.each options, (key, prof) ->\n      if not ref[key] and exports.isIncludable(prof)\n        result.push(prof)\n    result\n  match: (profile, request, opt_profileType) ->\n    opt_profileType ?= profile.profileType\n    cache = exports.analyze(profile)\n    match = exports._handler(opt_profileType).match\n    match?.call(exports, profile, request, cache)\n  compile: (profile, opt_profileType) ->\n    opt_profileType ?= profile.profileType\n    cache = exports.analyze(profile)\n    return cache.compiled if cache.compiled\n    handler = exports._handler(opt_profileType)\n    cache.compiled = handler.compile.call(exports, profile, cache)\n\n  _profileCache: new AttachedCache (profile) -> profile.revision\n\n  _handler: (profileType) ->\n    if typeof profileType != 'string'\n      profileType = profileType.profileType\n\n    handler = profileType\n    while typeof handler == 'string'\n      handler = exports._profileTypes[handler]\n    if not handler?\n      throw new Error \"Unknown profile type: #{profileType}\"\n    return handler\n\n  _profileTypes:\n    # These functions are .call()-ed with `this` set to module.exports.\n    # coffeelint: disable=missing_fat_arrows\n    'SystemProfile':\n      compile: (profile) ->\n        throw new Error \"SystemProfile cannot be used in PAC scripts\"\n    'DirectProfile':\n      includable: true\n      compile: (profile) ->\n        return new U2.AST_String(value: @pacResult())\n    'FixedProfile':\n      includable: true\n      create: (profile) ->\n        profile.bypassList ?= [\n          {\n            conditionType: 'BypassCondition'\n            pattern: '127.0.0.1'\n          }\n          {\n            conditionType: 'BypassCondition'\n            pattern: '[::1]'\n          }\n          {\n            conditionType: 'BypassCondition'\n            pattern: 'localhost'\n          }\n        ]\n      match: (profile, request) ->\n        if profile.bypassList\n          for cond in profile.bypassList\n            if Conditions.match(cond, request)\n              return [@pacResult(), cond, {scheme: 'direct'}, undefined]\n        for s in @schemes when s.scheme == request.scheme and profile[s.prop]\n          return [\n            @pacResult(profile[s.prop]),\n            s.scheme,\n            profile[s.prop],\n            profile.auth?[s.prop] ? profile.auth?['all']\n          ]\n        return [\n          @pacResult(profile.fallbackProxy),\n          '',\n          profile.fallbackProxy,\n          profile.auth?.fallbackProxy ? profile.auth?['all']\n        ]\n      compile: (profile) ->\n        if ((not profile.bypassList or not profile.fallbackProxy) and\n            not profile.proxyForHttp and not profile.proxyForHttps and\n            not profile.proxyForFtp)\n          return new U2.AST_String value:\n            @pacResult profile.fallbackProxy\n        body = [\n          new U2.AST_Directive value: 'use strict'\n        ]\n        if profile.bypassList and profile.bypassList.length\n          conditions = null\n          for cond in profile.bypassList\n            condition = Conditions.compile cond\n            if conditions?\n              conditions = new U2.AST_Binary(\n                left: conditions\n                operator: '||'\n                right: condition\n              )\n            else\n              conditions = condition\n          body.push new U2.AST_If(\n            condition: conditions\n            body: new U2.AST_Return value: new U2.AST_String value: @pacResult()\n          )\n        if (not profile.proxyForHttp and not profile.proxyForHttps and\n            not profile.proxyForFtp)\n          body.push new U2.AST_Return value:\n            new U2.AST_String value: @pacResult profile.fallbackProxy\n        else\n          body.push new U2.AST_Switch(\n            expression: new U2.AST_SymbolRef name: 'scheme'\n            body: for s in @schemes when not s.scheme or profile[s.prop]\n              ret = [new U2.AST_Return value:\n                new U2.AST_String value: @pacResult profile[s.prop]\n              ]\n              if s.scheme\n                new U2.AST_Case(\n                  expression: new U2.AST_String value: s.scheme\n                  body: ret\n                )\n              else\n                new U2.AST_Default body: ret\n          )\n        new U2.AST_Function(\n          argnames: [\n            new U2.AST_SymbolFunarg name: 'url'\n            new U2.AST_SymbolFunarg name: 'host'\n            new U2.AST_SymbolFunarg name: 'scheme'\n          ]\n          body: body\n        )\n    'PacProfile':\n      includable: (profile) -> !@isFileUrl(profile.pacUrl)\n      create: (profile) ->\n        profile.pacScript ?= '''\n          function FindProxyForURL(url, host) {\n            return \"DIRECT\";\n          }\n        '''\n      compile: (profile) ->\n        new U2.AST_Call args: [new U2.AST_This], expression:\n          new U2.AST_Dot property: 'call', expression: new U2.AST_Function(\n            argnames: []\n            body: [\n              # https://github.com/FelisCatus/SwitchyOmega/issues/390\n              # 1. Add \\n after PAC to terminate line comment in PAC (// ...)\n              # 2. Add another \\n with knowledge that the first can be escaped\n              #    by trailing backslash in PAC. (// ... \\)\n              # 3. Add a multiline-comment block /* ... */ to terminate any\n              #    potential unclosed multiline-comment block. (/* ...)\n              # 4. And finally, a semicolon to terminate the final statement.\n              # Wait a moment. Do we really need to go this far? I don't know.\n\n              # TODO(catus): Remove the hack needed to insert raw code.\n              new AST_Raw ';\\n' + profile.pacScript + '\\n\\n/* End of PAC */;'\n              new U2.AST_Return value:\n                new U2.AST_SymbolRef name: 'FindProxyForURL'\n            ]\n          )\n      updateUrl: (profile) ->\n        if @isFileUrl(profile.pacUrl)\n          undefined\n        else\n          profile.pacUrl\n      updateContentTypeHints: -> [\n        '!text/html'\n        '!application/xhtml+xml'\n        'application/x-ns-proxy-autoconfig'\n        'application/x-javascript-config'\n      ]\n      update: (profile, data) ->\n        return false if profile.pacScript == data\n        profile.pacScript = data\n        return true\n    'AutoDetectProfile': 'PacProfile'\n    'SwitchProfile':\n      includable: true\n      inclusive: true\n      create: (profile) ->\n        profile.defaultProfileName ?= 'direct'\n        profile.rules ?= []\n      directReferenceSet: (profile) ->\n        refs = {}\n        refs[exports.nameAsKey(profile.defaultProfileName)] =\n          profile.defaultProfileName\n        for rule in profile.rules\n          refs[exports.nameAsKey(rule.profileName)] = rule.profileName\n        refs\n      analyze: (profile) -> profile.rules\n      replaceRef: (profile, fromName, toName) ->\n        changed = false\n        if profile.defaultProfileName == fromName\n          profile.defaultProfileName = toName\n          changed = true\n        for rule in profile.rules\n          if rule.profileName == fromName\n            rule.profileName = toName\n            changed = true\n        return changed\n      match: (profile, request, cache) ->\n        for rule in cache.analyzed\n          if Conditions.match(rule.condition, request)\n            return rule\n        return [exports.nameAsKey(profile.defaultProfileName), null]\n      compile: (profile, cache) ->\n        rules = cache.analyzed\n        if rules.length == 0\n          return @profileResult profile.defaultProfileName\n        body = [\n          new U2.AST_Directive value: 'use strict'\n        ]\n        for rule in rules\n          body.push new U2.AST_If\n            condition: Conditions.compile rule.condition\n            body: new U2.AST_Return value:\n              @profileResult(rule.profileName)\n        body.push new U2.AST_Return value:\n          @profileResult profile.defaultProfileName\n        new U2.AST_Function(\n          argnames: [\n            new U2.AST_SymbolFunarg name: 'url'\n            new U2.AST_SymbolFunarg name: 'host'\n            new U2.AST_SymbolFunarg name: 'scheme'\n          ]\n          body: body\n        )\n    'VirtualProfile': 'SwitchProfile'\n    'RuleListProfile':\n      includable: true\n      inclusive: true\n      create: (profile) ->\n        profile.profileType ?= 'RuleListProfile'\n        profile.format ?= exports.formatByType[profile.profileType] ?  'Switchy'\n        profile.defaultProfileName ?= 'direct'\n        profile.matchProfileName ?= 'direct'\n        profile.ruleList ?= ''\n      directReferenceSet: (profile) ->\n        if profile.ruleList?\n          refs = RuleList[profile.format]?.directReferenceSet?(profile)\n          return refs if refs\n        refs = {}\n        for name in [profile.matchProfileName, profile.defaultProfileName]\n          refs[exports.nameAsKey(name)] = name\n        refs\n      replaceRef: (profile, fromName, toName) ->\n        changed = false\n        if profile.defaultProfileName == fromName\n          profile.defaultProfileName = toName\n          changed = true\n        if profile.matchProfileName == fromName\n          profile.matchProfileName = toName\n          changed = true\n        return changed\n      analyze: (profile) ->\n        format = profile.format ? exports.formatByType[profile.profileType]\n        formatHandler = RuleList[format]\n        if not formatHandler\n          throw new Error \"Unsupported rule list format #{format}!\"\n        ruleList = profile.ruleList?.trim() || ''\n        if formatHandler.preprocess?\n          ruleList = formatHandler.preprocess(ruleList)\n        return formatHandler.parse(ruleList, profile.matchProfileName,\n          profile.defaultProfileName)\n      match: (profile, request) ->\n        result = exports.match(profile, request, 'SwitchProfile')\n      compile: (profile) ->\n        exports.compile(profile, 'SwitchProfile')\n      updateUrl: (profile) -> profile.sourceUrl\n      updateContentTypeHints: -> [\n        '!text/html'\n        '!application/xhtml+xml'\n        'text/plain'\n        '*'\n      ]\n      update: (profile, data) ->\n        data = data.trim()\n        original = profile.format ? exports.formatByType[profile.profileType]\n        profile.profileType = 'RuleListProfile'\n        format = original\n        if RuleList[format].detect?(data) == false\n          # Wrong data for the current format.\n          format = null\n        for own formatName of RuleList\n          result = RuleList[formatName].detect?(data)\n          if result == true or (result != false and not format?)\n            profile.format = format = formatName\n        format ?= original\n        formatHandler = RuleList[format]\n        if formatHandler.preprocess?\n          data = formatHandler.preprocess(data)\n        return false if profile.ruleList == data\n        profile.ruleList = data\n        return true\n    'SwitchyRuleListProfile': 'RuleListProfile'\n    'AutoProxyRuleListProfile': 'RuleListProfile'\n    # coffeelint: enable=missing_fat_arrows\n"
  },
  {
    "path": "omega-pac/src/rule_list.coffee",
    "content": "Buffer = require('buffer').Buffer\nConditions = require('./conditions')\n\nstrStartsWith = (str, prefix) ->\n  str.substr(0, prefix.length) == prefix\n\nmodule.exports = exports =\n  'AutoProxy':\n    magicPrefix: 'W0F1dG9Qcm94' # Detect base-64 encoded \"[AutoProxy\".\n    detect: (text) ->\n      if strStartsWith(text, exports['AutoProxy'].magicPrefix)\n        return true\n      else if strStartsWith(text, '[AutoProxy')\n        return true\n      return\n    preprocess: (text) ->\n      if strStartsWith(text, exports['AutoProxy'].magicPrefix)\n        text = new Buffer(text, 'base64').toString('utf8')\n      return text\n    parse: (text, matchProfileName, defaultProfileName) ->\n      normal_rules = []\n      exclusive_rules = []\n      for line in text.split(/\\n|\\r/)\n        line = line.trim()\n        continue if line.length == 0 || line[0] == '!' || line[0] == '['\n        source = line\n        profile = matchProfileName\n        list = normal_rules\n        if line[0] == '@' and line[1] == '@'\n          profile = defaultProfileName\n          list = exclusive_rules\n          line = line.substring(2)\n        cond =\n          if line[0] == '/'\n            conditionType: 'UrlRegexCondition'\n            pattern: line.substring(1, line.length - 1)\n          else if line[0] == '|'\n            if line[1] == '|'\n              conditionType: 'HostWildcardCondition'\n              pattern: \"*.\" + line.substring(2)\n            else\n              conditionType: 'UrlWildcardCondition'\n              pattern: line.substring(1) + \"*\"\n          else if line.indexOf('*') < 0\n            conditionType: 'KeywordCondition'\n            pattern: line\n          else\n            conditionType: 'UrlWildcardCondition'\n            pattern: 'http://*' + line + '*'\n        list.push({condition: cond, profileName: profile, source: source})\n      # Exclusive rules have higher priority, so they come first.\n      return exclusive_rules.concat normal_rules\n\n  'Switchy':\n    omegaPrefix: '[SwitchyOmega Conditions'\n    specialLineStart: \"[;#@!\"\n\n    detect: (text) ->\n      if strStartsWith(text, exports['Switchy'].omegaPrefix)\n        return true\n      return\n\n    parse: (text, matchProfileName, defaultProfileName) ->\n      switchy = exports['Switchy']\n      parser = switchy.getParser(text)\n      return switchy[parser](text, matchProfileName, defaultProfileName)\n\n    directReferenceSet: ({ruleList, matchProfileName, defaultProfileName}) ->\n      text = ruleList.trim()\n      switchy = exports['Switchy']\n      parser = switchy.getParser(text)\n      return unless parser == 'parseOmega'\n      return unless /(^|\\n)@with\\s+results?(\\r|\\n|$)/i.test(text)\n      refs = {}\n      for line in text.split(/\\n|\\r/)\n        line = line.trim()\n        if switchy.specialLineStart.indexOf(line[0]) < 0\n          iSpace = line.lastIndexOf(' +')\n          if iSpace < 0\n            profile = defaultProfileName || 'direct'\n          else\n            profile = line.substr(iSpace + 2).trim()\n          refs['+' + profile] = profile\n      refs\n\n    # For the omega rule list format, please see the following wiki page:\n    # https://github.com/FelisCatus/SwitchyOmega/wiki/SwitchyOmega-conditions-format\n    compose: ({rules, defaultProfileName}, {withResult, useExclusive} = {}) ->\n      eol = '\\r\\n'\n      ruleList = '[SwitchyOmega Conditions]' + eol\n      useExclusive ?= not withResult\n      if withResult\n        ruleList += '@with result' + eol + eol\n      else\n        ruleList += eol\n      specialLineStart = exports['Switchy'].specialLineStart + '+'\n      for rule in rules\n        if rule.note\n          ruleList += '@note ' + rule.note + eol\n        line = Conditions.str(rule.condition)\n        if useExclusive and rule.profileName == defaultProfileName\n          line = '!' + line\n        else\n          if specialLineStart.indexOf(line[0]) >= 0\n            line = ': ' + line\n          if withResult\n            # TODO(catus): What if rule.profileName contains ' +' or new lines?\n            line += ' +' + rule.profileName\n        ruleList += line + eol\n      if withResult\n        # TODO(catus): Also special chars and sequences in defaultProfileName.\n        ruleList += eol + '* +' + defaultProfileName + eol\n      return ruleList\n\n    getParser: (text) ->\n      switchy = exports['Switchy']\n      parser = 'parseOmega'\n      if not strStartsWith(text, switchy.omegaPrefix)\n        if text[0] == '#' or text.indexOf('\\n#') >= 0\n          parser = 'parseLegacy'\n      return parser\n\n    conditionFromLegacyWildcard: (pattern) ->\n      if pattern[0] == '@'\n        pattern = pattern.substring(1)\n      else\n        if pattern.indexOf('://') <= 0 and pattern[0] != '*'\n          pattern = '*' + pattern\n        if pattern[pattern.length - 1] != '*'\n          pattern += '*'\n\n      host = Conditions.urlWildcard2HostWildcard(pattern)\n      if host\n        conditionType: 'HostWildcardCondition'\n        pattern: host\n      else\n        conditionType: 'UrlWildcardCondition'\n        pattern: pattern\n\n    parseLegacy: (text, matchProfileName, defaultProfileName) ->\n      normal_rules = []\n      exclusive_rules = []\n      begin = false\n      section = 'WILDCARD'\n      for line in text.split(/\\n|\\r/)\n        line = line.trim()\n        continue if line.length == 0 || line[0] == ';'\n        if not begin\n          if line.toUpperCase() == '#BEGIN'\n            begin = true\n          continue\n        if line.toUpperCase() == '#END'\n          break\n        if line[0] == '[' and line[line.length - 1] == ']'\n          section = line.substring(1, line.length - 1).toUpperCase()\n          continue\n        source = line\n        profile = matchProfileName\n        list = normal_rules\n        if line[0] == '!'\n          profile = defaultProfileName\n          list = exclusive_rules\n          line = line.substring(1)\n        cond = switch section\n          when 'WILDCARD'\n            exports['Switchy'].conditionFromLegacyWildcard(line)\n          when 'REGEXP'\n            conditionType: 'UrlRegexCondition'\n            pattern: line\n          else\n            null\n        if cond?\n          list.push({condition: cond, profileName: profile, source: source})\n      # Exclusive rules have higher priority, so they come first.\n      return exclusive_rules.concat normal_rules\n\n    parseOmega: (text, matchProfileName, defaultProfileName, args = {}) ->\n      {strict} = args\n      if strict\n        error = (fields) ->\n          err = new Error(fields.message)\n          for own key, value of fields\n            err[key] = value\n          throw err\n      includeSource = args.source ? true\n      rules = []\n      rulesWithDefaultProfile = []\n      withResult = false\n      exclusiveProfile = null\n      noteForNextRule = null\n      lno = 0\n      for line in text.split(/\\n|\\r/)\n        lno++\n        line = line.trim()\n        continue if line.length == 0\n        switch line[0]\n          when '[' # Header line: Ignore.\n            continue\n          when ';' # Comment line: Ignore.\n            continue\n          when '@' # Directive line:\n            iSpace = line.indexOf(' ')\n            iSpace = line.length if iSpace < 0\n            directive = line.substr(1, iSpace - 1)\n            line = line.substr(iSpace + 1).trim()\n            switch directive.toUpperCase()\n              when 'WITH'\n                feature = line.toUpperCase()\n                if feature == 'RESULT' or feature == 'RESULTS'\n                  withResult = true\n              when 'NOTE'\n                noteForNextRule = line\n            continue\n\n        source = null\n        exclusiveProfile = null if strict\n        if line[0] == '!'\n          profile = if withResult then null else defaultProfileName\n          source = line\n          line = line.substr(1)\n        else if withResult\n          iSpace = line.lastIndexOf(' +')\n          if iSpace < 0\n            error?({\n              message: \"Missing result profile name: \" + line\n              reason: 'missingResultProfile'\n              source: line\n              sourceLineNo: lno\n            })\n            continue\n          profile = line.substr(iSpace + 2).trim()\n          line = line.substr(0, iSpace).trim()\n          exclusiveProfile = profile if line == '*'\n        else\n          profile = matchProfileName\n\n        cond = Conditions.fromStr(line)\n        if not cond\n          error?({\n            message: \"Invalid rule: \" + line\n            reason: 'invalidRule'\n            source: source ? line\n            sourceLineNo: lno\n          })\n          continue\n\n        rule =\n          condition: cond\n          profileName: profile\n          source: if includeSource then source ? line\n        if noteForNextRule?\n          rule.note = noteForNextRule\n          noteForNextRule = null\n        rules.push(rule)\n        if not profile\n          rulesWithDefaultProfile.push(rule)\n\n      if withResult\n        if not exclusiveProfile\n          if strict\n            error?({\n              message: \"Missing default rule with catch-all '*' condition\"\n              reason: 'noDefaultRule'\n            })\n          exclusiveProfile = defaultProfileName || 'direct'\n        for rule in rulesWithDefaultProfile\n          rule.profileName = exclusiveProfile\n      return rules\n"
  },
  {
    "path": "omega-pac/src/shexp_utils.coffee",
    "content": "module.exports = exports =\n  regExpMetaChars: do ->\n    chars = '''\\\\[\\^$.|?*+(){}/'''\n    set = {}\n    for i in [0...chars.length]\n      set[chars.charCodeAt(i)] = true\n    set\n  escapeSlash: (pattern) ->\n    charCodeSlash = 47 # /\n    charCodeBackSlash = 92 # \\\n    escaped = false\n    start = 0\n    result = ''\n    for i in [0...pattern.length]\n      code = pattern.charCodeAt(i)\n      if code == charCodeSlash and not escaped\n        result += pattern.substring start, i\n        result += '\\\\'\n        start = i\n      escaped = (code == charCodeBackSlash and not escaped)\n    result += pattern.substr start\n  shExp2RegExp: (pattern, options) ->\n    trimAsterisk = options?.trimAsterisk || false\n    start = 0\n    end = pattern.length\n    charCodeAsterisk = 42 # '*'\n    charCodeQuestion = 63 # '?'\n    if trimAsterisk\n      while start < end && pattern.charCodeAt(start) == charCodeAsterisk\n        start++\n      while start < end && pattern.charCodeAt(end - 1) == charCodeAsterisk\n        end--\n      if end - start == 1 && pattern.charCodeAt(start) == charCodeAsterisk\n        return ''\n    regex = ''\n    if start == 0\n      regex += '^'\n    for i in [start...end]\n      code = pattern.charCodeAt(i)\n      switch code\n        when charCodeAsterisk then regex += '.*'\n        when charCodeQuestion then regex += '.'\n        else\n          if exports.regExpMetaChars[code] >= 0\n            regex += '\\\\'\n          regex += pattern[i]\n\n    if end == pattern.length\n      regex += '$'\n\n    return regex\n"
  },
  {
    "path": "omega-pac/src/utils.coffee",
    "content": "Revision =\n  fromTime: (time) ->\n    time = if time then new Date(time) else new Date()\n    return time.getTime().toString(16)\n  compare: (a, b) ->\n    return 0 if not a and not b\n    return -1 if not a\n    return 1 if not b\n    return 1 if a.length > b.length\n    return -1 if a.length < b.length\n    return 1 if a > b\n    return -1 if a < b\n    return 0\n\nexports.Revision = Revision\n\nclass AttachedCache\n  constructor: (opt_prop, @tag) ->\n    @prop = opt_prop\n    if typeof @tag == 'undefined'\n      @tag = opt_prop\n      @prop = '_cache'\n  get: (obj, otherwise) ->\n    tag = @tag(obj)\n    cache = @_getCache(obj)\n    if cache? and cache.tag == tag\n      return cache.value\n    value = if typeof otherwise == 'function' then otherwise() else otherwise\n    @_setCache(obj, {tag: tag, value: value})\n    return value\n  drop: (obj) ->\n    if obj[@prop]?\n      obj[@prop] = undefined\n  _getCache: (obj) -> obj[@prop]\n  _setCache: (obj, value) ->\n    if not Object::hasOwnProperty.call obj, @prop\n      Object.defineProperty obj, @prop, writable: true\n    obj[@prop] = value\n\nexports.AttachedCache = AttachedCache\n\ntld = require('tldjs')\n\nexports.isIp = (domain) ->\n  return true if domain.indexOf(':') > 0 # IPv6\n  lastCharCode = domain.charCodeAt(domain.length - 1)\n  return true if 48 <= lastCharCode <= 57 # IP address ending with number.\n  return false\n\nexports.getBaseDomain = (domain) ->\n  return domain if exports.isIp(domain)\n  return tld.getDomain(domain) ? domain\n\nexports.wildcardForDomain = (domain) ->\n  return domain if exports.isIp(domain)\n  return '*.' + exports.getBaseDomain(domain)\n\nUrl = require('url')\nexports.wildcardForUrl = (url) ->\n  domain = Url.parse(url).hostname\n  return exports.wildcardForDomain(domain)\n"
  },
  {
    "path": "omega-pac/test/conditions.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\nlolex = require 'lolex'\n\ndescribe 'Conditions', ->\n  Conditions = require '../src/conditions'\n  U2 = require 'uglify-js'\n  testCond = (condition, request, should_match) ->\n    o_request = request\n    should_match = !!should_match\n    if typeof request == 'string'\n      request = Conditions.requestFromUrl(request)\n\n    matchResult = Conditions.match(condition, request)\n    condExpr = Conditions.compile(condition)\n    testFunc = new U2.AST_Function(\n      argnames: [\n        new U2.AST_SymbolFunarg name: 'url'\n        new U2.AST_SymbolFunarg name: 'host'\n        new U2.AST_SymbolFunarg name: 'scheme'\n      ]\n      body: [\n        new U2.AST_Return value: condExpr\n      ]\n    )\n    testFunc = eval '(' + testFunc.print_to_string() + ')'\n    compileResult = testFunc(request.url, request.host, request.scheme)\n\n    friendlyError = (compiled) ->\n      # Try to give friendly assert messages instead of something like\n      # \"expect true to be false\".\n      printCond = JSON.stringify(condition)\n      printCompiled = if compiled then 'COMPILED ' else ''\n      printMatch = if should_match then 'to match' else 'not to match'\n      msg = (\"expect #{printCompiled}condition #{printCond} \" +\n             \"#{printMatch} request #{o_request}\")\n      chai.assert(false, msg)\n\n    if matchResult != should_match\n      friendlyError()\n\n    if compileResult != should_match\n      friendlyError('compiled')\n\n    return matchResult\n\n  describe 'TrueCondition', ->\n    it 'should always return true', ->\n      testCond({conditionType: 'TrueCondition'}, {}, 'match')\n  describe 'FalseCondition', ->\n    it 'should always return false', ->\n      testCond({conditionType: 'FalseCondition'}, {}, not 'match')\n  describe 'UrlRegexCondition', ->\n    cond =\n      conditionType: 'UrlRegexCondition'\n      pattern: 'example\\\\.com'\n    it 'should match requests based on regex pattern', ->\n      testCond(cond, 'http://www.example.com/', 'match')\n    it 'should not match requests not matching the pattern', ->\n      testCond(cond, 'http://www.example.net/', not 'match')\n    it 'should support regex meta chars', ->\n      con =\n        conditionType: 'UrlRegexCondition'\n        pattern: 'exam.*\\\\.com'\n      testCond(con, 'http://www.example.com/', 'match')\n    it 'should fallback to not match if pattern is invalid', ->\n      con =\n        conditionType: 'UrlRegexCondition'\n        pattern: ')Invalid('\n      testCond(con, 'http://www.example.com/', not 'match')\n  describe 'UrlWildcardCondition', ->\n    cond =\n      conditionType: 'UrlWildcardCondition'\n      pattern: '*example.com*'\n    it 'should match requests based on wildcard pattern', ->\n      testCond(cond, 'http://www.example.com/', 'match')\n    it 'should not match requests not matching the pattern', ->\n      testCond(cond, 'http://www.example.net/', not 'match')\n    it 'should support wildcard question marks', ->\n      cond =\n        conditionType: 'UrlWildcardCondition'\n        pattern: '*exam???.com*'\n      testCond(cond, 'http://www.example.com/', 'match')\n    it 'should not support regex meta chars', ->\n      cond =\n        conditionType: 'UrlWildcardCondition'\n        pattern: '.*example.com.*'\n      testCond(cond, 'http://example.com/', not 'match')\n    it 'should support multiple patterns in one condition', ->\n      cond =\n        conditionType: 'UrlWildcardCondition'\n        pattern: '*.example.com/*|*.example.net/*'\n      testCond(cond, 'http://a.example.com/abc', 'match')\n      testCond(cond, 'http://b.example.net/def', 'match')\n      testCond(cond, 'http://c.example.org/ghi', not 'match')\n  describe 'HostRegexCondition', ->\n    cond =\n      conditionType: 'HostRegexCondition'\n      pattern: '.*\\\\.example\\\\.com'\n    it 'should match requests based on regex pattern', ->\n      testCond(cond, 'http://www.example.com/', 'match')\n    it 'should not match requests not matching the pattern', ->\n      testCond(cond, 'http://example.com/', not 'match')\n    it 'should not match URL parts other than the host', ->\n      testCond(cond, 'http://example.net/www.example.com')\n        .should.be.false\n\n  describe 'HostWildcardCondition', ->\n    cond =\n      conditionType: 'HostWildcardCondition'\n      pattern: '*.example.com'\n    it 'should match requests based on wildcard pattern', ->\n      testCond(cond, 'http://www.example.com/', 'match')\n    it 'should also match hostname without the optional level', ->\n      # https://github.com/FelisCatus/SwitchyOmega/wiki/Host-wildcard-condition\n      testCond(cond, 'http://example.com/', 'match')\n    it 'should process patterns like *.*example.com correctly', ->\n      # https://github.com/FelisCatus/SwitchyOmega/issues/158\n      con =\n        conditionType: 'HostWildcardCondition'\n        pattern: '*.*example.com'\n      testCond(con, 'http://example.com/', 'match')\n      testCond(con, 'http://www.example.com/', 'match')\n      testCond(con, 'http://www.some-example.com/', 'match')\n      testCond(con, 'http://xample.com/', not 'match')\n    it 'should allow override of the magical behavior', ->\n      con =\n        conditionType: 'HostWildcardCondition'\n        pattern: '**.example.com'\n      testCond(con, 'http://www.example.com/', 'match')\n      testCond(con, 'http://example.com/', not 'match')\n    it 'should not match URL parts other than the host', ->\n      testCond(cond, 'http://example.net/www.example.com')\n        .should.be.false\n    it 'should support multiple patterns in one condition', ->\n      cond =\n        conditionType: 'HostWildcardCondition'\n        pattern: '*.example.com|*.example.net'\n      testCond(cond, 'http://a.example.com/abc', 'match')\n      testCond(cond, 'http://example.net/def', 'match')\n      testCond(cond, 'http://c.example.org/ghi', not 'match')\n\n  describe 'BypassCondition', ->\n    # See https://developer.chrome.com/extensions/proxy#bypass_list\n    it 'should correctly support patterns containing hosts', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '.example.com'\n      testCond(cond, 'http://www.example.com/', 'match')\n      testCond(cond, 'http://example.com/', not 'match')\n      cond.pattern = '*.example.com'\n      testCond(cond, 'http://www.example.com/', 'match')\n      testCond(cond, 'http://example.com/', not 'match')\n      cond.pattern = 'example.com'\n      testCond(cond, 'http://example.com/', 'match')\n      testCond(cond, 'http://www.example.com/', not 'match')\n      cond.pattern = '*example.com'\n      testCond(cond, 'http://example.com/', 'match')\n      testCond(cond, 'http://www.example.com/', 'match')\n      testCond(cond, 'http://anotherexample.com/', 'match')\n    it 'should match the scheme specified in the pattern', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: 'http://example.com'\n      testCond(cond, 'http://example.com/', 'match')\n      testCond(cond, 'https://example.com/', not 'match')\n    it 'should match the port specified in the pattern', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: 'http://example.com:8080'\n      testCond(cond, 'http://example.com:8080/', 'match')\n      testCond(cond, 'http://example.com:888/', not 'match')\n    it 'should correctly support patterns using IPv4 literals', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: 'http://127.0.0.1:8080'\n      testCond(cond, 'http://127.0.0.1:8080/', 'match')\n      testCond(cond, 'http://127.0.0.2:8080/', not 'match')\n    it 'should correctly support IPv6 canonicalization', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: 'http://[0:0::1]:8080'\n      result = Conditions.analyze(cond)\n      testCond(cond, 'http://[::1]:8080/', 'match')\n      testCond(cond, 'http://[1::1]:8080/', not 'match')\n    it 'should correctly support IPv6 canonicalization 2', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '[::1]'\n      result = Conditions.analyze(cond)\n      testCond(cond, 'http://[::1]:8080/', 'match')\n      testCond(cond, 'http://[1::1]:8080/', not 'match')\n\n    it 'should parse IPv4 CIDR notation', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '192.168.0.0/16'\n      result = Conditions.analyze(cond).analyzed\n      should.exist(result.ip)\n      result.ip.should.eql({\n        conditionType: 'IpCondition'\n        ip: '192.168.0.0'\n        prefixLength: 16\n      })\n\n    it 'should parse IPv6 CIDR notation', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: 'fefe:13::abc/33'\n      result = Conditions.analyze(cond).analyzed\n      should.exist(result.ip)\n      result.ip.should.eql({\n        conditionType: 'IpCondition'\n        ip: 'fefe:13::abc'\n        prefixLength: 33\n      })\n\n    it 'should parse IPv6 CIDR notation with zero prefixLength', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '::/0'\n      result = Conditions.analyze(cond).analyzed\n      should.exist(result.ip)\n      result.ip.should.eql({\n        conditionType: 'IpCondition'\n        ip: '::'\n        prefixLength: 0\n      })\n\n    it 'should match 127.0.0.1 when <local> is used', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '<local>'\n      testCond(cond, 'http://127.0.0.1:8080/', 'match')\n\n    it 'should match [::1] when <local> is used', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '<local>'\n      testCond(cond, 'http://[::1]:8080/', 'match')\n\n    it 'should match any host without dots when <local> is used', ->\n      cond =\n        conditionType: 'BypassCondition'\n        pattern: '<local>'\n      testCond(cond, 'http://localhost:8080/', 'match')\n      testCond(cond, 'http://intranet:8080/', 'match')\n      testCond(cond, 'http://foobar/', 'match')\n      testCond(cond, 'http://example.com/', not 'match')\n\n      # Intended, see the corresponding code and comments for the reasoning.\n      testCond(cond, 'http://[::ffff:eeee]/', 'match')\n      testCond(cond, 'http://[::1.2.3.4]/', not 'match')\n\n  describe 'IpCondition', ->\n    # IpCondition requires isInNetEx or isInNet function provided by the PAC\n    # runner, which is not available in the unit test. So We can't use testCond\n    # here.\n    it 'should support IPv4 subnet', ->\n      cond =\n        conditionType: \"IpCondition\"\n        ip: '192.168.1.1'\n        prefixLength: 16\n      request = Conditions.requestFromUrl('http://192.168.4.4/')\n      Conditions.match(cond, request).should.be.true\n      compiled = Conditions.compile(cond).print_to_string()\n      compiled.should.contain('isInNet(host,\"192.168.1.1\",\"255.255.0.0\")')\n    it 'should support IPv6 subnet', ->\n      cond =\n        conditionType: \"IpCondition\"\n        ip: 'fefe:13::abc'\n        prefixLength: 33\n\n      request = Conditions.requestFromUrl('http://[fefe:13::def]/')\n      Conditions.match(cond, request).should.be.true\n\n      compiled = Conditions.compile(cond).print_to_string()\n      compiled.should.contain('isInNet(host,\"fefe:13::abc\",\"ffff:ffff:8000::\")')\n      compiled.should.contain('isInNetEx(host,\"fefe:13::abc/33\")')\n    it 'should support IPv6 subnet with zero prefixLength', ->\n      cond =\n        conditionType: \"IpCondition\"\n        ip: '::'\n        prefixLength: 0\n\n      request = Conditions.requestFromUrl('http://[fefe:13::def]/')\n      Conditions.match(cond, request).should.be.true\n\n      compiled = Conditions.compile(cond).print_to_string()\n      compiled.indexOf('indexOf(').should.be.above(0)\n    it 'should not match domain name to IP subnet', ->\n      cond =\n        conditionType: \"IpCondition\"\n        ip: '::'\n        prefixLength: 0\n\n      request = Conditions.requestFromUrl('http://www.example.com/')\n      Conditions.match(cond, request).should.be.false\n    it 'should not pass domain name to isInNet function', ->\n      ipToCompiledFunc = (ip, prefixLen) ->\n        cond =\n          conditionType: \"IpCondition\"\n          ip: ip\n          prefixLength: prefixLen\n\n        # In this test case, a dummy isInNet function that always returns true\n        # is used. We only care about whether it is called or not here.\n        dummyIsInNet = new U2.AST_Function(\n          argnames: []\n          body: [\n            new U2.AST_Return value: new U2.AST_True\n          ]\n        )\n        testFunc = new U2.AST_Function(\n          argnames: [\n            new U2.AST_SymbolFunarg name: 'url'\n            new U2.AST_SymbolFunarg name: 'host'\n            new U2.AST_SymbolFunarg name: 'scheme'\n          ]\n          body: [\n            new U2.AST_Var definitions: [\n              new U2.AST_VarDef(\n                name: new U2.AST_SymbolVar(name: 'isInNet')\n                value: dummyIsInNet\n              )\n            ]\n            new U2.AST_Return value: Conditions.compile(cond)\n          ]\n        )\n        eval('(' + testFunc.print_to_string() + ')')\n\n      compiledFunc = ipToCompiledFunc('0.0.0.0', 0)\n      compiledFunc(null, 'www.example.com').should.equal(false)\n      compiledFunc(null, '127.0.0.1').should.equal(true)\n\n      compiledFunc = ipToCompiledFunc('0.0.0.0', 1)\n      compiledFunc(null, 'www.example.com').should.equal(false)\n      compiledFunc(null, '127.0.0.1').should.equal(true)\n\n      compiledFunc = ipToCompiledFunc('::', 0)\n      compiledFunc(null, 'www.example.com').should.equal(false)\n      compiledFunc(null, '::1').should.equal(true)\n\n      compiledFunc = ipToCompiledFunc('::', 1)\n      compiledFunc(null, 'www.example.com').should.equal(false)\n      compiledFunc(null, '::1').should.equal(true)\n\n  describe 'KeywordCondition', ->\n    cond =\n      conditionType: 'KeywordCondition'\n      pattern: 'example.com'\n    it 'should match requests based on substring', ->\n      testCond(cond, 'http://www.example.com/', 'match')\n      testCond(cond, 'http://www.example.net/', not 'match')\n    it 'should not match HTTPS requests', ->\n      testCond(cond, 'https://example.com/', not 'match')\n      testCond(cond, 'https://example.net/', not 'match')\n\n  describe 'WeekdayCondition', ->\n    clock = null\n    before ->\n      clock = lolex.install 0, ['Date']\n    after ->\n      clock.uninstall()\n\n    testCondDay = (cond, day, match) ->\n      # Feb 2016 Calendar for testing:\n      # Su Mo Tu We Th Fr Sa\n      # .. 01 02 03 04 05 06\n      # 07 08 09 10 11 12 13\n      # (...)\n      date = if day > 0 then day else 7\n      clock.setSystemTime(new Date(\"2016-02-0#{date}T00:00:00Z\").getTime())\n      testCond(cond, \"http://weekday-#{day}/\", match)\n\n    it 'should match requests based on date range', ->\n      cond =\n        conditionType: 'WeekdayCondition'\n        startDay: 3\n        endDay: 5\n\n      testCondDay(cond, 0, not 'match')\n      testCondDay(cond, 1, not 'match')\n      testCondDay(cond, 2, not 'match')\n      testCondDay(cond, 3, 'match')\n      testCondDay(cond, 4, 'match')\n      testCondDay(cond, 5, 'match')\n      testCondDay(cond, 6, not 'match')\n\n    it 'should match the day if startDay == endDay', ->\n      cond =\n        conditionType: 'WeekdayCondition'\n        startDay: 3\n        endDay: 3\n\n      testCondDay(cond, 0, not 'match')\n      testCondDay(cond, 1, not 'match')\n      testCondDay(cond, 2, not 'match')\n      testCondDay(cond, 3, 'match')\n      testCondDay(cond, 4, not 'match')\n      testCondDay(cond, 5, not 'match')\n      testCondDay(cond, 6, not 'match')\n\n    it 'should not match anything if startDay > endDay', ->\n      cond =\n        conditionType: 'WeekdayCondition'\n        startDay: 4\n        endDay: 3\n\n      testCondDay(cond, 0, not 'match')\n      testCondDay(cond, 1, not 'match')\n      testCondDay(cond, 2, not 'match')\n      testCondDay(cond, 3, not 'match')\n      testCondDay(cond, 4, not 'match')\n      testCondDay(cond, 5, not 'match')\n      testCondDay(cond, 6, not 'match')\n\n    it 'should match according to .days', ->\n      cond =\n        conditionType: 'WeekdayCondition'\n        days: 'SMTWtFs'\n\n      testCondDay(cond, 0, 'match')\n      testCondDay(cond, 1, 'match')\n      testCondDay(cond, 2, 'match')\n      testCondDay(cond, 3, 'match')\n      testCondDay(cond, 4, 'match')\n      testCondDay(cond, 5, 'match')\n      testCondDay(cond, 6, 'match')\n\n      cond =\n        conditionType: 'WeekdayCondition'\n        days: 'S-TW-F-'\n\n      testCondDay(cond, 0, 'match')\n      testCondDay(cond, 1, not 'match')\n      testCondDay(cond, 2, 'match')\n      testCondDay(cond, 3, 'match')\n      testCondDay(cond, 4, not 'match')\n      testCondDay(cond, 5, 'match')\n      testCondDay(cond, 6, not 'match')\n\n    it 'should prefer .days to .startDay and .endDay', ->\n      cond =\n        conditionType: 'WeekdayCondition'\n        days: '--TW---'\n        startDay: 0\n        endDay: 0\n\n      testCondDay(cond, 0, not 'match')\n      testCondDay(cond, 1, not 'match')\n      testCondDay(cond, 2, 'match')\n      testCondDay(cond, 3, 'match')\n      testCondDay(cond, 4, not 'match')\n      testCondDay(cond, 5, not 'match')\n      testCondDay(cond, 6, not 'match')\n\n  describe 'TimeCondition', ->\n    clock = null\n    before ->\n      clock = lolex.install 0, ['Date']\n    after ->\n      clock.uninstall()\n\n    testCondTime = (cond, time, match) ->\n      # This uses RFC2822 format to make it in local time zone.\n      # ISO-8601 should be avoided because ES5 says it assumes UTC.\n      clock.setSystemTime(new Date(\"01 Feb 2016 #{time}\").getTime())\n      testCond(cond, \"http://time-#{time}/\", match)\n\n    it 'should match requests based on hour range', ->\n      cond =\n        conditionType: 'TimeCondition'\n        startHour: 7\n        endHour: 9\n\n      testCondTime(cond, '00:00:00', not 'match')\n      testCondTime(cond, '06:00:00', not 'match')\n      testCondTime(cond, '07:00:00', 'match')\n      testCondTime(cond, '08:00:00', 'match')\n      testCondTime(cond, '09:00:00', 'match')\n      testCondTime(cond, '09:59:59', 'match')\n      testCondTime(cond, '10:00:00', not 'match')\n      testCondTime(cond, '19:00:00', not 'match')\n      testCondTime(cond, '23:00:00', not 'match')\n\n    it 'should match the hour if startHour == endHour', ->\n      cond =\n        conditionType: 'TimeCondition'\n        startHour: 7\n        endHour: 7\n\n      testCondTime(cond, '00:00:00', not 'match')\n      testCondTime(cond, '06:00:00', not 'match')\n      testCondTime(cond, '07:00:00', 'match')\n      testCondTime(cond, '07:00:01', 'match')\n      testCondTime(cond, '07:59:59', 'match')\n      testCondTime(cond, '08:00:00', not 'match')\n      testCondTime(cond, '19:00:00', not 'match')\n\n    it 'should not match anything if startHour > endHour', ->\n      cond =\n        conditionType: 'TimeCondition'\n        startHour: 7\n        endHour: 6\n\n      testCondTime(cond, '00:00:00', not 'match')\n      testCondTime(cond, '06:00:00', not 'match')\n      testCondTime(cond, '06:59:59', not 'match')\n      testCondTime(cond, '07:00:00', not 'match')\n      testCondTime(cond, '08:00:00', not 'match')\n      testCondTime(cond, '09:00:00', not 'match')\n      testCondTime(cond, '10:00:00', not 'match')\n      testCondTime(cond, '19:00:00', not 'match')\n      testCondTime(cond, '23:00:00', not 'match')\n\n  describe '#typeFromAbbr', ->\n    it 'should get condition types by abbrs', ->\n      Conditions.typeFromAbbr('True').should.equal('TrueCondition')\n      Conditions.typeFromAbbr('HR').should.equal('HostRegexCondition')\n\n  describe '#str and #fromStr', ->\n    it 'should encode & decode TrueCondition correctly', ->\n      condition =\n        conditionType: 'TrueCondition'\n      result = Conditions.str(condition)\n      result.should.equal('True:')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode conditions with pattern correctly', ->\n      condition =\n        conditionType: 'UrlWildcardCondition'\n        pattern: '*://*.example.com/*'\n      result = Conditions.str(condition)\n      result.should.equal('UrlWildcard: ' + condition.pattern)\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode False while preserving pattern', ->\n      condition =\n        conditionType: 'FalseCondition'\n        pattern: 'a b c'\n      result = Conditions.str(condition)\n      result.should.equal('Disabled: a b c')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode FalseCondition without any pattern', ->\n      condition =\n        conditionType: 'FalseCondition'\n      result = Conditions.str(condition)\n      result.should.equal('Disabled:')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode HostWildcardCondition using shorthand syntax', ->\n      condition =\n        conditionType: 'HostWildcardCondition'\n        pattern: '*.example.com'\n      result = Conditions.str(condition)\n      result.should.equal(condition.pattern)\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode HostWildcardCondition ending with colon', ->\n      condition =\n        conditionType: 'HostWildcardCondition'\n        pattern: 'bogus:'\n      result = Conditions.str(condition)\n      result.should.equal('HostWildcard: ' + condition.pattern)\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode BypassCondition correctly', ->\n      condition =\n        conditionType: 'BypassCondition'\n        pattern: '127.0.0.1/16'\n      result = Conditions.str(condition)\n      result.should.equal('Bypass: 127.0.0.1/16')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should add brackets for IPv6 hosts in BypassCondition', ->\n      condition =\n        conditionType: 'BypassCondition'\n        pattern: '::1'\n      result = Conditions.str(condition)\n      result.should.equal('Bypass: [::1]')\n      cond = Conditions.fromStr(result)\n      cond.conditionType.should.equal('BypassCondition')\n      cond.pattern.should.equal('[::1]')\n    it 'should add brackets for IPv6 hosts with scheme in BypassCondition', ->\n      condition =\n        conditionType: 'BypassCondition'\n        pattern: 'http://::1'\n      result = Conditions.str(condition)\n      result.should.equal('Bypass: http://[::1]')\n      cond = Conditions.fromStr(result)\n      cond.conditionType.should.equal('BypassCondition')\n      cond.pattern.should.equal('http://[::1]')\n    it 'should encode & decode IpCondition correctly', ->\n      condition =\n        conditionType: 'IpCondition'\n        ip: '127.0.0.1'\n        prefixLength: 16\n      result = Conditions.str(condition)\n      result.should.equal('Ip: 127.0.0.1/16')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should provide sensible fallbacks for invalid IpCondition', ->\n      cond = Conditions.fromStr('Ip: foo/-233')\n      cond.should.eql(\n        conditionType: 'IpCondition'\n        ip: '0.0.0.0'\n        prefixLength: 0\n      )\n\n      cond = Conditions.fromStr('Ip: nonsense stuff')\n      cond.should.eql(\n        conditionType: 'IpCondition'\n        ip: '0.0.0.0'\n        prefixLength: 0\n      )\n    it 'should assume full match for IpCondition without prefixLength', ->\n      cond = Conditions.fromStr('Ip: 127.0.0.1')\n      cond.should.eql(\n        conditionType: 'IpCondition'\n        ip: '127.0.0.1'\n        prefixLength: 32\n      )\n\n      cond = Conditions.fromStr('Ip: ::1')\n      cond.should.eql(\n        conditionType: 'IpCondition'\n        ip: '::1'\n        prefixLength: 128\n      )\n    it 'should provide sensible fallbacks for invalid IpCondition', ->\n      cond = Conditions.fromStr('Ip: 0.0.0.0/-233')\n      cond.should.eql(\n        conditionType: 'IpCondition'\n        ip: '0.0.0.0'\n        prefixLength: 0\n      )\n    it 'should encode & decode HostLevelsCondition correctly', ->\n      condition =\n        conditionType: 'HostLevelsCondition'\n        minValue: 4\n        maxValue: 7\n      result = Conditions.str(condition)\n      result.should.equal('HostLevels: 4~7')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should provide sensible fallbacks for HostLevels out of range', ->\n      cond = Conditions.fromStr('HostLevels: A~-1')\n      cond.should.eql(\n        conditionType: 'HostLevelsCondition'\n        minValue: 1\n        maxValue: 1\n      )\n\n      cond = Conditions.fromStr('HostLevels: nonsense')\n      cond.should.eql(\n        conditionType: 'HostLevelsCondition'\n        minValue: 1\n        maxValue: 1\n      )\n    it 'should encode & decode WeekdayCondition correctly', ->\n      condition =\n        conditionType: 'WeekdayCondition'\n        startDay: 3\n        endDay: 6\n      result = Conditions.str(condition)\n      result.should.equal('Weekday: 3~6')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should provide sensible fallbacks for Weekday out of range', ->\n      cond = Conditions.fromStr('Weekday: -1~100')\n      cond.should.eql(\n        conditionType: 'WeekdayCondition'\n        startDay: 0\n        endDay: 0\n      )\n\n      cond = Conditions.fromStr('Weekday: nonsense')\n      cond.should.eql(\n        conditionType: 'WeekdayCondition'\n        startDay: 0\n        endDay: 0\n      )\n    it 'should encode & decode WeekdayCondition with days', ->\n      condition =\n        conditionType: 'WeekdayCondition'\n        days: 'SMTWtFs'\n      result = Conditions.str(condition)\n      result.should.equal('Weekday: SMTWtFs')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n\n      condition =\n        conditionType: 'WeekdayCondition'\n        days: 'SM-W-Fs'\n      result = Conditions.str(condition)\n      result.should.equal('Weekday: SM-W-Fs')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should encode & decode TimeCondition correctly', ->\n      condition =\n        conditionType: 'TimeCondition'\n        startHour: 7\n        endHour: 23\n      result = Conditions.str(condition)\n      result.should.equal('Hour: 7~23')\n      cond = Conditions.fromStr(result)\n      cond.should.eql(condition)\n    it 'should provide sensible fallbacks for Hour out of range', ->\n      cond = Conditions.fromStr('Hour: -1~100')\n      cond.should.eql(\n        conditionType: 'TimeCondition'\n        startHour: 0\n        endHour: 0\n      )\n\n      cond = Conditions.fromStr('Hour: nonsense')\n      cond.should.eql(\n        conditionType: 'TimeCondition'\n        startHour: 0\n        endHour: 0\n      )\n    it 'should parse conditions with extra spaces correctly', ->\n      Conditions.fromStr('url:    *abcde*   ').should.eql({\n        conditionType: 'UrlWildcardCondition'\n        pattern: '*abcde*'\n      })\n    it 'should parse abbreviated condition types correctly', ->\n      Conditions.fromStr('url: *://*.example.com/*').should.eql({\n        conditionType: 'UrlWildcardCondition'\n        pattern: '*://*.example.com/*'\n      })\n    it 'should parse escaped HostWildcardCondition starting with colon', ->\n      Conditions.fromStr(': :bogus:').should.eql({\n        conditionType: 'HostWildcardCondition'\n        pattern: ':bogus:'\n      })\n"
  },
  {
    "path": "omega-pac/test/pac_generator.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\n\ndescribe 'PacGenerator', ->\n  PacGenerator = require '../src/pac_generator.coffee'\n\n  options =\n    '+auto':\n      name: 'auto'\n      profileType: 'SwitchProfile'\n      revision: 'test'\n      defaultProfileName: 'direct'\n      rules: [\n        {profileName: 'proxy', condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^http://(www|www2)\\\\.example\\\\.com/'\n        }\n        {profileName: 'direct', condition:\n          conditionType: 'HostLevelsCondition'\n          minValue: 3\n          maxValue: 8\n        }\n        {\n          profileName: 'proxy'\n          condition: {conditionType: 'KeywordCondition', pattern: 'keyword'}\n        }\n        {profileName: 'proxy', condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'https://ssl.example.com/*'\n        }\n      ]\n    '+proxy':\n      name: 'proxy'\n      profileType: 'FixedProfile'\n      revision: 'test'\n      fallbackProxy: {scheme: 'http', host: '127.0.0.1', port: 8888}\n      bypassList: [\n        {conditionType: 'BypassCondition', pattern: '127.0.0.1:8080'}\n        {conditionType: 'BypassCondition', pattern: '127.0.0.1'}\n        {conditionType: 'BypassCondition', pattern: '<local>'}\n      ]\n\n  it 'should generate pac scripts from options', ->\n    ast = PacGenerator.script(options, 'auto')\n    pac = ast.print_to_string(beautify: true, comments: true)\n    pac.should.not.be.empty\n    func = eval(\"(function () { #{pac}\\n return FindProxyForURL; })()\")\n    result = func('http://www.example.com/', 'www.example.com')\n    result.should.equal('PROXY 127.0.0.1:8888')\n  it 'should be able to compress pac scripts', ->\n    ast = PacGenerator.script(options, 'auto')\n    pac = PacGenerator.compress(ast).print_to_string()\n    pac.should.not.be.empty\n    func = eval(\"(function () { #{pac}\\n return FindProxyForURL; })()\")\n    result = func('http://www.example.com/', 'www.example.com')\n    result.should.equal('PROXY 127.0.0.1:8888')\n"
  },
  {
    "path": "omega-pac/test/profiles.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\n\ndescribe 'Profiles', ->\n  Profiles = require '../src/profiles'\n  Conditions = require '../src/conditions'\n  U2 = require 'uglify-js'\n  ruleListResult = (profileName, source) ->\n    profileName: profileName\n    source: source\n  testProfile = (profile, request, expected, expectedCompiled) ->\n    o_request = request\n    if typeof request == 'string'\n      request = Conditions.requestFromUrl(request)\n    expectedCompiled ?= expected[0] ? Profiles.nameAsKey(expected.profileName)\n\n    compiled = Profiles.compile(profile)\n    compileResult = eval '(' + compiled.print_to_string() + ')'\n    if typeof compileResult == 'function'\n      compileResult = compileResult(request.url, request.host, request.scheme)\n\n    if expected?\n      matchResult = Profiles.match(profile, request)\n      try\n        if expected.source?\n          chai.assert.equal(matchResult.profileName, expected.profileName)\n          chai.assert.equal(matchResult.source, expected.source)\n        else\n          chai.assert.deepEqual(matchResult, expected)\n      catch _\n        printResult = JSON.stringify(matchResult)\n        msg = (\"expect profile to return #{JSON.stringify(expected)} \" +\n                \"instead of #{printResult} for request #{o_request}\")\n        chai.assert(false, msg)\n\n    if compileResult != expectedCompiled\n      msg = (\"expect COMPILED profile to return #{expectedCompiled} \" +\n              \"instead of #{compileResult} for request #{o_request}\")\n      chai.assert(false, msg)\n\n    return expected\n\n  describe '#pacResult', ->\n    it 'should return DIRECT for no proxy', ->\n      Profiles.pacResult().should.equal(\"DIRECT\")\n    it 'should return a valid PAC result for a proxy', ->\n      proxy = {scheme: \"http\", host: \"127.0.0.1\", port: 8888}\n      Profiles.pacResult(proxy).should.equal(\"PROXY 127.0.0.1:8888\")\n    it 'should return special compatible result for SOCKS5', ->\n      proxy = {scheme: \"socks5\", host: \"127.0.0.1\", port: 8888}\n      compatibleResult = \"SOCKS5 127.0.0.1:8888; SOCKS 127.0.0.1:8888\"\n      Profiles.pacResult(proxy).should.equal(compatibleResult)\n  describe '#byName', ->\n    it 'should get profiles from builtin profiles', ->\n      profile = Profiles.byName('direct')\n      profile.should.be.an('object')\n      profile.profileType.should.equal('DirectProfile')\n    it 'should get profiles from given options', ->\n      profile = {}\n      profile = Profiles.byName('profile', {\"+profile\": profile})\n      profile.should.equal(profile)\n  describe '#allReferenceSet', ->\n    profile = Profiles.create('test', 'VirtualProfile')\n    profile.defaultProfileName = 'bogus'\n    it 'should throw if referenced profile does not exist', ->\n      getAllReferenceSet = ->\n        Profiles.allReferenceSet(profile, {})\n      getAllReferenceSet.should.throw(Error)\n    it 'should process a dumb profile for each missing profile if requested', ->\n      profile.defaultProfileName = 'bogus'\n      refs = Profiles.allReferenceSet profile, {}, profileNotFound: 'dumb'\n      refs['+bogus'].should.equal('bogus')\n\n  describe 'SystemProfile', ->\n    it 'should be builtin with the name \"system\"', ->\n      profile = Profiles.byName('system')\n      profile.should.be.an('object')\n      profile.profileType.should.equal('SystemProfile')\n    it 'should not match request to profiles', ->\n      profile = Profiles.byName('system')\n      should.not.exist Profiles.match(profile, {})\n    it 'should throw when trying to compile', ->\n      profile = Profiles.byName('system')\n      should.throw(-> Profiles.compile(profile))\n  describe 'DirectProfile', ->\n    it 'should be builtin with the name \"direct\"', ->\n      profile = Profiles.byName('direct')\n      profile.should.be.an('object')\n      profile.profileType.should.equal('DirectProfile')\n    it 'should return \"DIRECT\" when compiled', ->\n      profile = Profiles.byName('direct')\n      testProfile(profile, {}, null, 'DIRECT')\n  describe 'FixedProfile', ->\n    profile =\n      profileType: 'FixedProfile'\n      bypassList: [{\n        conditionType: 'BypassCondition'\n        pattern: '<local>'\n      }]\n      proxyForHttp:\n        scheme: 'socks4'\n        host: '127.0.0.1'\n        port: 1234\n      proxyForHttps:\n        scheme: 'http'\n        host: '127.0.0.1'\n        port: 2345\n      fallbackProxy:\n        scheme: 'socks4'\n        host: '127.0.0.1'\n        port: 3456\n      auth:\n        proxyForHttps:\n          username: 'test'\n          password: 'cheesecake'\n    it 'should use protocol-specific proxies if suitable', ->\n      testProfile(profile, 'https://www.example.com/', ['PROXY 127.0.0.1:2345',\n        'https', profile.proxyForHttps, profile.auth.proxyForHttps])\n    it 'should use fallback proxies for other protocols', ->\n      testProfile(profile, 'ftp://www.example.com/',\n        ['SOCKS 127.0.0.1:3456', '', profile.fallbackProxy, undefined])\n    it 'should not return authentication if not provided for protocol', ->\n      testProfile(profile, 'http://www.example.com/',\n        ['SOCKS 127.0.0.1:1234', 'http', profile.proxyForHttp, undefined])\n    it 'should not use any proxy for requests matching the bypassList', ->\n      testProfile profile, 'ftp://localhost/',\n        ['DIRECT', profile.bypassList[0], {scheme: 'direct'}, undefined]\n  describe 'PacProfile', ->\n    profile = Profiles.create('test', 'PacProfile')\n    profile.pacScript = '''\n      function FindProxyForURL(url, host) {\n        return \"PROXY \" + host + \":8080\";\n      }\n    '''\n    it 'should return the result of the pac script', ->\n      testProfile(profile, 'ftp://www.example.com:9999/abc', null,\n        'PROXY www.example.com:8080')\n    it 'should not fail for PAC with trailing comments', ->\n      p = Profiles.create('test', 'PacProfile')\n      p.pacScript = profile.pacScript + '''\n        // This is a trailing line comment.\n      '''\n      testProfile(p, 'ftp://www.example.com:9999/abc', null,\n        'PROXY www.example.com:8080')\n      p = Profiles.create('test', 'PacProfile')\n      p.pacScript = profile.pacScript + '''\n        /* This is a multiline comment which is not properly closed.\n      '''\n      testProfile(p, 'ftp://www.example.com:9999/abc', null,\n        'PROXY www.example.com:8080')\n    it 'should return includable for non-file pacUrl', ->\n      Profiles.isIncludable(profile).should.be.true\n    it 'should return not includable for file: pacUrl', ->\n      p = Profiles.create('test', 'PacProfile')\n      p.pacUrl = 'file:///proxy.pac'\n      Profiles.isIncludable(p).should.be.false\n  describe 'SwitchProfile', ->\n    profile = Profiles.create('test', 'SwitchProfile')\n    profile.rules = [\n      {\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: 'company.abc.example.com'\n        profileName: 'company'\n      },\n      {\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: '*.example.com'\n        profileName: 'example'\n      },\n      {\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: '*.abc.example.com'\n        profileName: 'abc'\n      }\n    ]\n    profile.defaultProfileName = 'default'\n    it 'should match requests based on rules', ->\n      testProfile(profile, 'http://company.abc.example.com:998/abc',\n        profile.rules[0])\n    it 'should respect the order of rules', ->\n      testProfile(profile, 'http://abc.example.com:9999/abc',\n        profile.rules[1])\n      testProfile(profile, 'http://www.example.com:9999/abc',\n        profile.rules[1])\n    it 'should return defaultProfileName when no rules match', ->\n      testProfile(profile, 'http://www.example.org:9999/abc',\n        ['+default', null])\n    it 'should calulate directly referenced profiles correctly', ->\n      set = Profiles.directReferenceSet(profile)\n      set.should.eql(\n        '+company': 'company'\n        '+example': 'example'\n        '+abc': 'abc'\n        '+default': 'default'\n      )\n    it 'should clear the reference cache on profile revision change', ->\n      profile.revision = 'a'\n      set = Profiles.directReferenceSet(profile)\n      # Remove 'default' from references.\n      profile.defaultProfileName = 'abc'\n      profile.revision = 'b'\n      newSet = Profiles.directReferenceSet(profile)\n      newSet.should.eql(\n        '+company': 'company'\n        '+example': 'example'\n        '+abc': 'abc'\n      )\n    it 'should clear the reference cache if explicitly requested', ->\n      profile.revision = 'a'\n      set = Profiles.directReferenceSet(profile)\n      # Remove 'default' from references.\n      profile.defaultProfileName = 'abc'\n      Profiles.dropCache(profile)\n      newSet = Profiles.directReferenceSet(profile)\n      newSet.should.eql(\n        '+company': 'company'\n        '+example': 'example'\n        '+abc': 'abc'\n      )\n  describe 'VirtualProfile', ->\n    profile = Profiles.create('test', 'VirtualProfile')\n    profile.defaultProfileName = 'default'\n    it 'should always return defaultProfileName', ->\n      testProfile(profile, 'http://www.example.com/abc',\n        ['+default', null])\n  describe 'RulelistProfile', ->\n    profile = Profiles.create('test', 'AutoProxyRuleListProfile')\n    profile.defaultProfileName = 'default'\n    profile.matchProfileName = 'example'\n    profile.ruleList = 'example.com'\n    profile.revision = 'a'\n    it 'should calulate directly referenced profiles correctly', ->\n      set = Profiles.directReferenceSet(profile)\n      set.should.eql(\n        '+example': 'example'\n        '+default': 'default'\n      )\n    it 'should calulate referenced profiles for rule list with results', ->\n      set = Profiles.directReferenceSet({\n        profileType: 'RuleListProfile'\n        format: 'Switchy'\n        matchProfileName: 'ignored'\n        defaultProfileName: 'alsoIgnored'\n        ruleList: '''\n          [SwitchyOmega Conditions]\n          @with result\n          !*.example.org\n          *.example.com +ABC\n          * +DEF\n        '''\n      })\n      set.should.eql(\n        '+ABC': 'ABC'\n        '+DEF': 'DEF'\n      )\n    it 'should match requests based on the rule list', ->\n      testProfile(profile, 'http://localhost/example.com',\n        ruleListResult('example', 'example.com'))\n      testProfile(profile, 'http://localhost/example.org', ['+default', null])\n    it 'should update rule list on update', ->\n      Profiles.update(profile, 'example.org')\n      profile.revision = 'b'\n      testProfile(profile, 'http://localhost/example.com', ['+default', null])\n      testProfile(profile, 'http://localhost/example.org',\n        ruleListResult('example', 'example.org'))\n    it 'should not fail when ruleList is not provided', ->\n      p =\n        profileType: 'RuleListProfile'\n        format: 'Switchy'\n        matchProfileName: 'match'\n        defaultProfileName: 'default'\n      Profiles.directReferenceSet(p).should.be.an 'object'\n      testProfile(p, 'http://localhost/example.com', ['+default', null])\n    it 'should switch to AutoProxy format on update if detected', ->\n      profile = Profiles.create('test2', 'RuleListProfile')\n      profile.format = 'Switchy'\n      profile.defaultProfileName = 'default'\n      profile.matchProfileName = 'example'\n\n      profile.format.should.equal 'Switchy'\n      Profiles.update(profile, '[AutoProxy]\\nexample.org')\n      profile.format.should.equal 'AutoProxy'\n\n      testProfile(profile, 'http://localhost/example.com',\n        ['+default', null])\n      testProfile(profile, 'http://localhost/example.org',\n        ruleListResult('example', 'example.org'))\n"
  },
  {
    "path": "omega-pac/test/rule_list.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\n\ndescribe 'RuleList', ->\n  RuleList = require '../src/rule_list'\n  describe 'AutoProxy', ->\n    parse = RuleList['AutoProxy'].parse\n    it 'should parse keyword conditions', ->\n      line = 'example.com'\n      result = parse(line, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: line\n        profileName: 'match'\n        condition:\n          conditionType: 'KeywordCondition'\n          pattern: 'example.com'\n      )\n    it 'should parse keyword conditions with asterisks', ->\n      line = 'example*.com'\n      result = parse(line, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: line\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'http://*example*.com*'\n      )\n    it 'should parse host conditions', ->\n      line = '||example.com'\n      result = parse(line, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: line\n        profileName: 'match'\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: '*.example.com'\n      )\n    it 'should parse \"starts-with\" conditions', ->\n      line = '|https://ssl.example.com'\n      result = parse(line, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: line\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'https://ssl.example.com*'\n      )\n    it 'should parse \"starts-with\" conditions for the HTTP scheme', ->\n      line = '|http://example.com'\n      result = parse(line, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: line\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'http://example.com*'\n      )\n    it 'should parse url regex conditions', ->\n      line = '/^https?:\\\\/\\\\/[^\\\\/]+example\\.com/'\n      result = parse(line, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: line\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^https?:\\\\/\\\\/[^\\\\/]+example\\.com'\n      )\n    it 'should ignore comment lines', ->\n      result = parse('!example.com', 'match', 'notmatch')\n      result.should.have.length(0)\n    it 'should parse multiple lines', ->\n      result = parse 'example.com\\n!comment\\n||example.com', 'match', 'notmatch'\n      result.should.have.length(2)\n      result[0].should.eql(\n        source: 'example.com'\n        profileName: 'match'\n        condition:\n          conditionType: 'KeywordCondition'\n          pattern: 'example.com'\n      )\n      result[1].should.eql(\n        source: '||example.com'\n        profileName: 'match'\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: '*.example.com'\n      )\n    it 'should put exclusive rules first', ->\n      result = parse 'example.com\\n@@||example.com', 'match', 'notmatch'\n      result.should.have.length(2)\n      result[0].should.eql(\n        source: '@@||example.com'\n        profileName: 'notmatch'\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: '*.example.com'\n      )\n      result[1].should.eql(\n        source: 'example.com'\n        profileName: 'match'\n        condition:\n          conditionType: 'KeywordCondition'\n          pattern: 'example.com'\n      )\n\n  describe 'Switchy', ->\n    parse = RuleList['Switchy'].parse\n    compose = (sections) ->\n      list = '#BEGIN\\r\\n\\r\\n'\n      for sec, rules of sections\n        list += \"[#{sec}]\\r\\n\"\n        for rule in rules\n          list += rule\n          list += '\\r\\n'\n      list += '\\r\\n\\r\\n#END\\r\\n'\n    it 'should parse empty rule lists', ->\n      list = compose {}\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(0)\n    it 'should ignore stuff before #BEGIN or after #END.', ->\n      list = compose {}\n      list += '[RegExp]\\r\\ntest\\r\\n'\n      list = '[Wildcard]\\r\\ntest\\r\\n' + list\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(0)\n    it 'should parse wildcard rules', ->\n      list = compose 'Wildcard': [\n        '*://example.com/abc/*'\n      ]\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: '*://example.com/abc/*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: '*://example.com/abc/*'\n      )\n    it 'should parse RegExp rules', ->\n      list = compose 'RegExp': [\n        '^http://www\\.example\\.com/.*'\n      ]\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: '^http://www\\.example\\.com/.*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^http://www\\.example\\.com/.*'\n      )\n    it 'should parse exclusive rules', ->\n      list = compose 'RegExp': [\n        '!^http://www\\.example\\.com/.*'\n      ]\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(\n        source: '!^http://www\\.example\\.com/.*'\n        profileName: 'notmatch'\n        condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^http://www\\.example\\.com/.*'\n      )\n    it 'should parse multiple rules in multiple sections', ->\n      list = compose {\n        'Wildcard': [\n          'http://www.example.com/*'\n          'http://example.com/*'\n        ]\n        'RegExp': [\n          '^http://www\\.example\\.com/.*'\n          '^http://example\\.com/.*'\n        ]\n      }\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(4)\n      result[0].should.eql(\n        source: 'http://www.example.com/*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'http://www.example.com/*'\n      )\n      result[1].should.eql(\n        source: 'http://example.com/*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'http://example.com/*'\n      )\n      result[2].should.eql(\n        source: '^http://www\\.example\\.com/.*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^http://www\\.example\\.com/.*'\n      )\n      result[3].should.eql(\n        source: '^http://example\\.com/.*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^http://example\\.com/.*'\n      )\n    it 'should put exclusive rules first', ->\n      list = compose {\n        'Wildcard': [\n          'http://www\\.example\\.com/*'\n        ]\n        'RegExp': [\n          '!^http://www\\.example\\.com/.*'\n        ]\n      }\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(2)\n      result[0].should.eql(\n        source: '!^http://www\\.example\\.com/.*'\n        profileName: 'notmatch'\n        condition:\n          conditionType: 'UrlRegexCondition'\n          pattern: '^http://www.example\\.com/.*'\n      )\n      result[1].should.eql(\n        source: 'http://www\\.example\\.com/*'\n        profileName: 'match'\n        condition:\n          conditionType: 'UrlWildcardCondition'\n          pattern: 'http://www.example.com/*'\n      )\n\n  describe 'Switchy (omega format)', ->\n    parse = RuleList['Switchy'].parse\n    compose = RuleList['Switchy'].compose\n    it 'should parse empty rule lists', ->\n      list = compose {rules: []}\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(0)\n    it 'should ignore comment lines.', ->\n      list = compose {rules: []}\n      list += ';*.example.com \\r\\n'\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(0)\n    it 'should compose and parse HostWildcardCondition', ->\n      rule =\n        source: '*.example.com'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*.example.com'\n        profileName: 'match'\n      list = compose({rules: [rule], defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(rule)\n    it 'should compose and parse HostRegexCondition', ->\n      rule =\n        source: 'HostRegex: ^http://www\\.example\\.com/.*'\n        condition:\n          conditionType: 'HostRegexCondition',\n          pattern: '^http://www\\.example\\.com/.*'\n        profileName: 'match'\n      list = compose({rules: [rule], defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(rule)\n    it 'should compose and parse disabled rules', ->\n      rule =\n        source: 'Disabled: *.example.com'\n        condition:\n          conditionType: 'FalseCondition',\n          pattern: '*.example.com'\n        profileName: 'match'\n      list = compose({rules: [rule], defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(rule)\n    it 'should compose and parse exclusive rules', ->\n      rule =\n        source: '!*.example.com'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*.example.com'\n        profileName: 'notmatch'\n      list = compose({rules: [rule], defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(rule)\n    it 'should compose and parse conditions starting with special chars', ->\n      rule =\n        source: ': ;abc'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: ';abc'\n        profileName: 'match'\n      list = compose({rules: [rule], defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.have.length(1)\n      result[0].should.eql(rule)\n    it 'should parse multiple conditions', ->\n      rules = [{\n        source: '*.example.com'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*.example.com'\n        profileName: 'match'\n      }, {\n        source: '*.example.org'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*.example.org'\n        profileName: 'match'\n      }]\n      list = compose({rules: rules, defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.eql(rules)\n    it 'should respect the top-down order of conditions', ->\n      rules = [{\n        source: 'b.example.com'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: 'b.example.com'\n        profileName: 'match'\n      }, {\n        source: '!a.example.org'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: 'a.example.org'\n        profileName: 'notmatch'\n      }]\n      list = compose({rules: rules, defaultProfileName: 'notmatch'})\n      result = parse(list, 'match', 'notmatch')\n      result.should.eql(rules)\n    it 'should add a default rule when results are enabled', ->\n      list = compose(\n        {rules: [], defaultProfileName: 'notmatch'}\n        {withResult: true}\n      )\n      list.split(/\\r|\\n/).should.contain('@with result')\n      result = parse(list, 'ignored', 'alsoIgnored')\n      result.should.have.length(1)\n      result[0].should.eql({\n        source: '*'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*'\n        profileName: 'notmatch',\n      })\n    it 'should compose and parse conditions with results', ->\n      rules = [{\n        source: 'b.example.com'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: 'b.example.com'\n        profileName: 'abc'\n      }, {\n        source: 'a.example.org'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: 'a.example.org'\n        profileName: 'def'\n      }]\n      list = compose(\n        {rules: rules, defaultProfileName: 'ghi'}\n        {withResult: true}\n      )\n      result = parse(list, 'ignored', 'alsoIgnored')\n      rules.push({\n        source: '*'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*'\n        profileName: 'ghi',\n      })\n      result.should.eql(rules)\n    it 'should compose and parse exclusive conditions with results', ->\n      rules = [{\n        source: '!b.example.com'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: 'b.example.com'\n        profileName: 'default profile'\n      }, {\n        source: 'a.example.org'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: 'a.example.org'\n        profileName: 'some profile'\n      }]\n      list = compose(\n        {rules: rules, defaultProfileName: 'default profile'}\n        {withResult: true, useExclusive: true}\n      )\n      result = parse(list, 'ignored', 'alsoIgnored')\n      rules.push({\n        source: '*'\n        condition:\n          conditionType: 'HostWildcardCondition',\n          pattern: '*'\n        profileName: 'default profile',\n      })\n      result.should.eql(rules)\n"
  },
  {
    "path": "omega-pac/test/shexp_utils.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\n\ndescribe 'ShexpUtils', ->\n  ShexpUtils = require '../src/shexp_utils'\n  describe '#escapeSlash', ->\n    it 'should escape all forward slashes', ->\n      regex = ShexpUtils.escapeSlash '/test/'\n      regex.should.equal '\\\\/test\\\\/'\n    it 'should not escape slashes that are already escaped', ->\n      regex = ShexpUtils.escapeSlash '\\\\/test\\\\/'\n      regex.should.equal '\\\\/test\\\\/'\n    it 'should know the difference between escaped and unescaped slashes', ->\n      regex = ShexpUtils.escapeSlash '\\\\\\\\/\\\\/test\\\\/'\n      regex.should.equal '\\\\\\\\\\\\/\\\\/test\\\\/'\n  describe '#shExp2RegExp', ->\n    it 'should escape regex meta chars and back slashes', ->\n      regex = ShexpUtils.shExp2RegExp 'this.is|a\\\\test+'\n      regex.should.equal '^this\\\\.is\\\\|a\\\\\\\\test\\\\+$'\n"
  },
  {
    "path": "omega-pac/test/utils.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\nUtils = require '../src/utils'\n\ndescribe 'getBaseDomain', ->\n  {getBaseDomain} = Utils\n  it 'should return domains with zero level unchanged', ->\n    getBaseDomain('someinternaldomain').should.equal('someinternaldomain')\n  it 'should return domains with one level unchanged', ->\n    getBaseDomain('example.com').should.equal('example.com')\n    getBaseDomain('e.test').should.equal('e.test')\n    getBaseDomain('a.b').should.equal('a.b')\n  it 'should treat two-segment TLD as one component', ->\n    getBaseDomain('images.google.co.uk').should.equal('google.co.uk')\n    getBaseDomain('images.google.co.jp').should.equal('google.co.jp')\n    getBaseDomain('example.com.cn').should.equal('example.com.cn')\n  it 'should not mistake short domains with two-segment TLDs', ->\n    getBaseDomain('a.bc.com').should.equal('bc.com')\n    getBaseDomain('i.t.co').should.equal('t.co')\n  it 'should not try to modify IP address literals', ->\n    getBaseDomain('127.0.0.1').should.equal('127.0.0.1')\n    getBaseDomain('[::1]').should.equal('[::1]')\n    getBaseDomain('::f').should.equal('::f')\n"
  },
  {
    "path": "omega-pac/uglifyjs-shim.js",
    "content": "require('uglify-js-real');\nmodule.exports = UglifyJS;\n"
  },
  {
    "path": "omega-pac/uglifyjs.js",
    "content": "(function(exports, global) {\n    global[\"UglifyJS\"] = exports;\n    \"use strict\";\n    function array_to_hash(a) {\n        var ret = Object.create(null);\n        for (var i = 0; i < a.length; ++i) ret[a[i]] = true;\n        return ret;\n    }\n    function slice(a, start) {\n        return Array.prototype.slice.call(a, start || 0);\n    }\n    function characters(str) {\n        return str.split(\"\");\n    }\n    function member(name, array) {\n        for (var i = array.length; --i >= 0; ) if (array[i] == name) return true;\n        return false;\n    }\n    function find_if(func, array) {\n        for (var i = 0, n = array.length; i < n; ++i) {\n            if (func(array[i])) return array[i];\n        }\n    }\n    function repeat_string(str, i) {\n        if (i <= 0) return \"\";\n        if (i == 1) return str;\n        var d = repeat_string(str, i >> 1);\n        d += d;\n        if (i & 1) d += str;\n        return d;\n    }\n    function DefaultsError(msg, defs) {\n        Error.call(this, msg);\n        this.msg = msg;\n        this.defs = defs;\n    }\n    DefaultsError.prototype = Object.create(Error.prototype);\n    DefaultsError.prototype.constructor = DefaultsError;\n    DefaultsError.croak = function(msg, defs) {\n        throw new DefaultsError(msg, defs);\n    };\n    function defaults(args, defs, croak) {\n        if (args === true) args = {};\n        var ret = args || {};\n        if (croak) for (var i in ret) if (ret.hasOwnProperty(i) && !defs.hasOwnProperty(i)) DefaultsError.croak(\"`\" + i + \"` is not a supported option\", defs);\n        for (var i in defs) if (defs.hasOwnProperty(i)) {\n            ret[i] = args && args.hasOwnProperty(i) ? args[i] : defs[i];\n        }\n        return ret;\n    }\n    function merge(obj, ext) {\n        for (var i in ext) if (ext.hasOwnProperty(i)) {\n            obj[i] = ext[i];\n        }\n        return obj;\n    }\n    function noop() {}\n    var MAP = function() {\n        function MAP(a, f, backwards) {\n            var ret = [], top = [], i;\n            function doit() {\n                var val = f(a[i], i);\n                var is_last = val instanceof Last;\n                if (is_last) val = val.v;\n                if (val instanceof AtTop) {\n                    val = val.v;\n                    if (val instanceof Splice) {\n                        top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);\n                    } else {\n                        top.push(val);\n                    }\n                } else if (val !== skip) {\n                    if (val instanceof Splice) {\n                        ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);\n                    } else {\n                        ret.push(val);\n                    }\n                }\n                return is_last;\n            }\n            if (a instanceof Array) {\n                if (backwards) {\n                    for (i = a.length; --i >= 0; ) if (doit()) break;\n                    ret.reverse();\n                    top.reverse();\n                } else {\n                    for (i = 0; i < a.length; ++i) if (doit()) break;\n                }\n            } else {\n                for (i in a) if (a.hasOwnProperty(i)) if (doit()) break;\n            }\n            return top.concat(ret);\n        }\n        MAP.at_top = function(val) {\n            return new AtTop(val);\n        };\n        MAP.splice = function(val) {\n            return new Splice(val);\n        };\n        MAP.last = function(val) {\n            return new Last(val);\n        };\n        var skip = MAP.skip = {};\n        function AtTop(val) {\n            this.v = val;\n        }\n        function Splice(val) {\n            this.v = val;\n        }\n        function Last(val) {\n            this.v = val;\n        }\n        return MAP;\n    }();\n    function push_uniq(array, el) {\n        if (array.indexOf(el) < 0) array.push(el);\n    }\n    function string_template(text, props) {\n        return text.replace(/\\{(.+?)\\}/g, function(str, p) {\n            return props[p];\n        });\n    }\n    function remove(array, el) {\n        for (var i = array.length; --i >= 0; ) {\n            if (array[i] === el) array.splice(i, 1);\n        }\n    }\n    function mergeSort(array, cmp) {\n        if (array.length < 2) return array.slice();\n        function merge(a, b) {\n            var r = [], ai = 0, bi = 0, i = 0;\n            while (ai < a.length && bi < b.length) {\n                cmp(a[ai], b[bi]) <= 0 ? r[i++] = a[ai++] : r[i++] = b[bi++];\n            }\n            if (ai < a.length) r.push.apply(r, a.slice(ai));\n            if (bi < b.length) r.push.apply(r, b.slice(bi));\n            return r;\n        }\n        function _ms(a) {\n            if (a.length <= 1) return a;\n            var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m);\n            left = _ms(left);\n            right = _ms(right);\n            return merge(left, right);\n        }\n        return _ms(array);\n    }\n    function set_difference(a, b) {\n        return a.filter(function(el) {\n            return b.indexOf(el) < 0;\n        });\n    }\n    function set_intersection(a, b) {\n        return a.filter(function(el) {\n            return b.indexOf(el) >= 0;\n        });\n    }\n    function makePredicate(words) {\n        if (!(words instanceof Array)) words = words.split(\" \");\n        if (typeof UglifyJS_NoUnsafeEval !== \"undefined\") {\n            return function(str) {\n                return words.indexOf(str) >= 0;\n            };\n        }\n        var f = \"\", cats = [];\n        out: for (var i = 0; i < words.length; ++i) {\n            for (var j = 0; j < cats.length; ++j) if (cats[j][0].length == words[i].length) {\n                cats[j].push(words[i]);\n                continue out;\n            }\n            cats.push([ words[i] ]);\n        }\n        function compareTo(arr) {\n            if (arr.length == 1) return f += \"return str === \" + JSON.stringify(arr[0]) + \";\";\n            f += \"switch(str){\";\n            for (var i = 0; i < arr.length; ++i) f += \"case \" + JSON.stringify(arr[i]) + \":\";\n            f += \"return true}return false;\";\n        }\n        if (cats.length > 3) {\n            cats.sort(function(a, b) {\n                return b.length - a.length;\n            });\n            f += \"switch(str.length){\";\n            for (var i = 0; i < cats.length; ++i) {\n                var cat = cats[i];\n                f += \"case \" + cat[0].length + \":\";\n                compareTo(cat);\n            }\n            f += \"}\";\n        } else {\n            compareTo(words);\n        }\n        return new Function(\"str\", f);\n    }\n    function all(array, predicate) {\n        for (var i = array.length; --i >= 0; ) if (!predicate(array[i])) return false;\n        return true;\n    }\n    function Dictionary() {\n        this._values = Object.create(null);\n        this._size = 0;\n    }\n    Dictionary.prototype = {\n        set: function(key, val) {\n            if (!this.has(key)) ++this._size;\n            this._values[\"$\" + key] = val;\n            return this;\n        },\n        add: function(key, val) {\n            if (this.has(key)) {\n                this.get(key).push(val);\n            } else {\n                this.set(key, [ val ]);\n            }\n            return this;\n        },\n        get: function(key) {\n            return this._values[\"$\" + key];\n        },\n        del: function(key) {\n            if (this.has(key)) {\n                --this._size;\n                delete this._values[\"$\" + key];\n            }\n            return this;\n        },\n        has: function(key) {\n            return \"$\" + key in this._values;\n        },\n        each: function(f) {\n            for (var i in this._values) f(this._values[i], i.substr(1));\n        },\n        size: function() {\n            return this._size;\n        },\n        map: function(f) {\n            var ret = [];\n            for (var i in this._values) ret.push(f(this._values[i], i.substr(1)));\n            return ret;\n        }\n    };\n    \"use strict\";\n    function DEFNODE(type, props, methods, base) {\n        if (arguments.length < 4) base = AST_Node;\n        if (!props) props = []; else props = props.split(/\\s+/);\n        var self_props = props;\n        if (base && base.PROPS) props = props.concat(base.PROPS);\n        var proto = base && new base();\n        var ctor;\n        if (typeof UglifyJS_NoUnsafeEval === \"undefined\") {\n            var code = \"return function AST_\" + type + \"(props){ if (props) { \";\n            for (var i = props.length; --i >= 0; ) {\n                code += \"this.\" + props[i] + \" = props.\" + props[i] + \";\";\n            }\n            if (proto && proto.initialize || methods && methods.initialize) code += \"this.initialize();\";\n            code += \"}}\";\n            ctor = new Function(code)();\n        } else {\n            ctor = function(values) {\n                if (values) {\n                    for (var i = props.length; --i >= 0; ) this[props[i]] = values[props[i]];\n                    if (proto && proto.initialize || methods && methods.initialize) this.initialize();\n                }\n            };\n        }\n        if (proto) {\n            ctor.prototype = proto;\n            ctor.BASE = base;\n        }\n        if (base) base.SUBCLASSES.push(ctor);\n        ctor.prototype.CTOR = ctor;\n        ctor.PROPS = props || null;\n        ctor.SELF_PROPS = self_props;\n        ctor.SUBCLASSES = [];\n        if (type) {\n            ctor.prototype.TYPE = ctor.TYPE = type;\n        }\n        if (methods) for (i in methods) if (methods.hasOwnProperty(i)) {\n            if (/^\\$/.test(i)) {\n                ctor[i.substr(1)] = methods[i];\n            } else {\n                ctor.prototype[i] = methods[i];\n            }\n        }\n        ctor.DEFMETHOD = function(name, method) {\n            this.prototype[name] = method;\n        };\n        return ctor;\n    }\n    var AST_Token = DEFNODE(\"Token\", \"type value line col pos endpos nlb comments_before file\", {}, null);\n    var AST_Node = DEFNODE(\"Node\", \"start end\", {\n        clone: function() {\n            return new this.CTOR(this);\n        },\n        $documentation: \"Base class of all AST nodes\",\n        $propdoc: {\n            start: \"[AST_Token] The first token of this node\",\n            end: \"[AST_Token] The last token of this node\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this);\n        },\n        walk: function(visitor) {\n            return this._walk(visitor);\n        }\n    }, null);\n    AST_Node.warn_function = null;\n    AST_Node.warn = function(txt, props) {\n        if (AST_Node.warn_function) AST_Node.warn_function(string_template(txt, props));\n    };\n    var AST_Statement = DEFNODE(\"Statement\", null, {\n        $documentation: \"Base class of all statements\"\n    });\n    var AST_Debugger = DEFNODE(\"Debugger\", null, {\n        $documentation: \"Represents a debugger statement\"\n    }, AST_Statement);\n    var AST_Directive = DEFNODE(\"Directive\", \"value scope\", {\n        $documentation: 'Represents a directive, like \"use strict\";',\n        $propdoc: {\n            value: \"[string] The value of this directive as a plain string (it's not an AST_String!)\",\n            scope: \"[AST_Scope/S] The scope that this directive affects\"\n        }\n    }, AST_Statement);\n    var AST_SimpleStatement = DEFNODE(\"SimpleStatement\", \"body\", {\n        $documentation: \"A statement consisting of an expression, i.e. a = 1 + 2\",\n        $propdoc: {\n            body: \"[AST_Node] an expression node (should not be instanceof AST_Statement)\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_Statement);\n    function walk_body(node, visitor) {\n        if (node.body instanceof AST_Statement) {\n            node.body._walk(visitor);\n        } else node.body.forEach(function(stat) {\n            stat._walk(visitor);\n        });\n    }\n    var AST_Block = DEFNODE(\"Block\", \"body\", {\n        $documentation: \"A body of statements (usually bracketed)\",\n        $propdoc: {\n            body: \"[AST_Statement*] an array of statements\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                walk_body(this, visitor);\n            });\n        }\n    }, AST_Statement);\n    var AST_BlockStatement = DEFNODE(\"BlockStatement\", null, {\n        $documentation: \"A block statement\"\n    }, AST_Block);\n    var AST_EmptyStatement = DEFNODE(\"EmptyStatement\", null, {\n        $documentation: \"The empty statement (empty block or simply a semicolon)\",\n        _walk: function(visitor) {\n            return visitor._visit(this);\n        }\n    }, AST_Statement);\n    var AST_StatementWithBody = DEFNODE(\"StatementWithBody\", \"body\", {\n        $documentation: \"Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`\",\n        $propdoc: {\n            body: \"[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_Statement);\n    var AST_LabeledStatement = DEFNODE(\"LabeledStatement\", \"label\", {\n        $documentation: \"Statement with a label\",\n        $propdoc: {\n            label: \"[AST_Label] a label definition\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.label._walk(visitor);\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_StatementWithBody);\n    var AST_IterationStatement = DEFNODE(\"IterationStatement\", null, {\n        $documentation: \"Internal class.  All loops inherit from it.\"\n    }, AST_StatementWithBody);\n    var AST_DWLoop = DEFNODE(\"DWLoop\", \"condition\", {\n        $documentation: \"Base class for do/while statements\",\n        $propdoc: {\n            condition: \"[AST_Node] the loop condition.  Should not be instanceof AST_Statement\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.condition._walk(visitor);\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_IterationStatement);\n    var AST_Do = DEFNODE(\"Do\", null, {\n        $documentation: \"A `do` statement\"\n    }, AST_DWLoop);\n    var AST_While = DEFNODE(\"While\", null, {\n        $documentation: \"A `while` statement\"\n    }, AST_DWLoop);\n    var AST_For = DEFNODE(\"For\", \"init condition step\", {\n        $documentation: \"A `for` statement\",\n        $propdoc: {\n            init: \"[AST_Node?] the `for` initialization code, or null if empty\",\n            condition: \"[AST_Node?] the `for` termination clause, or null if empty\",\n            step: \"[AST_Node?] the `for` update clause, or null if empty\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                if (this.init) this.init._walk(visitor);\n                if (this.condition) this.condition._walk(visitor);\n                if (this.step) this.step._walk(visitor);\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_IterationStatement);\n    var AST_ForIn = DEFNODE(\"ForIn\", \"init name object\", {\n        $documentation: \"A `for ... in` statement\",\n        $propdoc: {\n            init: \"[AST_Node] the `for/in` initialization code\",\n            name: \"[AST_SymbolRef?] the loop variable, only if `init` is AST_Var\",\n            object: \"[AST_Node] the object that we're looping through\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.init._walk(visitor);\n                this.object._walk(visitor);\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_IterationStatement);\n    var AST_With = DEFNODE(\"With\", \"expression\", {\n        $documentation: \"A `with` statement\",\n        $propdoc: {\n            expression: \"[AST_Node] the `with` expression\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n                this.body._walk(visitor);\n            });\n        }\n    }, AST_StatementWithBody);\n    var AST_Scope = DEFNODE(\"Scope\", \"directives variables functions uses_with uses_eval parent_scope enclosed cname\", {\n        $documentation: \"Base class for all statements introducing a lexical scope\",\n        $propdoc: {\n            directives: \"[string*/S] an array of directives declared in this scope\",\n            variables: \"[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope\",\n            functions: \"[Object/S] like `variables`, but only lists function declarations\",\n            uses_with: \"[boolean/S] tells whether this scope uses the `with` statement\",\n            uses_eval: \"[boolean/S] tells whether this scope contains a direct call to the global `eval`\",\n            parent_scope: \"[AST_Scope?/S] link to the parent scope\",\n            enclosed: \"[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes\",\n            cname: \"[integer/S] current index for mangling variables (used internally by the mangler)\"\n        }\n    }, AST_Block);\n    var AST_Toplevel = DEFNODE(\"Toplevel\", \"globals\", {\n        $documentation: \"The toplevel scope\",\n        $propdoc: {\n            globals: \"[Object/S] a map of name -> SymbolDef for all undeclared names\"\n        },\n        wrap_enclose: function(arg_parameter_pairs) {\n            var self = this;\n            var args = [];\n            var parameters = [];\n            arg_parameter_pairs.forEach(function(pair) {\n                var splitAt = pair.lastIndexOf(\":\");\n                args.push(pair.substr(0, splitAt));\n                parameters.push(pair.substr(splitAt + 1));\n            });\n            var wrapped_tl = \"(function(\" + parameters.join(\",\") + \"){ '$ORIG'; })(\" + args.join(\",\") + \")\";\n            wrapped_tl = parse(wrapped_tl);\n            wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node) {\n                if (node instanceof AST_Directive && node.value == \"$ORIG\") {\n                    return MAP.splice(self.body);\n                }\n            }));\n            return wrapped_tl;\n        },\n        wrap_commonjs: function(name, export_all) {\n            var self = this;\n            var to_export = [];\n            if (export_all) {\n                self.figure_out_scope();\n                self.walk(new TreeWalker(function(node) {\n                    if (node instanceof AST_SymbolDeclaration && node.definition().global) {\n                        if (!find_if(function(n) {\n                            return n.name == node.name;\n                        }, to_export)) to_export.push(node);\n                    }\n                }));\n            }\n            var wrapped_tl = \"(function(exports, global){ global['\" + name + \"'] = exports; '$ORIG'; '$EXPORTS'; }({}, (function(){return this}())))\";\n            wrapped_tl = parse(wrapped_tl);\n            wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node) {\n                if (node instanceof AST_SimpleStatement) {\n                    node = node.body;\n                    if (node instanceof AST_String) switch (node.getValue()) {\n                      case \"$ORIG\":\n                        return MAP.splice(self.body);\n\n                      case \"$EXPORTS\":\n                        var body = [];\n                        to_export.forEach(function(sym) {\n                            body.push(new AST_SimpleStatement({\n                                body: new AST_Assign({\n                                    left: new AST_Sub({\n                                        expression: new AST_SymbolRef({\n                                            name: \"exports\"\n                                        }),\n                                        property: new AST_String({\n                                            value: sym.name\n                                        })\n                                    }),\n                                    operator: \"=\",\n                                    right: new AST_SymbolRef(sym)\n                                })\n                            }));\n                        });\n                        return MAP.splice(body);\n                    }\n                }\n            }));\n            return wrapped_tl;\n        }\n    }, AST_Scope);\n    var AST_Lambda = DEFNODE(\"Lambda\", \"name argnames uses_arguments\", {\n        $documentation: \"Base class for functions\",\n        $propdoc: {\n            name: \"[AST_SymbolDeclaration?] the name of this function\",\n            argnames: \"[AST_SymbolFunarg*] array of function arguments\",\n            uses_arguments: \"[boolean/S] tells whether this function accesses the arguments array\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                if (this.name) this.name._walk(visitor);\n                this.argnames.forEach(function(arg) {\n                    arg._walk(visitor);\n                });\n                walk_body(this, visitor);\n            });\n        }\n    }, AST_Scope);\n    var AST_Accessor = DEFNODE(\"Accessor\", null, {\n        $documentation: \"A setter/getter function.  The `name` property is always null.\"\n    }, AST_Lambda);\n    var AST_Function = DEFNODE(\"Function\", null, {\n        $documentation: \"A function expression\"\n    }, AST_Lambda);\n    var AST_Defun = DEFNODE(\"Defun\", null, {\n        $documentation: \"A function definition\"\n    }, AST_Lambda);\n    var AST_Jump = DEFNODE(\"Jump\", null, {\n        $documentation: \"Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)\"\n    }, AST_Statement);\n    var AST_Exit = DEFNODE(\"Exit\", \"value\", {\n        $documentation: \"Base class for “exits” (`return` and `throw`)\",\n        $propdoc: {\n            value: \"[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, this.value && function() {\n                this.value._walk(visitor);\n            });\n        }\n    }, AST_Jump);\n    var AST_Return = DEFNODE(\"Return\", null, {\n        $documentation: \"A `return` statement\"\n    }, AST_Exit);\n    var AST_Throw = DEFNODE(\"Throw\", null, {\n        $documentation: \"A `throw` statement\"\n    }, AST_Exit);\n    var AST_LoopControl = DEFNODE(\"LoopControl\", \"label\", {\n        $documentation: \"Base class for loop control statements (`break` and `continue`)\",\n        $propdoc: {\n            label: \"[AST_LabelRef?] the label, or null if none\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, this.label && function() {\n                this.label._walk(visitor);\n            });\n        }\n    }, AST_Jump);\n    var AST_Break = DEFNODE(\"Break\", null, {\n        $documentation: \"A `break` statement\"\n    }, AST_LoopControl);\n    var AST_Continue = DEFNODE(\"Continue\", null, {\n        $documentation: \"A `continue` statement\"\n    }, AST_LoopControl);\n    var AST_If = DEFNODE(\"If\", \"condition alternative\", {\n        $documentation: \"A `if` statement\",\n        $propdoc: {\n            condition: \"[AST_Node] the `if` condition\",\n            alternative: \"[AST_Statement?] the `else` part, or null if not present\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.condition._walk(visitor);\n                this.body._walk(visitor);\n                if (this.alternative) this.alternative._walk(visitor);\n            });\n        }\n    }, AST_StatementWithBody);\n    var AST_Switch = DEFNODE(\"Switch\", \"expression\", {\n        $documentation: \"A `switch` statement\",\n        $propdoc: {\n            expression: \"[AST_Node] the `switch` “discriminant”\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n                walk_body(this, visitor);\n            });\n        }\n    }, AST_Block);\n    var AST_SwitchBranch = DEFNODE(\"SwitchBranch\", null, {\n        $documentation: \"Base class for `switch` branches\"\n    }, AST_Block);\n    var AST_Default = DEFNODE(\"Default\", null, {\n        $documentation: \"A `default` switch branch\"\n    }, AST_SwitchBranch);\n    var AST_Case = DEFNODE(\"Case\", \"expression\", {\n        $documentation: \"A `case` switch branch\",\n        $propdoc: {\n            expression: \"[AST_Node] the `case` expression\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n                walk_body(this, visitor);\n            });\n        }\n    }, AST_SwitchBranch);\n    var AST_Try = DEFNODE(\"Try\", \"bcatch bfinally\", {\n        $documentation: \"A `try` statement\",\n        $propdoc: {\n            bcatch: \"[AST_Catch?] the catch block, or null if not present\",\n            bfinally: \"[AST_Finally?] the finally block, or null if not present\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                walk_body(this, visitor);\n                if (this.bcatch) this.bcatch._walk(visitor);\n                if (this.bfinally) this.bfinally._walk(visitor);\n            });\n        }\n    }, AST_Block);\n    var AST_Catch = DEFNODE(\"Catch\", \"argname\", {\n        $documentation: \"A `catch` node; only makes sense as part of a `try` statement\",\n        $propdoc: {\n            argname: \"[AST_SymbolCatch] symbol for the exception\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.argname._walk(visitor);\n                walk_body(this, visitor);\n            });\n        }\n    }, AST_Block);\n    var AST_Finally = DEFNODE(\"Finally\", null, {\n        $documentation: \"A `finally` node; only makes sense as part of a `try` statement\"\n    }, AST_Block);\n    var AST_Definitions = DEFNODE(\"Definitions\", \"definitions\", {\n        $documentation: \"Base class for `var` or `const` nodes (variable declarations/initializations)\",\n        $propdoc: {\n            definitions: \"[AST_VarDef*] array of variable definitions\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.definitions.forEach(function(def) {\n                    def._walk(visitor);\n                });\n            });\n        }\n    }, AST_Statement);\n    var AST_Var = DEFNODE(\"Var\", null, {\n        $documentation: \"A `var` statement\"\n    }, AST_Definitions);\n    var AST_Const = DEFNODE(\"Const\", null, {\n        $documentation: \"A `const` statement\"\n    }, AST_Definitions);\n    var AST_VarDef = DEFNODE(\"VarDef\", \"name value\", {\n        $documentation: \"A variable declaration; only appears in a AST_Definitions node\",\n        $propdoc: {\n            name: \"[AST_SymbolVar|AST_SymbolConst] name of the variable\",\n            value: \"[AST_Node?] initializer, or null of there's no initializer\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.name._walk(visitor);\n                if (this.value) this.value._walk(visitor);\n            });\n        }\n    });\n    var AST_Call = DEFNODE(\"Call\", \"expression args\", {\n        $documentation: \"A function call expression\",\n        $propdoc: {\n            expression: \"[AST_Node] expression to invoke as function\",\n            args: \"[AST_Node*] array of arguments\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n                this.args.forEach(function(arg) {\n                    arg._walk(visitor);\n                });\n            });\n        }\n    });\n    var AST_New = DEFNODE(\"New\", null, {\n        $documentation: \"An object instantiation.  Derives from a function call since it has exactly the same properties\"\n    }, AST_Call);\n    var AST_Seq = DEFNODE(\"Seq\", \"car cdr\", {\n        $documentation: \"A sequence expression (two comma-separated expressions)\",\n        $propdoc: {\n            car: \"[AST_Node] first element in sequence\",\n            cdr: \"[AST_Node] second element in sequence\"\n        },\n        $cons: function(x, y) {\n            var seq = new AST_Seq(x);\n            seq.car = x;\n            seq.cdr = y;\n            return seq;\n        },\n        $from_array: function(array) {\n            if (array.length == 0) return null;\n            if (array.length == 1) return array[0].clone();\n            var list = null;\n            for (var i = array.length; --i >= 0; ) {\n                list = AST_Seq.cons(array[i], list);\n            }\n            var p = list;\n            while (p) {\n                if (p.cdr && !p.cdr.cdr) {\n                    p.cdr = p.cdr.car;\n                    break;\n                }\n                p = p.cdr;\n            }\n            return list;\n        },\n        to_array: function() {\n            var p = this, a = [];\n            while (p) {\n                a.push(p.car);\n                if (p.cdr && !(p.cdr instanceof AST_Seq)) {\n                    a.push(p.cdr);\n                    break;\n                }\n                p = p.cdr;\n            }\n            return a;\n        },\n        add: function(node) {\n            var p = this;\n            while (p) {\n                if (!(p.cdr instanceof AST_Seq)) {\n                    var cell = AST_Seq.cons(p.cdr, node);\n                    return p.cdr = cell;\n                }\n                p = p.cdr;\n            }\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.car._walk(visitor);\n                if (this.cdr) this.cdr._walk(visitor);\n            });\n        }\n    });\n    var AST_PropAccess = DEFNODE(\"PropAccess\", \"expression property\", {\n        $documentation: 'Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`',\n        $propdoc: {\n            expression: \"[AST_Node] the “container” expression\",\n            property: \"[AST_Node|string] the property to access.  For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node\"\n        }\n    });\n    var AST_Dot = DEFNODE(\"Dot\", null, {\n        $documentation: \"A dotted property access expression\",\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n            });\n        }\n    }, AST_PropAccess);\n    var AST_Sub = DEFNODE(\"Sub\", null, {\n        $documentation: 'Index-style property access, i.e. `a[\"foo\"]`',\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n                this.property._walk(visitor);\n            });\n        }\n    }, AST_PropAccess);\n    var AST_Unary = DEFNODE(\"Unary\", \"operator expression\", {\n        $documentation: \"Base class for unary expressions\",\n        $propdoc: {\n            operator: \"[string] the operator\",\n            expression: \"[AST_Node] expression that this unary operator applies to\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.expression._walk(visitor);\n            });\n        }\n    });\n    var AST_UnaryPrefix = DEFNODE(\"UnaryPrefix\", null, {\n        $documentation: \"Unary prefix expression, i.e. `typeof i` or `++i`\"\n    }, AST_Unary);\n    var AST_UnaryPostfix = DEFNODE(\"UnaryPostfix\", null, {\n        $documentation: \"Unary postfix expression, i.e. `i++`\"\n    }, AST_Unary);\n    var AST_Binary = DEFNODE(\"Binary\", \"left operator right\", {\n        $documentation: \"Binary expression, i.e. `a + b`\",\n        $propdoc: {\n            left: \"[AST_Node] left-hand side expression\",\n            operator: \"[string] the operator\",\n            right: \"[AST_Node] right-hand side expression\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.left._walk(visitor);\n                this.right._walk(visitor);\n            });\n        }\n    });\n    var AST_Conditional = DEFNODE(\"Conditional\", \"condition consequent alternative\", {\n        $documentation: \"Conditional expression using the ternary operator, i.e. `a ? b : c`\",\n        $propdoc: {\n            condition: \"[AST_Node]\",\n            consequent: \"[AST_Node]\",\n            alternative: \"[AST_Node]\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.condition._walk(visitor);\n                this.consequent._walk(visitor);\n                this.alternative._walk(visitor);\n            });\n        }\n    });\n    var AST_Assign = DEFNODE(\"Assign\", null, {\n        $documentation: \"An assignment expression — `a = b + 5`\"\n    }, AST_Binary);\n    var AST_Array = DEFNODE(\"Array\", \"elements\", {\n        $documentation: \"An array literal\",\n        $propdoc: {\n            elements: \"[AST_Node*] array of elements\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.elements.forEach(function(el) {\n                    el._walk(visitor);\n                });\n            });\n        }\n    });\n    var AST_Object = DEFNODE(\"Object\", \"properties\", {\n        $documentation: \"An object literal\",\n        $propdoc: {\n            properties: \"[AST_ObjectProperty*] array of properties\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.properties.forEach(function(prop) {\n                    prop._walk(visitor);\n                });\n            });\n        }\n    });\n    var AST_ObjectProperty = DEFNODE(\"ObjectProperty\", \"key value\", {\n        $documentation: \"Base class for literal object properties\",\n        $propdoc: {\n            key: \"[string] the property name converted to a string for ObjectKeyVal.  For setters and getters this is an arbitrary AST_Node.\",\n            value: \"[AST_Node] property value.  For setters and getters this is an AST_Function.\"\n        },\n        _walk: function(visitor) {\n            return visitor._visit(this, function() {\n                this.value._walk(visitor);\n            });\n        }\n    });\n    var AST_ObjectKeyVal = DEFNODE(\"ObjectKeyVal\", null, {\n        $documentation: \"A key: value object property\"\n    }, AST_ObjectProperty);\n    var AST_ObjectSetter = DEFNODE(\"ObjectSetter\", null, {\n        $documentation: \"An object setter property\"\n    }, AST_ObjectProperty);\n    var AST_ObjectGetter = DEFNODE(\"ObjectGetter\", null, {\n        $documentation: \"An object getter property\"\n    }, AST_ObjectProperty);\n    var AST_Symbol = DEFNODE(\"Symbol\", \"scope name thedef\", {\n        $propdoc: {\n            name: \"[string] name of this symbol\",\n            scope: \"[AST_Scope/S] the current scope (not necessarily the definition scope)\",\n            thedef: \"[SymbolDef/S] the definition of this symbol\"\n        },\n        $documentation: \"Base class for all symbols\"\n    });\n    var AST_SymbolAccessor = DEFNODE(\"SymbolAccessor\", null, {\n        $documentation: \"The name of a property accessor (setter/getter function)\"\n    }, AST_Symbol);\n    var AST_SymbolDeclaration = DEFNODE(\"SymbolDeclaration\", \"init\", {\n        $documentation: \"A declaration symbol (symbol in var/const, function name or argument, symbol in catch)\",\n        $propdoc: {\n            init: \"[AST_Node*/S] array of initializers for this declaration.\"\n        }\n    }, AST_Symbol);\n    var AST_SymbolVar = DEFNODE(\"SymbolVar\", null, {\n        $documentation: \"Symbol defining a variable\"\n    }, AST_SymbolDeclaration);\n    var AST_SymbolConst = DEFNODE(\"SymbolConst\", null, {\n        $documentation: \"A constant declaration\"\n    }, AST_SymbolDeclaration);\n    var AST_SymbolFunarg = DEFNODE(\"SymbolFunarg\", null, {\n        $documentation: \"Symbol naming a function argument\"\n    }, AST_SymbolVar);\n    var AST_SymbolDefun = DEFNODE(\"SymbolDefun\", null, {\n        $documentation: \"Symbol defining a function\"\n    }, AST_SymbolDeclaration);\n    var AST_SymbolLambda = DEFNODE(\"SymbolLambda\", null, {\n        $documentation: \"Symbol naming a function expression\"\n    }, AST_SymbolDeclaration);\n    var AST_SymbolCatch = DEFNODE(\"SymbolCatch\", null, {\n        $documentation: \"Symbol naming the exception in catch\"\n    }, AST_SymbolDeclaration);\n    var AST_Label = DEFNODE(\"Label\", \"references\", {\n        $documentation: \"Symbol naming a label (declaration)\",\n        $propdoc: {\n            references: \"[AST_LoopControl*] a list of nodes referring to this label\"\n        },\n        initialize: function() {\n            this.references = [];\n            this.thedef = this;\n        }\n    }, AST_Symbol);\n    var AST_SymbolRef = DEFNODE(\"SymbolRef\", null, {\n        $documentation: \"Reference to some symbol (not definition/declaration)\"\n    }, AST_Symbol);\n    var AST_LabelRef = DEFNODE(\"LabelRef\", null, {\n        $documentation: \"Reference to a label symbol\"\n    }, AST_Symbol);\n    var AST_This = DEFNODE(\"This\", null, {\n        $documentation: \"The `this` symbol\"\n    }, AST_Symbol);\n    var AST_Constant = DEFNODE(\"Constant\", null, {\n        $documentation: \"Base class for all constants\",\n        getValue: function() {\n            return this.value;\n        }\n    });\n    var AST_String = DEFNODE(\"String\", \"value\", {\n        $documentation: \"A string literal\",\n        $propdoc: {\n            value: \"[string] the contents of this string\"\n        }\n    }, AST_Constant);\n    var AST_Number = DEFNODE(\"Number\", \"value\", {\n        $documentation: \"A number literal\",\n        $propdoc: {\n            value: \"[number] the numeric value\"\n        }\n    }, AST_Constant);\n    var AST_RegExp = DEFNODE(\"RegExp\", \"value\", {\n        $documentation: \"A regexp literal\",\n        $propdoc: {\n            value: \"[RegExp] the actual regexp\"\n        }\n    }, AST_Constant);\n    var AST_Atom = DEFNODE(\"Atom\", null, {\n        $documentation: \"Base class for atoms\"\n    }, AST_Constant);\n    var AST_Null = DEFNODE(\"Null\", null, {\n        $documentation: \"The `null` atom\",\n        value: null\n    }, AST_Atom);\n    var AST_NaN = DEFNODE(\"NaN\", null, {\n        $documentation: \"The impossible value\",\n        value: 0 / 0\n    }, AST_Atom);\n    var AST_Undefined = DEFNODE(\"Undefined\", null, {\n        $documentation: \"The `undefined` value\",\n        value: function() {}()\n    }, AST_Atom);\n    var AST_Hole = DEFNODE(\"Hole\", null, {\n        $documentation: \"A hole in an array\",\n        value: function() {}()\n    }, AST_Atom);\n    var AST_Infinity = DEFNODE(\"Infinity\", null, {\n        $documentation: \"The `Infinity` value\",\n        value: 1 / 0\n    }, AST_Atom);\n    var AST_Boolean = DEFNODE(\"Boolean\", null, {\n        $documentation: \"Base class for booleans\"\n    }, AST_Atom);\n    var AST_False = DEFNODE(\"False\", null, {\n        $documentation: \"The `false` atom\",\n        value: false\n    }, AST_Boolean);\n    var AST_True = DEFNODE(\"True\", null, {\n        $documentation: \"The `true` atom\",\n        value: true\n    }, AST_Boolean);\n    function TreeWalker(callback) {\n        this.visit = callback;\n        this.stack = [];\n    }\n    TreeWalker.prototype = {\n        _visit: function(node, descend) {\n            this.stack.push(node);\n            var ret = this.visit(node, descend ? function() {\n                descend.call(node);\n            } : noop);\n            if (!ret && descend) {\n                descend.call(node);\n            }\n            this.stack.pop();\n            return ret;\n        },\n        parent: function(n) {\n            return this.stack[this.stack.length - 2 - (n || 0)];\n        },\n        push: function(node) {\n            this.stack.push(node);\n        },\n        pop: function() {\n            return this.stack.pop();\n        },\n        self: function() {\n            return this.stack[this.stack.length - 1];\n        },\n        find_parent: function(type) {\n            var stack = this.stack;\n            for (var i = stack.length; --i >= 0; ) {\n                var x = stack[i];\n                if (x instanceof type) return x;\n            }\n        },\n        has_directive: function(type) {\n            return this.find_parent(AST_Scope).has_directive(type);\n        },\n        in_boolean_context: function() {\n            var stack = this.stack;\n            var i = stack.length, self = stack[--i];\n            while (i > 0) {\n                var p = stack[--i];\n                if (p instanceof AST_If && p.condition === self || p instanceof AST_Conditional && p.condition === self || p instanceof AST_DWLoop && p.condition === self || p instanceof AST_For && p.condition === self || p instanceof AST_UnaryPrefix && p.operator == \"!\" && p.expression === self) {\n                    return true;\n                }\n                if (!(p instanceof AST_Binary && (p.operator == \"&&\" || p.operator == \"||\"))) return false;\n                self = p;\n            }\n        },\n        loopcontrol_target: function(label) {\n            var stack = this.stack;\n            if (label) for (var i = stack.length; --i >= 0; ) {\n                var x = stack[i];\n                if (x instanceof AST_LabeledStatement && x.label.name == label.name) {\n                    return x.body;\n                }\n            } else for (var i = stack.length; --i >= 0; ) {\n                var x = stack[i];\n                if (x instanceof AST_Switch || x instanceof AST_IterationStatement) return x;\n            }\n        }\n    };\n    \"use strict\";\n    var KEYWORDS = \"break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with\";\n    var KEYWORDS_ATOM = \"false null true\";\n    var RESERVED_WORDS = \"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized this throws transient volatile yield\" + \" \" + KEYWORDS_ATOM + \" \" + KEYWORDS;\n    var KEYWORDS_BEFORE_EXPRESSION = \"return new delete throw else case\";\n    KEYWORDS = makePredicate(KEYWORDS);\n    RESERVED_WORDS = makePredicate(RESERVED_WORDS);\n    KEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION);\n    KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM);\n    var OPERATOR_CHARS = makePredicate(characters(\"+-*&%=<>!?|~^\"));\n    var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;\n    var RE_OCT_NUMBER = /^0[0-7]+$/;\n    var RE_DEC_NUMBER = /^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i;\n    var OPERATORS = makePredicate([ \"in\", \"instanceof\", \"typeof\", \"new\", \"void\", \"delete\", \"++\", \"--\", \"+\", \"-\", \"!\", \"~\", \"&\", \"|\", \"^\", \"*\", \"/\", \"%\", \">>\", \"<<\", \">>>\", \"<\", \">\", \"<=\", \">=\", \"==\", \"===\", \"!=\", \"!==\", \"?\", \"=\", \"+=\", \"-=\", \"/=\", \"*=\", \"%=\", \">>=\", \"<<=\", \">>>=\", \"|=\", \"^=\", \"&=\", \"&&\", \"||\" ]);\n    var WHITESPACE_CHARS = makePredicate(characters(\"  \\n\\r\t\\f\u000b​᠎             　\"));\n    var PUNC_BEFORE_EXPRESSION = makePredicate(characters(\"[{(,.;:\"));\n    var PUNC_CHARS = makePredicate(characters(\"[]{}(),;:\"));\n    var REGEXP_MODIFIERS = makePredicate(characters(\"gmsiy\"));\n    var UNICODE = {\n        letter: new RegExp(\"[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0523\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0621-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971\\\\u0972\\\\u097B-\\\\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\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D28\\\\u0D2A-\\\\u0D39\\\\u0D3D\\\\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\\\\u0EDD\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8B\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10D0-\\\\u10FA\\\\u10FC\\\\u1100-\\\\u1159\\\\u115F-\\\\u11A2\\\\u11A8-\\\\u11F9\\\\u1200-\\\\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-\\\\u1676\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19A9\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\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-\\\\u2094\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2C6F\\\\u2C71-\\\\u2C7D\\\\u2C80-\\\\u2CE4\\\\u2D00-\\\\u2D25\\\\u2D30-\\\\u2D65\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31B7\\\\u31F0-\\\\u31FF\\\\u3400\\\\u4DB5\\\\u4E00\\\\u9FC3\\\\uA000-\\\\uA48C\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA65F\\\\uA662-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B\\\\uA78C\\\\uA7FB-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAC00\\\\uD7A3\\\\uF900-\\\\uFA2D\\\\uFA30-\\\\uFA6A\\\\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]\"),\n        non_spacing_mark: new RegExp(\"[\\\\u0300-\\\\u036F\\\\u0483-\\\\u0487\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u0610-\\\\u061A\\\\u064B-\\\\u065E\\\\u0670\\\\u06D6-\\\\u06DC\\\\u06DF-\\\\u06E4\\\\u06E7\\\\u06E8\\\\u06EA-\\\\u06ED\\\\u0711\\\\u0730-\\\\u074A\\\\u07A6-\\\\u07B0\\\\u07EB-\\\\u07F3\\\\u0816-\\\\u0819\\\\u081B-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082D\\\\u0900-\\\\u0902\\\\u093C\\\\u0941-\\\\u0948\\\\u094D\\\\u0951-\\\\u0955\\\\u0962\\\\u0963\\\\u0981\\\\u09BC\\\\u09C1-\\\\u09C4\\\\u09CD\\\\u09E2\\\\u09E3\\\\u0A01\\\\u0A02\\\\u0A3C\\\\u0A41\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A70\\\\u0A71\\\\u0A75\\\\u0A81\\\\u0A82\\\\u0ABC\\\\u0AC1-\\\\u0AC5\\\\u0AC7\\\\u0AC8\\\\u0ACD\\\\u0AE2\\\\u0AE3\\\\u0B01\\\\u0B3C\\\\u0B3F\\\\u0B41-\\\\u0B44\\\\u0B4D\\\\u0B56\\\\u0B62\\\\u0B63\\\\u0B82\\\\u0BC0\\\\u0BCD\\\\u0C3E-\\\\u0C40\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C62\\\\u0C63\\\\u0CBC\\\\u0CBF\\\\u0CC6\\\\u0CCC\\\\u0CCD\\\\u0CE2\\\\u0CE3\\\\u0D41-\\\\u0D44\\\\u0D4D\\\\u0D62\\\\u0D63\\\\u0DCA\\\\u0DD2-\\\\u0DD4\\\\u0DD6\\\\u0E31\\\\u0E34-\\\\u0E3A\\\\u0E47-\\\\u0E4E\\\\u0EB1\\\\u0EB4-\\\\u0EB9\\\\u0EBB\\\\u0EBC\\\\u0EC8-\\\\u0ECD\\\\u0F18\\\\u0F19\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F71-\\\\u0F7E\\\\u0F80-\\\\u0F84\\\\u0F86\\\\u0F87\\\\u0F90-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u102D-\\\\u1030\\\\u1032-\\\\u1037\\\\u1039\\\\u103A\\\\u103D\\\\u103E\\\\u1058\\\\u1059\\\\u105E-\\\\u1060\\\\u1071-\\\\u1074\\\\u1082\\\\u1085\\\\u1086\\\\u108D\\\\u109D\\\\u135F\\\\u1712-\\\\u1714\\\\u1732-\\\\u1734\\\\u1752\\\\u1753\\\\u1772\\\\u1773\\\\u17B7-\\\\u17BD\\\\u17C6\\\\u17C9-\\\\u17D3\\\\u17DD\\\\u180B-\\\\u180D\\\\u18A9\\\\u1920-\\\\u1922\\\\u1927\\\\u1928\\\\u1932\\\\u1939-\\\\u193B\\\\u1A17\\\\u1A18\\\\u1A56\\\\u1A58-\\\\u1A5E\\\\u1A60\\\\u1A62\\\\u1A65-\\\\u1A6C\\\\u1A73-\\\\u1A7C\\\\u1A7F\\\\u1B00-\\\\u1B03\\\\u1B34\\\\u1B36-\\\\u1B3A\\\\u1B3C\\\\u1B42\\\\u1B6B-\\\\u1B73\\\\u1B80\\\\u1B81\\\\u1BA2-\\\\u1BA5\\\\u1BA8\\\\u1BA9\\\\u1C2C-\\\\u1C33\\\\u1C36\\\\u1C37\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CE0\\\\u1CE2-\\\\u1CE8\\\\u1CED\\\\u1DC0-\\\\u1DE6\\\\u1DFD-\\\\u1DFF\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2CEF-\\\\u2CF1\\\\u2DE0-\\\\u2DFF\\\\u302A-\\\\u302F\\\\u3099\\\\u309A\\\\uA66F\\\\uA67C\\\\uA67D\\\\uA6F0\\\\uA6F1\\\\uA802\\\\uA806\\\\uA80B\\\\uA825\\\\uA826\\\\uA8C4\\\\uA8E0-\\\\uA8F1\\\\uA926-\\\\uA92D\\\\uA947-\\\\uA951\\\\uA980-\\\\uA982\\\\uA9B3\\\\uA9B6-\\\\uA9B9\\\\uA9BC\\\\uAA29-\\\\uAA2E\\\\uAA31\\\\uAA32\\\\uAA35\\\\uAA36\\\\uAA43\\\\uAA4C\\\\uAAB0\\\\uAAB2-\\\\uAAB4\\\\uAAB7\\\\uAAB8\\\\uAABE\\\\uAABF\\\\uAAC1\\\\uABE5\\\\uABE8\\\\uABED\\\\uFB1E\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE26]\"),\n        space_combining_mark: new RegExp(\"[\\\\u0903\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E\\\\u0982\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7\\\\u09C8\\\\u09CB\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB\\\\u0ACC\\\\u0B02\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47\\\\u0B48\\\\u0B4B\\\\u0B4C\\\\u0B57\\\\u0BBE\\\\u0BBF\\\\u0BC1\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7\\\\u0CC8\\\\u0CCA\\\\u0CCB\\\\u0CD5\\\\u0CD6\\\\u0D02\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2\\\\u0DF3\\\\u0F3E\\\\u0F3F\\\\u0F7F\\\\u102B\\\\u102C\\\\u1031\\\\u1038\\\\u103B\\\\u103C\\\\u1056\\\\u1057\\\\u1062-\\\\u1064\\\\u1067-\\\\u106D\\\\u1083\\\\u1084\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930\\\\u1931\\\\u1933-\\\\u1938\\\\u19B0-\\\\u19C0\\\\u19C8\\\\u19C9\\\\u1A19-\\\\u1A1B\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B44\\\\u1B82\\\\u1BA1\\\\u1BA6\\\\u1BA7\\\\u1BAA\\\\u1C24-\\\\u1C2B\\\\u1C34\\\\u1C35\\\\u1CE1\\\\u1CF2\\\\uA823\\\\uA824\\\\uA827\\\\uA880\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA953\\\\uA983\\\\uA9B4\\\\uA9B5\\\\uA9BA\\\\uA9BB\\\\uA9BD-\\\\uA9C0\\\\uAA2F\\\\uAA30\\\\uAA33\\\\uAA34\\\\uAA4D\\\\uAA7B\\\\uABE3\\\\uABE4\\\\uABE6\\\\uABE7\\\\uABE9\\\\uABEA\\\\uABEC]\"),\n        connector_punctuation: new RegExp(\"[\\\\u005F\\\\u203F\\\\u2040\\\\u2054\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFF3F]\")\n    };\n    function is_letter(code) {\n        return code >= 97 && code <= 122 || code >= 65 && code <= 90 || code >= 170 && UNICODE.letter.test(String.fromCharCode(code));\n    }\n    function is_digit(code) {\n        return code >= 48 && code <= 57;\n    }\n    function is_alphanumeric_char(code) {\n        return is_digit(code) || is_letter(code);\n    }\n    function is_unicode_combining_mark(ch) {\n        return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);\n    }\n    function is_unicode_connector_punctuation(ch) {\n        return UNICODE.connector_punctuation.test(ch);\n    }\n    function is_identifier(name) {\n        return !RESERVED_WORDS(name) && /^[a-z_$][a-z0-9_$]*$/i.test(name);\n    }\n    function is_identifier_start(code) {\n        return code == 36 || code == 95 || is_letter(code);\n    }\n    function is_identifier_char(ch) {\n        var code = ch.charCodeAt(0);\n        return is_identifier_start(code) || is_digit(code) || code == 8204 || code == 8205 || is_unicode_combining_mark(ch) || is_unicode_connector_punctuation(ch);\n    }\n    function is_identifier_string(str) {\n        return /^[a-z_$][a-z0-9_$]*$/i.test(str);\n    }\n    function parse_js_number(num) {\n        if (RE_HEX_NUMBER.test(num)) {\n            return parseInt(num.substr(2), 16);\n        } else if (RE_OCT_NUMBER.test(num)) {\n            return parseInt(num.substr(1), 8);\n        } else if (RE_DEC_NUMBER.test(num)) {\n            return parseFloat(num);\n        }\n    }\n    function JS_Parse_Error(message, line, col, pos) {\n        this.message = message;\n        this.line = line;\n        this.col = col;\n        this.pos = pos;\n        this.stack = new Error().stack;\n    }\n    JS_Parse_Error.prototype.toString = function() {\n        return this.message + \" (line: \" + this.line + \", col: \" + this.col + \", pos: \" + this.pos + \")\" + \"\\n\\n\" + this.stack;\n    };\n    function js_error(message, filename, line, col, pos) {\n        throw new JS_Parse_Error(message, line, col, pos);\n    }\n    function is_token(token, type, val) {\n        return token.type == type && (val == null || token.value == val);\n    }\n    var EX_EOF = {};\n    function tokenizer($TEXT, filename, html5_comments) {\n        var S = {\n            text: $TEXT.replace(/\\r\\n?|[\\n\\u2028\\u2029]/g, \"\\n\").replace(/\\uFEFF/g, \"\"),\n            filename: filename,\n            pos: 0,\n            tokpos: 0,\n            line: 1,\n            tokline: 0,\n            col: 0,\n            tokcol: 0,\n            newline_before: false,\n            regex_allowed: false,\n            comments_before: []\n        };\n        function peek() {\n            return S.text.charAt(S.pos);\n        }\n        function next(signal_eof, in_string) {\n            var ch = S.text.charAt(S.pos++);\n            if (signal_eof && !ch) throw EX_EOF;\n            if (ch == \"\\n\") {\n                S.newline_before = S.newline_before || !in_string;\n                ++S.line;\n                S.col = 0;\n            } else {\n                ++S.col;\n            }\n            return ch;\n        }\n        function forward(i) {\n            while (i-- > 0) next();\n        }\n        function looking_at(str) {\n            return S.text.substr(S.pos, str.length) == str;\n        }\n        function find(what, signal_eof) {\n            var pos = S.text.indexOf(what, S.pos);\n            if (signal_eof && pos == -1) throw EX_EOF;\n            return pos;\n        }\n        function start_token() {\n            S.tokline = S.line;\n            S.tokcol = S.col;\n            S.tokpos = S.pos;\n        }\n        var prev_was_dot = false;\n        function token(type, value, is_comment) {\n            S.regex_allowed = type == \"operator\" && !UNARY_POSTFIX(value) || type == \"keyword\" && KEYWORDS_BEFORE_EXPRESSION(value) || type == \"punc\" && PUNC_BEFORE_EXPRESSION(value);\n            prev_was_dot = type == \"punc\" && value == \".\";\n            var ret = {\n                type: type,\n                value: value,\n                line: S.tokline,\n                col: S.tokcol,\n                pos: S.tokpos,\n                endpos: S.pos,\n                nlb: S.newline_before,\n                file: filename\n            };\n            if (!is_comment) {\n                ret.comments_before = S.comments_before;\n                S.comments_before = [];\n                for (var i = 0, len = ret.comments_before.length; i < len; i++) {\n                    ret.nlb = ret.nlb || ret.comments_before[i].nlb;\n                }\n            }\n            S.newline_before = false;\n            return new AST_Token(ret);\n        }\n        function skip_whitespace() {\n            while (WHITESPACE_CHARS(peek())) next();\n        }\n        function read_while(pred) {\n            var ret = \"\", ch, i = 0;\n            while ((ch = peek()) && pred(ch, i++)) ret += next();\n            return ret;\n        }\n        function parse_error(err) {\n            js_error(err, filename, S.tokline, S.tokcol, S.tokpos);\n        }\n        function read_num(prefix) {\n            var has_e = false, after_e = false, has_x = false, has_dot = prefix == \".\";\n            var num = read_while(function(ch, i) {\n                var code = ch.charCodeAt(0);\n                switch (code) {\n                  case 120:\n                  case 88:\n                    return has_x ? false : has_x = true;\n\n                  case 101:\n                  case 69:\n                    return has_x ? true : has_e ? false : has_e = after_e = true;\n\n                  case 45:\n                    return after_e || i == 0 && !prefix;\n\n                  case 43:\n                    return after_e;\n\n                  case after_e = false, 46:\n                    return !has_dot && !has_x && !has_e ? has_dot = true : false;\n                }\n                return is_alphanumeric_char(code);\n            });\n            if (prefix) num = prefix + num;\n            var valid = parse_js_number(num);\n            if (!isNaN(valid)) {\n                return token(\"num\", valid);\n            } else {\n                parse_error(\"Invalid syntax: \" + num);\n            }\n        }\n        function read_escaped_char(in_string) {\n            var ch = next(true, in_string);\n            switch (ch.charCodeAt(0)) {\n              case 110:\n                return \"\\n\";\n\n              case 114:\n                return \"\\r\";\n\n              case 116:\n                return \"\t\";\n\n              case 98:\n                return \"\\b\";\n\n              case 118:\n                return \"\u000b\";\n\n              case 102:\n                return \"\\f\";\n\n              case 48:\n                return \"\\x00\";\n\n              case 120:\n                return String.fromCharCode(hex_bytes(2));\n\n              case 117:\n                return String.fromCharCode(hex_bytes(4));\n\n              case 10:\n                return \"\";\n\n              default:\n                return ch;\n            }\n        }\n        function hex_bytes(n) {\n            var num = 0;\n            for (;n > 0; --n) {\n                var digit = parseInt(next(true), 16);\n                if (isNaN(digit)) parse_error(\"Invalid hex-character pattern in string\");\n                num = num << 4 | digit;\n            }\n            return num;\n        }\n        var read_string = with_eof_error(\"Unterminated string constant\", function() {\n            var quote = next(), ret = \"\";\n            for (;;) {\n                var ch = next(true);\n                if (ch == \"\\\\\") {\n                    var octal_len = 0, first = null;\n                    ch = read_while(function(ch) {\n                        if (ch >= \"0\" && ch <= \"7\") {\n                            if (!first) {\n                                first = ch;\n                                return ++octal_len;\n                            } else if (first <= \"3\" && octal_len <= 2) return ++octal_len; else if (first >= \"4\" && octal_len <= 1) return ++octal_len;\n                        }\n                        return false;\n                    });\n                    if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8)); else ch = read_escaped_char(true);\n                } else if (ch == quote) break;\n                ret += ch;\n            }\n            return token(\"string\", ret);\n        });\n        function skip_line_comment(type) {\n            var regex_allowed = S.regex_allowed;\n            var i = find(\"\\n\"), ret;\n            if (i == -1) {\n                ret = S.text.substr(S.pos);\n                S.pos = S.text.length;\n            } else {\n                ret = S.text.substring(S.pos, i);\n                S.pos = i;\n            }\n            S.comments_before.push(token(type, ret, true));\n            S.regex_allowed = regex_allowed;\n            return next_token();\n        }\n        var skip_multiline_comment = with_eof_error(\"Unterminated multiline comment\", function() {\n            var regex_allowed = S.regex_allowed;\n            var i = find(\"*/\", true);\n            var text = S.text.substring(S.pos, i);\n            var a = text.split(\"\\n\"), n = a.length;\n            S.pos = i + 2;\n            S.line += n - 1;\n            if (n > 1) S.col = a[n - 1].length; else S.col += a[n - 1].length;\n            S.col += 2;\n            var nlb = S.newline_before = S.newline_before || text.indexOf(\"\\n\") >= 0;\n            S.comments_before.push(token(\"comment2\", text, true));\n            S.regex_allowed = regex_allowed;\n            S.newline_before = nlb;\n            return next_token();\n        });\n        function read_name() {\n            var backslash = false, name = \"\", ch, escaped = false, hex;\n            while ((ch = peek()) != null) {\n                if (!backslash) {\n                    if (ch == \"\\\\\") escaped = backslash = true, next(); else if (is_identifier_char(ch)) name += next(); else break;\n                } else {\n                    if (ch != \"u\") parse_error(\"Expecting UnicodeEscapeSequence -- uXXXX\");\n                    ch = read_escaped_char();\n                    if (!is_identifier_char(ch)) parse_error(\"Unicode char: \" + ch.charCodeAt(0) + \" is not valid in identifier\");\n                    name += ch;\n                    backslash = false;\n                }\n            }\n            if (KEYWORDS(name) && escaped) {\n                hex = name.charCodeAt(0).toString(16).toUpperCase();\n                name = \"\\\\u\" + \"0000\".substr(hex.length) + hex + name.slice(1);\n            }\n            return name;\n        }\n        var read_regexp = with_eof_error(\"Unterminated regular expression\", function(regexp) {\n            var prev_backslash = false, ch, in_class = false;\n            while (ch = next(true)) if (prev_backslash) {\n                regexp += \"\\\\\" + ch;\n                prev_backslash = false;\n            } else if (ch == \"[\") {\n                in_class = true;\n                regexp += ch;\n            } else if (ch == \"]\" && in_class) {\n                in_class = false;\n                regexp += ch;\n            } else if (ch == \"/\" && !in_class) {\n                break;\n            } else if (ch == \"\\\\\") {\n                prev_backslash = true;\n            } else {\n                regexp += ch;\n            }\n            var mods = read_name();\n            return token(\"regexp\", new RegExp(regexp, mods));\n        });\n        function read_operator(prefix) {\n            function grow(op) {\n                if (!peek()) return op;\n                var bigger = op + peek();\n                if (OPERATORS(bigger)) {\n                    next();\n                    return grow(bigger);\n                } else {\n                    return op;\n                }\n            }\n            return token(\"operator\", grow(prefix || next()));\n        }\n        function handle_slash() {\n            next();\n            switch (peek()) {\n              case \"/\":\n                next();\n                return skip_line_comment(\"comment1\");\n\n              case \"*\":\n                next();\n                return skip_multiline_comment();\n            }\n            return S.regex_allowed ? read_regexp(\"\") : read_operator(\"/\");\n        }\n        function handle_dot() {\n            next();\n            return is_digit(peek().charCodeAt(0)) ? read_num(\".\") : token(\"punc\", \".\");\n        }\n        function read_word() {\n            var word = read_name();\n            if (prev_was_dot) return token(\"name\", word);\n            return KEYWORDS_ATOM(word) ? token(\"atom\", word) : !KEYWORDS(word) ? token(\"name\", word) : OPERATORS(word) ? token(\"operator\", word) : token(\"keyword\", word);\n        }\n        function with_eof_error(eof_error, cont) {\n            return function(x) {\n                try {\n                    return cont(x);\n                } catch (ex) {\n                    if (ex === EX_EOF) parse_error(eof_error); else throw ex;\n                }\n            };\n        }\n        function next_token(force_regexp) {\n            if (force_regexp != null) return read_regexp(force_regexp);\n            skip_whitespace();\n            start_token();\n            if (html5_comments) {\n                if (looking_at(\"<!--\")) {\n                    forward(4);\n                    return skip_line_comment(\"comment3\");\n                }\n                if (looking_at(\"-->\") && S.newline_before) {\n                    forward(3);\n                    return skip_line_comment(\"comment4\");\n                }\n            }\n            var ch = peek();\n            if (!ch) return token(\"eof\");\n            var code = ch.charCodeAt(0);\n            switch (code) {\n              case 34:\n              case 39:\n                return read_string();\n\n              case 46:\n                return handle_dot();\n\n              case 47:\n                return handle_slash();\n            }\n            if (is_digit(code)) return read_num();\n            if (PUNC_CHARS(ch)) return token(\"punc\", next());\n            if (OPERATOR_CHARS(ch)) return read_operator();\n            if (code == 92 || is_identifier_start(code)) return read_word();\n            parse_error(\"Unexpected character '\" + ch + \"'\");\n        }\n        next_token.context = function(nc) {\n            if (nc) S = nc;\n            return S;\n        };\n        return next_token;\n    }\n    var UNARY_PREFIX = makePredicate([ \"typeof\", \"void\", \"delete\", \"--\", \"++\", \"!\", \"~\", \"-\", \"+\" ]);\n    var UNARY_POSTFIX = makePredicate([ \"--\", \"++\" ]);\n    var ASSIGNMENT = makePredicate([ \"=\", \"+=\", \"-=\", \"/=\", \"*=\", \"%=\", \">>=\", \"<<=\", \">>>=\", \"|=\", \"^=\", \"&=\" ]);\n    var PRECEDENCE = function(a, ret) {\n        for (var i = 0; i < a.length; ++i) {\n            var b = a[i];\n            for (var j = 0; j < b.length; ++j) {\n                ret[b[j]] = i + 1;\n            }\n        }\n        return ret;\n    }([ [ \"||\" ], [ \"&&\" ], [ \"|\" ], [ \"^\" ], [ \"&\" ], [ \"==\", \"===\", \"!=\", \"!==\" ], [ \"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\" ], [ \">>\", \"<<\", \">>>\" ], [ \"+\", \"-\" ], [ \"*\", \"/\", \"%\" ] ], {});\n    var STATEMENTS_WITH_LABELS = array_to_hash([ \"for\", \"do\", \"while\", \"switch\" ]);\n    var ATOMIC_START_TOKEN = array_to_hash([ \"atom\", \"num\", \"string\", \"regexp\", \"name\" ]);\n    function parse($TEXT, options) {\n        options = defaults(options, {\n            strict: false,\n            filename: null,\n            toplevel: null,\n            expression: false,\n            html5_comments: true\n        });\n        var S = {\n            input: typeof $TEXT == \"string\" ? tokenizer($TEXT, options.filename, options.html5_comments) : $TEXT,\n            token: null,\n            prev: null,\n            peeked: null,\n            in_function: 0,\n            in_directives: true,\n            in_loop: 0,\n            labels: []\n        };\n        S.token = next();\n        function is(type, value) {\n            return is_token(S.token, type, value);\n        }\n        function peek() {\n            return S.peeked || (S.peeked = S.input());\n        }\n        function next() {\n            S.prev = S.token;\n            if (S.peeked) {\n                S.token = S.peeked;\n                S.peeked = null;\n            } else {\n                S.token = S.input();\n            }\n            S.in_directives = S.in_directives && (S.token.type == \"string\" || is(\"punc\", \";\"));\n            return S.token;\n        }\n        function prev() {\n            return S.prev;\n        }\n        function croak(msg, line, col, pos) {\n            var ctx = S.input.context();\n            js_error(msg, ctx.filename, line != null ? line : ctx.tokline, col != null ? col : ctx.tokcol, pos != null ? pos : ctx.tokpos);\n        }\n        function token_error(token, msg) {\n            croak(msg, token.line, token.col);\n        }\n        function unexpected(token) {\n            if (token == null) token = S.token;\n            token_error(token, \"Unexpected token: \" + token.type + \" (\" + token.value + \")\");\n        }\n        function expect_token(type, val) {\n            if (is(type, val)) {\n                return next();\n            }\n            token_error(S.token, \"Unexpected token \" + S.token.type + \" «\" + S.token.value + \"»\" + \", expected \" + type + \" «\" + val + \"»\");\n        }\n        function expect(punc) {\n            return expect_token(\"punc\", punc);\n        }\n        function can_insert_semicolon() {\n            return !options.strict && (S.token.nlb || is(\"eof\") || is(\"punc\", \"}\"));\n        }\n        function semicolon() {\n            if (is(\"punc\", \";\")) next(); else if (!can_insert_semicolon()) unexpected();\n        }\n        function parenthesised() {\n            expect(\"(\");\n            var exp = expression(true);\n            expect(\")\");\n            return exp;\n        }\n        function embed_tokens(parser) {\n            return function() {\n                var start = S.token;\n                var expr = parser();\n                var end = prev();\n                expr.start = start;\n                expr.end = end;\n                return expr;\n            };\n        }\n        function handle_regexp() {\n            if (is(\"operator\", \"/\") || is(\"operator\", \"/=\")) {\n                S.peeked = null;\n                S.token = S.input(S.token.value.substr(1));\n            }\n        }\n        var statement = embed_tokens(function() {\n            var tmp;\n            handle_regexp();\n            switch (S.token.type) {\n              case \"string\":\n                var dir = S.in_directives, stat = simple_statement();\n                if (dir && stat.body instanceof AST_String && !is(\"punc\", \",\")) return new AST_Directive({\n                    value: stat.body.value\n                });\n                return stat;\n\n              case \"num\":\n              case \"regexp\":\n              case \"operator\":\n              case \"atom\":\n                return simple_statement();\n\n              case \"name\":\n                return is_token(peek(), \"punc\", \":\") ? labeled_statement() : simple_statement();\n\n              case \"punc\":\n                switch (S.token.value) {\n                  case \"{\":\n                    return new AST_BlockStatement({\n                        start: S.token,\n                        body: block_(),\n                        end: prev()\n                    });\n\n                  case \"[\":\n                  case \"(\":\n                    return simple_statement();\n\n                  case \";\":\n                    next();\n                    return new AST_EmptyStatement();\n\n                  default:\n                    unexpected();\n                }\n\n              case \"keyword\":\n                switch (tmp = S.token.value, next(), tmp) {\n                  case \"break\":\n                    return break_cont(AST_Break);\n\n                  case \"continue\":\n                    return break_cont(AST_Continue);\n\n                  case \"debugger\":\n                    semicolon();\n                    return new AST_Debugger();\n\n                  case \"do\":\n                    return new AST_Do({\n                        body: in_loop(statement),\n                        condition: (expect_token(\"keyword\", \"while\"), tmp = parenthesised(), semicolon(), \n                        tmp)\n                    });\n\n                  case \"while\":\n                    return new AST_While({\n                        condition: parenthesised(),\n                        body: in_loop(statement)\n                    });\n\n                  case \"for\":\n                    return for_();\n\n                  case \"function\":\n                    return function_(AST_Defun);\n\n                  case \"if\":\n                    return if_();\n\n                  case \"return\":\n                    if (S.in_function == 0) croak(\"'return' outside of function\");\n                    return new AST_Return({\n                        value: is(\"punc\", \";\") ? (next(), null) : can_insert_semicolon() ? null : (tmp = expression(true), \n                        semicolon(), tmp)\n                    });\n\n                  case \"switch\":\n                    return new AST_Switch({\n                        expression: parenthesised(),\n                        body: in_loop(switch_body_)\n                    });\n\n                  case \"throw\":\n                    if (S.token.nlb) croak(\"Illegal newline after 'throw'\");\n                    return new AST_Throw({\n                        value: (tmp = expression(true), semicolon(), tmp)\n                    });\n\n                  case \"try\":\n                    return try_();\n\n                  case \"var\":\n                    return tmp = var_(), semicolon(), tmp;\n\n                  case \"const\":\n                    return tmp = const_(), semicolon(), tmp;\n\n                  case \"with\":\n                    return new AST_With({\n                        expression: parenthesised(),\n                        body: statement()\n                    });\n\n                  default:\n                    unexpected();\n                }\n            }\n        });\n        function labeled_statement() {\n            var label = as_symbol(AST_Label);\n            if (find_if(function(l) {\n                return l.name == label.name;\n            }, S.labels)) {\n                croak(\"Label \" + label.name + \" defined twice\");\n            }\n            expect(\":\");\n            S.labels.push(label);\n            var stat = statement();\n            S.labels.pop();\n            if (!(stat instanceof AST_IterationStatement)) {\n                label.references.forEach(function(ref) {\n                    if (ref instanceof AST_Continue) {\n                        ref = ref.label.start;\n                        croak(\"Continue label `\" + label.name + \"` refers to non-IterationStatement.\", ref.line, ref.col, ref.pos);\n                    }\n                });\n            }\n            return new AST_LabeledStatement({\n                body: stat,\n                label: label\n            });\n        }\n        function simple_statement(tmp) {\n            return new AST_SimpleStatement({\n                body: (tmp = expression(true), semicolon(), tmp)\n            });\n        }\n        function break_cont(type) {\n            var label = null, ldef;\n            if (!can_insert_semicolon()) {\n                label = as_symbol(AST_LabelRef, true);\n            }\n            if (label != null) {\n                ldef = find_if(function(l) {\n                    return l.name == label.name;\n                }, S.labels);\n                if (!ldef) croak(\"Undefined label \" + label.name);\n                label.thedef = ldef;\n            } else if (S.in_loop == 0) croak(type.TYPE + \" not inside a loop or switch\");\n            semicolon();\n            var stat = new type({\n                label: label\n            });\n            if (ldef) ldef.references.push(stat);\n            return stat;\n        }\n        function for_() {\n            expect(\"(\");\n            var init = null;\n            if (!is(\"punc\", \";\")) {\n                init = is(\"keyword\", \"var\") ? (next(), var_(true)) : expression(true, true);\n                if (is(\"operator\", \"in\")) {\n                    if (init instanceof AST_Var && init.definitions.length > 1) croak(\"Only one variable declaration allowed in for..in loop\");\n                    next();\n                    return for_in(init);\n                }\n            }\n            return regular_for(init);\n        }\n        function regular_for(init) {\n            expect(\";\");\n            var test = is(\"punc\", \";\") ? null : expression(true);\n            expect(\";\");\n            var step = is(\"punc\", \")\") ? null : expression(true);\n            expect(\")\");\n            return new AST_For({\n                init: init,\n                condition: test,\n                step: step,\n                body: in_loop(statement)\n            });\n        }\n        function for_in(init) {\n            var lhs = init instanceof AST_Var ? init.definitions[0].name : null;\n            var obj = expression(true);\n            expect(\")\");\n            return new AST_ForIn({\n                init: init,\n                name: lhs,\n                object: obj,\n                body: in_loop(statement)\n            });\n        }\n        var function_ = function(ctor) {\n            var in_statement = ctor === AST_Defun;\n            var name = is(\"name\") ? as_symbol(in_statement ? AST_SymbolDefun : AST_SymbolLambda) : null;\n            if (in_statement && !name) unexpected();\n            expect(\"(\");\n            return new ctor({\n                name: name,\n                argnames: function(first, a) {\n                    while (!is(\"punc\", \")\")) {\n                        if (first) first = false; else expect(\",\");\n                        a.push(as_symbol(AST_SymbolFunarg));\n                    }\n                    next();\n                    return a;\n                }(true, []),\n                body: function(loop, labels) {\n                    ++S.in_function;\n                    S.in_directives = true;\n                    S.in_loop = 0;\n                    S.labels = [];\n                    var a = block_();\n                    --S.in_function;\n                    S.in_loop = loop;\n                    S.labels = labels;\n                    return a;\n                }(S.in_loop, S.labels)\n            });\n        };\n        function if_() {\n            var cond = parenthesised(), body = statement(), belse = null;\n            if (is(\"keyword\", \"else\")) {\n                next();\n                belse = statement();\n            }\n            return new AST_If({\n                condition: cond,\n                body: body,\n                alternative: belse\n            });\n        }\n        function block_() {\n            expect(\"{\");\n            var a = [];\n            while (!is(\"punc\", \"}\")) {\n                if (is(\"eof\")) unexpected();\n                a.push(statement());\n            }\n            next();\n            return a;\n        }\n        function switch_body_() {\n            expect(\"{\");\n            var a = [], cur = null, branch = null, tmp;\n            while (!is(\"punc\", \"}\")) {\n                if (is(\"eof\")) unexpected();\n                if (is(\"keyword\", \"case\")) {\n                    if (branch) branch.end = prev();\n                    cur = [];\n                    branch = new AST_Case({\n                        start: (tmp = S.token, next(), tmp),\n                        expression: expression(true),\n                        body: cur\n                    });\n                    a.push(branch);\n                    expect(\":\");\n                } else if (is(\"keyword\", \"default\")) {\n                    if (branch) branch.end = prev();\n                    cur = [];\n                    branch = new AST_Default({\n                        start: (tmp = S.token, next(), expect(\":\"), tmp),\n                        body: cur\n                    });\n                    a.push(branch);\n                } else {\n                    if (!cur) unexpected();\n                    cur.push(statement());\n                }\n            }\n            if (branch) branch.end = prev();\n            next();\n            return a;\n        }\n        function try_() {\n            var body = block_(), bcatch = null, bfinally = null;\n            if (is(\"keyword\", \"catch\")) {\n                var start = S.token;\n                next();\n                expect(\"(\");\n                var name = as_symbol(AST_SymbolCatch);\n                expect(\")\");\n                bcatch = new AST_Catch({\n                    start: start,\n                    argname: name,\n                    body: block_(),\n                    end: prev()\n                });\n            }\n            if (is(\"keyword\", \"finally\")) {\n                var start = S.token;\n                next();\n                bfinally = new AST_Finally({\n                    start: start,\n                    body: block_(),\n                    end: prev()\n                });\n            }\n            if (!bcatch && !bfinally) croak(\"Missing catch/finally blocks\");\n            return new AST_Try({\n                body: body,\n                bcatch: bcatch,\n                bfinally: bfinally\n            });\n        }\n        function vardefs(no_in, in_const) {\n            var a = [];\n            for (;;) {\n                a.push(new AST_VarDef({\n                    start: S.token,\n                    name: as_symbol(in_const ? AST_SymbolConst : AST_SymbolVar),\n                    value: is(\"operator\", \"=\") ? (next(), expression(false, no_in)) : null,\n                    end: prev()\n                }));\n                if (!is(\"punc\", \",\")) break;\n                next();\n            }\n            return a;\n        }\n        var var_ = function(no_in) {\n            return new AST_Var({\n                start: prev(),\n                definitions: vardefs(no_in, false),\n                end: prev()\n            });\n        };\n        var const_ = function() {\n            return new AST_Const({\n                start: prev(),\n                definitions: vardefs(false, true),\n                end: prev()\n            });\n        };\n        var new_ = function() {\n            var start = S.token;\n            expect_token(\"operator\", \"new\");\n            var newexp = expr_atom(false), args;\n            if (is(\"punc\", \"(\")) {\n                next();\n                args = expr_list(\")\");\n            } else {\n                args = [];\n            }\n            return subscripts(new AST_New({\n                start: start,\n                expression: newexp,\n                args: args,\n                end: prev()\n            }), true);\n        };\n        function as_atom_node() {\n            var tok = S.token, ret;\n            switch (tok.type) {\n              case \"name\":\n              case \"keyword\":\n                ret = _make_symbol(AST_SymbolRef);\n                break;\n\n              case \"num\":\n                ret = new AST_Number({\n                    start: tok,\n                    end: tok,\n                    value: tok.value\n                });\n                break;\n\n              case \"string\":\n                ret = new AST_String({\n                    start: tok,\n                    end: tok,\n                    value: tok.value\n                });\n                break;\n\n              case \"regexp\":\n                ret = new AST_RegExp({\n                    start: tok,\n                    end: tok,\n                    value: tok.value\n                });\n                break;\n\n              case \"atom\":\n                switch (tok.value) {\n                  case \"false\":\n                    ret = new AST_False({\n                        start: tok,\n                        end: tok\n                    });\n                    break;\n\n                  case \"true\":\n                    ret = new AST_True({\n                        start: tok,\n                        end: tok\n                    });\n                    break;\n\n                  case \"null\":\n                    ret = new AST_Null({\n                        start: tok,\n                        end: tok\n                    });\n                    break;\n                }\n                break;\n            }\n            next();\n            return ret;\n        }\n        var expr_atom = function(allow_calls) {\n            if (is(\"operator\", \"new\")) {\n                return new_();\n            }\n            var start = S.token;\n            if (is(\"punc\")) {\n                switch (start.value) {\n                  case \"(\":\n                    next();\n                    var ex = expression(true);\n                    ex.start = start;\n                    ex.end = S.token;\n                    expect(\")\");\n                    return subscripts(ex, allow_calls);\n\n                  case \"[\":\n                    return subscripts(array_(), allow_calls);\n\n                  case \"{\":\n                    return subscripts(object_(), allow_calls);\n                }\n                unexpected();\n            }\n            if (is(\"keyword\", \"function\")) {\n                next();\n                var func = function_(AST_Function);\n                func.start = start;\n                func.end = prev();\n                return subscripts(func, allow_calls);\n            }\n            if (ATOMIC_START_TOKEN[S.token.type]) {\n                return subscripts(as_atom_node(), allow_calls);\n            }\n            unexpected();\n        };\n        function expr_list(closing, allow_trailing_comma, allow_empty) {\n            var first = true, a = [];\n            while (!is(\"punc\", closing)) {\n                if (first) first = false; else expect(\",\");\n                if (allow_trailing_comma && is(\"punc\", closing)) break;\n                if (is(\"punc\", \",\") && allow_empty) {\n                    a.push(new AST_Hole({\n                        start: S.token,\n                        end: S.token\n                    }));\n                } else {\n                    a.push(expression(false));\n                }\n            }\n            next();\n            return a;\n        }\n        var array_ = embed_tokens(function() {\n            expect(\"[\");\n            return new AST_Array({\n                elements: expr_list(\"]\", !options.strict, true)\n            });\n        });\n        var object_ = embed_tokens(function() {\n            expect(\"{\");\n            var first = true, a = [];\n            while (!is(\"punc\", \"}\")) {\n                if (first) first = false; else expect(\",\");\n                if (!options.strict && is(\"punc\", \"}\")) break;\n                var start = S.token;\n                var type = start.type;\n                var name = as_property_name();\n                if (type == \"name\" && !is(\"punc\", \":\")) {\n                    if (name == \"get\") {\n                        a.push(new AST_ObjectGetter({\n                            start: start,\n                            key: as_atom_node(),\n                            value: function_(AST_Accessor),\n                            end: prev()\n                        }));\n                        continue;\n                    }\n                    if (name == \"set\") {\n                        a.push(new AST_ObjectSetter({\n                            start: start,\n                            key: as_atom_node(),\n                            value: function_(AST_Accessor),\n                            end: prev()\n                        }));\n                        continue;\n                    }\n                }\n                expect(\":\");\n                a.push(new AST_ObjectKeyVal({\n                    start: start,\n                    key: name,\n                    value: expression(false),\n                    end: prev()\n                }));\n            }\n            next();\n            return new AST_Object({\n                properties: a\n            });\n        });\n        function as_property_name() {\n            var tmp = S.token;\n            next();\n            switch (tmp.type) {\n              case \"num\":\n              case \"string\":\n              case \"name\":\n              case \"operator\":\n              case \"keyword\":\n              case \"atom\":\n                return tmp.value;\n\n              default:\n                unexpected();\n            }\n        }\n        function as_name() {\n            var tmp = S.token;\n            next();\n            switch (tmp.type) {\n              case \"name\":\n              case \"operator\":\n              case \"keyword\":\n              case \"atom\":\n                return tmp.value;\n\n              default:\n                unexpected();\n            }\n        }\n        function _make_symbol(type) {\n            var name = S.token.value;\n            return new (name == \"this\" ? AST_This : type)({\n                name: String(name),\n                start: S.token,\n                end: S.token\n            });\n        }\n        function as_symbol(type, noerror) {\n            if (!is(\"name\")) {\n                if (!noerror) croak(\"Name expected\");\n                return null;\n            }\n            var sym = _make_symbol(type);\n            next();\n            return sym;\n        }\n        var subscripts = function(expr, allow_calls) {\n            var start = expr.start;\n            if (is(\"punc\", \".\")) {\n                next();\n                return subscripts(new AST_Dot({\n                    start: start,\n                    expression: expr,\n                    property: as_name(),\n                    end: prev()\n                }), allow_calls);\n            }\n            if (is(\"punc\", \"[\")) {\n                next();\n                var prop = expression(true);\n                expect(\"]\");\n                return subscripts(new AST_Sub({\n                    start: start,\n                    expression: expr,\n                    property: prop,\n                    end: prev()\n                }), allow_calls);\n            }\n            if (allow_calls && is(\"punc\", \"(\")) {\n                next();\n                return subscripts(new AST_Call({\n                    start: start,\n                    expression: expr,\n                    args: expr_list(\")\"),\n                    end: prev()\n                }), true);\n            }\n            return expr;\n        };\n        var maybe_unary = function(allow_calls) {\n            var start = S.token;\n            if (is(\"operator\") && UNARY_PREFIX(start.value)) {\n                next();\n                handle_regexp();\n                var ex = make_unary(AST_UnaryPrefix, start.value, maybe_unary(allow_calls));\n                ex.start = start;\n                ex.end = prev();\n                return ex;\n            }\n            var val = expr_atom(allow_calls);\n            while (is(\"operator\") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) {\n                val = make_unary(AST_UnaryPostfix, S.token.value, val);\n                val.start = start;\n                val.end = S.token;\n                next();\n            }\n            return val;\n        };\n        function make_unary(ctor, op, expr) {\n            if ((op == \"++\" || op == \"--\") && !is_assignable(expr)) croak(\"Invalid use of \" + op + \" operator\");\n            return new ctor({\n                operator: op,\n                expression: expr\n            });\n        }\n        var expr_op = function(left, min_prec, no_in) {\n            var op = is(\"operator\") ? S.token.value : null;\n            if (op == \"in\" && no_in) op = null;\n            var prec = op != null ? PRECEDENCE[op] : null;\n            if (prec != null && prec > min_prec) {\n                next();\n                var right = expr_op(maybe_unary(true), prec, no_in);\n                return expr_op(new AST_Binary({\n                    start: left.start,\n                    left: left,\n                    operator: op,\n                    right: right,\n                    end: right.end\n                }), min_prec, no_in);\n            }\n            return left;\n        };\n        function expr_ops(no_in) {\n            return expr_op(maybe_unary(true), 0, no_in);\n        }\n        var maybe_conditional = function(no_in) {\n            var start = S.token;\n            var expr = expr_ops(no_in);\n            if (is(\"operator\", \"?\")) {\n                next();\n                var yes = expression(false);\n                expect(\":\");\n                return new AST_Conditional({\n                    start: start,\n                    condition: expr,\n                    consequent: yes,\n                    alternative: expression(false, no_in),\n                    end: prev()\n                });\n            }\n            return expr;\n        };\n        function is_assignable(expr) {\n            if (!options.strict) return true;\n            if (expr instanceof AST_This) return false;\n            return expr instanceof AST_PropAccess || expr instanceof AST_Symbol;\n        }\n        var maybe_assign = function(no_in) {\n            var start = S.token;\n            var left = maybe_conditional(no_in), val = S.token.value;\n            if (is(\"operator\") && ASSIGNMENT(val)) {\n                if (is_assignable(left)) {\n                    next();\n                    return new AST_Assign({\n                        start: start,\n                        left: left,\n                        operator: val,\n                        right: maybe_assign(no_in),\n                        end: prev()\n                    });\n                }\n                croak(\"Invalid assignment\");\n            }\n            return left;\n        };\n        var expression = function(commas, no_in) {\n            var start = S.token;\n            var expr = maybe_assign(no_in);\n            if (commas && is(\"punc\", \",\")) {\n                next();\n                return new AST_Seq({\n                    start: start,\n                    car: expr,\n                    cdr: expression(true, no_in),\n                    end: peek()\n                });\n            }\n            return expr;\n        };\n        function in_loop(cont) {\n            ++S.in_loop;\n            var ret = cont();\n            --S.in_loop;\n            return ret;\n        }\n        if (options.expression) {\n            return expression(true);\n        }\n        return function() {\n            var start = S.token;\n            var body = [];\n            while (!is(\"eof\")) body.push(statement());\n            var end = prev();\n            var toplevel = options.toplevel;\n            if (toplevel) {\n                toplevel.body = toplevel.body.concat(body);\n                toplevel.end = end;\n            } else {\n                toplevel = new AST_Toplevel({\n                    start: start,\n                    body: body,\n                    end: end\n                });\n            }\n            return toplevel;\n        }();\n    }\n    \"use strict\";\n    function TreeTransformer(before, after) {\n        TreeWalker.call(this);\n        this.before = before;\n        this.after = after;\n    }\n    TreeTransformer.prototype = new TreeWalker();\n    (function(undefined) {\n        function _(node, descend) {\n            node.DEFMETHOD(\"transform\", function(tw, in_list) {\n                var x, y;\n                tw.push(this);\n                if (tw.before) x = tw.before(this, descend, in_list);\n                if (x === undefined) {\n                    if (!tw.after) {\n                        x = this;\n                        descend(x, tw);\n                    } else {\n                        tw.stack[tw.stack.length - 1] = x = this.clone();\n                        descend(x, tw);\n                        y = tw.after(x, in_list);\n                        if (y !== undefined) x = y;\n                    }\n                }\n                tw.pop();\n                return x;\n            });\n        }\n        function do_list(list, tw) {\n            return MAP(list, function(node) {\n                return node.transform(tw, true);\n            });\n        }\n        _(AST_Node, noop);\n        _(AST_LabeledStatement, function(self, tw) {\n            self.label = self.label.transform(tw);\n            self.body = self.body.transform(tw);\n        });\n        _(AST_SimpleStatement, function(self, tw) {\n            self.body = self.body.transform(tw);\n        });\n        _(AST_Block, function(self, tw) {\n            self.body = do_list(self.body, tw);\n        });\n        _(AST_DWLoop, function(self, tw) {\n            self.condition = self.condition.transform(tw);\n            self.body = self.body.transform(tw);\n        });\n        _(AST_For, function(self, tw) {\n            if (self.init) self.init = self.init.transform(tw);\n            if (self.condition) self.condition = self.condition.transform(tw);\n            if (self.step) self.step = self.step.transform(tw);\n            self.body = self.body.transform(tw);\n        });\n        _(AST_ForIn, function(self, tw) {\n            self.init = self.init.transform(tw);\n            self.object = self.object.transform(tw);\n            self.body = self.body.transform(tw);\n        });\n        _(AST_With, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n            self.body = self.body.transform(tw);\n        });\n        _(AST_Exit, function(self, tw) {\n            if (self.value) self.value = self.value.transform(tw);\n        });\n        _(AST_LoopControl, function(self, tw) {\n            if (self.label) self.label = self.label.transform(tw);\n        });\n        _(AST_If, function(self, tw) {\n            self.condition = self.condition.transform(tw);\n            self.body = self.body.transform(tw);\n            if (self.alternative) self.alternative = self.alternative.transform(tw);\n        });\n        _(AST_Switch, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n            self.body = do_list(self.body, tw);\n        });\n        _(AST_Case, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n            self.body = do_list(self.body, tw);\n        });\n        _(AST_Try, function(self, tw) {\n            self.body = do_list(self.body, tw);\n            if (self.bcatch) self.bcatch = self.bcatch.transform(tw);\n            if (self.bfinally) self.bfinally = self.bfinally.transform(tw);\n        });\n        _(AST_Catch, function(self, tw) {\n            self.argname = self.argname.transform(tw);\n            self.body = do_list(self.body, tw);\n        });\n        _(AST_Definitions, function(self, tw) {\n            self.definitions = do_list(self.definitions, tw);\n        });\n        _(AST_VarDef, function(self, tw) {\n            self.name = self.name.transform(tw);\n            if (self.value) self.value = self.value.transform(tw);\n        });\n        _(AST_Lambda, function(self, tw) {\n            if (self.name) self.name = self.name.transform(tw);\n            self.argnames = do_list(self.argnames, tw);\n            self.body = do_list(self.body, tw);\n        });\n        _(AST_Call, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n            self.args = do_list(self.args, tw);\n        });\n        _(AST_Seq, function(self, tw) {\n            self.car = self.car.transform(tw);\n            self.cdr = self.cdr.transform(tw);\n        });\n        _(AST_Dot, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n        });\n        _(AST_Sub, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n            self.property = self.property.transform(tw);\n        });\n        _(AST_Unary, function(self, tw) {\n            self.expression = self.expression.transform(tw);\n        });\n        _(AST_Binary, function(self, tw) {\n            self.left = self.left.transform(tw);\n            self.right = self.right.transform(tw);\n        });\n        _(AST_Conditional, function(self, tw) {\n            self.condition = self.condition.transform(tw);\n            self.consequent = self.consequent.transform(tw);\n            self.alternative = self.alternative.transform(tw);\n        });\n        _(AST_Array, function(self, tw) {\n            self.elements = do_list(self.elements, tw);\n        });\n        _(AST_Object, function(self, tw) {\n            self.properties = do_list(self.properties, tw);\n        });\n        _(AST_ObjectProperty, function(self, tw) {\n            self.value = self.value.transform(tw);\n        });\n    })();\n    \"use strict\";\n    function SymbolDef(scope, index, orig) {\n        this.name = orig.name;\n        this.orig = [ orig ];\n        this.scope = scope;\n        this.references = [];\n        this.global = false;\n        this.mangled_name = null;\n        this.undeclared = false;\n        this.constant = false;\n        this.index = index;\n    }\n    SymbolDef.prototype = {\n        unmangleable: function(options) {\n            return this.global && !(options && options.toplevel) || this.undeclared || !(options && options.eval) && (this.scope.uses_eval || this.scope.uses_with);\n        },\n        mangle: function(options) {\n            if (!this.mangled_name && !this.unmangleable(options)) {\n                var s = this.scope;\n                if (!options.screw_ie8 && this.orig[0] instanceof AST_SymbolLambda) s = s.parent_scope;\n                this.mangled_name = s.next_mangled(options, this);\n            }\n        }\n    };\n    AST_Toplevel.DEFMETHOD(\"figure_out_scope\", function(options) {\n        options = defaults(options, {\n            screw_ie8: false\n        });\n        var self = this;\n        var scope = self.parent_scope = null;\n        var defun = null;\n        var nesting = 0;\n        var tw = new TreeWalker(function(node, descend) {\n            if (options.screw_ie8 && node instanceof AST_Catch) {\n                var save_scope = scope;\n                scope = new AST_Scope(node);\n                scope.init_scope_vars(nesting);\n                scope.parent_scope = save_scope;\n                descend();\n                scope = save_scope;\n                return true;\n            }\n            if (node instanceof AST_Scope) {\n                node.init_scope_vars(nesting);\n                var save_scope = node.parent_scope = scope;\n                var save_defun = defun;\n                defun = scope = node;\n                ++nesting;\n                descend();\n                --nesting;\n                scope = save_scope;\n                defun = save_defun;\n                return true;\n            }\n            if (node instanceof AST_Directive) {\n                node.scope = scope;\n                push_uniq(scope.directives, node.value);\n                return true;\n            }\n            if (node instanceof AST_With) {\n                for (var s = scope; s; s = s.parent_scope) s.uses_with = true;\n                return;\n            }\n            if (node instanceof AST_Symbol) {\n                node.scope = scope;\n            }\n            if (node instanceof AST_SymbolLambda) {\n                defun.def_function(node);\n            } else if (node instanceof AST_SymbolDefun) {\n                (node.scope = defun.parent_scope).def_function(node);\n            } else if (node instanceof AST_SymbolVar || node instanceof AST_SymbolConst) {\n                var def = defun.def_variable(node);\n                def.constant = node instanceof AST_SymbolConst;\n                def.init = tw.parent().value;\n            } else if (node instanceof AST_SymbolCatch) {\n                (options.screw_ie8 ? scope : defun).def_variable(node);\n            }\n        });\n        self.walk(tw);\n        var func = null;\n        var globals = self.globals = new Dictionary();\n        var tw = new TreeWalker(function(node, descend) {\n            if (node instanceof AST_Lambda) {\n                var prev_func = func;\n                func = node;\n                descend();\n                func = prev_func;\n                return true;\n            }\n            if (node instanceof AST_SymbolRef) {\n                var name = node.name;\n                var sym = node.scope.find_variable(name);\n                if (!sym) {\n                    var g;\n                    if (globals.has(name)) {\n                        g = globals.get(name);\n                    } else {\n                        g = new SymbolDef(self, globals.size(), node);\n                        g.undeclared = true;\n                        g.global = true;\n                        globals.set(name, g);\n                    }\n                    node.thedef = g;\n                    if (name == \"eval\" && tw.parent() instanceof AST_Call) {\n                        for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) s.uses_eval = true;\n                    }\n                    if (func && name == \"arguments\") {\n                        func.uses_arguments = true;\n                    }\n                } else {\n                    node.thedef = sym;\n                }\n                node.reference();\n                return true;\n            }\n        });\n        self.walk(tw);\n    });\n    AST_Scope.DEFMETHOD(\"init_scope_vars\", function(nesting) {\n        this.directives = [];\n        this.variables = new Dictionary();\n        this.functions = new Dictionary();\n        this.uses_with = false;\n        this.uses_eval = false;\n        this.parent_scope = null;\n        this.enclosed = [];\n        this.cname = -1;\n        this.nesting = nesting;\n    });\n    AST_Scope.DEFMETHOD(\"strict\", function() {\n        return this.has_directive(\"use strict\");\n    });\n    AST_Lambda.DEFMETHOD(\"init_scope_vars\", function() {\n        AST_Scope.prototype.init_scope_vars.apply(this, arguments);\n        this.uses_arguments = false;\n    });\n    AST_SymbolRef.DEFMETHOD(\"reference\", function() {\n        var def = this.definition();\n        def.references.push(this);\n        var s = this.scope;\n        while (s) {\n            push_uniq(s.enclosed, def);\n            if (s === def.scope) break;\n            s = s.parent_scope;\n        }\n        this.frame = this.scope.nesting - def.scope.nesting;\n    });\n    AST_Scope.DEFMETHOD(\"find_variable\", function(name) {\n        if (name instanceof AST_Symbol) name = name.name;\n        return this.variables.get(name) || this.parent_scope && this.parent_scope.find_variable(name);\n    });\n    AST_Scope.DEFMETHOD(\"has_directive\", function(value) {\n        return this.parent_scope && this.parent_scope.has_directive(value) || (this.directives.indexOf(value) >= 0 ? this : null);\n    });\n    AST_Scope.DEFMETHOD(\"def_function\", function(symbol) {\n        this.functions.set(symbol.name, this.def_variable(symbol));\n    });\n    AST_Scope.DEFMETHOD(\"def_variable\", function(symbol) {\n        var def;\n        if (!this.variables.has(symbol.name)) {\n            def = new SymbolDef(this, this.variables.size(), symbol);\n            this.variables.set(symbol.name, def);\n            def.global = !this.parent_scope;\n        } else {\n            def = this.variables.get(symbol.name);\n            def.orig.push(symbol);\n        }\n        return symbol.thedef = def;\n    });\n    AST_Scope.DEFMETHOD(\"next_mangled\", function(options) {\n        var ext = this.enclosed;\n        out: while (true) {\n            var m = base54(++this.cname);\n            if (!is_identifier(m)) continue;\n            if (options.except.indexOf(m) >= 0) continue;\n            for (var i = ext.length; --i >= 0; ) {\n                var sym = ext[i];\n                var name = sym.mangled_name || sym.unmangleable(options) && sym.name;\n                if (m == name) continue out;\n            }\n            return m;\n        }\n    });\n    AST_Function.DEFMETHOD(\"next_mangled\", function(options, def) {\n        var tricky_def = def.orig[0] instanceof AST_SymbolFunarg && this.name && this.name.definition();\n        while (true) {\n            var name = AST_Lambda.prototype.next_mangled.call(this, options, def);\n            if (!(tricky_def && tricky_def.mangled_name == name)) return name;\n        }\n    });\n    AST_Scope.DEFMETHOD(\"references\", function(sym) {\n        if (sym instanceof AST_Symbol) sym = sym.definition();\n        return this.enclosed.indexOf(sym) < 0 ? null : sym;\n    });\n    AST_Symbol.DEFMETHOD(\"unmangleable\", function(options) {\n        return this.definition().unmangleable(options);\n    });\n    AST_SymbolAccessor.DEFMETHOD(\"unmangleable\", function() {\n        return true;\n    });\n    AST_Label.DEFMETHOD(\"unmangleable\", function() {\n        return false;\n    });\n    AST_Symbol.DEFMETHOD(\"unreferenced\", function() {\n        return this.definition().references.length == 0 && !(this.scope.uses_eval || this.scope.uses_with);\n    });\n    AST_Symbol.DEFMETHOD(\"undeclared\", function() {\n        return this.definition().undeclared;\n    });\n    AST_LabelRef.DEFMETHOD(\"undeclared\", function() {\n        return false;\n    });\n    AST_Label.DEFMETHOD(\"undeclared\", function() {\n        return false;\n    });\n    AST_Symbol.DEFMETHOD(\"definition\", function() {\n        return this.thedef;\n    });\n    AST_Symbol.DEFMETHOD(\"global\", function() {\n        return this.definition().global;\n    });\n    AST_Toplevel.DEFMETHOD(\"_default_mangler_options\", function(options) {\n        return defaults(options, {\n            except: [],\n            eval: false,\n            sort: false,\n            toplevel: false,\n            screw_ie8: false\n        });\n    });\n    AST_Toplevel.DEFMETHOD(\"mangle_names\", function(options) {\n        options = this._default_mangler_options(options);\n        var lname = -1;\n        var to_mangle = [];\n        var tw = new TreeWalker(function(node, descend) {\n            if (node instanceof AST_LabeledStatement) {\n                var save_nesting = lname;\n                descend();\n                lname = save_nesting;\n                return true;\n            }\n            if (node instanceof AST_Scope) {\n                var p = tw.parent(), a = [];\n                node.variables.each(function(symbol) {\n                    if (options.except.indexOf(symbol.name) < 0) {\n                        a.push(symbol);\n                    }\n                });\n                if (options.sort) a.sort(function(a, b) {\n                    return b.references.length - a.references.length;\n                });\n                to_mangle.push.apply(to_mangle, a);\n                return;\n            }\n            if (node instanceof AST_Label) {\n                var name;\n                do name = base54(++lname); while (!is_identifier(name));\n                node.mangled_name = name;\n                return true;\n            }\n            if (options.screw_ie8 && node instanceof AST_SymbolCatch) {\n                to_mangle.push(node.definition());\n                return;\n            }\n        });\n        this.walk(tw);\n        to_mangle.forEach(function(def) {\n            def.mangle(options);\n        });\n    });\n    AST_Toplevel.DEFMETHOD(\"compute_char_frequency\", function(options) {\n        options = this._default_mangler_options(options);\n        var tw = new TreeWalker(function(node) {\n            if (node instanceof AST_Constant) base54.consider(node.print_to_string()); else if (node instanceof AST_Return) base54.consider(\"return\"); else if (node instanceof AST_Throw) base54.consider(\"throw\"); else if (node instanceof AST_Continue) base54.consider(\"continue\"); else if (node instanceof AST_Break) base54.consider(\"break\"); else if (node instanceof AST_Debugger) base54.consider(\"debugger\"); else if (node instanceof AST_Directive) base54.consider(node.value); else if (node instanceof AST_While) base54.consider(\"while\"); else if (node instanceof AST_Do) base54.consider(\"do while\"); else if (node instanceof AST_If) {\n                base54.consider(\"if\");\n                if (node.alternative) base54.consider(\"else\");\n            } else if (node instanceof AST_Var) base54.consider(\"var\"); else if (node instanceof AST_Const) base54.consider(\"const\"); else if (node instanceof AST_Lambda) base54.consider(\"function\"); else if (node instanceof AST_For) base54.consider(\"for\"); else if (node instanceof AST_ForIn) base54.consider(\"for in\"); else if (node instanceof AST_Switch) base54.consider(\"switch\"); else if (node instanceof AST_Case) base54.consider(\"case\"); else if (node instanceof AST_Default) base54.consider(\"default\"); else if (node instanceof AST_With) base54.consider(\"with\"); else if (node instanceof AST_ObjectSetter) base54.consider(\"set\" + node.key); else if (node instanceof AST_ObjectGetter) base54.consider(\"get\" + node.key); else if (node instanceof AST_ObjectKeyVal) base54.consider(node.key); else if (node instanceof AST_New) base54.consider(\"new\"); else if (node instanceof AST_This) base54.consider(\"this\"); else if (node instanceof AST_Try) base54.consider(\"try\"); else if (node instanceof AST_Catch) base54.consider(\"catch\"); else if (node instanceof AST_Finally) base54.consider(\"finally\"); else if (node instanceof AST_Symbol && node.unmangleable(options)) base54.consider(node.name); else if (node instanceof AST_Unary || node instanceof AST_Binary) base54.consider(node.operator); else if (node instanceof AST_Dot) base54.consider(node.property);\n        });\n        this.walk(tw);\n        base54.sort();\n    });\n    var base54 = function() {\n        var string = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789\";\n        var chars, frequency;\n        function reset() {\n            frequency = Object.create(null);\n            chars = string.split(\"\").map(function(ch) {\n                return ch.charCodeAt(0);\n            });\n            chars.forEach(function(ch) {\n                frequency[ch] = 0;\n            });\n        }\n        base54.consider = function(str) {\n            for (var i = str.length; --i >= 0; ) {\n                var code = str.charCodeAt(i);\n                if (code in frequency) ++frequency[code];\n            }\n        };\n        base54.sort = function() {\n            chars = mergeSort(chars, function(a, b) {\n                if (is_digit(a) && !is_digit(b)) return 1;\n                if (is_digit(b) && !is_digit(a)) return -1;\n                return frequency[b] - frequency[a];\n            });\n        };\n        base54.reset = reset;\n        reset();\n        base54.get = function() {\n            return chars;\n        };\n        base54.freq = function() {\n            return frequency;\n        };\n        function base54(num) {\n            var ret = \"\", base = 54;\n            do {\n                ret += String.fromCharCode(chars[num % base]);\n                num = Math.floor(num / base);\n                base = 64;\n            } while (num > 0);\n            return ret;\n        }\n        return base54;\n    }();\n    AST_Toplevel.DEFMETHOD(\"scope_warnings\", function(options) {\n        options = defaults(options, {\n            undeclared: false,\n            unreferenced: true,\n            assign_to_global: true,\n            func_arguments: true,\n            nested_defuns: true,\n            eval: true\n        });\n        var tw = new TreeWalker(function(node) {\n            if (options.undeclared && node instanceof AST_SymbolRef && node.undeclared()) {\n                AST_Node.warn(\"Undeclared symbol: {name} [{file}:{line},{col}]\", {\n                    name: node.name,\n                    file: node.start.file,\n                    line: node.start.line,\n                    col: node.start.col\n                });\n            }\n            if (options.assign_to_global) {\n                var sym = null;\n                if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef) sym = node.left; else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef) sym = node.init;\n                if (sym && (sym.undeclared() || sym.global() && sym.scope !== sym.definition().scope)) {\n                    AST_Node.warn(\"{msg}: {name} [{file}:{line},{col}]\", {\n                        msg: sym.undeclared() ? \"Accidental global?\" : \"Assignment to global\",\n                        name: sym.name,\n                        file: sym.start.file,\n                        line: sym.start.line,\n                        col: sym.start.col\n                    });\n                }\n            }\n            if (options.eval && node instanceof AST_SymbolRef && node.undeclared() && node.name == \"eval\") {\n                AST_Node.warn(\"Eval is used [{file}:{line},{col}]\", node.start);\n            }\n            if (options.unreferenced && (node instanceof AST_SymbolDeclaration || node instanceof AST_Label) && node.unreferenced()) {\n                AST_Node.warn(\"{type} {name} is declared but not referenced [{file}:{line},{col}]\", {\n                    type: node instanceof AST_Label ? \"Label\" : \"Symbol\",\n                    name: node.name,\n                    file: node.start.file,\n                    line: node.start.line,\n                    col: node.start.col\n                });\n            }\n            if (options.func_arguments && node instanceof AST_Lambda && node.uses_arguments) {\n                AST_Node.warn(\"arguments used in function {name} [{file}:{line},{col}]\", {\n                    name: node.name ? node.name.name : \"anonymous\",\n                    file: node.start.file,\n                    line: node.start.line,\n                    col: node.start.col\n                });\n            }\n            if (options.nested_defuns && node instanceof AST_Defun && !(tw.parent() instanceof AST_Scope)) {\n                AST_Node.warn('Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]', {\n                    name: node.name.name,\n                    type: tw.parent().TYPE,\n                    file: node.start.file,\n                    line: node.start.line,\n                    col: node.start.col\n                });\n            }\n        });\n        this.walk(tw);\n    });\n    \"use strict\";\n    function OutputStream(options) {\n        options = defaults(options, {\n            indent_start: 0,\n            indent_level: 4,\n            quote_keys: false,\n            space_colon: true,\n            ascii_only: false,\n            unescape_regexps: false,\n            inline_script: false,\n            width: 80,\n            max_line_len: 32e3,\n            beautify: false,\n            source_map: null,\n            bracketize: false,\n            semicolons: true,\n            comments: false,\n            preserve_line: false,\n            screw_ie8: false,\n            preamble: null\n        }, true);\n        var indentation = 0;\n        var current_col = 0;\n        var current_line = 1;\n        var current_pos = 0;\n        var OUTPUT = \"\";\n        function to_ascii(str, identifier) {\n            return str.replace(/[\\u0080-\\uffff]/g, function(ch) {\n                var code = ch.charCodeAt(0).toString(16);\n                if (code.length <= 2 && !identifier) {\n                    while (code.length < 2) code = \"0\" + code;\n                    return \"\\\\x\" + code;\n                } else {\n                    while (code.length < 4) code = \"0\" + code;\n                    return \"\\\\u\" + code;\n                }\n            });\n        }\n        function make_string(str) {\n            var dq = 0, sq = 0;\n            str = str.replace(/[\\\\\\b\\f\\n\\r\\t\\x22\\x27\\u2028\\u2029\\0]/g, function(s) {\n                switch (s) {\n                  case \"\\\\\":\n                    return \"\\\\\\\\\";\n\n                  case \"\\b\":\n                    return \"\\\\b\";\n\n                  case \"\\f\":\n                    return \"\\\\f\";\n\n                  case \"\\n\":\n                    return \"\\\\n\";\n\n                  case \"\\r\":\n                    return \"\\\\r\";\n\n                  case \"\\u2028\":\n                    return \"\\\\u2028\";\n\n                  case \"\\u2029\":\n                    return \"\\\\u2029\";\n\n                  case '\"':\n                    ++dq;\n                    return '\"';\n\n                  case \"'\":\n                    ++sq;\n                    return \"'\";\n\n                  case \"\\x00\":\n                    return \"\\\\x00\";\n                }\n                return s;\n            });\n            if (options.ascii_only) str = to_ascii(str);\n            if (dq > sq) return \"'\" + str.replace(/\\x27/g, \"\\\\'\") + \"'\"; else return '\"' + str.replace(/\\x22/g, '\\\\\"') + '\"';\n        }\n        function encode_string(str) {\n            var ret = make_string(str);\n            if (options.inline_script) ret = ret.replace(/<\\x2fscript([>\\/\\t\\n\\f\\r ])/gi, \"<\\\\/script$1\");\n            return ret;\n        }\n        function make_name(name) {\n            name = name.toString();\n            if (options.ascii_only) name = to_ascii(name, true);\n            return name;\n        }\n        function make_indent(back) {\n            return repeat_string(\" \", options.indent_start + indentation - back * options.indent_level);\n        }\n        var might_need_space = false;\n        var might_need_semicolon = false;\n        var last = null;\n        function last_char() {\n            return last.charAt(last.length - 1);\n        }\n        function maybe_newline() {\n            if (options.max_line_len && current_col > options.max_line_len) print(\"\\n\");\n        }\n        var requireSemicolonChars = makePredicate(\"( [ + * / - , .\");\n        function print(str) {\n            str = String(str);\n            var ch = str.charAt(0);\n            if (might_need_semicolon) {\n                if ((!ch || \";}\".indexOf(ch) < 0) && !/[;]$/.test(last)) {\n                    if (options.semicolons || requireSemicolonChars(ch)) {\n                        OUTPUT += \";\";\n                        current_col++;\n                        current_pos++;\n                    } else {\n                        OUTPUT += \"\\n\";\n                        current_pos++;\n                        current_line++;\n                        current_col = 0;\n                    }\n                    if (!options.beautify) might_need_space = false;\n                }\n                might_need_semicolon = false;\n                maybe_newline();\n            }\n            if (!options.beautify && options.preserve_line && stack[stack.length - 1]) {\n                var target_line = stack[stack.length - 1].start.line;\n                while (current_line < target_line) {\n                    OUTPUT += \"\\n\";\n                    current_pos++;\n                    current_line++;\n                    current_col = 0;\n                    might_need_space = false;\n                }\n            }\n            if (might_need_space) {\n                var prev = last_char();\n                if (is_identifier_char(prev) && (is_identifier_char(ch) || ch == \"\\\\\") || /^[\\+\\-\\/]$/.test(ch) && ch == prev) {\n                    OUTPUT += \" \";\n                    current_col++;\n                    current_pos++;\n                }\n                might_need_space = false;\n            }\n            var a = str.split(/\\r?\\n/), n = a.length - 1;\n            current_line += n;\n            if (n == 0) {\n                current_col += a[n].length;\n            } else {\n                current_col = a[n].length;\n            }\n            current_pos += str.length;\n            last = str;\n            OUTPUT += str;\n        }\n        var space = options.beautify ? function() {\n            print(\" \");\n        } : function() {\n            might_need_space = true;\n        };\n        var indent = options.beautify ? function(half) {\n            if (options.beautify) {\n                print(make_indent(half ? .5 : 0));\n            }\n        } : noop;\n        var with_indent = options.beautify ? function(col, cont) {\n            if (col === true) col = next_indent();\n            var save_indentation = indentation;\n            indentation = col;\n            var ret = cont();\n            indentation = save_indentation;\n            return ret;\n        } : function(col, cont) {\n            return cont();\n        };\n        var newline = options.beautify ? function() {\n            print(\"\\n\");\n        } : noop;\n        var semicolon = options.beautify ? function() {\n            print(\";\");\n        } : function() {\n            might_need_semicolon = true;\n        };\n        function force_semicolon() {\n            might_need_semicolon = false;\n            print(\";\");\n        }\n        function next_indent() {\n            return indentation + options.indent_level;\n        }\n        function with_block(cont) {\n            var ret;\n            print(\"{\");\n            newline();\n            with_indent(next_indent(), function() {\n                ret = cont();\n            });\n            indent();\n            print(\"}\");\n            return ret;\n        }\n        function with_parens(cont) {\n            print(\"(\");\n            var ret = cont();\n            print(\")\");\n            return ret;\n        }\n        function with_square(cont) {\n            print(\"[\");\n            var ret = cont();\n            print(\"]\");\n            return ret;\n        }\n        function comma() {\n            print(\",\");\n            space();\n        }\n        function colon() {\n            print(\":\");\n            if (options.space_colon) space();\n        }\n        var add_mapping = options.source_map ? function(token, name) {\n            try {\n                if (token) options.source_map.add(token.file || \"?\", current_line, current_col, token.line, token.col, !name && token.type == \"name\" ? token.value : name);\n            } catch (ex) {\n                AST_Node.warn(\"Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]\", {\n                    file: token.file,\n                    line: token.line,\n                    col: token.col,\n                    cline: current_line,\n                    ccol: current_col,\n                    name: name || \"\"\n                });\n            }\n        } : noop;\n        function get() {\n            return OUTPUT;\n        }\n        if (options.preamble) {\n            print(options.preamble.replace(/\\r\\n?|[\\n\\u2028\\u2029]|\\s*$/g, \"\\n\"));\n        }\n        var stack = [];\n        return {\n            get: get,\n            toString: get,\n            indent: indent,\n            indentation: function() {\n                return indentation;\n            },\n            current_width: function() {\n                return current_col - indentation;\n            },\n            should_break: function() {\n                return options.width && this.current_width() >= options.width;\n            },\n            newline: newline,\n            print: print,\n            space: space,\n            comma: comma,\n            colon: colon,\n            last: function() {\n                return last;\n            },\n            semicolon: semicolon,\n            force_semicolon: force_semicolon,\n            to_ascii: to_ascii,\n            print_name: function(name) {\n                print(make_name(name));\n            },\n            print_string: function(str) {\n                print(encode_string(str));\n            },\n            next_indent: next_indent,\n            with_indent: with_indent,\n            with_block: with_block,\n            with_parens: with_parens,\n            with_square: with_square,\n            add_mapping: add_mapping,\n            option: function(opt) {\n                return options[opt];\n            },\n            line: function() {\n                return current_line;\n            },\n            col: function() {\n                return current_col;\n            },\n            pos: function() {\n                return current_pos;\n            },\n            push_node: function(node) {\n                stack.push(node);\n            },\n            pop_node: function() {\n                return stack.pop();\n            },\n            stack: function() {\n                return stack;\n            },\n            parent: function(n) {\n                return stack[stack.length - 2 - (n || 0)];\n            }\n        };\n    }\n    (function() {\n        function DEFPRINT(nodetype, generator) {\n            nodetype.DEFMETHOD(\"_codegen\", generator);\n        }\n        AST_Node.DEFMETHOD(\"print\", function(stream, force_parens) {\n            var self = this, generator = self._codegen;\n            function doit() {\n                self.add_comments(stream);\n                self.add_source_map(stream);\n                generator(self, stream);\n            }\n            stream.push_node(self);\n            if (force_parens || self.needs_parens(stream)) {\n                stream.with_parens(doit);\n            } else {\n                doit();\n            }\n            stream.pop_node();\n        });\n        AST_Node.DEFMETHOD(\"print_to_string\", function(options) {\n            var s = OutputStream(options);\n            this.print(s);\n            return s.get();\n        });\n        AST_Node.DEFMETHOD(\"add_comments\", function(output) {\n            var c = output.option(\"comments\"), self = this;\n            if (c) {\n                var start = self.start;\n                if (start && !start._comments_dumped) {\n                    start._comments_dumped = true;\n                    var comments = start.comments_before || [];\n                    if (self instanceof AST_Exit && self.value) {\n                        self.value.walk(new TreeWalker(function(node) {\n                            if (node.start && node.start.comments_before) {\n                                comments = comments.concat(node.start.comments_before);\n                                node.start.comments_before = [];\n                            }\n                            if (node instanceof AST_Function || node instanceof AST_Array || node instanceof AST_Object) {\n                                return true;\n                            }\n                        }));\n                    }\n                    if (c.test) {\n                        comments = comments.filter(function(comment) {\n                            return c.test(comment.value);\n                        });\n                    } else if (typeof c == \"function\") {\n                        comments = comments.filter(function(comment) {\n                            return c(self, comment);\n                        });\n                    }\n                    comments.forEach(function(c) {\n                        if (/comment[134]/.test(c.type)) {\n                            output.print(\"//\" + c.value + \"\\n\");\n                            output.indent();\n                        } else if (c.type == \"comment2\") {\n                            output.print(\"/*\" + c.value + \"*/\");\n                            if (start.nlb) {\n                                output.print(\"\\n\");\n                                output.indent();\n                            } else {\n                                output.space();\n                            }\n                        }\n                    });\n                }\n            }\n        });\n        function PARENS(nodetype, func) {\n            if (Array.isArray(nodetype)) {\n                nodetype.forEach(function(nodetype) {\n                    PARENS(nodetype, func);\n                });\n            } else {\n                nodetype.DEFMETHOD(\"needs_parens\", func);\n            }\n        }\n        PARENS(AST_Node, function() {\n            return false;\n        });\n        PARENS(AST_Function, function(output) {\n            return first_in_statement(output);\n        });\n        PARENS(AST_Object, function(output) {\n            return first_in_statement(output);\n        });\n        PARENS([ AST_Unary, AST_Undefined ], function(output) {\n            var p = output.parent();\n            return p instanceof AST_PropAccess && p.expression === this;\n        });\n        PARENS(AST_Seq, function(output) {\n            var p = output.parent();\n            return p instanceof AST_Call || p instanceof AST_Unary || p instanceof AST_Binary || p instanceof AST_VarDef || p instanceof AST_PropAccess || p instanceof AST_Array || p instanceof AST_ObjectProperty || p instanceof AST_Conditional;\n        });\n        PARENS(AST_Binary, function(output) {\n            var p = output.parent();\n            if (p instanceof AST_Call && p.expression === this) return true;\n            if (p instanceof AST_Unary) return true;\n            if (p instanceof AST_PropAccess && p.expression === this) return true;\n            if (p instanceof AST_Binary) {\n                var po = p.operator, pp = PRECEDENCE[po];\n                var so = this.operator, sp = PRECEDENCE[so];\n                if (pp > sp || pp == sp && this === p.right) {\n                    return true;\n                }\n            }\n        });\n        PARENS(AST_PropAccess, function(output) {\n            var p = output.parent();\n            if (p instanceof AST_New && p.expression === this) {\n                try {\n                    this.walk(new TreeWalker(function(node) {\n                        if (node instanceof AST_Call) throw p;\n                    }));\n                } catch (ex) {\n                    if (ex !== p) throw ex;\n                    return true;\n                }\n            }\n        });\n        PARENS(AST_Call, function(output) {\n            var p = output.parent(), p1;\n            if (p instanceof AST_New && p.expression === this) return true;\n            return this.expression instanceof AST_Function && p instanceof AST_PropAccess && p.expression === this && (p1 = output.parent(1)) instanceof AST_Assign && p1.left === p;\n        });\n        PARENS(AST_New, function(output) {\n            var p = output.parent();\n            if (no_constructor_parens(this, output) && (p instanceof AST_PropAccess || p instanceof AST_Call && p.expression === this)) return true;\n        });\n        PARENS(AST_Number, function(output) {\n            var p = output.parent();\n            if (this.getValue() < 0 && p instanceof AST_PropAccess && p.expression === this) return true;\n        });\n        PARENS(AST_NaN, function(output) {\n            var p = output.parent();\n            if (p instanceof AST_PropAccess && p.expression === this) return true;\n        });\n        PARENS([ AST_Assign, AST_Conditional ], function(output) {\n            var p = output.parent();\n            if (p instanceof AST_Unary) return true;\n            if (p instanceof AST_Binary && !(p instanceof AST_Assign)) return true;\n            if (p instanceof AST_Call && p.expression === this) return true;\n            if (p instanceof AST_Conditional && p.condition === this) return true;\n            if (p instanceof AST_PropAccess && p.expression === this) return true;\n        });\n        DEFPRINT(AST_Directive, function(self, output) {\n            output.print_string(self.value);\n            output.semicolon();\n        });\n        DEFPRINT(AST_Debugger, function(self, output) {\n            output.print(\"debugger\");\n            output.semicolon();\n        });\n        function display_body(body, is_toplevel, output) {\n            var last = body.length - 1;\n            body.forEach(function(stmt, i) {\n                if (!(stmt instanceof AST_EmptyStatement)) {\n                    output.indent();\n                    stmt.print(output);\n                    if (!(i == last && is_toplevel)) {\n                        output.newline();\n                        if (is_toplevel) output.newline();\n                    }\n                }\n            });\n        }\n        AST_StatementWithBody.DEFMETHOD(\"_do_print_body\", function(output) {\n            force_statement(this.body, output);\n        });\n        DEFPRINT(AST_Statement, function(self, output) {\n            self.body.print(output);\n            output.semicolon();\n        });\n        DEFPRINT(AST_Toplevel, function(self, output) {\n            display_body(self.body, true, output);\n            output.print(\"\");\n        });\n        DEFPRINT(AST_LabeledStatement, function(self, output) {\n            self.label.print(output);\n            output.colon();\n            self.body.print(output);\n        });\n        DEFPRINT(AST_SimpleStatement, function(self, output) {\n            self.body.print(output);\n            output.semicolon();\n        });\n        function print_bracketed(body, output) {\n            if (body.length > 0) output.with_block(function() {\n                display_body(body, false, output);\n            }); else output.print(\"{}\");\n        }\n        DEFPRINT(AST_BlockStatement, function(self, output) {\n            print_bracketed(self.body, output);\n        });\n        DEFPRINT(AST_EmptyStatement, function(self, output) {\n            output.semicolon();\n        });\n        DEFPRINT(AST_Do, function(self, output) {\n            output.print(\"do\");\n            output.space();\n            self._do_print_body(output);\n            output.space();\n            output.print(\"while\");\n            output.space();\n            output.with_parens(function() {\n                self.condition.print(output);\n            });\n            output.semicolon();\n        });\n        DEFPRINT(AST_While, function(self, output) {\n            output.print(\"while\");\n            output.space();\n            output.with_parens(function() {\n                self.condition.print(output);\n            });\n            output.space();\n            self._do_print_body(output);\n        });\n        DEFPRINT(AST_For, function(self, output) {\n            output.print(\"for\");\n            output.space();\n            output.with_parens(function() {\n                if (self.init && !(self.init instanceof AST_EmptyStatement)) {\n                    if (self.init instanceof AST_Definitions) {\n                        self.init.print(output);\n                    } else {\n                        parenthesize_for_noin(self.init, output, true);\n                    }\n                    output.print(\";\");\n                    output.space();\n                } else {\n                    output.print(\";\");\n                }\n                if (self.condition) {\n                    self.condition.print(output);\n                    output.print(\";\");\n                    output.space();\n                } else {\n                    output.print(\";\");\n                }\n                if (self.step) {\n                    self.step.print(output);\n                }\n            });\n            output.space();\n            self._do_print_body(output);\n        });\n        DEFPRINT(AST_ForIn, function(self, output) {\n            output.print(\"for\");\n            output.space();\n            output.with_parens(function() {\n                self.init.print(output);\n                output.space();\n                output.print(\"in\");\n                output.space();\n                self.object.print(output);\n            });\n            output.space();\n            self._do_print_body(output);\n        });\n        DEFPRINT(AST_With, function(self, output) {\n            output.print(\"with\");\n            output.space();\n            output.with_parens(function() {\n                self.expression.print(output);\n            });\n            output.space();\n            self._do_print_body(output);\n        });\n        AST_Lambda.DEFMETHOD(\"_do_print\", function(output, nokeyword) {\n            var self = this;\n            if (!nokeyword) {\n                output.print(\"function\");\n            }\n            if (self.name) {\n                output.space();\n                self.name.print(output);\n            }\n            output.with_parens(function() {\n                self.argnames.forEach(function(arg, i) {\n                    if (i) output.comma();\n                    arg.print(output);\n                });\n            });\n            output.space();\n            print_bracketed(self.body, output);\n        });\n        DEFPRINT(AST_Lambda, function(self, output) {\n            self._do_print(output);\n        });\n        AST_Exit.DEFMETHOD(\"_do_print\", function(output, kind) {\n            output.print(kind);\n            if (this.value) {\n                output.space();\n                this.value.print(output);\n            }\n            output.semicolon();\n        });\n        DEFPRINT(AST_Return, function(self, output) {\n            self._do_print(output, \"return\");\n        });\n        DEFPRINT(AST_Throw, function(self, output) {\n            self._do_print(output, \"throw\");\n        });\n        AST_LoopControl.DEFMETHOD(\"_do_print\", function(output, kind) {\n            output.print(kind);\n            if (this.label) {\n                output.space();\n                this.label.print(output);\n            }\n            output.semicolon();\n        });\n        DEFPRINT(AST_Break, function(self, output) {\n            self._do_print(output, \"break\");\n        });\n        DEFPRINT(AST_Continue, function(self, output) {\n            self._do_print(output, \"continue\");\n        });\n        function make_then(self, output) {\n            if (output.option(\"bracketize\")) {\n                make_block(self.body, output);\n                return;\n            }\n            if (!self.body) return output.force_semicolon();\n            if (self.body instanceof AST_Do && !output.option(\"screw_ie8\")) {\n                make_block(self.body, output);\n                return;\n            }\n            var b = self.body;\n            while (true) {\n                if (b instanceof AST_If) {\n                    if (!b.alternative) {\n                        make_block(self.body, output);\n                        return;\n                    }\n                    b = b.alternative;\n                } else if (b instanceof AST_StatementWithBody) {\n                    b = b.body;\n                } else break;\n            }\n            force_statement(self.body, output);\n        }\n        DEFPRINT(AST_If, function(self, output) {\n            output.print(\"if\");\n            output.space();\n            output.with_parens(function() {\n                self.condition.print(output);\n            });\n            output.space();\n            if (self.alternative) {\n                make_then(self, output);\n                output.space();\n                output.print(\"else\");\n                output.space();\n                force_statement(self.alternative, output);\n            } else {\n                self._do_print_body(output);\n            }\n        });\n        DEFPRINT(AST_Switch, function(self, output) {\n            output.print(\"switch\");\n            output.space();\n            output.with_parens(function() {\n                self.expression.print(output);\n            });\n            output.space();\n            if (self.body.length > 0) output.with_block(function() {\n                self.body.forEach(function(stmt, i) {\n                    if (i) output.newline();\n                    output.indent(true);\n                    stmt.print(output);\n                });\n            }); else output.print(\"{}\");\n        });\n        AST_SwitchBranch.DEFMETHOD(\"_do_print_body\", function(output) {\n            if (this.body.length > 0) {\n                output.newline();\n                this.body.forEach(function(stmt) {\n                    output.indent();\n                    stmt.print(output);\n                    output.newline();\n                });\n            }\n        });\n        DEFPRINT(AST_Default, function(self, output) {\n            output.print(\"default:\");\n            self._do_print_body(output);\n        });\n        DEFPRINT(AST_Case, function(self, output) {\n            output.print(\"case\");\n            output.space();\n            self.expression.print(output);\n            output.print(\":\");\n            self._do_print_body(output);\n        });\n        DEFPRINT(AST_Try, function(self, output) {\n            output.print(\"try\");\n            output.space();\n            print_bracketed(self.body, output);\n            if (self.bcatch) {\n                output.space();\n                self.bcatch.print(output);\n            }\n            if (self.bfinally) {\n                output.space();\n                self.bfinally.print(output);\n            }\n        });\n        DEFPRINT(AST_Catch, function(self, output) {\n            output.print(\"catch\");\n            output.space();\n            output.with_parens(function() {\n                self.argname.print(output);\n            });\n            output.space();\n            print_bracketed(self.body, output);\n        });\n        DEFPRINT(AST_Finally, function(self, output) {\n            output.print(\"finally\");\n            output.space();\n            print_bracketed(self.body, output);\n        });\n        AST_Definitions.DEFMETHOD(\"_do_print\", function(output, kind) {\n            output.print(kind);\n            output.space();\n            this.definitions.forEach(function(def, i) {\n                if (i) output.comma();\n                def.print(output);\n            });\n            var p = output.parent();\n            var in_for = p instanceof AST_For || p instanceof AST_ForIn;\n            var avoid_semicolon = in_for && p.init === this;\n            if (!avoid_semicolon) output.semicolon();\n        });\n        DEFPRINT(AST_Var, function(self, output) {\n            self._do_print(output, \"var\");\n        });\n        DEFPRINT(AST_Const, function(self, output) {\n            self._do_print(output, \"const\");\n        });\n        function parenthesize_for_noin(node, output, noin) {\n            if (!noin) node.print(output); else try {\n                node.walk(new TreeWalker(function(node) {\n                    if (node instanceof AST_Binary && node.operator == \"in\") throw output;\n                }));\n                node.print(output);\n            } catch (ex) {\n                if (ex !== output) throw ex;\n                node.print(output, true);\n            }\n        }\n        DEFPRINT(AST_VarDef, function(self, output) {\n            self.name.print(output);\n            if (self.value) {\n                output.space();\n                output.print(\"=\");\n                output.space();\n                var p = output.parent(1);\n                var noin = p instanceof AST_For || p instanceof AST_ForIn;\n                parenthesize_for_noin(self.value, output, noin);\n            }\n        });\n        DEFPRINT(AST_Call, function(self, output) {\n            self.expression.print(output);\n            if (self instanceof AST_New && no_constructor_parens(self, output)) return;\n            output.with_parens(function() {\n                self.args.forEach(function(expr, i) {\n                    if (i) output.comma();\n                    expr.print(output);\n                });\n            });\n        });\n        DEFPRINT(AST_New, function(self, output) {\n            output.print(\"new\");\n            output.space();\n            AST_Call.prototype._codegen(self, output);\n        });\n        AST_Seq.DEFMETHOD(\"_do_print\", function(output) {\n            this.car.print(output);\n            if (this.cdr) {\n                output.comma();\n                if (output.should_break()) {\n                    output.newline();\n                    output.indent();\n                }\n                this.cdr.print(output);\n            }\n        });\n        DEFPRINT(AST_Seq, function(self, output) {\n            self._do_print(output);\n        });\n        DEFPRINT(AST_Dot, function(self, output) {\n            var expr = self.expression;\n            expr.print(output);\n            if (expr instanceof AST_Number && expr.getValue() >= 0) {\n                if (!/[xa-f.]/i.test(output.last())) {\n                    output.print(\".\");\n                }\n            }\n            output.print(\".\");\n            output.add_mapping(self.end);\n            output.print_name(self.property);\n        });\n        DEFPRINT(AST_Sub, function(self, output) {\n            self.expression.print(output);\n            output.print(\"[\");\n            self.property.print(output);\n            output.print(\"]\");\n        });\n        DEFPRINT(AST_UnaryPrefix, function(self, output) {\n            var op = self.operator;\n            output.print(op);\n            if (/^[a-z]/i.test(op) || /[+-]$/.test(op) && self.expression instanceof AST_UnaryPrefix && /^[+-]/.test(self.expression.operator)) {\n                output.space();\n            }\n            self.expression.print(output);\n        });\n        DEFPRINT(AST_UnaryPostfix, function(self, output) {\n            self.expression.print(output);\n            output.print(self.operator);\n        });\n        DEFPRINT(AST_Binary, function(self, output) {\n            self.left.print(output);\n            output.space();\n            output.print(self.operator);\n            if (self.operator == \"<\" && self.right instanceof AST_UnaryPrefix && self.right.operator == \"!\" && self.right.expression instanceof AST_UnaryPrefix && self.right.expression.operator == \"--\") {\n                output.print(\" \");\n            } else {\n                output.space();\n            }\n            self.right.print(output);\n        });\n        DEFPRINT(AST_Conditional, function(self, output) {\n            self.condition.print(output);\n            output.space();\n            output.print(\"?\");\n            output.space();\n            self.consequent.print(output);\n            output.space();\n            output.colon();\n            self.alternative.print(output);\n        });\n        DEFPRINT(AST_Array, function(self, output) {\n            output.with_square(function() {\n                var a = self.elements, len = a.length;\n                if (len > 0) output.space();\n                a.forEach(function(exp, i) {\n                    if (i) output.comma();\n                    exp.print(output);\n                    if (i === len - 1 && exp instanceof AST_Hole) output.comma();\n                });\n                if (len > 0) output.space();\n            });\n        });\n        DEFPRINT(AST_Object, function(self, output) {\n            if (self.properties.length > 0) output.with_block(function() {\n                self.properties.forEach(function(prop, i) {\n                    if (i) {\n                        output.print(\",\");\n                        output.newline();\n                    }\n                    output.indent();\n                    prop.print(output);\n                });\n                output.newline();\n            }); else output.print(\"{}\");\n        });\n        DEFPRINT(AST_ObjectKeyVal, function(self, output) {\n            var key = self.key;\n            if (output.option(\"quote_keys\")) {\n                output.print_string(key + \"\");\n            } else if ((typeof key == \"number\" || !output.option(\"beautify\") && +key + \"\" == key) && parseFloat(key) >= 0) {\n                output.print(make_num(key));\n            } else if (RESERVED_WORDS(key) ? output.option(\"screw_ie8\") : is_identifier_string(key)) {\n                output.print_name(key);\n            } else {\n                output.print_string(key);\n            }\n            output.colon();\n            self.value.print(output);\n        });\n        DEFPRINT(AST_ObjectSetter, function(self, output) {\n            output.print(\"set\");\n            output.space();\n            self.key.print(output);\n            self.value._do_print(output, true);\n        });\n        DEFPRINT(AST_ObjectGetter, function(self, output) {\n            output.print(\"get\");\n            output.space();\n            self.key.print(output);\n            self.value._do_print(output, true);\n        });\n        DEFPRINT(AST_Symbol, function(self, output) {\n            var def = self.definition();\n            output.print_name(def ? def.mangled_name || def.name : self.name);\n        });\n        DEFPRINT(AST_Undefined, function(self, output) {\n            output.print(\"void 0\");\n        });\n        DEFPRINT(AST_Hole, noop);\n        DEFPRINT(AST_Infinity, function(self, output) {\n            output.print(\"1/0\");\n        });\n        DEFPRINT(AST_NaN, function(self, output) {\n            output.print(\"0/0\");\n        });\n        DEFPRINT(AST_This, function(self, output) {\n            output.print(\"this\");\n        });\n        DEFPRINT(AST_Constant, function(self, output) {\n            output.print(self.getValue());\n        });\n        DEFPRINT(AST_String, function(self, output) {\n            output.print_string(self.getValue());\n        });\n        DEFPRINT(AST_Number, function(self, output) {\n            output.print(make_num(self.getValue()));\n        });\n        function regexp_safe_literal(code) {\n            return [ 92, 47, 46, 43, 42, 63, 40, 41, 91, 93, 123, 125, 36, 94, 58, 124, 33, 10, 13, 0, 65279, 8232, 8233 ].indexOf(code) < 0;\n        }\n        DEFPRINT(AST_RegExp, function(self, output) {\n            var str = self.getValue().toString();\n            if (output.option(\"ascii_only\")) {\n                str = output.to_ascii(str);\n            } else if (output.option(\"unescape_regexps\")) {\n                str = str.split(\"\\\\\\\\\").map(function(str) {\n                    return str.replace(/\\\\u[0-9a-fA-F]{4}|\\\\x[0-9a-fA-F]{2}/g, function(s) {\n                        var code = parseInt(s.substr(2), 16);\n                        return regexp_safe_literal(code) ? String.fromCharCode(code) : s;\n                    });\n                }).join(\"\\\\\\\\\");\n            }\n            output.print(str);\n            var p = output.parent();\n            if (p instanceof AST_Binary && /^in/.test(p.operator) && p.left === self) output.print(\" \");\n        });\n        function force_statement(stat, output) {\n            if (output.option(\"bracketize\")) {\n                if (!stat || stat instanceof AST_EmptyStatement) output.print(\"{}\"); else if (stat instanceof AST_BlockStatement) stat.print(output); else output.with_block(function() {\n                    output.indent();\n                    stat.print(output);\n                    output.newline();\n                });\n            } else {\n                if (!stat || stat instanceof AST_EmptyStatement) output.force_semicolon(); else stat.print(output);\n            }\n        }\n        function first_in_statement(output) {\n            var a = output.stack(), i = a.length, node = a[--i], p = a[--i];\n            while (i > 0) {\n                if (p instanceof AST_Statement && p.body === node) return true;\n                if (p instanceof AST_Seq && p.car === node || p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) || p instanceof AST_Dot && p.expression === node || p instanceof AST_Sub && p.expression === node || p instanceof AST_Conditional && p.condition === node || p instanceof AST_Binary && p.left === node || p instanceof AST_UnaryPostfix && p.expression === node) {\n                    node = p;\n                    p = a[--i];\n                } else {\n                    return false;\n                }\n            }\n        }\n        function no_constructor_parens(self, output) {\n            return self.args.length == 0 && !output.option(\"beautify\");\n        }\n        function best_of(a) {\n            var best = a[0], len = best.length;\n            for (var i = 1; i < a.length; ++i) {\n                if (a[i].length < len) {\n                    best = a[i];\n                    len = best.length;\n                }\n            }\n            return best;\n        }\n        function make_num(num) {\n            var str = num.toString(10), a = [ str.replace(/^0\\./, \".\").replace(\"e+\", \"e\") ], m;\n            if (Math.floor(num) === num) {\n                if (num >= 0) {\n                    a.push(\"0x\" + num.toString(16).toLowerCase(), \"0\" + num.toString(8));\n                } else {\n                    a.push(\"-0x\" + (-num).toString(16).toLowerCase(), \"-0\" + (-num).toString(8));\n                }\n                if (m = /^(.*?)(0+)$/.exec(num)) {\n                    a.push(m[1] + \"e\" + m[2].length);\n                }\n            } else if (m = /^0?\\.(0+)(.*)$/.exec(num)) {\n                a.push(m[2] + \"e-\" + (m[1].length + m[2].length), str.substr(str.indexOf(\".\")));\n            }\n            return best_of(a);\n        }\n        function make_block(stmt, output) {\n            if (stmt instanceof AST_BlockStatement) {\n                stmt.print(output);\n                return;\n            }\n            output.with_block(function() {\n                output.indent();\n                stmt.print(output);\n                output.newline();\n            });\n        }\n        function DEFMAP(nodetype, generator) {\n            nodetype.DEFMETHOD(\"add_source_map\", function(stream) {\n                generator(this, stream);\n            });\n        }\n        DEFMAP(AST_Node, noop);\n        function basic_sourcemap_gen(self, output) {\n            output.add_mapping(self.start);\n        }\n        DEFMAP(AST_Directive, basic_sourcemap_gen);\n        DEFMAP(AST_Debugger, basic_sourcemap_gen);\n        DEFMAP(AST_Symbol, basic_sourcemap_gen);\n        DEFMAP(AST_Jump, basic_sourcemap_gen);\n        DEFMAP(AST_StatementWithBody, basic_sourcemap_gen);\n        DEFMAP(AST_LabeledStatement, noop);\n        DEFMAP(AST_Lambda, basic_sourcemap_gen);\n        DEFMAP(AST_Switch, basic_sourcemap_gen);\n        DEFMAP(AST_SwitchBranch, basic_sourcemap_gen);\n        DEFMAP(AST_BlockStatement, basic_sourcemap_gen);\n        DEFMAP(AST_Toplevel, noop);\n        DEFMAP(AST_New, basic_sourcemap_gen);\n        DEFMAP(AST_Try, basic_sourcemap_gen);\n        DEFMAP(AST_Catch, basic_sourcemap_gen);\n        DEFMAP(AST_Finally, basic_sourcemap_gen);\n        DEFMAP(AST_Definitions, basic_sourcemap_gen);\n        DEFMAP(AST_Constant, basic_sourcemap_gen);\n        DEFMAP(AST_ObjectProperty, function(self, output) {\n            output.add_mapping(self.start, self.key);\n        });\n    })();\n    \"use strict\";\n    function Compressor(options, false_by_default) {\n        if (!(this instanceof Compressor)) return new Compressor(options, false_by_default);\n        TreeTransformer.call(this, this.before, this.after);\n        this.options = defaults(options, {\n            sequences: !false_by_default,\n            properties: !false_by_default,\n            dead_code: !false_by_default,\n            drop_debugger: !false_by_default,\n            unsafe: false,\n            unsafe_comps: false,\n            conditionals: !false_by_default,\n            comparisons: !false_by_default,\n            evaluate: !false_by_default,\n            booleans: !false_by_default,\n            loops: !false_by_default,\n            unused: !false_by_default,\n            hoist_funs: !false_by_default,\n            keep_fargs: false,\n            hoist_vars: false,\n            if_return: !false_by_default,\n            join_vars: !false_by_default,\n            cascade: !false_by_default,\n            side_effects: !false_by_default,\n            pure_getters: false,\n            pure_funcs: null,\n            negate_iife: !false_by_default,\n            screw_ie8: false,\n            drop_console: false,\n            angular: false,\n            warnings: true,\n            global_defs: {}\n        }, true);\n    }\n    Compressor.prototype = new TreeTransformer();\n    merge(Compressor.prototype, {\n        option: function(key) {\n            return this.options[key];\n        },\n        warn: function() {\n            if (this.options.warnings) AST_Node.warn.apply(AST_Node, arguments);\n        },\n        before: function(node, descend, in_list) {\n            if (node._squeezed) return node;\n            var was_scope = false;\n            if (node instanceof AST_Scope) {\n                node = node.hoist_declarations(this);\n                was_scope = true;\n            }\n            descend(node, this);\n            node = node.optimize(this);\n            if (was_scope && node instanceof AST_Scope) {\n                node.drop_unused(this);\n                descend(node, this);\n            }\n            node._squeezed = true;\n            return node;\n        }\n    });\n    (function() {\n        function OPT(node, optimizer) {\n            node.DEFMETHOD(\"optimize\", function(compressor) {\n                var self = this;\n                if (self._optimized) return self;\n                var opt = optimizer(self, compressor);\n                opt._optimized = true;\n                if (opt === self) return opt;\n                return opt.transform(compressor);\n            });\n        }\n        OPT(AST_Node, function(self, compressor) {\n            return self;\n        });\n        AST_Node.DEFMETHOD(\"equivalent_to\", function(node) {\n            return this.print_to_string() == node.print_to_string();\n        });\n        function make_node(ctor, orig, props) {\n            if (!props) props = {};\n            if (orig) {\n                if (!props.start) props.start = orig.start;\n                if (!props.end) props.end = orig.end;\n            }\n            return new ctor(props);\n        }\n        function make_node_from_constant(compressor, val, orig) {\n            if (val instanceof AST_Node) return val.transform(compressor);\n            switch (typeof val) {\n              case \"string\":\n                return make_node(AST_String, orig, {\n                    value: val\n                }).optimize(compressor);\n\n              case \"number\":\n                return make_node(isNaN(val) ? AST_NaN : AST_Number, orig, {\n                    value: val\n                }).optimize(compressor);\n\n              case \"boolean\":\n                return make_node(val ? AST_True : AST_False, orig).optimize(compressor);\n\n              case \"undefined\":\n                return make_node(AST_Undefined, orig).optimize(compressor);\n\n              default:\n                if (val === null) {\n                    return make_node(AST_Null, orig).optimize(compressor);\n                }\n                if (val instanceof RegExp) {\n                    return make_node(AST_RegExp, orig).optimize(compressor);\n                }\n                throw new Error(string_template(\"Can't handle constant of type: {type}\", {\n                    type: typeof val\n                }));\n            }\n        }\n        function as_statement_array(thing) {\n            if (thing === null) return [];\n            if (thing instanceof AST_BlockStatement) return thing.body;\n            if (thing instanceof AST_EmptyStatement) return [];\n            if (thing instanceof AST_Statement) return [ thing ];\n            throw new Error(\"Can't convert thing to statement array\");\n        }\n        function is_empty(thing) {\n            if (thing === null) return true;\n            if (thing instanceof AST_EmptyStatement) return true;\n            if (thing instanceof AST_BlockStatement) return thing.body.length == 0;\n            return false;\n        }\n        function loop_body(x) {\n            if (x instanceof AST_Switch) return x;\n            if (x instanceof AST_For || x instanceof AST_ForIn || x instanceof AST_DWLoop) {\n                return x.body instanceof AST_BlockStatement ? x.body : x;\n            }\n            return x;\n        }\n        function tighten_body(statements, compressor) {\n            var CHANGED;\n            do {\n                CHANGED = false;\n                if (compressor.option(\"angular\")) {\n                    statements = process_for_angular(statements);\n                }\n                statements = eliminate_spurious_blocks(statements);\n                if (compressor.option(\"dead_code\")) {\n                    statements = eliminate_dead_code(statements, compressor);\n                }\n                if (compressor.option(\"if_return\")) {\n                    statements = handle_if_return(statements, compressor);\n                }\n                if (compressor.option(\"sequences\")) {\n                    statements = sequencesize(statements, compressor);\n                }\n                if (compressor.option(\"join_vars\")) {\n                    statements = join_consecutive_vars(statements, compressor);\n                }\n            } while (CHANGED);\n            if (compressor.option(\"negate_iife\")) {\n                negate_iifes(statements, compressor);\n            }\n            return statements;\n            function process_for_angular(statements) {\n                function make_injector(func, name) {\n                    return make_node(AST_SimpleStatement, func, {\n                        body: make_node(AST_Assign, func, {\n                            operator: \"=\",\n                            left: make_node(AST_Dot, name, {\n                                expression: make_node(AST_SymbolRef, name, name),\n                                property: \"$inject\"\n                            }),\n                            right: make_node(AST_Array, func, {\n                                elements: func.argnames.map(function(sym) {\n                                    return make_node(AST_String, sym, {\n                                        value: sym.name\n                                    });\n                                })\n                            })\n                        })\n                    });\n                }\n                return statements.reduce(function(a, stat) {\n                    a.push(stat);\n                    var token = stat.start;\n                    var comments = token.comments_before;\n                    if (comments && comments.length > 0) {\n                        var last = comments.pop();\n                        if (/@ngInject/.test(last.value)) {\n                            if (stat instanceof AST_Defun) {\n                                a.push(make_injector(stat, stat.name));\n                            } else if (stat instanceof AST_Definitions) {\n                                stat.definitions.forEach(function(def) {\n                                    if (def.value && def.value instanceof AST_Lambda) {\n                                        a.push(make_injector(def.value, def.name));\n                                    }\n                                });\n                            } else {\n                                compressor.warn(\"Unknown statement marked with @ngInject [{file}:{line},{col}]\", token);\n                            }\n                        }\n                    }\n                    return a;\n                }, []);\n            }\n            function eliminate_spurious_blocks(statements) {\n                var seen_dirs = [];\n                return statements.reduce(function(a, stat) {\n                    if (stat instanceof AST_BlockStatement) {\n                        CHANGED = true;\n                        a.push.apply(a, eliminate_spurious_blocks(stat.body));\n                    } else if (stat instanceof AST_EmptyStatement) {\n                        CHANGED = true;\n                    } else if (stat instanceof AST_Directive) {\n                        if (seen_dirs.indexOf(stat.value) < 0) {\n                            a.push(stat);\n                            seen_dirs.push(stat.value);\n                        } else {\n                            CHANGED = true;\n                        }\n                    } else {\n                        a.push(stat);\n                    }\n                    return a;\n                }, []);\n            }\n            function handle_if_return(statements, compressor) {\n                var self = compressor.self();\n                var in_lambda = self instanceof AST_Lambda;\n                var ret = [];\n                loop: for (var i = statements.length; --i >= 0; ) {\n                    var stat = statements[i];\n                    switch (true) {\n                      case in_lambda && stat instanceof AST_Return && !stat.value && ret.length == 0:\n                        CHANGED = true;\n                        continue loop;\n\n                      case stat instanceof AST_If:\n                        if (stat.body instanceof AST_Return) {\n                            if ((in_lambda && ret.length == 0 || ret[0] instanceof AST_Return && !ret[0].value) && !stat.body.value && !stat.alternative) {\n                                CHANGED = true;\n                                var cond = make_node(AST_SimpleStatement, stat.condition, {\n                                    body: stat.condition\n                                });\n                                ret.unshift(cond);\n                                continue loop;\n                            }\n                            if (ret[0] instanceof AST_Return && stat.body.value && ret[0].value && !stat.alternative) {\n                                CHANGED = true;\n                                stat = stat.clone();\n                                stat.alternative = ret[0];\n                                ret[0] = stat.transform(compressor);\n                                continue loop;\n                            }\n                            if ((ret.length == 0 || ret[0] instanceof AST_Return) && stat.body.value && !stat.alternative && in_lambda) {\n                                CHANGED = true;\n                                stat = stat.clone();\n                                stat.alternative = ret[0] || make_node(AST_Return, stat, {\n                                    value: make_node(AST_Undefined, stat)\n                                });\n                                ret[0] = stat.transform(compressor);\n                                continue loop;\n                            }\n                            if (!stat.body.value && in_lambda) {\n                                CHANGED = true;\n                                stat = stat.clone();\n                                stat.condition = stat.condition.negate(compressor);\n                                stat.body = make_node(AST_BlockStatement, stat, {\n                                    body: as_statement_array(stat.alternative).concat(ret)\n                                });\n                                stat.alternative = null;\n                                ret = [ stat.transform(compressor) ];\n                                continue loop;\n                            }\n                            if (ret.length == 1 && in_lambda && ret[0] instanceof AST_SimpleStatement && (!stat.alternative || stat.alternative instanceof AST_SimpleStatement)) {\n                                CHANGED = true;\n                                ret.push(make_node(AST_Return, ret[0], {\n                                    value: make_node(AST_Undefined, ret[0])\n                                }).transform(compressor));\n                                ret = as_statement_array(stat.alternative).concat(ret);\n                                ret.unshift(stat);\n                                continue loop;\n                            }\n                        }\n                        var ab = aborts(stat.body);\n                        var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab.label) : null;\n                        if (ab && (ab instanceof AST_Return && !ab.value && in_lambda || ab instanceof AST_Continue && self === loop_body(lct) || ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct)) {\n                            if (ab.label) {\n                                remove(ab.label.thedef.references, ab);\n                            }\n                            CHANGED = true;\n                            var body = as_statement_array(stat.body).slice(0, -1);\n                            stat = stat.clone();\n                            stat.condition = stat.condition.negate(compressor);\n                            stat.body = make_node(AST_BlockStatement, stat, {\n                                body: as_statement_array(stat.alternative).concat(ret)\n                            });\n                            stat.alternative = make_node(AST_BlockStatement, stat, {\n                                body: body\n                            });\n                            ret = [ stat.transform(compressor) ];\n                            continue loop;\n                        }\n                        var ab = aborts(stat.alternative);\n                        var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab.label) : null;\n                        if (ab && (ab instanceof AST_Return && !ab.value && in_lambda || ab instanceof AST_Continue && self === loop_body(lct) || ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct)) {\n                            if (ab.label) {\n                                remove(ab.label.thedef.references, ab);\n                            }\n                            CHANGED = true;\n                            stat = stat.clone();\n                            stat.body = make_node(AST_BlockStatement, stat.body, {\n                                body: as_statement_array(stat.body).concat(ret)\n                            });\n                            stat.alternative = make_node(AST_BlockStatement, stat.alternative, {\n                                body: as_statement_array(stat.alternative).slice(0, -1)\n                            });\n                            ret = [ stat.transform(compressor) ];\n                            continue loop;\n                        }\n                        ret.unshift(stat);\n                        break;\n\n                      default:\n                        ret.unshift(stat);\n                        break;\n                    }\n                }\n                return ret;\n            }\n            function eliminate_dead_code(statements, compressor) {\n                var has_quit = false;\n                var orig = statements.length;\n                var self = compressor.self();\n                statements = statements.reduce(function(a, stat) {\n                    if (has_quit) {\n                        extract_declarations_from_unreachable_code(compressor, stat, a);\n                    } else {\n                        if (stat instanceof AST_LoopControl) {\n                            var lct = compressor.loopcontrol_target(stat.label);\n                            if (stat instanceof AST_Break && lct instanceof AST_BlockStatement && loop_body(lct) === self || stat instanceof AST_Continue && loop_body(lct) === self) {\n                                if (stat.label) {\n                                    remove(stat.label.thedef.references, stat);\n                                }\n                            } else {\n                                a.push(stat);\n                            }\n                        } else {\n                            a.push(stat);\n                        }\n                        if (aborts(stat)) has_quit = true;\n                    }\n                    return a;\n                }, []);\n                CHANGED = statements.length != orig;\n                return statements;\n            }\n            function sequencesize(statements, compressor) {\n                if (statements.length < 2) return statements;\n                var seq = [], ret = [];\n                function push_seq() {\n                    seq = AST_Seq.from_array(seq);\n                    if (seq) ret.push(make_node(AST_SimpleStatement, seq, {\n                        body: seq\n                    }));\n                    seq = [];\n                }\n                statements.forEach(function(stat) {\n                    if (stat instanceof AST_SimpleStatement) seq.push(stat.body); else push_seq(), ret.push(stat);\n                });\n                push_seq();\n                ret = sequencesize_2(ret, compressor);\n                CHANGED = ret.length != statements.length;\n                return ret;\n            }\n            function sequencesize_2(statements, compressor) {\n                function cons_seq(right) {\n                    ret.pop();\n                    var left = prev.body;\n                    if (left instanceof AST_Seq) {\n                        left.add(right);\n                    } else {\n                        left = AST_Seq.cons(left, right);\n                    }\n                    return left.transform(compressor);\n                }\n                var ret = [], prev = null;\n                statements.forEach(function(stat) {\n                    if (prev) {\n                        if (stat instanceof AST_For) {\n                            var opera = {};\n                            try {\n                                prev.body.walk(new TreeWalker(function(node) {\n                                    if (node instanceof AST_Binary && node.operator == \"in\") throw opera;\n                                }));\n                                if (stat.init && !(stat.init instanceof AST_Definitions)) {\n                                    stat.init = cons_seq(stat.init);\n                                } else if (!stat.init) {\n                                    stat.init = prev.body;\n                                    ret.pop();\n                                }\n                            } catch (ex) {\n                                if (ex !== opera) throw ex;\n                            }\n                        } else if (stat instanceof AST_If) {\n                            stat.condition = cons_seq(stat.condition);\n                        } else if (stat instanceof AST_With) {\n                            stat.expression = cons_seq(stat.expression);\n                        } else if (stat instanceof AST_Exit && stat.value) {\n                            stat.value = cons_seq(stat.value);\n                        } else if (stat instanceof AST_Exit) {\n                            stat.value = cons_seq(make_node(AST_Undefined, stat));\n                        } else if (stat instanceof AST_Switch) {\n                            stat.expression = cons_seq(stat.expression);\n                        }\n                    }\n                    ret.push(stat);\n                    prev = stat instanceof AST_SimpleStatement ? stat : null;\n                });\n                return ret;\n            }\n            function join_consecutive_vars(statements, compressor) {\n                var prev = null;\n                return statements.reduce(function(a, stat) {\n                    if (stat instanceof AST_Definitions && prev && prev.TYPE == stat.TYPE) {\n                        prev.definitions = prev.definitions.concat(stat.definitions);\n                        CHANGED = true;\n                    } else if (stat instanceof AST_For && prev instanceof AST_Definitions && (!stat.init || stat.init.TYPE == prev.TYPE)) {\n                        CHANGED = true;\n                        a.pop();\n                        if (stat.init) {\n                            stat.init.definitions = prev.definitions.concat(stat.init.definitions);\n                        } else {\n                            stat.init = prev;\n                        }\n                        a.push(stat);\n                        prev = stat;\n                    } else {\n                        prev = stat;\n                        a.push(stat);\n                    }\n                    return a;\n                }, []);\n            }\n            function negate_iifes(statements, compressor) {\n                statements.forEach(function(stat) {\n                    if (stat instanceof AST_SimpleStatement) {\n                        stat.body = function transform(thing) {\n                            return thing.transform(new TreeTransformer(function(node) {\n                                if (node instanceof AST_Call && node.expression instanceof AST_Function) {\n                                    return make_node(AST_UnaryPrefix, node, {\n                                        operator: \"!\",\n                                        expression: node\n                                    });\n                                } else if (node instanceof AST_Call) {\n                                    node.expression = transform(node.expression);\n                                } else if (node instanceof AST_Seq) {\n                                    node.car = transform(node.car);\n                                } else if (node instanceof AST_Conditional) {\n                                    var expr = transform(node.condition);\n                                    if (expr !== node.condition) {\n                                        node.condition = expr;\n                                        var tmp = node.consequent;\n                                        node.consequent = node.alternative;\n                                        node.alternative = tmp;\n                                    }\n                                }\n                                return node;\n                            }));\n                        }(stat.body);\n                    }\n                });\n            }\n        }\n        function extract_declarations_from_unreachable_code(compressor, stat, target) {\n            compressor.warn(\"Dropping unreachable code [{file}:{line},{col}]\", stat.start);\n            stat.walk(new TreeWalker(function(node) {\n                if (node instanceof AST_Definitions) {\n                    compressor.warn(\"Declarations in unreachable code! [{file}:{line},{col}]\", node.start);\n                    node.remove_initializers();\n                    target.push(node);\n                    return true;\n                }\n                if (node instanceof AST_Defun) {\n                    target.push(node);\n                    return true;\n                }\n                if (node instanceof AST_Scope) {\n                    return true;\n                }\n            }));\n        }\n        (function(def) {\n            var unary_bool = [ \"!\", \"delete\" ];\n            var binary_bool = [ \"in\", \"instanceof\", \"==\", \"!=\", \"===\", \"!==\", \"<\", \"<=\", \">=\", \">\" ];\n            def(AST_Node, function() {\n                return false;\n            });\n            def(AST_UnaryPrefix, function() {\n                return member(this.operator, unary_bool);\n            });\n            def(AST_Binary, function() {\n                return member(this.operator, binary_bool) || (this.operator == \"&&\" || this.operator == \"||\") && this.left.is_boolean() && this.right.is_boolean();\n            });\n            def(AST_Conditional, function() {\n                return this.consequent.is_boolean() && this.alternative.is_boolean();\n            });\n            def(AST_Assign, function() {\n                return this.operator == \"=\" && this.right.is_boolean();\n            });\n            def(AST_Seq, function() {\n                return this.cdr.is_boolean();\n            });\n            def(AST_True, function() {\n                return true;\n            });\n            def(AST_False, function() {\n                return true;\n            });\n        })(function(node, func) {\n            node.DEFMETHOD(\"is_boolean\", func);\n        });\n        (function(def) {\n            def(AST_Node, function() {\n                return false;\n            });\n            def(AST_String, function() {\n                return true;\n            });\n            def(AST_UnaryPrefix, function() {\n                return this.operator == \"typeof\";\n            });\n            def(AST_Binary, function(compressor) {\n                return this.operator == \"+\" && (this.left.is_string(compressor) || this.right.is_string(compressor));\n            });\n            def(AST_Assign, function(compressor) {\n                return (this.operator == \"=\" || this.operator == \"+=\") && this.right.is_string(compressor);\n            });\n            def(AST_Seq, function(compressor) {\n                return this.cdr.is_string(compressor);\n            });\n            def(AST_Conditional, function(compressor) {\n                return this.consequent.is_string(compressor) && this.alternative.is_string(compressor);\n            });\n            def(AST_Call, function(compressor) {\n                return compressor.option(\"unsafe\") && this.expression instanceof AST_SymbolRef && this.expression.name == \"String\" && this.expression.undeclared();\n            });\n        })(function(node, func) {\n            node.DEFMETHOD(\"is_string\", func);\n        });\n        function best_of(ast1, ast2) {\n            return ast1.print_to_string().length > ast2.print_to_string().length ? ast2 : ast1;\n        }\n        (function(def) {\n            AST_Node.DEFMETHOD(\"evaluate\", function(compressor) {\n                if (!compressor.option(\"evaluate\")) return [ this ];\n                try {\n                    var val = this._eval(compressor);\n                    return [ best_of(make_node_from_constant(compressor, val, this), this), val ];\n                } catch (ex) {\n                    if (ex !== def) throw ex;\n                    return [ this ];\n                }\n            });\n            def(AST_Statement, function() {\n                throw new Error(string_template(\"Cannot evaluate a statement [{file}:{line},{col}]\", this.start));\n            });\n            def(AST_Function, function() {\n                throw def;\n            });\n            function ev(node, compressor) {\n                if (!compressor) throw new Error(\"Compressor must be passed\");\n                return node._eval(compressor);\n            }\n            def(AST_Node, function() {\n                throw def;\n            });\n            def(AST_Constant, function() {\n                return this.getValue();\n            });\n            def(AST_UnaryPrefix, function(compressor) {\n                var e = this.expression;\n                switch (this.operator) {\n                  case \"!\":\n                    return !ev(e, compressor);\n\n                  case \"typeof\":\n                    if (e instanceof AST_Function) return typeof function() {};\n                    e = ev(e, compressor);\n                    if (e instanceof RegExp) throw def;\n                    return typeof e;\n\n                  case \"void\":\n                    return void ev(e, compressor);\n\n                  case \"~\":\n                    return ~ev(e, compressor);\n\n                  case \"-\":\n                    e = ev(e, compressor);\n                    if (e === 0) throw def;\n                    return -e;\n\n                  case \"+\":\n                    return +ev(e, compressor);\n                }\n                throw def;\n            });\n            def(AST_Binary, function(c) {\n                var left = this.left, right = this.right;\n                switch (this.operator) {\n                  case \"&&\":\n                    return ev(left, c) && ev(right, c);\n\n                  case \"||\":\n                    return ev(left, c) || ev(right, c);\n\n                  case \"|\":\n                    return ev(left, c) | ev(right, c);\n\n                  case \"&\":\n                    return ev(left, c) & ev(right, c);\n\n                  case \"^\":\n                    return ev(left, c) ^ ev(right, c);\n\n                  case \"+\":\n                    return ev(left, c) + ev(right, c);\n\n                  case \"*\":\n                    return ev(left, c) * ev(right, c);\n\n                  case \"/\":\n                    return ev(left, c) / ev(right, c);\n\n                  case \"%\":\n                    return ev(left, c) % ev(right, c);\n\n                  case \"-\":\n                    return ev(left, c) - ev(right, c);\n\n                  case \"<<\":\n                    return ev(left, c) << ev(right, c);\n\n                  case \">>\":\n                    return ev(left, c) >> ev(right, c);\n\n                  case \">>>\":\n                    return ev(left, c) >>> ev(right, c);\n\n                  case \"==\":\n                    return ev(left, c) == ev(right, c);\n\n                  case \"===\":\n                    return ev(left, c) === ev(right, c);\n\n                  case \"!=\":\n                    return ev(left, c) != ev(right, c);\n\n                  case \"!==\":\n                    return ev(left, c) !== ev(right, c);\n\n                  case \"<\":\n                    return ev(left, c) < ev(right, c);\n\n                  case \"<=\":\n                    return ev(left, c) <= ev(right, c);\n\n                  case \">\":\n                    return ev(left, c) > ev(right, c);\n\n                  case \">=\":\n                    return ev(left, c) >= ev(right, c);\n\n                  case \"in\":\n                    return ev(left, c) in ev(right, c);\n\n                  case \"instanceof\":\n                    return ev(left, c) instanceof ev(right, c);\n                }\n                throw def;\n            });\n            def(AST_Conditional, function(compressor) {\n                return ev(this.condition, compressor) ? ev(this.consequent, compressor) : ev(this.alternative, compressor);\n            });\n            def(AST_SymbolRef, function(compressor) {\n                var d = this.definition();\n                if (d && d.constant && d.init) return ev(d.init, compressor);\n                throw def;\n            });\n            def(AST_Dot, function(compressor) {\n                if (compressor.option(\"unsafe\") && this.property == \"length\") {\n                    var str = ev(this.expression, compressor);\n                    if (typeof str == \"string\") return str.length;\n                }\n                throw def;\n            });\n        })(function(node, func) {\n            node.DEFMETHOD(\"_eval\", func);\n        });\n        (function(def) {\n            function basic_negation(exp) {\n                return make_node(AST_UnaryPrefix, exp, {\n                    operator: \"!\",\n                    expression: exp\n                });\n            }\n            def(AST_Node, function() {\n                return basic_negation(this);\n            });\n            def(AST_Statement, function() {\n                throw new Error(\"Cannot negate a statement\");\n            });\n            def(AST_Function, function() {\n                return basic_negation(this);\n            });\n            def(AST_UnaryPrefix, function() {\n                if (this.operator == \"!\") return this.expression;\n                return basic_negation(this);\n            });\n            def(AST_Seq, function(compressor) {\n                var self = this.clone();\n                self.cdr = self.cdr.negate(compressor);\n                return self;\n            });\n            def(AST_Conditional, function(compressor) {\n                var self = this.clone();\n                self.consequent = self.consequent.negate(compressor);\n                self.alternative = self.alternative.negate(compressor);\n                return best_of(basic_negation(this), self);\n            });\n            def(AST_Binary, function(compressor) {\n                var self = this.clone(), op = this.operator;\n                if (compressor.option(\"unsafe_comps\")) {\n                    switch (op) {\n                      case \"<=\":\n                        self.operator = \">\";\n                        return self;\n\n                      case \"<\":\n                        self.operator = \">=\";\n                        return self;\n\n                      case \">=\":\n                        self.operator = \"<\";\n                        return self;\n\n                      case \">\":\n                        self.operator = \"<=\";\n                        return self;\n                    }\n                }\n                switch (op) {\n                  case \"==\":\n                    self.operator = \"!=\";\n                    return self;\n\n                  case \"!=\":\n                    self.operator = \"==\";\n                    return self;\n\n                  case \"===\":\n                    self.operator = \"!==\";\n                    return self;\n\n                  case \"!==\":\n                    self.operator = \"===\";\n                    return self;\n\n                  case \"&&\":\n                    self.operator = \"||\";\n                    self.left = self.left.negate(compressor);\n                    self.right = self.right.negate(compressor);\n                    return best_of(basic_negation(this), self);\n\n                  case \"||\":\n                    self.operator = \"&&\";\n                    self.left = self.left.negate(compressor);\n                    self.right = self.right.negate(compressor);\n                    return best_of(basic_negation(this), self);\n                }\n                return basic_negation(this);\n            });\n        })(function(node, func) {\n            node.DEFMETHOD(\"negate\", function(compressor) {\n                return func.call(this, compressor);\n            });\n        });\n        (function(def) {\n            def(AST_Node, function(compressor) {\n                return true;\n            });\n            def(AST_EmptyStatement, function(compressor) {\n                return false;\n            });\n            def(AST_Constant, function(compressor) {\n                return false;\n            });\n            def(AST_This, function(compressor) {\n                return false;\n            });\n            def(AST_Call, function(compressor) {\n                var pure = compressor.option(\"pure_funcs\");\n                if (!pure) return true;\n                return pure.indexOf(this.expression.print_to_string()) < 0;\n            });\n            def(AST_Block, function(compressor) {\n                for (var i = this.body.length; --i >= 0; ) {\n                    if (this.body[i].has_side_effects(compressor)) return true;\n                }\n                return false;\n            });\n            def(AST_SimpleStatement, function(compressor) {\n                return this.body.has_side_effects(compressor);\n            });\n            def(AST_Defun, function(compressor) {\n                return true;\n            });\n            def(AST_Function, function(compressor) {\n                return false;\n            });\n            def(AST_Binary, function(compressor) {\n                return this.left.has_side_effects(compressor) || this.right.has_side_effects(compressor);\n            });\n            def(AST_Assign, function(compressor) {\n                return true;\n            });\n            def(AST_Conditional, function(compressor) {\n                return this.condition.has_side_effects(compressor) || this.consequent.has_side_effects(compressor) || this.alternative.has_side_effects(compressor);\n            });\n            def(AST_Unary, function(compressor) {\n                return this.operator == \"delete\" || this.operator == \"++\" || this.operator == \"--\" || this.expression.has_side_effects(compressor);\n            });\n            def(AST_SymbolRef, function(compressor) {\n                return false;\n            });\n            def(AST_Object, function(compressor) {\n                for (var i = this.properties.length; --i >= 0; ) if (this.properties[i].has_side_effects(compressor)) return true;\n                return false;\n            });\n            def(AST_ObjectProperty, function(compressor) {\n                return this.value.has_side_effects(compressor);\n            });\n            def(AST_Array, function(compressor) {\n                for (var i = this.elements.length; --i >= 0; ) if (this.elements[i].has_side_effects(compressor)) return true;\n                return false;\n            });\n            def(AST_Dot, function(compressor) {\n                if (!compressor.option(\"pure_getters\")) return true;\n                return this.expression.has_side_effects(compressor);\n            });\n            def(AST_Sub, function(compressor) {\n                if (!compressor.option(\"pure_getters\")) return true;\n                return this.expression.has_side_effects(compressor) || this.property.has_side_effects(compressor);\n            });\n            def(AST_PropAccess, function(compressor) {\n                return !compressor.option(\"pure_getters\");\n            });\n            def(AST_Seq, function(compressor) {\n                return this.car.has_side_effects(compressor) || this.cdr.has_side_effects(compressor);\n            });\n        })(function(node, func) {\n            node.DEFMETHOD(\"has_side_effects\", func);\n        });\n        function aborts(thing) {\n            return thing && thing.aborts();\n        }\n        (function(def) {\n            def(AST_Statement, function() {\n                return null;\n            });\n            def(AST_Jump, function() {\n                return this;\n            });\n            function block_aborts() {\n                var n = this.body.length;\n                return n > 0 && aborts(this.body[n - 1]);\n            }\n            def(AST_BlockStatement, block_aborts);\n            def(AST_SwitchBranch, block_aborts);\n            def(AST_If, function() {\n                return this.alternative && aborts(this.body) && aborts(this.alternative);\n            });\n        })(function(node, func) {\n            node.DEFMETHOD(\"aborts\", func);\n        });\n        OPT(AST_Directive, function(self, compressor) {\n            if (self.scope.has_directive(self.value) !== self.scope) {\n                return make_node(AST_EmptyStatement, self);\n            }\n            return self;\n        });\n        OPT(AST_Debugger, function(self, compressor) {\n            if (compressor.option(\"drop_debugger\")) return make_node(AST_EmptyStatement, self);\n            return self;\n        });\n        OPT(AST_LabeledStatement, function(self, compressor) {\n            if (self.body instanceof AST_Break && compressor.loopcontrol_target(self.body.label) === self.body) {\n                return make_node(AST_EmptyStatement, self);\n            }\n            return self.label.references.length == 0 ? self.body : self;\n        });\n        OPT(AST_Block, function(self, compressor) {\n            self.body = tighten_body(self.body, compressor);\n            return self;\n        });\n        OPT(AST_BlockStatement, function(self, compressor) {\n            self.body = tighten_body(self.body, compressor);\n            switch (self.body.length) {\n              case 1:\n                return self.body[0];\n\n              case 0:\n                return make_node(AST_EmptyStatement, self);\n            }\n            return self;\n        });\n        AST_Scope.DEFMETHOD(\"drop_unused\", function(compressor) {\n            var self = this;\n            if (compressor.option(\"unused\") && !(self instanceof AST_Toplevel) && !self.uses_eval) {\n                var in_use = [];\n                var initializations = new Dictionary();\n                var scope = this;\n                var tw = new TreeWalker(function(node, descend) {\n                    if (node !== self) {\n                        if (node instanceof AST_Defun) {\n                            initializations.add(node.name.name, node);\n                            return true;\n                        }\n                        if (node instanceof AST_Definitions && scope === self) {\n                            node.definitions.forEach(function(def) {\n                                if (def.value) {\n                                    initializations.add(def.name.name, def.value);\n                                    if (def.value.has_side_effects(compressor)) {\n                                        def.value.walk(tw);\n                                    }\n                                }\n                            });\n                            return true;\n                        }\n                        if (node instanceof AST_SymbolRef) {\n                            push_uniq(in_use, node.definition());\n                            return true;\n                        }\n                        if (node instanceof AST_Scope) {\n                            var save_scope = scope;\n                            scope = node;\n                            descend();\n                            scope = save_scope;\n                            return true;\n                        }\n                    }\n                });\n                self.walk(tw);\n                for (var i = 0; i < in_use.length; ++i) {\n                    in_use[i].orig.forEach(function(decl) {\n                        var init = initializations.get(decl.name);\n                        if (init) init.forEach(function(init) {\n                            var tw = new TreeWalker(function(node) {\n                                if (node instanceof AST_SymbolRef) {\n                                    push_uniq(in_use, node.definition());\n                                }\n                            });\n                            init.walk(tw);\n                        });\n                    });\n                }\n                var tt = new TreeTransformer(function before(node, descend, in_list) {\n                    if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {\n                        if (!compressor.option(\"keep_fargs\")) {\n                            for (var a = node.argnames, i = a.length; --i >= 0; ) {\n                                var sym = a[i];\n                                if (sym.unreferenced()) {\n                                    a.pop();\n                                    compressor.warn(\"Dropping unused function argument {name} [{file}:{line},{col}]\", {\n                                        name: sym.name,\n                                        file: sym.start.file,\n                                        line: sym.start.line,\n                                        col: sym.start.col\n                                    });\n                                } else break;\n                            }\n                        }\n                    }\n                    if (node instanceof AST_Defun && node !== self) {\n                        if (!member(node.name.definition(), in_use)) {\n                            compressor.warn(\"Dropping unused function {name} [{file}:{line},{col}]\", {\n                                name: node.name.name,\n                                file: node.name.start.file,\n                                line: node.name.start.line,\n                                col: node.name.start.col\n                            });\n                            return make_node(AST_EmptyStatement, node);\n                        }\n                        return node;\n                    }\n                    if (node instanceof AST_Definitions && !(tt.parent() instanceof AST_ForIn)) {\n                        var def = node.definitions.filter(function(def) {\n                            if (member(def.name.definition(), in_use)) return true;\n                            var w = {\n                                name: def.name.name,\n                                file: def.name.start.file,\n                                line: def.name.start.line,\n                                col: def.name.start.col\n                            };\n                            if (def.value && def.value.has_side_effects(compressor)) {\n                                def._unused_side_effects = true;\n                                compressor.warn(\"Side effects in initialization of unused variable {name} [{file}:{line},{col}]\", w);\n                                return true;\n                            }\n                            compressor.warn(\"Dropping unused variable {name} [{file}:{line},{col}]\", w);\n                            return false;\n                        });\n                        def = mergeSort(def, function(a, b) {\n                            if (!a.value && b.value) return -1;\n                            if (!b.value && a.value) return 1;\n                            return 0;\n                        });\n                        var side_effects = [];\n                        for (var i = 0; i < def.length; ) {\n                            var x = def[i];\n                            if (x._unused_side_effects) {\n                                side_effects.push(x.value);\n                                def.splice(i, 1);\n                            } else {\n                                if (side_effects.length > 0) {\n                                    side_effects.push(x.value);\n                                    x.value = AST_Seq.from_array(side_effects);\n                                    side_effects = [];\n                                }\n                                ++i;\n                            }\n                        }\n                        if (side_effects.length > 0) {\n                            side_effects = make_node(AST_BlockStatement, node, {\n                                body: [ make_node(AST_SimpleStatement, node, {\n                                    body: AST_Seq.from_array(side_effects)\n                                }) ]\n                            });\n                        } else {\n                            side_effects = null;\n                        }\n                        if (def.length == 0 && !side_effects) {\n                            return make_node(AST_EmptyStatement, node);\n                        }\n                        if (def.length == 0) {\n                            return side_effects;\n                        }\n                        node.definitions = def;\n                        if (side_effects) {\n                            side_effects.body.unshift(node);\n                            node = side_effects;\n                        }\n                        return node;\n                    }\n                    if (node instanceof AST_For) {\n                        descend(node, this);\n                        if (node.init instanceof AST_BlockStatement) {\n                            var body = node.init.body.slice(0, -1);\n                            node.init = node.init.body.slice(-1)[0].body;\n                            body.push(node);\n                            return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, {\n                                body: body\n                            });\n                        }\n                    }\n                    if (node instanceof AST_Scope && node !== self) return node;\n                });\n                self.transform(tt);\n            }\n        });\n        AST_Scope.DEFMETHOD(\"hoist_declarations\", function(compressor) {\n            var hoist_funs = compressor.option(\"hoist_funs\");\n            var hoist_vars = compressor.option(\"hoist_vars\");\n            var self = this;\n            if (hoist_funs || hoist_vars) {\n                var dirs = [];\n                var hoisted = [];\n                var vars = new Dictionary(), vars_found = 0, var_decl = 0;\n                self.walk(new TreeWalker(function(node) {\n                    if (node instanceof AST_Scope && node !== self) return true;\n                    if (node instanceof AST_Var) {\n                        ++var_decl;\n                        return true;\n                    }\n                }));\n                hoist_vars = hoist_vars && var_decl > 1;\n                var tt = new TreeTransformer(function before(node) {\n                    if (node !== self) {\n                        if (node instanceof AST_Directive) {\n                            dirs.push(node);\n                            return make_node(AST_EmptyStatement, node);\n                        }\n                        if (node instanceof AST_Defun && hoist_funs) {\n                            hoisted.push(node);\n                            return make_node(AST_EmptyStatement, node);\n                        }\n                        if (node instanceof AST_Var && hoist_vars) {\n                            node.definitions.forEach(function(def) {\n                                vars.set(def.name.name, def);\n                                ++vars_found;\n                            });\n                            var seq = node.to_assignments();\n                            var p = tt.parent();\n                            if (p instanceof AST_ForIn && p.init === node) {\n                                if (seq == null) return node.definitions[0].name;\n                                return seq;\n                            }\n                            if (p instanceof AST_For && p.init === node) {\n                                return seq;\n                            }\n                            if (!seq) return make_node(AST_EmptyStatement, node);\n                            return make_node(AST_SimpleStatement, node, {\n                                body: seq\n                            });\n                        }\n                        if (node instanceof AST_Scope) return node;\n                    }\n                });\n                self = self.transform(tt);\n                if (vars_found > 0) {\n                    var defs = [];\n                    vars.each(function(def, name) {\n                        if (self instanceof AST_Lambda && find_if(function(x) {\n                            return x.name == def.name.name;\n                        }, self.argnames)) {\n                            vars.del(name);\n                        } else {\n                            def = def.clone();\n                            def.value = null;\n                            defs.push(def);\n                            vars.set(name, def);\n                        }\n                    });\n                    if (defs.length > 0) {\n                        for (var i = 0; i < self.body.length; ) {\n                            if (self.body[i] instanceof AST_SimpleStatement) {\n                                var expr = self.body[i].body, sym, assign;\n                                if (expr instanceof AST_Assign && expr.operator == \"=\" && (sym = expr.left) instanceof AST_Symbol && vars.has(sym.name)) {\n                                    var def = vars.get(sym.name);\n                                    if (def.value) break;\n                                    def.value = expr.right;\n                                    remove(defs, def);\n                                    defs.push(def);\n                                    self.body.splice(i, 1);\n                                    continue;\n                                }\n                                if (expr instanceof AST_Seq && (assign = expr.car) instanceof AST_Assign && assign.operator == \"=\" && (sym = assign.left) instanceof AST_Symbol && vars.has(sym.name)) {\n                                    var def = vars.get(sym.name);\n                                    if (def.value) break;\n                                    def.value = assign.right;\n                                    remove(defs, def);\n                                    defs.push(def);\n                                    self.body[i].body = expr.cdr;\n                                    continue;\n                                }\n                            }\n                            if (self.body[i] instanceof AST_EmptyStatement) {\n                                self.body.splice(i, 1);\n                                continue;\n                            }\n                            if (self.body[i] instanceof AST_BlockStatement) {\n                                var tmp = [ i, 1 ].concat(self.body[i].body);\n                                self.body.splice.apply(self.body, tmp);\n                                continue;\n                            }\n                            break;\n                        }\n                        defs = make_node(AST_Var, self, {\n                            definitions: defs\n                        });\n                        hoisted.push(defs);\n                    }\n                }\n                self.body = dirs.concat(hoisted, self.body);\n            }\n            return self;\n        });\n        OPT(AST_SimpleStatement, function(self, compressor) {\n            if (compressor.option(\"side_effects\")) {\n                if (!self.body.has_side_effects(compressor)) {\n                    compressor.warn(\"Dropping side-effect-free statement [{file}:{line},{col}]\", self.start);\n                    return make_node(AST_EmptyStatement, self);\n                }\n            }\n            return self;\n        });\n        OPT(AST_DWLoop, function(self, compressor) {\n            var cond = self.condition.evaluate(compressor);\n            self.condition = cond[0];\n            if (!compressor.option(\"loops\")) return self;\n            if (cond.length > 1) {\n                if (cond[1]) {\n                    return make_node(AST_For, self, {\n                        body: self.body\n                    });\n                } else if (self instanceof AST_While) {\n                    if (compressor.option(\"dead_code\")) {\n                        var a = [];\n                        extract_declarations_from_unreachable_code(compressor, self.body, a);\n                        return make_node(AST_BlockStatement, self, {\n                            body: a\n                        });\n                    }\n                }\n            }\n            return self;\n        });\n        function if_break_in_loop(self, compressor) {\n            function drop_it(rest) {\n                rest = as_statement_array(rest);\n                if (self.body instanceof AST_BlockStatement) {\n                    self.body = self.body.clone();\n                    self.body.body = rest.concat(self.body.body.slice(1));\n                    self.body = self.body.transform(compressor);\n                } else {\n                    self.body = make_node(AST_BlockStatement, self.body, {\n                        body: rest\n                    }).transform(compressor);\n                }\n                if_break_in_loop(self, compressor);\n            }\n            var first = self.body instanceof AST_BlockStatement ? self.body.body[0] : self.body;\n            if (first instanceof AST_If) {\n                if (first.body instanceof AST_Break && compressor.loopcontrol_target(first.body.label) === self) {\n                    if (self.condition) {\n                        self.condition = make_node(AST_Binary, self.condition, {\n                            left: self.condition,\n                            operator: \"&&\",\n                            right: first.condition.negate(compressor)\n                        });\n                    } else {\n                        self.condition = first.condition.negate(compressor);\n                    }\n                    drop_it(first.alternative);\n                } else if (first.alternative instanceof AST_Break && compressor.loopcontrol_target(first.alternative.label) === self) {\n                    if (self.condition) {\n                        self.condition = make_node(AST_Binary, self.condition, {\n                            left: self.condition,\n                            operator: \"&&\",\n                            right: first.condition\n                        });\n                    } else {\n                        self.condition = first.condition;\n                    }\n                    drop_it(first.body);\n                }\n            }\n        }\n        OPT(AST_While, function(self, compressor) {\n            if (!compressor.option(\"loops\")) return self;\n            self = AST_DWLoop.prototype.optimize.call(self, compressor);\n            if (self instanceof AST_While) {\n                if_break_in_loop(self, compressor);\n                self = make_node(AST_For, self, self).transform(compressor);\n            }\n            return self;\n        });\n        OPT(AST_For, function(self, compressor) {\n            var cond = self.condition;\n            if (cond) {\n                cond = cond.evaluate(compressor);\n                self.condition = cond[0];\n            }\n            if (!compressor.option(\"loops\")) return self;\n            if (cond) {\n                if (cond.length > 1 && !cond[1]) {\n                    if (compressor.option(\"dead_code\")) {\n                        var a = [];\n                        if (self.init instanceof AST_Statement) {\n                            a.push(self.init);\n                        } else if (self.init) {\n                            a.push(make_node(AST_SimpleStatement, self.init, {\n                                body: self.init\n                            }));\n                        }\n                        extract_declarations_from_unreachable_code(compressor, self.body, a);\n                        return make_node(AST_BlockStatement, self, {\n                            body: a\n                        });\n                    }\n                }\n            }\n            if_break_in_loop(self, compressor);\n            return self;\n        });\n        OPT(AST_If, function(self, compressor) {\n            if (!compressor.option(\"conditionals\")) return self;\n            var cond = self.condition.evaluate(compressor);\n            self.condition = cond[0];\n            if (cond.length > 1) {\n                if (cond[1]) {\n                    compressor.warn(\"Condition always true [{file}:{line},{col}]\", self.condition.start);\n                    if (compressor.option(\"dead_code\")) {\n                        var a = [];\n                        if (self.alternative) {\n                            extract_declarations_from_unreachable_code(compressor, self.alternative, a);\n                        }\n                        a.push(self.body);\n                        return make_node(AST_BlockStatement, self, {\n                            body: a\n                        }).transform(compressor);\n                    }\n                } else {\n                    compressor.warn(\"Condition always false [{file}:{line},{col}]\", self.condition.start);\n                    if (compressor.option(\"dead_code\")) {\n                        var a = [];\n                        extract_declarations_from_unreachable_code(compressor, self.body, a);\n                        if (self.alternative) a.push(self.alternative);\n                        return make_node(AST_BlockStatement, self, {\n                            body: a\n                        }).transform(compressor);\n                    }\n                }\n            }\n            if (is_empty(self.alternative)) self.alternative = null;\n            var negated = self.condition.negate(compressor);\n            var negated_is_best = best_of(self.condition, negated) === negated;\n            if (self.alternative && negated_is_best) {\n                negated_is_best = false;\n                self.condition = negated;\n                var tmp = self.body;\n                self.body = self.alternative || make_node(AST_EmptyStatement);\n                self.alternative = tmp;\n            }\n            if (is_empty(self.body) && is_empty(self.alternative)) {\n                return make_node(AST_SimpleStatement, self.condition, {\n                    body: self.condition\n                }).transform(compressor);\n            }\n            if (self.body instanceof AST_SimpleStatement && self.alternative instanceof AST_SimpleStatement) {\n                return make_node(AST_SimpleStatement, self, {\n                    body: make_node(AST_Conditional, self, {\n                        condition: self.condition,\n                        consequent: self.body.body,\n                        alternative: self.alternative.body\n                    })\n                }).transform(compressor);\n            }\n            if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) {\n                if (negated_is_best) return make_node(AST_SimpleStatement, self, {\n                    body: make_node(AST_Binary, self, {\n                        operator: \"||\",\n                        left: negated,\n                        right: self.body.body\n                    })\n                }).transform(compressor);\n                return make_node(AST_SimpleStatement, self, {\n                    body: make_node(AST_Binary, self, {\n                        operator: \"&&\",\n                        left: self.condition,\n                        right: self.body.body\n                    })\n                }).transform(compressor);\n            }\n            if (self.body instanceof AST_EmptyStatement && self.alternative && self.alternative instanceof AST_SimpleStatement) {\n                return make_node(AST_SimpleStatement, self, {\n                    body: make_node(AST_Binary, self, {\n                        operator: \"||\",\n                        left: self.condition,\n                        right: self.alternative.body\n                    })\n                }).transform(compressor);\n            }\n            if (self.body instanceof AST_Exit && self.alternative instanceof AST_Exit && self.body.TYPE == self.alternative.TYPE) {\n                return make_node(self.body.CTOR, self, {\n                    value: make_node(AST_Conditional, self, {\n                        condition: self.condition,\n                        consequent: self.body.value || make_node(AST_Undefined, self.body).optimize(compressor),\n                        alternative: self.alternative.value || make_node(AST_Undefined, self.alternative).optimize(compressor)\n                    })\n                }).transform(compressor);\n            }\n            if (self.body instanceof AST_If && !self.body.alternative && !self.alternative) {\n                self.condition = make_node(AST_Binary, self.condition, {\n                    operator: \"&&\",\n                    left: self.condition,\n                    right: self.body.condition\n                }).transform(compressor);\n                self.body = self.body.body;\n            }\n            if (aborts(self.body)) {\n                if (self.alternative) {\n                    var alt = self.alternative;\n                    self.alternative = null;\n                    return make_node(AST_BlockStatement, self, {\n                        body: [ self, alt ]\n                    }).transform(compressor);\n                }\n            }\n            if (aborts(self.alternative)) {\n                var body = self.body;\n                self.body = self.alternative;\n                self.condition = negated_is_best ? negated : self.condition.negate(compressor);\n                self.alternative = null;\n                return make_node(AST_BlockStatement, self, {\n                    body: [ self, body ]\n                }).transform(compressor);\n            }\n            return self;\n        });\n        OPT(AST_Switch, function(self, compressor) {\n            if (self.body.length == 0 && compressor.option(\"conditionals\")) {\n                return make_node(AST_SimpleStatement, self, {\n                    body: self.expression\n                }).transform(compressor);\n            }\n            for (;;) {\n                var last_branch = self.body[self.body.length - 1];\n                if (last_branch) {\n                    var stat = last_branch.body[last_branch.body.length - 1];\n                    if (stat instanceof AST_Break && loop_body(compressor.loopcontrol_target(stat.label)) === self) last_branch.body.pop();\n                    if (last_branch instanceof AST_Default && last_branch.body.length == 0) {\n                        self.body.pop();\n                        continue;\n                    }\n                }\n                break;\n            }\n            var exp = self.expression.evaluate(compressor);\n            out: if (exp.length == 2) try {\n                self.expression = exp[0];\n                if (!compressor.option(\"dead_code\")) break out;\n                var value = exp[1];\n                var in_if = false;\n                var in_block = false;\n                var started = false;\n                var stopped = false;\n                var ruined = false;\n                var tt = new TreeTransformer(function(node, descend, in_list) {\n                    if (node instanceof AST_Lambda || node instanceof AST_SimpleStatement) {\n                        return node;\n                    } else if (node instanceof AST_Switch && node === self) {\n                        node = node.clone();\n                        descend(node, this);\n                        return ruined ? node : make_node(AST_BlockStatement, node, {\n                            body: node.body.reduce(function(a, branch) {\n                                return a.concat(branch.body);\n                            }, [])\n                        }).transform(compressor);\n                    } else if (node instanceof AST_If || node instanceof AST_Try) {\n                        var save = in_if;\n                        in_if = !in_block;\n                        descend(node, this);\n                        in_if = save;\n                        return node;\n                    } else if (node instanceof AST_StatementWithBody || node instanceof AST_Switch) {\n                        var save = in_block;\n                        in_block = true;\n                        descend(node, this);\n                        in_block = save;\n                        return node;\n                    } else if (node instanceof AST_Break && this.loopcontrol_target(node.label) === self) {\n                        if (in_if) {\n                            ruined = true;\n                            return node;\n                        }\n                        if (in_block) return node;\n                        stopped = true;\n                        return in_list ? MAP.skip : make_node(AST_EmptyStatement, node);\n                    } else if (node instanceof AST_SwitchBranch && this.parent() === self) {\n                        if (stopped) return MAP.skip;\n                        if (node instanceof AST_Case) {\n                            var exp = node.expression.evaluate(compressor);\n                            if (exp.length < 2) {\n                                throw self;\n                            }\n                            if (exp[1] === value || started) {\n                                started = true;\n                                if (aborts(node)) stopped = true;\n                                descend(node, this);\n                                return node;\n                            }\n                            return MAP.skip;\n                        }\n                        descend(node, this);\n                        return node;\n                    }\n                });\n                tt.stack = compressor.stack.slice();\n                self = self.transform(tt);\n            } catch (ex) {\n                if (ex !== self) throw ex;\n            }\n            return self;\n        });\n        OPT(AST_Case, function(self, compressor) {\n            self.body = tighten_body(self.body, compressor);\n            return self;\n        });\n        OPT(AST_Try, function(self, compressor) {\n            self.body = tighten_body(self.body, compressor);\n            return self;\n        });\n        AST_Definitions.DEFMETHOD(\"remove_initializers\", function() {\n            this.definitions.forEach(function(def) {\n                def.value = null;\n            });\n        });\n        AST_Definitions.DEFMETHOD(\"to_assignments\", function() {\n            var assignments = this.definitions.reduce(function(a, def) {\n                if (def.value) {\n                    var name = make_node(AST_SymbolRef, def.name, def.name);\n                    a.push(make_node(AST_Assign, def, {\n                        operator: \"=\",\n                        left: name,\n                        right: def.value\n                    }));\n                }\n                return a;\n            }, []);\n            if (assignments.length == 0) return null;\n            return AST_Seq.from_array(assignments);\n        });\n        OPT(AST_Definitions, function(self, compressor) {\n            if (self.definitions.length == 0) return make_node(AST_EmptyStatement, self);\n            return self;\n        });\n        OPT(AST_Function, function(self, compressor) {\n            self = AST_Lambda.prototype.optimize.call(self, compressor);\n            if (compressor.option(\"unused\")) {\n                if (self.name && self.name.unreferenced()) {\n                    self.name = null;\n                }\n            }\n            return self;\n        });\n        OPT(AST_Call, function(self, compressor) {\n            if (compressor.option(\"unsafe\")) {\n                var exp = self.expression;\n                if (exp instanceof AST_SymbolRef && exp.undeclared()) {\n                    switch (exp.name) {\n                      case \"Array\":\n                        if (self.args.length != 1) {\n                            return make_node(AST_Array, self, {\n                                elements: self.args\n                            }).transform(compressor);\n                        }\n                        break;\n\n                      case \"Object\":\n                        if (self.args.length == 0) {\n                            return make_node(AST_Object, self, {\n                                properties: []\n                            });\n                        }\n                        break;\n\n                      case \"String\":\n                        if (self.args.length == 0) return make_node(AST_String, self, {\n                            value: \"\"\n                        });\n                        if (self.args.length <= 1) return make_node(AST_Binary, self, {\n                            left: self.args[0],\n                            operator: \"+\",\n                            right: make_node(AST_String, self, {\n                                value: \"\"\n                            })\n                        }).transform(compressor);\n                        break;\n\n                      case \"Number\":\n                        if (self.args.length == 0) return make_node(AST_Number, self, {\n                            value: 0\n                        });\n                        if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, {\n                            expression: self.args[0],\n                            operator: \"+\"\n                        }).transform(compressor);\n\n                      case \"Boolean\":\n                        if (self.args.length == 0) return make_node(AST_False, self);\n                        if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, {\n                            expression: make_node(AST_UnaryPrefix, null, {\n                                expression: self.args[0],\n                                operator: \"!\"\n                            }),\n                            operator: \"!\"\n                        }).transform(compressor);\n                        break;\n\n                      case \"Function\":\n                        if (all(self.args, function(x) {\n                            return x instanceof AST_String;\n                        })) {\n                            try {\n                                var code = \"(function(\" + self.args.slice(0, -1).map(function(arg) {\n                                    return arg.value;\n                                }).join(\",\") + \"){\" + self.args[self.args.length - 1].value + \"})()\";\n                                var ast = parse(code);\n                                ast.figure_out_scope({\n                                    screw_ie8: compressor.option(\"screw_ie8\")\n                                });\n                                var comp = new Compressor(compressor.options);\n                                ast = ast.transform(comp);\n                                ast.figure_out_scope({\n                                    screw_ie8: compressor.option(\"screw_ie8\")\n                                });\n                                ast.mangle_names();\n                                var fun;\n                                try {\n                                    ast.walk(new TreeWalker(function(node) {\n                                        if (node instanceof AST_Lambda) {\n                                            fun = node;\n                                            throw ast;\n                                        }\n                                    }));\n                                } catch (ex) {\n                                    if (ex !== ast) throw ex;\n                                }\n                                var args = fun.argnames.map(function(arg, i) {\n                                    return make_node(AST_String, self.args[i], {\n                                        value: arg.print_to_string()\n                                    });\n                                });\n                                var code = OutputStream();\n                                AST_BlockStatement.prototype._codegen.call(fun, fun, code);\n                                code = code.toString().replace(/^\\{|\\}$/g, \"\");\n                                args.push(make_node(AST_String, self.args[self.args.length - 1], {\n                                    value: code\n                                }));\n                                self.args = args;\n                                return self;\n                            } catch (ex) {\n                                if (ex instanceof JS_Parse_Error) {\n                                    compressor.warn(\"Error parsing code passed to new Function [{file}:{line},{col}]\", self.args[self.args.length - 1].start);\n                                    compressor.warn(ex.toString());\n                                } else {\n                                    console.log(ex);\n                                    throw ex;\n                                }\n                            }\n                        }\n                        break;\n                    }\n                } else if (exp instanceof AST_Dot && exp.property == \"toString\" && self.args.length == 0) {\n                    return make_node(AST_Binary, self, {\n                        left: make_node(AST_String, self, {\n                            value: \"\"\n                        }),\n                        operator: \"+\",\n                        right: exp.expression\n                    }).transform(compressor);\n                } else if (exp instanceof AST_Dot && exp.expression instanceof AST_Array && exp.property == \"join\") EXIT: {\n                    var separator = self.args.length == 0 ? \",\" : self.args[0].evaluate(compressor)[1];\n                    if (separator == null) break EXIT;\n                    var elements = exp.expression.elements.reduce(function(a, el) {\n                        el = el.evaluate(compressor);\n                        if (a.length == 0 || el.length == 1) {\n                            a.push(el);\n                        } else {\n                            var last = a[a.length - 1];\n                            if (last.length == 2) {\n                                var val = \"\" + last[1] + separator + el[1];\n                                a[a.length - 1] = [ make_node_from_constant(compressor, val, last[0]), val ];\n                            } else {\n                                a.push(el);\n                            }\n                        }\n                        return a;\n                    }, []);\n                    if (elements.length == 0) return make_node(AST_String, self, {\n                        value: \"\"\n                    });\n                    if (elements.length == 1) return elements[0][0];\n                    if (separator == \"\") {\n                        var first;\n                        if (elements[0][0] instanceof AST_String || elements[1][0] instanceof AST_String) {\n                            first = elements.shift()[0];\n                        } else {\n                            first = make_node(AST_String, self, {\n                                value: \"\"\n                            });\n                        }\n                        return elements.reduce(function(prev, el) {\n                            return make_node(AST_Binary, el[0], {\n                                operator: \"+\",\n                                left: prev,\n                                right: el[0]\n                            });\n                        }, first).transform(compressor);\n                    }\n                    var node = self.clone();\n                    node.expression = node.expression.clone();\n                    node.expression.expression = node.expression.expression.clone();\n                    node.expression.expression.elements = elements.map(function(el) {\n                        return el[0];\n                    });\n                    return best_of(self, node);\n                }\n            }\n            if (compressor.option(\"side_effects\")) {\n                if (self.expression instanceof AST_Function && self.args.length == 0 && !AST_Block.prototype.has_side_effects.call(self.expression, compressor)) {\n                    return make_node(AST_Undefined, self).transform(compressor);\n                }\n            }\n            if (compressor.option(\"drop_console\")) {\n                if (self.expression instanceof AST_PropAccess && self.expression.expression instanceof AST_SymbolRef && self.expression.expression.name == \"console\" && self.expression.expression.undeclared()) {\n                    return make_node(AST_Undefined, self).transform(compressor);\n                }\n            }\n            return self.evaluate(compressor)[0];\n        });\n        OPT(AST_New, function(self, compressor) {\n            if (compressor.option(\"unsafe\")) {\n                var exp = self.expression;\n                if (exp instanceof AST_SymbolRef && exp.undeclared()) {\n                    switch (exp.name) {\n                      case \"Object\":\n                      case \"RegExp\":\n                      case \"Function\":\n                      case \"Error\":\n                      case \"Array\":\n                        return make_node(AST_Call, self, self).transform(compressor);\n                    }\n                }\n            }\n            return self;\n        });\n        OPT(AST_Seq, function(self, compressor) {\n            if (!compressor.option(\"side_effects\")) return self;\n            if (!self.car.has_side_effects(compressor)) {\n                var p;\n                if (!(self.cdr instanceof AST_SymbolRef && self.cdr.name == \"eval\" && self.cdr.undeclared() && (p = compressor.parent()) instanceof AST_Call && p.expression === self)) {\n                    return self.cdr;\n                }\n            }\n            if (compressor.option(\"cascade\")) {\n                if (self.car instanceof AST_Assign && !self.car.left.has_side_effects(compressor)) {\n                    if (self.car.left.equivalent_to(self.cdr)) {\n                        return self.car;\n                    }\n                    if (self.cdr instanceof AST_Call && self.cdr.expression.equivalent_to(self.car.left)) {\n                        self.cdr.expression = self.car;\n                        return self.cdr;\n                    }\n                }\n                if (!self.car.has_side_effects(compressor) && !self.cdr.has_side_effects(compressor) && self.car.equivalent_to(self.cdr)) {\n                    return self.car;\n                }\n            }\n            if (self.cdr instanceof AST_UnaryPrefix && self.cdr.operator == \"void\" && !self.cdr.expression.has_side_effects(compressor)) {\n                self.cdr.operator = self.car;\n                return self.cdr;\n            }\n            if (self.cdr instanceof AST_Undefined) {\n                return make_node(AST_UnaryPrefix, self, {\n                    operator: \"void\",\n                    expression: self.car\n                });\n            }\n            return self;\n        });\n        AST_Unary.DEFMETHOD(\"lift_sequences\", function(compressor) {\n            if (compressor.option(\"sequences\")) {\n                if (this.expression instanceof AST_Seq) {\n                    var seq = this.expression;\n                    var x = seq.to_array();\n                    this.expression = x.pop();\n                    x.push(this);\n                    seq = AST_Seq.from_array(x).transform(compressor);\n                    return seq;\n                }\n            }\n            return this;\n        });\n        OPT(AST_UnaryPostfix, function(self, compressor) {\n            return self.lift_sequences(compressor);\n        });\n        OPT(AST_UnaryPrefix, function(self, compressor) {\n            self = self.lift_sequences(compressor);\n            var e = self.expression;\n            if (compressor.option(\"booleans\") && compressor.in_boolean_context()) {\n                switch (self.operator) {\n                  case \"!\":\n                    if (e instanceof AST_UnaryPrefix && e.operator == \"!\") {\n                        return e.expression;\n                    }\n                    break;\n\n                  case \"typeof\":\n                    compressor.warn(\"Boolean expression always true [{file}:{line},{col}]\", self.start);\n                    return make_node(AST_True, self);\n                }\n                if (e instanceof AST_Binary && self.operator == \"!\") {\n                    self = best_of(self, e.negate(compressor));\n                }\n            }\n            return self.evaluate(compressor)[0];\n        });\n        function has_side_effects_or_prop_access(node, compressor) {\n            var save_pure_getters = compressor.option(\"pure_getters\");\n            compressor.options.pure_getters = false;\n            var ret = node.has_side_effects(compressor);\n            compressor.options.pure_getters = save_pure_getters;\n            return ret;\n        }\n        AST_Binary.DEFMETHOD(\"lift_sequences\", function(compressor) {\n            if (compressor.option(\"sequences\")) {\n                if (this.left instanceof AST_Seq) {\n                    var seq = this.left;\n                    var x = seq.to_array();\n                    this.left = x.pop();\n                    x.push(this);\n                    seq = AST_Seq.from_array(x).transform(compressor);\n                    return seq;\n                }\n                if (this.right instanceof AST_Seq && this instanceof AST_Assign && !has_side_effects_or_prop_access(this.left, compressor)) {\n                    var seq = this.right;\n                    var x = seq.to_array();\n                    this.right = x.pop();\n                    x.push(this);\n                    seq = AST_Seq.from_array(x).transform(compressor);\n                    return seq;\n                }\n            }\n            return this;\n        });\n        var commutativeOperators = makePredicate(\"== === != !== * & | ^\");\n        OPT(AST_Binary, function(self, compressor) {\n            var reverse = compressor.has_directive(\"use asm\") ? noop : function(op, force) {\n                if (force || !(self.left.has_side_effects(compressor) || self.right.has_side_effects(compressor))) {\n                    if (op) self.operator = op;\n                    var tmp = self.left;\n                    self.left = self.right;\n                    self.right = tmp;\n                }\n            };\n            if (commutativeOperators(self.operator)) {\n                if (self.right instanceof AST_Constant && !(self.left instanceof AST_Constant)) {\n                    if (!(self.left instanceof AST_Binary && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) {\n                        reverse(null, true);\n                    }\n                }\n                if (/^[!=]==?$/.test(self.operator)) {\n                    if (self.left instanceof AST_SymbolRef && self.right instanceof AST_Conditional) {\n                        if (self.right.consequent instanceof AST_SymbolRef && self.right.consequent.definition() === self.left.definition()) {\n                            if (/^==/.test(self.operator)) return self.right.condition;\n                            if (/^!=/.test(self.operator)) return self.right.condition.negate(compressor);\n                        }\n                        if (self.right.alternative instanceof AST_SymbolRef && self.right.alternative.definition() === self.left.definition()) {\n                            if (/^==/.test(self.operator)) return self.right.condition.negate(compressor);\n                            if (/^!=/.test(self.operator)) return self.right.condition;\n                        }\n                    }\n                    if (self.right instanceof AST_SymbolRef && self.left instanceof AST_Conditional) {\n                        if (self.left.consequent instanceof AST_SymbolRef && self.left.consequent.definition() === self.right.definition()) {\n                            if (/^==/.test(self.operator)) return self.left.condition;\n                            if (/^!=/.test(self.operator)) return self.left.condition.negate(compressor);\n                        }\n                        if (self.left.alternative instanceof AST_SymbolRef && self.left.alternative.definition() === self.right.definition()) {\n                            if (/^==/.test(self.operator)) return self.left.condition.negate(compressor);\n                            if (/^!=/.test(self.operator)) return self.left.condition;\n                        }\n                    }\n                }\n            }\n            self = self.lift_sequences(compressor);\n            if (compressor.option(\"comparisons\")) switch (self.operator) {\n              case \"===\":\n              case \"!==\":\n                if (self.left.is_string(compressor) && self.right.is_string(compressor) || self.left.is_boolean() && self.right.is_boolean()) {\n                    self.operator = self.operator.substr(0, 2);\n                }\n\n              case \"==\":\n              case \"!=\":\n                if (self.left instanceof AST_String && self.left.value == \"undefined\" && self.right instanceof AST_UnaryPrefix && self.right.operator == \"typeof\" && compressor.option(\"unsafe\")) {\n                    if (!(self.right.expression instanceof AST_SymbolRef) || !self.right.expression.undeclared()) {\n                        self.right = self.right.expression;\n                        self.left = make_node(AST_Undefined, self.left).optimize(compressor);\n                        if (self.operator.length == 2) self.operator += \"=\";\n                    }\n                }\n                break;\n            }\n            if (compressor.option(\"booleans\") && compressor.in_boolean_context()) switch (self.operator) {\n              case \"&&\":\n                var ll = self.left.evaluate(compressor);\n                var rr = self.right.evaluate(compressor);\n                if (ll.length > 1 && !ll[1] || rr.length > 1 && !rr[1]) {\n                    compressor.warn(\"Boolean && always false [{file}:{line},{col}]\", self.start);\n                    return make_node(AST_False, self);\n                }\n                if (ll.length > 1 && ll[1]) {\n                    return rr[0];\n                }\n                if (rr.length > 1 && rr[1]) {\n                    return ll[0];\n                }\n                break;\n\n              case \"||\":\n                var ll = self.left.evaluate(compressor);\n                var rr = self.right.evaluate(compressor);\n                if (ll.length > 1 && ll[1] || rr.length > 1 && rr[1]) {\n                    compressor.warn(\"Boolean || always true [{file}:{line},{col}]\", self.start);\n                    return make_node(AST_True, self);\n                }\n                if (ll.length > 1 && !ll[1]) {\n                    return rr[0];\n                }\n                if (rr.length > 1 && !rr[1]) {\n                    return ll[0];\n                }\n                break;\n\n              case \"+\":\n                var ll = self.left.evaluate(compressor);\n                var rr = self.right.evaluate(compressor);\n                if (ll.length > 1 && ll[0] instanceof AST_String && ll[1] || rr.length > 1 && rr[0] instanceof AST_String && rr[1]) {\n                    compressor.warn(\"+ in boolean context always true [{file}:{line},{col}]\", self.start);\n                    return make_node(AST_True, self);\n                }\n                break;\n            }\n            if (compressor.option(\"comparisons\")) {\n                if (!(compressor.parent() instanceof AST_Binary) || compressor.parent() instanceof AST_Assign) {\n                    var negated = make_node(AST_UnaryPrefix, self, {\n                        operator: \"!\",\n                        expression: self.negate(compressor)\n                    });\n                    self = best_of(self, negated);\n                }\n                switch (self.operator) {\n                  case \"<\":\n                    reverse(\">\");\n                    break;\n\n                  case \"<=\":\n                    reverse(\">=\");\n                    break;\n                }\n            }\n            if (self.operator == \"+\" && self.right instanceof AST_String && self.right.getValue() === \"\" && self.left instanceof AST_Binary && self.left.operator == \"+\" && self.left.is_string(compressor)) {\n                return self.left;\n            }\n            if (compressor.option(\"evaluate\")) {\n                if (self.operator == \"+\") {\n                    if (self.left instanceof AST_Constant && self.right instanceof AST_Binary && self.right.operator == \"+\" && self.right.left instanceof AST_Constant && self.right.is_string(compressor)) {\n                        self = make_node(AST_Binary, self, {\n                            operator: \"+\",\n                            left: make_node(AST_String, null, {\n                                value: \"\" + self.left.getValue() + self.right.left.getValue(),\n                                start: self.left.start,\n                                end: self.right.left.end\n                            }),\n                            right: self.right.right\n                        });\n                    }\n                    if (self.right instanceof AST_Constant && self.left instanceof AST_Binary && self.left.operator == \"+\" && self.left.right instanceof AST_Constant && self.left.is_string(compressor)) {\n                        self = make_node(AST_Binary, self, {\n                            operator: \"+\",\n                            left: self.left.left,\n                            right: make_node(AST_String, null, {\n                                value: \"\" + self.left.right.getValue() + self.right.getValue(),\n                                start: self.left.right.start,\n                                end: self.right.end\n                            })\n                        });\n                    }\n                    if (self.left instanceof AST_Binary && self.left.operator == \"+\" && self.left.is_string(compressor) && self.left.right instanceof AST_Constant && self.right instanceof AST_Binary && self.right.operator == \"+\" && self.right.left instanceof AST_Constant && self.right.is_string(compressor)) {\n                        self = make_node(AST_Binary, self, {\n                            operator: \"+\",\n                            left: make_node(AST_Binary, self.left, {\n                                operator: \"+\",\n                                left: self.left.left,\n                                right: make_node(AST_String, null, {\n                                    value: \"\" + self.left.right.getValue() + self.right.left.getValue(),\n                                    start: self.left.right.start,\n                                    end: self.right.left.end\n                                })\n                            }),\n                            right: self.right.right\n                        });\n                    }\n                }\n            }\n            if (self.right instanceof AST_Binary && self.right.operator == self.operator && (self.operator == \"*\" || self.operator == \"&&\" || self.operator == \"||\")) {\n                self.left = make_node(AST_Binary, self.left, {\n                    operator: self.operator,\n                    left: self.left,\n                    right: self.right.left\n                });\n                self.right = self.right.right;\n                return self.transform(compressor);\n            }\n            return self.evaluate(compressor)[0];\n        });\n        OPT(AST_SymbolRef, function(self, compressor) {\n            if (self.undeclared()) {\n                var defines = compressor.option(\"global_defs\");\n                if (defines && defines.hasOwnProperty(self.name)) {\n                    return make_node_from_constant(compressor, defines[self.name], self);\n                }\n                switch (self.name) {\n                  case \"undefined\":\n                    return make_node(AST_Undefined, self);\n\n                  case \"NaN\":\n                    return make_node(AST_NaN, self);\n\n                  case \"Infinity\":\n                    return make_node(AST_Infinity, self);\n                }\n            }\n            return self;\n        });\n        OPT(AST_Undefined, function(self, compressor) {\n            if (compressor.option(\"unsafe\")) {\n                var scope = compressor.find_parent(AST_Scope);\n                var undef = scope.find_variable(\"undefined\");\n                if (undef) {\n                    var ref = make_node(AST_SymbolRef, self, {\n                        name: \"undefined\",\n                        scope: scope,\n                        thedef: undef\n                    });\n                    ref.reference();\n                    return ref;\n                }\n            }\n            return self;\n        });\n        var ASSIGN_OPS = [ \"+\", \"-\", \"/\", \"*\", \"%\", \">>\", \"<<\", \">>>\", \"|\", \"^\", \"&\" ];\n        OPT(AST_Assign, function(self, compressor) {\n            self = self.lift_sequences(compressor);\n            if (self.operator == \"=\" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary && self.right.left instanceof AST_SymbolRef && self.right.left.name == self.left.name && member(self.right.operator, ASSIGN_OPS)) {\n                self.operator = self.right.operator + \"=\";\n                self.right = self.right.right;\n            }\n            return self;\n        });\n        OPT(AST_Conditional, function(self, compressor) {\n            if (!compressor.option(\"conditionals\")) return self;\n            if (self.condition instanceof AST_Seq) {\n                var car = self.condition.car;\n                self.condition = self.condition.cdr;\n                return AST_Seq.cons(car, self);\n            }\n            var cond = self.condition.evaluate(compressor);\n            if (cond.length > 1) {\n                if (cond[1]) {\n                    compressor.warn(\"Condition always true [{file}:{line},{col}]\", self.start);\n                    return self.consequent;\n                } else {\n                    compressor.warn(\"Condition always false [{file}:{line},{col}]\", self.start);\n                    return self.alternative;\n                }\n            }\n            var negated = cond[0].negate(compressor);\n            if (best_of(cond[0], negated) === negated) {\n                self = make_node(AST_Conditional, self, {\n                    condition: negated,\n                    consequent: self.alternative,\n                    alternative: self.consequent\n                });\n            }\n            var consequent = self.consequent;\n            var alternative = self.alternative;\n            if (consequent instanceof AST_Assign && alternative instanceof AST_Assign && consequent.operator == alternative.operator && consequent.left.equivalent_to(alternative.left)) {\n                return make_node(AST_Assign, self, {\n                    operator: consequent.operator,\n                    left: consequent.left,\n                    right: make_node(AST_Conditional, self, {\n                        condition: self.condition,\n                        consequent: consequent.right,\n                        alternative: alternative.right\n                    })\n                });\n            }\n            if (consequent instanceof AST_Call && alternative.TYPE === consequent.TYPE && consequent.args.length == alternative.args.length && consequent.expression.equivalent_to(alternative.expression)) {\n                if (consequent.args.length == 0) {\n                    return make_node(AST_Seq, self, {\n                        car: self.condition,\n                        cdr: consequent\n                    });\n                }\n                if (consequent.args.length == 1) {\n                    consequent.args[0] = make_node(AST_Conditional, self, {\n                        condition: self.condition,\n                        consequent: consequent.args[0],\n                        alternative: alternative.args[0]\n                    });\n                    return consequent;\n                }\n            }\n            if (consequent instanceof AST_Conditional && consequent.alternative.equivalent_to(alternative)) {\n                return make_node(AST_Conditional, self, {\n                    condition: make_node(AST_Binary, self, {\n                        left: self.condition,\n                        operator: \"&&\",\n                        right: consequent.condition\n                    }),\n                    consequent: consequent.consequent,\n                    alternative: alternative\n                });\n            }\n            return self;\n        });\n        OPT(AST_Boolean, function(self, compressor) {\n            if (compressor.option(\"booleans\")) {\n                var p = compressor.parent();\n                if (p instanceof AST_Binary && (p.operator == \"==\" || p.operator == \"!=\")) {\n                    compressor.warn(\"Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]\", {\n                        operator: p.operator,\n                        value: self.value,\n                        file: p.start.file,\n                        line: p.start.line,\n                        col: p.start.col\n                    });\n                    return make_node(AST_Number, self, {\n                        value: +self.value\n                    });\n                }\n                return make_node(AST_UnaryPrefix, self, {\n                    operator: \"!\",\n                    expression: make_node(AST_Number, self, {\n                        value: 1 - self.value\n                    })\n                });\n            }\n            return self;\n        });\n        OPT(AST_Sub, function(self, compressor) {\n            var prop = self.property;\n            if (prop instanceof AST_String && compressor.option(\"properties\")) {\n                prop = prop.getValue();\n                if (RESERVED_WORDS(prop) ? compressor.option(\"screw_ie8\") : is_identifier_string(prop)) {\n                    return make_node(AST_Dot, self, {\n                        expression: self.expression,\n                        property: prop\n                    }).optimize(compressor);\n                }\n                var v = parseFloat(prop);\n                if (!isNaN(v) && v.toString() == prop) {\n                    self.property = make_node(AST_Number, self.property, {\n                        value: v\n                    });\n                }\n            }\n            return self;\n        });\n        OPT(AST_Dot, function(self, compressor) {\n            return self.evaluate(compressor)[0];\n        });\n        function literals_in_boolean_context(self, compressor) {\n            if (compressor.option(\"booleans\") && compressor.in_boolean_context()) {\n                return make_node(AST_True, self);\n            }\n            return self;\n        }\n        OPT(AST_Array, literals_in_boolean_context);\n        OPT(AST_Object, literals_in_boolean_context);\n        OPT(AST_RegExp, literals_in_boolean_context);\n    })();\n    \"use strict\";\n    function SourceMap(options) {\n        options = defaults(options, {\n            file: null,\n            root: null,\n            orig: null,\n            orig_line_diff: 0,\n            dest_line_diff: 0\n        });\n        var generator = new MOZ_SourceMap.SourceMapGenerator({\n            file: options.file,\n            sourceRoot: options.root\n        });\n        var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig);\n        function add(source, gen_line, gen_col, orig_line, orig_col, name) {\n            if (orig_map) {\n                var info = orig_map.originalPositionFor({\n                    line: orig_line,\n                    column: orig_col\n                });\n                if (info.source === null) {\n                    return;\n                }\n                source = info.source;\n                orig_line = info.line;\n                orig_col = info.column;\n                name = info.name;\n            }\n            generator.addMapping({\n                generated: {\n                    line: gen_line + options.dest_line_diff,\n                    column: gen_col\n                },\n                original: {\n                    line: orig_line + options.orig_line_diff,\n                    column: orig_col\n                },\n                source: source,\n                name: name\n            });\n        }\n        return {\n            add: add,\n            get: function() {\n                return generator;\n            },\n            toString: function() {\n                return generator.toString();\n            }\n        };\n    }\n    \"use strict\";\n    (function() {\n        var MOZ_TO_ME = {\n            ExpressionStatement: function(M) {\n                var expr = M.expression;\n                if (expr.type === \"Literal\" && typeof expr.value === \"string\") {\n                    return new AST_Directive({\n                        start: my_start_token(M),\n                        end: my_end_token(M),\n                        value: expr.value\n                    });\n                }\n                return new AST_SimpleStatement({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    body: from_moz(expr)\n                });\n            },\n            TryStatement: function(M) {\n                var handlers = M.handlers || [ M.handler ];\n                if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) {\n                    throw new Error(\"Multiple catch clauses are not supported.\");\n                }\n                return new AST_Try({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    body: from_moz(M.block).body,\n                    bcatch: from_moz(handlers[0]),\n                    bfinally: M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null\n                });\n            },\n            Property: function(M) {\n                var key = M.key;\n                var name = key.type == \"Identifier\" ? key.name : key.value;\n                var args = {\n                    start: my_start_token(key),\n                    end: my_end_token(M.value),\n                    key: name,\n                    value: from_moz(M.value)\n                };\n                switch (M.kind) {\n                  case \"init\":\n                    return new AST_ObjectKeyVal(args);\n\n                  case \"set\":\n                    args.value.name = from_moz(key);\n                    return new AST_ObjectSetter(args);\n\n                  case \"get\":\n                    args.value.name = from_moz(key);\n                    return new AST_ObjectGetter(args);\n                }\n            },\n            ObjectExpression: function(M) {\n                return new AST_Object({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    properties: M.properties.map(function(prop) {\n                        prop.type = \"Property\";\n                        return from_moz(prop);\n                    })\n                });\n            },\n            SequenceExpression: function(M) {\n                return AST_Seq.from_array(M.expressions.map(from_moz));\n            },\n            MemberExpression: function(M) {\n                return new (M.computed ? AST_Sub : AST_Dot)({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    property: M.computed ? from_moz(M.property) : M.property.name,\n                    expression: from_moz(M.object)\n                });\n            },\n            SwitchCase: function(M) {\n                return new (M.test ? AST_Case : AST_Default)({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    expression: from_moz(M.test),\n                    body: M.consequent.map(from_moz)\n                });\n            },\n            VariableDeclaration: function(M) {\n                return new (M.kind === \"const\" ? AST_Const : AST_Var)({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    definitions: M.declarations.map(from_moz)\n                });\n            },\n            Literal: function(M) {\n                var val = M.value, args = {\n                    start: my_start_token(M),\n                    end: my_end_token(M)\n                };\n                if (val === null) return new AST_Null(args);\n                switch (typeof val) {\n                  case \"string\":\n                    args.value = val;\n                    return new AST_String(args);\n\n                  case \"number\":\n                    args.value = val;\n                    return new AST_Number(args);\n\n                  case \"boolean\":\n                    return new (val ? AST_True : AST_False)(args);\n\n                  default:\n                    args.value = val;\n                    return new AST_RegExp(args);\n                }\n            },\n            Identifier: function(M) {\n                var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];\n                return new (p.type == \"LabeledStatement\" ? AST_Label : p.type == \"VariableDeclarator\" && p.id === M ? p.kind == \"const\" ? AST_SymbolConst : AST_SymbolVar : p.type == \"FunctionExpression\" ? p.id === M ? AST_SymbolLambda : AST_SymbolFunarg : p.type == \"FunctionDeclaration\" ? p.id === M ? AST_SymbolDefun : AST_SymbolFunarg : p.type == \"CatchClause\" ? AST_SymbolCatch : p.type == \"BreakStatement\" || p.type == \"ContinueStatement\" ? AST_LabelRef : AST_SymbolRef)({\n                    start: my_start_token(M),\n                    end: my_end_token(M),\n                    name: M.name\n                });\n            }\n        };\n        MOZ_TO_ME.UpdateExpression = MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) {\n            var prefix = \"prefix\" in M ? M.prefix : M.type == \"UnaryExpression\" ? true : false;\n            return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({\n                start: my_start_token(M),\n                end: my_end_token(M),\n                operator: M.operator,\n                expression: from_moz(M.argument)\n            });\n        };\n        map(\"Program\", AST_Toplevel, \"body@body\");\n        map(\"EmptyStatement\", AST_EmptyStatement);\n        map(\"BlockStatement\", AST_BlockStatement, \"body@body\");\n        map(\"IfStatement\", AST_If, \"test>condition, consequent>body, alternate>alternative\");\n        map(\"LabeledStatement\", AST_LabeledStatement, \"label>label, body>body\");\n        map(\"BreakStatement\", AST_Break, \"label>label\");\n        map(\"ContinueStatement\", AST_Continue, \"label>label\");\n        map(\"WithStatement\", AST_With, \"object>expression, body>body\");\n        map(\"SwitchStatement\", AST_Switch, \"discriminant>expression, cases@body\");\n        map(\"ReturnStatement\", AST_Return, \"argument>value\");\n        map(\"ThrowStatement\", AST_Throw, \"argument>value\");\n        map(\"WhileStatement\", AST_While, \"test>condition, body>body\");\n        map(\"DoWhileStatement\", AST_Do, \"test>condition, body>body\");\n        map(\"ForStatement\", AST_For, \"init>init, test>condition, update>step, body>body\");\n        map(\"ForInStatement\", AST_ForIn, \"left>init, right>object, body>body\");\n        map(\"DebuggerStatement\", AST_Debugger);\n        map(\"FunctionDeclaration\", AST_Defun, \"id>name, params@argnames, body%body\");\n        map(\"VariableDeclarator\", AST_VarDef, \"id>name, init>value\");\n        map(\"CatchClause\", AST_Catch, \"param>argname, body%body\");\n        map(\"ThisExpression\", AST_This);\n        map(\"ArrayExpression\", AST_Array, \"elements@elements\");\n        map(\"FunctionExpression\", AST_Function, \"id>name, params@argnames, body%body\");\n        map(\"BinaryExpression\", AST_Binary, \"operator=operator, left>left, right>right\");\n        map(\"LogicalExpression\", AST_Binary, \"operator=operator, left>left, right>right\");\n        map(\"AssignmentExpression\", AST_Assign, \"operator=operator, left>left, right>right\");\n        map(\"ConditionalExpression\", AST_Conditional, \"test>condition, consequent>consequent, alternate>alternative\");\n        map(\"NewExpression\", AST_New, \"callee>expression, arguments@args\");\n        map(\"CallExpression\", AST_Call, \"callee>expression, arguments@args\");\n        def_to_moz(AST_Directive, function To_Moz_Directive(M) {\n            return {\n                type: \"ExpressionStatement\",\n                expression: {\n                    type: \"Literal\",\n                    value: M.value\n                }\n            };\n        });\n        def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) {\n            return {\n                type: \"ExpressionStatement\",\n                expression: to_moz(M.body)\n            };\n        });\n        def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) {\n            return {\n                type: \"SwitchCase\",\n                test: to_moz(M.expression),\n                consequent: M.body.map(to_moz)\n            };\n        });\n        def_to_moz(AST_Try, function To_Moz_TryStatement(M) {\n            return {\n                type: \"TryStatement\",\n                block: to_moz_block(M),\n                handler: to_moz(M.bcatch),\n                guardedHandlers: [],\n                finalizer: to_moz(M.bfinally)\n            };\n        });\n        def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {\n            return {\n                type: \"CatchClause\",\n                param: to_moz(M.argname),\n                guard: null,\n                body: to_moz_block(M)\n            };\n        });\n        def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {\n            return {\n                type: \"VariableDeclaration\",\n                kind: M instanceof AST_Const ? \"const\" : \"var\",\n                declarations: M.definitions.map(to_moz)\n            };\n        });\n        def_to_moz(AST_Seq, function To_Moz_SequenceExpression(M) {\n            return {\n                type: \"SequenceExpression\",\n                expressions: M.to_array().map(to_moz)\n            };\n        });\n        def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) {\n            var isComputed = M instanceof AST_Sub;\n            return {\n                type: \"MemberExpression\",\n                object: to_moz(M.expression),\n                computed: isComputed,\n                property: isComputed ? to_moz(M.property) : {\n                    type: \"Identifier\",\n                    name: M.property\n                }\n            };\n        });\n        def_to_moz(AST_Unary, function To_Moz_Unary(M) {\n            return {\n                type: M.operator == \"++\" || M.operator == \"--\" ? \"UpdateExpression\" : \"UnaryExpression\",\n                operator: M.operator,\n                prefix: M instanceof AST_UnaryPrefix,\n                argument: to_moz(M.expression)\n            };\n        });\n        def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {\n            return {\n                type: M.operator == \"&&\" || M.operator == \"||\" ? \"LogicalExpression\" : \"BinaryExpression\",\n                left: to_moz(M.left),\n                operator: M.operator,\n                right: to_moz(M.right)\n            };\n        });\n        def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {\n            return {\n                type: \"ObjectExpression\",\n                properties: M.properties.map(to_moz)\n            };\n        });\n        def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {\n            var key = is_identifier(M.key) ? {\n                type: \"Identifier\",\n                name: M.key\n            } : {\n                type: \"Literal\",\n                value: M.key\n            };\n            var kind;\n            if (M instanceof AST_ObjectKeyVal) {\n                kind = \"init\";\n            } else if (M instanceof AST_ObjectGetter) {\n                kind = \"get\";\n            } else if (M instanceof AST_ObjectSetter) {\n                kind = \"set\";\n            }\n            return {\n                type: \"Property\",\n                kind: kind,\n                key: key,\n                value: to_moz(M.value)\n            };\n        });\n        def_to_moz(AST_Symbol, function To_Moz_Identifier(M) {\n            var def = M.definition();\n            return {\n                type: \"Identifier\",\n                name: def ? def.mangled_name || def.name : M.name\n            };\n        });\n        def_to_moz(AST_Constant, function To_Moz_Literal(M) {\n            var value = M.value;\n            if (typeof value === \"number\" && (value < 0 || value === 0 && 1 / value < 0)) {\n                return {\n                    type: \"UnaryExpression\",\n                    operator: \"-\",\n                    prefix: true,\n                    argument: {\n                        type: \"Literal\",\n                        value: -value\n                    }\n                };\n            }\n            return {\n                type: \"Literal\",\n                value: value\n            };\n        });\n        def_to_moz(AST_Atom, function To_Moz_Atom(M) {\n            return {\n                type: \"Identifier\",\n                name: String(M.value)\n            };\n        });\n        AST_Boolean.DEFMETHOD(\"to_mozilla_ast\", AST_Constant.prototype.to_mozilla_ast);\n        AST_Null.DEFMETHOD(\"to_mozilla_ast\", AST_Constant.prototype.to_mozilla_ast);\n        AST_Hole.DEFMETHOD(\"to_mozilla_ast\", function To_Moz_ArrayHole() {\n            return null;\n        });\n        AST_Block.DEFMETHOD(\"to_mozilla_ast\", AST_BlockStatement.prototype.to_mozilla_ast);\n        AST_Lambda.DEFMETHOD(\"to_mozilla_ast\", AST_Function.prototype.to_mozilla_ast);\n        function my_start_token(moznode) {\n            var loc = moznode.loc;\n            var range = moznode.range;\n            return new AST_Token({\n                file: loc && loc.source,\n                line: loc && loc.start.line,\n                col: loc && loc.start.column,\n                pos: range ? range[0] : moznode.start,\n                endpos: range ? range[0] : moznode.start\n            });\n        }\n        function my_end_token(moznode) {\n            var loc = moznode.loc;\n            var range = moznode.range;\n            return new AST_Token({\n                file: loc && loc.source,\n                line: loc && loc.end.line,\n                col: loc && loc.end.column,\n                pos: range ? range[1] : moznode.end,\n                endpos: range ? range[1] : moznode.end\n            });\n        }\n        function map(moztype, mytype, propmap) {\n            if (typeof UglifyJS_NoUnsafeEval !== \"undefined\") {\n                var prop_list = [];\n                if (propmap) propmap.split(/\\s*,\\s*/).forEach(function(prop) {\n                    var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);\n                    if (!m) throw new Error(\"Can't understand property map: \" + prop);\n                    if (\"=@>%\".indexOf(m[2]) < 0) {\n                        throw new Error(\"Can't understand operator in propmap: \" + prop);\n                    }\n                    prop_list.push(m);\n                });\n                var moz_to_me = function(M) {\n                    var props = {\n                        start: my_start_token(M),\n                        end: my_end_token(M)\n                    };\n                    for (var i = 0; i < prop_list.length; i++) {\n                        var m = prop_list[i];\n                        var moz = m[1], how = m[2], my = m[3];\n                        var mozProp = M[moz];\n                        var myProp;\n                        switch (how) {\n                          case \"@\":\n                            myProp = mozProp.map(from_moz);\n                            break;\n\n                          case \">\":\n                            myProp = from_moz(mozProp);\n                            break;\n\n                          case \"=\":\n                            myProp = mozProp;\n                            break;\n\n                          case \"%\":\n                            myProp = from_moz(mozProp).body;\n                            break;\n                        }\n                        props[my] = myProp;\n                    }\n                    return new mytype(props);\n                };\n                var me_to_moz = function(M) {\n                    var props = {\n                        type: moztype\n                    };\n                    for (var i = 0; i < prop_list.length; i++) {\n                        var m = prop_list[i];\n                        var moz = m[1], how = m[2], my = m[3];\n                        var myProp = M[my];\n                        var mozProp;\n                        switch (how) {\n                          case \"@\":\n                            mozProp = myProp.map(to_moz);\n                            break;\n\n                          case \">\":\n                            mozProp = to_moz(myProp);\n                            break;\n\n                          case \"=\":\n                            mozProp = myProp;\n                            break;\n\n                          case \"%\":\n                            mozProp = to_moz_block(M);\n                            break;\n                        }\n                        props[moz] = mozProp;\n                    }\n                    return props;\n                };\n                MOZ_TO_ME[moztype] = moz_to_me;\n                def_to_moz(mytype, me_to_moz);\n                return;\n            }\n            var moz_to_me = \"function From_Moz_\" + moztype + \"(M){\\n\";\n            moz_to_me += \"return new \" + mytype.name + \"({\\n\" + \"start: my_start_token(M),\\n\" + \"end: my_end_token(M)\";\n            var me_to_moz = \"function To_Moz_\" + moztype + \"(M){\\n\";\n            me_to_moz += \"return {\\n\" + \"type: \" + JSON.stringify(moztype);\n            if (propmap) propmap.split(/\\s*,\\s*/).forEach(function(prop) {\n                var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);\n                if (!m) throw new Error(\"Can't understand property map: \" + prop);\n                var moz = m[1], how = m[2], my = m[3];\n                moz_to_me += \",\\n\" + my + \": \";\n                me_to_moz += \",\\n\" + moz + \": \";\n                switch (how) {\n                  case \"@\":\n                    moz_to_me += \"M.\" + moz + \".map(from_moz)\";\n                    me_to_moz += \"M.\" + my + \".map(to_moz)\";\n                    break;\n\n                  case \">\":\n                    moz_to_me += \"from_moz(M.\" + moz + \")\";\n                    me_to_moz += \"to_moz(M.\" + my + \")\";\n                    break;\n\n                  case \"=\":\n                    moz_to_me += \"M.\" + moz;\n                    me_to_moz += \"M.\" + my;\n                    break;\n\n                  case \"%\":\n                    moz_to_me += \"from_moz(M.\" + moz + \").body\";\n                    me_to_moz += \"to_moz_block(M)\";\n                    break;\n\n                  default:\n                    throw new Error(\"Can't understand operator in propmap: \" + prop);\n                }\n            });\n            moz_to_me += \"\\n})\\n}\";\n            me_to_moz += \"\\n}\\n}\";\n            moz_to_me = new Function(\"my_start_token\", \"my_end_token\", \"from_moz\", \"return(\" + moz_to_me + \")\")(my_start_token, my_end_token, from_moz);\n            me_to_moz = new Function(\"to_moz\", \"to_moz_block\", \"return(\" + me_to_moz + \")\")(to_moz, to_moz_block);\n            MOZ_TO_ME[moztype] = moz_to_me;\n            def_to_moz(mytype, me_to_moz);\n        }\n        var FROM_MOZ_STACK = null;\n        function from_moz(node) {\n            FROM_MOZ_STACK.push(node);\n            var ret = node != null ? MOZ_TO_ME[node.type](node) : null;\n            FROM_MOZ_STACK.pop();\n            return ret;\n        }\n        AST_Node.from_mozilla_ast = function(node) {\n            var save_stack = FROM_MOZ_STACK;\n            FROM_MOZ_STACK = [];\n            var ast = from_moz(node);\n            FROM_MOZ_STACK = save_stack;\n            return ast;\n        };\n        function moz_sub_loc(token) {\n            return token.line ? {\n                line: token.line,\n                column: token.col\n            } : null;\n        }\n        function set_moz_loc(mynode, moznode) {\n            var start = mynode.start;\n            var end = mynode.end;\n            if (start.pos != null && end.pos != null) {\n                moznode.range = [ start.pos, end.pos ];\n            }\n            if (start.line) {\n                moznode.loc = {\n                    start: moz_sub_loc(start),\n                    end: moz_sub_loc(end)\n                };\n                if (start.file) {\n                    moznode.loc.source = start.file;\n                }\n            }\n            return moznode;\n        }\n        function def_to_moz(mytype, handler) {\n            mytype.DEFMETHOD(\"to_mozilla_ast\", function() {\n                return set_moz_loc(this, handler(this));\n            });\n        }\n        function to_moz(node) {\n            return node != null ? node.to_mozilla_ast() : null;\n        }\n        function to_moz_block(node) {\n            return {\n                type: \"BlockStatement\",\n                body: node.body.map(to_moz)\n            };\n        }\n    })();\n    exports[\"array_to_hash\"] = array_to_hash;\n    exports[\"slice\"] = slice;\n    exports[\"characters\"] = characters;\n    exports[\"member\"] = member;\n    exports[\"find_if\"] = find_if;\n    exports[\"repeat_string\"] = repeat_string;\n    exports[\"DefaultsError\"] = DefaultsError;\n    exports[\"defaults\"] = defaults;\n    exports[\"merge\"] = merge;\n    exports[\"noop\"] = noop;\n    exports[\"MAP\"] = MAP;\n    exports[\"push_uniq\"] = push_uniq;\n    exports[\"string_template\"] = string_template;\n    exports[\"remove\"] = remove;\n    exports[\"mergeSort\"] = mergeSort;\n    exports[\"set_difference\"] = set_difference;\n    exports[\"set_intersection\"] = set_intersection;\n    exports[\"makePredicate\"] = makePredicate;\n    exports[\"all\"] = all;\n    exports[\"Dictionary\"] = Dictionary;\n    exports[\"DEFNODE\"] = DEFNODE;\n    exports[\"AST_Token\"] = AST_Token;\n    exports[\"AST_Node\"] = AST_Node;\n    exports[\"AST_Statement\"] = AST_Statement;\n    exports[\"AST_Debugger\"] = AST_Debugger;\n    exports[\"AST_Directive\"] = AST_Directive;\n    exports[\"AST_SimpleStatement\"] = AST_SimpleStatement;\n    exports[\"walk_body\"] = walk_body;\n    exports[\"AST_Block\"] = AST_Block;\n    exports[\"AST_BlockStatement\"] = AST_BlockStatement;\n    exports[\"AST_EmptyStatement\"] = AST_EmptyStatement;\n    exports[\"AST_StatementWithBody\"] = AST_StatementWithBody;\n    exports[\"AST_LabeledStatement\"] = AST_LabeledStatement;\n    exports[\"AST_IterationStatement\"] = AST_IterationStatement;\n    exports[\"AST_DWLoop\"] = AST_DWLoop;\n    exports[\"AST_Do\"] = AST_Do;\n    exports[\"AST_While\"] = AST_While;\n    exports[\"AST_For\"] = AST_For;\n    exports[\"AST_ForIn\"] = AST_ForIn;\n    exports[\"AST_With\"] = AST_With;\n    exports[\"AST_Scope\"] = AST_Scope;\n    exports[\"AST_Toplevel\"] = AST_Toplevel;\n    exports[\"AST_Lambda\"] = AST_Lambda;\n    exports[\"AST_Accessor\"] = AST_Accessor;\n    exports[\"AST_Function\"] = AST_Function;\n    exports[\"AST_Defun\"] = AST_Defun;\n    exports[\"AST_Jump\"] = AST_Jump;\n    exports[\"AST_Exit\"] = AST_Exit;\n    exports[\"AST_Return\"] = AST_Return;\n    exports[\"AST_Throw\"] = AST_Throw;\n    exports[\"AST_LoopControl\"] = AST_LoopControl;\n    exports[\"AST_Break\"] = AST_Break;\n    exports[\"AST_Continue\"] = AST_Continue;\n    exports[\"AST_If\"] = AST_If;\n    exports[\"AST_Switch\"] = AST_Switch;\n    exports[\"AST_SwitchBranch\"] = AST_SwitchBranch;\n    exports[\"AST_Default\"] = AST_Default;\n    exports[\"AST_Case\"] = AST_Case;\n    exports[\"AST_Try\"] = AST_Try;\n    exports[\"AST_Catch\"] = AST_Catch;\n    exports[\"AST_Finally\"] = AST_Finally;\n    exports[\"AST_Definitions\"] = AST_Definitions;\n    exports[\"AST_Var\"] = AST_Var;\n    exports[\"AST_Const\"] = AST_Const;\n    exports[\"AST_VarDef\"] = AST_VarDef;\n    exports[\"AST_Call\"] = AST_Call;\n    exports[\"AST_New\"] = AST_New;\n    exports[\"AST_Seq\"] = AST_Seq;\n    exports[\"AST_PropAccess\"] = AST_PropAccess;\n    exports[\"AST_Dot\"] = AST_Dot;\n    exports[\"AST_Sub\"] = AST_Sub;\n    exports[\"AST_Unary\"] = AST_Unary;\n    exports[\"AST_UnaryPrefix\"] = AST_UnaryPrefix;\n    exports[\"AST_UnaryPostfix\"] = AST_UnaryPostfix;\n    exports[\"AST_Binary\"] = AST_Binary;\n    exports[\"AST_Conditional\"] = AST_Conditional;\n    exports[\"AST_Assign\"] = AST_Assign;\n    exports[\"AST_Array\"] = AST_Array;\n    exports[\"AST_Object\"] = AST_Object;\n    exports[\"AST_ObjectProperty\"] = AST_ObjectProperty;\n    exports[\"AST_ObjectKeyVal\"] = AST_ObjectKeyVal;\n    exports[\"AST_ObjectSetter\"] = AST_ObjectSetter;\n    exports[\"AST_ObjectGetter\"] = AST_ObjectGetter;\n    exports[\"AST_Symbol\"] = AST_Symbol;\n    exports[\"AST_SymbolAccessor\"] = AST_SymbolAccessor;\n    exports[\"AST_SymbolDeclaration\"] = AST_SymbolDeclaration;\n    exports[\"AST_SymbolVar\"] = AST_SymbolVar;\n    exports[\"AST_SymbolConst\"] = AST_SymbolConst;\n    exports[\"AST_SymbolFunarg\"] = AST_SymbolFunarg;\n    exports[\"AST_SymbolDefun\"] = AST_SymbolDefun;\n    exports[\"AST_SymbolLambda\"] = AST_SymbolLambda;\n    exports[\"AST_SymbolCatch\"] = AST_SymbolCatch;\n    exports[\"AST_Label\"] = AST_Label;\n    exports[\"AST_SymbolRef\"] = AST_SymbolRef;\n    exports[\"AST_LabelRef\"] = AST_LabelRef;\n    exports[\"AST_This\"] = AST_This;\n    exports[\"AST_Constant\"] = AST_Constant;\n    exports[\"AST_String\"] = AST_String;\n    exports[\"AST_Number\"] = AST_Number;\n    exports[\"AST_RegExp\"] = AST_RegExp;\n    exports[\"AST_Atom\"] = AST_Atom;\n    exports[\"AST_Null\"] = AST_Null;\n    exports[\"AST_NaN\"] = AST_NaN;\n    exports[\"AST_Undefined\"] = AST_Undefined;\n    exports[\"AST_Hole\"] = AST_Hole;\n    exports[\"AST_Infinity\"] = AST_Infinity;\n    exports[\"AST_Boolean\"] = AST_Boolean;\n    exports[\"AST_False\"] = AST_False;\n    exports[\"AST_True\"] = AST_True;\n    exports[\"TreeWalker\"] = TreeWalker;\n    exports[\"KEYWORDS\"] = KEYWORDS;\n    exports[\"KEYWORDS_ATOM\"] = KEYWORDS_ATOM;\n    exports[\"RESERVED_WORDS\"] = RESERVED_WORDS;\n    exports[\"KEYWORDS_BEFORE_EXPRESSION\"] = KEYWORDS_BEFORE_EXPRESSION;\n    exports[\"OPERATOR_CHARS\"] = OPERATOR_CHARS;\n    exports[\"RE_HEX_NUMBER\"] = RE_HEX_NUMBER;\n    exports[\"RE_OCT_NUMBER\"] = RE_OCT_NUMBER;\n    exports[\"RE_DEC_NUMBER\"] = RE_DEC_NUMBER;\n    exports[\"OPERATORS\"] = OPERATORS;\n    exports[\"WHITESPACE_CHARS\"] = WHITESPACE_CHARS;\n    exports[\"PUNC_BEFORE_EXPRESSION\"] = PUNC_BEFORE_EXPRESSION;\n    exports[\"PUNC_CHARS\"] = PUNC_CHARS;\n    exports[\"REGEXP_MODIFIERS\"] = REGEXP_MODIFIERS;\n    exports[\"UNICODE\"] = UNICODE;\n    exports[\"is_letter\"] = is_letter;\n    exports[\"is_digit\"] = is_digit;\n    exports[\"is_alphanumeric_char\"] = is_alphanumeric_char;\n    exports[\"is_unicode_combining_mark\"] = is_unicode_combining_mark;\n    exports[\"is_unicode_connector_punctuation\"] = is_unicode_connector_punctuation;\n    exports[\"is_identifier\"] = is_identifier;\n    exports[\"is_identifier_start\"] = is_identifier_start;\n    exports[\"is_identifier_char\"] = is_identifier_char;\n    exports[\"is_identifier_string\"] = is_identifier_string;\n    exports[\"parse_js_number\"] = parse_js_number;\n    exports[\"JS_Parse_Error\"] = JS_Parse_Error;\n    exports[\"js_error\"] = js_error;\n    exports[\"is_token\"] = is_token;\n    exports[\"EX_EOF\"] = EX_EOF;\n    exports[\"tokenizer\"] = tokenizer;\n    exports[\"UNARY_PREFIX\"] = UNARY_PREFIX;\n    exports[\"UNARY_POSTFIX\"] = UNARY_POSTFIX;\n    exports[\"ASSIGNMENT\"] = ASSIGNMENT;\n    exports[\"PRECEDENCE\"] = PRECEDENCE;\n    exports[\"STATEMENTS_WITH_LABELS\"] = STATEMENTS_WITH_LABELS;\n    exports[\"ATOMIC_START_TOKEN\"] = ATOMIC_START_TOKEN;\n    exports[\"parse\"] = parse;\n    exports[\"TreeTransformer\"] = TreeTransformer;\n    exports[\"SymbolDef\"] = SymbolDef;\n    exports[\"base54\"] = base54;\n    exports[\"OutputStream\"] = OutputStream;\n    exports[\"Compressor\"] = Compressor;\n    exports[\"SourceMap\"] = SourceMap;\n})({}, function() {\n    return this;\n}());"
  },
  {
    "path": "omega-target/.gitignore",
    "content": "/index.js\n/omega_target.min.js\n"
  },
  {
    "path": "omega-target/Gruntfile.coffee",
    "content": "module.exports = require('load-grunt-config')\n"
  },
  {
    "path": "omega-target/grunt/aliases.coffee",
    "content": "module.exports =\n  default: [\n    'coffeelint'\n    'browserify'\n  ]\n  test: ['mochaTest']\n"
  },
  {
    "path": "omega-target/grunt/browserify.coffee",
    "content": "module.exports =\n  index:\n    files:\n      'index.js': 'index.coffee'\n    options:\n      transform: ['coffeeify']\n      exclude: ['bluebird', 'jsondiffpatch', 'omega-pac']\n      browserifyOptions:\n        extensions: '.coffee'\n        builtins: []\n        standalone: 'index.coffee'\n        debug: true\n  browser:\n    files:\n      'omega_target.min.js': 'index.coffee'\n    options:\n      alias: [\n        './index.coffee:OmegaTarget'\n      ]\n      transform: ['coffeeify']\n      plugin:\n        if process.env.BUILD == 'release'\n          [['minifyify', {map: false}]]\n        else\n          []\n      browserifyOptions:\n        extensions: '.coffee'\n        standalone: 'OmegaTarget'\n"
  },
  {
    "path": "omega-target/grunt/coffeelint.coffee",
    "content": "module.exports =\n  options:\n    arrow_spacing: level: 'error'\n    colon_assignment_spacing:\n      level: 'error'\n      spacing:\n        left: 0\n        right: 1\n    missing_fat_arrows: level: 'warn'\n    no_empty_functions: level: 'error'\n    no_empty_param_list: level: 'error'\n    no_interpolation_in_single_quotes: level: 'error'\n    no_stand_alone_at: level: 'error'\n    space_operators: level: 'error'\n    # https://github.com/clutchski/coffeelint/issues/525\n    indentation: level: 'ignore'\n\n  gruntfile: ['Gruntfile.coffee']\n  tasks: ['grunt/**/*.coffee']\n  src: ['src/**/*.coffee', 'test/**/*.coffee']\n"
  },
  {
    "path": "omega-target/grunt/mochaTest.coffee",
    "content": "module.exports =\n  test:\n    options:\n      reporter: 'spec'\n      require: 'coffee-script/register'\n    src: ['test/**/*.coffee']\n"
  },
  {
    "path": "omega-target/grunt/watch.coffee",
    "content": "module.exports =\n  grunt:\n    options:\n      reload: true\n    files:\n      'grunt/*'\n    tasks: ['coffeelint:tasks', 'default']\n  src:\n    files: ['src/**/*.coffee', 'test/**/*.coffee']\n    tasks: ['default']\n"
  },
  {
    "path": "omega-target/index.coffee",
    "content": "module.exports =\n  Log: require('./src/log')\n  Storage: require('./src/storage')\n  BrowserStorage: require('./src/browser_storage')\n  Options: require('./src/options')\n  OptionsSync: require('./src/options_sync')\n  OmegaPac: require('omega-pac')\n\nfor name, value of require('./src/utils.coffee')\n  module.exports[name] = value\n\nfor name, value of require('./src/errors.coffee')\n  module.exports[name] = value\n"
  },
  {
    "path": "omega-target/omega_pac_shim.js",
    "content": "module.exports = OmegaPac;\n"
  },
  {
    "path": "omega-target/package.json",
    "content": "{\n  \"name\": \"omega-target\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"main\": \"./index.js\",\n  \"devDependencies\": {\n    \"chai\": \"^1.10.0\",\n    \"coffee-script\": \"^1.8.0\",\n    \"coffeeify\": \"^0.7.0\",\n    \"coffeelint\": \"^1.16.0\",\n    \"grunt\": \"^0.4.5\",\n    \"grunt-browserify\": \"^3.0.0\",\n    \"grunt-coffeelint\": \"^0.0.13\",\n    \"grunt-contrib-coffee\": \"^0.11.1\",\n    \"grunt-contrib-watch\": \"^0.6.1\",\n    \"grunt-mocha-test\": \"~0.11.0\",\n    \"load-grunt-config\": \"^0.13.1\",\n    \"minifyify\": \"^4.1.1\",\n    \"sinon\": \"^1.12.2\",\n    \"sinon-chai\": \"^2.6.0\"\n  },\n  \"dependencies\": {\n    \"bluebird\": \"^2.3.2\",\n    \"jsondiffpatch\": \"^0.1.8\",\n    \"limiter\": \"^1.0.5\",\n    \"omega-pac\": \"../omega-pac\"\n  },\n  \"browser\": {\n    \"omega-pac\": \"./omega_pac_shim.js\"\n  },\n  \"scripts\": {\n    \"dev\": \"npm link omega-pac && npm link\",\n    \"test\": \"grunt test\"\n  }\n}\n"
  },
  {
    "path": "omega-target/src/browser_storage.coffee",
    "content": "Storage = require('./storage')\nPromise = require('bluebird')\n\nclass BrowserStorage extends Storage\n  constructor: (@storage, @prefix = '') ->\n    @proto = Object.getPrototypeOf(@storage)\n\n  get: (keys) ->\n    map = {}\n    if typeof keys == 'string'\n      map[keys] = undefined\n    else if Array.isArray(keys)\n      for key in keys\n        map[key] = undefined\n    else if typeof keys == 'object'\n      map = keys\n    for own key of map\n      try\n        value = JSON.parse(@proto.getItem.call(@storage, @prefix + key))\n      map[key] = value if value?\n      if typeof map[key] == 'undefined'\n        delete map[key]\n    Promise.resolve map\n\n  set: (items) ->\n    for own key, value of items\n      value = JSON.stringify(value)\n      @proto.setItem.call(@storage, @prefix + key, value)\n    Promise.resolve items\n\n  remove: (keys) ->\n    if not keys?\n      if not @prefix\n        @proto.clear.call(@storage)\n      else\n        index = 0\n        while true\n          key = @proto.key.call(index)\n          break if key == null\n          if @key.substr(0, @prefix.length) == @prefix\n            @proto.removeItem.call(@storage, @prefix + keys)\n          else\n            index++\n    if typeof keys == 'string'\n      @proto.removeItem.call(@storage, @prefix + keys)\n    for key in keys\n      @proto.removeItem.call(@storage, @prefix + key)\n\n    Promise.resolve()\n\nmodule.exports = BrowserStorage\n"
  },
  {
    "path": "omega-target/src/default_options.coffee",
    "content": "module.exports = ->\n  schemaVersion: 2\n  \"-enableQuickSwitch\": false\n  \"-refreshOnProfileChange\": true\n  \"-startupProfileName\": \"\"\n  \"-quickSwitchProfiles\": []\n  \"-revertProxyChanges\": true\n  \"-confirmDeletion\": true\n  \"-showInspectMenu\": true\n  \"-addConditionsToBottom\": false\n  \"-showExternalProfile\": true\n  \"-downloadInterval\": 1440\n  \"+proxy\":\n    bypassList: [\n      {\n        pattern: \"127.0.0.1\"\n        conditionType: \"BypassCondition\"\n      }\n      {\n        pattern: \"::1\"\n        conditionType: \"BypassCondition\"\n      }\n      {\n        pattern: \"localhost\"\n        conditionType: \"BypassCondition\"\n      }\n    ]\n    profileType: \"FixedProfile\"\n    name: \"proxy\"\n    color: \"#99ccee\"\n    fallbackProxy:\n      port: 8080\n      scheme: \"http\"\n      host: \"proxy.example.com\"\n\n  \"+auto switch\":\n    profileType: \"SwitchProfile\"\n    rules: [\n      {\n        condition:\n          pattern: \"internal.example.com\"\n          conditionType: \"HostWildcardCondition\"\n\n        profileName: \"direct\"\n      }\n      {\n        condition:\n          pattern: \"*.example.com\"\n          conditionType: \"HostWildcardCondition\"\n\n        profileName: \"proxy\"\n      }\n    ]\n    name: \"auto switch\"\n    color: \"#99dd99\"\n    defaultProfileName: \"direct\"\n"
  },
  {
    "path": "omega-target/src/errors.coffee",
    "content": "class NetworkError extends Error\n  constructor: (err) ->\n    super\n    this.cause = err\n    this.name = 'NetworkError'\n\nclass HttpError extends NetworkError\n  constructor: ->\n    super\n    this.statusCode = this.cause?.statusCode\n    this.name = 'HttpError'\n\nclass HttpNotFoundError extends HttpError\n  constructor: ->\n    super\n    this.name = 'HttpNotFoundError'\n\nclass HttpServerError extends HttpError\n  constructor: ->\n    super\n    this.name = 'HttpServerError'\n\nclass ContentTypeRejectedError extends Error\n  constructor: ->\n    super\n    this.name = 'ContentTypeRejectedError'\n\nmodule.exports =\n  NetworkError: NetworkError\n  HttpError: HttpError\n  HttpNotFoundError: HttpNotFoundError\n  HttpServerError: HttpServerError\n  ContentTypeRejectedError: ContentTypeRejectedError\n"
  },
  {
    "path": "omega-target/src/log.coffee",
    "content": "### @module omega-target/log ###\nLog = require './log'\n\nreplacer = (key, value) ->\n  switch key\n    # Hide values for a few keys with privacy concerns.\n    when \"username\", \"password\", \"host\", \"port\"\n      return \"<secret>\"\n    else\n      value\n\n# Log is used as singleton.\n# coffeelint: disable=missing_fat_arrows\nmodule.exports = Log =\n  ###*\n  # Pretty-print an object and return the result string.\n  # @param {{}} obj The object to format\n  # @returns {String} the formatted object in string\n  ###\n  str: (obj) ->\n    # TODO(catus): This can be improved to print things more friendly.\n    if typeof obj == 'object' and obj != null\n      if obj.debugStr?\n        if typeof obj.debugStr == 'function'\n          obj.debugStr()\n        else\n          obj.debugStr\n      else if obj instanceof Error\n        obj.stack || obj.message\n      else\n        JSON.stringify(obj, replacer, 4)\n    else if typeof obj == 'function'\n      if obj.name\n        \"<f: #{obj.name}>\"\n      else\n        obj.toString()\n    else\n      '' + obj\n\n  ###*\n  # Print something to the log.\n  # @param {...{}} args The objects to log\n  ###\n  log: console.log.bind(console)\n\n  ###*\n  # Print something to the error log.\n  # @param {...{}} args The objects to log\n  ###\n  error: console.error.bind(console)\n\n  ###*\n  # Log a function call with target and arguments\n  # @param {string} name The name of the method\n  # @param {Array} args The arguments to the method call\n  ###\n  func: (name, args) ->\n    this.log(name, '(', [].slice.call(args), ')')\n\n  ###*\n  # Log a method call with target and arguments\n  # @param {string} name The name of the method\n  # @param {{}} self The target of the method call\n  # @param {Array} args The arguments to the method call\n  ###\n  method: (name, self, args) ->\n    this.log(this.str(self), '<<', name, [].slice.call(args))\n\n# coffeelint: enable=missing_fat_arrows\n"
  },
  {
    "path": "omega-target/src/options.coffee",
    "content": "### @module omega-target/options ###\nPromise = require 'bluebird'\nLog = require './log'\nStorage = require './storage'\nOmegaPac = require 'omega-pac'\njsondiffpatch = require 'jsondiffpatch'\n\nclass Options\n  ###*\n  # The entire set of options including profiles and other settings.\n  # @typedef OmegaOptions\n  # @type {object}\n  ###\n\n  ###*\n  # All the options, in a map from key to value.\n  # @type OmegaOptions\n  ###\n  _options: null\n  _storage: null\n  _state: null\n  _currentProfileName: null\n  _revertToProfileName: null\n  _watchingProfiles: {}\n  _tempProfile: null\n  _tempProfileActive: false\n  fallbackProfileName: 'system'\n  _isSystem: false\n  debugStr: 'Options'\n\n  ready: null\n\n  @ProfileNotExistError: class ProfileNotExistError extends Error\n    constructor: (@profileName) ->\n      super.constructor(\"Profile #{@profileName} does not exist!\")\n\n  @NoOptionsError:\n    class NoOptionsError extends Error\n      constructor: -> super\n\n  ###*\n  # Transform options values (especially profiles) for syncing.\n  # @param {{}} value The value to transform\n  # @param {{}} key The key of the options\n  # @returns {{}} The transformed value\n  ###\n  @transformValueForSync: (value, key) ->\n    if key[0] == '+'\n      if OmegaPac.Profiles.updateUrl(value)\n        profile = {}\n        for k, v of value\n          continue if k == 'lastUpdate' || k == 'ruleList' || k == 'pacScript'\n          profile[k] = v\n        value = profile\n    return value\n\n  constructor: (options, @_storage, @_state, @log, @sync, @proxyImpl) ->\n    @_options = {}\n    @_tempProfileRules = {}\n    @_tempProfileRulesByProfile = {}\n    @_storage ?= Storage()\n    @_state ?= Storage()\n    @log ?= Log\n    if not options?\n      @init()\n    else\n      @ready = @_storage.remove().then(=>\n        @_storage.set(options)\n      ).then =>\n        @init()\n\n  ###*\n  # Attempt to load options from local and remote storage.\n  # @param {?{}} args Extra arguments\n  # @param {number=3} args.retry Number of retries before giving up.\n  # @returns {Promise<OmegaOptions>} The loaded options\n  ###\n  loadOptions: ({retry} = {}) ->\n    retry ?= 3\n    @_syncWatchStop?()\n    @_syncWatchStop = null\n    @_watchStop?()\n    @_watchStop = null\n\n    loadRaw = if options? then Promise.resolve(options) else\n      if not @sync?.enabled\n        if not @sync?\n          @_state.set({'syncOptions': 'unsupported'})\n        @_storage.get(null)\n      else\n        @_state.set({'syncOptions': 'sync'})\n        @_syncWatchStop = @sync.watchAndPull(@_storage)\n        @sync.copyTo(@_storage).catch(Storage.StorageUnavailableError, =>\n          console.error('Warning: Sync storage is not available in this ' +\n            'browser! Disabling options sync.')\n          @_syncWatchStop?()\n          @_syncWatchStop = null\n          @sync = null\n          @_state.set({'syncOptions': 'unsupported'})\n        ).then =>\n          @_storage.get(null)\n\n    @optionsLoaded = loadRaw.then((options) =>\n      @upgrade(options)\n    ).then(([options, changes]) =>\n      @_storage.apply(changes: changes).return(options)\n    ).tap((options) =>\n      @_options = options\n      @_watchStop = @_watch()\n      # Try to set syncOptions to some value if not initialized.\n      @_state.get({'syncOptions': ''}).then ({syncOptions}) =>\n        return if syncOptions\n        @_state.set({'syncOptions': 'conflict'})\n        @sync.storage.get('schemaVersion').then ({schemaVersion}) =>\n          @_state.set({'syncOptions': 'pristine'}) if not schemaVersion\n    ).catch (e) =>\n      return Promise.reject(e) unless retry > 0\n\n      getFallbackOptions = Promise.resolve().then =>\n        if e instanceof NoOptionsError\n          @_state.get({\n            'firstRun': 'new'\n            'web.switchGuide': 'showOnFirstUse'\n          }).then (items) => @_state.set(items)\n          return null unless @sync?\n          @_state.get({'syncOptions': ''}).then ({syncOptions}) =>\n            return if syncOptions == 'conflict'\n            # Try to fetch options from sync storage.\n            return @sync.storage.get(null).then((options) =>\n              if not options['schemaVersion']\n                @_state.set({'syncOptions': 'pristine'})\n                return null\n              else\n                @_state.set({'syncOptions': 'sync'})\n                @sync.enabled = true\n                @log.log('Options#loadOptions::fromSync', options)\n                options\n            ).catch(-> null)\n        else\n          @log.error(e.stack)\n          # Some serious error happened when loading options. Disable syncing\n          # and use fallback options.\n          @_state.remove(['syncOptions'])\n          return null\n\n      getFallbackOptions.then (options) =>\n        options ?= @parseOptions(@getDefaultOptions())\n        if @sync?\n          prevEnabled = @sync.enabled\n          @sync.enabled = false\n        @_storage.remove().then(=>\n          @_storage.set(options)\n        ).then =>\n          @sync.enabled = prevEnabled if @sync?\n          @loadOptions({retry: retry - 1})\n\n  ###*\n  # Attempt to initialize (or reinitialize) options.\n  # @returns {Promise<OmegaOptions>} A promise that is fulfilled on ready.\n  ###\n  init: ->\n    @ready = @loadOptions().then(=>\n      if @_options['-startupProfileName']\n        @applyProfile(@_options['-startupProfileName'])\n      else\n        @_state.get({\n          'currentProfileName': @fallbackProfileName\n          'isSystemProfile': false\n        }).then (st) =>\n          if st['isSystemProfile']\n            @applyProfile('system')\n          else\n            @applyProfile(st['currentProfileName'] || @fallbackProfileName)\n    ).catch((err) =>\n      if not err instanceof ProfileNotExistError\n        @log.error(err)\n      @applyProfile(@fallbackProfileName)\n    ).catch((err) =>\n      @log.error(err)\n    ).then => @getAll()\n\n    @ready.then =>\n      @sync.requestPush(@_options) if @sync?.enabled\n\n      @_state.get({'firstRun': ''}).then ({firstRun}) =>\n        @onFirstRun(firstRun) if firstRun\n\n      if @_options['-downloadInterval'] > 0\n        @updateProfile()\n\n    return @ready\n\n  toString: -> \"<Options>\"\n\n  ###*\n  # Return a localized, human-readable description of the given profile.\n  # In base class, this method is not implemented and will always return null.\n  # @param {?{}} profile The profile to print\n  # @returns {string} Description of the profile with details\n  ###\n  printProfile: (profile) -> null\n\n  ###*\n  # Upgrade options from previous versions.\n  # For now, this method only supports schemaVersion 1 and 2. If so, it upgrades\n  # the options to version 2 (the latest version). Otherwise it rejects.\n  # It is recommended for the derived classes to call super() two times in the\n  # beginning and in the end of the implementation to check the schemaVersion\n  # and to apply future upgrades, respectively.\n  # Example: super(options).catch -> super(doCustomUpgrades(options), changes)\n  # @param {?OmegaOptions} options The legacy options to upgrade\n  # @param {{}={}} changes Previous pending changes to be applied. Default to\n  # an empty dictionary. Please provide this argument when calling super().\n  # @returns {Promise<[OmegaOptions, {}]>} The new options and the changes.\n  ###\n  upgrade: (options, changes) ->\n    changes ?= {}\n    version = options?['schemaVersion']\n    if version == 1\n      autoDetectUsed = false\n      OmegaPac.Profiles.each options, (key, profile) ->\n        if not autoDetectUsed\n          refs = OmegaPac.Profiles.directReferenceSet(profile)\n          if refs['+auto_detect']\n            autoDetectUsed = true\n      if autoDetectUsed\n        options['+auto_detect'] = OmegaPac.Profiles.create(\n          name: 'auto_detect'\n          profileType: 'PacProfile'\n          pacUrl: 'http://wpad/wpad.dat'\n          color: '#00cccc'\n        )\n      version = changes['schemaVersion'] = options['schemaVersion'] = 2\n    if version == 2\n      # Current schemaVersion.\n      Promise.resolve([options, changes])\n    else\n      Promise.reject new Error(\"Invalid schemaVerion #{version}!\")\n\n  ###*\n  # Parse options in various formats (including JSON & base64).\n  # @param {OmegaOptions|string} options The options to parse\n  # @returns {Promise<OmegaOptions>} The parsed options.\n  ###\n  parseOptions: (options) ->\n    if typeof options == 'string'\n      if options[0] != '{'\n        try\n          Buffer = require('buffer').Buffer\n          options = new Buffer(options, 'base64').toString('utf8')\n        catch _\n          options = null\n      options = try JSON.parse(options)\n    if not options\n      return throw new Error('Invalid options!')\n\n    return options\n\n  ###*\n  # Reset the options to the given options or initial options.\n  # @param {?OmegaOptions} options The options to set. Defaults to initial.\n  # @returns {Promise<OmegaOptions>} The options just applied\n  ###\n  reset: (options) ->\n    @log.method('Options#reset', this, arguments)\n    options ?= @getDefaultOptions()\n    @upgrade(@parseOptions(options)).then ([opt]) =>\n      # Disable syncing when resetting to avoid affecting sync storage.\n      @sync.enabled = false if @sync?\n      @_state.remove(['syncOptions'])\n      @_storage.remove().then(=>\n        @_storage.set(opt)\n      ).then =>\n        @init()\n\n  ###*\n  # Called on the first initialization of options.\n  # @param {reason} reason The value of 'firstRun' in state.\n  ###\n  onFirstRun: (reason) -> null\n\n  ###*\n  # Return the default options used initially and on resets.\n  # @returns {?OmegaOptions} The default options.\n  ###\n  getDefaultOptions: -> require('./default_options')()\n\n  ###*\n  # Return all options.\n  # @returns {?OmegaOptions} The options.\n  ###\n  getAll: -> @_options\n\n  ###*\n  # Get profile by name.\n  # @returns {?{}} The profile, or undefined if no such profile.\n  ###\n  profile: (name) -> OmegaPac.Profiles.byName(name, @_options)\n\n  ###*\n  # Apply the patch to the current options.\n  # @param {jsondiffpatch} patch The patch to apply\n  # @returns {Promise<OmegaOptions>} The updated options\n  ###\n  patch: (patch) ->\n    return unless patch\n    @log.method('Options#patch', this, arguments)\n    \n    @_options = jsondiffpatch.patch(@_options, patch)\n    # Only set the keys whose values have changed.\n    changes = {}\n    for own key, delta of patch\n      if delta.length == 3 and delta[1] == 0 and delta[2] == 0\n        # [previousValue, 0, 0] indicates that the key was removed.\n        changes[key] = undefined\n      else\n        changes[key] = @_options[key]\n\n    @_setOptions(changes)\n\n  _setOptions: (changes, args) =>\n    removed = []\n    checkRev = args?.checkRevision ? false\n    profilesChanged = false\n    currentProfileAffected = false\n    for own key, value of changes\n      if typeof value == 'undefined'\n        delete @_options[key]\n        removed.push(key)\n        if key[0] == '+'\n          profilesChanged = true\n          if key == '+' + @_currentProfileName\n            currentProfileAffected = 'removed'\n      else\n        if key[0] == '+'\n          if checkRev and @_options[key]\n            result = OmegaPac.Revision.compare(@_options[key].revision,\n              value.revision)\n            continue if result >= 0\n          profilesChanged = true\n        @_options[key] = value\n      if not currentProfileAffected and @_watchingProfiles[key]\n        currentProfileAffected = 'changed'\n    switch currentProfileAffected\n      when 'removed'\n        @applyProfile(@fallbackProfileName)\n      when 'changed'\n        @applyProfile(@_currentProfileName, update: false)\n      else\n        @_setAvailableProfiles() if profilesChanged\n    if args?.persist ? true\n      @sync?.requestPush(changes) if @sync?.enabled\n      for key in removed\n        delete changes[key]\n      @_storage.set(changes).then =>\n        @_storage.remove(removed)\n        return @_options\n\n  _watch: ->\n    handler = (changes) =>\n      if changes\n        @_setOptions(changes, {checkRevision: true, persist: false})\n      else\n        # Initial update.\n        changes = @_options\n\n      refresh = changes['-refreshOnProfileChange']\n      if refresh?\n        @_state.set({'refreshOnProfileChange': refresh})\n\n      if Object::hasOwnProperty.call changes, '-showExternalProfile'\n        showExternal = changes['-showExternalProfile']\n        if not showExternal?\n          showExternal = true\n          @_setOptions({'-showExternalProfile': true}, {persist: true})\n        @_state.set({'showExternalProfile': showExternal})\n\n      quickSwitchProfiles = changes['-quickSwitchProfiles']\n      quickSwitchProfiles = @_cleanUpQuickSwitchProfiles(quickSwitchProfiles)\n      if changes['-enableQuickSwitch']? or quickSwitchProfiles?\n        @reloadQuickSwitch()\n      if changes['-downloadInterval']?\n        @schedule 'updateProfile', @_options['-downloadInterval'], =>\n          @updateProfile()\n      if changes['-showInspectMenu']? or changes == @_options\n        showMenu = @_options['-showInspectMenu']\n        if not showMenu?\n          showMenu = true\n          @_setOptions({'-showInspectMenu': true}, {persist: true})\n        @setInspect(showMenu: showMenu)\n      if changes['-monitorWebRequests']? or changes == @_options\n        monitorWebRequests = @_options['-monitorWebRequests']\n        if not monitorWebRequests?\n          monitorWebRequests = true\n          @_setOptions({'-monitorWebRequests': true}, {persist: true})\n        @setMonitorWebRequests(monitorWebRequests)\n\n    handler()\n    @_storage.watch null, handler\n\n  _cleanUpQuickSwitchProfiles: (quickSwitchProfiles) ->\n    return unless quickSwitchProfiles?\n    seenQuickSwitchProfile = {}\n    validQuickSwitchProfiles = quickSwitchProfiles.filter (name) =>\n      return false if not name\n      key = OmegaPac.Profiles.nameAsKey(name)\n      return false if seenQuickSwitchProfile[key]\n      return false if not OmegaPac.Profiles.byName(name, @_options)\n      seenQuickSwitchProfile[key] = true\n      return true\n    if validQuickSwitchProfiles.length != quickSwitchProfiles.length\n      @_setOptions(\n        {'-quickSwitchProfiles': validQuickSwitchProfiles}, {persist: true})\n    return validQuickSwitchProfiles\n\n  ###*\n  # Reload the quick switch according to settings.\n  # @returns {Promise} A promise which is fulfilled when the quick switch is set\n  ###\n  reloadQuickSwitch: ->\n    profiles = @_options['-quickSwitchProfiles']\n    profiles = null if profiles.length < 2\n    if @_options['-enableQuickSwitch']\n      @setQuickSwitch(profiles, !!profiles)\n    else\n      @setQuickSwitch(null, !!profiles)\n\n  ###*\n  # Apply the settings related to element proxy inspection.\n  # In base class, this method is not implemented and will not do anything.\n  # @param {{}} settings\n  # @param {boolean} settings.showMenu Whether to show the menu or not\n  # @returns {Promise} A promise which is fulfilled when the settings apply\n  ###\n  setInspect: -> Promise.resolve()\n\n  ###*\n  # Apply the settings related to web request monitoring.\n  # In base class, this method is not implemented and will not do anything.\n  # @param {boolean} enabled Whether network shall be monitored or not\n  # @returns {Promise} A promise which is fulfilled when the settings apply\n  ###\n  setMonitorWebRequests: -> Promise.resolve()\n\n  ###*\n  # @callback watchCallback\n  # @param {Object.<string, {}>} changes A map from keys to values.\n  ###\n\n  ###*\n  # Watch for any changes to the options\n  # @param {watchCallback} callback Called everytime the value of a key changes\n  # @returns {function} Calling the returned function will stop watching.\n  ###\n  watch: (callback) -> @_storage.watch null, callback\n\n  _profileNotFound: (name) ->\n    @log.error(\"Profile #{name} not found! Things may go very, very wrong.\")\n    return OmegaPac.Profiles.create({\n      name: name\n      profileType: 'VirtualProfile'\n      defaultProfileName: 'direct'\n    })\n\n  ###*\n  # Get PAC script for profile.\n  # @param {?string|Object} profile The name of the profile, or the profile.\n  # @param {bool=false} compress Compress the script if true.\n  # @returns {string} The compiled\n  ###\n  pacForProfile: (profile, compress = false) ->\n    ast = OmegaPac.PacGenerator.script(@_options, profile,\n      profileNotFound: @_profileNotFound.bind(this))\n    if compress\n      ast = OmegaPac.PacGenerator.compress(ast)\n    Promise.resolve OmegaPac.PacGenerator.ascii(ast.print_to_string())\n\n  _setAvailableProfiles: ->\n    profile = if @_currentProfileName then @currentProfile() else null\n    profiles = {}\n    currentIncludable = profile && OmegaPac.Profiles.isIncludable(profile)\n    allReferenceSet = null\n    if not profile or not OmegaPac.Profiles.isInclusive(profile)\n      results = []\n    OmegaPac.Profiles.each @_options, (key, p) =>\n      profiles[key] =\n        name: p.name\n        profileType: p.profileType\n        color: p.color\n        desc: @printProfile(p)\n        builtin: if p.builtin then true\n      if p.profileType == 'VirtualProfile'\n        profiles[key].defaultProfileName = p.defaultProfileName\n        if not allReferenceSet?\n          allReferenceSet =\n            if profile\n              OmegaPac.Profiles.allReferenceSet(profile, @_options,\n                profileNotFound: @_profileNotFound.bind(this))\n            else\n              {}\n        if allReferenceSet[key]\n          profiles[key].validResultProfiles =\n            OmegaPac.Profiles.validResultProfilesFor(p, @_options)\n              .map (result) -> result.name\n      if currentIncludable and OmegaPac.Profiles.isIncludable(p)\n        results?.push(p.name)\n    if profile and OmegaPac.Profiles.isInclusive(profile)\n      results = OmegaPac.Profiles.validResultProfilesFor(profile, @_options)\n      results = results.map (profile) -> profile.name\n    @_state.set({\n      'availableProfiles': profiles\n      'validResultProfiles': results\n    })\n\n  ###*\n  # Apply the profile by name.\n  # @param {?string} name The name of the profile, or null for default.\n  # @param {?{}} options Some options\n  # @param {bool=true} options.proxy Set proxy for the applied profile if true\n  # @param {bool=true} options.update Try to update this profile and referenced\n  # profiles after the proxy is set.\n  # @param {bool=false} options.system Whether options is in system mode.\n  # @param {{}=undefined} options.reason will be passed to currentProfileChanged\n  # @returns {Promise} A promise which is fulfilled when the profile is applied.\n  ###\n  applyProfile: (name, options) ->\n    @log.method('Options#applyProfile', this, arguments)\n    profile = OmegaPac.Profiles.byName(name, @_options)\n    if not profile\n      return Promise.reject new ProfileNotExistError(name)\n\n    @_currentProfileName = profile.name\n    @_isSystem = options?.system || (profile.profileType == 'SystemProfile')\n    @_watchingProfiles = OmegaPac.Profiles.allReferenceSet(profile, @_options,\n      profileNotFound: @_profileNotFound.bind(this))\n\n    @_state.set({\n      'currentProfileName': @_currentProfileName\n      'isSystemProfile': @_isSystem\n      'currentProfileCanAddRule':\n        profile.rules? and profile.profileType != 'VirtualProfile'\n    })\n    @_setAvailableProfiles()\n\n    @currentProfileChanged(options?.reason)\n    if options? and options.proxy == false\n      return Promise.resolve()\n    @_tempProfileActive = false\n    if @_tempProfile? and OmegaPac.Profiles.isIncludable(profile)\n      @_tempProfileActive = true\n      if @_tempProfile.defaultProfileName != profile.name\n        @_tempProfile.defaultProfileName = profile.name\n        @_tempProfile.color = profile.color\n        OmegaPac.Profiles.updateRevision(@_tempProfile)\n\n      removedKeys = []\n      for own key, list of @_tempProfileRulesByProfile\n        if not OmegaPac.Profiles.byKey(key, @_options)\n          removedKeys.push(key)\n          for rule in list\n            rule.profileName = null\n            @_tempProfile.rules.splice(@_tempProfile.rules.indexOf(rule), 1)\n      if removedKeys.length > 0\n        for key in removedKeys\n          delete @_tempProfileRulesByProfile[key]\n        OmegaPac.Profiles.updateRevision(@_tempProfile)\n\n      @_watchingProfiles = OmegaPac.Profiles.allReferenceSet(@_tempProfile,\n        @_options, profileNotFound: @_profileNotFound.bind(this))\n\n      applyProxy = @proxyImpl.applyProfile(@_tempProfile, profile, @_options)\n    else\n      applyProxy = @proxyImpl.applyProfile(profile, profile, @_options)\n\n    return applyProxy if options? and options.update == false\n\n    applyProxy.then =>\n      return unless @_options['-downloadInterval'] > 0\n      return unless @_currentProfileName == profile.name\n      updateProfiles = []\n      for key, name of @_watchingProfiles\n        updateProfiles.push(name)\n      if updateProfiles.length > 0\n        @updateProfile(updateProfiles)\n    return applyProxy\n\n  ###*\n  # Get the current applied profile.\n  # @returns {{}} The current profile\n  ###\n  currentProfile: ->\n    if @_currentProfileName\n      OmegaPac.Profiles.byName(@_currentProfileName, @_options)\n    else\n      @_externalProfile\n\n  ###*\n  # Return true if in system mode.\n  # @returns {boolean} True if system mode is activated\n  ###\n  isSystem: -> @_isSystem\n\n  ###*\n  # Called when current profile has changed.\n  # In base class, this method is not implemented and will not do anything.\n  ###\n  currentProfileChanged: -> null\n\n  ###*\n  # Set or disable the quick switch profiles.\n  # In base class, this method is not implemented and will not do anything.\n  # @param {string[]|null} quickSwitch The profile names, or null to disable\n  # @param {boolean} canEnable Whether user can enable quick switch or not.\n  # @returns {Promise} A promise which is fulfilled when the quick switch is set\n  ###\n  setQuickSwitch: (quickSwitch, canEnable) ->\n    Promise.resolve()\n\n  ###*\n  # Schedule a task that runs every periodInMinutes.\n  # In base class, this method is not implemented and will not do anything.\n  # @param {string} name The name of the schedule. If there is a previous\n  # schedule with the same name, it will be replaced by the new one.\n  # @param {number} periodInMinutes The interval of the schedule\n  # @param {function} callback The callback to call when the task runs\n  # @returns {Promise} A promise which is fulfilled when the schedule is set\n  ###\n  schedule: (name, periodInMinutes, callback) ->\n    Promise.resolve()\n\n  ###*\n  # Return true if the match result of current profile does not change with URLs\n  # @returns {bool} Whether @match always return the same result for requests\n  ###\n  isCurrentProfileStatic: ->\n    return true if not @_currentProfileName\n    return false if @_tempProfileActive\n    currentProfile = @currentProfile()\n    return false if OmegaPac.Profiles.isInclusive(currentProfile)\n    return true\n\n  ###*\n  # Update the profile by name.\n  # @param {(string|string[]|null)} name The name of the profiles,\n  # or null for all.\n  # @param {?bool} opt_bypass_cache Do not read from the cache if true\n  # @returns {Promise<Object.<string,({}|Error)>>} A map from keys to updated\n  # profiles or errors.\n  # A value is an error if `value instanceof Error`. Otherwise the value is an\n  # updated profile.\n  ###\n  updateProfile: (name, opt_bypass_cache) ->\n    @log.method('Options#updateProfile', this, arguments)\n    results = {}\n    OmegaPac.Profiles.each @_options, (key, profile) =>\n      if name?\n        if Array.isArray(name)\n          return unless name.indexOf(profile.name) >= 0\n        else\n          return unless profile.name == name\n      url = OmegaPac.Profiles.updateUrl(profile)\n      if url\n        type_hints = OmegaPac.Profiles.updateContentTypeHints(profile)\n        fetchResult = @fetchUrl(url, opt_bypass_cache, type_hints)\n        results[key] = fetchResult.then((data) =>\n          # Errors and unsuccessful response codes shoud have been already\n          # rejected by fetchUrl and will not end up here.\n          # So empty data indicates success without any update (e.g. 304).\n          return profile unless data\n          profile = OmegaPac.Profiles.byKey(key, @_options)\n          profile.lastUpdate = new Date().toISOString()\n          if OmegaPac.Profiles.update(profile, data)\n            OmegaPac.Profiles.dropCache(profile)\n            changes = {}\n            changes[key] = profile\n            @_setOptions(changes).return(profile)\n          else\n            return profile\n        ).catch (reason) ->\n          if reason instanceof Error then reason else new Error(reason)\n\n    Promise.props(results)\n\n  ###*\n  # Make an HTTP GET request to fetch the content of the url.\n  # In base class, this method is not implemented and will always reject.\n  # @param {string} url The name of the profiles,\n  # @param {?bool} opt_bypass_cache Do not read from the cache if true\n  # @param {?string} opt_type_hints MIME type hints for downloaded content.\n  # @returns {Promise<String>} The text content fetched from the url\n  ###\n  fetchUrl: (url, opt_bypass_cache, opt_type_hints) ->\n    Promise.reject new Error('not implemented')\n\n  _replaceRefChanges: (fromName, toName, changes) ->\n    changes ?= {}\n\n    OmegaPac.Profiles.each @_options, (key, p) ->\n      return if p.name == fromName or p.name == toName\n      if OmegaPac.Profiles.replaceRef(p, fromName, toName)\n        OmegaPac.Profiles.updateRevision(p)\n        changes[OmegaPac.Profiles.nameAsKey(p)] = p\n\n    if @_options['-startupProfileName'] == fromName\n      changes['-startupProfileName'] = toName\n    quickSwitch = @_options['-quickSwitchProfiles']\n    # Change fromName to toName in Quick Switch, but only if it does not contain\n    # toName already. Otherwise it may cause duplicates.\n    if quickSwitch.indexOf(toName) < 0\n      for i in [0...quickSwitch.length]\n        if quickSwitch[i] == fromName\n          quickSwitch[i] = toName\n          changes['-quickSwitchProfiles'] = quickSwitch\n\n    return changes\n\n  ###*\n  # Replace all references of profile fromName to toName.\n  # @param {String} fromName The original profile name\n  # @param {String} toname The target profile name\n  # @returns {Promise<OmegaOptions>} The updated options\n  ###\n  replaceRef: (fromName, toName) ->\n    @log.method('Options#replaceRef', this, arguments)\n    profile = OmegaPac.Profiles.byName(fromName, @_options)\n    if not profile\n      return Promise.reject new ProfileNotExistError(fromName)\n\n    changes = @_replaceRefChanges(fromName, toName)\n    for own key, value of changes\n      @_options[key] = value\n\n    fromKey = OmegaPac.Profiles.nameAsKey(fromName)\n    if @_watchingProfiles[fromKey]\n      if @_currentProfileName == fromName\n        @_currentProfileName = toName\n      @applyProfile(@_currentProfileName)\n\n    @_setOptions(changes)\n\n  ###*\n  # Rename a profile and update references and options\n  # @param {String} fromName The original profile name\n  # @param {String} toname The target profile name\n  # @returns {Promise<OmegaOptions>} The updated options\n  ###\n  renameProfile: (fromName, toName) ->\n    @log.method('Options#renameProfile', this, arguments)\n    if OmegaPac.Profiles.byName(toName, @_options)\n      return Promise.reject new Error(\"Target name #{name} already taken!\")\n    profile = OmegaPac.Profiles.byName(fromName, @_options)\n    if not profile\n      return Promise.reject new ProfileNotExistError(fromName)\n\n    profile.name = toName\n    changes = {}\n    changes[OmegaPac.Profiles.nameAsKey(profile)] = profile\n\n    @_replaceRefChanges(fromName, toName, changes)\n    for own key, value of changes\n      @_options[key] = value\n\n    fromKey = OmegaPac.Profiles.nameAsKey(fromName)\n    changes[fromKey] = undefined\n    delete @_options[fromKey]\n\n    if @_watchingProfiles[fromKey]\n      if @_currentProfileName == fromName\n        @_currentProfileName = toName\n      @applyProfile(@_currentProfileName)\n\n    @_setOptions(changes)\n\n  ###*\n  # Add a temp rule.\n  # @param {String} domain The domain for the temp rule.\n  # @param {String} profileName The profile to apply for the domain.\n  # @returns {Promise} A promise which is fulfilled when the rule is applied.\n  ###\n  addTempRule: (domain, profileName) ->\n    @log.method('Options#addTempRule', this, arguments)\n    return Promise.resolve() if not @_currentProfileName\n    profile = OmegaPac.Profiles.byName(profileName, @_options)\n    if not profile\n      return Promise.reject new ProfileNotExistError(profileName)\n    if not @_tempProfile?\n      @_tempProfile = OmegaPac.Profiles.create('', 'SwitchProfile')\n      currentProfile = @currentProfile()\n      @_tempProfile.color = currentProfile.color\n      @_tempProfile.defaultProfileName = currentProfile.name\n    \n    changed = false\n    rule = @_tempProfileRules[domain]\n    if rule and rule.profileName\n      if rule.profileName != profileName\n        key = OmegaPac.Profiles.nameAsKey(rule.profileName)\n        list = @_tempProfileRulesByProfile[key]\n        list.splice(list.indexOf(rule), 1)\n\n        rule.profileName = profileName\n        changed = true\n    else\n      rule =\n        condition:\n          conditionType: 'HostWildcardCondition'\n          pattern: '*.' + domain\n        profileName: profileName\n        isTempRule: true\n      @_tempProfile.rules.push(rule)\n      @_tempProfileRules[domain] = rule\n      changed = true\n\n    key = OmegaPac.Profiles.nameAsKey(profileName)\n    rulesByProfile = @_tempProfileRulesByProfile[key]\n    if not rulesByProfile?\n      rulesByProfile = @_tempProfileRulesByProfile[key] = []\n    rulesByProfile.push(rule)\n\n    if changed\n      OmegaPac.Profiles.updateRevision(@_tempProfile)\n      @applyProfile(@_currentProfileName)\n    else\n      Promise.resolve()\n\n  ###*\n  # Find a temp rule by domain.\n  # @param {String} domain The domain of the temp rule.\n  # @returns {Promise<?String>} The profile name for the domain, or null if such\n  # rule does not exist.\n  ###\n  queryTempRule: (domain) ->\n    rule = @_tempProfileRules[domain]\n    if rule\n      if rule.profileName\n        return rule.profileName\n      else\n        delete @_tempProfileRules[domain]\n    return null\n\n  ###*\n  # Add a condition to the current active switch profile.\n  # @param {Object.<String,{}>} cond The condition to add\n  # @param {string>} profileName The name of the result profile of the rule.\n  # @returns {Promise} A promise which is fulfilled when the condition is saved.\n  ###\n  addCondition: (condition, profileName) ->\n    @log.method('Options#addCondition', this, arguments)\n    return Promise.resolve() if not @_currentProfileName\n    profile = OmegaPac.Profiles.byName(@_currentProfileName, @_options)\n    if not profile?.rules?\n      return Promise.reject new Error(\n        \"Cannot add condition to Profile #{@profile.name} (#{profile.type})\")\n    target = OmegaPac.Profiles.byName(profileName, @_options)\n    if not target?\n      return Promise.reject new ProfileNotExistError(profileName)\n    if not Array.isArray(condition)\n      condition = [condition]\n\n    for cond in condition\n      # Try to remove rules with the same condition first.\n      tag = OmegaPac.Conditions.tag(cond)\n      for i in [0...profile.rules.length]\n        if OmegaPac.Conditions.tag(profile.rules[i].condition) == tag\n          profile.rules.splice(i, 1)\n          break\n\n\n      if @_options['-addConditionsToBottom']\n        profile.rules.push({\n          condition: cond\n          profileName: profileName\n        })\n      else\n        profile.rules.unshift({\n          condition: cond\n          profileName: profileName\n        })\n\n    OmegaPac.Profiles.updateRevision(profile)\n    changes = {}\n    changes[OmegaPac.Profiles.nameAsKey(profile)] = profile\n    @_setOptions(changes)\n\n  ###*\n  # Set the defaultProfileName of the profile.\n  # @param {string>} profileName The name of the profile to modify.\n  # @param {string>} defaultProfileName The defaultProfileName to set.\n  # @returns {Promise} A promise which is fulfilled when the profile is saved.\n  ###\n  setDefaultProfile: (profileName, defaultProfileName) ->\n    @log.method('Options#setDefaultProfile', this, arguments)\n    profile = OmegaPac.Profiles.byName(profileName, @_options)\n    if not profile?\n      return Promise.reject new ProfileNotExistError(profileName)\n    else if not profile.defaultProfileName?\n      return Promise.reject new Error(\"Profile #{@profile.name} \" +\n        \"(@{profile.type}) does not have defaultProfileName!\")\n    target = OmegaPac.Profiles.byName(defaultProfileName, @_options)\n    if not target?\n      return Promise.reject new ProfileNotExistError(defaultProfileName)\n\n    profile.defaultProfileName = defaultProfileName\n    OmegaPac.Profiles.updateRevision(profile)\n    changes = {}\n    changes[OmegaPac.Profiles.nameAsKey(profile)] = profile\n    @_setOptions(changes)\n\n  ###*\n  # Add a profile to the options\n  # @param {{}} profile The profile to create\n  # @returns {Promise<{}>} The saved profile\n  ###\n  addProfile: (profile) ->\n    @log.method('Options#addProfile', this, arguments)\n    if OmegaPac.Profiles.byName(profile.name, @_options)\n      return Promise.reject(\n        new Error(\"Target name #{profile.name} already taken!\"))\n    else\n      changes = {}\n      changes[OmegaPac.Profiles.nameAsKey(profile)] = profile\n      @_setOptions(changes)\n\n  ###*\n  # Get the matching results of a request\n  # @param {{}} request The request to test\n  # @returns {Promise<{profile: {}, results: {}[]}>} The last matched profile\n  # and the matching details\n  ###\n  matchProfile: (request) ->\n    if not @_currentProfileName\n      return Promise.resolve({profile: @_externalProfile, results: []})\n    results = []\n    profile =\n      if @_tempProfileActive\n        @_tempProfile\n      else\n        OmegaPac.Profiles.byName(@_currentProfileName, @_options)\n    while profile\n      lastProfile = profile\n      result = OmegaPac.Profiles.match(profile, request)\n      break unless result?\n      results.push(result)\n      if Array.isArray(result)\n        next = result[0]\n      else if result.profileName\n        next = OmegaPac.Profiles.nameAsKey(result.profileName)\n      else\n        break\n      profile = OmegaPac.Profiles.byKey(next, @_options)\n    Promise.resolve(profile: lastProfile, results: results)\n\n  ###*\n  # Notify Options that the proxy settings are set externally.\n  # @param {{}} profile The external profile\n  # @param {?{}} args Extra arguments\n  # @param {boolean=false} args.noRevert If true, do not revert changes.\n  # @param {boolean=false} args.internal If true, treat the profile change as\n  # caused by the options itself instead of external reasons.\n  # @returns {Promise} A promise which is fulfilled when the profile is set\n  ###\n  setExternalProfile: (profile, args) ->\n    if @_options['-revertProxyChanges'] and not @_isSystem\n      if profile.name != @_currentProfileName and @_currentProfileName\n        if not args?.noRevert\n          @applyProfile(@_revertToProfileName)\n          @_revertToProfileName = null\n          return\n        else\n          @_revertToProfileName ?= @_currentProfileName\n    p = OmegaPac.Profiles.byName(profile.name, @_options)\n    if p\n      if args?.internal\n        @applyProfile(p.name, {proxy: false})\n      else\n        @applyProfile(p.name,\n          {proxy: false, system: @_isSystem, reason: 'external'})\n    else\n      @_currentProfileName = null\n      @_externalProfile = profile\n      profile.color ?= '#49afcd'\n      @_state.set({\n        'currentProfileName': ''\n        'externalProfile': profile\n        'validResultProfiles': []\n        'currentProfileCanAddRule': false\n      })\n      @currentProfileChanged('external')\n      return\n\n  ###*\n  # Switch options syncing on and off.\n  # @param {boolean} enabled Whether to enable syncing\n  # @param {?{}} args Extra arguments\n  # @param {boolean=false} args.force If true, overwrite options when conflict\n  # @returns {Promise} A promise which is fulfilled when the syncing is switched\n  ###\n  setOptionsSync: (enabled, args) ->\n    @log.method('Options#setOptionsSync', this, arguments)\n    if not @sync?\n      return Promise.reject(new Error('Options syncing is unsupported.'))\n    @_state.get({'syncOptions': ''}).then ({syncOptions}) =>\n      if not enabled\n        if syncOptions == 'sync'\n          @_state.set({'syncOptions': 'conflict'})\n        @sync.enabled = false\n        @_syncWatchStop?()\n        @_syncWatchStop = null\n        return\n\n      if syncOptions == 'conflict'\n        if not args?.force\n          return Promise.reject(new Error(\n            'Syncing not enabled due to conflict. Retry with force to overwrite\n            local options and enable syncing.'))\n      return if syncOptions == 'sync'\n      @_state.set({'syncOptions': 'sync'}).then =>\n        if syncOptions == 'conflict'\n          # Try to re-init options from sync.\n          @sync.enabled = false\n          @_storage.remove().then =>\n            @sync.enabled = true\n            @init()\n        else\n          @sync.enabled = true\n          @_syncWatchStop?()\n          @sync.requestPush(@_options)\n          @_syncWatchStop = @sync.watchAndPull(@_storage)\n          return\n\n  ###*\n  # Clear the sync storage, resetting syncing state to pristine.\n  # @returns {Promise} A promise which is fulfilled when the syncing is reset.\n  ###\n  resetOptionsSync: ->\n    @log.method('Options#resetOptionsSync', this, arguments)\n    if not @sync?\n      return Promise.reject(new Error('Options syncing is unsupported.'))\n    @sync.enabled = false\n    @_syncWatchStop?()\n    @_syncWatchStop = null\n    @_state.set({'syncOptions': 'conflict'})\n\n    return @sync.storage.remove().then =>\n      @_state.set({'syncOptions': 'pristine'})\n\nmodule.exports = Options\n"
  },
  {
    "path": "omega-target/src/options_sync.coffee",
    "content": "### @module omega-target/options_sync ###\nPromise = require 'bluebird'\nStorage = require './storage'\nLog = require './log'\n{Revision} = require 'omega-pac'\njsondiffpatch = require 'jsondiffpatch'\nTokenBucket = require('limiter').TokenBucket\n\nclass OptionsSync\n  @TokenBucket: TokenBucket\n\n  _timeout: null\n  _bucket: null\n  _waiting: false\n\n  ###*\n  # The debounce timeout (ms) for requestPush scheduling. See requestPush.\n  # @type number\n  ###\n  debounce: 1000\n\n  ###*\n  # The throttling timeout (ms) for watchAndPull. See watchAndPull.\n  # @type number\n  ###\n  pullThrottle: 1000\n\n  ###*\n  # The remote storage of syncing.\n  # @type Storage\n  ###\n  storage: null\n\n  constructor: (@storage, @_bucket) ->\n    @_pending = {}\n    @_bucket ?= new TokenBucket(10, 10, 'minute', null)\n    @_bucket.clear ?= =>\n      @_bucket.tryRemoveTokens(@_bucket.content)\n\n  ###*\n  # Transform storage values for syncing. The default implementation applies no\n  # transformation, but the behavior can be altered by assigning to this field.\n  # Note: Transformation is applied before merging.\n  # @param {{}} value The value to transform\n  # @param {{}} key The key of the item\n  # @returns {{}} The transformed value\n  ###\n  transformValue: (v) -> v\n\n  ###*\n  # Merge newVal and oldVal of a given key. The default implementation choose\n  # between newVal and oldVal based on the following rules:\n  # 1. Choose oldVal if syncOptions is 'disabled' in either oldVal or newVal.\n  # 2. Choose oldVal if it has a revision newer than or equal to that of newVal.\n  # 3. Choose oldVal if it deeply equals newVal.\n  # 4. Otherwise, choose newVal.\n  #\n  # @param {string} key The key of the item\n  # @param {} newVal The new value\n  # @param {} oldVal The old value\n  # @returns {} The merged result\n  ###\n  merge: do ->\n    diff = jsondiffpatch.create(\n      objectHash: (obj) -> JSON.stringify(obj)\n      textDiff: minLength: 1 / 0\n    )\n    return (key, newVal, oldVal) ->\n      return oldVal if newVal == oldVal\n      if oldVal?.syncOptions == 'disabled' or newVal?.syncOptions == 'disabled'\n        return oldVal\n      if oldVal?.revision? and newVal?.revision?\n        result = Revision.compare(oldVal.revision, newVal.revision)\n        return oldVal if result >= 0\n      return oldVal unless diff.diff(oldVal, newVal)?\n      return newVal\n\n  ###*\n  # Whether syncing is enabled or not. See requestPush for the effect.\n  # @type boolean\n  ###\n  enabled: true\n\n  ###*\n  # Request pushing the changes to remote storage. The changes are cached first,\n  # and then the actual write operations are scheduled if enabled is true.\n  # The actual operation is delayed and debounced, combining continuous writes\n  # in a short period into a single write operation.\n  # @param {Object.<string, {}>} changes A map from keys to values.\n  ###\n  requestPush: (changes) ->\n    clearTimeout(@_timeout) if @_timeout?\n    for own key, value of changes\n      if typeof value != 'undefined'\n        value = @transformValue(value, key)\n        continue if typeof value == 'undefined'\n      @_pending[key] = value\n    return unless @enabled\n    @_timeout = setTimeout(@_doPush.bind(this), @debounce)\n\n  ###*\n  # Returning the pending changes not written to the remote storage.\n  # @returns {Object.<string, {}>} The pending changes.\n  ###\n  pendingChanges: -> @_pending\n\n  _doPush: ->\n    @_timeout = null\n    return if @_waiting\n    @_waiting = true\n    @_bucket.removeTokens 1, =>\n      @storage.get(null).then((base) =>\n        changes = @_pending\n        @_pending = {}\n        @_waiting = false\n        Storage.operationsForChanges(changes, base: base, merge: @merge)\n      ).then ({set, remove}) =>\n        doSet =\n          if Object.keys(set).length == 0\n            Promise.resolve(0)\n          else\n            Log.log 'OptionsSync::set', set\n            @storage.set(set).return(1)\n        doSet.then((cost) =>\n          set = {}\n          if remove.length > 0\n            if @_bucket.tryRemoveTokens(cost)\n              Log.log 'OptionsSync::remove', remove\n              return @storage.remove(remove)\n            else\n              return Promise.reject('bucket')\n        ).catch (e) =>\n          # Re-submit the changes for syncing, but with lower priority.\n          for own key, value of set\n            if not (key of @_pending)\n              @_pending[key] = value\n          for key in remove\n            if not (key of @_pending)\n              @_pending[key] = undefined\n\n          if e == 'bucket'\n            @_doPush()\n          else if e instanceof Storage.RateLimitExceededError\n            Log.log 'OptionsSync::rateLimitExceeded'\n            # Try to clear the @_bucket to wait more time before retrying.\n            @_bucket.clear()\n            @requestPush({})\n            return\n          else if e instanceof Storage.QuotaExceededError\n            # For now, we just disable syncing for all changed profiles.\n            # TODO(catus): Remove the largest profile each time and retry.\n            valuesAffected = 0\n            for own key, value of set\n              if key[0] == '+' and value.syncOptions != 'disabled'\n                value.syncOptions = 'disabled'\n                value.syncError = {reason: 'quotaPerItem'}\n                valuesAffected++\n            if valuesAffected > 0\n              @requestPush({})\n            else\n              @_pending = {}\n            return\n          else\n            Promise.reject(e)\n\n  _logOperations: (text, operations) ->\n    if Object.keys(operations.set).length\n      Log.log(text + '::set', operations.set)\n    if operations.remove.length\n      Log.log(text + '::remove', operations.remove)\n\n  ###*\n  # Pull the remote storage for changes, and write them to local.\n  # @param {Storage} local The local storage to be written to\n  # @returns {function} Calling the returned function will stop watching.\n  ###\n  copyTo: (local) ->\n    Promise.join local.get(null), @storage.get(null), (base, changes) =>\n      for own key of base when not (key of changes)\n        if key[0] == '+' and not base[key]?.syncOptions == 'disabled'\n          changes[key] = undefined\n      local.apply(\n        changes: changes\n        base: base\n        merge: @merge\n      ).then (operations) =>\n        @_logOperations('OptionsSync::copyTo', operations)\n\n  ###*\n  # Watch the remote storage for changes, and write them to local.\n  # The actual writing is throttled by pullThrottle with initial delay.\n  # @param {Storage} local The local storage to be written to\n  # @returns {function} Calling the returned function will stop watching.\n  ###\n  watchAndPull: (local) ->\n    pullScheduled = null\n    pull = {}\n    doPull = =>\n      local.get(null).then((base) =>\n        changes = pull\n        pull = {}\n        pullScheduled = null\n        Storage.operationsForChanges(changes, base: base, merge: @merge)\n      ).then (operations) =>\n        @_logOperations('OptionsSync::pull', operations)\n        local.apply(operations)\n\n    @storage.watch null, (changes) =>\n      for own key, value of changes\n        pull[key] = value\n      return if pullScheduled?\n      pullScheduled = setTimeout(doPull, @pullThrottle)\n\nmodule.exports = OptionsSync\n"
  },
  {
    "path": "omega-target/src/storage.coffee",
    "content": "### @module omega-target/storage ###\nPromise = require 'bluebird'\nLog = require './log'\n\nclass Storage\n  ###*\n  # Any operation that fails due to rate limiting should reject with an instance\n  # of RateLimitExceededError, when implemented in derived classes of Storage.\n  ###\n  @RateLimitExceededError:\n    class RateLimitExceededError extends Error\n      constructor: -> super\n\n  ###*\n  # Any operation that fails due to storage quota should reject with an instance\n  # of QuotaExceededError, when implemented in derived classes of Storage.\n  ###\n  @QuotaExceededError:\n    class QuotaExceededError extends Error\n      constructor: -> super\n\n  ###*\n  # If this storage is not available for some reason, all operations should\n  # reject with an instance of StorageUnavailableError, when implemented in\n  # derived classes of Storage.\n  # This error is considered fatal and unrecoverable in the current environment.\n  # Further access to this storage should be avoided until restart.\n  ###\n  @StorageUnavailableError:\n    class StorageUnavailableError extends Error\n      constructor: -> super\n\n  ###*\n  # A set of operations to be performed on a Storage.\n  # @typedef WriteOperations\n  # @type {object}\n  # @property {Object.<string, {}>} set - A map from keys to new values of the\n  # items to set\n  # @property {{}[]} remove - An array of keys to remove\n  ###\n\n  ###*\n  # Calculate the actual operations against storage that should be performed to\n  # replay the changes on a storage.\n  # @param {Object.<string, {}>} changes The changes to apply\n  # @param {?{}} args Extra arguments\n  # @param {Object.<string, {}>?} args.base The original items in the storage.\n  # @param {function(key, newVal, oldVal)} args.merge A function that merges\n  # the newVal and oldVal. oldVal is provided only if args.base is present.\n  # Otherwise it will be equal to newVal (i.e. merge(key, newVal, newVal)).\n  # @returns {WriteOperations} The operations that should be performed.\n  ###\n  @operationsForChanges: (changes, {base, merge} = {}) ->\n    set = {}\n    remove = []\n    for key, newVal of changes\n      oldVal = if base? then base[key] else newVal\n      if merge\n        newVal = merge(key, newVal, oldVal)\n      continue if base? and newVal == oldVal\n      if typeof newVal == 'undefined'\n        if typeof oldVal != 'undefined' or not base?\n          remove.push(key)\n      else\n        set[key] = newVal\n    return {set: set, remove: remove}\n\n  ###*\n  # Get the requested values by keys from the storage.\n  # @param {(string|string[]|null|Object.<string,{}>)} keys The keys to retrive,\n  # or null for all.\n  # @returns {Promise<(Object.<string, {}>)>} A map from keys to values\n  ###\n  get: (keys) ->\n    Log.method('Storage#get', this, arguments)\n    return Promise.resolve({}) unless @_items\n    if not keys?\n      keys = @_items\n    map = {}\n    if typeof keys == 'string'\n      map[keys] = @_items[keys]\n    else if Array.isArray(keys)\n      for key in keys\n        map[key] = @_items[key]\n    else if typeof keys == 'object'\n      for key, value of keys\n        map[key] = @_items[key] ? value\n    Promise.resolve(map)\n\n  ###*\n  # Set multiple values by keys in the storage.\n  # @param {(string|Object.<string,{}>)} items A map from key to value to set.\n  # @returns {Promise<(Object.<string, {}>)>} A map of key-value pairs just set.\n  ###\n  set: (items) ->\n    Log.method('Storage#set', this, arguments)\n    @_items ?= {}\n    for key, value of items\n      @_items[key] = value\n    Promise.resolve(items)\n  \n  ###*\n  # Remove items by keys from the storage.\n  # @param {(string|string[]|null)} keys The keys to remove, or null for all.\n  # @returns {Promise} A promise that fulfills on successful removal.\n  ###\n  remove: (keys) ->\n    Log.method('Storage#remove', this, arguments)\n    if @_items?\n      if not keys?\n        @_items = {}\n      else if Array.isArray(keys)\n        for key in keys\n          delete @_items[key]\n      else\n        delete @_items[keys]\n    Promise.resolve()\n  \n  ###*\n  # @callback watchCallback\n  # @param {Object.<string, {}>} map A map of key-value pairs just changed.\n  ###\n\n  ###*\n  # Watch for any changes to the storage.\n  # @param {(string|string[]|null)} keys The keys to watch, or null for all.\n  # @param {watchCallback} callback Called everytime something changes.\n  # @returns {function} Calling the returned function will stop watching.\n  ###\n  watch: (keys, callback) ->\n    Log.method('Storage#watch', this, arguments)\n    return (-> null)\n  \n  ###*\n  # Apply WriteOperations to the storage.\n  # @param {WriteOperations|{changes: Object.<string,{}>}} operations The\n  # operations to apply, or the changes to be applied. If changes is provided,\n  # the operations are calculated by Storage.operationsForChanges, with extra\n  # fields passed through as the second argument.\n  # @returns {Promise} A promise that fulfills on operation success.\n  ###\n  apply: (operations) ->\n    if 'changes' of operations\n      operations = Storage.operationsForChanges(operations.changes, operations)\n    @set(operations.set).then(=> @remove(operations.remove)).return(operations)\n\nmodule.exports = Storage\n"
  },
  {
    "path": "omega-target/src/utils.coffee",
    "content": "exports.Promise = require('bluebird')\n"
  },
  {
    "path": "omega-target/test/options_sync.coffee",
    "content": "chai = require 'chai'\nshould = chai.should()\nsinon = require 'sinon'\nchai.use require('sinon-chai')\n\ndescribe 'OptionsSync', ->\n  OptionsSync = require '../src/options_sync'\n  Storage = require '../src/storage'\n  Log = require '../src/log'\n  Promise = require 'bluebird'\n\n  before ->\n    # Silence storage and sync logging.\n    sinon.stub(Log, 'log')\n\n  after ->\n    Log.log.restore()\n\n  # coffeelint: disable=missing_fat_arrows\n  hookPostBasic = (func, hook) -> ->\n    result = func.apply(this, arguments)\n    hook.apply(this, arguments)\n    return result\n  # coffeelint: enable=missing_fat_arrows\n\n  hookPost = (args...) ->\n    if args.length == 2\n      [func, hook] = args\n      hostPostBasic(func, hook)\n    else\n      [obj, method, hook] = args\n      obj[method] = hookPostBasic(obj[method], hook)\n\n  describe '#merge', ->\n    sync = new OptionsSync()\n    it 'should choose the one with newer revision', ->\n      newVal = {revision: '2'}\n      oldVal = {revision: '1'}\n      sync.merge('example', newVal, oldVal).should.equal(newVal)\n    it 'should use oldVal when sync is disabled in newVal', ->\n      newVal = {revision: '2', is: 'newVal', syncOptions: 'disabled'}\n      oldVal = {revision: '1', is: 'oldVal'}\n      sync.merge('example', newVal, oldVal).should.equal(oldVal)\n    it 'should use oldVal when sync is disabled in oldVal', ->\n      newVal = {revision: '2', is: 'newVal'}\n      oldVal = {revision: '1', is: 'oldVal', syncOptions: 'disabled'}\n      sync.merge('example', newVal, oldVal).should.equal(oldVal)\n    it 'should favor oldVal when revisions are equal', ->\n      newVal = {revision: '1', is: 'newVal'}\n      oldVal = {revision: '1', is: 'oldVal'}\n      sync.merge('example', newVal, oldVal).should.equal(oldVal)\n    it 'should favor oldVal when newVal deeply equals oldVal', ->\n      newVal = {they: 'are', the: 'same'}\n      oldVal = {they: 'are', the: 'same'}\n      sync.merge('example', newVal, oldVal).should.equal(oldVal)\n    it 'should choose newVal when newVal is different', ->\n      newVal = {they: 'are', not: 'equal'}\n      oldVal = {they: 'are', not: 'identical'}\n      sync.merge('example', newVal, oldVal).should.equal(newVal)\n\n  describe '#requestPush', ->\n    unlimited = new OptionsSync.TokenBucket()\n\n    it 'should store pendingChanges', ->\n      sync = new OptionsSync()\n      sync.enabled = false\n      sync.requestPush({a: 1})\n      sync.pendingChanges().should.eql({a: 1})\n    it 'should schedule storage write', (done) ->\n      check = ->\n        return if storage.set.callCount == 0 or storage.remove.callCount == 0\n        storage.set.should.have.been.calledOnce.and.calledWith({b: 1})\n        storage.remove.should.have.been.calledOnce.and.calledWith(['a'])\n        done()\n\n      storage = new Storage()\n      storage.set({a: 1})\n      hookPost storage, 'set', check\n      hookPost storage, 'remove', check\n\n      sinon.spy(storage, 'set')\n      sinon.spy(storage, 'remove')\n\n      sync = new OptionsSync(storage, unlimited)\n      sync.debounce = 0\n      sync.requestPush({a: undefined, b: 1})\n\n    it 'should combine multiple write operations', (done) ->\n      check = ->\n        return if storage.set.callCount == 0 or storage.remove.callCount == 0\n        storage.set.should.have.been.calledOnce.and.calledWith({c: 1, d: 1})\n        storage.remove.should.have.been.calledOnce.and.calledWith(['a', 'b'])\n        done()\n\n      storage = new Storage()\n      storage.set({a: 1, b: 1})\n      hookPost storage, 'set', check\n      hookPost storage, 'remove', check\n\n      sinon.spy(storage, 'set')\n      sinon.spy(storage, 'remove')\n\n      sync = new OptionsSync(storage, unlimited)\n      sync.debounce = 0\n      sync.requestPush({a: undefined})\n      sync.requestPush({b: 2})\n      sync.requestPush({b: undefined})\n      sync.requestPush({c: 1})\n      sync.requestPush({d: 1})\n      sync.requestPush({e: 1})\n      sync.requestPush({e: undefined})\n\n    it 'should disable syncing for the profiles if quota is exceeded', (done) ->\n      options = {'+a': {is: 'a', oversized: true}, b: {is: 'b'}}\n\n      storage = new Storage()\n      storage.set = (changes) ->\n        for key, value of changes\n          if value.oversized\n            err = new Storage.QuotaExceededError()\n            err.perItem = true\n            return Promise.reject(err)\n        storage.set.should.have.been.calledTwice\n        storage.set.should.have.been.calledWith(options)\n        storage.set.should.have.been.calledWith({b: {is: 'b'}})\n        options['+a'].syncOptions.should.equal('disabled')\n        options['+a'].syncError.reason.should.equal('quotaPerItem')\n        done()\n        Promise.resolve()\n\n      sinon.spy(storage, 'set')\n\n      sync = new OptionsSync(storage, unlimited)\n      sync.debounce = 0\n      sync.requestPush(options)\n\n  describe '#copyTo', ->\n    it 'should fetch all items from remote storage', (done) ->\n      remote = new Storage()\n      remote.set({a: 1, b: 2, c: 3})\n\n      storage = new Storage()\n      hookPost storage, 'set', ->\n        storage.set.should.have.been.calledOnce.and.calledWith(\n          {a: 1, b: 2, c: 3}\n        )\n        done()\n\n      sinon.spy(storage, 'set')\n\n      sync = new OptionsSync(remote)\n      sync.copyTo(storage)\n\n    it 'should merge with local as base', (done) ->\n      check = ->\n        return if storage.set.callCount == 0 or storage.remove.callCount == 0\n        storage.set.should.have.been.calledOnce.and.calledWith({b: 2, c: 3})\n        storage.remove.should.have.been.calledOnce.and.calledWith(['d'])\n        done()\n\n      remote = new Storage()\n      remote.set({a: 1, b: 2, c: 3, d: undefined})\n\n      storage = new Storage()\n      storage.set({a: 1, b: 0, d: 4})\n\n      hookPost storage, 'set', check\n      hookPost storage, 'remove', check\n\n      sinon.spy(storage, 'set')\n      sinon.spy(storage, 'remove')\n\n      sync = new OptionsSync(remote)\n      sync.copyTo(storage)\n\n  describe '#watchAndPull', ->\n    it 'should pull changes into local when remote changes', (done) ->\n      check = ->\n        return if storage.set.callCount == 0 or storage.remove.callCount == 0\n        remote.watch.should.have.been.calledOnce\n        storage.set.should.have.been.calledOnce.and.calledWith({b: 2, c: 3})\n        storage.remove.should.have.been.calledOnce.and.calledWith(['d'])\n        done()\n\n      remote = new Storage()\n      hookPost remote, 'watch', (_, callback) ->\n        setTimeout (->\n          callback({a: 1})\n          callback({b: 2})\n          callback({c: 3})\n          callback({d: undefined})\n        ), 10\n\n      sinon.spy(remote, 'watch')\n\n      storage = new Storage()\n      storage.set({a: 1, b: 0, d: 4})\n\n      hookPost storage, 'set', check\n      hookPost storage, 'remove', check\n\n      sinon.spy(storage, 'set')\n      sinon.spy(storage, 'remove')\n\n      sync = new OptionsSync(remote)\n      sync.pullThrottle = 0\n      sync.watchAndPull(storage)\n"
  },
  {
    "path": "omega-target-chromium-extension/.gitignore",
    "content": "/index.js\n/omega_target_*.min.js\n\n/tmp\n/build\n/release.zip\n/web-ext-artifacts\n"
  },
  {
    "path": "omega-target-chromium-extension/Gruntfile.coffee",
    "content": "module.exports = (grunt) ->\n  require('load-grunt-config')(grunt)\n  require('./grunt-po2crx')(grunt)\n\n  grunt.registerTask 'chromium-manifest', ->\n    manifest = grunt.file.readJSON('overlay/manifest.json')\n    manifest.permissions = manifest.permissions.filter (p) -> p != 'downloads'\n    grunt.file.write('tmp/manifest.json', JSON.stringify(manifest))\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/aliases.coffee",
    "content": "module.exports =\n  default: [\n    'coffeelint'\n    'browserify'\n    'coffee'\n    'copy'\n    'po2crx'\n  ]\n  test: ['mochaTest']\n  release: ['default', 'chromium-manifest', 'compress']\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/browserify.coffee",
    "content": "path = require('path')\nmodule.exports =\n  index:\n    files:\n      'index.js': 'index.coffee'\n    options:\n      transform: ['coffeeify']\n      exclude: ['bluebird', 'omega-pac', 'omega-target']\n      browserifyOptions:\n        extensions: '.coffee'\n        builtins: []\n        standalone: 'index.coffee'\n        debug: true\n  browser:\n    files:\n      'omega_target_chromium_extension.min.js': 'index.coffee'\n    options:\n      alias: [\n        './index.coffee:OmegaTargetChromium'\n      ]\n      transform: ['coffeeify']\n      plugin:\n        if process.env.BUILD == 'release'\n          [['minifyify', {map: false}]]\n        else\n          []\n      browserifyOptions:\n        extensions: '.coffee'\n        standalone: 'OmegaTargetChromium'\n  omega_webext_proxy_script:\n    files:\n      'build/js/omega_webext_proxy_script.min.js':\n        'src/js/omega_webext_proxy_script.js'\n    options:\n      alias:\n        'omega-pac': 'omega-pac/omega_pac.min.js'\n      plugin:\n        if process.env.BUILD == 'release'\n          [['minifyify', {map: false}]]\n        else\n          []\n      browserifyOptions:\n        noParse: [require.resolve('omega-pac/omega_pac.min.js')]\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/coffee.coffee",
    "content": "module.exports =\n  coffee:\n    expand: true\n    cwd: 'src/coffee'\n    src: ['**/*.coffee']\n    dest: 'build/js/'\n    ext: '.js'\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/coffeelint.coffee",
    "content": "module.exports =\n  options:\n    arrow_spacing: level: 'error'\n    colon_assignment_spacing:\n      level: 'error'\n      spacing:\n        left: 0\n        right: 1\n    missing_fat_arrows: level: 'warn'\n    no_empty_functions: level: 'error'\n    no_empty_param_list: level: 'error'\n    no_interpolation_in_single_quotes: level: 'error'\n    no_stand_alone_at: level: 'error'\n    space_operators: level: 'error'\n    # https://github.com/clutchski/coffeelint/issues/525\n    indentation: level: 'ignore'\n\n  gruntfile: ['Gruntfile.coffee']\n  tasks: ['grunt/**/*.coffee']\n  src: ['*.coffee', 'src/**/*.coffee', 'test/**/*.coffee']\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/compress.coffee",
    "content": "module.exports =\n  options:\n    archive: './release.zip'\n    mode: 'zip'\n  build:\n    files: [\n      {\n        cwd: 'build'\n        src: ['**', '!manifest.json']\n        expand: true\n        filter: 'isFile'\n      }\n      {\n        cwd: 'tmp/'\n        src: 'manifest.json'\n        expand: true\n      }\n    ]\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/copy.coffee",
    "content": "module.exports =\n  web:\n    expand: true\n    cwd: '../omega-web/build'\n    src: ['**/*']\n    dest: 'build/'\n  target:\n    files:\n      'build/js/omega_target.min.js':\n        'node_modules/omega-target/omega_target.min.js'\n  target_self:\n    src: 'omega_target_chromium_extension.min.js'\n    dest: 'build/js/'\n  target_popup:\n    expand: true\n    cwd: 'src/js'\n    src: 'omega_target_popup.js'\n    dest: 'build/js/'\n  overlay:\n    expand: true\n    cwd: 'overlay'\n    src: ['**/*']\n    dest: 'build/'\n  docs:\n    expand: true\n    cwd: '..'\n    src: ['COPYING', 'AUTHORS']\n    dest: 'build/'\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/mochaTest.coffee",
    "content": "module.exports =\n  test:\n    options:\n      reporter: 'spec'\n      require: 'coffee-script/register'\n    src: ['test/**/*.coffee']\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/po2crx.coffee",
    "content": "module.exports =\n  locales:\n    files:\n      'build/_locales/en/messages.json':\n        '../omega-locales/en_US/LC_MESSAGES/omega-web.po'\n      'build/_locales/zh/messages.json':\n        '../omega-locales/zh_CN/LC_MESSAGES/omega-web.po'\n      'build/_locales/cs/messages.json':\n        '../omega-locales/cs/LC_MESSAGES/omega-web.po'\n      'build/_locales/fa/messages.json':\n        '../omega-locales/fa/LC_MESSAGES/omega-web.po'\n      'build/_locales/zh_CN/messages.json':\n        '../omega-locales/zh_CN/LC_MESSAGES/omega-web.po'\n      'build/_locales/zh_TW/messages.json':\n        '../omega-locales/zh_TW/LC_MESSAGES/omega-web.po'\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt/watch.coffee",
    "content": "module.exports =\n  grunt:\n    options:\n      reload: true\n    files:\n      'grunt/*'\n    tasks: ['coffeelint:tasks', 'default']\n  po2crx_locales:\n    files: ['../omega-locales/**/*']\n    tasks: ['po2crx:locales']\n  copy_web:\n    files: ['node_modules/omega-web/build/**/*']\n    tasks: ['copy:web']\n  copy_target:\n    files: ['node_modules/omega-target/omega_target.min.js']\n    tasks: ['copy:target']\n  copy_overlay:\n    files: ['overlay/**/*']\n    tasks: ['copy:overlay']\n  copy_target_popup:\n    files: ['src/js/omega_target_popup.js']\n    tasks: ['copy:target_popup']\n  coffee:\n    files: ['src/**/*.coffee']\n    tasks: ['coffeelint:src', 'browserify', 'coffee', 'copy:target_self']\n  browserify_omega_webext_proxy_script:\n    files: ['src/js/omega_webext_proxy_script.js']\n    tasks: ['browserify:omega_webext_proxy_script']\n"
  },
  {
    "path": "omega-target-chromium-extension/grunt-po2crx.coffee",
    "content": "module.exports = (grunt) ->\n  taskDesc = 'Convert gettext PO files to Chromium Extension messages format.'\n  # coffeelint: disable=missing_fat_arrows\n  grunt.registerMultiTask 'po2crx', taskDesc, ->\n    for f in this.files\n      result = {}\n      for src in f.src\n        json = require('po2json').parseFileSync(src)\n        for own key, value of json when key\n          message = value[1]\n          refs = []\n          matchCount = 0\n          message = message.replace /\\$(\\d+:)?(\\w+)\\$/g, (_, order, ref) ->\n            matchCount++\n            if order\n              order = parseInt(order)\n            else\n              order = matchCount\n            ### TODO(catus): Shall we enable this warning?\n            if matchCount > 1\n              grunt.log.writeln(\"In this message: #{key}=#{message}\")\n              grunt.log.writeln(\n                'Order not specified for two or more refs in same message.')\n            ###\n            refs[order] = ref\n            return '$' + ref + '$'\n\n          if not matchCount\n            placeholders = undefined\n          else\n            placeholders = {}\n            for i in [0...refs.length]\n              placeholder = refs[i] ? ('_unused_' + i)\n              placeholders[placeholder] = {content: '$' + i}\n          if message == ' '\n            message = ''\n          result[key] =\n            message: message\n            placeholders: placeholders\n\n      grunt.file.write(f.dest, JSON.stringify(result))\n      grunt.log.writeln(\"File \\\"#{f.dest}\\\" created.\")\n      # coffeelint: enable=missing_fat_arrows\n"
  },
  {
    "path": "omega-target-chromium-extension/index.coffee",
    "content": "module.exports = require('./src/module')\n"
  },
  {
    "path": "omega-target-chromium-extension/omega_target_shim.js",
    "content": "module.exports = OmegaTarget\n"
  },
  {
    "path": "omega-target-chromium-extension/overlay/background.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <title>SwitchyOmega Background</title>\n</head>\n<body>\n  <canvas id=\"canvas-icon\"></canvas>\n  <script src=\"js/log_error.js\"></script>\n  <script src=\"lib/FileSaver/FileSaver.min.js\"></script>\n  <script src=\"js/omega_debug.js\"></script>\n  <script src=\"js/background_preload.js\"></script>\n  <script src=\"js/omega_pac.min.js\"></script>\n  <script src=\"js/omega_target.min.js\"></script>\n  <script src=\"js/omega_target_chromium_extension.min.js\"></script>\n  <script src=\"img/icons/draw_omega.js\"></script>\n  <script src=\"js/background.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "omega-target-chromium-extension/overlay/manifest.json",
    "content": "{\n  \"manifest_version\": 2,\n  \"name\": \"__MSG_manifest_app_name__\",\n  \"version\": \"2.5.21\",\n  \"description\": \"__MSG_manifest_app_description__\",\n  \"key\": \"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkhwZJT76btQ04EEMOFtZPLESD1TmSVjbLjs0OyesD9Ht8YllFPfJ3qmtbSQGVuvmxH1GK/jUO2QcEWb8bHuOjoRlq20fi5j5Aq90O8FKET+y5D8PxCyi3WmnquiEwaE5cNmaCsw/G2JlO+bZOtdQ/QKOvMxBAegABYimEGfSvCMVUEvpymys0gBhLoch72zPAiJUBkf0z8BtjYTueMRcRXkrSeRPLygUDQnZ1TkQWMYYBp/zqpD5ggxytAklEMQzR9Hn0lqu5s7iuUAgihbysPn/8Wh00Zj5FySpK//KcpG3JS7UWxC28oSt8z5ZR3YimnX+HX3P36V0mC1pgM4o7wIDAQAB\",\n  \"icons\": {\n    \"16\": \"img/icons/omega-action-16.png\",\n    \"24\": \"img/icons/omega-action-24.png\",\n    \"32\": \"img/icons/omega-action-32.png\",\n    \"48\": \"img/icons/omega-48.png\",\n    \"64\": \"img/icons/omega-64.png\",\n    \"128\": \"img/icons/omega-128.png\"\n  },\n  \"default_locale\": \"en\",\n  \"browser_action\": {\n    \"browser_style\": false,\n    \"default_icon\": {\n      \"16\": \"img/icons/omega-action-16.png\",\n      \"19\": \"img/icons/omega-action-19.png\",\n      \"24\": \"img/icons/omega-action-24.png\",\n      \"32\": \"img/icons/omega-action-32.png\"\n    },\n    \"default_title\": \"__MSG_manifest_icon_default_title__\",\n    \"default_popup\": \"popup/index.html\"\n  },\n  \"background\": {\n    \"page\": \"background.html\"\n  },\n  \"minimum_chrome_version\": \"22.0.0\",\n  \"options_page\": \"options.html\",\n  \"options_ui\": {\n    \"page\": \"options.html\",\n    \"browser_style\": false,\n    \"open_in_tab\": true\n  },\n  \"permissions\": [\n    \"proxy\",\n    \"tabs\",\n    \"alarms\",\n    \"storage\",\n    \"webRequest\",\n    \"downloads\",\n    \"webRequestBlocking\",\n    \"contextMenus\",\n\n    \"http://*/*\",\n    \"https://*/*\",\n    \"<all_urls>\"\n  ],\n  \"commands\": {\n    \"_execute_browser_action\": {\n      \"suggested_key\": {\n        \"default\": \"Alt+Shift+O\"\n      }\n    }\n  },\n  \"applications\": {\n    \"gecko\": {\n      \"id\": \"switchyomega@feliscatus.addons.mozilla.org\",\n      \"strict_min_version\": \"55.0a1\"\n    }\n  }\n}\n"
  },
  {
    "path": "omega-target-chromium-extension/package.json",
    "content": "{\n  \"name\": \"omega-target-chromium-extension\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"main\": \"./index\",\n  \"devDependencies\": {\n    \"chai\": \"~1.9.1\",\n    \"coffee-script\": \"^1.7.1\",\n    \"coffeeify\": \"^0.7.0\",\n    \"coffeelint\": \"^1.16.0\",\n    \"grunt\": \"^0.4.5\",\n    \"grunt-browserify\": \"^3.0.0\",\n    \"grunt-coffeelint\": \"^0.0.13\",\n    \"grunt-contrib-coffee\": \"^0.11.1\",\n    \"grunt-contrib-compress\": \"^0.12.0\",\n    \"grunt-contrib-copy\": \"^0.5.0\",\n    \"grunt-contrib-watch\": \"^0.6.1\",\n    \"grunt-mocha-test\": \"~0.11.0\",\n    \"load-grunt-config\": \"^0.13.1\",\n    \"minifyify\": \"^4.1.1\",\n    \"po2json\": \"^0.3.2\"\n  },\n  \"dependencies\": {\n    \"heap\": \"^0.2.6\",\n    \"omega-target\": \"../omega-target\",\n    \"omega-web\": \"../omega-web\",\n    \"omega-pac\": \"../omega-pac\",\n    \"xhr\": \"^1.16.0\"\n  },\n  \"browser\": {\n    \"omega-target\": \"./omega_target_shim.js\"\n  },\n  \"scripts\": {\n    \"dev\": \"npm link omega-target && npm link omega-web && npm link omega-pac\"\n  }\n}\n"
  },
  {
    "path": "omega-target-chromium-extension/src/coffee/background.coffee",
    "content": "OmegaTargetCurrent = Object.create(OmegaTargetChromium)\nPromise = OmegaTargetCurrent.Promise\nPromise.longStackTraces()\n\nOmegaTargetCurrent.Log = Object.create(OmegaTargetCurrent.Log)\nLog = OmegaTargetCurrent.Log\n\n_writeLogToLocalStorage = (content) ->\n  try\n    localStorage['log'] += content\n  catch _\n    # Maybe we have reached our limit here. See #1288. Try trimming it.\n    localStorage['log'] = content\n\nLog.log = (args...) ->\n  console.log(args...)\n  content = args.map(Log.str.bind(Log)).join(' ') + '\\n'\n  _writeLogToLocalStorage(content)\nLog.error = (args...) ->\n  console.error(args...)\n  content = args.map(Log.str.bind(Log)).join(' ')\n  localStorage['logLastError'] = content\n  _writeLogToLocalStorage('ERROR: ' + content + '\\n')\n\nunhandledPromises = []\nunhandledPromisesId = []\nunhandledPromisesNextId = 1\nPromise.onPossiblyUnhandledRejection (reason, promise) ->\n  Log.error(\"[#{unhandledPromisesNextId}] Unhandled rejection:\\n\", reason)\n  unhandledPromises.push(promise)\n  unhandledPromisesId.push(unhandledPromisesNextId)\n  unhandledPromisesNextId++\nPromise.onUnhandledRejectionHandled (promise) ->\n  index = unhandledPromises.indexOf(promise)\n  Log.log(\"[#{unhandledPromisesId[index]}] Rejection handled!\", promise)\n  unhandledPromises.splice(index, 1)\n  unhandledPromisesId.splice(index, 1)\n\niconCache = {}\ndrawContext = null\ndrawError = null\ndrawIcon = (resultColor, profileColor) ->\n  cacheKey = \"omega+#{resultColor ? ''}+#{profileColor}\"\n  icon = iconCache[cacheKey]\n  return icon if icon\n  try\n    if not drawContext?\n      drawContext = document.getElementById('canvas-icon').getContext('2d')\n\n    icon = {}\n    for size in [16, 19, 24, 32, 38]\n      drawContext.scale(size, size)\n      drawContext.clearRect(0, 0, 1, 1)\n      if resultColor?\n        drawOmega drawContext, resultColor, profileColor\n      else\n        drawOmega drawContext, profileColor\n      drawContext.setTransform(1, 0, 0, 1, 0, 0)\n      icon[size] = drawContext.getImageData(0, 0, size, size)\n      if icon[size].data[3] == 255\n        # Some browsers may replace the image data with a opaque white image to\n        # resist fingerprinting. In that case the icon cannot be drawn.\n        throw new Error('Icon drawing blocked by privacy.resistFingerprinting.')\n  catch e\n    if not drawError?\n      drawError = e\n      Log.error(e)\n      Log.error('Profile-colored icon disabled. Falling back to static icon.')\n    icon = null\n\n  return iconCache[cacheKey] = icon\n\ncharCodeUnderscore = '_'.charCodeAt(0)\nisHidden = (name) -> (name.charCodeAt(0) == charCodeUnderscore and\n  name.charCodeAt(1) == charCodeUnderscore)\n\ndispName = (name) -> chrome.i18n.getMessage('profile_' + name) || name\n\nactionForUrl = (url) ->\n  options.ready.then(->\n    request = OmegaPac.Conditions.requestFromUrl(url)\n    options.matchProfile(request)\n  ).then(({profile, results}) ->\n    current = options.currentProfile()\n    currentName = dispName(current.name)\n    if current.profileType == 'VirtualProfile'\n      realCurrentName = current.defaultProfileName\n      currentName += \" [#{dispName(realCurrentName)}]\"\n      current = options.profile(realCurrentName)\n    details = ''\n    direct = false\n    attached = false\n    condition2Str = (condition) ->\n      condition.pattern || OmegaPac.Conditions.str(condition)\n    for result in results\n      if Array.isArray(result)\n        if not result[1]?\n          attached = false\n          name = result[0]\n          if name[0] == '+'\n            name = name.substr(1)\n          if isHidden(name)\n            attached = true\n          else if name != realCurrentName\n            details += chrome.i18n.getMessage 'browserAction_defaultRuleDetails'\n            details += \" => #{dispName(name)}\\n\"\n        else if result[1].length == 0\n          if result[0] == 'DIRECT'\n            details += chrome.i18n.getMessage('browserAction_directResult')\n            details += '\\n'\n            direct = true\n          else\n            details += \"#{result[0]}\\n\"\n        else if typeof result[1] == 'string'\n          details += \"#{result[1]} => #{result[0]}\\n\"\n        else\n          condition = condition2Str(result[1].condition ? result[1])\n          details += \"#{condition} => \"\n          if result[0] == 'DIRECT'\n            details += chrome.i18n.getMessage('browserAction_directResult')\n            details += '\\n'\n            direct = true\n          else\n            details += \"#{result[0]}\\n\"\n      else if result.profileName\n        if result.isTempRule\n          details += chrome.i18n.getMessage('browserAction_tempRulePrefix')\n        else if attached\n          details += chrome.i18n.getMessage('browserAction_attachedPrefix')\n          attached = false\n        condition = result.source ? condition2Str(result.condition)\n        details += \"#{condition} => #{dispName(result.profileName)}\\n\"\n\n    if not details\n      details = options.printProfile(current)\n\n    resultColor = profile.color\n    profileColor = current.color\n\n    icon = null\n    if direct\n      resultColor = options.profile('direct').color\n      profileColor = profile.color\n    else if profile.name == current.name and options.isCurrentProfileStatic()\n      resultColor = profileColor = profile.color\n      icon = drawIcon(profile.color)\n    else\n      resultColor = profile.color\n      profileColor = current.color\n\n    icon ?= drawIcon(resultColor, profileColor)\n\n    shortTitle = 'Omega: ' + currentName # TODO: I18n.\n    if profile.name != currentName\n      shortTitle += ' => ' + profile.name # TODO: I18n.\n\n    return {\n      title: chrome.i18n.getMessage('browserAction_titleWithResult', [\n        currentName\n        dispName(profile.name)\n        details\n      ])\n\n      shortTitle: shortTitle\n      icon: icon\n      resultColor: resultColor\n      profileColor: profileColor\n    }\n  ).catch -> return null\n\n\nstorage = new OmegaTargetCurrent.Storage('local')\nstate = new OmegaTargetCurrent.BrowserStorage(localStorage, 'omega.local.')\n\nif chrome?.storage?.sync or browser?.storage?.sync\n  syncStorage = new OmegaTargetCurrent.Storage('sync')\n  sync = new OmegaTargetCurrent.OptionsSync(syncStorage)\n  if localStorage['omega.local.syncOptions'] != '\"sync\"'\n    sync.enabled = false\n  sync.transformValue = OmegaTargetCurrent.Options.transformValueForSync\n\nproxyImpl = OmegaTargetCurrent.proxy.getProxyImpl(Log)\nstate.set({proxyImplFeatures: proxyImpl.features})\noptions = new OmegaTargetCurrent.Options(null, storage, state, Log, sync,\n  proxyImpl)\noptions.externalApi = new OmegaTargetCurrent.ExternalApi(options)\noptions.externalApi.listen()\n\nif chrome.runtime.id != OmegaTargetCurrent.SwitchySharp.extId\n  options.switchySharp = new OmegaTargetCurrent.SwitchySharp()\n  options.switchySharp.monitor()\n\ntabs = new OmegaTargetCurrent.ChromeTabs(actionForUrl)\ntabs.watch()\n\noptions._inspect = new OmegaTargetCurrent.Inspect (url, tab) ->\n  if url == tab.url\n    options.clearBadge()\n    tabs.processTab(tab)\n    state.remove('inspectUrl')\n    return\n\n  state.set({inspectUrl: url})\n\n  actionForUrl(url).then (action) ->\n    return if not action\n    parsedUrl = OmegaTargetCurrent.Url.parse(url)\n    if parsedUrl.hostname == OmegaTargetCurrent.Url.parse(tab.url).hostname\n      urlDisp = parsedUrl.path\n    else\n      urlDisp = parsedUrl.hostname\n\n    title = chrome.i18n.getMessage('browserAction_titleInspect', urlDisp) + '\\n'\n    title += action.title\n    chrome.browserAction.setTitle(title: title, tabId: tab.id)\n    tabs.setTabBadge(tab, {\n      text: '#'\n      color: action.resultColor\n    })\n\noptions.setProxyNotControllable(null)\ntimeout = null\n\nproxyImpl.watchProxyChange (details) ->\n  return if options.externalApi.disabled\n  return unless details\n  notControllableBefore = options.proxyNotControllable()\n  internal = false\n  noRevert = false\n  switch details['levelOfControl']\n    when \"controlled_by_other_extensions\", \"not_controllable\"\n      reason =\n        if details['levelOfControl'] == 'not_controllable'\n          'policy'\n        else\n          'app'\n      options.setProxyNotControllable(reason)\n      noRevert = true\n    else\n      options.setProxyNotControllable(null)\n\n  if details['levelOfControl'] == 'controlled_by_this_extension'\n    internal = true\n    return if not notControllableBefore\n  Log.log('external proxy: ', details)\n\n  # Chromium will send chrome.proxy.settings.onChange on extension unload,\n  # just after the current extension has lost control of the proxy settings.\n  # This is just annoying, and may change the currentProfileName state\n  # suprisingly.\n  # To workaround this issue, wait for some time before setting the proxy.\n  # However this will cause some delay before the settings are processed.\n  clearTimeout(timeout) if timeout?\n  parsed = null\n  timeout = setTimeout (->\n    if parsed\n      options.setExternalProfile(parsed,\n        {noRevert: noRevert, internal: internal})\n  ), 500\n\n  parsed = proxyImpl.parseExternalProfile(details, options._options)\n  return\n\nexternal = false\noptions.currentProfileChanged = (reason) ->\n  iconCache = {}\n\n  if reason == 'external'\n    external = true\n  else if reason != 'clearBadge'\n    external = false\n\n  current = options.currentProfile()\n  currentName = ''\n  if current\n    currentName = dispName(current.name)\n    if current.profileType == 'VirtualProfile'\n      realCurrentName = current.defaultProfileName\n      currentName += \" [#{dispName(realCurrentName)}]\"\n      current = options.profile(realCurrentName)\n\n  details = options.printProfile(current)\n  if currentName\n    title = chrome.i18n.getMessage('browserAction_titleWithResult', [\n      currentName, '', details])\n    shortTitle = 'Omega: ' + currentName # TODO: I18n.\n  else\n    title = details\n    shortTitle = 'Omega: ' + details # TODO: I18n.\n\n  if external and current.profileType != 'SystemProfile'\n    message = chrome.i18n.getMessage('browserAction_titleExternalProxy')\n    title = message + '\\n' + title\n    shortTitle = 'Omega-Extern: ' + details # TODO: I18n.\n    options.setBadge()\n\n  if not current.name or not OmegaPac.Profiles.isInclusive(current)\n    icon = drawIcon(current.color)\n  else\n    icon = drawIcon(options.profile('direct').color, current.color)\n\n  tabs.resetAll(\n    icon: icon\n    title: title\n    shortTitle: shortTitle\n  )\n\nencodeError = (obj) ->\n  if obj instanceof Error\n    {\n      _error: 'error'\n      name: obj.name\n      message: obj.message\n      stack: obj.stack\n      original: obj\n    }\n  else\n    obj\n\nrefreshActivePageIfEnabled = ->\n  return if localStorage['omega.local.refreshOnProfileChange'] == 'false'\n  chrome.tabs.query {active: true, lastFocusedWindow: true}, (tabs) ->\n    url = tabs[0].url\n    return if not url\n    return if url.substr(0, 6) == 'chrome'\n    return if url.substr(0, 6) == 'about:'\n    return if url.substr(0, 4) == 'moz-'\n    chrome.tabs.reload(tabs[0].id, {bypassCache: true})\n\nchrome.runtime.onMessage.addListener (request, sender, respond) ->\n  return unless request and request.method\n  options.ready.then ->\n    if request.method == 'getState'\n      target = state\n      method = state.get\n    else\n      target = options\n      method = target[request.method]\n    if typeof method != 'function'\n      Log.error(\"No such method #{request.method}!\")\n      respond(\n        error:\n          reason: 'noSuchMethod'\n      )\n      return\n\n    promise = Promise.resolve().then -> method.apply(target, request.args)\n    if request.refreshActivePage\n      promise.then refreshActivePageIfEnabled\n    return if request.noReply\n\n    promise.then (result) ->\n      if request.method == 'updateProfile'\n        for own key, value of result\n          result[key] = encodeError(value)\n      respond(result: result)\n\n    promise.catch (error) ->\n      Log.error(request.method + ' ==>', error)\n      respond(error: encodeError(error))\n\n  # Wait for my response!\n  return true unless request.noReply\n"
  },
  {
    "path": "omega-target-chromium-extension/src/coffee/background_preload.coffee",
    "content": "window.UglifyJS_NoUnsafeEval = true\nlocalStorage['log'] = ''\nlocalStorage['logLastError'] = ''\n\nwindow.OmegaContextMenuQuickSwitchHandler = -> null\n\nif chrome.contextMenus?\n  # We don't need this API. However its presence indicates that Chrome >= 35\n  # which provides info.checked we need in contextMenu callback.\n  # https://developer.chrome.com/extensions/contextMenus\n  if chrome.i18n.getUILanguage?\n    # We must create the menu item here before others to make it first in menu.\n    chrome.contextMenus.create({\n      id: 'enableQuickSwitch'\n      title: chrome.i18n.getMessage('contextMenu_enableQuickSwitch')\n      type: 'checkbox'\n      checked: false\n      contexts: [\"browser_action\"]\n      onclick: (info) -> window.OmegaContextMenuQuickSwitchHandler(info)\n    })\n\n  chrome.contextMenus.create({\n    title: chrome.i18n.getMessage('popup_reportIssues')\n    contexts: [\"browser_action\"]\n    onclick: OmegaDebug.reportIssue\n  })\n\n  chrome.contextMenus.create({\n    title: chrome.i18n.getMessage('popup_errorLog')\n    contexts: [\"browser_action\"]\n    onclick: OmegaDebug.downloadLog\n  })\n"
  },
  {
    "path": "omega-target-chromium-extension/src/coffee/omega_debug.coffee",
    "content": "window.OmegaDebug =\n  getProjectVersion: ->\n    chrome.runtime.getManifest().version\n  getExtensionVersion: ->\n    chrome.runtime.getManifest().version\n  downloadLog: ->\n    blob = new Blob [localStorage['log']], {type: \"text/plain;charset=utf-8\"}\n    filename = \"OmegaLog_#{Date.now()}.txt\"\n\n    if browser?.downloads?.download?\n      url = URL.createObjectURL(blob)\n      browser.downloads.download({url: url, filename: filename})\n    else\n      saveAs(blob, filename)\n  resetOptions: ->\n    localStorage.clear()\n    # Prevent options loading from sync storage after reload.\n    localStorage['omega.local.syncOptions'] = '\"conflict\"'\n    chrome.storage.local.clear()\n    chrome.runtime.reload()\n  reportIssue: ->\n    url = 'https://github.com/FelisCatus/SwitchyOmega/issues/new?title=&body='\n    finalUrl = url\n    try\n      projectVersion = OmegaDebug.getProjectVersion()\n      extensionVersion = OmegaDebug.getExtensionVersion()\n      env =\n        extensionVersion: extensionVersion\n        projectVersion: extensionVersion\n        userAgent: navigator.userAgent\n      body = chrome.i18n.getMessage('popup_issueTemplate', [\n        env.projectVersion, env.userAgent\n      ])\n      body ||= \"\"\"\n        \\n\\n\n        <!-- Please write your comment ABOVE this line. -->\n        SwitchyOmega #{env.projectVersion}\n        #{env.userAgent}\n      \"\"\"\n      finalUrl = url + encodeURIComponent(body)\n      err = localStorage['logLastError']\n      if err\n        body += \"\\n```\\n#{err}\\n```\"\n        finalUrl = (url + encodeURIComponent(body)).substr(0, 2000)\n\n    chrome.tabs.create(url: finalUrl)\n"
  },
  {
    "path": "omega-target-chromium-extension/src/coffee/omega_target_web.coffee",
    "content": "angular.module('omegaTarget', []).factory 'omegaTarget', ($q) ->\n  decodeError = (obj) ->\n    if obj._error == 'error'\n      err = new Error(obj.message)\n      err.name = obj.name\n      err.stack = obj.stack\n      err.original = obj.original\n      err\n    else\n      obj\n  callBackgroundNoReply = (method, args...) ->\n    chrome.runtime.sendMessage({\n      method: method\n      args: args\n      noReply: true\n    })\n  callBackground = (method, args...) ->\n    d = $q['defer']()\n    chrome.runtime.sendMessage({\n      method: method\n      args: args\n    }, (response) ->\n      if chrome.runtime.lastError?\n        d.reject(chrome.runtime.lastError)\n        return\n      if response.error\n        d.reject(decodeError(response.error))\n      else\n        d.resolve(response.result)\n    )\n    return d.promise\n  connectBackground = (name, message, callback) ->\n    port = chrome.runtime.connect({name: name})\n    onDisconnect = ->\n      port.onDisconnect.removeListener(onDisconnect)\n      port.onMessage.removeListener(callback)\n    port.onDisconnect.addListener(onDisconnect)\n\n    port.postMessage(message)\n    port.onMessage.addListener(callback)\n    return\n\n  isChromeUrl = (url) -> url.substr(0, 6) == 'chrome' or\n    url.substr(0, 4) == 'moz-' or url.substr(0, 6) == 'about:'\n\n  optionsChangeCallback = []\n  requestInfoCallback = null\n  prefix = 'omega.local.'\n  urlParser = document.createElement('a')\n  omegaTarget =\n    options: null\n    state: (name, value) ->\n      if arguments.length == 1\n        getValue = (key) -> try JSON.parse(localStorage[prefix + key])\n        if Array.isArray(name)\n          return $q.when(name.map(getValue))\n        else\n          value = getValue(name)\n      else\n        localStorage[prefix + name] = JSON.stringify(value)\n      return $q.when(value)\n    lastUrl: (url) ->\n      name = 'web.last_url'\n      if url\n        omegaTarget.state(name, url)\n        url\n      else\n        try JSON.parse(localStorage[prefix + name])\n    addOptionsChangeCallback: (callback) ->\n      optionsChangeCallback.push(callback)\n    refresh: (args) ->\n      return callBackground('getAll').then (opt) ->\n        omegaTarget.options = opt\n        for callback in optionsChangeCallback\n          callback(omegaTarget.options)\n        return args\n    renameProfile: (fromName, toName) ->\n      callBackground('renameProfile', fromName, toName).then omegaTarget.refresh\n    replaceRef: (fromName, toName) ->\n      callBackground('replaceRef', fromName, toName).then omegaTarget.refresh\n    optionsPatch: (patch) ->\n      callBackground('patch', patch).then omegaTarget.refresh\n    resetOptions: (opt) ->\n      callBackground('reset', opt).then omegaTarget.refresh\n    updateProfile: (name, opt_bypass_cache) ->\n      callBackground('updateProfile', name, opt_bypass_cache).then((results) ->\n        for own key, value of results\n          results[key] = decodeError(value)\n        results\n      ).then omegaTarget.refresh\n    getMessage: chrome.i18n.getMessage.bind(chrome.i18n)\n    openOptions: (hash) ->\n      d = $q['defer']()\n      options_url = chrome.extension.getURL('options.html')\n      chrome.tabs.query url: options_url, (tabs) ->\n        url = if hash\n          urlParser.href = tabs[0]?.url || options_url\n          urlParser.hash = hash\n          urlParser.href\n        else\n          options_url\n        if tabs.length > 0\n          props = {active: true}\n          if hash\n            props.url = url\n          chrome.tabs.update(tabs[0].id, props)\n        else\n          chrome.tabs.create({url: url})\n        d.resolve()\n      return d.promise\n    applyProfile: (name) ->\n      callBackground('applyProfile', name)\n    applyProfileNoReply: (name) ->\n      callBackgroundNoReply('applyProfile', name)\n    addTempRule: (domain, profileName) ->\n      callBackground('addTempRule', domain, profileName)\n    addCondition: (condition, profileName) ->\n      callBackground('addCondition', condition, profileName)\n    addProfile: (profile) ->\n      callBackground('addProfile', profile).then omegaTarget.refresh\n    setDefaultProfile: (profileName, defaultProfileName) ->\n      callBackground('setDefaultProfile', profileName, defaultProfileName)\n    getActivePageInfo: ->\n      clearBadge = true\n      d = $q['defer']()\n      chrome.tabs.query {active: true, lastFocusedWindow: true}, (tabs) ->\n        if not tabs[0]?.url\n          d.resolve(null)\n          return\n        args = {tabId: tabs[0].id, url: tabs[0].url}\n        if tabs[0].id and requestInfoCallback\n          connectBackground('tabRequestInfo', args,\n            requestInfoCallback)\n        d.resolve(callBackground('getPageInfo', args))\n      return d.promise.then (info) -> if info?.url then info else null\n    refreshActivePage: ->\n      d = $q['defer']()\n      chrome.tabs.query {active: true, lastFocusedWindow: true}, (tabs) ->\n        if tabs[0].url and not isChromeUrl(tabs[0].url)\n          chrome.tabs.reload(tabs[0].id, {bypassCache: true})\n        d.resolve()\n      return d.promise\n    openManage: ->\n      chrome.tabs.create url: 'chrome://extensions/?id=' + chrome.runtime.id\n    openShortcutConfig: ->\n      chrome.tabs.create url: 'chrome://extensions/configureCommands'\n    setOptionsSync: (enabled, args) ->\n      callBackground('setOptionsSync', enabled, args)\n    resetOptionsSync: (enabled, args) -> callBackground('resetOptionsSync')\n    setRequestInfoCallback: (callback) ->\n      requestInfoCallback = callback\n\n  return omegaTarget\n"
  },
  {
    "path": "omega-target-chromium-extension/src/js/omega_target_popup.js",
    "content": "function callBackgroundNoReply(method, args, cb) {\n  chrome.runtime.sendMessage({\n    method: method,\n    args: args,\n    noReply: true,\n    refreshActivePage: true,\n  });\n  if (cb) return cb();\n}\n\nfunction callBackground(method, args, cb) {\n  chrome.runtime.sendMessage({\n    method: method,\n    args: args,\n  }, function(response) {\n    if (chrome.runtime.lastError != null)\n      return cb && cb(chrome.runtime.lastError)\n    if (response.error) return cb && cb(response.error)\n    return cb && cb(null, response.result)\n  });\n}\n\nvar requestInfoCallback = null;\n\nOmegaTargetPopup = {\n  getState: function (keys, cb) {\n    if (typeof localStorage === 'undefined' || !localStorage.length) {\n      callBackground('getState', [keys], cb);\n      return;\n    }\n    var results = {};\n    keys.forEach(function(key) {\n      try {\n        results[key] = JSON.parse(localStorage['omega.local.' + key]);\n      } catch (_) {\n        return null;\n      }\n    });\n    if (cb) cb(null, results);\n  },\n  applyProfile: function (name, cb) {\n    callBackgroundNoReply('applyProfile', [name], cb);\n  },\n  openOptions: function (hash, cb) {\n    var options_url = chrome.extension.getURL('options.html');\n\n    chrome.tabs.query({\n      url: options_url\n    }, function(tabs) {\n      if (!chrome.runtime.lastError && tabs && tabs.length > 0) {\n        var props = {\n          active: true\n        };\n        if (hash) {\n          var url = options_url + hash;\n          props.url = url;\n        }\n        chrome.tabs.update(tabs[0].id, props);\n      } else {\n        chrome.tabs.create({\n          url: options_url\n        });\n      }\n      if (cb) return cb();\n    });\n  },\n  getActivePageInfo: function(cb) {\n    chrome.tabs.query({active: true, lastFocusedWindow: true}, function (tabs) {\n      if (tabs.length === 0 || !tabs[0].url) return cb();\n      var args = {tabId: tabs[0].id, url: tabs[0].url};\n      callBackground('getPageInfo', [args], cb)\n    });\n  },\n  setDefaultProfile: function(profileName, defaultProfileName, cb) {\n    callBackgroundNoReply('setDefaultProfile',\n      [profileName, defaultProfileName], cb);\n  },\n  addTempRule: function(domain, profileName, cb) {\n    callBackgroundNoReply('addTempRule', [domain, profileName], cb);\n  },\n  openManage: function(domain, profileName, cb) {\n    chrome.tabs.create({\n      url: 'chrome://extensions/?id=' + chrome.runtime.id,\n    }, cb);\n  },\n  getMessage: chrome.i18n.getMessage.bind(chrome.i18n),\n};\n"
  },
  {
    "path": "omega-target-chromium-extension/src/js/omega_webext_proxy_script.js",
    "content": "FindProxyForURL = (function () {\n  var OmegaPac = require('omega-pac');\n  var options = {};\n  var state = {};\n  var activeProfile = null;\n  var fallbackResult = 'DIRECT';\n  var pacCache = {};\n\n  init();\n\n  return FindProxyForURL;\n\n  function FindProxyForURL(url, host, details) {\n    if (!activeProfile) {\n      warn('Warning: Proxy script not initialized on handling: ' + url);\n      return fallbackResult;\n    }\n    // Moz: Neither path or query is included url regardless of scheme for now.\n    // This is even more strict than Chromium restricting HTTPS URLs.\n    // Therefore, it leads to different behavior than the icon and badge.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1337001\n    var request = OmegaPac.Conditions.requestFromUrl(url);\n    var profile = activeProfile;\n    var matchResult, next;\n    while (profile) {\n      matchResult = OmegaPac.Profiles.match(profile, request)\n      if (!matchResult) {\n        if (profile.profileType === 'DirectProfile') {\n          return 'DIRECT';\n        } else {\n          warn('Warning: Unsupported profile: ' + profile.profileType);\n          return fallbackResult;\n        }\n      }\n\n      if (Array.isArray(matchResult)) {\n        next = matchResult[0];\n        var proxy = matchResult[2];\n        var auth = matchResult[3];\n        if (proxy && !state.useLegacyStringReturn) {\n          var proxyInfo = {\n            type: proxy.scheme,\n            host: proxy.host,\n            port: proxy.port,\n          };\n          if (proxyInfo.type === 'socks5') {\n            // MOZ: SOCKS5 proxies are identified by \"type\": \"socks\".\n            // https://dxr.mozilla.org/mozilla-central/rev/ffe6cc09ccf38cca6f0e727837bbc6cb722d1e71/toolkit/components/extensions/ProxyScriptContext.jsm#51\n            proxyInfo.type = 'socks';\n            // Enable SOCKS5 remote DNS.\n            // TODO(catus): Maybe allow the users to configure this?\n            proxyInfo.proxyDNS = true;\n          }\n          if (auth) {\n            proxyInfo.username = auth.username;\n            proxyInfo.password = auth.password;\n          }\n          return [proxyInfo];\n        } else if (next.charCodeAt(0) !== 43) {\n          // MOZ: Legacy proxy support expects PAC-like string return type.\n          // TODO(catus): Remove support for string return type.\n          // MOZ: SOCKS5 proxies are supported under the prefix SOCKS.\n          // https://dxr.mozilla.org/mozilla-central/rev/ffe6cc09ccf38cca6f0e727837bbc6cb722d1e71/toolkit/components/extensions/ProxyScriptContext.jsm#51\n          // Note: We have to replace this because MOZ won't process the rest of\n          //       the list if the syntax of the first item is not recognized.\n          return next.replace(/SOCKS5 /g, 'SOCKS ');\n        }\n      } else if (matchResult.profileName) {\n        next = OmegaPac.Profiles.nameAsKey(matchResult.profileName)\n      } else {\n        return fallbackResult;\n      }\n      profile = OmegaPac.Profiles.byKey(next, options)\n    }\n    warn('Warning: Cannot find profile: ' + next);\n    return fallbackResult;\n  }\n\n  function warn(message, error) {\n    // We don't have console here and alert is not implemented.\n    // Throwing and messaging seems to be the only ways to communicate.\n    // MOZ: alert(): https://bugzilla.mozilla.org/show_bug.cgi?id=1353510\n    browser.runtime.sendMessage({\n      event: 'proxyScriptLog',\n      message: message,\n      error: error,\n      level: 'warn',\n    });\n  }\n\n  function init() {\n    browser.runtime.onMessage.addListener(function(message) {\n      if (message.event === 'proxyScriptStateChanged') {\n        state = message.state;\n        options = message.options;\n        if (!state.currentProfileName) {\n          activeProfile = state.tempProfile;\n        } else {\n          activeProfile = OmegaPac.Profiles.byName(state.currentProfileName,\n            options);\n        }\n      }\n    });\n    browser.runtime.sendMessage({event: 'proxyScriptLoaded'});\n  }\n})();\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/chrome_api.coffee",
    "content": "OmegaTarget = require('omega-target')\nPromise = OmegaTarget.Promise\n\nexports.chromeApiPromisify = (target, method) ->\n  return (args...) ->\n    new Promise (resolve, reject) ->\n      callback = (callbackArgs...) ->\n        if chrome.runtime.lastError?\n          error = new Error(chrome.runtime.lastError.message)\n          error.original = chrome.runtime.lastError\n          return reject(error)\n        if callbackArgs.length <= 1\n          resolve(callbackArgs[0])\n        else\n          resolve(callbackArgs)\n\n      args.push(callback)\n      target[method].apply(target, args)\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/chrome_port.coffee",
    "content": "# A wrapper around type Port in Chromium Extension API.\n# https://developer.chrome.com/extensions/runtime#type-Port\n#\n# Please wrap any Port object in this class BEFORE adding listeners. Adding\n# listeners to events of raw Port objects should be avoided to minimize the risk\n# of memory leaks. See the comments of the TrackedEvent class for more details.\nmodule.exports = class ChromePort\n  constructor: (@port) ->\n    @name = @port.name\n    @sender = @port.sender\n\n    @disconnect = @port.disconnect.bind(@port)\n    @postMessage = (args...) =>\n      try\n        @port.postMessage(args...)\n      catch _\n        return\n\n    @onMessage = new TrackedEvent(@port.onMessage)\n    @onDisconnect = new TrackedEvent(@port.onDisconnect)\n    @onDisconnect.addListener @dispose.bind(this)\n\n  dispose: ->\n    @onMessage.dispose()\n    @onDisconnect.dispose()\n\n# A wrapper around chrome.Event.\n# https://developer.chrome.com/extensions/events#type-Event\n#\n# ALL event listeners MUST be manually removed before disposing any Event or\n# object containing Event, such as Port. Otherwise, a memory leak will happen.\n# https://code.google.com/p/chromium/issues/detail?id=320723\n#\n# TrackedEvent helps to solve this problem by keeping track of all listeners\n# installed and removes them when the #dispose method is called.\n# Don't forget to call #dispose when this TrackedEvent is not needed any more.\nclass TrackedEvent\n  constructor: (@event) ->\n    @callbacks = []\n    mes = ['hasListener', 'hasListeners', 'addRules', 'getRules', 'removeRules']\n    for methodName in mes\n      method = @event[methodName]\n      if method?\n        this[methodName] = method.bind(@event)\n\n  addListener: (callback) ->\n    @event.addListener(callback)\n    @callbacks.push(callback)\n    return this\n\n  removeListener: (callback) ->\n    @event.removeListener(callback)\n    i = @callbacks.indexOf(callback)\n    @callbacks.splice(i, 1) if i >= 0\n    return this\n\n  ###*\n  # Removes all listeners added via this TrackedEvent instance.\n  # Note: Won't remove listeners added via other TrackedEvent or raw Event.\n  ###\n  removeAllListeners: ->\n    for callback in @callbacks\n      @event.removeListener(callback)\n    @callbacks = []\n    return this\n  \n  ###*\n  # Removes all listeners added via this TrackedEvent instance and prevent any\n  # further listeners from being added. It is considered safe to nullify any\n  # references to this instance and the underlying Event without causing leaks.\n  # This should be the last method called in the lifetime of TrackedEvent.\n  #\n  # Throws if the underlying raw Event object still has listeners. This can\n  # happen when listeners have been added via other TrackedEvents or raw Event.\n  ###\n  dispose: ->\n    @removeAllListeners()\n    if @event.hasListeners?()\n      throw new Error(\"Underlying Event still has listeners!\")\n    @event = null\n    @callbacks = null\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/external_api.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\nPromise = OmegaTarget.Promise\nChromePort = require('./chrome_port')\n\nmodule.exports = class ExternalApi\n  constructor: (options) ->\n    @options = options\n  knownExts:\n    'padekgcemlokbadohgkifijomclgjgif': 32\n  disabled: false\n  listen: ->\n    return unless chrome.runtime.onConnectExternal\n    chrome.runtime.onConnectExternal.addListener (rawPort) =>\n      port = new ChromePort(rawPort)\n      port.onMessage.addListener (msg) => @onMessage(msg, port)\n      port.onDisconnect.addListener @reenable.bind(this)\n\n  _previousProfileName: null\n\n  reenable: ->\n    return unless @disabled\n\n    @options.setProxyNotControllable(null)\n    chrome.browserAction.setPopup?({popup: 'popup/index.html'})\n    @options.reloadQuickSwitch()\n    @disabled = false\n    @options.clearBadge()\n    @options.applyProfile(@_previousProfileName)\n\n  checkPerm: (port, level) ->\n    perm = @knownExts[port.sender.id] || 0\n    if perm < level\n      port.postMessage({action: 'error', error: 'permission'})\n      false\n    else\n      true\n\n  onMessage: (msg, port) ->\n    @options.log.log(\"#{port.sender.id} -> #{msg.action}\", msg)\n    switch msg.action\n      when 'disable'\n        return unless @checkPerm(port, 16)\n        return if @disabled\n        @disabled = true\n        @_previousProfileName = @options.currentProfile()?.name || 'system'\n        @options.applyProfile('system').then =>\n          reason = 'disabled'\n          if @knownExts[port.sender.id] >= 32\n            reason = 'upgrade'\n          @options.setProxyNotControllable reason, {text: 'X', color: '#5ab432'}\n        chrome.browserAction.setPopup?({popup: 'popup/index.html'})\n        port.postMessage({action: 'state', state: 'disabled'})\n      when 'enable'\n        @reenable()\n        port.postMessage({action: 'state', state: 'enabled'})\n      when 'getOptions'\n        return unless @checkPerm(port, 8)\n        port.postMessage({action: 'options', options: @options.getAll()})\n      else\n        port.postMessage(\n          action: 'error'\n          error: 'noSuchAction'\n          action_name: msg.action\n        )\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/fetch_url.coffee",
    "content": "Promise = OmegaTarget.Promise\nxhr = Promise.promisify(require('xhr'))\nUrl = require('url')\nContentTypeRejectedError = OmegaTarget.ContentTypeRejectedError\n\nxhrWrapper = (args...) ->\n  xhr(args...).catch (err) ->\n    throw err unless err.isOperational\n    if not err.statusCode\n      throw new OmegaTarget.NetworkError(err)\n    if err.statusCode == 404\n      throw new OmegaTarget.HttpNotFoundError(err)\n    if err.statusCode >= 500 and err.statusCode < 600\n      throw new OmegaTarget.HttpServerError(err)\n    throw new OmegaTarget.HttpError(err)\n\nfetchUrl = (dest_url, opt_bypass_cache, opt_type_hints) ->\n  getResBody = ([response, body]) ->\n    return body unless opt_type_hints\n    contentType = response.headers['content-type']?.toLowerCase()\n    for hint in opt_type_hints\n      handler = hintHandlers[hint] ? defaultHintHandler\n      result = handler(response, body, {contentType, hint})\n      return result if result?\n    throw new ContentTypeRejectedError(\n      'Unrecognized Content-Type: ' + contentType)\n    return body\n\n  if opt_bypass_cache and dest_url.indexOf('?') < 0\n    parsed = Url.parse(dest_url, true)\n    parsed.search = undefined\n    parsed.query['_'] = Date.now()\n    dest_url_nocache = Url.format(parsed)\n    # Try first with the dumb parameter to bypass cache.\n    xhrWrapper(dest_url_nocache).then(getResBody).catch ->\n      # If failed, try again with the original URL.\n      xhrWrapper(dest_url).then(getResBody)\n  else\n    xhrWrapper(dest_url).then(getResBody)\n\ndefaultHintHandler = (response, body, {contentType, hint}) ->\n  if '!' + contentType == hint\n    throw new ContentTypeRejectedError(\n      'Response Content-Type blacklisted: ' + contentType)\n  if contentType == hint\n    return body\n\nhintHandlers =\n  '*': (response, body) ->\n    # Allow all contents.\n    return body\n\n  '!text/html': (response, body, {contentType, hint}) ->\n    if contentType == hint\n      # Sometimes other content can also be served with the text/html\n      # Content-Type header. So we check if the body actually looks like HTML.\n      looksLikeHtml = false\n      if body.indexOf('<!DOCTYPE') >= 0 || body.indexOf('<!doctype') >= 0\n        looksLikeHtml = true\n      else if body.indexOf('</html>') >= 0\n        looksLikeHtml = true\n      else if body.indexOf('</body>') >= 0\n        looksLikeHtml = true\n\n      if looksLikeHtml\n        throw new ContentTypeRejectedError('Response must not be HTML.')\n\n  '!application/xhtml+xml': (args...) -> hintHandlers['!text/html'](args...)\n\n  'application/x-ns-proxy-autoconfig': (response, body, {contentType, hint}) ->\n    if contentType == hint\n      return body\n    # Sometimes PAC scripts can also be served using with wrong Content-Type.\n    if body.indexOf('FindProxyForURL') >= 0\n      return body\n    else\n      # The content is not a PAC script if it does not contain FindProxyForURL.\n      return undefined\n\nmodule.exports = fetchUrl\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/index.coffee",
    "content": "module.exports =\n  Storage: require('./storage')\n  Options: require('./options')\n  ChromeTabs: require('./tabs')\n  SwitchySharp: require('./switchysharp')\n  ExternalApi: require('./external_api')\n  WebRequestMonitor: require('./web_request_monitor')\n  Inspect: require('./inspect')\n  Url: require('url')\n  proxy: require('./proxy')\n\nfor name, value of require('omega-target')\n  module.exports[name] ?= value\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/inspect.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\nPromise = OmegaTarget.Promise\n\nmodule.exports = class Inspect\n  _enabled: false\n  constructor: (onInspect) ->\n    @onInspect = onInspect\n\n  enable: ->\n    return unless chrome.contextMenus?\n    # We don't need this API. However its presence indicates that Chrome >= 35,\n    # which provides the menuItemId we need in contextMenu callback.\n    # https://developer.chrome.com/extensions/contextMenus\n    return unless chrome.i18n.getUILanguage?\n\n    return if @_enabled\n\n    webResource = [\n      \"http://*/*\"\n      \"https://*/*\"\n      \"ftp://*/*\"\n    ]\n\n    ### Not so useful...\n    chrome.contextMenus.create({\n      id: 'inspectPage'\n      title: chrome.i18n.getMessage('contextMenu_inspectPage')\n      contexts: ['page']\n      onclick: @inspect.bind(this)\n      documentUrlPatterns: webResource\n    })\n    ###\n\n    chrome.contextMenus.create({\n      id: 'inspectFrame'\n      title: chrome.i18n.getMessage('contextMenu_inspectFrame')\n      contexts: ['frame']\n      onclick: @inspect.bind(this)\n      documentUrlPatterns: webResource\n    })\n\n    chrome.contextMenus.create({\n      id: 'inspectLink'\n      title: chrome.i18n.getMessage('contextMenu_inspectLink')\n      contexts: ['link']\n      onclick: @inspect.bind(this)\n      targetUrlPatterns: webResource\n    })\n\n    chrome.contextMenus.create({\n      id: 'inspectElement'\n      title: chrome.i18n.getMessage('contextMenu_inspectElement')\n      contexts: [\n        'image'\n        'video'\n        'audio'\n      ]\n      onclick: @inspect.bind(this)\n      targetUrlPatterns: webResource\n    })\n\n    @_enabled = true\n\n  disable: ->\n    return unless @_enabled\n    for own menuId of @propForMenuItem\n      try chrome.contextMenus.remove(menuId)\n    @_enabled = false\n\n  propForMenuItem:\n    'inspectPage': 'pageUrl'\n    'inspectFrame': 'frameUrl'\n    'inspectLink': 'linkUrl'\n    'inspectElement': 'srcUrl'\n\n  inspect: (info, tab) ->\n    return unless info.menuItemId\n    url = info[@propForMenuItem[info.menuItemId]]\n    if not url and info.menuItemId == 'inspectPage'\n      url = tab.url\n    return unless url\n\n    @onInspect(url, tab)\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/options.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\nPromise = OmegaTarget.Promise\nquerystring = require('querystring')\nWebRequestMonitor = require('./web_request_monitor')\nChromePort = require('./chrome_port')\nfetchUrl = require('./fetch_url')\nUrl = require('url')\n\nclass ChromeOptions extends OmegaTarget.Options\n  _inspect: null\n\n  fetchUrl: fetchUrl\n\n  updateProfile: (args...) ->\n    super(args...).then (results) ->\n      error = false\n      for own profileName, result of results\n        if result instanceof Error\n          error = true\n          break\n      if error\n        # TODO(catus): Find a better way to notify the user.\n        ###\n        @setBadge(\n          text: '!'\n          color: '#faa732'\n          title: chrome.i18n.getMessage('browserAction_titleDownloadFail')\n        )\n        ###\n      return results\n\n  _proxyNotControllable: null\n  proxyNotControllable: -> @_proxyNotControllable\n  setProxyNotControllable: (reason, badge) ->\n    @_proxyNotControllable = reason\n    if reason\n      @_state.set({'proxyNotControllable': reason})\n      @setBadge(badge)\n    else\n      @_state.remove(['proxyNotControllable'])\n      @clearBadge()\n\n  _badgeTitle: null\n  setBadge: (options) ->\n    if not options\n      options =\n        if @_proxyNotControllable\n          text: '='\n          color: '#da4f49'\n        else\n          text: '?'\n          color: '#49afcd'\n    chrome.browserAction.setBadgeText(text: options.text)\n    chrome.browserAction.setBadgeBackgroundColor(color: options.color)\n    if options.title\n      @_badgeTitle = options.title\n      chrome.browserAction.setTitle(title: options.title)\n    else\n      @_badgeTitle = null\n  clearBadge: ->\n    return if @externalApi.disabled\n    if @_badgeTitle\n      @currentProfileChanged('clearBadge')\n    if @_proxyNotControllable\n      @setBadge()\n    else\n      chrome.browserAction.setBadgeText?(text: '')\n    return\n\n  _quickSwitchInit: false\n  _quickSwitchHandlerReady: false\n  _quickSwitchCanEnable: false\n  setQuickSwitch: (quickSwitch, canEnable) ->\n    @_quickSwitchCanEnable = canEnable\n    if not @_quickSwitchHandlerReady\n      @_quickSwitchHandlerReady = true\n      window.OmegaContextMenuQuickSwitchHandler = (info) =>\n        changes = {}\n        changes['-enableQuickSwitch'] = info.checked\n        setOptions = @_setOptions(changes)\n        if info.checked and not @_quickSwitchCanEnable\n          setOptions.then ->\n            chrome.tabs.create(\n              url: chrome.extension.getURL('options.html#/ui')\n            )\n\n    if quickSwitch or not chrome.browserAction.setPopup?\n      chrome.browserAction.setPopup?({popup: ''})\n      if not @_quickSwitchInit\n        @_quickSwitchInit = true\n        chrome.browserAction.onClicked.addListener (tab) =>\n          @clearBadge()\n          if not @_options['-enableQuickSwitch']\n            # If we reach here, then the browser does not support popup.\n            # Let's open the popup page in a tab.\n            chrome.tabs.create(url: 'popup/index.html')\n            return\n          profiles = @_options['-quickSwitchProfiles']\n          index = profiles.indexOf(@_currentProfileName)\n          index = (index + 1) % profiles.length\n          @applyProfile(profiles[index]).then =>\n            if @_options['-refreshOnProfileChange']\n              url = tab.url\n              return if not url\n              return if url.substr(0, 6) == 'chrome'\n              return if url.substr(0, 6) == 'about:'\n              return if url.substr(0, 4) == 'moz-'\n              chrome.tabs.reload(tab.id)\n    else\n      chrome.browserAction.setPopup({popup: 'popup/index.html'})\n\n    chrome.contextMenus?.update('enableQuickSwitch', {checked: !!quickSwitch})\n    Promise.resolve()\n\n  setInspect: (settings) ->\n    if @_inspect\n      if settings.showMenu\n        @_inspect.enable()\n      else\n        @_inspect.disable()\n    return Promise.resolve()\n\n  _requestMonitor: null\n  _monitorWebRequests: false\n  _tabRequestInfoPorts: null\n  setMonitorWebRequests: (enabled) ->\n    @_monitorWebRequests = enabled\n    if enabled and not @_requestMonitor?\n      @_tabRequestInfoPorts = {}\n      wildcardForReq = (req) -> OmegaPac.wildcardForUrl(req.url)\n      @_requestMonitor = new WebRequestMonitor(wildcardForReq)\n      @_requestMonitor.watchTabs (tabId, info) =>\n        return unless @_monitorWebRequests\n        if info.errorCount > 0\n          info.badgeSet = true\n          badge = {text: info.errorCount.toString(), color: '#f0ad4e'}\n          chrome.browserAction.setBadgeText(text: badge.text, tabId: tabId)\n          chrome.browserAction.setBadgeBackgroundColor(\n            color: badge.color\n            tabId: tabId\n          )\n        else if info.badgeSet\n          info.badgeSet = false\n          chrome.browserAction.setBadgeText(text: '', tabId: tabId)\n        @_tabRequestInfoPorts[tabId]?.postMessage({\n          errorCount: info.errorCount\n          summary: info.summary\n        })\n\n      chrome.runtime.onConnect.addListener (rawPort) =>\n        return unless rawPort.name == 'tabRequestInfo'\n        return unless @_monitorWebRequests\n        tabId = null\n        port = new ChromePort(rawPort)\n        port.onMessage.addListener (msg) =>\n          tabId = msg.tabId\n          @_tabRequestInfoPorts[tabId] = port\n          info = @_requestMonitor.tabInfo[tabId]\n          if info\n            port.postMessage({\n              errorCount: info.errorCount\n              summary: info.summary\n            })\n        port.onDisconnect.addListener =>\n          delete @_tabRequestInfoPorts[tabId] if tabId?\n\n  _alarms: null\n  schedule: (name, periodInMinutes, callback) ->\n    name = 'omega.' + name\n    if not _alarms?\n      @_alarms = {}\n      chrome.alarms.onAlarm.addListener (alarm) =>\n        @_alarms[alarm.name]?()\n    if periodInMinutes < 0\n      delete @_alarms[name]\n      chrome.alarms.clear(name)\n    else\n      @_alarms[name] = callback\n      chrome.alarms.create(name, {\n        periodInMinutes: periodInMinutes\n      })\n    Promise.resolve()\n\n  printFixedProfile: (profile) ->\n    return unless profile.profileType == 'FixedProfile'\n    result = ''\n    for scheme in OmegaPac.Profiles.schemes when profile[scheme.prop]\n      pacResult = OmegaPac.Profiles.pacResult(profile[scheme.prop])\n      if scheme.scheme\n        result += \"#{scheme.scheme}: #{pacResult}\\n\"\n      else\n        result += \"#{pacResult}\\n\"\n    result ||= chrome.i18n.getMessage(\n      'browserAction_profileDetails_DirectProfile')\n    return result\n\n  printProfile: (profile) ->\n    type = profile.profileType\n    if type.indexOf('RuleListProfile') >= 0\n      type = 'RuleListProfile'\n\n    if type == 'FixedProfile'\n      @printFixedProfile(profile)\n    else if type == 'PacProfile' and profile.pacUrl\n      profile.pacUrl\n    else\n      chrome.i18n.getMessage('browserAction_profileDetails_' + type) || null\n\n  upgrade: (options, changes) ->\n    super(options).catch (err) =>\n      return Promise.reject err if options?['schemaVersion']\n      getOldOptions = if @switchySharp\n        @switchySharp.getOptions().timeout(1000)\n      else\n        Promise.reject()\n\n      getOldOptions = getOldOptions.catch ->\n        if options?['config']\n          Promise.resolve options\n        else if localStorage['config']\n          Promise.resolve localStorage\n        else\n          Promise.reject new OmegaTarget.Options.NoOptionsError()\n\n      getOldOptions.then (oldOptions) =>\n        i18n = {\n          upgrade_profile_auto: chrome.i18n.getMessage('upgrade_profile_auto')\n        }\n        try\n          # Upgrade from SwitchySharp.\n          upgraded = require('./upgrade')(oldOptions, i18n)\n        catch ex\n          @log.error(ex)\n          return Promise.reject ex\n        if localStorage['config']\n          Object.getPrototypeOf(localStorage).clear.call(localStorage)\n        @_state.set({'firstRun': 'upgrade'})\n        return this && super(upgraded, upgraded)\n\n  onFirstRun: (reason) ->\n    chrome.tabs.create url: chrome.extension.getURL('options.html')\n\n  getPageInfo: ({tabId, url}) ->\n    errorCount = @_requestMonitor?.tabInfo[tabId]?.errorCount\n    result = if errorCount then {errorCount: errorCount} else null\n    getBadge = new Promise (resolve, reject) ->\n      if not chrome.browserAction.getBadgeText?\n        resolve('')\n        return\n      chrome.browserAction.getBadgeText {tabId: tabId}, (result) ->\n        resolve(result)\n\n    getInspectUrl = @_state.get({inspectUrl: ''})\n    Promise.join getBadge, getInspectUrl, (badge, {inspectUrl}) =>\n      if badge == '#' and inspectUrl\n        url = inspectUrl\n      else\n        @clearBadge()\n      return result if not url\n      if url.substr(0, 6) == 'chrome'\n        errorPagePrefix = 'chrome://errorpage/'\n        if url.substr(0, errorPagePrefix.length) == errorPagePrefix\n          url = querystring.parse(url.substr(url.indexOf('?') + 1)).lasturl\n          return result if not url\n        else\n          return result\n      return result if url.substr(0, 6) == 'about:'\n      return result if url.substr(0, 4) == 'moz-'\n      domain = OmegaPac.getBaseDomain(Url.parse(url).hostname)\n\n      return {\n        url: url\n        domain: domain\n        tempRuleProfileName: @queryTempRule(domain)\n        errorCount: errorCount\n      }\n\nmodule.exports = ChromeOptions\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/proxy/index.coffee",
    "content": "ListenerProxyImpl = require('./proxy_impl_listener')\nSettingsProxyImpl = require('./proxy_impl_settings')\nScriptProxyImpl = require('./proxy_impl_script')\n\nexports.proxyImpls = [ListenerProxyImpl, ScriptProxyImpl, SettingsProxyImpl]\nexports.getProxyImpl = (log) ->\n  for Impl in exports.proxyImpls\n    if Impl.isSupported()\n      return new Impl(log)\n  throw new Error('Your browser does not support proxy settings!')\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/proxy/proxy_auth.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\nPromise = OmegaTarget.Promise\n\nmodule.exports = class ProxyAuth\n  constructor: (log) ->\n    @_requests = {}\n    @log = log\n\n  listening: false\n  listen: ->\n    return if @listening\n    if not chrome.webRequest\n      @log.error('Proxy auth disabled! No webRequest permission.')\n      return\n    if not chrome.webRequest.onAuthRequired\n      @log.error('Proxy auth disabled! onAuthRequired not available.')\n      return\n    chrome.webRequest.onAuthRequired.addListener(\n      @authHandler.bind(this)\n      {urls: ['<all_urls>']}\n      ['blocking']\n    )\n    chrome.webRequest.onCompleted.addListener(\n      @_requestDone.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    chrome.webRequest.onErrorOccurred.addListener(\n      @_requestDone.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    @listening = true\n\n  _keyForProxy: (proxy) -> \"#{proxy.host.toLowerCase()}:#{proxy.port}\"\n  setProxies: (profiles) ->\n    @_proxies = {}\n    @_fallbacks = []\n    for profile in profiles when profile.auth\n      for scheme in OmegaPac.Profiles.schemes when profile[scheme.prop]\n        auth = profile.auth?[scheme.prop]\n        continue unless auth\n        proxy = profile[scheme.prop]\n        key = @_keyForProxy(proxy)\n        list = @_proxies[key]\n        if not list?\n          @_proxies[key] = list = []\n        list.push({\n          config: proxy\n          auth: auth\n          name: profile.name + '.' + scheme.prop\n        })\n\n      fallback = profile.auth?['all']\n      if fallback?\n        @_fallbacks.push({\n          auth: fallback\n          name: profile.name + '.' + 'all'\n        })\n\n  _proxies: {}\n  _fallbacks: []\n  _requests: null\n  authHandler: (details) ->\n    return {} unless details.isProxy\n    req = @_requests[details.requestId]\n    if not req?\n      @_requests[details.requestId] = req = {authTries: 0}\n\n    key = @_keyForProxy(\n      host: details.challenger.host\n      port: details.challenger.port\n    )\n\n    list = @_proxies[key]\n    listLen = if list? then list.length else 0\n    if req.authTries < listLen\n      proxy = list[req.authTries]\n    else\n      proxy = @_fallbacks[req.authTries - listLen]\n    @log.log('ProxyAuth', key, req.authTries, proxy?.name)\n\n    return {} unless proxy?\n    req.authTries++\n    return authCredentials: proxy.auth\n\n  _requestDone: (details) ->\n    delete @_requests[details.requestId]\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/proxy/proxy_impl.coffee",
    "content": "OmegaTarget = require('omega-target')\nPromise = OmegaTarget.Promise\nProxyAuth = require('./proxy_auth')\n\nclass ProxyImpl\n  constructor: (log) ->\n    @log = log\n  @isSupported: -> false\n  applyProfile: (profile, meta) -> Promise.reject()\n  watchProxyChange: (callback) -> null\n  parseExternalProfile: (details, options) -> null\n  _profileNotFound: (name) ->\n    @log.error(\"Profile #{name} not found! Things may go very, very wrong.\")\n    return OmegaPac.Profiles.create({\n      name: name\n      profileType: 'VirtualProfile'\n      defaultProfileName: 'direct'\n    })\n  setProxyAuth: (profile, options) ->\n    return Promise.try(=>\n      @_proxyAuth ?= new ProxyAuth(@log)\n      @_proxyAuth.listen()\n      referenced_profiles = []\n      ref_set = OmegaPac.Profiles.allReferenceSet(profile,\n        options, profileNotFound: @_profileNotFound.bind(this))\n      for own _, name of ref_set\n        profile = OmegaPac.Profiles.byName(name, options)\n        if profile\n          referenced_profiles.push(profile)\n      @_proxyAuth.setProxies(referenced_profiles)\n    )\n  getProfilePacScript: (profile, meta, options) ->\n    meta ?= profile\n    ast = OmegaPac.PacGenerator.script(options, profile,\n      profileNotFound: @_profileNotFound.bind(this))\n    ast = OmegaPac.PacGenerator.compress(ast)\n    script = OmegaPac.PacGenerator.ascii(ast.print_to_string())\n    profileName = OmegaPac.PacGenerator.ascii(JSON.stringify(meta.name))\n    profileName = profileName.replace(/\\*/g, '\\\\u002a')\n    profileName = profileName.replace(/\\\\/g, '\\\\u002f')\n    prefix = \"/*OmegaProfile*#{profileName}*#{meta.revision}*/\"\n    return prefix + script\n\nmodule.exports = ProxyImpl\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/proxy/proxy_impl_listener.coffee",
    "content": "OmegaTarget = require('omega-target')\n# The browser only accepts native promises as onRequest return values.\n# DO NOT USE Bluebird Promises here!\nNativePromise = Promise ? null\nProxyImpl = require('./proxy_impl')\n\nclass ListenerProxyImpl extends ProxyImpl\n  @isSupported: -> Promise? and browser?.proxy?.onRequest?\n  features: ['fullUrl', 'socks5Auth']\n  constructor: ->\n    super(arguments...)\n    @_optionsReady = new NativePromise (resolve) =>\n      @_optionsReadyCallback = resolve\n    # We want to register listeners early so that it can start blocking requests\n    # when starting the browser & extension, returning correct results later.\n    @_initRequestListeners()\n  _initRequestListeners: ->\n    browser.proxy.onRequest.addListener(@onRequest.bind(this),\n      {urls: [\"<all_urls>\"]})\n    browser.proxy.onError.addListener(@onError.bind(this))\n  watchProxyChange: (callback) -> null\n  applyProfile: (profile, state, options) ->\n    @_options = options\n    @_profile = profile\n    @_optionsReadyCallback?()\n    @_optionsReadyCallback = null\n    return @setProxyAuth(profile, options)\n  onRequest: (requestDetails) ->\n    # The browser only recognizes native promises return values, not Bluebird.\n    return NativePromise.resolve(@_optionsReady.then(=>\n      request = OmegaPac.Conditions.requestFromUrl(requestDetails.url)\n      profile = @_profile\n      while profile\n        result = OmegaPac.Profiles.match(profile, request)\n        if not result\n          switch profile.profileType\n            when 'DirectProfile'\n              return {type: 'direct'}\n            when 'SystemProfile'\n              # Returning undefined means using the default proxy from previous.\n              # https://hg.mozilla.org/mozilla-central/rev/9f0ee2f582a2#l1.337\n              return undefined\n            else\n              throw new Error('Unsupported profile: ' + profile.profileType)\n        if Array.isArray(result)\n          proxy = result[2]\n          auth = result[3]\n          return @proxyInfo(proxy, auth) if proxy\n          next = result[0]\n        else if result.profileName\n          next = OmegaPac.Profiles.nameAsKey(result.profileName)\n        else\n          break\n        profile = OmegaPac.Profiles.byKey(next, @_options)\n\n      throw new Error('Profile not found: ' + next)\n    ))\n  onError: (error) ->\n    @log.error(error)\n  proxyInfo: (proxy, auth) ->\n    proxyInfo =\n      type: proxy.scheme\n      host: proxy.host\n      port: proxy.port\n    if proxyInfo.type == 'socks5'\n      # MOZ: SOCKS5 proxies should be specified as \"type\": \"socks\".\n      # https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/proxy/ProxyInfo\n      proxyInfo.type = 'socks'\n      if auth\n        # Username & password here are only available for SOCKS5.\n        # https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/proxy/ProxyInfo\n        # HTTP proxy auth must be handled via webRequest.onAuthRequired.\n        proxyInfo.username = auth.username\n        proxyInfo.password = auth.password\n    if proxyInfo.type == 'socks'\n      # Enable SOCKS remote DNS.\n      # TODO(catus): Maybe allow the users to configure this?\n      proxyInfo.proxyDNS = true\n\n    # TODO(catus): Maybe allow proxyDNS for socks4? Server may support SOCKS4a.\n    # It cannot default to true though, since SOCKS4 servers that does not have\n    # the SOCKS4a extension may simply refuse to work.\n\n    return [proxyInfo]\n\nmodule.exports = ListenerProxyImpl\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/proxy/proxy_impl_script.coffee",
    "content": "OmegaTarget = require('omega-target')\nPromise = OmegaTarget.Promise\nProxyImpl = require('./proxy_impl')\n\nclass ScriptProxyImpl extends ProxyImpl\n  @isSupported: ->\n    return browser?.proxy?.register? or browser?.proxy?.registerProxyScript?\n  features: ['socks5Auth']\n  _proxyScriptUrl: 'js/omega_webext_proxy_script.min.js'\n  _proxyScriptDisabled: false\n  _proxyScriptInitialized: false\n  _proxyScriptState: {}\n  watchProxyChange: (callback) -> null\n  applyProfile: (profile, state, options) ->\n    @log.error(\n      'Your browser is outdated! Full-URL based matching, etc. unsupported! ' +\n      \"Please update your browser ASAP!\")\n    state = state ? {}\n    @_options = options\n    state.currentProfileName = profile.name\n    if profile.name == ''\n      state.tempProfile = profile\n    if profile.profileType == 'SystemProfile'\n      # MOZ: SystemProfile cannot be done now due to lack of \"PASS\" support.\n      # https://bugzilla.mozilla.org/show_bug.cgi?id=1319634\n      # In the mean time, let's just unregister the script.\n      if browser.proxy.unregister?\n        browser.proxy.unregister()\n      else\n        # Some older browers may not ship with .unregister API.\n        # In that case, let's just set an invalid script to unregister it.\n        browser.proxy.registerProxyScript('js/omega_invalid_proxy_script.js')\n      @_proxyScriptDisabled = true\n    else\n      @_proxyScriptState = state\n      Promise.all([\n        browser.runtime.getBrowserInfo(),\n        @_initWebextProxyScript(),\n      ]).then ([info]) =>\n        if info.vendor == 'Mozilla' and info.buildID < '20170918220054'\n          # MOZ: Legacy proxy support expects PAC-like string return type.\n          # TODO(catus): Remove support for string return type.\n          @log.error(\n            'Your browser is outdated! SOCKS5 DNS/Auth unsupported! ' +\n            \"Please update your browser ASAP! (Current Build #{info.buildID})\")\n          @_proxyScriptState.useLegacyStringReturn = true\n        @_proxyScriptStateChanged()\n    return @setProxyAuth(profile, options)\n  _initWebextProxyScript: ->\n    if not @_proxyScriptInitialized\n      browser.proxy.onProxyError.addListener (err) =>\n        if err?.message?\n          if err.message.indexOf('Invalid Proxy Rule: DIRECT') >= 0\n            # DIRECT cannot be parsed in Mozilla earlier due to a bug. Even\n            # though it throws, it actually falls back to direct connection\n            # so it works.\n            # https://bugzilla.mozilla.org/show_bug.cgi?id=1355198\n            return\n          if err.message.indexOf('Return type must be a string') >= 0\n            # MOZ: Legacy proxy support expects PAC-like string return type.\n            # TODO(catus): Remove support for string return type.\n            #\n            @log.error(\n              'Your browser is outdated! SOCKS5 DNS/Auth unsupported! ' +\n              'Please update your browser ASAP!')\n            @_proxyScriptState.useLegacyStringReturn = true\n            @_proxyScriptStateChanged()\n            return\n        @log.error(err)\n      browser.runtime.onMessage.addListener (message) =>\n        return unless message.event == 'proxyScriptLog'\n        if message.level == 'error'\n          @log.error(message)\n        else if message.level == 'warn'\n          @log.error(message)\n        else\n          @log.log(message)\n\n    if not @_proxyScriptInitialized or @_proxyScriptDisabled\n      promise = new Promise (resolve) ->\n        onMessage = (message) ->\n          return unless message.event == 'proxyScriptLoaded'\n          resolve()\n          browser.runtime.onMessage.removeListener onMessage\n          return\n        browser.runtime.onMessage.addListener onMessage\n      # The API has been renamed to .register but for some old browsers' sake:\n      if browser.proxy.register?\n        browser.proxy.register(@_proxyScriptUrl)\n      else\n        browser.proxy.registerProxyScript(@_proxyScriptUrl)\n      @_proxyScriptDisabled = false\n    else\n      promise = Promise.resolve()\n    @_proxyScriptInitialized = true\n    return promise\n\n  _proxyScriptStateChanged: ->\n    browser.runtime.sendMessage({\n      event: 'proxyScriptStateChanged'\n      state: @_proxyScriptState\n      options: @_options\n    }, {\n      toProxyScript: true\n    })\n\nmodule.exports = ScriptProxyImpl\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/proxy/proxy_impl_settings.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\nPromise = OmegaTarget.Promise\nchromeApiPromisify = require('../chrome_api').chromeApiPromisify\nProxyImpl = require('./proxy_impl')\n\nclass SettingsProxyImpl extends ProxyImpl\n  @isSupported: -> chrome?.proxy?.settings?\n  features: ['fullUrlHttp', 'pacScript', 'watchProxyChange']\n  applyProfile: (profile, meta, options) ->\n    meta ?= profile\n    if profile.profileType == 'SystemProfile'\n      # Clear proxy settings, returning proxy control to Chromium.\n      return chromeApiPromisify(chrome.proxy.settings, 'clear')({}).then =>\n        chrome.proxy.settings.get {}, @_proxyChangeListener\n        return\n    config = {}\n    if profile.profileType == 'DirectProfile'\n      config['mode'] = 'direct'\n    else if profile.profileType == 'PacProfile'\n      config['mode'] = 'pac_script'\n\n      config['pacScript'] =\n        if !profile.pacScript || OmegaPac.Profiles.isFileUrl(profile.pacUrl)\n          url: profile.pacUrl\n          mandatory: true\n        else\n          data: OmegaPac.PacGenerator.ascii(profile.pacScript)\n          mandatory: true\n    else if profile.profileType == 'FixedProfile'\n      config = @_fixedProfileConfig(profile)\n    else\n      config['mode'] = 'pac_script'\n      config['pacScript'] =\n        mandatory: true\n        data: @getProfilePacScript(profile, meta, options)\n    return @setProxyAuth(profile, options).then(->\n      return chromeApiPromisify(chrome.proxy.settings, 'set')({value: config})\n    ).then(=>\n      chrome.proxy.settings.get {}, @_proxyChangeListener\n      return\n    )\n  _fixedProfileConfig: (profile) ->\n    config = {}\n    config['mode'] = 'fixed_servers'\n    rules = {}\n    protocols = ['proxyForHttp', 'proxyForHttps', 'proxyForFtp']\n    protocolProxySet = false\n    for protocol in protocols when profile[protocol]?\n      rules[protocol] = profile[protocol]\n      protocolProxySet = true\n\n    if profile.fallbackProxy\n      if profile.fallbackProxy.scheme == 'http'\n        # Chromium does not allow HTTP proxies in 'fallbackProxy'.\n        if not protocolProxySet\n          # Use 'singleProxy' if no proxy is configured for other protocols.\n          rules['singleProxy'] = profile.fallbackProxy\n        else\n          # Try to set the proxies of all possible protocols.\n          for protocol in protocols\n            rules[protocol] ?= JSON.parse(JSON.stringify(profile.fallbackProxy))\n      else\n        rules['fallbackProxy'] = profile.fallbackProxy\n    else if not protocolProxySet\n      config['mode'] = 'direct'\n\n    if config['mode'] != 'direct'\n      rules['bypassList'] = bypassList = []\n      for condition in profile.bypassList\n        bypassList.push(@_formatBypassItem(condition))\n      config['rules'] = rules\n    return config\n  _formatBypassItem: (condition) ->\n    str = OmegaPac.Conditions.str(condition)\n    i = str.indexOf(' ')\n    return str.substr(i + 1)\n\n  _proxyChangeWatchers: null\n  _proxyChangeListener: (details) ->\n    for watcher in (@_proxyChangeWatchers ? [])\n      watcher(details)\n  watchProxyChange: (callback) ->\n    if not @_proxyChangeWatchers?\n      @_proxyChangeWatchers = []\n      if chrome?.proxy?.settings?.onChange?\n        chrome.proxy.settings.onChange.addListener(\n          @_proxyChangeListener.bind(this))\n    @_proxyChangeWatchers.push(callback)\n    return\n  parseExternalProfile: (details, options) ->\n    if details.name\n      return details\n    switch details.value.mode\n      when 'system'\n        OmegaPac.Profiles.byName('system')\n      when 'direct'\n        OmegaPac.Profiles.byName('direct')\n      when 'auto_detect'\n        OmegaPac.Profiles.create({\n          profileType: 'PacProfile'\n          name: ''\n          pacUrl: 'http://wpad/wpad.dat'\n        })\n      when 'pac_script'\n        url = details.value.pacScript.url\n        if url\n          profile = null\n          OmegaPac.Profiles.each options, (key, p) ->\n            if p.profileType == 'PacProfile' and p.pacUrl == url\n              profile = p\n          profile ? OmegaPac.Profiles.create({\n            profileType: 'PacProfile'\n            name: ''\n            pacUrl: url\n          })\n        else do ->\n          profile = null\n          script = details.value.pacScript.data\n          OmegaPac.Profiles.each options, (key, p) ->\n            if p.profileType == 'PacProfile' and p.pacScript == script\n              profile = p\n          return profile if profile\n          # Try to parse the prefix used by this class.\n          script = script.trim()\n          magic = '/*OmegaProfile*'\n          if script.substr(0, magic.length) == magic\n            end = script.indexOf('*/')\n            if end > 0\n              i = magic.length\n              tokens = script.substring(magic.length, end).split('*')\n              [profileName, revision] = tokens\n              try\n                profileName = JSON.parse(profileName)\n              catch _\n                profileName = null\n              if profileName and revision\n                profile = OmegaPac.Profiles.byName(profileName, options)\n                if OmegaPac.Revision.compare(profile.revision, revision) == 0\n                  return profile\n          return OmegaPac.Profiles.create({\n            profileType: 'PacProfile'\n            name: ''\n            pacScript: script\n          })\n      when 'fixed_servers'\n        props = ['proxyForHttp', 'proxyForHttps', 'proxyForFtp',\n          'fallbackProxy', 'singleProxy']\n        proxies = {}\n        for prop in props\n          result = OmegaPac.Profiles.pacResult(details.value.rules[prop])\n          if prop == 'singleProxy' and details.value.rules[prop]?\n            proxies['fallbackProxy'] = result\n          else\n            proxies[prop] = result\n        bypassSet = {}\n        bypassCount = 0\n        if details.value.rules.bypassList\n          for pattern in details.value.rules.bypassList\n            bypassSet[pattern] = true\n            bypassCount++\n        if bypassSet['<local>']\n          for host in OmegaPac.Conditions.localHosts when bypassSet[host]\n            delete bypassSet[host]\n            bypassCount--\n        profile = null\n        OmegaPac.Profiles.each options, (key, p) =>\n          return if p.profileType != 'FixedProfile'\n          return if p.bypassList.length != bypassCount\n          for condition in p.bypassList\n            return unless bypassSet[condition.pattern]\n          rules = @_fixedProfileConfig(p).rules\n          if rules['singleProxy']\n            rules['fallbackProxy'] = rules['singleProxy']\n            delete rules['singleProxy']\n          return unless rules?\n          for prop in props when rules[prop] or proxies[prop]\n            if OmegaPac.Profiles.pacResult(rules[prop]) != proxies[prop]\n              return\n          profile = p\n        if profile\n          profile\n        else\n          profile = OmegaPac.Profiles.create({\n            profileType: 'FixedProfile'\n            name: ''\n          })\n          for prop in props when details.value.rules[prop]\n            if prop == 'singleProxy'\n              profile['fallbackProxy'] = details.value.rules[prop]\n            else\n              profile[prop] = details.value.rules[prop]\n          profile.bypassList =\n            for own pattern of bypassSet\n              {conditionType: 'BypassCondition', pattern: pattern}\n          profile\n\nmodule.exports = SettingsProxyImpl\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/storage.coffee",
    "content": "chromeApiPromisify = require('./chrome_api').chromeApiPromisify\nOmegaTarget = require('omega-target')\nPromise = OmegaTarget.Promise\n\nclass ChromeStorage extends OmegaTarget.Storage\n  @parseStorageErrors: (err) ->\n    if err?.message\n      sustainedPerMinute = 'MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE'\n      if err.message.indexOf('QUOTA_BYTES_PER_ITEM') >= 0\n        err = new OmegaTarget.Storage.QuotaExceededError()\n        err.perItem = true\n      else if err.message.indexOf('QUOTA_BYTES') >= 0\n        err = new OmegaTarget.Storage.QuotaExceededError()\n      else if err.message.indexOf('MAX_ITEMS') >= 0\n        err = new OmegaTarget.Storage.QuotaExceededError()\n        err.maxItems = true\n      else if err.message.indexOf('MAX_WRITE_OPERATIONS_') >= 0\n        err = new OmegaTarget.Storage.RateLimitExceededError()\n        if err.message.indexOf('MAX_WRITE_OPERATIONS_PER_HOUR') >= 0\n          err.perHour = true\n        else if err.message.indexOf('MAX_WRITE_OPERATIONS_PER_MINUTE') >= 0\n          err.perMinute = true\n      else if err.message.indexOf(sustainedPerMinute) >= 0\n        err = new OmegaTarget.Storage.RateLimitExceededError()\n        err.perMinute = true\n        err.sustained = 10\n      else if err.message.indexOf('is not available') >= 0\n        # This could happen if the storage area is not available. For example,\n        # some Chromium-based browsers disable access to the sync storage.\n        err = new OmegaTarget.Storage.StorageUnavailableError()\n      else if err.message.indexOf(\n        'Please set webextensions.storage.sync.enabled to true') >= 0\n        # This happens when sync storage is disabled in flags.\n        err = new OmegaTarget.Storage.StorageUnavailableError()\n\n    return Promise.reject(err)\n\n  constructor: (@areaName) ->\n    if browser?.storage?[@areaName]\n      @storage = browser.storage[@areaName]\n    else\n      @storage =\n        get: chromeApiPromisify(chrome.storage[@areaName], 'get')\n        set: chromeApiPromisify(chrome.storage[@areaName], 'set')\n        remove: chromeApiPromisify(chrome.storage[@areaName], 'remove')\n        clear: chromeApiPromisify(chrome.storage[@areaName], 'clear')\n\n  get: (keys) ->\n    keys ?= null\n    Promise.resolve(@storage.get(keys)).catch(ChromeStorage.parseStorageErrors)\n\n  set: (items) ->\n    if Object.keys(items).length == 0\n      return Promise.resolve({})\n    Promise.resolve(@storage.set(items)).catch(ChromeStorage.parseStorageErrors)\n\n  remove: (keys) ->\n    if not keys?\n      return Promise.resolve(@storage.clear())\n    if Array.isArray(keys) and keys.length == 0\n      return Promise.resolve({})\n    Promise.resolve(@storage.remove(keys))\n      .catch(ChromeStorage.parseStorageErrors)\n\n  watch: (keys, callback) ->\n    ChromeStorage.watchers[@areaName] ?= {}\n    area = ChromeStorage.watchers[@areaName]\n    watcher = {keys: keys, callback: callback}\n    id = Date.now().toString()\n    while area[id]\n      id = Date.now().toString()\n\n    if Array.isArray(keys)\n      keyMap = {}\n      for key in keys\n        keyMap[key] = true\n      keys = keyMap\n    area[id] = {keys: keys, callback: callback}\n    if not ChromeStorage.onChangedListenerInstalled\n      chrome.storage.onChanged.addListener(ChromeStorage.onChangedListener)\n      ChromeStorage.onChangedListenerInstalled = true\n    return -> delete area[id]\n\n  @onChangedListener: (changes, areaName) ->\n    map = null\n    for _, watcher of ChromeStorage.watchers[areaName]\n      match = watcher.keys == null\n      if not match\n        for own key of changes\n          if watcher.keys[key]\n            match = true\n            break\n      if match\n        if not map?\n          map = {}\n          for own key, change of changes\n            map[key] = change.newValue\n        watcher.callback(map)\n\n  @onChangedListenerInstalled: false\n  @watchers: {}\n\nmodule.exports = ChromeStorage\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/switchysharp.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\nPromise = OmegaTarget.Promise\nChromePort = require('./chrome_port')\n\nmodule.exports = class SwitchySharp\n  @extId: 'dpplabbmogkhghncfbfdeeokoefdjegm'\n  port: null\n\n  monitor: (action) ->\n    return if location.href.substr(0, 4) == 'moz-'\n    if not port? and not @_monitorTimerId?\n      @_monitorTimerId = setInterval @_connect.bind(this), 5000\n      if action != 'reconnect'\n        @_connect()\n\n  getOptions: ->\n    if not @_getOptions\n      @_getOptions = new Promise (resolve) =>\n        @_getOptionsResolver = resolve\n        @monitor()\n    @_getOptions\n\n  _getOptions: null\n  _getOptionsResolver: null\n  _monitorTimerId: null\n\n  _onMessage: (msg) ->\n    if @_monitorTimerId\n      clearInterval @_monitorTimerId\n      @_monitorTimerId = null\n    switch msg?.action\n      when 'state'\n        # State changed.\n        OmegaTarget.Log.log(msg)\n        if @_getOptionsResolver\n          @port.postMessage({action: 'getOptions'})\n      when 'options'\n        @_getOptionsResolver?(msg.options)\n        @_getOptionsResolver = null\n\n  _onDisconnect: (msg) ->\n    @port = null\n    @_getOptions = null\n    @_getOptionsResolver = null\n    @monitor('reconnect')\n\n  _connect: ->\n    if not @port\n      @port = new ChromePort(chrome.runtime.connect(SwitchySharp.extId))\n      @port.onDisconnect.addListener(@_onDisconnect.bind(this))\n      @port?.onMessage.addListener(@_onMessage.bind(this))\n    try\n      @port.postMessage({action: 'disable'})\n    catch _\n      @port = null\n    return @port?\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/tabs.coffee",
    "content": "class ChromeTabs\n  _defaultAction: null\n  _badgeTab: null\n\n  constructor: (@actionForUrl) ->\n    @_dirtyTabs = {}\n    return\n\n  ignoreError: ->\n    chrome.runtime.lastError\n    return\n\n  watch: ->\n    chrome.tabs.onUpdated.addListener @onUpdated.bind(this)\n    chrome.tabs.onActivated.addListener (info) =>\n      chrome.tabs.get info.tabId, (tab) =>\n        return if chrome.runtime.lastError\n        if @_dirtyTabs.hasOwnProperty(info.tabId)\n          @onUpdated tab.id, {}, tab\n\n  resetAll: (action) ->\n    @_defaultAction = action\n    chrome.tabs.query {}, (tabs) =>\n      @_dirtyTabs = {}\n      tabs.forEach (tab) =>\n        @_dirtyTabs[tab.id] = tab.id\n        @onUpdated tab.id, {}, tab if tab.active\n    if chrome.browserAction.setPopup?\n      chrome.browserAction.setTitle({title: action.title})\n    else\n      chrome.browserAction.setTitle({title: action.shortTitle})\n    @setIcon(action.icon)\n\n  onUpdated: (tabId, changeInfo, tab) ->\n    if @_dirtyTabs.hasOwnProperty(tab.id)\n      delete @_dirtyTabs[tab.id]\n    else if not changeInfo.url?\n      if changeInfo.status? and changeInfo.status != 'loading'\n        return\n    @processTab(tab, changeInfo)\n\n  processTab: (tab, changeInfo) ->\n    if @_badgeTab\n      for own id of @_badgeTab\n        try chrome.browserAction.setBadgeText?(text: '', tabId: id)\n        @_badgeTab = null\n\n    if not tab.url? or tab.url.indexOf(\"chrome\") == 0\n      if @_defaultAction\n        chrome.browserAction.setTitle({\n          title: @_defaultAction.title\n          tabId: tab.id\n        })\n        @clearIcon tab.id\n      return\n    @actionForUrl(tab.url).then (action) =>\n      if not action\n        @clearIcon tab.id\n        return\n      @setIcon(action.icon, tab.id)\n      if chrome.browserAction.setPopup?\n        chrome.browserAction.setTitle({title: action.title, tabId: tab.id})\n      else\n        chrome.browserAction.setTitle({title: action.shortTitle, tabId: tab.id})\n\n  setTabBadge: (tab, badge) ->\n    @_badgeTab ?= {}\n    @_badgeTab[tab.id] = true\n    chrome.browserAction.setBadgeText?(text: badge.text, tabId: tab.id)\n    chrome.browserAction.setBadgeBackgroundColor?(\n      color: badge.color\n      tabId: tab.id\n    )\n\n  setIcon: (icon, tabId) ->\n    return unless icon?\n    if tabId?\n      params = {\n        imageData: icon\n        tabId: tabId\n      }\n    else\n      params = {\n        imageData: icon\n      }\n    @_chromeSetIcon(params)\n\n  _chromeSetIcon: (params) ->\n    try\n      chrome.browserAction.setIcon?(params, @ignoreError)\n    catch _\n      # Some legacy Chrome versions will panic if there are other icon sizes.\n      params.imageData = {19: params.imageData[19], 38: params.imageData[38]}\n      chrome.browserAction.setIcon?(params, @ignoreError)\n\n  clearIcon: (tabId) ->\n    return unless @_defaultAction?.icon?\n    @_chromeSetIcon({\n      imageData: @_defaultAction.icon\n      tabId: tabId\n    }, @ignoreError)\n\nmodule.exports = ChromeTabs\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/upgrade.coffee",
    "content": "OmegaTarget = require('omega-target')\nOmegaPac = OmegaTarget.OmegaPac\n\nmodule.exports = (oldOptions, i18n) ->\n  config = try JSON.parse(oldOptions['config'])\n  if config\n    options = changes ? {}\n    options['schemaVersion'] = 2\n    boolItems =\n      '-confirmDeletion': 'confirmDeletion'\n      '-refreshOnProfileChange': 'refreshTab'\n      '-enableQuickSwitch': 'quickSwitch'\n      '-revertProxyChanges': 'preventProxyChanges'\n    for own key, oldKey of boolItems\n      options[key] = !!config[oldKey]\n    options['-downloadInterval'] =\n      parseInt(config['ruleListReload']) || 15\n\n    auto = OmegaPac.Profiles.create(\n      profileType: 'SwitchProfile'\n      name: i18n.upgrade_profile_auto\n      color: '#55bb55'\n      defaultProfileName: 'direct' # We will set this to rulelist.name soon.\n    )\n    OmegaPac.Profiles.updateRevision(auto)\n    options[OmegaPac.Profiles.nameAsKey(auto.name)] = auto\n\n    rulelist = OmegaPac.Profiles.create(\n      profileType: 'RuleListProfile'\n      name: '__ruleListOf_' + auto.name\n      color: '#dd6633'\n      format:\n        if config['ruleListAutoProxy'] then 'AutoProxy' else 'Switchy'\n      defaultProfileName: 'direct'\n      sourceUrl: config['ruleListUrl'] || ''\n    )\n    options[OmegaPac.Profiles.nameAsKey(rulelist.name)] = rulelist\n\n    auto.defaultProfileName = rulelist.name\n\n    nameMap = {'auto': auto.name, 'direct': 'direct'}\n    oldProfiles = (try JSON.parse(oldOptions['profiles'])) || {}\n    colorTranslations =\n      'blue': '#99ccee'\n      'green': '#99dd99'\n      'red': '#ffaa88'\n      'yellow': '#ffee99'\n      'purple': '#d497ee'\n      '': '#99ccee'\n\n    seenFixedProfile = false\n    for own _, oldProfile of oldProfiles\n      profile = null\n      switch oldProfile['proxyMode']\n        when 'auto'\n          profile = OmegaPac.Profiles.create(\n            profileType: 'PacProfile'\n          )\n          url = oldProfile['proxyConfigUrl']\n          if url.substr(0, 5) == 'data:'\n            text = url.substr(url.indexOf(',') + 1)\n            Buffer = require('buffer').Buffer\n            text = new Buffer(text, 'base64').toString('utf8')\n            profile.pacScript = text\n          else\n            profile.pacUrl = url\n        when 'manual'\n          seenFixedProfile = true\n          profile = OmegaPac.Profiles.create(\n            profileType: 'FixedProfile'\n          )\n          if !!oldProfile['useSameProxy']\n            profile.fallbackProxy = OmegaPac.Profiles.parseHostPort(\n              oldProfile['proxyHttp'], 'http')\n          else if oldProfile['proxySocks']\n            protocol =\n              if oldProfile['socksVersion'] == 5\n                'socks5'\n              else\n                'socks4'\n            profile.fallbackProxy = OmegaPac.Profiles.parseHostPort(\n              oldProfile['proxySocks'],\n              protocol\n            )\n          else\n            profile.proxyForHttp = OmegaPac.Profiles.parseHostPort(\n              oldProfile['proxyHttp'], 'http')\n            profile.proxyForHttps = OmegaPac.Profiles.parseHostPort(\n              oldProfile['proxyHttps'], 'http')\n            profile.proxyForFtp = OmegaPac.Profiles.parseHostPort(\n              oldProfile['proxyFtp'], 'http')\n          if oldProfile['proxyExceptions']?\n            haslocalPattern = false\n            profile.bypassList = []\n            oldProfile['proxyExceptions'].split(';').forEach (line) ->\n              line = line.trim()\n              return unless line\n              haslocalPattern = true if line == '<local>'\n              profile.bypassList.push(\n                conditionType: 'BypassCondition'\n                pattern: line\n              )\n            if haslocalPattern\n              profile.bypassList = profile.bypassList.filter (cond) ->\n                OmegaPac.Conditions.localHosts.indexOf(cond.pattern) < 0\n      if profile\n        color = oldProfile['color']\n        profile.color = colorTranslations[color] ? colorTranslations['']\n        name = oldProfile['name'] ? oldProfile['id']\n        name = name.trim()\n        if name[0] == '_'\n          name = 'p' + name\n        profile.name = name\n        num = 1\n        while OmegaPac.Profiles.byName(profile.name, options)\n          profile.name = name + num\n          num++\n        nameMap[oldProfile['id']] = profile.name\n        OmegaPac.Profiles.updateRevision(profile)\n        options[OmegaPac.Profiles.nameAsKey(profile.name)] = profile\n\n    if not seenFixedProfile\n      exampleFixedProfileName = 'Example Profile'\n      options[OmegaPac.Profiles.nameAsKey(exampleFixedProfileName)] =\n        bypassList: [\n          {\n            pattern: \"127.0.0.1\"\n            conditionType: \"BypassCondition\"\n          }\n          {\n            pattern: \"::1\"\n            conditionType: \"BypassCondition\"\n          }\n          {\n            pattern: \"localhost\"\n            conditionType: \"BypassCondition\"\n          }\n        ]\n        profileType: \"FixedProfile\"\n        name: exampleFixedProfileName\n        color: \"#99ccee\"\n        fallbackProxy:\n          port: 8080\n          scheme: \"http\"\n          host: \"proxy.example.com\"\n\n    startupId = config['startupProfileId']\n    options['-startupProfileName'] = nameMap[startupId] || ''\n\n    quickSwitch = try JSON.parse(oldOptions['quickSwitchProfiles'])\n    options['-quickSwitchProfiles'] = if not quickSwitch? then [] else\n      quickSwitch.map (p) -> nameMap[p]\n\n    if config['ruleListProfileId']\n      rulelist.matchProfileName =\n        nameMap[config['ruleListProfileId']] || 'direct'\n\n    defaultRule = try JSON.parse(oldOptions['defaultRule'])\n    if defaultRule\n      rulelist.defaultProfileName =\n        nameMap[defaultRule.profileId] || 'direct'\n      if not config.ruleListEnabled\n        auto.defaultProfileName = rulelist.defaultProfileName\n    OmegaPac.Profiles.updateRevision(rulelist)\n\n    rules = try JSON.parse(oldOptions['rules'])\n    if rules\n      conditionFromRule = (rule) ->\n        switch rule['patternType']\n          when 'wildcard'\n            pattern = rule['urlPattern']\n            OmegaPac.RuleList['Switchy'].conditionFromLegacyWildcard(pattern)\n          else\n            conditionType: 'UrlRegexCondition'\n            pattern: rule['urlPattern']\n      auto.rules = for own _, rule of rules\n        profileName: nameMap[rule['profileId']] || 'direct'\n        condition: conditionFromRule(rule)\n        note: rule.name\n    return options\n  return\n"
  },
  {
    "path": "omega-target-chromium-extension/src/module/web_request_monitor.coffee",
    "content": "Heap = require('heap')\nUrl = require('url')\n\nmodule.exports = class WebRequestMonitor\n  constructor: (@getSummaryId) ->\n    @_requests = {}\n    @_recentRequests = new Heap((a, b) -> a._startTime - b._startTime)\n    @_callbacks = []\n    @_tabCallbacks = []\n    @tabInfo = {}\n\n  _callbacks: null\n  watching: false\n  timer: null\n  watch: (callback) ->\n    @_callbacks.push(callback)\n    return if @watching\n    if not chrome.webRequest\n      console.log('Request monitor disabled! No webRequest permission.')\n      return\n    chrome.webRequest.onBeforeRequest.addListener(\n      @_requestStart.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    chrome.webRequest.onHeadersReceived.addListener(\n      @_requestHeadersReceived.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    chrome.webRequest.onBeforeRedirect.addListener(\n      @_requestRedirected.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    chrome.webRequest.onCompleted.addListener(\n      @_requestDone.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    chrome.webRequest.onErrorOccurred.addListener(\n      @_requestError.bind(this)\n      {urls: ['<all_urls>']}\n    )\n    @watching = true\n\n  _requests: null\n  _recentRequests: null\n\n  _requestStart: (req) ->\n    return if req.tabId < 0\n    req._startTime = Date.now()\n    @_requests[req.requestId] = req\n    @_recentRequests.push(req)\n    @timer ?= setInterval(@_tick.bind(this), 1000)\n    for callback in @_callbacks\n      callback('start', req)\n\n  _tick: ->\n    now = Date.now()\n    while (req = @_recentRequests.peek())\n      reqInfo = @_requests[req.requestId]\n      if reqInfo and not reqInfo.noTimeout\n        if now - req._startTime < 5000\n          break\n        else\n          reqInfo.timeoutCalled = true\n          for callback in @_callbacks\n            callback('timeout', reqInfo)\n      @_recentRequests.pop()\n\n  _requestHeadersReceived: (req) ->\n    reqInfo = @_requests[req.requestId]\n    return unless reqInfo\n    reqInfo.noTimeout = true\n    if reqInfo.timeoutCalled\n      for callback in @_callbacks\n        callback('ongoing', req)\n\n  _requestRedirected: (req) ->\n    url = req.redirectUrl\n    return unless url\n    if url.indexOf('data:') == 0 || url.indexOf('about:') == 0\n      @_requestDone(req)\n\n  _requestError: (req) ->\n    reqInfo = @_requests[req.requestId]\n    delete @_requests[req.requestId]\n\n    return if req.tabId < 0\n    return if req.error == 'net::ERR_INCOMPLETE_CHUNKED_ENCODING'\n    return if req.error.indexOf('BLOCKED') >= 0\n    return if req.error.indexOf('net::ERR_FILE_') == 0\n    # Blocked by other extensions in Firefox.\n    return if req.error.indexOf('NS_ERROR_ABORT') == 0\n    return if req.url.indexOf('file:') == 0\n    return if req.url.indexOf('chrome') == 0\n    return if req.url.indexOf('about:') == 0\n    return if req.url.indexOf('moz-') == 0\n    # Some ad-blocking extensions may redirect requests to 127.0.0.1.\n    return if req.url.indexOf('://127.0.0.1') > 0\n    return unless reqInfo\n    if req.error == 'net::ERR_ABORTED'\n      if reqInfo.timeoutCalled and not reqInfo.noTimeout\n        for callback in @_callbacks\n          callback('timeoutAbort', req)\n      return\n    for callback in @_callbacks\n      callback('error', req)\n\n  _requestDone: (req) ->\n    for callback in @_callbacks\n      callback('done', req)\n    delete @_requests[req.requestId]\n\n  eventCategory:\n    start: 'ongoing'\n    ongoing: 'ongoing'\n    timeout: 'error'\n    error: 'error'\n    timeoutAbort: 'error'\n    done: 'done'\n\n  tabsWatching: false\n  _tabCallbacks: null\n\n  watchTabs: (callback) ->\n    @_tabCallbacks.push(callback)\n    return if @tabsWatching\n    @watch(@setTabRequestInfo.bind(this))\n    @tabsWatching = true\n    chrome.tabs.onCreated.addListener (tab) =>\n      return unless tab.id\n      @tabInfo[tab.id] = @_newTabInfo()\n    chrome.tabs.onRemoved.addListener (tab) =>\n      delete @tabInfo[tab.id]\n    chrome.tabs.onReplaced?.addListener (added, removed) =>\n      @tabInfo[added] ?= @_newTabInfo()\n      delete @tabInfo[removed]\n    chrome.tabs.onUpdated.addListener (tabId, changeInfo, tab) =>\n      info = @tabInfo[tab.id] ?= @_newTabInfo()\n      return unless info\n      for callback in @_tabCallbacks\n        callback(tab.id, info, null, 'updated')\n    chrome.tabs.query {}, (tabs) =>\n      for tab in tabs\n        @tabInfo[tab.id] ?= @_newTabInfo()\n\n  _newTabInfo: -> {\n    requests: {}\n    requestCount: 0\n    requestStatus: {}\n\n    ongoingCount: 0\n    errorCount: 0\n    doneCount: 0\n\n    summary: {}\n  }\n\n  setTabRequestInfo: (status, req) ->\n    info = @tabInfo[req.tabId]\n    if info\n      if status == 'start' and req.type == 'main_frame'\n        if req.url.indexOf('chrome://errorpage/') != 0\n          for own key, value of @_newTabInfo()\n            info[key] = value\n      return if info.requestCount > 1000\n      info.requests[req.requestId] = req\n      if (oldStatus = info.requestStatus[req.requestId])\n        info[@eventCategory[oldStatus] + 'Count']--\n      else\n        return if status == 'timeoutAbort'\n        info.requestCount++\n      info.requestStatus[req.requestId] = status\n      info[@eventCategory[status] + 'Count']++\n      id = @getSummaryId?(req)\n      if id?\n        if @eventCategory[status] == 'error'\n          if @eventCategory[oldStatus] != 'error'\n            summaryItem = info.summary[id]\n            if not summaryItem?\n              summaryItem = info.summary[id] = {errorCount: 0}\n            summaryItem.errorCount++\n        else if @eventCategory[oldStatus] == 'error'\n          summaryItem = info.summary[id]\n          summaryItem.errorCount-- if summaryItem?\n      for callback in @_tabCallbacks\n        callback(req.tabId, info, req, status)\n"
  },
  {
    "path": "omega-web/.gitattributes",
    "content": "lib/* linguist-vendored\n"
  },
  {
    "path": "omega-web/.gitignore",
    "content": "/build\n/tmp\n"
  },
  {
    "path": "omega-web/Gruntfile.coffee",
    "content": "module.exports = require('load-grunt-config')\n"
  },
  {
    "path": "omega-web/bower.json",
    "content": "{\n  \"name\": \"switchyomega\",\n  \"version\": \"0.0.1\",\n  \"authors\": [\n    \"FelisCatus <felis.catus@example.com>\"\n  ],\n  \"description\": \"The ultimate proxy switcher.\",\n  \"keywords\": [\n    \"proxy\",\n    \"pac\",\n    \"extension\"\n  ],\n  \"license\": \"GPL\",\n  \"homepage\": \"https://github.com/FelisCatus/SwitchyOmega\",\n  \"private\": true,\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"tests\"\n  ],\n  \"dependencies\": {\n    \"angular\": \"~1.7.2\",\n    \"angular-animate\": \"~1.7.2\",\n    \"angular-loader\": \"~1.7.2\",\n    \"angular-i18n\": \"~1.7.2\",\n    \"angular-sanitize\": \"~1.7.2\",\n\n    \"angular-bootstrap\": \"~0.12.0\",\n    \"angular-ui-router\": \"~0.2.18\",\n    \"bootstrap\": \"~3.3.2\",\n    \"script.js\": \"~2.5.3\",\n    \"ngprogress\": \"~1.0.4\",\n    \"angular-ui-sortable\": \"~0.13.3\",\n    \"jsondiffpatch\": \"~0.1.7\",\n    \"angular-spectrum-colorpicker\": \"~1.3.5\",\n    \"blob\": \"*\",\n    \"FileSaver\": \"=1.3.3\",\n    \"angular-ui-utils\": \"bower-validate\",\n    \"angular-ladda\": \"~0.2.1\",\n    \"shepherd.js\": \"~0.5.1\",\n    \"jqueryui-touch-punch\": \"*\"\n  },\n  \"exportsOverride\": {\n    \"script.js\": {\n      \"\": \"dist/*.min.js\"\n    },\n    \"jquery\": {\n      \"\": \"dist/jquery.min.js\"\n    },\n    \"jquery-ui\": {\n      \"\": []\n    },\n    \"jqueryui-touch-punch\": {\n      \"\": \"jquery.ui.touch-punch.min.js\"\n    },\n    \"angular\": {\n      \"\": \"angular.min.js\"\n    },\n    \"angular-animate\": {\n      \"\": \"*.min.js\"\n    },\n    \"angular-bootstrap\": {\n      \"\": \"ui-bootstrap-tpls.min.js\"\n    },\n    \"angular-i18n\": {\n      \"\": [\n        \"angular-locale_en-us.js\",\n        \"angular-locale_zh-cn.js\",\n        \"angular-locale_zh-hk.js\",\n        \"angular-locale_zh-tw.js\"\n      ]\n    },\n    \"angular-loader\": {\n      \"\": \"*.min.js\"\n    },\n    \"angular-sanitize\": {\n      \"\": \"*.min.js\"\n    },\n    \"angular-spectrum-colorpicker\": {\n      \"\": \"dist/*.min.js\"\n    },\n    \"angular-ui-router\": {\n      \"\": \"release/*.min.js\"\n    },\n    \"angular-ui-sortable\": {\n      \"\": \"*.min.js\"\n    },\n    \"angular-ui-utils\": {\n      \"\": \"*.min.js\"\n    },\n    \"bootstrap\": {\n      \"css\": \"dist/css/bootstrap.min.css\",\n      \"fonts\": \"dist/fonts/*\",\n      \"js\": \"js/dropdown.*\"\n    },\n    \"ngprogress\": {\n      \"\": \"build/*.min.js\"\n    },\n    \"jsondiffpatch\": {\n      \"\": \"public/build/jsondiffpatch.min.js\"\n    },\n    \"shepherd.js\": {\n      \"\": [\n        \"*.min.js\",\n        \"css/shepherd-theme-arrows.css\"\n      ]\n    },\n    \"spectrum\": {\n      \"\": [\n        \"*.js\",\n        \"*.css\"\n      ]\n    },\n    \"FileSaver\": {\n      \"\": \"*.min.js\"\n    },\n    \"blob\": {\n      \"\": \"*.js\"\n    },\n    \"ladda\": {\n      \"\": [\n        \"dist/ladda-themeless.min.css\",\n        \"dist/ladda.min.js\"\n      ]\n    }\n  },\n  \"resolutions\": {\n    \"angular\": \"~1.7.2\"\n  }\n}\n"
  },
  {
    "path": "omega-web/grunt/aliases.coffee",
    "content": "module.exports =\n  default: [\n    'copy'\n    'jade'\n    'less'\n    'autoprefixer'\n    'coffeelint'\n    'coffee'\n    'bower'\n  ]\n  test: ['mochaTest']\n"
  },
  {
    "path": "omega-web/grunt/autoprefixer.coffee",
    "content": "module.exports =\n  options:\n    map: false\n  unprefixed:\n    expand: true\n    cwd: 'tmp/css'\n    src: '**/*.css'\n    dest: 'build/css/'\n"
  },
  {
    "path": "omega-web/grunt/bower.coffee",
    "content": "module.exports =\n  install:\n    options:\n      copy: true\n      targetDir: 'build/lib/'\n      layout: 'byComponent'\n"
  },
  {
    "path": "omega-web/grunt/coffee.coffee",
    "content": "module.exports =\n  web:\n    expand: true\n    cwd: 'src/coffee'\n    src: ['**/*.coffee']\n    dest: 'build/js/'\n    ext: '.js'\n  web_omega:\n    files:\n      'build/js/omega.js': 'src/omega/**/*.coffee'\n"
  },
  {
    "path": "omega-web/grunt/coffeelint.coffee",
    "content": "module.exports =\n  options:\n    arrow_spacing: level: 'error'\n    colon_assignment_spacing:\n      level: 'error'\n      spacing:\n        left: 0\n        right: 1\n    missing_fat_arrows: level: 'warn'\n    no_empty_functions: level: 'error'\n    no_empty_param_list: level: 'error'\n    no_interpolation_in_single_quotes: level: 'error'\n    no_stand_alone_at: level: 'error'\n    space_operators: level: 'error'\n    # https://github.com/clutchski/coffeelint/issues/525\n    indentation: level: 'ignore'\n\n  gruntfile: ['Gruntfile.coffee']\n  tasks: ['grunt/**/*.coffee']\n  src: ['src/**/*.coffee']\n"
  },
  {
    "path": "omega-web/grunt/copy.coffee",
    "content": "module.exports =\n  pac:\n    files:\n      'build/js/omega_pac.min.js': 'node_modules/omega-pac/omega_pac.min.js'\n  lib:\n    expand: true\n    cwd: 'lib'\n    src: ['**/*']\n    dest: 'build/lib/'\n  img:\n    expand: true\n    cwd: 'img'\n    src: ['**/*']\n    dest: 'build/img/'\n  popup:\n    expand: true\n    cwd: 'src/popup'\n    src: ['**/*']\n    dest: 'build/popup/'\n"
  },
  {
    "path": "omega-web/grunt/jade.coffee",
    "content": "module.exports =\n  options:\n    pretty: true\n  web:\n    files: [\n      {\n        expand: true\n        dest: 'build/'\n        cwd: 'src/'\n        ext: '.html'\n        src: '*.jade'\n      }\n      {\n        expand: true\n        dest: 'build/partials/'\n        cwd: 'src/partials'\n        ext: '.html'\n        src: ['*.jade']\n      }\n    ]\n"
  },
  {
    "path": "omega-web/grunt/less.coffee",
    "content": "module.exports =\n  web_options:\n    files:\n      'tmp/css/options.css': 'src/less/options.less'\n  web_popup:\n    files:\n      'tmp/css/popup.css': 'src/less/popup.less'\n"
  },
  {
    "path": "omega-web/grunt/mochaTest.coffee",
    "content": "module.exports =\n  test:\n    options:\n      reporter: 'spec'\n      require: 'coffee-script/register'\n    src: ['test/**/*.coffee']\n"
  },
  {
    "path": "omega-web/grunt/ngAnnotate.coffee",
    "content": "module.exports =\n  options:\n    singleQuotes: true\n  app:\n    files:\n      'build/js/omega.ngmin.js': 'build/js/omega.js'\n"
  },
  {
    "path": "omega-web/grunt/watch.coffee",
    "content": "module.exports =\n  grunt:\n    options:\n      reload: true\n    files:\n      'grunt/*'\n    tasks: ['coffeelint:tasks', 'default']\n  copy_pac:\n    files:\n      'node_modules/omega-pac/omega_pac.min.js'\n    tasks: 'copy:pac'\n  copy_lib:\n    files:\n      'lib/**/*'\n    tasks: 'copy:lib'\n  copy_img:\n    files:\n      'img/**/*'\n    tasks: 'copy:img'\n  copy_popup:\n    files:\n      'src/popup/**/*'\n    tasks: 'copy:popup'\n  jade:\n    files: ['src/**/*.jade']\n    tasks: 'jade'\n  less:\n    files:\n      'src/less/**/*.less'\n    tasks: ['less', 'autoprefixer']\n  coffeelint:\n    files: 'src/**/*.coffee'\n    tasks: ['coffeelint']\n  coffee:\n    files: [\n      'src/coffee/**/*.coffee'\n      'src/omega/**/*.coffee'\n    ]\n    tasks: ['coffee']\n"
  },
  {
    "path": "omega-web/img/icons/draw_omega.js",
    "content": "var drawOmega = function (ctx, outerCircleColor, innerCircleColor) {\n  ctx.globalCompositeOperation = \"source-over\";\n  ctx.fillStyle = outerCircleColor;\n  ctx.beginPath();\n  ctx.arc(0.5, 0.5, 0.5, 0, Math.PI * 2, true);\n  ctx.closePath();\n  ctx.fill();\n\n  if (innerCircleColor != null) {\n    ctx.fillStyle = innerCircleColor;\n  } else {\n    ctx.globalCompositeOperation = \"destination-out\";\n  }\n\n  ctx.beginPath();\n  ctx.arc(0.5, 0.5, 0.25, 0, Math.PI * 2, true);\n  ctx.closePath();\n  ctx.fill();\n};\n"
  },
  {
    "path": "omega-web/package.json",
    "content": "{\n  \"name\": \"omega-web\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"chai\": \"~1.9.1\",\n    \"coffeelint\": \"^1.16.0\",\n    \"grunt\": \"^0.4.5\",\n    \"grunt-autoprefixer\": \"^1.0.1\",\n    \"grunt-bower-task\": \"^0.5.0\",\n    \"grunt-coffeelint\": \"^0.0.13\",\n    \"grunt-contrib-coffee\": \"^0.11.1\",\n    \"grunt-contrib-concat\": \"^0.5.0\",\n    \"grunt-contrib-copy\": \"^0.5.0\",\n    \"grunt-contrib-jade\": \"^0.12.0\",\n    \"grunt-contrib-less\": \"^0.11.4\",\n    \"grunt-contrib-watch\": \"^0.6.1\",\n    \"grunt-mocha-test\": \"~0.11.0\",\n    \"grunt-ng-annotate\": \"^0.3.2\",\n    \"load-grunt-config\": \"^0.13.1\",\n    \"omega-pac\": \"../omega-pac\"\n  },\n  \"scripts\": {\n    \"dev\": \"npm link omega-pac && npm link\"\n  }\n}\n"
  },
  {
    "path": "omega-web/src/coffee/log_error.coffee",
    "content": "window.onerror = (message, url, line, col, err) ->\n  log = localStorage['log'] || ''\n  if err?.stack\n    log += err.stack + '\\n\\n'\n  else\n    log += \"#{url}:#{line}:#{col}:\\t#{message}\\n\\n\"\n  localStorage['log'] = log\n  return\n"
  },
  {
    "path": "omega-web/src/coffee/omega_decoration.coffee",
    "content": "orderForType =\n  'FixedProfile': -2000\n  'PacProfile': -1000\n  'VirtualProfile': 1000\n  'SwitchProfile': 2000\n  'RuleListProfile': 3000\n\nangular.module('omegaDecoration', []).value('profileIcons', {\n  'DirectProfile': 'glyphicon-transfer'\n  'SystemProfile': 'glyphicon-off'\n  'AutoDetectProfile': 'glyphicon-file'\n  'FixedProfile': 'glyphicon-globe'\n  'PacProfile': 'glyphicon-file'\n  'VirtualProfile': 'glyphicon-question-sign'\n  'RuleListProfile': 'glyphicon-list'\n  'SwitchProfile': 'glyphicon-retweet'\n}).constant('profileOrder', (a, b) ->\n  diff = (orderForType[a.profileType] | 0) - (orderForType[b.profileType] | 0)\n  return diff if diff != 0\n  if a.name == b.name\n    0\n  else if a.name < b.name\n    -1\n  else\n    1\n).constant('getVirtualTarget', (profile, options) ->\n  if profile?.profileType == 'VirtualProfile'\n    options?['+' + profile.defaultProfileName]\n).directive('omegaProfileIcon', (profileIcons, getVirtualTarget) ->\n  restrict: 'A'\n  template: '''\n    <span ng-style=\"{color: color || getColor(profile)}\"\n      ng-class=\"{'virtual-profile-icon': isVirtual(profile)}\"\n      class=\"glyphicon {{icon || getIcon(profile)}}\">\n    </span>\n    '''\n  scope:\n    'profile': '=?omegaProfileIcon'\n    'icon': '=?icon'\n    'color': '=?color'\n    'options': '=options'\n  link: (scope, element, attrs, ngModel) ->\n    scope.profileIcons = profileIcons\n    scope.isVirtual = (profile) ->\n      profile?.profileType == 'VirtualProfile'\n    scope.getIcon = (profile) ->\n      type = profile?.profileType\n      type = getVirtualTarget(profile, scope.options)?.profileType ? type\n      profileIcons[type]\n    scope.getColor = (profile) ->\n      color = undefined\n      while profile\n        color = profile.color\n        profile = getVirtualTarget(profile, scope.options)\n      color\n).directive('omegaProfileInline', ->\n  restrict: 'A'\n  template: '''\n    <span omega-profile-icon=\"profile\" options=\"options\"></span>\n    {{dispName ? dispName(profile) : profile.name}}\n    '''\n  scope:\n    'profile': '=omegaProfileInline'\n    'dispName': '=?dispName'\n    'options': '=options'\n).directive('omegaHtml', ($compile) ->\n  restrict: 'A'\n  link: (scope, element, attrs, ngModel) ->\n    locals =\n      $profile: (profile = 'profile', dispName = 'dispNameFilter',\n        options = 'options') ->\n        \"\"\"\n        <span class=\"profile-inline\" omega-profile-inline=\"#{profile}\"\n          disp-name=\"#{dispName}\" options=\"#{options}\"></span>\n        \"\"\"\n    getHtml = -> scope.$eval(attrs.omegaHtml, locals)\n    scope.$watch getHtml, (html) ->\n      element.html(html)\n      $compile(element.contents())(scope)\n).directive('omegaProfileSelect', ($timeout, profileIcons) ->\n  restrict: 'A'\n  templateUrl: 'partials/omega_profile_select.html'\n  require: '?ngModel'\n  scope:\n    'profiles': '&omegaProfileSelect'\n    'defaultText': '@?defaultText'\n    'dispName': '=?dispName'\n    'options': '=options'\n  link: (scope, element, attrs, ngModel) ->\n    scope.profileIcons = profileIcons\n    scope.currentProfiles = []\n    scope.dispProfiles = undefined\n    updateView = ->\n      scope.profileIcon = ''\n      for profile in scope.currentProfiles\n        if profile.name == scope.profileName\n          scope.selectedProfile = profile\n          scope.profileIcon = profileIcons[profile.profileType]\n          break\n    scope.$watch(scope.profiles, ((profiles) ->\n      scope.currentProfiles = profiles || []\n      if scope.dispProfiles?\n        scope.dispProfiles = currentProfiles\n      updateView()\n    ), true)\n\n    scope.toggled = (open) ->\n      if open and not scope.dispProfiles?\n        scope.dispProfiles = scope.currentProfiles\n        scope.toggled = undefined\n\n    if ngModel\n      ngModel.$render = ->\n        scope.profileName = ngModel.$viewValue\n        updateView()\n\n    scope.setProfileName = (name) ->\n      if ngModel\n        ngModel.$setViewValue(name)\n        ngModel.$render()\n\n    scope.getName = (profile) ->\n      if profile\n        scope.dispName(profile) || profile.name\n)\n"
  },
  {
    "path": "omega-web/src/coffee/options.coffee",
    "content": "this.UglifyJS_NoUnsafeEval = true\n$script 'lib/angular-loader/angular-loader.min.js',\n  'angular-loader'\n$script 'lib/jquery/jquery.min.js', 'jquery'\n$script 'js/omega_pac.min.js', 'omega-pac'\n$script 'lib/FileSaver/FileSaver.min.js', 'filesaver'\n$script 'lib/blob/Blob.js', 'blob'\n$script 'lib/spin.js/spin.js', ->\n  $script 'lib/ladda/ladda.min.js', ->\n    $script.ready ['angular-loader'], ->\n      $script 'lib/angular-ladda/angular-ladda.min.js', 'angular-ladda'\n\n$script.ready ['angular-loader'], ->\n  angular.module 'omega', ['ngLocale', 'ngAnimate', 'ngSanitize',\n    'ui.bootstrap', 'ui.router', 'ngProgress', 'ui.sortable',\n    'angularSpectrumColorpicker', 'ui.validate', 'angular-ladda', 'omegaTarget',\n    'omegaDecoration']\n  $script.ready ['omega-pac'], ->\n    $script 'js/omega.js', 'omega'\n\n  $script([\n    'js/omega_target_web.js'\n    'js/omega_decoration.js'\n    'lib/angular-animate/angular-animate.min.js'\n    'lib/angular-bootstrap/ui-bootstrap-tpls.min.js'\n    'lib/ngprogress/ngProgress.min.js'\n    'lib/angular-ui-sortable/sortable.min.js'\n    'lib/angular-ui-utils/validate.min.js'\n    'lib/jsondiffpatch/jsondiffpatch.min.js'\n    'lib/angular-spectrum-colorpicker/angular-spectrum-colorpicker.min.js'\n  ], 'omega-deps')\n$script.ready ['jquery'], ->\n  $script 'lib/jquery-ui-1.10.4.custom.min.js', 'jquery-ui-base'\n  $script 'lib/spectrum/spectrum.js', 'spectrum'\n$script.ready ['jquery-ui-base'], ->\n  $script 'lib/jqueryui-touch-punch/jquery.ui.touch-punch.min.js', 'jquery-ui'\n\n$script.ready ['angular-loader', 'jquery'], ->\n  $script 'lib/angular/angular.min.js', 'angular'\n\n$script.ready ['angular'], ->\n  $script 'lib/angular-ui-router/angular-ui-router.min.js', 'angular-ui-router'\n  $script 'lib/angular-sanitize/angular-sanitize.min.js', 'angular-sanitize'\n\n  locales =\n    '': 'en-us'\n\n    'en': 'en-us'\n\n    'zh': 'zh-cn'\n    'zh-hans': 'zh-cn'\n    'zh-hant': 'zh-tw'\n    'zh-cn': 'zh-cn'\n    'zh-hk': 'zh-hk'\n    'zh-tw': 'zh-tw'\n\n  lang = navigator.language\n  lang1 = navigator.language?.split('-')[0] || ''\n  locale = locales[lang] || locales[lang1] || locales['']\n  $script 'lib/angular-i18n/angular-locale_' + locale + '.js', 'angular-i18n'\n\n$script.ready ['angular', 'omega', 'omega-deps', 'angular-ui-router',\n  'jquery-ui', 'spectrum', 'filesaver', 'blob', 'angular-ladda',\n  'angular-sanitize', 'angular-i18n'], ->\n  angular.bootstrap document, ['omega']\n"
  },
  {
    "path": "omega-web/src/coffee/options_guide.coffee",
    "content": "$script 'lib/tether/tether.js', ->\n  $script 'lib/shepherd.js/shepherd.min.js', ->\n    tr = chrome.i18n.getMessage.bind(chrome.i18n)\n    tour = new Shepherd.Tour\n      defaults:\n        classes: 'shepherd-theme-arrows'\n        scrollTo: true\n\n    targetAnchorClick =\n      selector: '.shepherd-target a'\n      event: 'click'\n\n    tour.addStep('fixed-profile-step',\n      text: tr('options_guide_fixedProfileStep')\n      attachTo: '.nav-profile[data-profile-type=\"FixedProfile\"] right'\n      scrollTo: false\n      advanceOn: targetAnchorClick\n      buttons: [\n        text: tr('options_guideNext')\n        action: tour.next\n      ]\n    )\n\n    tour.addStep 'fixed-servers-step',\n      text: tr('options_guide_fixedServersStep')\n      attachTo: '.fixed-servers top'\n      scrollTo: false\n      buttons: [\n        text: tr('options_guideNext')\n        action: tour.next\n      ]\n\n    tour.addStep 'auto-switch-profile-step',\n      text: tr('options_guide_autoSwitchProfileStep')\n      attachTo: '.nav-profile[data-profile-type=\"SwitchProfile\"] right'\n      scrollTo: false\n      advanceOn: targetAnchorClick\n      buttons: [\n        text: tr('options_guideNext')\n        action: tour.next\n      ]\n\n    tour.addStep 'add-more-profiles-step',\n      text: tr('options_guide_addMoreProfilesStep')\n      attachTo: '.nav-new-profile right'\n      scrollTo: false\n      advanceOn: targetAnchorClick\n      buttons: [\n        text: tr('options_guideDone')\n        action: tour.next\n      ]\n\n    tour.start()\n"
  },
  {
    "path": "omega-web/src/coffee/popup.coffee",
    "content": "module = angular.module('omegaPopup', ['omegaTarget', 'omegaDecoration',\n  'ui.bootstrap', 'ui.validate'])\n\nmodule.filter 'tr', (omegaTarget) -> omegaTarget.getMessage\nmodule.filter 'dispName', (omegaTarget) ->\n  (name) ->\n    if typeof name == 'object'\n      name = name.name\n    omegaTarget.getMessage('profile_' + name) || name\n\nmoveUp = (activeIndex, items) ->\n  i = activeIndex - 1\n  if i >= 0\n    items.eq(i)[0]?.focus()\nmoveDown = (activeIndex, items) -> items.eq(activeIndex + 1)[0]?.focus()\nshortcutKeys =\n  38: moveUp # Up\n  40: moveDown # Down\n  74: moveDown # j\n  75: moveUp # k\n  48: '+direct' # 0\n  83: '+system' # s\n  191: 'help' # /\n  63: 'help' # ?\n  69: 'external' # e\n  65: 'addRule' # a\n  43: 'addRule' # +\n  61: 'addRule' # =\n  84: 'tempRule' # t\n  79: 'option' # o\n  82: 'requestInfo' # r\n\nfor i in [1..9]\n  shortcutKeys[48 + i] = i\n\ncustomProfiles = do ->\n  _customProfiles = null\n  return ->\n    _customProfiles ?= jQuery('.custom-profile:not(.ng-hide) > a')\n\njQuery(document).on 'keydown', (e) ->\n  handler = shortcutKeys[e.keyCode]\n  return unless handler\n  return if e.target.tagName == 'INPUT' or e.target.tagName == 'TEXTAREA'\n  switch typeof handler\n    when 'string'\n      switch handler\n        when 'help'\n          showHelp = (element, key) ->\n            if typeof element == 'string'\n              element = jQuery(\"a[data-shortcut='#{element}']\")\n            span = jQuery('.shortcut-help', element)\n            if span.length == 0\n              span = jQuery('<span/>').addClass('shortcut-help')\n            span.text(key)\n            element.find('.glyphicon').after(span)\n          keys =\n            '+direct': '0'\n            '+system': 'S'\n            'external': 'E'\n            'addRule': 'A'\n            'tempRule': 'T'\n            'option': 'O'\n            'requestInfo': 'R'\n          for shortcut, key of keys\n            showHelp(shortcut, key)\n          customProfiles().each (i, el) ->\n            if i <= 8\n              showHelp(jQuery(el), i + 1)\n        else\n          jQuery(\"a[data-shortcut='#{handler}']\")[0]?.click()\n    when 'number'\n      customProfiles().eq(handler - 1)?.click()\n    when 'function'\n      items = jQuery('.popup-menu-nav > li:not(.ng-hide) > a')\n      i = items.index(jQuery(e.target).closest('a'))\n      if i == -1\n        i = items.index(jQuery('.popup-menu-nav > li.active > a'))\n      handler(i, items)\n\n  return false\n\nmodule.controller 'PopupCtrl', ($scope, $window, $q, omegaTarget,\n  profileIcons, profileOrder, dispNameFilter, getVirtualTarget) ->\n\n  $scope.closePopup = ->\n    $window.close()\n\n  $scope.openManage = ->\n    omegaTarget.openManage()\n    $window.close()\n\n  refreshOnProfileChange = false\n  refresh = ->\n    if refreshOnProfileChange\n      omegaTarget.refreshActivePage().then ->\n        $window.close()\n    else\n      $window.close()\n  $scope.profileIcons = profileIcons\n  $scope.dispNameFilter = dispNameFilter\n  $scope.isActive = (profileName) ->\n    if $scope.isSystemProfile\n      profileName == 'system'\n    else\n      $scope.currentProfileName == profileName\n  $scope.isEffective = (profileName) ->\n    $scope.isSystemProfile and $scope.currentProfileName == profileName\n  $scope.getIcon = (profile, normal) ->\n    return unless profile\n    if not normal and $scope.isEffective(profile.name)\n      'glyphicon-ok'\n    else\n      undefined\n  $scope.getProfileTitle = (profile, normal) ->\n    desc = ''\n    while profile\n      desc = profile.desc\n      profile = getVirtualTarget(profile, $scope.availableProfiles)\n    desc || profile?.name || ''\n  $scope.openOptions = (hash) ->\n    omegaTarget.openOptions(hash).then ->\n      $window.close()\n  $scope.openConditionHelp = ->\n    pname = encodeURIComponent($scope.currentProfileName)\n    $scope.openOptions(\"#/profile/#{pname}?help=condition\")\n\n  $scope.applyProfile = (profile) ->\n    next = ->\n      if profile.profileType == 'SwitchProfile'\n        return omegaTarget.state('web.switchGuide').then (switchGuide) ->\n          if switchGuide == 'showOnFirstUse'\n            return $scope.openOptions(\"#/profile/#{profile.name}\")\n    if not refreshOnProfileChange\n      omegaTarget.applyProfileNoReply(profile.name)\n      apply = next()\n    else\n      apply = omegaTarget.applyProfile(profile.name).then(->\n        return omegaTarget.refreshActivePage()\n      ).then(next)\n\n    if apply\n      apply.then -> $window.close()\n    else\n      $window.close()\n\n  $scope.tempRuleMenu = {open: false}\n  $scope.nameExternal = {open: false}\n  $scope.addTempRule = (domain, profileName) ->\n    $scope.tempRuleMenu.open = false\n    omegaTarget.addTempRule(domain, profileName).then ->\n      omegaTarget.state('lastProfileNameForCondition', profileName)\n      refresh()\n\n  $scope.setDefaultProfile = (profileName, defaultProfileName) ->\n    omegaTarget.setDefaultProfile(profileName, defaultProfileName).then ->\n      refresh()\n  \n  $scope.addCondition = (condition, profileName) ->\n    omegaTarget.addCondition(condition, profileName).then ->\n      omegaTarget.state('lastProfileNameForCondition', profileName)\n      refresh()\n\n  $scope.addConditionForDomains = (domains, profileName) ->\n    conditions = []\n    for own domain, enabled of domains when enabled\n      conditions.push({\n        conditionType: 'HostWildcardCondition'\n        pattern: domain\n      })\n    omegaTarget.addCondition(conditions, profileName).then ->\n      omegaTarget.state('lastProfileNameForCondition', profileName)\n      refresh()\n  \n  $scope.validateProfileName =\n    conflict: '!$value || !availableProfiles[\"+\" + $value]'\n    hidden: '!$value || $value[0] != \"_\"'\n\n  $scope.saveExternal = ->\n    $scope.nameExternal.open = false\n    name = $scope.externalProfile.name\n    if name\n      omegaTarget.addProfile($scope.externalProfile).then ->\n        omegaTarget.applyProfile(name).then ->\n          refresh()\n\n  $scope.returnToMenu = ->\n    if location.hash.indexOf('!') >= 0\n      location.href = 'popup/index.html'\n      return\n    $scope.showConditionForm = false\n    $scope.showRequestInfo = false\n\n  preselectedProfileNameForCondition = 'direct'\n\n  if $window.location.hash == '#!requestInfo'\n    $scope.showRequestInfo = true\n  else if $window.location.hash == '#!external'\n    $scope.nameExternal = {open: true}\n\n  omegaTarget.state([\n    'availableProfiles', 'currentProfileName', 'isSystemProfile',\n    'validResultProfiles', 'refreshOnProfileChange', 'externalProfile',\n    'proxyNotControllable', 'lastProfileNameForCondition'\n  ]).then ([availableProfiles, currentProfileName, isSystemProfile,\n    validResultProfiles, refresh, externalProfile,\n    proxyNotControllable, lastProfileNameForCondition]) ->\n    $scope.proxyNotControllable = proxyNotControllable\n    return if proxyNotControllable\n    $scope.availableProfiles = availableProfiles\n    $scope.currentProfile = availableProfiles['+' + currentProfileName]\n    $scope.currentProfileName = currentProfileName\n    $scope.isSystemProfile = isSystemProfile\n    $scope.externalProfile = externalProfile\n    refreshOnProfileChange = refresh\n\n    charCodeUnderscore = '_'.charCodeAt(0)\n    profilesByNames = (names) ->\n      profiles = []\n      for name in names\n        shown = (name.charCodeAt(0) != charCodeUnderscore or\n                 name.charCodeAt(1) != charCodeUnderscore)\n        if shown\n          profiles.push(availableProfiles['+' + name])\n      profiles\n\n    $scope.validResultProfiles = profilesByNames(validResultProfiles)\n\n    if lastProfileNameForCondition\n      for profile in $scope.validResultProfiles\n        if profile.name == lastProfileNameForCondition\n          preselectedProfileNameForCondition = lastProfileNameForCondition\n\n    $scope.builtinProfiles = []\n    $scope.customProfiles = []\n    for own key, profile of availableProfiles\n      if profile.builtin\n        $scope.builtinProfiles.push(profile)\n      else if profile.name.charCodeAt(0) != charCodeUnderscore\n        $scope.customProfiles.push(profile)\n      if profile.validResultProfiles\n        profile.validResultProfiles =\n          profilesByNames(profile.validResultProfiles)\n\n    $scope.customProfiles.sort(profileOrder)\n\n  $scope.domainsForCondition = {}\n  $scope.requestInfoProvided = null\n  omegaTarget.setRequestInfoCallback (info) ->\n    info.domains = []\n    for own domain, domainInfo of info.summary\n      domainInfo.domain = domain\n      info.domains.push(domainInfo)\n    info.domains.sort (a, b) -> b.errorCount - a.errorCount\n    $scope.$apply ->\n      $scope.requestInfo = info\n      $scope.requestInfoProvided ?= (info?.domains.length > 0)\n      for domain in info.domains\n        $scope.domainsForCondition[domain.domain] ?= true\n      $scope.profileForDomains ?= preselectedProfileNameForCondition\n\n  $q.all([\n    omegaTarget.state('currentProfileCanAddRule')\n    omegaTarget.getActivePageInfo(),\n  ]).then ([canAddRule, info]) ->\n    $scope.currentProfileCanAddRule = canAddRule\n    if info\n      $scope.currentTempRuleProfile = info.tempRuleProfileName\n      if $scope.currentTempRuleProfile\n        preselectedProfileNameForCondition = $scope.currentTempRuleProfile\n      $scope.currentDomain = info.domain\n      if $window.location.hash == '#!addRule'\n        $scope.prepareConditionForm()\n\n  $scope.prepareConditionForm = ->\n    currentDomain = $scope.currentDomain\n    currentDomainEscaped = currentDomain.replace(/\\./g, '\\\\.')\n    domainLooksLikeIp = false\n    if currentDomain.indexOf(':') >= 0\n      domainLooksLikeIp = true\n      if currentDomain[0] != '['\n        currentDomain = '[' + currentDomain + ']'\n        currentDomainEscaped = currentDomain.replace(/\\./g, '\\\\.')\n          .replace(/\\[/g, '\\\\[').replace(/\\]/g, '\\\\]')\n    else if currentDomain[currentDomain.length - 1] >= 0\n      domainLooksLikeIp = true\n\n    if domainLooksLikeIp\n      conditionSuggestion =\n        'HostWildcardCondition': currentDomain\n        'HostRegexCondition': '^' + currentDomainEscaped + '$'\n        'UrlWildcardCondition': '*://' + currentDomain + '/*'\n        'UrlRegexCondition': '://' + currentDomainEscaped + '(:\\\\d+)?/'\n        'KeywordCondition': currentDomain\n    else\n      conditionSuggestion =\n        'HostWildcardCondition': '*.' + currentDomain\n        'HostRegexCondition': '(^|\\\\.)' + currentDomainEscaped + '$'\n        'UrlWildcardCondition': '*://*.' + currentDomain + '/*'\n        'UrlRegexCondition':\n          '://([^/.]+\\\\.)*' + currentDomainEscaped + '(:\\\\d+)?/'\n        'KeywordCondition': currentDomain\n\n    $scope.rule =\n      condition:\n        conditionType: 'HostWildcardCondition'\n        pattern: conditionSuggestion['HostWildcardCondition']\n      profileName: preselectedProfileNameForCondition\n    $scope.$watch 'rule.condition.conditionType', (type) ->\n      $scope.rule.condition.pattern = conditionSuggestion[type]\n\n    $scope.showConditionForm = true\n"
  },
  {
    "path": "omega-web/src/coffee/switch_profile_guide.coffee",
    "content": "$script 'lib/tether/tether.js', ->\n  $script 'lib/shepherd.js/shepherd.min.js', ->\n    return if jQuery('.switch-rule-row').length == 0\n    jQuery('html, body').scrollTop(0)\n    tr = chrome.i18n.getMessage.bind(chrome.i18n)\n    tour = new Shepherd.Tour\n      defaults:\n        classes: 'shepherd-theme-arrows'\n\n    tour.addStep 'condition-step',\n      text: tr('options_guide_conditionStep')\n      attachTo: '.switch-rule-row bottom'\n      buttons: [\n        {\n          text: tr('options_guideSkip')\n          action: tour.cancel\n          classes: 'shepherd-button-secondary'\n        }\n        {\n          text: tr('options_guideNext')\n          action: tour.next\n        }\n      ]\n\n    conditionTypeStep = tour.addStep('condition-type-step',\n      text: tr('options_guide_conditionTypeStep')\n      attachTo: '.condition-type-th bottom'\n      advanceOn:\n        selector: '.close-condition-help'\n        event: 'click'\n      buttons: [\n        text: tr('options_guideNext')\n        action: tour.next\n      ]\n    )\n\n    conditionTypeStep.on 'show', ->\n      jQuery('.toggle-condition-help').one 'click', ->\n        return unless conditionTypeStep.isOpen()\n        jQuery('.shepherd-step.shepherd-enabled').hide()\n        jQuery('.toggle-condition-help, .close-condition-help').one 'click', ->\n          tour.next()\n\n    tour.addStep 'condition-profile-step',\n      text: tr('options_guide_conditionProfileStep')\n      attachTo: '.switch-rule-row-target bottom'\n      buttons: [\n        text: tr('options_guideNext')\n        action: tour.next\n      ]\n\n    defaultStep = tour.addStep 'switch-default-step',\n      text: tr('options_guide_switchDefaultStep')\n      attachTo: '.switch-default-row top'\n      buttons: [\n        text: tr('options_guideNext')\n        action: tour.next\n      ]\n\n    defaultStep.on 'show', ->\n      row = jQuery('.switch-default-row')\n      scrollTop = row.offset().top + row.height() - $(window).height()\n      scrollTop = 0 if scrollTop < 0\n      jQuery('html, body').animate({scrollTop: scrollTop})\n\n    tour.addStep 'apply-switch-profile-step',\n      text: tr('options_guide_applySwitchProfileStep')\n      attachTo: 'body top'\n      scrollTo: false\n      classes: 'shepherd-theme-arrows fixed-top-right'\n      buttons: [\n        text: tr('options_guideDone')\n        action: tour.next\n      ]\n\n    Shepherd.activeTour?.cancel()\n    tour.start()\n"
  },
  {
    "path": "omega-web/src/less/common.less",
    "content": "/* angular */\n\n.ng-hide {\n  display: none !important;\n}\n\n/* helpers */\n\n.clear-padding {\n  padding: 0 !important;\n}\n\n/* basic */\n\na[role=\"button\"] {\n  cursor: pointer;\n}\n\n.form-control.ng-invalid {\n  border-color: #a94442;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n\n  &:hover {\n    border-color: #843534;\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #CE8483;\n  }\n}\n\n.disabled .btn {\n  background-color: #ddd !important;\n  border-color: #ccc !important;\n  cursor: not-allowed !important;\n  pointer-events: none !important;\n  opacity: .65 !important;\n  box-shadow: none !important;\n}\n\n/* profile */\n\n.virtual-profile-icon {\n  border: dotted 1px;\n  margin: -1px;\n}\n\n.profile-inline {\n  background-color: #eee;\n  color: #333;\n  padding: 0 5px;\n}\n\n/* omega-profile-select */\n\n.omega-profile-select {\n  width: 100%;\n  .dropdown-menu>li>a {\n    max-width: none !important;\n  }\n\n  .btn {\n    width: 100%;\n    display: block;\n    text-align: left;\n    text-align: initial;\n    position: relative;\n    padding-right: 25px;\n\n    .caret {\n      position: absolute;\n      top: 50%;\n      right: 12px;\n      margin-top: -2px;\n      vertical-align: middle;\n    }\n  }\n\n  .dropdown-menu {\n    width: 100%;\n    cursor: pointer;\n  }\n}\n\n.monospace {\n  font-family: Menlo,Monaco,Consolas,\"Courier New\",monospace !important;\n}\n"
  },
  {
    "path": "omega-web/src/less/options.less",
    "content": "@import 'common.less';\n\n.width-initial {\n  width: auto !important;\n  width: initial !important;\n}\n\n.width-limit {\n  max-width: 600px;\n}\n\ntextarea.width-limit {\n  max-width: 80%;\n}\n\n.width-limit-lg {\n  max-width: 800px;\n}\n\n.width-limit-xl {\n  max-width: 1000px;\n}\n\n.inline-form-control {\n  display: inline-block;\n  margin-right: 20px;\n  margin-left: 20px;\n  min-width: 50%;\n  width: 50% !important;\n  width: initial !important;\n}\n\n.no-min-width {\n  min-width: 0 !important;\n}\n\n.align-initial {\n  text-align: left;\n  text-align: initial;\n}\n\n.opacity-half {\n  opacity: .5 !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\nul.list-style-none, li.list-style-none {\n  list-style: none;\n  padding-left: 0;\n}\n\n.help-inline {\n  margin-left: 10px;\n  color: #595959;\n}\n\n.settings-group {\n  > * {\n    margin-left: 30px;\n  }\n  > h3 {\n    margin-left: 0;\n  }\n}\n\n/* shepherd.js */\n\n.shepherd-element {\n  z-index: 20;\n}\n\n.shepherd-active {\n  &:before {\n    content: \" \";\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    background-color: rgba(0, 0, 0, .5);\n    z-index: 10;\n  }\n\n  .switch-rules {\n    position: relative;\n    background-color: #7f7f7f;\n    z-index: 11;\n\n    &, th, td, tbody {\n      border-color: #6e6e6e !important;\n    }\n\n    .btn {\n      opacity: .5;\n    }\n\n    .form-control, .btn-default {\n      background-color: #7f7f7f;\n      border-color: #6e6e6e;\n      opacity: 1;\n    }\n\n    .shepherd-enabled {\n      background-color: #fff;\n      border-color: #ddd !important;\n      &, td, tbody {\n        border-color: #ddd !important;\n      }\n\n      .btn {\n        opacity: 1;\n      }\n\n      .form-control, .btn-default {\n        background-color: #fff;\n        border-color: #ddd;\n      }\n    }\n\n  }\n\n  .condition-help-section {\n    position: relative;\n    z-index: 11;\n    background-color: #fff;\n  }\n\n  &:not([data-shepherd-step=\"fixed-servers-step\"]) {\n    .side-nav {\n      position: absolute;\n      overflow: visible;\n      bottom: 0;\n    }\n\n    .shepherd-enabled > a {\n      color: #428bca;\n      background-color: #fff;\n    }\n  }\n\n  &[data-shepherd-step=\"switch-default-step\"] {\n    .sort-bar {\n      position: relative;\n      z-index: 11;\n      background-color: #ffc;\n    }\n  }\n}\n\n.shepherd-enabled {\n  position: relative;\n  z-index: 11;\n\n  &.fixed-servers {\n    background-color: #fff;\n  }\n}\n\n.fixed-top-right {\n  position: fixed !important;\n  top: 0 !important;\n  right: 0 !important;\n  left: auto !important;\n  bottom: auto !important;\n  transform: none !important;\n}\n\n/* alert */\n\n.alert-top-wrapper {\n  z-index: 100;\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  width: 100%;\n  display: inline-block !important;\n\n  transition: transform .5s, opacity .5s;\n  transition: transform cubic-bezier(0.19, 1, 0.22, 1) .5s,\n              opacity cubic-bezier(0.19, 1, 0.22, 1) .5s;\n\n  &.ng-hide {\n    transform: translateY(-100%);\n    opacity: 0;\n  }\n\n  pointer-events: none;\n  text-align: center;\n\n  * {\n    pointer-events: auto;\n    pointer-events: initial;\n    .align-initial();\n  }\n\n  .alert {\n    display: inline-block;\n    min-width: 400px;\n    margin-bottom: 0;\n\n    @media (max-width: 767px) {\n      min-width: 80%;\n    }\n  }\n}\n\n/* body */\n\nhtml {\n  height: 100%;\n}\n\nbody {\n  min-height: 100%;\n}\n\n.modal-backdrop {\n  position: fixed;\n  bottom: 0;\n}\n\nh1 {\n  color: #5c6166;\n  font-size: 1.7em;\n  font-weight: bold;\n  margin-bottom: 1.5em;\n}\n\n.side-nav {\n  position: fixed;\n  height: 100%;\n  overflow: auto;\n\n  @media (max-width: 767px) {\n    position: static;\n    height: auto;\n    height: initial;\n  }\n\n  .nav-pills {\n    > li > a {\n      padding: 8px 15px;\n      @media (max-height: 767px) {\n        padding: 5px 15px;\n      }\n\n      &.btn-success:hover {\n        // Fix hover style of [Apply changes] when highlighted.\n        color: #fff;\n        background-color: #449d44;\n        border-color: #398439;\n      }\n    }\n  }\n}\n\nmain {\n  padding-top: 85px;\n  padding-bottom: 20px;\n\n  .page-header {\n    margin: 0;\n    padding: 20px 60px 20px 0;\n    position: fixed;\n    top: 0;\n    width: inherit;\n    background-color: rgba(255, 255, 255, 0.6);\n    background-image: linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0.6));\n    max-height: 85px;\n    z-index: 3;\n\n    h2 {\n      margin: 0;\n    }\n  }\n\n  @media (max-width: 767px) {\n    padding-top: 0;\n    .page-header {\n      position: static;\n      max-height: none;\n    }\n  }\n\n  .ng-enter {\n    opacity: 0;\n    transition: opacity .5s;\n  }\n\n  .ng-enter-active {\n    opacity: 1;\n  }\n}\n\n#ngProgress-container {\n  position: fixed;\n  top: 0;\n  width: 100%;\n}\n\n.divider {\n  height: 1px;\n  margin: 9px 1px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav-header {\n  margin-right: -15px !important;\n  margin-left: -15px !important;\n  text-shadow: 0 1px 0 rgba(255,255,255,0.5);\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #999;\n  text-shadow: 0 1px 0 rgba(255,255,255,0.5);\n  text-transform: uppercase;\n}\n\n#restore-local-file {\n  position: absolute;\n  visibility: hidden;\n}\n\n.virtual-profile-icon {\n  border: dotted 1px;\n  margin: -1px;\n}\n\n.profile-actions {\n  float: right;\n}\n\n.profile-name {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.profile-color-editor {\n  display: inline-block;\n  float: left;\n  margin-right: 10px;\n\n  input[type=\"color\"] {\n    height: 30px;\n    width: 30px;\n    padding: 0;\n    border: none;\n    background: none;\n\n    &::-webkit-color-swatch-wrapper {\n      padding: 0;\n    }\n  }\n\n  .sp-replacer {\n    padding: 0;\n    border: none;\n  }\n\n  .sp-preview, .profile-color-editor-fake {\n    margin-right: 0;\n    height: 30px;\n    width: 30px;\n    border: solid 1px #222;\n  }\n\n  .sp-dd {\n    display: none;\n  }\n}\n\n@media (min-width: 768px) {\n  // Try to workaround the issue where dropdown menus in the table are clipped.\n  // .table-responsive sets overflow-x, which causes the issue. Just setting\n  // overflow-y: visible will NOT work. Scrolling must be disabled for X & Y.\n  // See: http://stackoverflow.com/a/6433475\n  .table-responsive {\n    overflow: visible;\n  }\n}\n\n@media (max-width: 767px) {\n  // Try to make sure that the dropdown fits in the table-responsive scroll box.\n  // It effectively inlines the whole dropdown menu. Ugly, but at least working.\n  .table-responsive .dropdown-menu {\n    position: static !important;\n  }\n}\n\n.fixed-servers,\n.switch-rules {\n  td {\n    vertical-align: middle !important;\n  }\n}\n\n.condition-help {\n  dl {\n    margin-left: 5px;\n    padding-left: 10px;\n    border-left: solid 1px #ccc;\n  }\n  dt {\n    font-size: 1.2em;\n  }\n  dd {\n    padding-left: 20px;\n  }\n}\n\n.close-condition-help {\n  float: none !important;\n  margin-left: 15px !important;\n  opacity: 1 !important;\n\n  &:hover, &:active {\n    color: #444 !important;\n  }\n}\n\n.switch-attached {\n  > tr > td {\n    background-color: #f9f9f9;\n\n    .shepherd-active & {\n      background-color: transparent;\n    }\n\n    &:first-child {\n      text-align: center;\n    }\n  }\n}\n\n.fixed-show-advanced {\n  td {\n    background-color: transparent !important;\n  }\n  .btn-link {\n    padding: 0;\n  }\n}\n\n.proxy-actions {\n  text-align: center;\n  padding: 0 !important;\n}\n\n.proxy-auth-toggle {\n  padding: 5px 7px !important;\n}\n\n.host-levels-details {\n  input {\n    .width-initial();\n    display: inline-block;\n  }\n}\n\n.sort-bar {\n  width: 1em;\n  text-align: center;\n  cursor: move;\n}\n\n.switch-rule-row td.has-icon {\n  > .form-control {\n    display: inline-block;\n    width: ~\"calc(100% - 1.5em)\";\n  }\n\n  > .icon-wrapper {\n    display: block;\n    float: right;\n    line-height: 34px;\n  }\n}\n\n.cycle-profile-container {\n  list-style-type: none;\n  min-height: 20px;\n  display: inline-block;\n  min-width: 40%;\n  padding: 0;\n  border: solid 1px #abc;\n\n  li {\n    display: block;\n    margin: 10px;\n    padding: 5px;\n    cursor: move;\n    background-color: #ddd;\n\n  }\n\n  &.cycle-enabled li {\n    background-color: #e4ffcd;\n  }\n}\n\n.modal-body .well:last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "omega-web/src/less/popup.less",
    "content": "@import 'common.less';\n\n/* popup */\n\nbody {\n  margin: 0;\n  padding: 0;\n  min-width: 180px;\n}\n\nbody.with-condition-form {\n}\n\n.condition-form {\n  min-width: 360px;\n}\n\n.nav {\n  margin-bottom: 0;\n}\n\nli > a {\n  text-overflow: ellipsis;\n  overflow: hidden;\n  max-width: 20em;\n}\n\n.shortcut-help {\n  .monospace();\n  border: solid 1px #000;\n  border-radius: 2px;\n  display: inline-block;\n  color: #000;\n  box-shadow: 1px 1px;\n  width: 1em;\n  height: 1em;\n  line-height: 1em;\n  text-align: center;\n  margin-top: -3px;\n}\n\n.nav-pills.nav-stacked {\n  > li > a {\n    padding: 5px 25px 5px 8px;\n    white-space: nowrap;\n    cursor: pointer;\n\n    .glyphicon {\n      margin-right: 6px;\n    }\n\n    &.profile-with-default-edit {\n      padding-right: 32px;\n      position: relative;\n      .dropdown-toggle {\n        margin: -5px 0;\n        color: inherit;\n        padding: 5px 8px 3px;\n        min-width: 20px;\n        position: absolute;\n        right: 0;\n\n        .glyphicon {\n          margin-right: 0;\n        }\n      }\n    }\n  }\n\n  > li.active .dropdown-toggle {\n    border-color: transparent !important;\n    border-left: solid 1px !important;\n    background: none !important;\n    border-radius: 0 !important;\n  }\n}\n\n.divider {\n  height: 1px;\n  overflow: hidden;\n  background-color: #E5E5E5;\n}\n\n.temp-rule a {\n  padding-left: 8px !important;\n  box-shadow: none !important;\n}\n\nli .dropdown-menu {\n  position: static;\n  top: initial;\n  top: -moz-initial;\n  margin: 0 5px !important;\n  float: none;\n\n  a {\n    cursor: pointer;\n  }\n}\n\n.current-domain {\n  color: #08C;\n}\n\nselect, textarea, input {\n  margin-bottom: 0px !important;\n}\n\nform {\n  margin: 10px;\n}\n\nlegend,\n.well {\n  margin-bottom: 10px;\n}\n\n.well {\n  padding: 10px;\n}\n\n.condition-controls, .proxy-not-controllable-controls {\n  .btn-primary {\n    float: right;\n  }\n}\n\n.external-profile {\n  a {\n    padding-right: 10px !important;\n  }\n\n  form {\n    margin: 0;\n    padding: 0;\n    display: inline-block;\n  }\n\n  .form-control {\n    display: inline-block;\n    padding: 0;\n    height: 2em;\n    width: ~\"calc(100% - 1em - 8px)\";\n  }\n}\n\n.proxy-not-controllable {\n  min-width: 400px;\n  padding: 10px 10px;\n\n  .proxy-not-controllable-controls {\n    margin-bottom: 0;\n  }\n}\n\n.request-info-details {\n  min-width: 360px;\n}\n"
  },
  {
    "path": "omega-web/src/omega/app.coffee",
    "content": "angular.module('omega').constant('builtinProfiles',\n  OmegaPac.Profiles.builtinProfiles)\n\nprofileColors = [\n  '#9ce', '#9d9', '#fa8', '#fe9', '#d497ee', '#47b', '#5b5', '#d63', '#ca0'\n]\ncolors = [].concat(profileColors)\nprofileColorPalette = (colors.splice(0, 3) while colors.length)\n\nangular.module('omega').constant('profileColors', profileColors)\nangular.module('omega').constant('profileColorPalette', profileColorPalette)\n\nattachedPrefix = '__ruleListOf_'\nangular.module('omega').constant 'getAttachedName', (name) ->\n  attachedPrefix + name\nangular.module('omega').constant 'getParentName', (name) ->\n  if name.indexOf(attachedPrefix) == 0\n    name.substr(attachedPrefix.length)\n  else\n    undefined\n\ncharCodeUnderscore = '_'.charCodeAt(0)\nangular.module('omega').constant 'charCodeUnderscore', charCodeUnderscore\nangular.module('omega').constant 'isProfileNameHidden', (name) ->\n  # Hide profiles beginning with underscore.\n  name.charCodeAt(0) == charCodeUnderscore\nangular.module('omega').constant 'isProfileNameReserved', (name) ->\n  # Reserve profile names beginning with double-underscore.\n  (name.charCodeAt(0) == charCodeUnderscore and\n  name.charCodeAt(1) == charCodeUnderscore)\n\nangular.module('omega').config ($stateProvider, $urlRouterProvider,\n  $httpProvider, $animateProvider, $compileProvider) ->\n  $compileProvider.aHrefSanitizationWhitelist(\n    /^\\s*(https?|ftp|mailto|chrome-extension|moz-extension):/)\n  $compileProvider.imgSrcSanitizationWhitelist(\n    /^\\s*(https?|local|data|chrome-extension|moz-extension):/)\n  $animateProvider.classNameFilter(/angular-animate/)\n\n  $urlRouterProvider.otherwise '/about'\n  \n  $urlRouterProvider.otherwise ($injector, $location) ->\n    if $location.path() == ''\n      $injector.get('omegaTarget').lastUrl() || '/about'\n    else\n      '/about'\n  \n  $stateProvider\n    .state('ui',\n      url: '/ui'\n      templateUrl: 'partials/ui.html'\n      #controller: 'UiCtrl'\n    ).state('general',\n      url: '/general'\n      templateUrl: 'partials/general.html'\n      #controller: 'GeneralCtrl'\n    ).state('io',\n      url: '/io'\n      templateUrl: 'partials/io.html'\n      controller: 'IoCtrl'\n    ).state('profile',\n      url: '/profile/*name'\n      templateUrl: 'partials/profile.html'\n      controller: 'ProfileCtrl'\n    ).state('about',\n      url: '/about'\n      templateUrl: 'partials/about.html'\n      controller: 'AboutCtrl'\n    )\n\nangular.module('omega').factory '$exceptionHandler', ($log) ->\n  return (exception, cause) ->\n    return if exception.message == 'transition aborted'\n    return if exception.message == 'transition superseded'\n    return if exception.message == 'transition prevented'\n    return if exception.message == 'transition failed'\n    $log.error(exception, cause)\n\nangular.module('omega').factory 'omegaDebug', ($window, $rootScope,\n  $injector) ->\n  omegaDebug = $window.OmegaDebug ? {}\n\n  omegaDebug.downloadLog ?= ->\n    downloadFile = $injector.get('downloadFile') ? saveAs\n    blob = new Blob [localStorage['log']], {type: \"text/plain;charset=utf-8\"}\n    downloadFile(blob, \"OmegaLog_#{Date.now()}.txt\")\n\n  omegaDebug.reportIssue ?= ->\n    $window.open(\n      'https://github.com/FelisCatus/SwitchyOmega/issues/new?title=&body=')\n    return\n\n  omegaDebug.resetOptions ?= ->\n    $rootScope.resetOptions()\n\n  omegaDebug\n\nangular.module('omega').factory 'downloadFile', ->\n  if browser?.downloads?.download?\n    return (blob, filename) ->\n      url = URL.createObjectURL(blob)\n      if filename\n        browser.downloads.download({url: url, filename: filename})\n      else\n        browser.downloads.download({url: url})\n  else\n    return (blob, filename) ->\n      noAutoBom = true\n      saveAs(blob, filename, noAutoBom)\n"
  },
  {
    "path": "omega-web/src/omega/controllers/about.coffee",
    "content": "angular.module('omega').controller 'AboutCtrl', ($scope, $rootScope,\n  $modal, omegaDebug) ->\n\n  $scope.downloadLog = omegaDebug.downloadLog\n  $scope.reportIssue = omegaDebug.reportIssue\n\n  $scope.showResetOptionsModal = ->\n    $modal.open(templateUrl: 'partials/reset_options_confirm.html').result\n      .then -> omegaDebug.resetOptions()\n\n  try\n    $scope.version = omegaDebug.getProjectVersion()\n  catch _\n    $scope.version = '?.?.?'\n"
  },
  {
    "path": "omega-web/src/omega/controllers/fixed_profile.coffee",
    "content": "angular.module('omega').controller 'FixedProfileCtrl', ($scope, $modal,\n  trFilter) ->\n  $scope.urlSchemes = ['', 'http', 'https', 'ftp']\n  $scope.urlSchemeDefault = 'fallbackProxy'\n  proxyProperties =\n    '': 'fallbackProxy'\n    'http': 'proxyForHttp'\n    'https': 'proxyForHttps'\n    'ftp': 'proxyForFtp'\n  $scope.schemeDisp =\n    '': null\n    'http': 'http://'\n    'https': 'https://'\n    'ftp': 'ftp://'\n\n  defaultPort =\n    'http': 80\n    'https': 443\n    'socks4': 1080\n    'socks5': 1080\n\n  $scope.showAdvanced = false\n\n  $scope.optionsForScheme = {}\n  for scheme in $scope.urlSchemes\n    defaultLabel =\n      if scheme\n        trFilter('options_protocol_useDefault')\n      else\n        trFilter('options_protocol_direct')\n    $scope.optionsForScheme[scheme] = [\n      {label: defaultLabel, value: undefined},\n      {label: 'HTTP', value: 'http'},\n      {label: 'HTTPS', value: 'https'},\n      {label: 'SOCKS4', value: 'socks4'},\n      {label: 'SOCKS5', value: 'socks5'},\n    ]\n\n  $scope.proxyEditors = {}\n\n  socks5AuthSupported = (browser?.proxy?.register?)\n  $scope.authSupported = {\n    \"http\": true,\n    \"https\": true,\n    \"socks5\": socks5AuthSupported,\n  }\n  $scope.isProxyAuthActive = (scheme) ->\n    return $scope.profile.auth?[proxyProperties[scheme]]?\n  $scope.editProxyAuth = (scheme) ->\n    prop = proxyProperties[scheme]\n    proxy = $scope.profile[prop]\n    scope = $scope.$new('isolate')\n    scope.proxy = proxy\n    auth = $scope.profile.auth?[prop]\n    scope.auth = auth && angular.copy(auth)\n    scope.authSupported = $scope.authSupported[proxy.scheme]\n    scope.protocolDisp = proxy.scheme\n    $modal.open(\n      templateUrl: 'partials/fixed_auth_edit.html'\n      scope: scope\n      size: if scope.authSupported then 'sm' else 'lg'\n    ).result.then (auth) ->\n      if not auth?.username\n        if $scope.profile.auth\n          $scope.profile.auth[prop] = undefined\n      else\n        $scope.profile.auth ?= {}\n        $scope.profile.auth[prop] = auth\n\n  onProxyChange = (proxyEditors, oldProxyEditors) ->\n    return unless proxyEditors\n    for scheme in $scope.urlSchemes\n      proxy = proxyEditors[scheme]\n      if $scope.profile.auth and not $scope.authSupported[proxy.scheme]\n        delete $scope.profile.auth[proxyProperties[scheme]]\n      if not proxy.scheme\n        if not scheme\n          proxyEditors[scheme] = {}\n        delete $scope.profile[proxyProperties[scheme]]\n        continue\n      else if not oldProxyEditors[scheme].scheme\n        if proxy.scheme == proxyEditors[''].scheme\n          proxy.port ?= proxyEditors[''].port\n        proxy.port ?= defaultPort[proxy.scheme]\n        proxy.host ?= proxyEditors[''].host ? 'example.com'\n      $scope.profile[proxyProperties[scheme]] ?= proxy\n  for scheme in $scope.urlSchemes\n    do (scheme) ->\n      $scope.$watch (-> $scope.profile[proxyProperties[scheme]]), (proxy) ->\n        if scheme and proxy\n          $scope.showAdvanced = true\n        $scope.proxyEditors[scheme] = proxy ? {}\n  $scope.$watch 'proxyEditors', onProxyChange, true\n\n  onBypassListChange = (list) ->\n    $scope.bypassList = (item.pattern for item in list).join('\\n')\n\n  $scope.$watch 'profile.bypassList', onBypassListChange, true\n\n  $scope.$watch 'bypassList', (bypassList, oldList) ->\n    return if not bypassList? or bypassList == oldList\n    $scope.profile.bypassList =\n      for entry in bypassList.split(/\\r?\\n/) when entry\n        conditionType: \"BypassCondition\"\n        pattern: entry\n"
  },
  {
    "path": "omega-web/src/omega/controllers/io.coffee",
    "content": "angular.module('omega').controller 'IoCtrl', ($scope, $rootScope,\n  $window, $http, omegaTarget, downloadFile) ->\n\n  omegaTarget.state('web.restoreOnlineUrl').then (url) ->\n    if url\n      $scope.restoreOnlineUrl = url\n\n  $scope.exportOptions = ->\n    $rootScope.applyOptionsConfirm().then ->\n      plainOptions = angular.fromJson(angular.toJson($rootScope.options))\n      content = JSON.stringify(plainOptions)\n      blob = new Blob [content], {type: \"text/plain;charset=utf-8\"}\n      downloadFile(blob, \"OmegaOptions.bak\")\n\n  $scope.importSuccess = ->\n    $rootScope.showAlert(\n      type: 'success'\n      i18n: 'options_importSuccess'\n      message: 'Options imported.'\n    )\n\n  $scope.restoreLocal = (content) ->\n    $scope.restoringLocal = true\n    $rootScope.resetOptions(content).then(( ->\n      $scope.importSuccess()\n    ), -> $scope.restoreLocalError()).finally ->\n      $scope.restoringLocal = false\n\n  $scope.restoreLocalError = ->\n    $rootScope.showAlert(\n      type: 'error'\n      i18n: 'options_importFormatError'\n      message: 'Invalid backup file!'\n    )\n  $scope.downloadError = ->\n    $rootScope.showAlert(\n      type: 'error'\n      i18n: 'options_importDownloadError'\n      message: 'Error downloading backup file!'\n    )\n  $scope.triggerFileInput = ->\n    angular.element('#restore-local-file').click()\n    return\n  $scope.restoreOnline = ->\n    omegaTarget.state('web.restoreOnlineUrl', $scope.restoreOnlineUrl)\n    $scope.restoringOnline = true\n    $http(\n      method: 'GET'\n      url: $scope.restoreOnlineUrl\n      cache: false\n      timeout: 10000\n      responseType: \"text\"\n    ).then(((result) ->\n      $rootScope.resetOptions(result.data).then (->\n        $scope.importSuccess()\n      ), -> $scope.restoreLocalError()\n    ), $scope.downloadError).finally ->\n      $scope.restoringOnline = false\n\n  $scope.enableOptionsSync = (args) ->\n    enable = ->\n      omegaTarget.setOptionsSync(true, args).finally ->\n        $window.location.reload()\n    if args?.force\n      enable()\n    else\n      $rootScope.applyOptionsConfirm().then enable\n\n  $scope.disableOptionsSync = ->\n    omegaTarget.setOptionsSync(false).then ->\n      $rootScope.applyOptionsConfirm().then ->\n        $window.location.reload()\n\n  $scope.resetOptionsSync = ->\n    omegaTarget.resetOptionsSync().then ->\n      $rootScope.applyOptionsConfirm().then ->\n        $window.location.reload()\n"
  },
  {
    "path": "omega-web/src/omega/controllers/master.coffee",
    "content": "angular.module('omega').controller 'MasterCtrl', ($scope, $rootScope, $window,\n  $q, $modal, $state, profileColors, profileIcons, omegaTarget,\n  $timeout, $location, $filter, getAttachedName, isProfileNameReserved,\n  isProfileNameHidden, dispNameFilter, downloadFile) ->\n\n  if browser?.proxy?.register? or browser?.proxy?.registerProxyScript?\n    $scope.isExperimental = true\n    $scope.pacProfilesUnsupported = true\n\n  tr = $filter('tr')\n\n  $rootScope.options = null\n\n  omegaTarget.addOptionsChangeCallback (newOptions) ->\n    $rootScope.options = angular.copy(newOptions)\n    $rootScope.optionsOld = angular.copy(newOptions)\n\n    omegaTarget.state('syncOptions').then (syncOptions) ->\n      $scope.syncOptions = syncOptions\n\n    $timeout ->\n      $rootScope.optionsDirty = false\n      showFirstRun()\n  \n  $rootScope.revertOptions = ->\n    $window.location.reload()\n\n  $rootScope.exportScript = (name) ->\n    getProfileName =\n      if name\n        $q.when(name)\n      else\n        omegaTarget.state('currentProfileName')\n          \n    getProfileName.then (profileName) ->\n      return unless profileName\n      profile = $rootScope.profileByName(profileName)\n      return if profile.profileType in ['DirectProfile', 'SystemProfile']\n      missingProfile = null\n      profileNotFound = (name) ->\n        missingProfile = name\n        return 'dumb'\n      ast = OmegaPac.PacGenerator.script($rootScope.options, profileName,\n        profileNotFound: profileNotFound)\n      pac = ast.print_to_string(beautify: true, comments: true)\n      pac = OmegaPac.PacGenerator.ascii(pac)\n      blob = new Blob [pac], {type: \"text/plain;charset=utf-8\"}\n      fileName = profileName.replace(/\\W+/g, '_')\n      downloadFile(blob, \"OmegaProfile_#{fileName}.pac\")\n      if missingProfile\n        $timeout ->\n          $rootScope.showAlert(\n            type: 'error'\n            message: tr('options_profileNotFound', [missingProfile])\n          )\n\n  diff = jsondiffpatch.create(\n    objectHash: (obj) -> JSON.stringify(obj)\n    textDiff: minLength: 1 / 0\n  )\n\n  $rootScope.showAlert = (alert) -> $timeout ->\n    $scope.alert = alert\n    $scope.alertShown = true\n    $scope.alertShownAt = Date.now()\n    $timeout $rootScope.hideAlert, 3000\n    return\n\n  $rootScope.hideAlert = -> $timeout ->\n    if Date.now() - $scope.alertShownAt >= 1000\n      $scope.alertShown = false\n\n  checkFormValid = ->\n    fields = angular.element('.ng-invalid')\n    if fields.length > 0\n      fields[0].focus()\n      $rootScope.showAlert(\n        type: 'error'\n        i18n: 'options_formInvalid'\n      )\n      return false\n    return true\n\n  $rootScope.applyOptions = ->\n    return unless checkFormValid()\n    return if $rootScope.$broadcast('omegaApplyOptions').defaultPrevented\n    plainOptions = angular.fromJson(angular.toJson($rootScope.options))\n    patch = diff.diff($rootScope.optionsOld, plainOptions)\n    omegaTarget.optionsPatch(patch).then ->\n      $rootScope.showAlert(\n        type: 'success'\n        i18n: 'options_saveSuccess'\n      )\n\n  $rootScope.resetOptions = (options) ->\n    omegaTarget.resetOptions(options).then(->\n      $rootScope.showAlert(\n        type: 'success'\n        i18n: 'options_resetSuccess'\n      )\n    ).catch (err) ->\n      $rootScope.showAlert(\n        type: 'error'\n        message: err\n      )\n      $q.reject err\n\n  $rootScope.profileByName = (name) ->\n    OmegaPac.Profiles.byName(name, $rootScope.options)\n\n  $rootScope.systemProfile = $rootScope.profileByName('system')\n  $rootScope.externalProfile =\n    color: '#49afcd'\n    name: tr('popup_externalProfile')\n    profileType: 'FixedProfile'\n    fallbackProxy: {host: \"127.0.0.1\", port: 42, scheme: \"http\"}\n\n  $rootScope.applyOptionsConfirm = ->\n    return $q.reject 'form_invalid' unless checkFormValid()\n    return $q.when(true) unless $rootScope.optionsDirty\n    $modal.open(templateUrl: 'partials/apply_options_confirm.html').result\n      .then -> $rootScope.applyOptions()\n\n  $rootScope.newProfile = ->\n    scope = $rootScope.$new('isolate')\n    scope.options = $rootScope.options\n    scope.isProfileNameReserved = isProfileNameReserved\n    scope.isProfileNameHidden = isProfileNameHidden\n    scope.profileByName = $rootScope.profileByName\n    scope.validateProfileName =\n      conflict: '!$value || !profileByName($value)'\n      reserved: '!$value || !isProfileNameReserved($value)'\n    scope.profileIcons = profileIcons\n    scope.dispNameFilter = dispNameFilter\n    scope.options = $scope.options\n    scope.pacProfilesUnsupported = $scope.pacProfilesUnsupported\n    $modal.open(\n      templateUrl: 'partials/new_profile.html'\n      scope: scope\n    ).result.then (profile) ->\n      profile = OmegaPac.Profiles.create(profile)\n      choice = Math.floor(Math.random() * profileColors.length)\n      profile.color ?= profileColors[choice]\n      OmegaPac.Profiles.updateRevision(profile)\n      $rootScope.options[OmegaPac.Profiles.nameAsKey(profile)] = profile\n      $state.go('profile', {name: profile.name})\n\n  $rootScope.replaceProfile = (fromName, toName) ->\n    $rootScope.applyOptionsConfirm().then ->\n      scope = $rootScope.$new('isolate')\n      scope.options = $rootScope.options\n      scope.fromName = fromName\n      scope.toName = toName\n      scope.profileByName = $rootScope.profileByName\n      scope.dispNameFilter = dispNameFilter\n      scope.options = $scope.options\n      scope.profileSelect = (model) ->\n        \"\"\"\n        <div omega-profile-select=\"options | profiles:profile\"\n          ng-model=\"#{model}\" options=\"options\"\n          disp-name=\"dispNameFilter\" style=\"display: inline-block;\">\n        </div>\n        \"\"\"\n      $modal.open(\n        templateUrl: 'partials/replace_profile.html'\n        scope: scope\n      ).result.then ({fromName, toName}) ->\n        omegaTarget.replaceRef(fromName, toName).then(->\n          $rootScope.showAlert(\n            type: 'success'\n            i18n: 'options_replaceProfileSuccess'\n          )\n        ).catch (err) ->\n          $rootScope.showAlert(\n            type: 'error'\n            message: err\n          )\n\n\n  $rootScope.renameProfile = (fromName) ->\n    $rootScope.applyOptionsConfirm().then ->\n      profile = $rootScope.profileByName(fromName)\n      scope = $rootScope.$new('isolate')\n      scope.options = $rootScope.options\n      scope.fromName = fromName\n      scope.isProfileNameReserved = isProfileNameReserved\n      scope.isProfileNameHidden = isProfileNameHidden\n      scope.profileByName = $rootScope.profileByName\n      scope.validateProfileName =\n        conflict: '!$value || $value == fromName || !profileByName($value)'\n        reserved: '!$value || !isProfileNameReserved($value)'\n      scope.dispNameFilter = $scope.dispNameFilter\n      scope.options = $scope.options\n      $modal.open(\n        templateUrl: 'partials/rename_profile.html'\n        scope: scope\n      ).result.then (toName) ->\n        if toName != fromName\n          rename = omegaTarget.renameProfile(fromName, toName)\n          attachedName = getAttachedName(fromName)\n          if $rootScope.profileByName(attachedName)\n            toAttachedName = getAttachedName(toName)\n            defaultProfileName = undefined\n            if $rootScope.profileByName(toAttachedName)\n              defaultProfileName = profile.defaultProfileName\n              rename = rename.then ->\n                toAttachedKey = OmegaPac.Profiles.nameAsKey(toAttachedName)\n                profile = $rootScope.profileByName(toName)\n                profile.defaultProfileName = 'direct'\n                OmegaPac.Profiles.updateRevision(profile)\n                delete $rootScope.options[toAttachedKey]\n                $rootScope.applyOptions()\n            rename = rename.then ->\n              omegaTarget.renameProfile(attachedName, toAttachedName)\n            if defaultProfileName\n              rename = rename.then ->\n                profile = $rootScope.profileByName(toName)\n                profile.defaultProfileName = defaultProfileName\n                $rootScope.applyOptions()\n          rename.then(->\n            $state.go('profile', {name: toName})\n          ).catch (err) ->\n            $rootScope.showAlert(\n              type: 'error'\n              message: err\n            )\n\n  $scope.updatingProfile = {}\n\n  $rootScope.updateProfile = (name) ->\n    $rootScope.applyOptionsConfirm().then(->\n      if name?\n        $scope.updatingProfile[name] = true\n      else\n        OmegaPac.Profiles.each $scope.options, (key, profile) ->\n          if not profile.builtin\n            $scope.updatingProfile[profile.name] = true\n        \n      omegaTarget.updateProfile(name, 'bypass_cache').then((results) ->\n        success = 0\n        error = 0\n        for own profileName, result of results\n          if result instanceof Error\n            error++\n          else\n            success++\n        if error == 0\n          $rootScope.showAlert(\n            type: 'success'\n            i18n: 'options_profileDownloadSuccess'\n          )\n        else\n          if error == 1\n            singleErr = results[OmegaPac.Profiles.nameAsKey(name)]\n            if singleErr\n              return $q.reject(singleErr)\n          return $q.reject(results)\n      ).catch((err) ->\n        message = tr('options_profileDownloadError_' + err.name,\n          [err.statusCode ? err.original?.statusCode ? ''])\n        if message\n          $rootScope.showAlert(\n            type: 'error'\n            message: message\n          )\n        else\n          $rootScope.showAlert(\n            type: 'error'\n            i18n: 'options_profileDownloadError'\n          )\n      ).finally ->\n        if name?\n          $scope.updatingProfile[name] = false\n        else\n          $scope.updatingProfile = {}\n    )\n\n  onOptionChange = (options, oldOptions) ->\n    return if options == oldOptions or not oldOptions?\n    $rootScope.optionsDirty = true\n  $rootScope.$watch 'options', onOptionChange, true\n\n  $rootScope.$on '$stateChangeStart', (event, _, __, fromState) ->\n    if not checkFormValid()\n      event.preventDefault()\n\n  $rootScope.$on '$stateChangeSuccess', ->\n    omegaTarget.lastUrl($location.url())\n\n  $window.onbeforeunload = ->\n    if $rootScope.optionsDirty\n      return tr('options_optionsNotSaved')\n    else\n      null\n\n  document.addEventListener 'click', (->\n    $rootScope.hideAlert()\n  ), false\n\n  $scope.profileIcons = profileIcons\n  $scope.dispNameFilter = dispNameFilter\n\n  for own type of OmegaPac.Profiles.formatByType\n    $scope.profileIcons[type] = $scope.profileIcons['RuleListProfile']\n\n  $scope.alertIcons =\n    'success': 'glyphicon-ok',\n    'warning': 'glyphicon-warning-sign',\n    'error': 'glyphicon-remove',\n    'danger': 'glyphicon-danger',\n\n  $scope.alertClassForType = (type) ->\n    return '' if not type\n    if type == 'error'\n      type = 'danger'\n    return 'alert-' + type\n\n  $scope.downloadIntervals = [15, 60, 180, 360, 720, 1440, -1]\n  $scope.downloadIntervalI18n = (interval) ->\n    \"options_downloadInterval_\" + (if interval < 0 then \"never\" else interval)\n\n  $scope.openShortcutConfig = omegaTarget.openShortcutConfig.bind(omegaTarget)\n\n  showFirstRunOnce = true\n  showFirstRun = ->\n    return unless showFirstRunOnce\n    showFirstRunOnce = false\n    omegaTarget.state('firstRun').then (firstRun) ->\n      return unless firstRun\n      omegaTarget.state('firstRun', '')\n\n      profileName = null\n      OmegaPac.Profiles.each $rootScope.options, (key, profile) ->\n        if not profileName and profile.profileType == 'FixedProfile'\n          profileName = profile.name\n      return unless profileName\n\n      scope = $rootScope.$new('isolate')\n      scope.upgrade = (firstRun == 'upgrade')\n      $modal.open(\n        templateUrl: 'partials/options_welcome.html'\n        keyboard: false\n        scope: scope\n        backdrop: 'static'\n        backdropClass: 'opacity-half'\n      ).result.then (r) ->\n        switch r\n          when 'later'\n            return\n          when 'show'\n            $state.go('profile', {name: profileName}).then ->\n              $script 'js/options_guide.js'\n\n  omegaTarget.refresh()\n\n"
  },
  {
    "path": "omega-web/src/omega/controllers/pac_profile.coffee",
    "content": "angular.module('omega').controller 'PacProfileCtrl', ($scope, $modal) ->\n  # coffeelint: disable=max_line_length\n\n  # https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L13\n  $scope.urlRegex = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/\n  # With the file: scheme added to the pattern:\n  $scope.urlWithFile = /^(ftp|http|https|file):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/\n\n  # coffeelint: enable=max_line_length\n  \n  $scope.isFileUrl = OmegaPac.Profiles.isFileUrl\n  $scope.pacUrlCtrl = {ctrl: null}\n\n  set = OmegaPac.Profiles.referencedBySet($scope.profile, $scope.options)\n  $scope.referenced = Object.keys(set).length > 0\n\n  oldPacUrl = null\n  oldLastUpdate = null\n  oldPacScript = null\n  onProfileChange = (profile, oldProfile) ->\n    return unless profile and oldProfile\n    if profile.pacUrl != oldProfile.pacUrl\n      if profile.lastUpdate\n        oldPacUrl = oldProfile.pacUrl\n        oldLastUpdate = profile.lastUpdate\n        oldPacScript = oldProfile.pacScript\n        profile.lastUpdate = null\n      else if oldPacUrl and profile.pacUrl == oldPacUrl\n        profile.lastUpdate = oldLastUpdate\n        profile.pacScript = oldPacScript\n    $scope.pacUrlIsFile = $scope.isFileUrl(profile.pacUrl)\n  $scope.$watch 'profile', onProfileChange, true\n\n  $scope.editProxyAuth = (scheme) ->\n    prop = 'all'\n    auth = $scope.profile.auth?[prop]\n    scope = $scope.$new('isolate')\n    scope.auth = auth && angular.copy(auth)\n    $modal.open(\n      templateUrl: 'partials/fixed_auth_edit.html'\n      scope: scope\n      size: 'sm'\n    ).result.then (auth) ->\n      if not auth?.username\n        if $scope.profile.auth\n          $scope.profile.auth[prop] = undefined\n      else\n        $scope.profile.auth ?= {}\n        $scope.profile.auth[prop] = auth\n"
  },
  {
    "path": "omega-web/src/omega/controllers/profile.coffee",
    "content": "angular.module('omega').controller 'ProfileCtrl', ($scope, $stateParams,\n  $location, $rootScope, $timeout, $state, $modal, profileColorPalette,\n  getAttachedName, getParentName, getVirtualTarget) ->\n  name = $stateParams.name\n  profileTemplates =\n    'FixedProfile': 'profile_fixed.html'\n    'PacProfile': 'profile_pac.html'\n    'VirtualProfile': 'profile_virtual.html'\n    'SwitchProfile': 'profile_switch.html'\n    'RuleListProfile': 'profile_rule_list.html'\n  $scope.spectrumOptions =\n    localStorageKey: 'spectrum.profileColor'\n    palette: profileColorPalette\n    preferredFormat: 'hex'\n    showButtons: false\n    showInitial: true\n    showInput: true\n    showPalette: true\n    showSelectionPalette: true\n    maxSelectionSize: 5\n\n  $scope.getProfileColor = ->\n    color = undefined\n    profile = $scope.profile\n    while profile\n      color = profile.color\n      profile = getVirtualTarget(profile, $scope.options)\n    color\n\n  $scope.deleteProfile = ->\n    profileName = $scope.profile.name\n    refs = OmegaPac.Profiles.referencedBySet(profileName, $rootScope.options)\n\n    scope = $rootScope.$new('isolate')\n    scope.profile = $scope.profile\n    scope.dispNameFilter = $scope.dispNameFilter\n    scope.options = $scope.options\n\n    if Object.keys(refs).length > 0\n      refSet = {}\n      for own key, pname of refs\n        parent = getParentName(pname)\n        if parent\n          key = OmegaPac.Profiles.nameAsKey(parent)\n          pname = parent\n        refSet[key] = pname\n\n      refProfiles = []\n      for own key of refSet\n        refProfiles.push(OmegaPac.Profiles.byKey(key, $rootScope.options))\n      scope.refs = refProfiles\n      $modal.open(\n        templateUrl: 'partials/cannot_delete_profile.html'\n        scope: scope\n      )\n      return\n    else\n      $modal.open(\n        templateUrl: 'partials/delete_profile.html'\n        scope: scope\n      ).result.then ->\n        attachedName = getAttachedName(profileName)\n        delete $rootScope.options[OmegaPac.Profiles.nameAsKey(attachedName)]\n        delete $rootScope.options[OmegaPac.Profiles.nameAsKey(profileName)]\n        if $rootScope.options['-startupProfileName'] == profileName\n          $rootScope.options['-startupProfileName'] = \"\"\n        quickSwitch = $rootScope.options['-quickSwitchProfiles']\n        for i in [0...quickSwitch.length]\n          if profileName == quickSwitch[i]\n            quickSwitch.splice i, 1\n            break\n        $state.go('ui')\n\n  # The watcher should be applied on the calling scope.\n  # coffeelint: disable=missing_fat_arrows\n  $scope.watchAndUpdateRevision = (expression) ->\n    revisionChanged = false\n    onChange = (profile, oldProfile) ->\n      return profile if profile == oldProfile or not profile or not oldProfile\n      if revisionChanged and profile.revision != oldProfile.revision\n        revisionChanged = false\n      else\n        OmegaPac.Profiles.updateRevision(profile)\n        revisionChanged = true\n    this.$watch expression, onChange, true\n\n  $scope.exportRuleList = null\n  $scope.exportRuleListOptions = null\n  $scope.setExportRuleListHandler = (exportRuleList, options) ->\n    $scope.exportRuleList = exportRuleList\n    $scope.exportRuleListOptions = options\n\n  unwatch = $scope.$watch (-> $scope.options?['+' + name]), (profile) ->\n    if not profile\n      if $scope.options\n        unwatch()\n        $location.path '/'\n      else\n        unwatch2 = $scope.$watch 'options', ->\n          if $scope.options\n            unwatch2()\n            if not $scope.options['+' + name]\n              unwatch()\n              $location.path '/'\n      return\n    if OmegaPac.Profiles.formatByType[profile.profileType]\n      profile.format = OmegaPac.Profiles.formatByType[profile.profileType]\n      profile.profileType = 'RuleListProfile'\n    $scope.profile = profile\n    type = $scope.profile.profileType\n    templ = profileTemplates[type] ? 'profile_unsupported.html'\n    $scope.profileTemplate = 'partials/' + templ\n    $scope.scriptable = true\n\n    $scope.watchAndUpdateRevision 'profile'\n"
  },
  {
    "path": "omega-web/src/omega/controllers/quick_switch.coffee",
    "content": "angular.module('omega').controller 'QuickSwitchCtrl', ($scope, $filter) ->\n  $scope.sortableOptions =\n    tolerance: 'pointer'\n    axis: 'y'\n    forceHelperSize: true\n    forcePlaceholderSize: true\n    connectWith: '.cycle-profile-container'\n    containment: '#quick-switch-settings'\n\n  $scope.$watchCollection 'options', (options) ->\n    return unless options?\n    $scope.notCycledProfiles =\n      for profile in $filter('profiles')(options, 'all') when (\n        options[\"-quickSwitchProfiles\"].indexOf(profile.name) < 0)\n        profile.name\n"
  },
  {
    "path": "omega-web/src/omega/controllers/rule_list_profile.coffee",
    "content": "angular.module('omega').controller 'RuleListProfileCtrl', ($scope) ->\n  $scope.ruleListFormats = OmegaPac.Profiles.ruleListFormats\n"
  },
  {
    "path": "omega-web/src/omega/controllers/switch_profile.coffee",
    "content": "angular.module('omega').controller 'SwitchProfileCtrl', ($scope, $rootScope,\n  $location, $timeout, $q, $modal, profileIcons, getAttachedName, omegaTarget,\n  trFilter, downloadFile) ->\n  # == Rule list ==\n  $scope.ruleListFormats = OmegaPac.Profiles.ruleListFormats\n\n  exportRuleList = ->\n    text = OmegaPac.RuleList.Switchy.compose(\n      rules: $scope.profile.rules\n      defaultProfileName: $scope.attachedOptions.defaultProfileName\n    )\n\n    eol = '\\r\\n'\n    info = '\\n'\n    info += '; Require: SwitchyOmega >= 2.3.2' + eol\n    info += \"; Date: #{new Date().toLocaleDateString()}\" + eol\n    info += \"; Usage: #{trFilter('ruleList_usageUrl')}\" + eol\n\n    text = text.replace('\\n', info)\n\n    blob = new Blob [text], {type: \"text/plain;charset=utf-8\"}\n    fileName = $scope.profile.name.replace(/\\W+/g, '_')\n    downloadFile(blob, \"OmegaRules_#{fileName}.sorl\")\n\n  exportLegacyRuleList = ->\n    wildcardRules = ''\n    regexpRules = ''\n    for rule in $scope.profile.rules\n      i = ''\n      if rule.profileName == $scope.attachedOptions.defaultProfileName\n        i = '!'\n      switch rule.condition.conditionType\n        when 'HostWildcardCondition'\n          wildcardRules += i + '@*://' + rule.condition.pattern + '/*' + '\\r\\n'\n        when 'UrlWildcardCondition'\n          wildcardRules += i + '@' + rule.condition.pattern + '\\r\\n'\n        when 'UrlRegexCondition'\n          regexpRules += i + rule.condition.pattern + '\\r\\n'\n\n    text = \"\"\"\n      ; Summary: Proxy Switchy! Exported Rule List\n      ; Date: #{new Date().toLocaleDateString()}\n      ; Website: #{trFilter('ruleList_usageUrl')}\n\n      #BEGIN\n\n      [wildcard]\n      #{wildcardRules}\n      [regexp]\n      #{regexpRules}\n      #END\n    \"\"\"\n    blob = new Blob [text], {type: \"text/plain;charset=utf-8\"}\n    fileName = $scope.profile.name.replace(/\\W+/g, '_')\n    downloadFile(blob, \"SwitchyRules_#{fileName}.ssrl\")\n\n  # == Condition types ==\n  $scope.conditionHelp =\n    show: ($location.search().help == 'condition')\n\n  $scope.basicConditionTypes = [\n    {\n      group: 'default'\n      types: [\n        'HostWildcardCondition'\n        'UrlWildcardCondition'\n        'UrlRegexCondition'\n        'FalseCondition'\n      ]\n    }\n  ]\n\n  $scope.advancedConditionTypes = [\n    {\n      group: 'host'\n      types: [\n        'HostWildcardCondition'\n        'HostRegexCondition'\n        'HostLevelsCondition'\n        'IpCondition'\n      ]\n    }\n    {\n      group: 'url'\n      types: [\n        'UrlWildcardCondition'\n        'UrlRegexCondition'\n        'KeywordCondition'\n      ]\n    }\n    {\n      group: 'special'\n      types: [\n        'WeekdayCondition'\n        'TimeCondition'\n        'FalseCondition'\n      ]\n    }\n  ]\n\n  expandGroups = (groups) ->\n    result = []\n    for group in groups\n      for type in group.types\n        result.push({type: type, group: 'condition_group_' + group.group})\n    result\n\n  basicConditionTypesExpanded = expandGroups($scope.basicConditionTypes)\n  advancedConditionTypesExpanded = expandGroups($scope.advancedConditionTypes)\n\n  basicConditionTypeSet = {}\n  for type in basicConditionTypesExpanded\n    basicConditionTypeSet[type.type] = type.type\n\n  $scope.conditionTypes = basicConditionTypesExpanded\n\n  $scope.showConditionTypes = 0\n  $scope.hasConditionTypes = 0\n  $scope.hasUrlConditions = false\n  $scope.isUrlConditionType =\n    'UrlWildcardCondition': true\n    'UrlRegexCondition': true\n\n  updateHasConditionTypes = ->\n    return unless $scope.profile?.rules?\n\n    $scope.hasUrlConditions = false\n    for rule in $scope.profile.rules\n      if $scope.isUrlConditionType[rule.condition.conditionType]\n        $scope.hasUrlConditions = true\n        break\n\n    return unless $scope.hasConditionTypes == 0\n    for rule in $scope.profile.rules\n      # Convert TrueCondition to a HostWildcardCondition with pattern '*'.\n      if rule.condition.conditionType == 'TrueCondition'\n        rule.condition = {\n          conditionType: 'HostWildcardCondition'\n          pattern: '*'\n        }\n      if not basicConditionTypeSet[rule.condition.conditionType]\n        $scope.hasConditionTypes = 1\n        $scope.showConditionTypes = 1\n        break\n\n  $scope.$watch 'options[\"-showConditionTypes\"]', (show) ->\n    show ||= 0\n    if show > 0\n      $scope.showConditionTypes = show\n    else\n      updateHasConditionTypes()\n      $scope.showConditionTypes = $scope.hasConditionTypes\n\n    if $scope.options['-exportLegacyRuleList']\n      if $scope.showConditionTypes > 0\n        $scope.setExportRuleListHandler(exportRuleList, {warning: true})\n      else\n        $scope.setExportRuleListHandler(exportLegacyRuleList)\n    else\n      $scope.setExportRuleListHandler(exportRuleList)\n\n    if $scope.showConditionTypes == 0\n      $scope.conditionTypes = basicConditionTypesExpanded\n      if $scope.options['-exportLegacyRuleList']\n        $scope.setExportRuleListHandler exportLegacyRuleList\n    else\n      $scope.conditionTypes = advancedConditionTypesExpanded\n      if not $scope.options[\"-showConditionTypes\"]?\n        $scope.options[\"-showConditionTypes\"] = $scope.showConditionTypes\n      unwatchRules?()\n\n  if $scope.hasConditionTypes == 0\n    unwatchRules = $scope.$watch 'profile.rules', updateHasConditionTypes, true\n\n  # == Rules ==\n  rulesReadyDefer = $q.defer()\n  rulesReady = rulesReadyDefer.promise\n  stopWatchingForRules = $scope.$watch 'profile.rules', (rules) ->\n    return unless rules\n    stopWatchingForRules()\n    rulesReadyDefer.resolve(rules)\n\n  $scope.addRule = ->\n    rule =\n      if $scope.profile.rules.length > 0\n        [..., templ] = $scope.profile.rules\n        angular.copy(templ)\n      else\n        condition: {conditionType: 'HostWildcardCondition', pattern: ''}\n        profileName: $scope.attachedOptions.defaultProfileName\n    if rule.condition.pattern\n      rule.condition.pattern = ''\n    $scope.profile.rules.push rule\n\n  $scope.validateCondition = (condition, pattern) ->\n    if condition.conditionType.indexOf('Regex') >= 0\n      try\n        new RegExp(pattern)\n      catch _\n        return false\n    return true\n\n  $scope.conditionHasWarning = (condition) ->\n    if condition.conditionType == 'HostWildcardCondition'\n      pattern = condition.pattern\n      return pattern.indexOf(':') >= 0 || pattern.indexOf('/') >= 0\n    return false\n\n  $scope.validateIpCondition = (condition, input) ->\n    return false unless input\n    ip = OmegaPac.Conditions.parseIp(input)\n    return ip?\n\n  $scope.getWeekdayList = OmegaPac.Conditions.getWeekdayList\n  $scope.updateDay = (condition, i, selected) ->\n    condition.days ||= '-------'\n    char = if selected then 'SMTWtFs'[i] else '-'\n    condition.days = condition.days.substr(0, i) + char +\n      condition.days.substr(i + 1)\n    delete condition.startDay\n    delete condition.endDay\n\n  $scope.removeRule = (index) ->\n    removeForReal = ->\n      $scope.profile.rules.splice index, 1\n    if $scope.options['-confirmDeletion']\n      scope = $scope.$new('isolate')\n      scope.rule = $scope.profile.rules[index]\n      scope.ruleProfile = $scope.profileByName(scope.rule.profileName)\n      scope.dispNameFilter = $scope.dispNameFilter\n      scope.options = $scope.options\n      $modal.open(\n        templateUrl: 'partials/rule_remove_confirm.html'\n        scope: scope\n      ).result.then removeForReal\n    else\n      removeForReal()\n\n  $scope.cloneRule = (index) ->\n    rule = angular.copy($scope.profile.rules[index])\n    $scope.profile.rules.splice(index + 1, 0, rule)\n    $timeout ->\n      input = angular.element(\".switch-rule-row:nth-child(#{index + 2}) input\")\n      input[0]?.focus()\n      input[0]?.select()\n\n  $scope.showNotes = false\n  $scope.addNote = (index) ->\n    $scope.showNotes = true\n    unwatchRulesShowNote()\n  unwatchRulesShowNote = $scope.$watch 'profile.rules', ((rules) ->\n    if rules and rules.some((rule) -> !!rule.note)\n      $scope.showNotes = true\n      unwatchRulesShowNote()\n  ), true\n\n  $scope.resetRules = ->\n    scope = $scope.$new('isolate')\n    scope.ruleProfile =\n      $scope.profileByName($scope.attachedOptions.defaultProfileName)\n    scope.dispNameFilter = $scope.dispNameFilter\n    scope.options = $scope.options\n    $modal.open(\n      templateUrl: 'partials/rule_reset_confirm.html'\n      scope: scope\n    ).result.then ->\n      for rule in $scope.profile.rules\n        rule.profileName = $scope.attachedOptions.defaultProfileName\n\n  $scope.sortableOptions =\n    handle: '.sort-bar'\n    tolerance: 'pointer'\n    axis: 'y'\n    forceHelperSize: true\n    forcePlaceholderSize: true\n    containment: 'parent'\n\n  # == Attached ==\n  attachedReadyDefer = $q.defer()\n  attachedReady = attachedReadyDefer.promise\n  $scope.$watch 'profile.name', (name) ->\n    $scope.attachedName = getAttachedName(name)\n    $scope.attachedKey = OmegaPac.Profiles.nameAsKey($scope.attachedName)\n\n  $scope.$watch 'options[attachedKey]', (attached) ->\n    $scope.attached = attached\n\n  $scope.watchAndUpdateRevision 'options[attachedKey]'\n\n  oldSourceUrl = null\n  oldLastUpdate = null\n  oldRuleList = null\n  onAttachedChange = (attached, oldAttached) ->\n    return unless attached and oldAttached\n    if attached.sourceUrl != oldAttached.sourceUrl\n      if attached.lastUpdate\n        oldSourceUrl = oldAttached.sourceUrl\n        oldLastUpdate = attached.lastUpdate\n        oldRuleList = oldAttached.ruleList\n        attached.lastUpdate = null\n      else if oldSourceUrl and attached.sourceUrl == oldSourceUrl\n        attached.lastUpdate = oldLastUpdate\n        attached.ruleList = oldRuleList\n  $scope.$watch 'options[attachedKey]', onAttachedChange, true\n\n  $scope.attachedOptions = {enabled: false}\n  $scope.$watch 'profile.defaultProfileName', (name) ->\n    $scope.attachedOptions.enabled = (name == $scope.attachedName)\n    if not $scope.attached or not $scope.attachedOptions.enabled\n      $scope.attachedOptions.defaultProfileName = name\n\n  $scope.$watch 'attachedOptions.enabled', (enabled, oldValue) ->\n    return if enabled == oldValue\n    if enabled\n      if $scope.profile.defaultProfileName != $scope.attachedName\n        $scope.profile.defaultProfileName = $scope.attachedName\n    else\n      if $scope.profile.defaultProfileName == $scope.attachedName\n        if $scope.attached\n          $scope.profile.defaultProfileName = $scope.attached.defaultProfileName\n          $scope.attachedOptions.defaultProfileName =\n            $scope.attached.defaultProfileName\n        else\n          $scope.profile.defaultProfileName = 'direct'\n          $scope.attachedOptions.defaultProfileName = 'direct'\n\n  $scope.$watch 'attached.defaultProfileName', (name) ->\n    if name and $scope.attachedOptions.enabled\n      $scope.attachedOptions.defaultProfileName = name\n\n  $scope.$watch 'attachedOptions.defaultProfileName', (name) ->\n    attachedReadyDefer.resolve()\n    if $scope.attached and $scope.attachedOptions.enabled\n      $scope.attached.defaultProfileName = name\n    else\n      $scope.profile.defaultProfileName = name\n\n  $scope.attachNew = ->\n    $scope.attached = OmegaPac.Profiles.create(\n      name: $scope.attachedName\n      defaultProfileName: $scope.profile.defaultProfileName\n      profileType: 'RuleListProfile'\n      color: $scope.profile.color\n    )\n    OmegaPac.Profiles.updateRevision($scope.attached)\n    $scope.options[$scope.attachedKey] = $scope.attached\n    $scope.attachedOptions.enabled = true\n    $scope.profile.defaultProfileName = $scope.attachedName\n\n  $scope.removeAttached = ->\n    return unless $scope.attached\n    scope = $scope.$new('isolate')\n    scope.attached = $scope.attached\n    scope.dispNameFilter = $scope.dispNameFilter\n    scope.options = $scope.options\n    $modal.open(\n      templateUrl: 'partials/delete_attached.html'\n      scope: scope\n    ).result.then ->\n      $scope.profile.defaultProfileName = $scope.attached.defaultProfileName\n      delete $scope.options[$scope.attachedKey]\n\n  # == Edit source ==\n  stateEditorKey = 'web._profileEditor.' + $scope.profile.name\n  $scope.loadRules = false\n  $scope.editSource = false\n  parseOmegaRules = (code, {detect, requireResult} = {}) ->\n    setError = (error) ->\n      if error.reason\n        args = error.args ? [\n          error.sourceLineNo\n          error.source\n        ]\n        message = trFilter('ruleList_error_' + error.reason, args)\n        error.message = message if message\n      return {error: error}\n    if detect and not OmegaPac.RuleList.Switchy.detect(code)\n      return {error: {reason: 'notSwitchy'}}\n    refs = OmegaPac.RuleList.Switchy.directReferenceSet({\n      ruleList: code\n    })\n    if requireResult and not refs\n      return setError({reason: 'resultNotEnabled'})\n    for own key, name of refs\n      if not OmegaPac.Profiles.byKey(key, $scope.options)\n        return setError({reason: 'unknownProfile', args: [name]})\n    try\n      return rules: OmegaPac.RuleList.Switchy.parseOmega(code, null, null,\n        {strict: true, source: false})\n    catch err\n      return setError(err)\n  parseSource = ->\n    return true unless $scope.source\n    {rules, error} = parseOmegaRules($scope.source.code.trim(),\n      requireResult: true)\n    if error\n      $scope.source.error = error\n      $scope.editSource = true\n      return false\n    else\n      $scope.source.error = undefined\n    $scope.attachedOptions.defaultProfileName = rules.pop().profileName\n    # Try to merge with existing rules if possible.\n    diff = jsondiffpatch.create(\n      objectHash: (obj) -> JSON.stringify(obj)\n      textDiff: minLength: 1 / 0\n    )\n    oldRules = angular.fromJson(angular.toJson($scope.profile.rules))\n    patch = diff.diff(oldRules, rules)\n    jsondiffpatch.patch($scope.profile.rules, patch)\n    return true\n  $scope.toggleSource = -> $q.all([attachedReady, rulesReady]).then ->\n    $scope.editSource = not $scope.editSource\n    if $scope.editSource\n      args =\n        rules: $scope.profile.rules\n        defaultProfileName: $scope.attachedOptions.defaultProfileName\n      code = OmegaPac.RuleList.Switchy.compose(args, withResult: true)\n      $scope.source = {code: code}\n    else\n      return unless parseSource()\n      $scope.source = null\n      $scope.loadRules = true\n    omegaTarget.state(stateEditorKey, {editSource: $scope.editSource})\n\n  $rootScope.$on '$stateChangeStart', (event, _, __, fromState) ->\n    if $scope.editSource and $scope.source.touched\n      sourceValid = parseSource()\n      event.preventDefault() unless sourceValid\n\n  $scope.$on 'omegaApplyOptions', (event) ->\n    if $scope.attached?.ruleList and not $scope.attached.sourceUrl\n      $scope.attachedRuleListError = undefined\n      {error} = parseOmegaRules($scope.attached.ruleList.trim(), detect: true)\n      if error\n        if error.reason != 'resultNotEnabled' and error.reason != 'notSwitchy'\n          $scope.attachedRuleListError = error\n          event.preventDefault()\n          angular.element('#attached-rulelist')[0].focus()\n      else\n        $scope.attached.format = 'Switchy'\n\n    if $scope.editSource and $scope.source.touched\n      event.preventDefault()\n      if parseSource()\n        $scope.source.touched = false\n        $timeout ->\n          $rootScope.applyOptions()\n\n  omegaTarget.state(stateEditorKey).then (opts) ->\n    if opts?.editSource\n      $scope.toggleSource()\n    else\n      $scope.loadRules = true\n      getState = omegaTarget.state(['web.switchGuide', 'firstRun'])\n      $q.all([rulesReady, getState]).then ([_, [switchGuide, firstRun]]) ->\n        return if firstRun or switchGuide == 'shown'\n        omegaTarget.state('web.switchGuide', 'shown')\n        return if $scope.profile.rules.length == 0\n        $script 'js/switch_profile_guide.js'\n"
  },
  {
    "path": "omega-web/src/omega/directives.coffee",
    "content": "angular.module('omega').directive 'inputGroupClear', ($timeout) ->\n  restrict: 'A'\n  templateUrl: 'partials/input_group_clear.html'\n  scope:\n    'model': '=model'\n    'type': '@type'\n    'ngPattern': '=?ngPattern'\n    'placeholder': '@placeholder'\n    'controller': '=?controller'\n  link: (scope, element, attrs) ->\n    scope.catchAll = new RegExp('')\n    $timeout ->\n      scope.controller = element.find('input').controller('ngModel')\n\n    scope.oldModel = ''\n    scope.controller = scope.input\n    scope.modelChange = ->\n      if scope.model\n        scope.oldModel = ''\n    scope.toggleClear = ->\n      [scope.model, scope.oldModel] = [scope.oldModel, scope.model]\nangular.module('omega').directive 'omegaUpload', ->\n  restrict: 'A'\n  scope:\n    success: '&omegaUpload'\n    error: '&omegaError'\n  link: (scope, element, attrs) ->\n    input = element[0]\n    element.on 'change', ->\n      if input.files.length > 0 and input.files[0].name.length > 0\n        reader = new FileReader()\n        reader.addEventListener 'load', (e) ->\n          scope.$apply ->\n            scope.success({'$content': e.target.result})\n        reader.addEventListener 'error', (e) ->\n          scope.$apply ->\n            scope.error({'$error': e.target.error})\n        reader.readAsText(input.files[0])\n        input.value = ''\nangular.module('omega').directive 'omegaIp2str', ->\n  restrict: 'A'\n  priority: 2 # Run post-link after input directive (0) and ngModel (1).\n  require: 'ngModel'\n  link: (scope, element, attr, ngModel) ->\n    ngModel.$parsers.push (value) ->\n      if value\n        OmegaPac.Conditions.fromStr('Ip: ' + value)\n      else\n        ({conditionType: 'IpCondition', ip: '0.0.0.0', prefixLength: 0})\n    ngModel.$formatters.push (value) ->\n      if value?.ip\n        OmegaPac.Conditions.str(value).split(' ', 2)[1]\n      else\n        ''\n"
  },
  {
    "path": "omega-web/src/omega/filters.coffee",
    "content": "angular.module('omega').filter 'profiles', (builtinProfiles, profileOrder,\n  isProfileNameHidden, isProfileNameReserved) ->\n\n  charCodePlus = '+'.charCodeAt(0)\n  builtinProfileList = (profile for _, profile of builtinProfiles)\n  (options, filter) ->\n    result = []\n    for name, value of options when name.charCodeAt(0) == charCodePlus\n      result.push value\n    if (typeof filter == 'object' or (\n      typeof filter == 'string' and filter.charCodeAt(0) == charCodePlus))\n      if typeof filter == 'string'\n        filter = filter.substr(1)\n      result = OmegaPac.Profiles.validResultProfilesFor(filter, options)\n    if filter == 'all'\n      result = result.filter (profile) -> !isProfileNameHidden(profile.name)\n      result = result.concat builtinProfileList\n    else\n      result = result.filter (profile) -> !isProfileNameReserved(profile.name)\n    if filter == 'sorted'\n      result.sort profileOrder\n    result\n\nangular.module('omega').filter 'tr', (omegaTarget) -> omegaTarget.getMessage\nangular.module('omega').filter 'dispName', (omegaTarget) ->\n  (name) ->\n    if typeof name == 'object'\n      name = name.name\n    omegaTarget.getMessage('profile_' + name) || name\n"
  },
  {
    "path": "omega-web/src/options.jade",
    "content": "doctype html\nhtml(lang='en' ng-controller='MasterCtrl' ng-csp)\n  head\n    meta(charset='utf-8')\n    title(ng-bind=\"'options_title' | tr\") SwitchyOmega Options\n    meta(name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no')\n    link(rel='stylesheet' href='lib/bootstrap/css/bootstrap.min.css')\n    link(rel='stylesheet' href='lib/spectrum/spectrum.css')\n    link(rel='stylesheet' href='lib/ladda/ladda-themeless.min.css')\n    link(rel='stylesheet' href='lib/shepherd.js/shepherd-theme-arrows.css')\n    link(rel='stylesheet' href='css/options.css')\n  body(style='display: none;' ng-style='{display: options ? \"block\" : \"none\"}')\n    .container-fluid\n      header.col-lg-2.col-sm-3.side-nav\n        h1\n          a(ui-sref='about' title='{{\"about_title\" | tr}}') {{'appNameShort' | tr}}\n          sup.om-experimental.text-danger(ng-show='isExperimental')\n            | {{'options_experimental_badge' | tr}}\n        nav.nav.nav-pills.nav-stacked\n          li.nav-header {{'options_navHeader_setting' | tr}}\n          li(ui-sref-active='active'): a(ui-sref='ui')\n            span.glyphicon.glyphicon-wrench\n            = ' '\n            | {{'options_tab_ui' | tr}}\n          li(ui-sref-active='active'): a(ui-sref='general')\n            span.glyphicon.glyphicon-cog\n            = ' '\n            | {{'options_tab_general' | tr}}\n          li(ui-sref-active='active'): a(ui-sref='io')\n            span.glyphicon.glyphicon-floppy-save\n            = ' '\n            | {{'options_tab_importExport' | tr}}\n          li.divider\n          li.nav-header {{'options_navHeader_profiles' | tr}}\n          li.nav-profile(ng-repeat='profile in options | profiles:\"sorted\"' ui-sref-active='active'\n            data-profile-type=\"{{profile.profileType}}\")\n            a(ui-sref='profile({name: profile.name})')\n              span(omega-profile-inline='profile' options='options')\n          li.nav-new-profile\n            a(role='button' ng-click='newProfile()')\n              span.glyphicon.glyphicon-plus\n              = ' '\n              span {{'options_newProfile' | tr}}\n          li.divider\n          li.nav-header Actions\n          li\n            a.btn-default.btn.align-initial(role='button' ng-click='applyOptions()'\n                ng-class='{\"btn-success\": optionsDirty}')\n              span.glyphicon.glyphicon-ok-circle\n              = ' '\n              | {{'options_apply' | tr}}\n          li(ng-class='{disabled: !optionsDirty}')\n            a.text-danger(role='button' ng-click='revertOptions()')\n              span.glyphicon.glyphicon-remove-circle\n              = ' '\n              | {{'options_discard' | tr}}\n      main.col-lg-10.col-sm-9.col-lg-offset-2.col-sm-offset-3.angular-animate(ui-view)\n\n    //-\n      Note: Alert type classes cannot be changed in angular-bootstrap.\n      This is already fixed but they don't have time for a new release:\n      https://github.com/angular-ui/bootstrap/issues/2641\n    .alert-top-wrapper(ng-show='alertShown')\n      div(alert type='workaround' close='hideAlert()'\n          class='{{alertClassForType(alert.type)}}')\n        span.glyphicon(class=\"{{alertIcons[alert.type]}}\")\n        = ' '\n        | {{alert.i18n ? (alert.i18n | tr) : alert.message}}\n    script(src='js/omega_debug.js')\n    script(src='js/log_error.js')\n    script(src='lib/script.js/script.min.js')\n    script(src='js/options.js')\n"
  },
  {
    "path": "omega-web/src/partials/about.jade",
    "content": ".page-header\n  h2 {{'about_title' | tr}}\nsection.omega-experimental(ng-show='isExperimental')\n  p.alert.alert-warning\n    span.glyphicon.glyphicon-warning-sign\n    = ' '\n    span {{'about_experimental_warning_moz' | tr}}\nsection\n  .media(style='margin: 1em 0')\n    .media-left\n      img.media-object(src='img/icons/omega-action-32.png')\n    .media-body\n      h4.media-heading {{'appNameShort' | tr}}\n      p {{'about_app_description' | tr}}\nsection\n  p\n    button.btn.btn-info(ng-click='reportIssue()')\n      span.glyphicon.glyphicon-comment\n      = ' '\n      | {{'popup_reportIssues' | tr}}\n    = ' '\n    button.btn.btn-default(ng-click='downloadLog()')\n      span.glyphicon.glyphicon-download\n      = ' '\n      | {{'popup_errorLog' | tr}}\n    = ' '\n    button.btn.btn-danger(ng-click='showResetOptionsModal()')\n      span.glyphicon.glyphicon-alert\n      = ' '\n      | {{'options_reset' | tr}}\nsection\n  p\n    | {{'about_version' | tr:[version]}}\n  p.text-warning\n    span.glyphicon.glyphicon-info-sign\n    = ' '\n    span(ng-bind-html='\"about_disclaimer_networkService\" | tr')\n  p.text-success\n    span.glyphicon.glyphicon-eye-close\n    = ' '\n    span(ng-bind-html='\"about_disclaimer_privacy\" | tr')\n  p.text-info\n    span.glyphicon.glyphicon-question-sign\n    = ' '\n    span(ng-bind-html='\"about_help\" | tr')\n\nsection(style='margin-top: 7em')\n  p\n    | {{'appNameShort' | tr}}\n    br\n    span(ng-bind-html='\"about_copyright\" | tr')\n    br\n    span(ng-bind-html='\"about_license\" | tr')\n    br\n    span(ng-bind-html='\"about_credits\" | tr')\n"
  },
  {
    "path": "omega-web/src/partials/apply_options_confirm.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_applyOptions' | tr}}\n.modal-body\n  p {{'options_applyOptionsRequired' | tr}}\n  p {{'options_applyOptionsConfirm' | tr}}\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-primary(type='button' ng-click='$close(\"ok\")') {{'options_apply' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/cannot_delete_profile.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_cannotDeleteProfile' | tr}}\n.modal-body\n  p {{'options_profileReferredBy' | tr}}\n  .well\n    ul.list-style-none\n      li(ng-repeat='p in refs')\n        span(omega-profile-inline='p' options='options' disp-name='dispNameFilter')\n  p {{'options_modifyReferringProfiles' | tr}}\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/delete_attached.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_deleteAttached' | tr}}\n.modal-body\n  p {{'options_deleteAttachedConfirm' | tr}}\n  .well\n    span(omega-profile-icon='attached' options='options')\n    = ' '\n    | {{attached.sourceUrl || ('options_ruleListLineCount' | tr:[attached.ruleList.split('\\n').length])}}\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-danger(type='button' ng-click='$close(\"ok\")') {{'options_deleteAttached' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/delete_profile.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_deleteProfile' | tr}}\n.modal-body\n  p {{'options_deleteProfileConfirm' | tr}}\n  .well\n    span(omega-profile-inline='profile' options='options' disp-name='dispNameFilter')\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-danger(type='button' ng-click='$close(\"ok\")') {{'options_deleteProfile' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/fixed_auth_edit.jade",
    "content": "form(ng-submit='authForm.$valid && $close(auth)' name='authForm')\n  .modal-header\n    button.close(type='button' ng-click='$dismiss()')\n      span(aria-hidden='true') ×\n      span.sr-only Close\n    h4.modal-title {{'options_modalHeader_proxyAuth' | tr}}\n  .modal-body(style='padding-bottom: 0;')\n    .form-group(ng-show='!authSupported')\n      .alert.alert-danger\n        span.glyphicon.glyphicon-warning-sign\n        = ' '\n        | {{\"options_proxy_authNotSupported\" | tr:[protocolDisp]}}\n    .form-group\n      label.sr-only {{'options_proxyAuthUsername' | tr}}\n      div(input-group-clear type='text' model='auth.username' autofocus\n        placeholder='{{\"options_proxyAuthUsername\" | tr}}')\n    .form-group(ng-class='{\"has-error\": !authForm.password.$valid}')\n      label.sr-only {{'options_proxyAuthPassword' | tr}}\n      .input-group\n        input.form-control(type='text' name='password' ng-model='auth.password'\n          ng-attr-type='{{showPassword ? \"text\" : \"password\"}}'\n          placeholder='{{\"options_proxyAuthPassword\" | tr}}' ng-show='!!auth.username')\n        input.form-control(type='text' value='' placeholder='{{\"options_proxyAuthNone\" | tr}}'\n          disabled ng-show='!auth.username')\n        span.input-group-btn\n          button.btn.btn-default(type='button' ng-click='showPassword = !showPassword'\n            title=\"{{(showPassword ? 'options_proxyAuthHidePassword' : 'options_proxyAuthShowPassword') | tr}}\" ng-disabled='!auth.username')\n            span.glyphicon(ng-class='{\"glyphicon-eye-close\": !showPassword, \"glyphicon-eye-open\": !!showPassword}')\n  .modal-footer\n    button.btn.btn-default(type='button' ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n    button.btn.btn-primary(type='submit' ng-disabled='!authForm.$valid') {{'dialog_save' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/general.jade",
    "content": ".page-header\n  h2 {{'options_tab_general' | tr}}\nsection.settings-group\n  h3 {{'options_group_networkRequests' | tr}}\n  div.checkbox\n    label\n      input#revert-proxy-changes(type='checkbox' ng-model='options[\"-monitorWebRequests\"]')\n      span {{'options_monitorWebRequests' | tr}}\n    p.help-block(omega-html=\"'options_monitorWebRequestsHelp' | tr\")\nsection.settings-group.width-limit\n  h3 {{'options_downloadOptions' | tr}}\n  p.help-block {{'options_downloadOptionsHelp' | tr}}\n  .form-group\n    label(for='download-interval') {{'options_downloadInterval' | tr}}\n    select#download-interval.form-control.inline-form-control(ng-model='options[\"-downloadInterval\"]'\n      ng-options='interval as (downloadIntervalI18n(interval) | tr) for interval in downloadIntervals')\nsection.settings-group.width-limit\n  h3 {{'options_group_conflicts' | tr}}\n  p {{'options_conflicts_introduction' | tr}}\n  p.help-text.text-danger\n    span(style='padding: 1px 4px; background: #da4f49; color: #fff; box-shadow: #ccc 1px 1px 1px 1px;') =\n    = ' '\n    | {{'options_conflicts_lowerPriority' | tr}}\n  p.help-text.text-info\n    span.glyphicon.glyphicon-info-sign\n    = ' '\n    span(omega-html=\"'options_conflicts_higherPriority' | tr:[$profile('systemProfile')]\")\n\n  div.checkbox\n    label\n      input#revert-proxy-changes(type='checkbox' ng-model='options[\"-showExternalProfile\"]')\n      span {{'options_showExternalProfile' | tr}}\n  p.help-block(omega-html=\"'options_showExternalProfileHelp' | tr:[$profile('systemProfile'), $profile('externalProfile')]\")\n"
  },
  {
    "path": "omega-web/src/partials/input_group_clear.jade",
    "content": ".input-group\n  input.form-control(ng-model='model' ng-attr-type='{{type}}' ng-pattern='ngPattern || catchAll'\n    placeholder='{{placeholder}}' ng-change='modelChange()')\n  span.input-group-btn\n    button.btn.btn-default.input-group-clear-btn(type='button' ng-click='toggleClear()'\n      ng-disabled='!model && !oldModel' title=\"{{'inputClear_' + (oldModel ? 'restore' : 'clear') | tr}}\")\n      span.glyphicon(ng-class='{\"glyphicon-remove\": !oldModel, \"glyphicon-repeat\": !!oldModel}')\n"
  },
  {
    "path": "omega-web/src/partials/io.jade",
    "content": ".page-header\n  h2 {{'options_tab_importExport' | tr}}\nsection.settings-group\n  h3 {{'options_group_importExportProfile' | tr}}\n  .help-block\n    .text-info\n      span.glyphicon.glyphicon-info-sign\n      = ' '\n      | {{'options_exportProfileHelp' | tr}}\n  div.checkbox(ng-show='!(options[\"-showConditionTypes\"] > 0)')\n    label\n      input(type='checkbox' ng-model='options[\"-exportLegacyRuleList\"]')\n      span {{'options_exportLegacyRuleList' | tr}}\n    p.help-block(omega-html=\"'options_exportLegacyRuleListHelp' | tr\")\nsection.settings-group\n  h3 {{'options_group_importExportSettings' | tr}}\n  p\n    button.btn.btn-default(ng-click='exportOptions()')\n      span.glyphicon.glyphicon-floppy-save\n      = ' '\n      | {{'options_makeBackup' | tr}}\n    span.help-inline {{'options_makeBackupHelp' | tr}}\n  p\n    input#restore-local-file(type='file' omega-upload='restoreLocal($content)'\n      omega-error='restoreLocalError($error)')\n    button.btn.btn-default(ng-click='triggerFileInput()'\n      ladda='restoringLocal' data-spinner-color=\"#000000\")\n      span.glyphicon.glyphicon-folder-open\n      = ' '\n      | {{'options_restoreLocal' | tr}}\n    span.help-inline {{'options_restoreLocalHelp' | tr}}\n  div\n    label {{'options_restoreOnline' | tr}}\n    .input-group.width-limit\n      input.form-control(type='url' ng-model='restoreOnlineUrl' placeholder=\"{{'options_restoreOnlinePlaceholder' | tr}}\")\n      span.input-group-btn\n        button.btn.btn-default(ng-click='restoreOnline()' ladda='restoringOnline' data-spinner-color=\"#000000\")\n          | {{'options_restoreOnlineSubmit' | tr}}\nsection.settings-group\n  h3 {{'options_group_syncing' | tr}}\n  div(ng-show='syncOptions == \"pristine\" || syncOptions == \"disabled\"')\n    p.help-block(omega-html='\"options_syncPristineHelp\" | tr')\n    p\n      button.btn.btn-default(ng-click='enableOptionsSync()')\n        span.glyphicon.glyphicon-cloud-upload\n        = ' '\n        | {{'options_syncEnable' | tr}}\n  div(ng-show='syncOptions == \"sync\"')\n    p.alert.alert-success.width-limit\n      span.glyphicon.glyphicon-ok\n      = ' '\n      | {{\"options_syncSyncAlert\" | tr}}\n    p.help-block(omega-html='\"options_syncSyncHelp\" | tr')\n    p\n      button.btn.btn-warning(ng-click='disableOptionsSync()')\n        span.glyphicon.glyphicon-remove-sign\n        = ' '\n        | {{'options_syncDisable' | tr}}\n  div(ng-show='syncOptions == \"conflict\"')\n    p.alert.alert-info.width-limit\n      span.glyphicon.glyphicon-info-sign\n      = ' '\n      | {{\"options_syncConflictAlert\" | tr}}\n    p.help-block(omega-html='\"options_syncConflictHelp\" | tr')\n    p\n      button.btn.btn-danger(ng-click='enableOptionsSync({force: true})')\n        span.glyphicon.glyphicon-cloud-download\n        = ' '\n        | {{'options_syncEnableForce' | tr}}\n      = ' '\n      button.btn.btn-link(ng-click='resetOptionsSync()')\n        span.glyphicon.glyphicon-erase\n        = ' '\n        | {{'options_syncReset' | tr}}\n  div(ng-show='syncOptions == \"unsupported\"')\n    p.help-block(omega-html='\"options_syncUnsupportedHelp\" | tr')\n"
  },
  {
    "path": "omega-web/src/partials/new_profile.jade",
    "content": "form(ng-submit='newProfile.$valid && $close(profile)' name='newProfile')\n  .modal-header\n    button.close(type='button' ng-click='$dismiss()')\n      span(aria-hidden='true') ×\n      span.sr-only Close\n    h4.modal-title {{'options_modalHeader_newProfile' | tr}}\n  .modal-body\n    .form-group(ng-class='{\"has-error\": !newProfile.profileNewName.$valid}')\n      label(for='profile-new-name') {{'options_newProfileName' | tr}}\n      input#profile-new-name.form-control(type='text' name='profileNewName' required ng-model='profile.name'\n        ui-validate='validateProfileName' autofocus)\n      .help-block(ng-show='newProfile.profileNewName.$error.required') {{'options_profileNameEmpty' | tr}}\n      .help-block(ng-show='newProfile.profileNewName.$error.reserved') {{'options_profileNameReserved' | tr}}\n      .help-block(ng-show='!newProfile.profileNewName.$error.reserved && newProfile.profileNewName.$error.conflict')\n        | {{'options_profileNameConflict' | tr}}\n      .help-block(ng-show='newProfile.profileNewName.$valid && profile.name && isProfileNameHidden(profile.name)')\n        .text-info\n          span.glyphicon.glyphicon-info-sign\n          = ' '\n          | {{'options_profileNameHidden' | tr}}\n    label {{'options_profileType' | tr}}\n    .radio\n      label\n        input(type='radio' name='profile-new-type' value='FixedProfile' ng-model='profile.profileType' ng-init='profile.profileType = \"FixedProfile\"')\n        span.profile-type\n          span.glyphicon(ng-class='profileIcons[\"FixedProfile\"]')\n          = ' '\n          span {{'options_profileTypeFixedProfile' | tr}}\n        .help-block {{'options_profileDescFixedProfile' | tr}}\n    .radio\n      label\n        input(type='radio', name='profile-new-type', value='SwitchProfile' ng-model='profile.profileType')\n        span.profile-type\n          span.glyphicon(ng-class='profileIcons[\"SwitchProfile\"]')\n          = ' '\n          span {{'options_profileTypeSwitchProfile' | tr}}\n        .help-block {{'options_profileDescSwitchProfile' | tr}}\n    .radio\n      label\n        input(type='radio', name='profile-new-type', value='PacProfile' ng-model='profile.profileType' ng-disabled='pacProfilesUnsupported')\n        span.profile-type\n          span.glyphicon(ng-class='profileIcons[\"PacProfile\"]')\n          = ' '\n          span {{'options_profileTypePacProfile' | tr}}\n        .help-block {{'options_profileDescPacProfile' | tr}}\n        .help-block(ng-show='!pacProfilesUnsupported') {{'options_profileDescMorePacProfile' | tr}}\n        .has-error(ng-show='pacProfilesUnsupported')\n          .help-block\n            span.glyphicon.glyphicon-warning-sign\n            = ' '\n            | {{'options_pac_profile_unsupported_moz' | tr}}\n    .radio\n      label\n        input(type='radio', name='profile-new-type', value='VirtualProfile' ng-model='profile.profileType')\n        span.profile-type\n          span.glyphicon.virtual-profile-icon(ng-class='profileIcons[\"VirtualProfile\"]')\n          = ' '\n          span {{'options_profileTypeVirtualProfile' | tr}}\n        .help-block {{'options_profileDescVirtualProfile' | tr}}\n  .modal-footer\n    button.btn.btn-default(type='button' ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n    button.btn.btn-primary(type='submit' ng-disabled='!newProfile.$valid') {{'options_createProfile' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/omega_profile_select.jade",
    "content": ".btn-group.omega-profile-select(dropdown on-toggle=\"toggled(open)\")\n  button.btn.btn-default.dropdown-toggle(dropdown-toggle type='button' aria-expanded='false'\n    role='listbox' aria-haspopup='true')\n    span(omega-profile-icon='selectedProfile' options='options' icon='selectedProfile ? undefined : \"glyphicon-time\"')\n    = ' '\n    span(ng-show='!!profileName') {{getName(selectedProfile)}}\n    span(ng-show='!profileName') {{defaultText}}\n    = ' '\n    span.caret\n  ul.dropdown-menu(role='listbox')\n    li(role='option' ng-if='!!defaultText' ng-class='{active: profileName == \"\"}')\n      a(ng-click='setProfileName(\"\")')\n        span.glyphicon.glyphicon-time\n        = ' {{defaultText}}'\n    li(role='option' ng-repeat='profile in dispProfiles' ng-class='{active: profileName == profile.name}')\n      a(ng-click='setProfileName(profile.name)')\n        span(omega-profile-icon='profile' options='options')\n        = ' {{getName(profile)}}'\n"
  },
  {
    "path": "omega-web/src/partials/options_welcome.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_welcome' | tr}}\n.modal-body\n  p(ng-show=\"upgrade\") {{'options_welcomeUpgrade' | tr}}\n  p(ng-show=\"upgrade\") {{'options_welcomeUpgradeGuide' | tr}}\n  p(ng-show=\"!upgrade\") {{'options_welcomeNormal' | tr}}\n  p(ng-show=\"!upgrade\") {{'options_welcomeNormalGuide' | tr}}\n.modal-footer\n  button.btn.btn-default(ng-click='$close(\"skip\")') {{'options_guideSkip' | tr}}\n  button.btn.btn-primary(type='button' ng-click='$close(\"show\")') {{'options_guideNext' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/profile.jade",
    "content": ".page-header\n  .profile-actions\n    button.btn(ng-show='exportRuleList' ng-click='exportRuleList(profile.name)'\n      title=\"{{'options_profileExportRuleListHelp' | tr}}\"\n      ng-class=\"exportRuleListOptions.warning ? 'btn-warning' : 'btn-default'\")\n      span.glyphicon.glyphicon-list\n      = ' '\n      | {{'options_profileExportRuleList' | tr}}\n    = ' '\n    button.btn.btn-default(ng-show='scriptable' ng-click='exportScript(profile.name)' title=\"{{'options_exportPacFileHelp' | tr}}\")\n      span.glyphicon.glyphicon-download\n      = ' '\n      | {{'options_profileExportPac' | tr}}\n    = ' '\n    button.btn.btn-default(ng-click='renameProfile(profile.name)')\n      span.glyphicon.glyphicon-edit\n      = ' '\n      | {{'options_renameProfile' | tr}}\n    = ' '\n    button.btn.btn-danger(ng-click='deleteProfile(profile.name)')\n      span.glyphicon.glyphicon-trash\n      = ' '\n      | {{'options_deleteProfile' | tr}}\n  span.profile-color-editor\n    .profile-color-editor-fake(ng-if='profile.profileType == \"VirtualProfile\"'\n      ng-style=\"{'background-color': getProfileColor()}\")\n    x-spectrum-colorpicker(ng-model='profile.color' options='spectrumOptions'\n      ng-if='profile.profileType != \"VirtualProfile\"')\n  h2.profile-name {{'options_profileTabPrefix' | tr}}{{profile.name}}\nsection.settings-group(ng-show='profile.syncOptions == \"disabled\"')\n  p.alert.alert-info.width-limit(ng-show='!profile.syncError')\n    span.glyphicon.glyphicon-info-sign\n    = ' '\n    | {{'Syncing is disabled for this profile.'}}\n  p.alert.alert-danger.width-limit(ng-show='!!profile.syncError')\n    span.glyphicon.glyphicon-remove\n    = ' '\n    | {{('options_profileSyncDisabled_' + profile.syncError.reason) | tr}}\ndiv(ng-include='profileTemplate')\n"
  },
  {
    "path": "omega-web/src/partials/profile_fixed.jade",
    "content": "div(ng-controller='FixedProfileCtrl')\n  section.settings-group.settings-group-fixed-servers\n    h3 {{'options_group_proxyServers' | tr}}\n    .table-responsive\n      table.fixed-servers.table.table-bordered.table-striped.width-limit-lg\n        thead\n          tr\n            th {{'options_proxy_scheme' | tr}}\n            th {{'options_proxy_protocol' | tr}}\n            th {{'options_proxy_server' | tr}}\n            th {{'options_proxy_port' | tr}}\n            th\n        tbody\n          tr(ng-repeat='scheme in urlSchemes' ng-show='scheme == \"\" || showAdvanced')\n            td {{schemeDisp[scheme] || ('options_scheme_default' | tr)}}\n            td\n              select.form-control(ng-model='proxyEditors[scheme].scheme'\n                ng-options='opt.value as opt.label for opt in optionsForScheme[scheme]')\n            td(ng-if='proxyEditors[scheme].scheme')\n              input.form-control(type='text' ng-model='proxyEditors[scheme].host' required)\n            td(ng-if='!proxyEditors[scheme].scheme')\n              input.form-control(type='text' value='' placeholder='{{proxyEditors[\"\"].host}}' disabled)\n\n            td(ng-if='proxyEditors[scheme].scheme')\n              input.form-control(type='number' min='1' ng-model='proxyEditors[scheme].port' required)\n            td(ng-if='!proxyEditors[scheme].scheme')\n              input.form-control(type='number' value='' placeholder='{{proxyEditors[\"\"].port}}' disabled)\n            td.proxy-actions\n              button.btn.btn-xs.proxy-auth-toggle(\n                ng-class='isProxyAuthActive(scheme) ? \"btn-success\" : \"btn-default\"'\n                type='button' role='button' ng-click='editProxyAuth(scheme)' title='{{\"options_proxy_auth\" | tr}}')\n                span.glyphicon.glyphicon-lock\n        tbody(ng-show='!showAdvanced')\n          tr.fixed-show-advanced\n            td(colspan='7')\n              button.btn.btn-link(ng-click='showAdvanced = true')\n                | #[span.glyphicon.glyphicon-chevron-down] {{'options_proxy_expand' | tr}}\n  section.settings-group\n    h3 {{'options_group_bypassList' | tr}}\n    p.help-block {{'options_bypassListHelp' | tr}}\n    p.help-block\n      a(href='https://developer.chrome.com/extensions/proxy#bypass_list' target='_blank')\n        | {{'options_bypassListHelpLinkText' | tr}}\n    textarea.monospace.form-control.width-limit(rows='10' ng-model='bypassList' ng-model-options=\"{updateOn:'blur'}\")\n"
  },
  {
    "path": "omega-web/src/partials/profile_pac.jade",
    "content": "div(ng-controller='PacProfileCtrl')\n  p.alert.alert-danger.width-limit(ng-show='pacProfilesUnsupported')\n    span.glyphicon.glyphicon-remove\n    = ' '\n    | {{'options_pac_profile_unsupported_moz' | tr}}\n  section.settings-group\n    h3 {{'options_group_pacUrl' | tr}}\n    .width-limit(input-group-clear type='text' model='profile.pacUrl'\n      ng-pattern='referenced ? urlRegex : urlWithFile' controller='pacUrlCtrl.ctrl')\n    p.help-block {{'options_pacUrlHelp' | tr}}\n    .has-warning(ng-show='pacUrlIsFile && !referenced')\n      p.help-block #[span.glyphicon.glyphicon-warning-sign] {{'options_pacUrlFile' | tr}}\n    .has-error(ng-show='isFileUrl(pacUrlCtrl.ctrl.$viewValue) && referenced')\n      p.help-block #[span.glyphicon.glyphicon-remove-sign] {{'options_pacUrlFile' | tr}}\n      p.help-block {{'options_pacUrlFileDisabled' | tr}}\n    p(ng-show='profile.pacUrl && !pacUrlIsFile')\n      button.btn(ng-click='updateProfile(profile.name)'\n        ladda='updatingProfile[profile.name]' data-spinner-color=\"#000000\"\n        ng-class='profile.pacUrl && !profile.lastUpdate ? \"btn-primary\" : \"btn-default\"')\n        | #[span.glyphicon.glyphicon-download-alt] {{'options_downloadProfileNow' | tr}}\n  section.settings-group\n    h3\n      | {{'options_group_pacScript' | tr}}\n      = ' '\n      button.btn.btn-xs.proxy-auth-toggle(ng-class='profile.auth[\"all\"] ? \"btn-success\" : \"btn-default\"'\n        type='button' role='button' ng-click='editProxyAuth()' title='{{\"options_proxy_auth\" | tr}}')\n        span.glyphicon.glyphicon-lock\n    div.alert.alert-warning.width-limit(ng-show='profile.auth[\"all\"]')\n      p {{'options_proxy_authAllWarningPac' | tr}}\n      p(ng-show='!!profile.pacUrl') {{'options_proxy_authAllWarningPacUrl' | tr}}\n      p(ng-show='!profile.pacUrl') {{'options_proxy_authAllWarningPacScript' | tr}}\n      p(ng-show='!!referenced')\n        | #[span.glyphicon.glyphicon-warning-sign] {{'options_proxy_authReferencedWarning' | tr}}\n    div(ng-hide='pacUrlIsFile')\n      p.alert.alert-success.width-limit(ng-show='profile.pacUrl && profile.lastUpdate')\n        | {{'options_pacScriptLastUpdate' | tr:[(profile.lastUpdate | date:'medium')]}}\n      p.alert.alert-danger.width-limit(ng-show='profile.pacUrl && !profile.lastUpdate')\n        | {{'options_pacScriptObsolete' | tr}}\n      textarea.monospace.form-control.width-limit(ng-model='profile.pacScript' rows=20\n        ng-disabled='pacUrlCtrl.ctrl.$invalid || !!profile.pacUrl')\n"
  },
  {
    "path": "omega-web/src/partials/profile_rule_list.jade",
    "content": "div(ng-controller='RuleListProfileCtrl')\n  section.settings-group\n    h3 {{'options_group_ruleListConfig' | tr}}\n    .form-group\n      label {{'options_ruleListMatchProfile' | tr}}\n      = ' '\n      div(omega-profile-select='options | profiles:profile' ng-model='profile.matchProfileName'\n        disp-name='dispNameFilter' options='options' style='display: inline-block;')\n    .form-group\n      label {{'options_ruleListDefaultProfile' | tr}}\n      = ' '\n      div(omega-profile-select='options | profiles:profile' ng-model='profile.defaultProfileName'\n        disp-name='dispNameFilter' options='options' style='display: inline-block;')\n    form.form-group\n      label {{'options_ruleListFormat' | tr}}\n      .radio.inline-form-control.no-min-width(ng-repeat='format in ruleListFormats')\n        label\n          input(type='radio' name='formatInput' value='{{format}}' ng-model='profile.format')\n          | {{'ruleListFormat_' + format | tr}}\n  section.settings-group\n    h3 {{'options_group_ruleListUrl' | tr}}\n    .width-limit(input-group-clear type='url' model='profile.sourceUrl' ng-if='profile')\n    p.help-block {{'options_ruleListUrlHelp' | tr}}\n  section.settings-group\n    h3 {{'options_group_ruleListText' | tr}}\n    p\n      button.btn.btn-default(ng-disabled='!profile.sourceUrl' ng-click='updateProfile(profile.name)'\n          ladda='updatingProfile[profile.name]' data-spinner-color=\"#000000\")\n        | #[span.glyphicon.glyphicon-download-alt] {{'options_downloadProfileNow' | tr}}\n    textarea.monospace.form-control.width-limit(ng-model='profile.ruleList' rows=20\n      ng-disabled='!!profile.sourceUrl')\n\n"
  },
  {
    "path": "omega-web/src/partials/profile_switch.jade",
    "content": "div(ng-controller='SwitchProfileCtrl')\n  section.condition-help-section.settings-group(ng-show='conditionHelp.show' ng-init='expandedSection = {id: 0}')\n    h3\n      | {{'options_group_conditionHelp' | tr}}\n      button.close.close-condition-help(type='button' ng-click='conditionHelp.show = false')\n        span(aria-hidden='true') ×\n        span.sr-only {{'dialog_close' | tr}}\n    div.condition-help(ng-repeat='group in (showConditionTypes == 0 ? basicConditionTypes : advancedConditionTypes)')\n      h4(ng-show=\"!!('condition_group_' + group.group | tr)\")\n        a(ng-click='expandedSection.id = $index' role='button')\n          span.glyphicon(ng-class=\"{'glyphicon-chevron-down': expandedSection.id == $index, 'glyphicon-chevron-right': expandedSection.id != $index}\")\n          = ' '\n          | {{'condition_group_' + group.group | tr}}\n      dl(ng-show='expandedSection.id == $index')\n        dt(ng-repeat-start='type in group.types') {{'condition_' + type | tr}}\n        dd(ng-repeat-end)\n          div(ng-bind-html='\"condition_help_\" + type | tr')\n          .text-danger(ng-if='isUrlConditionType[type]')\n            span.glyphicon.glyphicon-alert\n            = ' '\n            span(ng-bind-html='\"condition_alert_fullUrlLimitation\" | tr')\n  section.settings-group\n    h3\n      | {{'options_group_switchRules' | tr}}\n      = ' '\n      button.btn(ng-click='toggleSource()' ng-class='editSource ? \"btn-primary active\" : \"btn-default\"')\n        span.glyphicon.glyphicon-edit\n        = ' '\n        | {{'options_profileEditSource' | tr}}\n      = ' '\n      a.btn.btn-link.btn-sm.clear-padding.toggle-condition-help(\n        ng-show='editSource' target='_blank' \n        title='{{\"options_profileEditSourceHelp\" | tr}}'\n        href='{{\"options_profileEditSourceHelpUrl\" | tr}}')\n        span.glyphicon.glyphicon-question-sign\n    .alert.alert-danger.width-limit(ng-show='source.error')\n      span.glyphicon.glyphicon-remove\n      = ' '\n      | {{source.error.message}}\n    .alert.alert-danger(ng-show='!!hasUrlConditions')\n      span.glyphicon.glyphicon-alert\n      = ' '\n      span(ng-bind-html='\"condition_alert_fullUrlLimitation\" | tr')\n    .rules-source(ng-show='editSource')\n      textarea.monospace.form-control.width-limit(ng-model='source.code' rows=20 ng-change='source.touched = true; $root.optionsDirty = true')\n    .table-responsive.switch-rules-wrapper(ng-if='loadRules' ng-show='!editSource')\n      table.switch-rules.table.table-bordered.table-condensed.width-limit-xl\n        thead\n          tr\n            th(style='white-space: nowrap') {{'options_sort' | tr}}\n            th.condition-type-th\n              | {{'options_conditionType' | tr}}\n              = ' '\n              button.btn.btn-link.btn-sm.clear-padding.toggle-condition-help(\n                title='{{\"options_showConditionTypeHelp\" | tr}}'\n                ng-click='conditionHelp.show = !conditionHelp.show')\n                span.glyphicon.glyphicon-question-sign\n            th {{'options_conditionDetails' | tr}}\n            th {{'options_resultProfile' | tr}}\n            th {{'options_conditionActions' | tr}}\n            th(ng-if='showNotes') {{'options_ruleNote' | tr}}\n        tbody(ui-sortable='sortableOptions' ng-model='profile.rules')\n          tr.switch-rule-row(ng-repeat='rule in profile.rules')\n            td.sort-bar\n              span.glyphicon.glyphicon-sort\n            td(ng-class='{\"has-icon\": isUrlConditionType[rule.condition.conditionType]}')\n              select.form-control(ng-model='rule.condition.conditionType'\n                ng-options='type.type as (\"condition_\" + type.type | tr) group by (type.group | tr) for type in conditionTypes')\n              a.icon-wrapper(ng-href='{{\"condition_alert_fullUrlLimitationLink\" | tr}}' target='_blank' ng-if='isUrlConditionType[rule.condition.conditionType]')\n                span.glyphicon.glyphicon-alert.text-danger\n            td(ng-switch='rule.condition.conditionType' ng-class='{\"has-warning\": conditionHasWarning(rule.condition)}')\n              span(ng-switch-when='FalseCondition')\n                span(ng-show='!!rule.condition.pattern')\n                  input.form-control(ng-model='rule.condition.pattern' disabled title=\"{{'condition_details_FalseCondition' | tr}}\")\n                span(ng-show='!rule.condition.pattern') {{'condition_details_FalseCondition' | tr}}\n              span.host-levels-details(ng-switch-when='HostLevelsCondition')\n                input.form-control(type='number' min='1' max='99' ng-model='rule.condition.minValue' required)\n                = ' '\n                span {{'options_hostLevelsBetween' | tr}}\n                = ' '\n                input.form-control(type='number' max='99' min='1' ng-model='rule.condition.maxValue' required)\n              span(ng-switch-when='IpCondition')\n                input.form-control(type='text' ng-model='rule.condition' required\n                  omega-ip2str placeholder='127.0.0.1/8'\n                  ui-validate='{pattern: \"validateIpCondition(rule.condition, $value)\"}')\n              span.host-levels-details(ng-switch-when='TimeCondition')\n                input.form-control(type='number' min='0' max='23' ng-model='rule.condition.startHour' required)\n                = ' '\n                span {{'options_hourBetween' | tr}}\n                = ' '\n                input.form-control(type='number' min='0' max='23'\n                  ng-model='rule.condition.endHour' required)\n              span.host-levels-details(ng-switch-when='WeekdayCondition')\n                label.checkbox-inline(ng-repeat='selected in getWeekdayList(rule.condition) track by $index')\n                  input(type='checkbox' ng-model='selected' ng-change='updateDay(rule.condition, $index, selected)')\n                  = '{{\"options_weekDayShort_\" + $index | tr}} '\n              input.form-control(ng-model='rule.condition.pattern' ng-switch-default required\n                ui-validate='{pattern: \"validateCondition(rule.condition, $value)\"}')\n            td.switch-rule-row-target\n              div(omega-profile-select='options | profiles:profile' ng-model='rule.profileName'\n                disp-name='dispNameFilter' options='options'\n                ng-class='{disabled: rule.condition.conditionType == \"NeverCondition\"}')\n            td\n              button.btn.btn-danger.btn-sm(title=\"{{'options_deleteRule' | tr}}\" ng-click='removeRule($index)')\n                span.glyphicon.glyphicon-trash\n              = ' '\n              button.btn.btn-default.btn-sm(title=\"{{'options_cloneRule' | tr}}\" ng-click='cloneRule($index)')\n                span.glyphicon.glyphicon-duplicate\n              button.btn.btn-default.btn-sm(title=\"{{'options_ruleNote' | tr}}\" ng-if='!showNotes' ng-click='addNote($index)')\n                span.glyphicon.glyphicon-comment\n            td(ng-if='showNotes')\n              input.form-control(ng-model='rule.note')\n        tbody\n          tr\n            td(style='border-right: none;')\n            td(style='border-left: none;' colspan='4' ng-attr-colspan='{{showNotes ? 5 : 4}}')\n              button.btn.btn-default.btn-sm(ng-click='addRule()')\n                span.glyphicon.glyphicon-plus\n                = ' '\n                span {{'options_addCondition' | tr}}\n        tbody.switch-attached(ng-if='attached')\n          tr\n            td(style='border-right: none;')\n              span.glyphicon(class='{{profileIcons[\"RuleListProfile\"]}}')\n            td(style='border-left: none;')\n              span.checkbox\n                label\n                  input(type='checkbox' ng-model='attachedOptions.enabled')\n                  | {{'options_switchAttachedProfileInCondition' | tr}}\n            td\n              span(ng-show='!!attachedOptions.enabled')\n                | {{'options_switchAttachedProfileInConditionDetails' | tr}}\n              span(ng-show='!attachedOptions.enabled')\n                | {{'options_switchAttachedProfileInConditionDisabled' | tr}}\n            td\n              div(omega-profile-select='options | profiles:profile' ng-model='attached.matchProfileName'\n                disp-name='dispNameFilter' options='options' ng-class='{disabled: !attachedOptions.enabled}')\n            td\n              button.btn.btn-danger.btn-sm(title=\"{{'options_deleteAttached' | tr}}\" ng-click='removeAttached()')\n                span.glyphicon.glyphicon-trash\n            td(ng-if='showNotes')\n        tbody\n          tr.switch-default-row\n            td\n            td(colspan='2') {{'options_switchDefaultProfile' | tr}}\n            td\n              div(omega-profile-select='options | profiles:profile' ng-model='attachedOptions.defaultProfileName'\n                disp-name='dispNameFilter' options='options')\n            td\n              button.btn.btn-info.btn-sm(title=\"{{'options_resetRules_help' | tr}}\" ng-click='resetRules()')\n                span.glyphicon.glyphicon-chevron-up\n            td(ng-if='showNotes')\n  section.settings-group(ng-if='!attached')\n    h3 {{'options_group_attachProfile' | tr}}\n    p.help-block {{'options_attachProfileHelp' | tr}}\n    button.btn.btn-default(ng-click='attachNew()')\n      span.glyphicon.glyphicon-plus\n      = ' '\n      | {{'options_attachProfile' | tr}}\n  section.settings-group(ng-if='attached')\n    h3 {{'options_group_ruleListConfig' | tr}}\n    form\n      .form-group\n        label {{'options_ruleListFormat' | tr}}\n        .radio.inline-form-control.no-min-width(ng-repeat='format in ruleListFormats')\n          label\n            input(type='radio' name='formatInput' value='{{format}}' ng-model='attached.format')\n            | {{'ruleListFormat_' + format | tr}}\n      .form-group\n        label {{'options_group_ruleListUrl' | tr}}\n        .width-limit.inline-form-control(input-group-clear type='url' model='attached.sourceUrl'\n          style='vertical-align: middle')\n      p.help-block {{'options_ruleListUrlHelp' | tr}}\n    p\n      button.btn.btn-default(ng-disabled='!attached.sourceUrl' ng-click='updateProfile(attached.name)'\n          ladda='updatingProfile[attached.name]' data-spinner-color=\"#000000\"\n          ng-class='attached.sourceUrl && !attached.lastUpdate ? \"btn-primary\" : \"btn-default\"')\n        | #[span.glyphicon.glyphicon-download-alt] {{'options_downloadProfileNow' | tr}}\n  section.settings-group(ng-if='attached')\n    h3 {{'options_group_ruleListText' | tr}}\n    p.alert.alert-success.width-limit(ng-show='attached.sourceUrl && attached.lastUpdate')\n      | {{'options_ruleListLastUpdate' | tr:[(attached.lastUpdate | date:'medium')]}}\n    p.alert.alert-danger.width-limit(ng-show='attached.sourceUrl && !attached.lastUpdate')\n      | {{'options_ruleListObsolete' | tr}}\n    p.alert.alert-danger.width-limit(ng-show='attachedRuleListError')\n      span.glyphicon.glyphicon-remove\n      = ' '\n      | {{attachedRuleListError.message}}\n    textarea#attached-rulelist.monospace.form-control.width-limit(rows=20\n      ng-model='attached.ruleList' ng-disabled='!!attached.sourceUrl')\n"
  },
  {
    "path": "omega-web/src/partials/profile_unsupported.jade",
    "content": ".lead\n  | {{'options_profileUnsupported' | tr:profile.profileType}}\np {{'options_profileUnsupportedHelp' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/profile_virtual.jade",
    "content": "div\n  section.settings-group\n    h3 {{'options_group_virtualProfile' | tr}}\n    p.help-block\n      | {{'options_virtualProfileTargetHelp' | tr}}\n    .form-group\n      label {{'options_virtualProfileTarget' | tr}}\n      = ' '\n      div(omega-profile-select='options | profiles:profile' ng-model='profile.defaultProfileName'\n        disp-name='dispNameFilter' style='display: inline-block;' options='options')\n  section.settings-group\n    h3 {{'options_group_virtualProfileReplace' | tr}}\n    p.help-block(omega-html='\"options_virtualProfileReplaceHelp\" | tr:[$profile(\"profileByName(profile.defaultProfileName)\")]')\n    .form-group\n      button.btn.btn-default(ng-click='replaceProfile(profile.defaultProfileName, profile.name)')\n        span.glyphicon.glyphicon-search\n        = ' '\n        | {{'options_virtualProfileReplace' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/rename_profile.jade",
    "content": "form(ng-submit='renameProfile.$valid && $close(newName)' name='renameProfile')\n  .modal-header\n    button.close(type='button' ng-click='$dismiss()')\n      span(aria-hidden='true') ×\n      span.sr-only {{'dialog_close' | tr}}\n    h4.modal-title {{'options_modalHeader_renameProfile' | tr}}\n  .modal-body\n    .form-group(ng-class='{\"has-error\": !renameProfile.profileNewName.$valid}')\n      label(for='profile-new-name') {{'options_renameProfileName' | tr}}\n      input#profile-new-name.form-control(type='text' name='profileNewName' required ng-model='newName'\n        ui-validate='validateProfileName' ng-init='newName = fromName')\n      .help-block(ng-show='renameProfile.profileNewName.$error.required') {{'options_profileNameEmpty' | tr}}\n      .help-block(ng-show='renameProfile.profileNewName.$error.reserved') {{'options_profileNameReserved' | tr}}\n      .help-block(ng-show='!renameProfile.profileNewName.$error.reserved && renameProfile.profileNewName.$error.conflict')\n        | {{'options_profileNameConflict' | tr}}\n      .help-block(ng-show='renameProfile.profileNewName.$valid && newName && isProfileNameHidden(newName)')\n        .text-info\n          span.glyphicon.glyphicon-info-sign\n          = ' '\n          | {{'options_profileNameHidden' | tr}}\n  .modal-footer\n    button.btn.btn-default(type='button' ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n    button.btn.btn-primary(type='submit' ng-disabled='!renameProfile.$valid') {{'options_renameProfile' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/replace_profile.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_replaceProfile' | tr}}\n.modal-body\n  p(omega-html='\"options_replaceProfileConfirm\" | tr:[profileSelect(\"fromName\"), profileSelect(\"toName\")]')\n  .well\n    span(omega-profile-inline='profileByName(fromName)' options='options' disp-name='dispNameFilter')\n    = ' '\n    span.glyphicon.glyphicon-chevron-right\n    = ' '\n    span(omega-profile-inline='profileByName(toName)' options='options' disp-name='dispNameFilter')\n  .help-block(omega-html=\"'options_replaceProfileHelp' | tr:[$profile('profileByName(fromName)'), $profile('profileByName(toName)')]\")\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-warning(type='button' ng-click='$close({fromName: fromName, toName: toName})') {{'options_replaceProfile' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/reset_options_confirm.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_resetOptions' | tr}}\n.modal-body\n  p.text-danger {{'options_resetOptionsConfirm' | tr}}\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-danger(type='button' ng-click='$close(\"ok\")') {{'options_reset' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/rule_remove_confirm.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_deleteRule' | tr}}\n.modal-body\n  p {{'options_deleteRuleConfirm' | tr}}\n  div.well\n    span.label.label-info {{'condition_' + rule.condition.conditionType | tr}}\n    = ' '\n    | {{rule.condition.pattern}}\n    span.pull-right\n      span(omega-profile-inline='ruleProfile' disp-name='dispNameFilter' options='options')\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-danger(type='button' ng-click='$close(\"ok\")') {{'options_deleteRule' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/rule_reset_confirm.jade",
    "content": ".modal-header\n  button.close(type='button' ng-click='$dismiss()')\n    span(aria-hidden='true') ×\n    span.sr-only {{'dialog_close' | tr}}\n  h4.modal-title {{'options_modalHeader_resetRules' | tr}}\n.modal-body\n  p {{'options_resetRulesConfirm' | tr}}\n  .well\n    span(omega-profile-inline='ruleProfile' disp-name='dispNameFilter' options='options')\n.modal-footer\n  button.btn.btn-default(ng-click='$dismiss()') {{'dialog_cancel' | tr}}\n  button.btn.btn-warning(type='button' ng-click='$close(\"ok\")') {{'options_resetRules' | tr}}\n"
  },
  {
    "path": "omega-web/src/partials/ui.jade",
    "content": ".page-header\n  h2 {{'options_tab_ui' | tr}}\nsection.settings-group\n  h3 {{'options_group_miscOptions' | tr}}\n  div.checkbox\n    label\n      input(type='checkbox' ng-model='options[\"-confirmDeletion\"]')\n      span {{'options_confirmDeletion' | tr}}\n  div.checkbox\n    label\n      input#refresh-on-profile-change(type='checkbox' ng-model='options[\"-refreshOnProfileChange\"]')\n      span {{'options_refreshOnProfileChange' | tr}}\n  div.checkbox\n    label\n      input(type='checkbox' ng-model='options[\"-showInspectMenu\"]')\n      span {{'options_showInspectMenu' | tr}}\n  div.checkbox\n    label\n      input(type='checkbox' ng-model='options[\"-addConditionsToBottom\"]')\n      span {{'options_addConditionsToBottom' | tr}}\nsection.settings-group\n  h3 {{'options_group_keyboardShortcut' | tr}}\n  p\n    button.btn.btn-default(type='button' role='button' ng-click='openShortcutConfig()')\n      span.glyphicon.glyphicon-share-alt\n      = ' '\n      | {{'options_menuShortcutConfigure' | tr}}\n    = ' '\n    | {{'options_menuShortcutHelp' | tr}}\n  p.help-block\n      | {{'options_menuShortcutMore' | tr}}\nsection.settings-group\n  h3 {{'options_group_switchOptions' | tr}}\n  div.form-group\n    label {{'options_startupProfile' | tr}}\n    = ' '\n    div(omega-profile-select='options | profiles:\"all\"' ng-model='options[\"-startupProfileName\"]'\n      default-text=\"{{'options_startupProfile_none' | tr}}\" disp-name='dispNameFilter'\n      style='display: inline-block;' options='options')\n  div.checkbox\n    label\n      input(type='checkbox' ng-model='options[\"-showConditionTypes\"]' ng-true-value='1' ng-false-value='0')\n      span {{'options_showConditionTypesAdvanced' | tr}}\n    p.help-block\n      | {{'options_showConditionTypesAdvancedHelp' | tr}}\n  div.checkbox\n    label\n      input(type='checkbox' ng-model='options[\"-enableQuickSwitch\"]')\n      span {{'options_quickSwitch' | tr}}\n  #quick-switch-settings.settings-group(ng-show='options[\"-enableQuickSwitch\"]' ng-controller='QuickSwitchCtrl')\n    h4 {{'options_cycledProfiles' | tr}}\n    p.help-block {{'options_cycledProfilesHelp' | tr}}\n    div.has-error(ng-show='options[\"-quickSwitchProfiles\"].length < 2')\n      p.help-block {{'options_cycledProfilesTooFew' | tr}}\n    ul.cycle-profile-container.cycle-enabled(ui-sortable=\"sortableOptions\"\n      ng-model='options[\"-quickSwitchProfiles\"]')\n      li(ng-repeat='name in options[\"-quickSwitchProfiles\"]')\n        span(omega-profile-inline='profileByName(name)' options='options' disp-name='dispNameFilter')\n    h4 {{'options_notCycledProfiles' | tr}}\n    ul.cycle-profile-container(ui-sortable=\"sortableOptions\" ng-model='notCycledProfiles')\n      li.bg-success(ng-repeat='name in notCycledProfiles')\n        span(omega-profile-inline='profileByName(name)' options='options' disp-name='dispNameFilter')\n"
  },
  {
    "path": "omega-web/src/popup/css/dialog.css",
    "content": "/*!\n * Copyright 2017 The SwitchyOmega Authors. Please see the AUTHORS file\n * for details.\n * Based on Bootstrap v3.3.2 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n*/\n\n/* Dialog */\n\nbody, html {\n  margin: 0;\n  padding: 0;\n}\n\np {\n  margin: 0 0 1em 0;\n}\n\n.om-dialog {\n  min-width: 400px;\n  padding: 10px 10px;\n  font-size: 14px;\n}\n\n  .om-text-danger {\n    color: #a94442;\n  }\n\n  .om-dialog-help {\n    display: block;\n    margin-top: 5px;\n    margin-bottom: 10px;\n    color: #737373;\n  }\n\n  .om-dialog-controls {\n    margin-bottom: 0;\n  }\n\n  .om-dialog-controls .om-btn-primary {\n    float: right;\n  }\n\n/* Button */\n\n.om-btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: 400;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n  touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px\n}\n\n.om-btn.active, .om-btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n  box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n}\n\n.om-btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n\n.om-btn-default:hover {\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n\n.om-btn-link {\n  font-weight: 400;\n  color: #337ab7;\n  border-radius: 0;\n  background-color: rgba(0, 0, 0, 0);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  border-color: rgba(0, 0, 0, 0);\n}\n\n.om-btn-link:hover {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.om-btn-link:active {\n  background-color: rgba(0, 0, 0, 0);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.om-btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n\n.om-btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n"
  },
  {
    "path": "omega-web/src/popup/css/index.css",
    "content": "/*!\n * Copyright 2017 The SwitchyOmega Authors. Please see the AUTHORS file\n * for details.\n * Based on Bootstrap v3.3.2 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n*/\n\n/* Layout */\n\nhtml, body {\n  font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n  font-size: 14px;\n  padding: 0;\n  margin: 0;\n}\n\nbody {\n  min-width: 12em;\n}\n\n.om-hidden {\n  display: none !important;\n}\n\n/* Menu */\n\n.om-nav {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n  .om-nav-item {\n    display: block;\n    margin: 2px 0;\n  }\n\n    .om-nav-item > a > .glyphicon {\n      margin-right: 8px;\n    }\n\n    .om-nav-item > a {\n      display: block;\n      padding: 5px 25px 5px 8px;\n      border-radius: 4px;\n      line-height: 1.5em;\n      font-size: 1em;\n      color: #337ab7;\n      text-decoration: none;\n      white-space: nowrap;\n      cursor: pointer;\n    }\n    .om-nav-item > a:hover {\n      text-decoration: none;\n      background-color: #eee;\n    }\n    .om-nav-item > a:hover {\n      color: #23527c;\n    }\n    .om-nav-item.om-effective > a {\n      background-color: #d9edf7;\n    }\n    .om-nav-item.om-active > a {\n      color: #fff;\n      background-color: #337ab7;\n    }\n\n  .om-divider {\n    height: 1px;\n    overflow: hidden;\n    background-color: #E5E5E5;\n  }\n\n  .om-reqinfo {\n    background-color: #fcf8e3;\n  }\n\n  .glyphicon-warning-sign {\n    color: #8a6d3b;\n  }\n\n/* Dropdown */\n\n.om-dropdown {\n  display: none;\n  list-style: none;\n  padding: 5px 0;\n  margin: 0 5px !important;\n  border: 1px solid rgba(0,0,0,.15);\n  border-radius: 4px;\n  box-shadow: 0 6px 12px rgba(0,0,0,.175);\n}\n\n.om-open .om-dropdown {\n  display: block;\n}\n\n.om-dropdown .om-nav-item {\n  margin: 0;\n}\n\n.om-dropdown .om-nav-item > a {\n  padding: 3px 20px;\n  line-height: 1.3em;\n  margin: 0;\n}\n\n.om-caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n\n.om-virtual-profile-icon {\n  border: dotted 1px;\n  margin: -1px;\n}\n\n/* Default Edit */\n\n.om-has-edit {\n  padding-right: 32px;\n  position: relative;\n}\n\n  .om-edit-toggle {\n    background-color: #fff;\n    border: 1px solid #ccc;\n    color: #337ab7;\n    display: inline-block;\n    margin: -5px 0;\n    text-align: center;\n    padding: 5px 8px 3px;\n    position: absolute;\n    right: 0;\n  }\n\n  .om-edit-toggle:hover {\n    background-color: #e6e6e6;\n    border-color: #adadad;\n  }\n\n/* Keyboard */\n\n.om-keyboard-help {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  border: solid 1px #000;\n  border-radius: 2px;\n  display: inline-block;\n  color: #000;\n  box-shadow: 1px 1px;\n  width: 1em;\n  height: 1em;\n  line-height: 1em;\n  text-align: center;\n  margin-top: -3px;\n}\n\n/* Glyphicons */\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url(../../../lib/bootstrap/fonts/glyphicons-halflings-regular.eot);\n  src: url(../../../lib/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../../../lib/bootstrap/fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../../../lib/bootstrap/fonts/glyphicons-halflings-regular.woff) format('woff'),url(../../../lib/bootstrap/fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../../../lib/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-warning-sign:before {\n    content: \"\\e107\";\n}\n.glyphicon-file:before {\n    content: \"\\e022\"\n}\n.glyphicon-globe:before {\n    content: \"\\e135\"\n}\n.glyphicon-question-sign:before {\n    content: \"\\e085\"\n}\n.glyphicon-list:before {\n    content: \"\\e056\"\n}\n.glyphicon-retweet:before {\n    content: \"\\e115\"\n}\n.glyphicon-plus:before {\n    content: \"\\2b\"\n}\n.glyphicon-filter:before {\n    content: \"\\e138\"\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\"\n}\n.glyphicon-chevron-down:before {\n    content: \"\\e114\";\n}\n"
  },
  {
    "path": "omega-web/src/popup/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>SwitchyOmega Popup</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <link rel=\"stylesheet\" href=\"css/index.css\">\n</head>\n<body>\n  <ul class=\"om-nav\">\n    <li class=\"om-nav-item\" id=\"js-profile-tpl\">\n      <a href=\"#\" id=\"js-direct\" role=\"button\">\n        <span class=\"glyphicon glyphicon-transfer\" style=\"color: #aaa;\"></span>\n        <span class=\"om-profile-name\"></span>\n      </a>\n    </li>\n    <li class=\"om-nav-item\">\n      <a href=\"#\" id=\"js-system\" role=\"button\">\n        <span class=\"glyphicon glyphicon-off\" style=\"color: #000;\"></span>\n        <span class=\"om-profile-name\"></span>\n      </a>\n    </li>\n    <li class=\"om-nav-item om-reqinfo om-hidden\">\n      <a href=\"../popup.html#!requestInfo\" id=\"js-reqinfo\" role=\"button\">\n        <span class=\"glyphicon glyphicon-warning-sign\"></span>\n        <span class=\"om-reqinfo-text\"></span>\n      </a>\n    </li>\n    <li class=\"om-divider\"></li>\n    <li class=\"om-divider\" id=\"js-profiles-end\"></li>\n    <li class=\"om-nav-item om-nav-addrule\">\n      <a href=\"../popup.html#!addRule\" id=\"js-addrule\" role=\"button\">\n        <span class=\"glyphicon glyphicon-plus\"></span>\n        <span id=\"js-addrule-label\"></span>\n      </a>\n    </li>\n    <li class=\"om-nav-item om-nav-temprule om-has-dropdown\">\n      <a href=\"#\" id=\"js-temprule\" role=\"button\">\n        <span class=\"glyphicon glyphicon-filter\"></span>\n        <span>\n          <span class=\"om-page-domain\"></span>\n          <span class=\"om-caret\"></span>\n        </span>\n      </a>\n    </li>\n    <li class=\"om-divider\"></li>\n    <li class=\"om-nav-item\">\n      <a href=\"../options.html\" target=\"_blank\" id=\"js-option\" role=\"button\">\n        <span class=\"glyphicon glyphicon-wrench\"></span>\n        <span id=\"js-option-label\"></span>\n      </a>\n    </li>\n  </ul>\n  <script src=\"../../lib/script.js/script.min.js\"></script>\n  <script src=\"js/loader.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "omega-web/src/popup/js/i18n.js",
    "content": "$script.ready('om-page-info', function() {\n  document.querySelector('#js-direct .om-profile-name').textContent =\n    OmegaTargetPopup.getMessage('profile_direct');\n  document.querySelector('#js-system .om-profile-name').textContent =\n    OmegaTargetPopup.getMessage('profile_system');\n  document.querySelector('#js-addrule-label').textContent =\n    OmegaTargetPopup.getMessage('popup_addCondition');\n  document.querySelector('#js-option-label').textContent =\n    OmegaTargetPopup.getMessage('popup_showOptions');\n});\n"
  },
  {
    "path": "omega-web/src/popup/js/index.js",
    "content": "(function() {\n  handleClick('js-option', showOptions);\n  handleClick('js-temprule', showTempRuleDropdown);\n  handleClick('js-direct', applyProfile.bind(this, 'direct'));\n  handleClick('js-system', applyProfile.bind(this, 'system'));\n  OmegaPopup.addTempRule = addTempRule;\n  OmegaPopup.setDefaultProfile = setDefaultProfile;\n  OmegaPopup.applyProfile = applyProfile;\n  return;\n\n  function handleClick(id, handler) {\n    document.getElementById(id).addEventListener('click', handler, false);\n  }\n\n  function closePopup() {\n    window.close();\n    // If the popup is opened as a tab, the above won't work. Let's reload then.\n    document.body.style.opacity = 0;\n    setTimeout(function() { history.go(0); }, 300);\n  }\n\n  function showOptions(e) {\n    if (typeof OmegaTargetPopup !== 'undefined') {\n      try {\n        OmegaTargetPopup.openOptions(null, closePopup);\n        e.preventDefault();\n      } catch (_) {\n      }\n    }\n  }\n\n  function applyProfile(profileName) {\n    $script.ready('om-target', function() {\n      OmegaTargetPopup.applyProfile(profileName, closePopup);\n    });\n  }\n\n  function setDefaultProfile(profileName, defaultProfileName) {\n    $script.ready('om-target', function() {\n      OmegaTargetPopup.setDefaultProfile(profileName, defaultProfileName,\n        closePopup);\n    });\n  }\n\n  function addTempRule(domain, profileName) {\n    $script.ready('om-target', function() {\n      OmegaTargetPopup.addTempRule(domain, profileName, closePopup);\n    });\n  }\n\n  function showTempRuleDropdown() {\n    $script.ready('om-dropdowns', function() {\n      OmegaPopup.showTempRuleDropdown();\n    });\n  }\n})();\n"
  },
  {
    "path": "omega-web/src/popup/js/keyboard.js",
    "content": "(function() {\n  var keyHandler = {\n    38: moveUp, // Up\n    40: moveDown, // Down\n    37: closeDropdown, // Left\n    39: openDropdown, // Right\n\n    72: closeDropdown, // h\n    74: moveDown, // j\n    75: moveUp, // k\n    76: openDropdown, // l\n\n    191: showKeyboardHelp, // /\n    63: showKeyboardHelp, // ?\n\n    48: 'js-direct', // 0\n    83: 'js-system', // s\n    69: 'js-external', // e\n    65: 'js-addrule', // a\n    187: 'js-addrule', // +, =\n    84: 'js-temprule', // t\n    79: 'js-option', // o\n    82: 'js-reqinfo', // r\n  };\n\n  for (i = 1; i <= 9; i++) {\n    keyHandler[48 + i] = 'js-profile-' + i;\n  }\n\n  var walker;\n  return init();\n\n  function init() {\n    walker = document.createTreeWalker(\n      document.querySelector('.om-nav'),\n      NodeFilter.SHOW_ELEMENT,\n      {acceptNode: tabbableElementsOnly}\n    );\n\n    window.addEventListener('keydown', function(e) {\n      var handler = keyHandler[e.keyCode];\n      if (!handler) console.log(e.keyCode);\n      if (handler == null) return;\n      if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;\n      if (typeof handler === 'string') {\n        clickById(handler);\n      } else {\n        handler();\n      }\n    });\n\n    $script.ready('om-profile-items', function() {\n      var activeNavLink = document.querySelector('.om-nav-item.om-active > a');\n      if (activeNavLink) activeNavLink.focus();\n    });\n  }\n\n  function tabbableElementsOnly(node) {\n    if (node.classList.contains('om-hidden')) {\n      return NodeFilter.FILTER_REJECT;\n    } else if (node.classList.contains('om-dropdown') &&\n      !node.parentElement.classList.contains('om-open')) {\n      return NodeFilter.FILTER_REJECT;\n    } else if (node.tabIndex >= 0) {\n      return NodeFilter.FILTER_ACCEPT;\n    } else {\n      return NodeFilter.FILTER_SKIP;\n    }\n  }\n\n  function moveUp() {\n    walker.currentNode = document.activeElement;\n    var result = null;\n    if (walker.currentNode) {\n      result = walker.previousNode();\n    }\n    if (!result) {\n      walker.currentNode = walker.root.lastElementChild;\n      walker.previousNode();\n      walker.nextNode();\n    }\n    walker.currentNode.focus();\n  }\n\n  function moveDown() {\n    walker.currentNode = document.activeElement;\n    var result = null;\n    if (walker.currentNode) {\n      result = walker.nextNode();\n    }\n    if (!result) {\n      walker.currentNode = walker.root;\n      walker.nextNode();\n    }\n    walker.currentNode.focus();\n  }\n\n  function openDropdown() {\n    var container = document.querySelector('.om-open');\n    if (container) {\n      // Existing dropdown. Just move to it.\n      container.querySelector('a').focus();\n      return;\n    }\n    var selectedItem = document.activeElement;\n    if (!selectedItem || !selectedItem.parentElement) return;\n    if (selectedItem.parentElement.classList.contains('om-has-dropdown')) {\n      var toggle = selectedItem.querySelector('.om-edit-toggle');\n      if (toggle) {\n        toggle.click();\n      } else {\n        selectedItem.click();\n      }\n    }\n  }\n\n  function closeDropdown() {\n    var container = document.querySelector('.om-open');\n    if (container) {\n      container.classList.remove('om-open');\n      container.querySelector('a').focus();\n    }\n  }\n\n  function showKeyboardHelp() {\n    $script('js/keyboard_help.js');\n  }\n\n  function clickById(id) {\n    var element = document.getElementById(id);\n    if (element) element.click();\n  }\n\n})();\n"
  },
  {
    "path": "omega-web/src/popup/js/keyboard_help.js",
    "content": "(function() {\n  var keyForId = {\n    'js-direct': '0',\n    'js-system': 'S',\n    'js-external': 'E',\n    'js-addrule': 'A',\n    'js-temprule': 'T',\n    'js-option': 'O',\n    'js-reqinfo': 'R'\n  }\n  Object.keys(keyForId).forEach(function (id) {\n    showHelp(id, keyForId[id]);\n  });\n\n  for (var i = 1; i <= 9; i++) {\n    showHelp('js-profile-' + i, '' + i);\n  }\n\n  return;\n\n  function showHelp(id, key) {\n    var element = document.getElementById(id);\n    if (!element) return;\n    if (!element.querySelector('.om-keyboard-help')) {\n      var span = document.createElement('span');\n      span.classList.add('om-keyboard-help');\n      span.textContent = key;\n      var reference = element.querySelector('.glyphicon');\n      reference.parentNode.insertBefore(span, reference.nextSibling);\n    }\n  }\n})();\n"
  },
  {
    "path": "omega-web/src/popup/js/loader.js",
    "content": "window.OmegaPopup = {};\n$script(['js/index.js', 'js/profiles.js', 'js/keyboard.js'], 'om-main');\n$script(['js/i18n.js']);\n$script('../js/omega_target_popup.js', 'om-target', function() {\n  OmegaTargetPopup.getActivePageInfo(function(err, info) {\n    window.OmegaPopup.pageInfo = info;\n    $script.done('om-page-info');\n  });\n  OmegaTargetPopup.getState([\n    'availableProfiles',\n    'currentProfileName',\n    'validResultProfiles',\n    'isSystemProfile',\n    'currentProfileCanAddRule',\n    'proxyNotControllable',\n    'externalProfile',\n    'showExternalProfile',\n  ], function(err, state) {\n    window.OmegaPopup.state = state;\n    $script.done('om-state');\n  });\n});\n"
  },
  {
    "path": "omega-web/src/popup/js/profiles.js",
    "content": "(function() {\n  $script.ready('om-state', updateMenuByState);\n  $script.ready('om-page-info', updateMenuByPageInfo);\n  $script.ready(['om-state', 'om-page-info'], updateMenuByStateAndPageInfo);\n\n  var profileTemplate = document.getElementById('js-profile-tpl')\n    .cloneNode(true);\n  profileTemplate.removeAttribute('id');\n\n  var iconForProfileType = {\n    'DirectProfile': 'glyphicon-transfer',\n    'SystemProfile': 'glyphicon-off',\n    'AutoDetectProfile': 'glyphicon-file',\n    'FixedProfile': 'glyphicon-globe',\n    'PacProfile': 'glyphicon-file',\n    'VirtualProfile': 'glyphicon-question-sign',\n    'RuleListProfile': 'glyphicon-list',\n    'SwitchProfile': 'glyphicon-retweet',\n  };\n  var orderForType = {\n    'FixedProfile': -2000,\n    'PacProfile': -1000,\n    'VirtualProfile': 1000,\n    'SwitchProfile': 2000,\n    'RuleListProfile': 3000,\n  };\n\n  return;\n\n  function updateMenuByState() {\n    var state = OmegaPopup.state;\n    if (state.proxyNotControllable) {\n      location.href = 'proxy_not_controllable.html';\n      return;\n    }\n    addProfilesItems(state);\n    $script.done('om-profile-items');\n    updateOtherItems(state);\n  }\n\n  function compareProfile(a, b) {\n    var diff;\n    diff = (orderForType[a.profileType] | 0) - (orderForType[b.profileType] | 0);\n    if (diff !== 0) {\n      return diff;\n    }\n    if (a.name === b.name) {\n      return 0;\n    } else if (a.name < b.name) {\n      return -1;\n    } else {\n      return 1;\n    }\n  }\n\n  function updateMenuByPageInfo() {\n    var info = OmegaPopup.pageInfo;\n    if (info && info.errorCount > 0) {\n      document.querySelector('.om-reqinfo').classList.remove('om-hidden');\n      var text = OmegaTargetPopup.getMessage('popup_requestErrorCount',\n        [info.errorCount]);\n      document.querySelector('.om-reqinfo-text').textContent = text;\n    }\n  }\n\n  function updateMenuByStateAndPageInfo() {\n    var state = OmegaPopup.state;\n    var info = OmegaPopup.pageInfo;\n    if (state.showExternalProfile && state.externalProfile &&\n        (!info || !info.errorCount)) {\n      showMenuForExternalProfile(state);\n    }\n    if (!info || !info.url) return updateOtherItems(null);\n    document.querySelector('.om-page-domain').textContent = info.domain;\n    OmegaPopup.showTempRuleDropdown = showTempRuleDropdown;\n    $script.done('om-dropdowns');\n  }\n\n  function showMenuForExternalProfile(state) {\n    var profile = state.externalProfile;\n    profile.name = OmegaTargetPopup.getMessage('popup_externalProfile')\n    var profileDisp = createMenuItemForProfile(profile);\n\n    var link = profileDisp.querySelector('a');\n    link.id = 'js-external';\n    link.addEventListener('click', function() {\n      location.href = '../popup.html#!external';\n    });\n\n    if (state.currentProfileName === '') {\n      profileDisp.classList.add('om-effective');\n    }\n\n    var reqInfo = document.querySelector('.om-reqinfo');\n    reqInfo.parentElement.insertBefore(profileDisp, reqInfo);\n  }\n\n  function showTempRuleDropdown() {\n    var tempRuleItem = document.querySelector('.om-nav-temprule');\n    toggleDropdown(tempRuleItem, createTempRuleDropdown);\n    document.getElementById('js-temprule').focus();\n  }\n\n  function updateOtherItems(state) {\n    var hasValidResults = state && state.validResultProfiles &&\n      state.validResultProfiles.length;\n    if (!hasValidResults || !state.currentProfileCanAddRule) {\n      document.querySelector('.om-nav-addrule').classList.add('om-hidden');\n      document.getElementById('js-addrule').href = '#';\n    }\n    if (!hasValidResults) {\n      document.querySelector('.om-nav-temprule').classList.add('om-hidden');\n      document.getElementById('js-temprule').href = '#';\n    }\n  }\n\n    var isValidResultProfile = {};\n    validResultProfiles.forEach(function(name) {\n      isValidResultProfile['+' + name] = true;\n    });\n\n  function addProfilesItems(state) {\n    var systemProfileDisp = document.getElementById('js-system');\n    var directProfileDisp = document.getElementById('js-direct');\n    var currentProfileClass = 'om-active';\n    if (state.isSystemProfile) {\n      systemProfileDisp.parentElement.classList.add('om-active');\n      currentProfileClass = 'om-effective';\n    }\n    if (state.currentProfileName === 'direct') {\n      directProfileDisp.parentElement.classList.add(currentProfileClass);\n    }\n\n    systemProfileDisp.setAttribute('title',\n      state.availableProfiles['+system'].desc);\n    directProfileDisp.setAttribute('title',\n      state.availableProfiles['+direct'].desc);\n\n    var profilesEnd = document.getElementById('js-profiles-end');\n    var profilesContainer = profilesEnd.parentElement;\n    var profileCount = 0;\n    var charCodeUnderscore = '_'.charCodeAt(0)\n    var profiles = Object.keys(state.availableProfiles).map(function(key) {\n      return state.availableProfiles[key];\n    }).sort(compareProfile);\n    profiles.forEach(function(profile) {\n      if (profile.builtin) return;\n      if (profile.name.charCodeAt(0) === charCodeUnderscore) return;\n      profileCount++;\n\n      var profileDisp = createMenuItemForProfile(profile,\n        state.availableProfiles);\n      var link = profileDisp.querySelector('a');\n      link.id = 'js-profile-' + profileCount;\n      link.addEventListener('click', function() {\n        $script.ready('om-main', function() {\n          OmegaPopup.applyProfile(profile.name);\n        });\n      });\n\n      if (profile.name === state.currentProfileName) {\n        profileDisp.classList.add(currentProfileClass);\n      }\n\n      if (profile.validResultProfiles) {\n        profileDisp.classList.add('om-has-dropdown');\n        link.classList.add('om-has-edit');\n        var toggle = document.createElement('div');\n        toggle.classList.add('om-edit-toggle');\n        var icon = document.createElement('span');\n        icon.setAttribute('class', 'glyphicon glyphicon-chevron-down');\n        toggle.appendChild(icon);\n\n        toggle.addEventListener('click', function(e) {\n          e.stopPropagation();\n          e.preventDefault();\n          toggleDropdown(profileDisp,\n            createDefaultProfileDropdown.bind(profileDisp, profile));\n        });\n\n        link.appendChild(toggle);\n      }\n\n      profilesContainer.insertBefore(profileDisp, profilesEnd);\n    });\n  }\n\n  function createMenuItemForProfile(profile, profiles) {\n    var profileDisp = profileTemplate.cloneNode(true);\n    var text = OmegaTargetPopup.getMessage('profile_' + profile.name) ||\n      profile.name;\n    if (profile.defaultProfileName) {\n      text += ' [' + profile.defaultProfileName + ']';\n    }\n    profileDisp.querySelector('.om-profile-name').textContent = text;\n\n    var targetProfile = profile;\n    if (profile.profileType === 'VirtualProfile') {\n      targetProfile = profiles['+' + profile.defaultProfileName];\n    }\n\n    profileDisp.setAttribute('title',\n      targetProfile.desc || targetProfile.name || '');\n\n    var iconClass = iconForProfileType[targetProfile.profileType];\n    var icon = profileDisp.querySelector('.glyphicon');\n    icon.setAttribute('class', 'glyphicon ' + iconClass)\n    icon.style.color = targetProfile.color;\n    if (targetProfile !== profile) {\n      icon.classList.add('om-virtual-profile-icon');\n    }\n    return profileDisp;\n  }\n\n  function toggleDropdown(container, createDropdown) {\n    if (!container.classList.contains('om-dropdown-loaded')) {\n      var dropdown = createDropdown();\n      dropdown.classList.add('om-dropdown');\n      container.appendChild(dropdown);\n      container.classList.add('om-dropdown-loaded');\n    }\n    if (container.classList.contains('om-open')) {\n      container.classList.remove('om-open');\n    } else {\n      container.classList.add('om-open');\n    }\n  }\n\n  function createTempRuleDropdown() {\n    var ul = document.createElement('ul');\n    var state = OmegaPopup.state;\n    var pageInfo = OmegaPopup.pageInfo;\n\n    var profiles = state.validResultProfiles.map(function(name) {\n      return state.availableProfiles['+' + name];\n    }).sort(compareProfile);\n    profiles.forEach(function(profile) {\n      if (profile.name.indexOf('__') === 0) return;\n      if ((profile.name === OmegaPopup.state.currentProfileName) &&\n        (!pageInfo.tempRuleProfileName) &&\n        (state.validResultProfiles.length > 1)\n      ) return;\n      var li = createMenuItemForProfile(profile, state.availableProfiles);\n      var link = li.querySelector('a');\n      link.addEventListener('click', function() {\n        $script.ready('om-main', function() {\n          OmegaPopup.addTempRule(pageInfo.domain, profile.name);\n        });\n      });\n      if (profile.name === pageInfo.tempRuleProfileName) {\n        li.classList.add('om-active');\n      }\n      ul.appendChild(li);\n    });\n    return ul;\n  }\n\n  function createDefaultProfileDropdown(profile) {\n    var ul = document.createElement('ul');\n    var state = OmegaPopup.state;\n    var profiles = profile.validResultProfiles.map(function(name) {\n      return state.availableProfiles['+' + name];\n    }).sort(compareProfile);\n    profiles.forEach(function(resultProfile) {\n      if (resultProfile.name.indexOf('__') === 0) return;\n      if ((resultProfile === profile.currentProfileName) &&\n        (profile.validResultProfiles.length > 1)\n      ) return;\n      var li = createMenuItemForProfile(resultProfile, state.availableProfiles);\n      var link = li.querySelector('a');\n      link.addEventListener('click', function() {\n        $script.ready('om-main', function() {\n          OmegaPopup.setDefaultProfile(profile.name, resultProfile.name);\n        });\n      });\n      if (resultProfile.name === profile.currentProfileName) {\n        li.classList.add('om-active');\n      }\n      ul.appendChild(li);\n    });\n    return ul;\n  }\n})();\n"
  },
  {
    "path": "omega-web/src/popup/js/proxy_not_controllable.js",
    "content": "(function() {\n  function closePopup() {\n    window.close();\n    // If the popup is opened as a tab, the above won't work. Let's reload then.\n    document.body.style.opacity = 0;\n    setTimeout(function() { history.go(0); }, 300);\n  }\n  var closeButton = document.getElementById('js-close');\n  closeButton.addEventListener('click', closePopup, false);\n\n  var manageButton = document.getElementById('js-manage-ext');\n  manageButton.addEventListener('click', function () {\n    OmegaTargetPopup.openManage(closePopup);\n  }, false);\n\n  var learnMoreButton = document.getElementById('js-nc-learn-more');\n  learnMoreButton.addEventListener('click', function () {\n    OmegaTargetPopup.openOptions('#!/general', closePopup);\n  }, false);\n\n  closeButton.textContent = OmegaTargetPopup.getMessage('dialog_cancel');\n  learnMoreButton.textContent = 'Learn More'\n    //OmegaTargetPopup.getMessage('popup_proxyNotControllableLearnMore');\n  manageButton.textContent = OmegaTargetPopup.getMessage(\n    'popup_proxyNotControllableManage');\n\n\n  OmegaTargetPopup.getState([\n    'proxyNotControllable',\n  ], function(err, state) {\n    var reason = state.proxyNotControllable;\n    var messageElement = document.getElementById('js-nc-text');\n    var detailsElement = document.getElementById('js-nc-details');\n    messageElement.textContent = OmegaTargetPopup.getMessage(\n      'popup_proxyNotControllable_' + reason);\n    var detailsMessage = OmegaTargetPopup.getMessage(\n      'popup_proxyNotControllableDetails_' + reason);\n    if (!detailsMessage) detailsMessage = OmegaTargetPopup.getMessage(\n      'popup_proxyNotControllableDetails');\n\n    detailsElement.textContent = detailsMessage;\n  });\n})();\n"
  },
  {
    "path": "omega-web/src/popup/proxy_not_controllable.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>SwitchyOmega Popup</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <link rel=\"stylesheet\" href=\"css/dialog.css\">\n</head>\n<body>\n  <div class=\"om-dialog\">\n    <p class=\"om-text-danger\" id=\"js-nc-text\"></p>\n    <p class=\"om-dialog-help\" id=\"js-nc-details\"></p>\n    <p class=\"om-dialog-controls\">\n      <button id=\"js-close\" class=\"om-btn om-btn-default\"></button>\n      <button id=\"js-nc-learn-more\" class=\"om-btn om-btn-link\"></button>\n      <button id=\"js-manage-ext\" class=\"om-btn om-btn-primary\"></button>\n    </p>\n  </div>\n  <script src=\"../js/omega_target_popup.js\"></script>\n  <script src=\"js/proxy_not_controllable.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "omega-web/src/popup.jade",
    "content": "doctype html\n//\n  Copyright 2017 The SwitchyOmega Authors. Please see the AUTHORS file\n  for details.\n\n  This file is part of SwitchyOmega.\n\n  SwitchyOmega is free software: you can redistribute it and/or modify\n  it under the terms of the GNU General Public License as published by\n  the Free Software Foundation, either version 3 of the License, or\n  (at your option) any later version.\n\n  SwitchyOmega is distributed in the hope that it will be useful,\n  but WITHOUT ANY WARRANTY; without even the implied warranty of\n  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  GNU General Public License for more details.\n\n  You should have received a copy of the GNU General Public License\n  along with SwitchyOmega.  If not, see <http://www.gnu.org/licenses/>.\nhtml(lang='en' ng-app='omegaPopup' ng-controller='PopupCtrl' ng-csp)\n  head\n    meta(charset='utf-8')\n    title {{'popup_title' | tr}}\n    meta(name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no')\n    link(rel='stylesheet' href='lib/bootstrap/css/bootstrap.min.css')\n    link(rel='stylesheet' href='css/popup.css')\n  body(ng-class='{\"with-condition-form\": showConditionForm}')\n    ul.popup-menu-nav.nav.nav-pills.nav-stacked(ng-hide='showConditionForm || proxyNotControllable || showRequestInfo')\n      li.profile(ng-repeat='profile in builtinProfiles' ng-class='{active: isActive(profile.name), \"bg-info\": isEffective(profile.name)}')\n        a(href='#' role='button' ng-attr-tabindex='{{100 + $index}}' ng-click='applyProfile(profile)' title='{{getProfileTitle(profile)}}'\n          data-shortcut='+{{profile.name}}')\n          span(omega-profile-inline='profile' icon='getIcon(profile)' options='availableProfiles' disp-name='dispNameFilter')\n      li.profile.external-profile(ng-show='!requestInfoProvided && !!externalProfile' ng-class='{active: isActive(\"\"), \"bg-info\": isEffective(\"\")}')\n        a(href='#' role='button' ng-click='nameExternal.open = true' title='{{getProfileTitle(externalProfile)}}' data-shortcut='external')\n          form(name='nameExternalForm' ng-submit='nameExternalForm.$valid && saveExternal()')\n            span(omega-profile-icon='externalProfile' icon='getIcon(externalProfile, \"normal\")' options='availableProfiles' disp-name='dispNameFilter')\n            = ' '\n            span(ng-show='!nameExternal.open') {{'popup_externalProfile' | tr}}\n            input.form-control(ng-show='!!nameExternal.open' ng-model='externalProfile.name' ng-blur='nameExternalForm.$valid && saveExternal()'\n              placeholder='{{\"popup_externalProfileName\" | tr}}' ui-validate='validateProfileName' autofocus)\n      li.request-info(ng-show='!!requestInfoProvided' class='bg-warning')\n        a(href='#' role='button' ng-click='showRequestInfo = true' data-shortcut='requestInfo')\n          span.glyphicon.glyphicon-warning-sign.text-warning\n          = ' '\n          | {{'popup_requestErrorCount' | tr:[requestInfo.errorCount]}}\n      li.divider\n      li.profile.custom-profile(ng-repeat='profile in customProfiles' ng-class='{active: isActive(profile.name), \"bg-info\": isEffective(profile.name)}'\n        dropdown)\n        a(href='#' role='button' ng-click='applyProfile(profile)' ng-if='!profile.validResultProfiles' title='{{getProfileTitle(profile)}}')\n          span(omega-profile-inline='profile' icon='getIcon(profile)' options='availableProfiles' disp-name='dispNameFilter')\n        a.profile-with-default-edit(href='#' role='button' ng-click='applyProfile(profile)' ng-if='!!profile.validResultProfiles' title='{{getProfileTitle(profile)}}')\n          span(omega-profile-inline='profile' icon='getIcon(profile)' options='availableProfiles' disp-name='dispNameFilter')\n          = ' '\n          | [{{profile.defaultProfileName}}]\n          button.dropdown-toggle.btn.btn-default(role='button' dropdown-toggle href='#' ng-click='$event.stopPropagation()')\n            span.glyphicon.glyphicon-chevron-down\n        ul.dropdown-menu(ng-if='!!profile.validResultProfiles')\n          li(ng-repeat='p in profile.validResultProfiles' ng-class='{active: p.name == profile.defaultProfileName}')\n            a(href='#' role='button' ng-click='setDefaultProfile(profile.name, p.name)' title='{{getProfileTitle(profile)}}')\n              span(omega-profile-inline='p' options='availableProfiles' disp-name='dispNameFilter')\n      li.divider(ng-show='!!currentDomain && validResultProfiles.length')\n      li(ng-show='!!currentProfileCanAddRule && !!currentDomain')\n        a(href='#' role='button' ng-click='prepareConditionForm()' data-shortcut='addRule')\n          span.glyphicon.glyphicon-plus\n          = ' '\n          span {{'popup_addCondition' | tr}}\n      li(ng-show='!!currentDomain && validResultProfiles.length' dropdown is-open=\"tempRuleMenu.open\")\n        a.dropdown-toggle(href='#' role='button' dropdown-toggle data-shortcut='tempRule')\n          span.glyphicon.glyphicon-filter\n          = ' '\n          span.current-domain {{currentDomain}}\n          span.caret\n        ul.dropdown-menu\n          li(ng-repeat='profile in validResultProfiles' ng-class='{active: profile.name == currentTempRuleProfile}'\n            ng-show='!!currentTempRuleProfile || validResultProfiles.length == 1 || profile.name != currentProfileName')\n            a(href='#' role='button' ng-click='addTempRule(currentDomain, profile.name)' title='{{getProfileTitle(profile)}}')\n              span(omega-profile-inline='profile' options='availableProfiles' disp-name='dispNameFilter')\n      li.divider\n      li\n        a(href='#' role='button' ng-click='openOptions()' data-shortcut='option')\n          span.glyphicon.glyphicon-wrench\n          = ' '\n          span {{'popup_showOptions' | tr}}\n    form.condition-form(name='conditionForm' style='display: none;'\n      ng-style='{display: showConditionForm ? \"block\" : \"none\"}'\n      ng-submit='addCondition(rule.condition, rule.profileName)')\n      fieldset\n        legend\n          | {{'popup_addConditionTo' | tr}}\n          = ' '\n          span.profile-inline\n            span(omega-profile-inline='currentProfile' options='availableProfiles' disp-name='dispNameFilter')\n        div.form-group\n          label\n            | {{'options_conditionType' | tr}}\n            = ' '\n            button.btn.btn-link.btn-sm.clear-padding(type='button' ng-click='openConditionHelp()')\n              | {{\"options_showConditionTypeHelp\" | tr}}\n              = ' '\n              span.glyphicon.glyphicon-new-window\n          select.form-control(ng-model='rule.condition.conditionType')\n            option(value='HostWildcardCondition') {{'condition_HostWildcardCondition' | tr}}\n            option(value='HostRegexCondition') {{'condition_HostRegexCondition' | tr}}\n            option(value='UrlWildcardCondition') {{'condition_UrlWildcardCondition' | tr}}\n            option(value='UrlRegexCondition') {{'condition_UrlRegexCondition' | tr}}\n            option(value='KeywordCondition') {{'condition_KeywordCondition' | tr}}\n        div.form-group\n          label {{'options_conditionDetails' | tr}}\n          input.form-control.condition-details(type='text' required ng-model='rule.condition.pattern' autofocus)\n        div.form-group\n          label {{'options_resultProfile' | tr}}\n          div(omega-profile-select='validResultProfiles' ng-model='rule.profileName'\n            disp-name='dispNameFilter' options='availableProfiles')\n        div.condition-controls\n          button.btn.btn-default(type='button' ng-click='returnToMenu()')\n            | {{'dialog_cancel' | tr}}\n          button.btn.btn-primary(type='submit' ng-disabled='conditionForm.$invalid') {{'popup_addCondition' | tr}}\n    div.proxy-not-controllable(ng-show='proxyNotControllable')\n      p.text-danger {{'popup_proxyNotControllable_' + proxyNotControllable | tr}}\n      p.help-block {{('popup_proxyNotControllableDetails_' + proxyNotControllable | tr) || ('popup_proxyNotControllableDetails' | tr)}}\n      p.proxy-not-controllable-controls\n        button.btn.btn-default(ng-click='closePopup()') {{'dialog_cancel' | tr}}\n        button.btn.btn-primary(ng-click='openManage()') {{'popup_proxyNotControllableManage' | tr}}\n    div.request-info-details(ng-show='showRequestInfo')\n    form.request-info-details(style='display: none;'\n      ng-style='{display: showRequestInfo ? \"block\" : \"none\"}'\n      ng-submit='addConditionForDomains(domainsForCondition, profileForDomains)')\n      fieldset\n        legend(ng-show='!!currentProfileCanAddRule')\n          | {{'popup_addConditionTo' | tr}}\n          = ' '\n          span.profile-inline\n            span(omega-profile-inline='currentProfile' options='availableProfiles' disp-name='dispNameFilter')\n        legend(ng-show='!currentProfileCanAddRule')\n          | {{'popup_requestErrorHeading' | tr}} \n        .text-warning {{'popup_requestErrorWarning' | tr}}\n        p.help-block {{'popup_requestErrorWarningHelp' | tr}}\n        p.help-block(ng-show='!!currentProfileCanAddRule') {{'popup_requestErrorAddCondition' | tr}} \n        .checkbox(ng-repeat='domain in requestInfo.domains track by domain.domain')\n          label\n            input(type='checkbox' ng-model='domainsForCondition[domain.domain]' autofocus ng-if='$index === 0')\n            input(type='checkbox' ng-model='domainsForCondition[domain.domain]' ng-if='$index > 0')\n            span.label.label-warning {{domain.errorCount}}\n            =' {{domain.domain}}'\n        div.form-group(ng-show='!!currentProfileCanAddRule')\n          label {{'options_resultProfileForSelectedDomains' | tr}}\n          div(omega-profile-select='validResultProfiles' ng-model='profileForDomains'\n            disp-name='dispNameFilter' options='availableProfiles')\n        p.help-block(ng-show='!currentProfileCanAddRule')\n          | {{'popup_requestErrorCannotAddCondition' | tr}}\n        div.condition-controls\n          button.btn.btn-default(type='button' ng-click='returnToMenu()')\n            | {{'dialog_cancel' | tr}}\n          button.btn.btn-primary(type='submit' ng-show='!!currentProfileCanAddRule') {{'popup_addCondition' | tr}}\n          button.btn.btn-default.pull-right(type='button' ng-show='!currentProfileCanAddRule'\n            ng-click='openOptions(\"#/general\")') {{'popup_configureMonitorWebRequests' | tr}}\n\n    script(src='js/log_error.js')\n    script(src='lib/jquery/jquery.min.js')\n    script(src='lib/angular/angular.min.js')\n    script(src='lib/angular-bootstrap/ui-bootstrap-tpls.min.js')\n    script(src='lib/angular-ui-utils/validate.min.js')\n    script(src='js/omega_target_web.js')\n    script(src='js/omega_decoration.js')\n    script(src='js/popup.js')\n"
  }
]